From 8c7f87c3f50e1f9be78795655ce32ba77e7c20d2 Mon Sep 17 00:00:00 2001 From: Felix-LJY <1793542731@qq.com> Date: Fri, 11 Sep 2026 01:55:47 +0800 Subject: [PATCH] arch/arm/n32h7: Add N32H762IIL7 board support --- .gitignore | 1 + CMakeLists.txt | 36 + CMakePresets.json | 19 + .../arm/n32h7/boards/n32h762iil7/index.rst | 187 + .../n32h7/boards/n32h762iil7/n32h762iil7.png | Bin 0 -> 2092817 bytes Documentation/platforms/arm/n32h7/index.rst | 62 + arch/arm/Kconfig | 20 + arch/arm/include/n32h7/chip.h | 112 + arch/arm/include/n32h7/irq.h | 88 + arch/arm/include/n32h7/n32h76x_irq.h | 301 + arch/arm/src/n32h7/CMakeLists.txt | 202 + arch/arm/src/n32h7/Kconfig | 5302 +++++++++++++++ arch/arm/src/n32h7/Make.defs | 191 + arch/arm/src/n32h7/chip.h | 70 + arch/arm/src/n32h7/hardware/n32h76x_afio.h | 802 +++ arch/arm/src/n32h7/hardware/n32h76x_dmamux.h | 1253 ++++ arch/arm/src/n32h7/hardware/n32h76x_gpio.h | 415 ++ .../src/n32h7/hardware/n32h76x_memorymap.h | 284 + arch/arm/src/n32h7/hardware/n32h76x_pinmap.h | 1225 ++++ arch/arm/src/n32h7/hardware/n32h76x_pwr.h | 712 ++ arch/arm/src/n32h7/hardware/n32h76x_rcc.h | 3415 ++++++++++ arch/arm/src/n32h7/hardware/n32h76x_uart.h | 415 ++ arch/arm/src/n32h7/hardware/n32h7_afio.h | 39 + arch/arm/src/n32h7/hardware/n32h7_cordic.h | 85 + arch/arm/src/n32h7/hardware/n32h7_dma.h | 512 ++ arch/arm/src/n32h7/hardware/n32h7_dmamux.h | 140 + arch/arm/src/n32h7/hardware/n32h7_exti.h | 211 + arch/arm/src/n32h7/hardware/n32h7_gpio.h | 39 + arch/arm/src/n32h7/hardware/n32h7_memorymap.h | 39 + arch/arm/src/n32h7/hardware/n32h7_pinmap.h | 39 + arch/arm/src/n32h7/hardware/n32h7_pwr.h | 39 + arch/arm/src/n32h7/hardware/n32h7_rcc.h | 39 + arch/arm/src/n32h7/hardware/n32h7_sdmmc.h | 511 ++ arch/arm/src/n32h7/hardware/n32h7_tim.h | 1697 +++++ arch/arm/src/n32h7/hardware/n32h7_uart.h | 39 + arch/arm/src/n32h7/hardware/n32h7_usbhs.h | 946 +++ arch/arm/src/n32h7/hardware/n32h7xx_dbgmcu.h | 243 + arch/arm/src/n32h7/n32_allocateheap.c | 182 + arch/arm/src/n32h7/n32_capture.c | 1447 ++++ arch/arm/src/n32h7/n32_capture.h | 108 + arch/arm/src/n32h7/n32_capture_lowerhalf.c | 589 ++ arch/arm/src/n32h7/n32_cordic.c | 315 + arch/arm/src/n32h7/n32_cordic.h | 52 + arch/arm/src/n32h7/n32_dbgmcu.h | 34 + arch/arm/src/n32h7/n32_dma.c | 1999 ++++++ arch/arm/src/n32h7/n32_dma.h | 339 + arch/arm/src/n32h7/n32_exti.h | 132 + arch/arm/src/n32h7/n32_exti_gpio.c | 428 ++ arch/arm/src/n32h7/n32_flash.c | 247 + arch/arm/src/n32h7/n32_flash.h | 34 + arch/arm/src/n32h7/n32_gpio.c | 444 ++ arch/arm/src/n32h7/n32_gpio.h | 366 + arch/arm/src/n32h7/n32_idle.c | 189 + arch/arm/src/n32h7/n32_irq.c | 815 +++ arch/arm/src/n32h7/n32_lowputc.c | 274 + arch/arm/src/n32h7/n32_lowputc.h | 64 + arch/arm/src/n32h7/n32_mpuinit.c | 130 + arch/arm/src/n32h7/n32_mpuinit.h | 84 + arch/arm/src/n32h7/n32_oneshot.c | 462 ++ arch/arm/src/n32h7/n32_oneshot.h | 179 + arch/arm/src/n32h7/n32_oneshot_lowerhalf.c | 354 + arch/arm/src/n32h7/n32_pm.h | 109 + arch/arm/src/n32h7/n32_pminitialize.c | 64 + arch/arm/src/n32h7/n32_pmsleep.c | 87 + arch/arm/src/n32h7/n32_pmstandby.c | 79 + arch/arm/src/n32h7/n32_pmstop.c | 95 + arch/arm/src/n32h7/n32_pwm.c | 2515 +++++++ arch/arm/src/n32h7/n32_pwm.h | 167 + arch/arm/src/n32h7/n32_pwr.c | 228 + arch/arm/src/n32h7/n32_pwr.h | 141 + arch/arm/src/n32h7/n32_rcc.c | 175 + arch/arm/src/n32h7/n32_rcc.h | 174 + arch/arm/src/n32h7/n32_sdmmc.c | 2735 ++++++++ arch/arm/src/n32h7/n32_sdmmc.h | 86 + arch/arm/src/n32h7/n32_serial.c | 2777 ++++++++ arch/arm/src/n32h7/n32_start.c | 397 ++ arch/arm/src/n32h7/n32_start.h | 74 + arch/arm/src/n32h7/n32_systemreset.c | 95 + arch/arm/src/n32h7/n32_systemreset.h | 64 + arch/arm/src/n32h7/n32_tickless.c | 821 +++ arch/arm/src/n32h7/n32_tim.c | 2358 +++++++ arch/arm/src/n32h7/n32_tim.h | 232 + arch/arm/src/n32h7/n32_tim_lowerhalf.c | 621 ++ arch/arm/src/n32h7/n32_timerisr.c | 167 + arch/arm/src/n32h7/n32_uart.h | 166 + arch/arm/src/n32h7/n32_uid.c | 66 + arch/arm/src/n32h7/n32_uid.h | 57 + arch/arm/src/n32h7/n32_usbhs.h | 424 ++ arch/arm/src/n32h7/n32_usbhsdev.c | 6009 +++++++++++++++++ arch/arm/src/n32h7/n32_usbhshost.c | 5800 ++++++++++++++++ arch/arm/src/n32h7/n32h76x_rcc.c | 1349 ++++ boards/Kconfig | 10 + boards/arm/n32h7/n32h762iil7/CMakeLists.txt | 23 + boards/arm/n32h7/n32h762iil7/Kconfig | 35 + .../n32h7/n32h762iil7/configs/nsh/defconfig | 198 + boards/arm/n32h7/n32h762iil7/include/board.h | 328 + .../arm/n32h7/n32h762iil7/scripts/Make.defs | 38 + boards/arm/n32h7/n32h762iil7/scripts/flash.ld | 134 + .../arm/n32h7/n32h762iil7/src/CMakeLists.txt | 72 + boards/arm/n32h7/n32h762iil7/src/Make.defs | 75 + boards/arm/n32h7/n32h762iil7/src/Makefile | 25 + .../n32h7/n32h762iil7/src/n32_appinitialize.c | 78 + .../arm/n32h7/n32h762iil7/src/n32_autoleds.c | 172 + boards/arm/n32h7/n32h762iil7/src/n32_boot.c | 92 + .../arm/n32h7/n32h762iil7/src/n32_bringup.c | 386 ++ .../arm/n32h7/n32h762iil7/src/n32_buttons.c | 150 + .../arm/n32h7/n32h762iil7/src/n32_composite.c | 349 + boards/arm/n32h7/n32h762iil7/src/n32_cordic.c | 89 + .../arm/n32h7/n32h762iil7/src/n32_progmem.c | 109 + boards/arm/n32h7/n32h762iil7/src/n32_pwm.c | 131 + boards/arm/n32h7/n32h762iil7/src/n32_reset.c | 136 + boards/arm/n32h7/n32h762iil7/src/n32_sdmmc.c | 159 + boards/arm/n32h7/n32h762iil7/src/n32_uid.c | 69 + boards/arm/n32h7/n32h762iil7/src/n32_usb.c | 305 + .../arm/n32h7/n32h762iil7/src/n32_userleds.c | 159 + .../arm/n32h7/n32h762iil7/src/n32h762iil7.h | 306 + tools/generate_cmake_presets.py | 60 + 117 files changed, 60817 insertions(+) create mode 100644 CMakePresets.json create mode 100644 Documentation/platforms/arm/n32h7/boards/n32h762iil7/index.rst create mode 100644 Documentation/platforms/arm/n32h7/boards/n32h762iil7/n32h762iil7.png create mode 100644 Documentation/platforms/arm/n32h7/index.rst create mode 100644 arch/arm/include/n32h7/chip.h create mode 100644 arch/arm/include/n32h7/irq.h create mode 100644 arch/arm/include/n32h7/n32h76x_irq.h create mode 100644 arch/arm/src/n32h7/CMakeLists.txt create mode 100644 arch/arm/src/n32h7/Kconfig create mode 100644 arch/arm/src/n32h7/Make.defs create mode 100644 arch/arm/src/n32h7/chip.h create mode 100644 arch/arm/src/n32h7/hardware/n32h76x_afio.h create mode 100644 arch/arm/src/n32h7/hardware/n32h76x_dmamux.h create mode 100644 arch/arm/src/n32h7/hardware/n32h76x_gpio.h create mode 100644 arch/arm/src/n32h7/hardware/n32h76x_memorymap.h create mode 100644 arch/arm/src/n32h7/hardware/n32h76x_pinmap.h create mode 100644 arch/arm/src/n32h7/hardware/n32h76x_pwr.h create mode 100644 arch/arm/src/n32h7/hardware/n32h76x_rcc.h create mode 100644 arch/arm/src/n32h7/hardware/n32h76x_uart.h create mode 100644 arch/arm/src/n32h7/hardware/n32h7_afio.h create mode 100644 arch/arm/src/n32h7/hardware/n32h7_cordic.h create mode 100644 arch/arm/src/n32h7/hardware/n32h7_dma.h create mode 100644 arch/arm/src/n32h7/hardware/n32h7_dmamux.h create mode 100644 arch/arm/src/n32h7/hardware/n32h7_exti.h create mode 100644 arch/arm/src/n32h7/hardware/n32h7_gpio.h create mode 100644 arch/arm/src/n32h7/hardware/n32h7_memorymap.h create mode 100644 arch/arm/src/n32h7/hardware/n32h7_pinmap.h create mode 100644 arch/arm/src/n32h7/hardware/n32h7_pwr.h create mode 100644 arch/arm/src/n32h7/hardware/n32h7_rcc.h create mode 100644 arch/arm/src/n32h7/hardware/n32h7_sdmmc.h create mode 100644 arch/arm/src/n32h7/hardware/n32h7_tim.h create mode 100644 arch/arm/src/n32h7/hardware/n32h7_uart.h create mode 100644 arch/arm/src/n32h7/hardware/n32h7_usbhs.h create mode 100644 arch/arm/src/n32h7/hardware/n32h7xx_dbgmcu.h create mode 100644 arch/arm/src/n32h7/n32_allocateheap.c create mode 100644 arch/arm/src/n32h7/n32_capture.c create mode 100644 arch/arm/src/n32h7/n32_capture.h create mode 100644 arch/arm/src/n32h7/n32_capture_lowerhalf.c create mode 100644 arch/arm/src/n32h7/n32_cordic.c create mode 100644 arch/arm/src/n32h7/n32_cordic.h create mode 100644 arch/arm/src/n32h7/n32_dbgmcu.h create mode 100644 arch/arm/src/n32h7/n32_dma.c create mode 100644 arch/arm/src/n32h7/n32_dma.h create mode 100644 arch/arm/src/n32h7/n32_exti.h create mode 100644 arch/arm/src/n32h7/n32_exti_gpio.c create mode 100644 arch/arm/src/n32h7/n32_flash.c create mode 100644 arch/arm/src/n32h7/n32_flash.h create mode 100644 arch/arm/src/n32h7/n32_gpio.c create mode 100644 arch/arm/src/n32h7/n32_gpio.h create mode 100644 arch/arm/src/n32h7/n32_idle.c create mode 100644 arch/arm/src/n32h7/n32_irq.c create mode 100644 arch/arm/src/n32h7/n32_lowputc.c create mode 100644 arch/arm/src/n32h7/n32_lowputc.h create mode 100644 arch/arm/src/n32h7/n32_mpuinit.c create mode 100644 arch/arm/src/n32h7/n32_mpuinit.h create mode 100644 arch/arm/src/n32h7/n32_oneshot.c create mode 100644 arch/arm/src/n32h7/n32_oneshot.h create mode 100644 arch/arm/src/n32h7/n32_oneshot_lowerhalf.c create mode 100644 arch/arm/src/n32h7/n32_pm.h create mode 100644 arch/arm/src/n32h7/n32_pminitialize.c create mode 100644 arch/arm/src/n32h7/n32_pmsleep.c create mode 100644 arch/arm/src/n32h7/n32_pmstandby.c create mode 100644 arch/arm/src/n32h7/n32_pmstop.c create mode 100644 arch/arm/src/n32h7/n32_pwm.c create mode 100644 arch/arm/src/n32h7/n32_pwm.h create mode 100644 arch/arm/src/n32h7/n32_pwr.c create mode 100644 arch/arm/src/n32h7/n32_pwr.h create mode 100644 arch/arm/src/n32h7/n32_rcc.c create mode 100644 arch/arm/src/n32h7/n32_rcc.h create mode 100644 arch/arm/src/n32h7/n32_sdmmc.c create mode 100644 arch/arm/src/n32h7/n32_sdmmc.h create mode 100644 arch/arm/src/n32h7/n32_serial.c create mode 100644 arch/arm/src/n32h7/n32_start.c create mode 100644 arch/arm/src/n32h7/n32_start.h create mode 100644 arch/arm/src/n32h7/n32_systemreset.c create mode 100644 arch/arm/src/n32h7/n32_systemreset.h create mode 100644 arch/arm/src/n32h7/n32_tickless.c create mode 100644 arch/arm/src/n32h7/n32_tim.c create mode 100644 arch/arm/src/n32h7/n32_tim.h create mode 100644 arch/arm/src/n32h7/n32_tim_lowerhalf.c create mode 100644 arch/arm/src/n32h7/n32_timerisr.c create mode 100644 arch/arm/src/n32h7/n32_uart.h create mode 100644 arch/arm/src/n32h7/n32_uid.c create mode 100644 arch/arm/src/n32h7/n32_uid.h create mode 100644 arch/arm/src/n32h7/n32_usbhs.h create mode 100644 arch/arm/src/n32h7/n32_usbhsdev.c create mode 100644 arch/arm/src/n32h7/n32_usbhshost.c create mode 100644 arch/arm/src/n32h7/n32h76x_rcc.c create mode 100644 boards/arm/n32h7/n32h762iil7/CMakeLists.txt create mode 100644 boards/arm/n32h7/n32h762iil7/Kconfig create mode 100644 boards/arm/n32h7/n32h762iil7/configs/nsh/defconfig create mode 100644 boards/arm/n32h7/n32h762iil7/include/board.h create mode 100644 boards/arm/n32h7/n32h762iil7/scripts/Make.defs create mode 100644 boards/arm/n32h7/n32h762iil7/scripts/flash.ld create mode 100644 boards/arm/n32h7/n32h762iil7/src/CMakeLists.txt create mode 100644 boards/arm/n32h7/n32h762iil7/src/Make.defs create mode 100644 boards/arm/n32h7/n32h762iil7/src/Makefile create mode 100644 boards/arm/n32h7/n32h762iil7/src/n32_appinitialize.c create mode 100644 boards/arm/n32h7/n32h762iil7/src/n32_autoleds.c create mode 100644 boards/arm/n32h7/n32h762iil7/src/n32_boot.c create mode 100644 boards/arm/n32h7/n32h762iil7/src/n32_bringup.c create mode 100644 boards/arm/n32h7/n32h762iil7/src/n32_buttons.c create mode 100644 boards/arm/n32h7/n32h762iil7/src/n32_composite.c create mode 100644 boards/arm/n32h7/n32h762iil7/src/n32_cordic.c create mode 100644 boards/arm/n32h7/n32h762iil7/src/n32_progmem.c create mode 100644 boards/arm/n32h7/n32h762iil7/src/n32_pwm.c create mode 100644 boards/arm/n32h7/n32h762iil7/src/n32_reset.c create mode 100644 boards/arm/n32h7/n32h762iil7/src/n32_sdmmc.c create mode 100644 boards/arm/n32h7/n32h762iil7/src/n32_uid.c create mode 100644 boards/arm/n32h7/n32h762iil7/src/n32_usb.c create mode 100644 boards/arm/n32h7/n32h762iil7/src/n32_userleds.c create mode 100644 boards/arm/n32h7/n32h762iil7/src/n32h762iil7.h create mode 100644 tools/generate_cmake_presets.py diff --git a/.gitignore b/.gitignore index 1a330bdd34e01..02cfe592aab07 100644 --- a/.gitignore +++ b/.gitignore @@ -95,3 +95,4 @@ SAVEconfig .aider* imx9-norimage.img config.txt +CMakeUserPresets.json diff --git a/CMakeLists.txt b/CMakeLists.txt index d058637a92b95..0607db66eb54d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -97,6 +97,42 @@ if(EXISTS "${NUTTX_DIR}/.config") FATAL_ERROR "Please distclean previous make build with `make distclean`") endif() +# Check if board presets already exist +set(GENERATED_PRESET_FILE "${CMAKE_SOURCE_DIR}/CMakeUserPresets.json") + +if(NOT EXISTS "${GENERATED_PRESET_FILE}") + message(STATUS "CMake board presets not found. Generating them now...") + message( + STATUS + " This will create 'CMakeUserPresets.json' with all available board configs." + ) + + execute_process( + COMMAND python3 "${CMAKE_SOURCE_DIR}/tools/generate_cmake_presets.py" + WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" + RESULT_VARIABLE GEN_RESULT + OUTPUT_VARIABLE GEN_OUTPUT + ERROR_VARIABLE GEN_ERROR) + + if(GEN_RESULT EQUAL 0) + message(STATUS " Board presets generated successfully.") + message( + STATUS + " Please reload CMake configuration (e.g., re-run 'cmake -B build')") + message(STATUS " to see the presets in your IDE.") + else() + message( + WARNING + "Failed to generate board presets (python3 not found or script error).") + message(WARNING " To enable preset selection, run manually:") + message( + WARNING " python3 ${CMAKE_SOURCE_DIR}/tools/generate_cmake_presets.py") + if(GEN_ERROR) + message(STATUS " Error output: ${GEN_ERROR}") + endif() + endif() +endif() + if(NOT DEFINED BOARD_CONFIG) message(FATAL_ERROR "Please define configuration with BOARD_CONFIG") endif() diff --git a/CMakePresets.json b/CMakePresets.json new file mode 100644 index 0000000000000..9734de9d564b7 --- /dev/null +++ b/CMakePresets.json @@ -0,0 +1,19 @@ +{ + "version": 3, + "configurePresets": [ + { + "name": "default", + "hidden": true, + "generator": "Ninja", + "binaryDir": "${sourceDir}/build", + "cacheVariables": {} + }, + { + "name": "Default", + "inherits": "default", + "cacheVariables": { + "BOARD_CONFIG": "n32h762iil7:nsh" + } + } + ] +} diff --git a/Documentation/platforms/arm/n32h7/boards/n32h762iil7/index.rst b/Documentation/platforms/arm/n32h7/boards/n32h762iil7/index.rst new file mode 100644 index 0000000000000..4e726c35de54c --- /dev/null +++ b/Documentation/platforms/arm/n32h7/boards/n32h762iil7/index.rst @@ -0,0 +1,187 @@ +=========================== +N32H762IIL7 Development Board +=========================== + +.. tags:: chip:n32h762, arch:armv7e-m, vendor:nations, usb, sdmmc, cordic + +.. figure:: n32h762iil7.png + :scale: 30 % + :align: center + :alt: N32H762IIL7 development board + + N32H762IIL7 development board from Nations Technologies. + +The N32H762IIL7 is a high-performance Cortex-M7 development board from Nations +Technologies, featuring a 600 MHz ARM Cortex-M7 core, 1.5 MB SRAM, and 2 MB +on-chip SIP Flash. It is designed for industrial control, IoT gateways, and +other compute-intensive applications. + +Features +======== + +OsTest LogFile: + +https://github.com/apache/nuttx/blob/17b96027359785bcb455342bfcaa900b46637540/arch/arm/src/n32h7/nuttx_test.log + +The current NuttX BSP supports the following features: + +- MCU: N32H762IIL7 (ARM Cortex-M7 @ 600 MHz) +- 1.5 MB SRAM (configurable as ITCM/DTCM/AXI SRAM) +- 2 MB SIP Flash (with cache limitations, see note) +- GPIO, EXTI, RCC, UART (console) +- TIM: timer, PWM, oneshot, tickless +- DMA (chained transfers) +- USBHS (Device and Host modes, external ULPI PHY required for HS) +- SDMMC (ADMA2 support) +- CORDIC hardware accelerator +- FLASH (MTD driver) +- UID + +**Not yet supported:** ADC, DAC, I2C, SPI, ETH, CAN/FDCAN, RTC, WDT. + +.. note:: + The SIP Flash on this chip does not work well with cache. For maximum + performance, critical code should be placed in ITCM (zero-wait memory). + +Buttons and LEDs +================ + +The board provides three user-controllable LEDs (Green, Blue, Red) and several +buttons. + +- **LEDs**: + - Green (LD1) - GPIO PA1 + - Blue (LD2) - GPIO PA2 + - Red (LD3) - GPIO PA3 + (All active high) + +- **Buttons**: + - Wakeup (B1) - GPIO PA0 + - Key1 - GPIO PC0 + - Key2 - GPIO PC1 + - Key3 - GPIO PC4 + (A high value when pressed) + +Pin Mapping +=========== + +The following table lists the default pin assignments for the N32H762IIL7 board. +For a complete list, refer to `boards/arm/n32h7/n32h762iil7/include/board.h`. + +===== ============ =================================================== +Pin Signal Function +===== ============ =================================================== +PA9 USART1_TX Console output (default) +PA10 USART1_RX Console input (default) +PA11 USBHS1_DM USBHS1 data- +PA12 USBHS1_DP USBHS1 data+ +PB14 USBHS2_DM USBHS2 data- +PB15 USBHS2_DP USBHS2 data+ +PD2 SDMMC1_CMD SD card command +PC8 SDMMC1_D0 SD card data 0 +PC9 SDMMC1_D1 SD card data 1 +PC10 SDMMC1_D2 SD card data 2 +PC11 SDMMC1_D3 SD card data 3 +PC12 SDMMC1_CK SD card clock +PC13 SDIO_NCD Card detect (input, pull-up) +PC6 USBHS1_PWRON Power control for USBHS1 (output) +PD12 USBHS2_PWRON Power control for USBHS2 (output) +PE9 ATIM1_CH1 PWM channel 1 (TIM1) +PE11 ATIM1_CH2 PWM channel 2 +PE13 ATIM1_CH3 PWM channel 3 +PE14 ATIM1_CH4 PWM channel 4 +PE5 GTIMB1_CH1 PWM channel 1 (TIMB1) +PE6 GTIMB1_CH2 PWM channel 2 +PE0 GTIMB1_CH3 PWM channel 3 +PE1 GTIMB1_CH4 PWM channel 4 +PA6 GTIMA2_CH1 Capture input 1 (TIM2) +... ... ... +===== ============ =================================================== + +Power Supply +============ + +The board can be powered via USB (5V) or an external DC supply. It includes an +on-board voltage regulator to generate 3.3V for the MCU and peripherals. + +Installation +============ + +To build NuttX for this board, you will need the standard ARM GCC toolchain +(version 10.2 or later) or Clang (14+). Installation instructions are the same +as for other Cortex-M boards. For details, see the +:doc:`/quickstart/install` guide. + +Building NuttX +============== + +This board supports both the traditional Makefile build system and the newer +CMake/Ninja build system. + +Makefile (GCC): + .. code:: console + + $ cd nuttx + $ ./tools/configure.sh n32h762iil7:nsh + $ make -j$(nproc) + +Makefile (Clang): + .. code:: console + + $ ./tools/configure.sh n32h762iil7:nsh + $ make menuconfig # select Clang toolchain + $ make -j$(nproc) + +CMake/Ninja (GCC only): + .. code:: console + + $ cd nuttx + $ cmake -B build -DBOARD_CONFIG=n32h762iil7:nsh -G Ninja + $ ninja -C build + +The resulting image (`nuttx.bin` or `nuttx.elf`) can be found in the build +directory. + +Flashing and Debugging +====================== + +The N32H762IIL7 can be programmed via JTAG/SWD using a debug probe. + +**Supported debugger**: J-Link + Ozone (the J-Link patch must be obtained from +Nations Technologies or extracted from the vendor’s .pack file). Other probes +(e.g., ST-Link, CMSIS-DAP) are not currently supported. + +The exact procedure depends on your J-Link configuration. Typically, you would +use Ozone to load the ELF file and flash it. + +.. todo:: + Provide exact Ozone project settings if possible. + +Configurations +============== + +The board identifier for `tools/configure.sh` is `n32h762iil7`. Currently, only +one configuration is provided: + +nsh +--- + +This configuration provides the NuttShell (NSH) over the USART1 console at +115200 baud. It includes **all currently supported drivers** and a selection of +example applications (CoreMark, ostest, sdbench, osperf, ramspeed, etc.). It is +the recommended starting point for evaluation. + + .. code:: console + + $ ./tools/configure.sh n32h762iil7:nsh + $ make + +.. note:: + Additional configurations (e.g., ``usb``, ``sdmmc``) may be added in the + future as more peripherals are ported. + +License Exceptions +================== + +The N32H7 port is entirely original work and is licensed under the Apache 2.0 +license, with no third-party proprietary code included. diff --git a/Documentation/platforms/arm/n32h7/boards/n32h762iil7/n32h762iil7.png b/Documentation/platforms/arm/n32h7/boards/n32h762iil7/n32h762iil7.png new file mode 100644 index 0000000000000000000000000000000000000000..8a756f97eae87c2fdb5521257c9b174ffd64c48c GIT binary patch literal 2092817 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

!VY)|OvLC7$3u+I!Qy>%l=)&f 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

d8J^VoSs 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�#wXOTjpgV0MKTgZ!&Zg0S?I}t*8 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­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%0DID`xDZ>ACjcFA9{=By-6=H^tf!L3i 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⪻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 ^g6~{1Bnk-W|B?6h84;eqkG-R1V zs%5@ne=P~65K5thz&MBRz^Qly1h0b+;X?gor36}M-S`FIwG88SF4U7ubGQ$%Q|T61 zf)`^#d6Ps6RF)<8?%m^efA@FElxA~tGXP~I*Y51ox(w$8jZtjvyp3VZ^#?Vh&CAq& z2_k)zX#$odJ6tdl`*?rh!k&;`cgd_I1K((%BjNSR>#MbEGjhaXeGML5L^`&*Y=p-dh!EO@)a9 zUPhg1{Wv`*?uP-B%ca!cx7My>Ea+(5XSv3c@g(g-{qXp>qvO0Ii($wXU_qA_sT@MPz$>Pp%pBSu2iYZaoY0}4$?#$T7=~pH{sh-7 zkS=Ff3Pu|RE}LMjL9j`gLFpRW>V&GD-YUZADn!WqjkGumb! z?^-4^&zbxZS{6)>_Ze^Ra_;OFdk443>OlxE}|4q+QlWGSN$2B-i{fD zNfa{b8*!a`k8=&)I&?Pb=_KKE5vw+cl=7j1uBfC0Czu~Myz=6^{KxIYBDt5&rlX@JHb^JElLWJWBdY#!&Gy&c6Sl3LKO`gXGYZR z9Cz}NOXmhu(*v{@lyXL?YBCvWN~E-hrfEXfsBr~Glr&@*pW!8xxk0uMIbZH_R9j|t zAMY(SEv+#uT#k|%UYwArBNj7@^9{}#-hR^{?GW#V7_-S>2&#bXaf?~pU{j8<%_gSR zwC#|+L&um+3aL@KVI!Nfm{lldjASU-EcJ-S!hAkwG_dS)fubRXiNQd^I4c;ajD-mK zGFC>brVOPFWaAM{ur;(OZr|MJ+FNh%sZU1q9a^39M?UDs1?-Mh#A2NT9xkc%Aeo}qODUmC`P5@!s< z>B+Jj5GMGrz-Fo>1x&^1OzHqimiet1pl#n4W~P zA-Wt;y033j-lcHL5EAWWJO>{b9)%Dd zVZqrJEi-Z*JV0$-q4KcDO1BKd6GC)#^-`TO=!FV)!c~x!#S(CefSrX1Br;yGAn6J9daL~polr3 zA&)TBxDy_%HyG1X=3{@R$PBGSC!4$v#hoF96I(1MzDCKQ0QnTko!HoxAR7_L6C{GV zX(-B)EYHb}A*-scY(bvq)K!b~4b}v*Ae|MIdI|gh$_NCjrop(-raUV|V@(%P;Y5gD5K*Biavhb@=(+6XXedXdbsqX6maPzdDt|ATF6I

dW?Mgy9*;^3fRu~^`&qiGdc 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�FBGrfEF3_NYwYY7csb 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

-#zAln0pea>1mYVM5rpw4j6{iexlRvl0f{UCf0L
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�#PxpRRWqcW-v2te+lakDo0WP~lWKfVFcFz|l1*>xW35YoCU
z4nH|6+QeKZqE|M63-)$FhUD{z=So+jqe`tDO}?k&Caa@ITE#k%bF|g~N~_KwO3r`;
zb^^2O5f5QBOqdxvDxEZeRG)oM0WP3Sg-&oY0nm6kB;baMa8ziXWMflMpj1I!YOHlA
z48d!TkEh(V+UMNX-KA$Q*{5&&z%5^pHAl5d#Bv0#cR(Wxv)YzOp}^dCBv=!O3jUvtY3!gV<2>;@PJPJJlACC(kGP6sk}aQs*kKt
z1d~!=^bAC*v=1v#G0nh(agyewNc$%QYca~BaiZJdorL>TOgYgonZW8Y{Mt8viLZV2
zmnaP^ufp>$!t*b_$uE5QSFjdV*WhpbTkGr}!dn+NIer~Bme%{@aVnAQ{r752ZW7hFtp4w
zti*nab^y^?pP*`hL~)$~PK~pH?VJ0&`}RlNx?w4c7528T(;pO^y?2vycW*LS2`nvZ
zddnp!hp96sqDlZZ{sjm&I#`jCc@khUU={5&;Kqu(x6ZOTILTqN#DOc=YxZ%?R9dJZ
zgkzi^p>zR-!)u3SiX%`~ur!2U|MiENPM}(WOV{9;7d~R=aG#=jiF|3KqMo0RvQW64U>KY8{pPU(WLeSL+2m-TPsU$5~${p0hL
zevQ#Cl%If=dd&J@!VNQGW2pJ&ub$<;GjRPny!E52xWfUx;gGhd&}|7pQ<$iIEp2>yFcU`-~1(BfBhn*s`=6{e1*rJ
zxQo_$b`L({x#z#n^UwcfS0)3JD2|kh(b{(grFOa#E$YTQn+reF6QB24G`Kng&x;YG
zl$sS!?+h$4o(>NWyE%{mS2Fs&_h9r~d(v|P1Z_LZq0B+&og!iR=Q)_U6Np}nis|h0
z+kkBR{-OYm*1Drh=E5!M+}7GT5Sae{|MY)~mj#
z2hGp5_&NvacLMf52>_>a=HPa5+!n8OvF-Ue7o)`>QO#7lj}R;Pg;~_TaZ=*qi6@@m
z@BZd*QfkAy@4m~k&pyjN_dm#&zWxpR!#)al{>2YKFR^}VlRx^`@A3VY&SQ%K!Plrz
zfhuCENuX4LvQ%t5@E~W-o?$c^apAr9nY5P56nGCISc$qQQ8v^j8rC65DJX!WKT$-L
z${Zcc0DVfCN#>)>u_De>x(K9+?e_$X(%t{lbtMf0j6_tsAVYlC+Q*nARAq^BhLVzA
zUDB&6>JsV_%EHq!5fyPPs5aV#7GF5fPGS&B;t;-sOCP}tufq4AdxN*mU&V%kqJ%5g
z;Je@Z5l53vKDc(3axkRvJ+55a<>lAl^FIf_^I!hQoLUtPljb^%r)>m&eim)j3KtY6
z2oo(RljIR%e@jY)QyQl|!T4ETYW!{RF_J|Ip+KXBN*=mlhoI)BaXbLCm}go?qy1+p
z3>DTMv9~+s=8Xwep}2K(j432H*|nC{&62HCOWZXWpq7@wPw8%e09~XmrY;G14Zsvd
zgCo|B^#yJO%~4=|d5e?lXV{-sY)>rbKQ3savOWqt$9Ofyn;w`FuN>aAc%yMf>TB-a
zgv%HAxOp_?m3J@m(i_(~3N5B;L6!W)GcEtiKlu}m+hwL!v$eIw)b8+&Z+w|kr{M?B
zO!#mAo8RTG(`Wdv|Es^pBabM)^0m+Lr_WwO>6ji9=ADoRC8holT6JkEN&^kzukg;%
zE33GKC@F@im>GdGDGaSIX}zLQCCaQ&6pfT`h$njN;ZHC{4%~S7@p~Uo8qKB_k)C1z
zXV0FcX*5TZR+K?2!>tzfTB!*b%7STtt2ajUFknFIS|T|fB!5h(5FuDp@E9zmjvVtK
z-a;HftceYYP%Bqi2CAt8Kp^B_Dwg4{?QLSpUn$gEJU}Fh|ptaBdbcNA<
z%CaY+=y)4B1+I{&p4XnBJ>JN1dR3o|HQ`q8?oIj8OXqpvQsCOr3RQiU`!?@oe6YrN
zU%Xl;R#$oD<>%Ns`2>$YxK6)kxceORdxlJ8+`K9aIgpe
z@=t%nYcJnobK?PyT8pA21cP@*?#+OJN!_C;`eS7jg%xVi0PB98D0KORD>SYJ)Jw<<5`|
zbT)sDmYk8fqSQ(OaZ`_VB3)M=B^!$Xt-W3OGGt?UyZRs5cki4pcxTWv0}o;hDYQ{c
zo3R*7ro;wEUDed3!A~28tKtbBmXhPEVjdI~tgWqJ?G$4S8yg#}p8||#t3AgDSI%}~
zDY-}t__*L}G2&u0Ef;diuWvE(cBe-U_#`qg4nrJ}q+XcBaMIlDsI_zb
zO?T|h;kOVyTLg9qpr-F6FqhOI?X;PXaD{Nk}s<{)zMk&cz;EarW@
zI37Rgk^gpaF6Qmb`{1X|@BF)qjnOV5%X*Aq;v;+;#diS9cxS#q}=U9}2{$3_Se61DreqAAQv0lDUL#L?+)`Sxi`ThyH%y}UU*L>hgvM0-Z@IV=tcykV{|HXplIf(%$$yC
z-YhJU>3kuhyXL?u<>zaZ7+-Nc5N1otpVy*3-t9dgb`qU4vjfH*$O>~HvMx)k7
zrjKCF`$WS_b3c0y|KFZHY5%4JDajrPA&Agey8hVQkbrEEcBph6>C*hHpV9%--lpWF
zpin&6@#1|#g;Q7`c{3|}*zK?s)^f_Kz
z=DssSR#stmZwFlrBwDLM>kx(T3REaDp^{jOj!|X6VsJ|1bu7PZ5D*#dti)!LZistPngq!J(@|3-Wb363cqg{LvjwB6=lIZ5R^V-oQKHSERSF(e
zNMteE|6~ACdGH#8iSe31pb;>S0$1W&#dHKcW#|nGCJqYis0t6J?r?5EBWZC3P8GC(
z)fK8*W@=%71b_71AMk@8yvok8V_L0q5LQvD&%xvX)FxF`Vq3%LDBuhylwKmn>m6-(F_S`VH+m|+)|Hk1?&E?$OPM{w!tln-u3}X#%U4-xc*~e^;!3s-678JWhRSX%{P}wfmm2z5An+j_T-a=o)(0P^u
zoqRAPx{-{v$TSnl5mG2K84NCBG(njPi9~8p8c&7pN^(>JFqH=^5*bX%@~T@VW?m1K
zy>`(nWTe+S?}e8}2O9xt0ij1(^ijG*6YyB6KckdP=1@VX(5gqFq@cTsG)?7elv_f%
zKIj1^^wFx1rZ3!TB}urg23J^o*$|wf)t+D!K3H_E(3P~jKd33|$0;kv^4cboW{I7{
zz{N`~Z@vXT|9RLt(`PibJpaNg+;{fN*wE+N4H&N8k5>h~fkf9PV@{KgT?wn5XMa+flY8l33C1cyU7L`8B45GBCYpwB-
zzLL{v(>4>lkC8Oy+SwUODd)<~8~Mqj>7471o4m)lv8mOp&ex*1ndA{BbjSAH%`em5
zC8}_We8qEjl%Ebn#(rWJbp>X^CuEx>(fC2~T#}KK=u$DcQhsj}%_SNs(dFra{8opV
zP}c3H{``A6s7d|N)o1Mtw9pw1iev;T&|xkbpyS4Nd_1D82H+Kg{wg@n=%^(ejro&5
zx=Q<{bF5Z}+;hrs=B@!aDI@ja)tl_@9P-|K7kT#CXW2V=fTlfU`_@Oi^X}`6$78m(
zPEeL*jCx5QV?dk4tWdPAyKU~}k2}$^^ZsyNs8Gq!*V$+3_r{nmk36X)c3>;aWa_>5
zut5Lp45u_pyr^t8O~Yg|q0qMrr{sVvDR|C}shUL;+g9j`IoL|z+FFY$BCRz8XnABY
zFa5Fj2w}dCV*-rn{EHwcZ{JTk=HkOzd)xTrEv08*AC5Q2|o>O$v^h8cJ?
zWck8bw@3-A1a#7PCLokKBO-WlAv&8OvKgcuX}`$x(&ONuR8(Nj+SSbkA4pCuQ67yo
zN|AdFF9I)k0oBQYnVvzYs_B|$IfGeLOF>yxDCMG7K$r>Ngn5wLsiLChB7P|sK92;>
zMLM>pGp-6MoGme>23
zUSHCK!a7BDFUp-@JSp)7EH8r@lpMDc{_k%;!~V_{zVY>6;y?QLzRsYAwXHSuwnwW9
zV?4?jy!NPID0QF8OBoA_2qG0&rLaojjX_1x4pS-&1))@EN>r?NARS&{FzBGf;U08n
zq)B(m{w+R=WXET-RmI;}i}wY~%R|nbJ_pT&$;dF;Yw7nZ*4IvRV)Hah%MKl;jE);>
zH>Ft4)O8l=tjeQwMWTa(jd`02g3xlcD;P~CgmA#94U8uZr3w^-fwbR&b1N}ZbRFyZ
zSSgrBQEo68K(B;LmyX!ERdVQ;SsLEQpgc`GexJ>)O>bZur?5ULkZMQI>dO5SA9YZiWnsw
zooXT(tME37CPW)B`gW8Tr9<(86oTt;1m#dTGz}t}Q>Eo3{w4aT+}x@Qna9S*@8$lz
zkWV-)LRC#++^7tT19gm64x|<j}jkWmT&{`3B
zzYz|4%G9Jr-^
z6Gd;?gms+nl2j#^doUmn%Akl#)nA
zaGu6ls+iN8=6G`Kq^MS|j=Bi667ccf3wQ>h4r(1K<_2Zv>mtt0RrRy!ta+q!Ze7Y=
z=iqG-aOZ7@*?N&jDi@=VA%sqKGXE^UhWsy$Zw~liCX}-XCiB0X&bZjtq(GcUL-S+a
z38?1(mwJdn)W|bIrC=QmGN(`7b%yuPU*Ph^OI)~cfrlS{n07Md{rBIe=nc4a^eW5i
zTO1yZXIAXZ8!ilZZ93LNZ
zbg)NhDyp)S{kStagx+e5=uF6d5jw_6*GGO9IgG1M=MYU%N7>tLw{LZVVA&dHi~wL2
zV!dJoMKp@ERumxuJ3WiC&N%_{5*lij6CIS4=P*X&!|Xe`(`r7Sd;Y!!06mZ3f()VZaqm
zE@$4TjNKD-=!AKMv6g}p0a0@gC{x6}QsxUvax^^fzSzgA
zT<2h_p;)HwpWt{}(_$z}VSNpjN`gDUPA$q0Fup)FJ?`2##XtCmU**aNfj{}q|HYSo
z;Y+Np!w;X`=KRG=wB{aK1mJk7oIbNmT@BbeG3IdJ^3X$@D5W@g
zdWBPGhM-5FkLeFfs5SUeHe(WXHLE>oJV`ha%uHiNIZ;opVEv#CZ*VK%rM@9UOc3cy~&F(;XoyQoFbg!#E%0Uqtjt{pf%MrBr3i
zmv9upV8<=Xs{@SoEcX)plgX~NCo+8r!J>qm3)JGtzynhV$56DOmSUY7pnV>P0
zRMe)2_9ZTW4pYFBG9@Cr0Ute=g)X~|AVu7gk?n9eW*{+9Gkx@)Ixi(b64(k+m_;c?
zp)_7Y)3zNbcV41`4u?`kHtDK|{L8I4Lw9)r)n
z7wnv%4Jre`D$hxb-eDUccnS=aG0}ippy>snu|uTFcKs%szzmc-F+}3^C#Bq!2M9#f
zJE3mKJc+fsw1{Up>j}z5704E)EzVD9{2^cc#V2|C@vm`mWx~B@d-PXIC}Fs|#JRig
z=A8>yIBY-WH~!t!0)lyJ?_gy3;Vu2Z2j&bD!L
z&T`^XABI3tRJd3(H`VEzMHdaIAae3Sl=Y0!(a=%RNhd(dw<2Ovl%>?2i@85lS<_70
z4h(fs!Jxq_ybT2BsLPtFtO$h^@NOq9>%&#Nb6D3BB3)78yLxNdXa>D%Hot?XX(mjk
z+6I`j9HQX-Kb>m(avC?bGJxn2-!
zoVplkk-UqzUI<|JaZK`>lc|nly3ebk?DEJUfhf6OC5LUcMhIzeWLs2lGDvQ%`QIReVe46wWwWezBlLhfQYlmxODBgi@UOux_9o%H>tY36|G
zB1lZ_Nq|4~T@IL)^AxI(d2E~6@l|B4Scj<$!_8HmeC%<~o<76z@iDu*+pMl{@#y1E
zVs*{_(TI`N^q22q?0UR+b;S7k2X;C{mE9ZaX})BS`PDiH+noV@NVOi@7OhO&3uGPF(Qvnoh!^OjE1;qyE3VmbiC)kWn0E>{QMg7I
zB`FWPQ!tN?TT)6&eB_|-XR!fNqD(
z&+?k)&>k}llJ;6HpJnVy%CgVMx45F@Xks}&5Hs|t$NKya|J~nVXJ!%FsCkvnlp`sJuQTy^e1<(jhvg4Si;E(EpKmms;CWuH!K!tuB
zXAQ-K)iXW%=QJ93Qih72DQS-;lv=a*
z(Jc=4KY^{_$a;>wryTUy-PxutHKrVJ`J&_TPZ}P2MDyGC{i2X7Exi2({Ez?rHZOkv
z4IX>&e!lb-_`84a*YF-%1JC|N;QZx%j;+FKu~$oFqETrqGy@Eyrq9}BrstQagd3G(p(khe6amyA|wx;$a
z*Kdv4n+(|OLD7TWV1V-qQ!U}pT)(l0^*wZD*gJ%+73eQRSyxymX@FDUpaolksT7PS
z*wIMpqx39JS2!KnevzuIqXA)pY{W26cfo^mKB^9hH^an2>9W-4`7a(RVv_!EK}jt~
zDKH?um00F{Ho>5CaizQg`8TT4%y}{z2nR@nGE&FJVhnnVb3vSRf(
z&873Z*k(Y#>an)e=h(oJo$~ev+Y~=I;?jGoY?@VQ3U2I-cLNme)R=DPRT)ye}`0_iH)fTNY^v#%3)79r$TJBR6
z1wGY66$(R1&ubJFL04GB>#SG+TG=Ddms+Gs1)x-lpam4pZ<4ns883S6MUzQOuBK8V
z!Q`d5OHSufDk*&F?r7b^-A>=S69sMYdGWi+z+H?Wboqm1n;f}kbQZmlAE>TxI*)e<
zXcq`3pi?9=MccLSewVj7(SK8qP@Ny>`xFgNT2PCli#_)XP1zR}{)}_S6Z!^o#fK
z#V25`UY6c!12l?q1s?w7gIxabI@fk?@tH4tmal&C9#jPf*T#JR&%ehHUwVn-gF^-@
zD;+hT$TY9h7&rnd
z&Q}o%nUzh-=X*N8QnT8CM(K{Cq@&A6D2SS%G+HZJi=!-DKz=isPP;aw`JB$-y{C;O
zL=qTEV`nAv|Bg|$^xM3IM>6)hdZZyzY2yl?fO!IpX%3WSNvr0MpWg=wAm#uxsg9=K
z=Rho7XKG){3CzJkI!B28oUZClDyn(86QHYC=)5>1l=t0@ndiqYMnv<-Xbvb+q$%B7
zcgiiz=fh8nqTcB~yOS7D{&}yg#96F}A~W$?jjYSTItI&2eC|`9<2V14|CE*GJ}SV=oNEC~2&GW>gE)_6-}RJ63YmBF
zKLhkB0uIb6PiG15q@YWeV<#8ZSsiJdQ{*u@?>Z-An*WO+G}{aEeiiVO1lrUrErHx#
zneXE?H|F-o?r)yn{IfvYzu7}Cm=J|$001BWNklB4?36Pqu7TK}D7-TC%OX0Y3)*JFbQ&lMMOj9cjHzAZsU7sz-l#N+N{S0ZLCO3Pr#(
zWlT*?$0F+JrdA?TD&;Z~Upr9a*+f?we4n`aF`Hl6h^P58Hwlz{SG7$2F@*x7YY4SO
zvb@;%RllTFj;Rjpj9T{HAx&c#jio%DwGa$6eu^qRHJY-P9MHD0+}zpcTYvBd8yh{Y
zZ0}R(73xAtrTMnOH&b^NQ;aE#KH3eL9Bg9DkfXzf|MOeV@a#)HPM=%B
z2G7;2yL@o5VQ*AnU5g8CS6x7Q%i*m!INWH2n;uiv6}_d3sxR0~DMw*oxUxi1A&H+O
zD`ue&BG@_}gKwr3IJ6Tbp+Xz#-ZHue69hzF-iI9zJMNIab@Zk!?_S>KwYTr#^ixnS
z!Nx-;@C8@{?|cL={CJQ3W`H-)TbARDS~#4xsG>$!Q4A))?yZ*A>ZlYZYG(uO+358c
znAz}$cq1BPFhTMLgNu~bQt}JEcTuDx1q@?2l@b?RH$9YcC|Z&NlN>*)U#V29rh}=o
zNeoCbZ_In_-p?oa?3e)F#b~AmtwJnBA3t<)RI5!G*Bl)jV_Sn(5?wQerww}qts}#2
zin9S941QX{RA|1&!cs7-g%u85jW;!_XBZ3y98Q;M$74P?f56q|h}v&Z>HAq7RM-$u
zUSseyZOg|W?s0s5hYRH)E8&1L)ZDnW!z~L(5CJ*?=C)<=^^n51I<22h>SQAB&^G=|Ip16BO$I
zCGI_*Wy$V4zt1u0%H4aP?bqI*4VvhNBPfs{$RR<2L8IY_nw1n%C=`mAzhD-l(25bW
zlXlv0Luny~M9lJ2sJK;G
zS((S>Ilu4Ee1G@zSz)uN?}`tTQf_Vho3&#j7_~RvSx&J@itXRm_H>@N{>Em9j0U}P
z`=3u~f(M)XaI+k?=d7}+Q+HtNyC0=QL8pIj#BM8V|NHL#Ku_^b`*Cw_zplgYe}wvd
zSbgqShI6KGIdMKP%c-PwNfISOHe{JZC!VJDG>d@QGz)Y#Z5Nq}x>@r0-UA$VeZBL@u4*;)~$O!dvhTECSGSqh64d4_uW(D?;^R*5TNwOGPa|it|J0EXM$^P
zBGuOKW54x}?Q-?pdd6GpUUbFn_uUYL_sdz}w*yyl`(C?*{Mer1chP-a>##TW&*>8j
z4g0V^Rx!SH*V-fo&)crGWTRx;o`bvE-d~UV$8GDj8rSeRfnq-$A0Kn?-aU*lOs55U
z1dl)dIN$z9bpm%30V0YCweje_l
z_ghvkftL+Z7*g%X86m0@CRw1ziE;gDo-nT#)UM*i7e0Y$6e;`E^O~xu
zsPiU}KFXZezWW;Ir=IhdXMhjZK^;QRgtftp8jUy+IQqW4y)hYWav=7U5B<;G5DxcL
z!A5o;jIXhvgW5X)NC7?p#zaJ9La;x2hQqr8
zA#(1#x8%*6*HC$l!&BE9XAe+nLXt?72p*VWbQ}-^SS+I)D(6VGCrbk>ep5rWUSq0;
zG)>W&hs1(w9M(amf*ad>VK_cH0e>#I$e^(z;qFTD+6VB#4Au>N_q~QWIZQm{3a>`o
zyff$9-&=4{O!(vzFj8=52}g7I>bEU_^Su+~_(@hK5c0SRUU?7RzvH=Z@qpXQ01n@J
z2VQyOkoiJlQiT$ZrdeXj5}JLglM&*47|h^JwApaH8;}5~FwjAe3D2o)8JN6Jake4k
zVGBOm(6k*JCzQea8bq@-p*+Ejsaq&~YYzAA#6l5STsOb70rmEB6vZ4fLKs4_)G!%c
zX_3=QRI8FVUc1Q$R}X=}+8C^&;KdRzijbhx8-$g(M&X)Z#H<%!jv7>X7giq9+hpF6
z$}zrlNGp+5jk1D59FwVrswr8Q3o@UODNCMLC}T((OSxPknkiw|V7)obyach!uj^z!9ClxE|aknI$-9uHR8MG
z>8>_JOWDpj*!HX4(Z8K#(uPfQ*!S`Lp{sS@!qvqj+8XbB#47Q+?KQG2+n(Qp>)NV5
z)xKSQaaKRXG%E2P{kEQBWNx3^_0)e!*qI)re}AoYm#4AM
zlDe6H!9_Q+EBC=|SC?VZdA6VbFedWU*zN+JyA%Ms`gs>99DWzeS!6rg_1k8F?Z2v~
z3P8AxeT^x4j5QsBlTwP8Uw)Z?{?GpfM~8961({_h>PvtcQ{{$C9L)LufeW4^y8FWxnTQ6?$*I|Wfx%X_jz0o&iuZ&mc%`L
zdry-g?Mr0c5p1l*IGVblVojoRl(211?1Z|6YIV#wTOvtAth{PKDY68-6?p48xpN0q
zl_+Dld=TRI7iELgmd1LHPb${Un#JlaSpj&7u`4E{hGo;RfBrnnX2I&l0(IA5oI@r1
z99+7L_nzDwAut$`W0k-uixd{^1&Lgu+!9lR%tG@}7KfsCmSQsI@NkZ>nn^ZADNQ;X
zkx$k%9_}5l_~SqQD;|GfkB`5&&!dlJc&(AHL5>84%JFUf?I2ILmd6fA#=U*Run(3HpvJWCRz%xyABo1Gfn5rg8CXnva+>^Y2{fL*odzGVmwgr|T6G#YN
zJie{jd0YtVIttD0ayQ^5+jGO%teWmT~@HC8H)<_&-M>Rs;C`&42@
zS!>>W$0Ec83eVa#*h*5)Q-1L33SUn6#@{+F%p~O!PL}Z6+ef@}ZNj;S#=P_zEUrOa
zmRvtsaQ$A!xwWMJGgu$NJMZ0OUXC#;M`g1>eq$SyteK7yQneY=2qHJH@L4GpHfyz6
z6gF#`1`322p+$qE1aDiHf*L6lVGVaJ;ER(nS|eTe;CBvwqP0RsAlPX-qE;lXT7g(c
z=%hVfw?MLL-D4$)44I5DH`jdUoA2<$m#%SiuL7&_Sd3YNY<;nP6#}ZMkwUj_IFO~l
z9{kiN5^VMpTx)7-Q6tyK!L2Gkz#55aAoq~C67SY{Ver`~WJ669iM~jJCT}#U@ua3g
zdB?n}Q2R5MnW7Pj%;(r;iL7g;vy@VoC~Zl-BQXMP6;>r2DM#fEg|G;61T!wq;IT^q
zr&n`uYmg>IBw4U56IeML8jQ3^;qX?VoI178$Nzod>y!}EO`mP|RUtMp4E@b_*Jc(x
zBZ43XJ`lo)&GCNTDocnZbRuYwBLE$iU4U;WSad@9j(Y9_5oeW7$QK*s%TTx&3U1zS
zVj`v3)PGC3JflsWP|yd-zFn4MTYK+M_x;&p@uReLxVd|Ge<7pawo?KzNr;KFqYxWv
z4YsLhDoe8p8o}9Yf|iydJ4c?L123>^ST7}YC0VUXZr!@Y@y+X$t3&2Tdlb1uB?;5L
zS+G_i@Pj0zQPI&1KxDsdz=jyc?M`E1-EMcph`M8nk7%Wf?!PfUO`hRS9Pcp{;*?TB
zd#N>2LAhFY=f^RMpOsRKihK)%_ER{MHrZgT3H{YmsD$M50U)MH+PPu&;}KzF4UD-cvn<=n
z#~Ce&Qc49(>>md6F`jog>Z1r0EFb
z8kE)~*%+q^XjF)WMuiwZDRHe^vuuH6oG1O9%tNqfBJqpZy&lItiVUdH@*lx|2iAzO
z@Y~lJDk(mU$Z1%1_5WEV-e-#lY2ZTLUqku;Hnz2Y-j7m-mhk`BrLVBssbt*IzW6@2
zJwA)T_Bzc*87e#>zp3jxkciq8W`amJri!Bs$4?_>m`Y
zb;a^zO;ahVszm4pp&~I)&O7fN@xePcIJ}edlRx<|4?dhRnpuj>f>H=J93?^S_8UuN
zNAViuZy)7$5tXr;&SEKAqfZ}9cB8Z<4bitq$~Fy%@D0|KB%*+-=7&GH%U^%>8gIOM
zkHvCIJ{{wn0_kwUe*z`jEcELXYRzfUIT4rQQ
z;<41_ib?^bm^uZQlE>V`zD6goSezh~k>(VmL4({v?0cT)4^Q1T+R`$qEHnxS>tueyfQ3L=DhjN
zntRof$|!t2Wq+*DYK2*ypd2LLQy*&HtFE$M-C~p`7^@I+jIm=boV!FS8s2|v&arDS
zcFi0^EgXvv?sD_?38I0za#T*!2!#`KyevuGA?I?*W9LR(nTFWg@X*pdq}GOjcOe8i
z(Wn*}Z-l6DuC)%cu1Qjf)Co!npvL>Mn{=WLRu8OChSt$`YjSpiEp+jb-Z$-$7@ygn
znHui}0!t+B33MzCiq_H@(fnHSl|TOmfBjdlaCo9f)C})dlx2y~7O9i)&^RArD4hwe
z05nKowRDU|lEjE)OW+Atb
z5Zv;b8hios6dD1A0LlW{6r=^5xPml;#6xO9Rbh^uXjmAq70imzJ<_ymKo!=5L?z@Y
zSe0WWG{Pdh#v!pfXhD-KLD_8qD87&X`$A{`JQsx^!s6ZE4CFvCl4tCBeL+fk-{vyy
zxzEZ?J!IU3y~oQoCb88>?b=xT_3m#v~F|*
zOQdey{RSAP``i&>h)tV-&N?e1ux7(h7%jQ5iAn4z*L(N(-lGTZda?9lB7u&Hvg_AK
zP{ig~zu#l&r+65SkrSTTY!+N9m0*9ihgmOCV!=a?J;Ja3`p5X$Pr{{H%Zt-CTxodr
zxu>~)>n;}_xWXqs@gk31zJR1+y|~M_zx8*#^zzG8Rn;4-Vf}j6qQSWL=f_!fkLUH>
z9liG*K#2wt=ji}sk|Y#qhEj^Es#q?ULAler_Aq8H9*ae5-2ozxMM{Wy>x5`yC0ol|
zmSw@xX6?>4#CFCtzi;V`uYUXb=k@CrNoV?&N3C=?<~KmxT8nMnWMiE|3WDue!67lt
z&`Y3S_asfaes7v)D~2+TPs|q@0Ye18@hROk|6>`Bx$n;px!qU8I(GAX5a-&TSAEyl
zUGr<#v0e2$>-ig=+wW@t@3vzChwGnd8jg;Rc;d0g`EUR0|AyIg${Vk}&NsjQ4QBfn
z`S~yWV@7)yxpOq<-Rrj?J;3QbzV-6^{N1Qp()uH!!*Z2=*kGNj-fvNCf!%*9jEwy3UBwFH4L(@o*HCZCbQ+V(}_|5

em0NY;abPrXv!bM>N;K*VJS*GR4Y}=TTFjM9DKxMi{zMnch^3M?92Qy<&F*4 zR*Q-krr zZ`oMb%N0*QH09>2A7I@YEoV%`oJ6cBY=*NnMkpK$veh*bQ6gxbF0JCphTS1CNR5|mT&(3cli&0_BCFA z?SxBLo69P`O}S%-e^0PUt)B0w7N% z)|tNo_uw3er~Dvt9*ar1dIzTI4Q(P$V=tNDcWcteZ^* zi36`e6d@O=_YR#9^5R9eVGl}bvm1o{+u;n??!E7W$Z-B<>;Qg@YHXEG;QSHlewJ_`r6tW8Y_-BS z9+iT(OSD`v+t)n!Fy!Mf&ynEPbEMFa6-@U$S00-2${Vk169({g^}{L?Acw;i30fgb399I*|w&z_v$rii;$IS{e2jQ}x)PwZ!*Wo4vOv z)$T{mV2tZ5z}|b1!9pEfv-<*S-%a~|B}o#b-e#xm&w*Vj8u~7;@xHM?w-h%6m->E* z$NI!P{cFVj9t!b&tGH5%vRMLb^+}xf0Q32r$z;OQPe0Ai{LH5y4QuxG_pkEIb1(41 z3lEb|;M&cMMieZYgr!MIbcT`%4ejP9;&VsqZPKQ)fzFG?`;A9Or?`l&=W^FtEP@Q+ zeRq8+;(7@|Q0;5UMVBt3n}@2+@z%aXd+z=A4%#{cAq~NO%1{wC{I1WII~?11-~RmR z*QLKNoK=R;_bCwfA?3r){V)tW1m}J5*T2B7{yFPbCQ4YX#48Q!#FEG6Xr3-n$ks)NTZi4b6OM+s)$YC{agR2r)R3X>B_K?>wQNd8) z35Ej;oSZ;53TfK3f;Ws><=f zwOf2`QQ;g|moggVNSWhx!@2=kfk?(kIpgr~eZKdd*SURD@bq(IKItCdvE(A-%NOX& z;+=P34?qUlF?t8a@5JD|xHm?tWbgBR2UI}Q1fyoExOwwBU;FASeCwNsEKVkfWP%VQ zoL3m%phSq{w$70xka_s{(~{M_8S}Ei=?0`ii4Jx$C@xLuq(~{ZwN3#X$WEivcjxlHjlXIPZ@>L6moJae2_$KO zN+D?ZBU4r@K*l_gt*`(DU+6A2GRjKZuB)P(q-rx+MR21N_`t_Yn-5ZKD2kiL<7&fK zzVes6`pR2aa{(m_7OMtpJZYLz8;`UKX*5WMbgG;D9)b(6f_iTG-m5FV@#+nJc>5NW zsX0h2I@gqWMpLJVlLEQ+Ohm&dH#kmM)F;R+hh&UU`$#*+*BObeN!1aV1Yf5to#8~) ztQ!L>!6cb7PA9Bw!?9R$`{XXwNySKJOl(f$8tMY{L@{67qcH;P9xpum0RQxhm-*E5 zdys$=6%L1WYpn5DUxKwk0FwgYBz4oEdYa%Ni0m)i-E-eN&sy8Ln{KTQy>sDgOJs~$ z8g90I;JQmIEJT~{vv>TgP3Wvm9C|LGX8_1u;B@OcQQ+%YBHN3E|1p*$#*7ZwSzU~| z8tm1b@D#7_2OD||9;FBmXg@lp6V~YeX7`wy0dZ0Mt{)TW{e~s6JFji89k@Ua-}eDz z-@2t#a35N&=2&kqrRCneBZMhQ$Cf*HPWayU?l4sscxUl0qh!UEOEdPS=UCo3;Rio> zlkb232i(4Wo7Z1|ozyjq3(0DJhu2?!ox6AMGM-L45GeuC#@B8@WVC#5yGcbMGrE)Z zK~)&D4Vdzrjx`Ihmo11Ca?8rsxAukUA-C=w`{*ne$iCZV(==Nyw!vL>+v>GmuX|H9 zu!?Ry4{{Te)o*8K2^v^hhb8t=%vTtRZ%iA5DvHr|zpw!^v90|!^`H5^l~hVenx>>_ z+Wp2D!(z1}P1B&r?E$nQ0aEO%Xsr|?xNZuewper_tVz*gny1;R=VsHNz31%=Fh2w% zyVkS*`1D^x>tr7U#N++>xl8fYCq9b5jaCt*6t1-dJ7?ST=*C7V#bh#JybdNb&%1UCMfR98kQyO?So2TzHYq| z9q1J99R*-H%3wBYW%)7?j#~$%51wd-fC+SKkk}iC`!b zyp{YtcoR}4rmdlNegch!EDH+lx^7d%q)?Z%vQWTT5kGhGTq}DV-GPf2V46d-t`ID6 zeu>foZ8MlR4OS_X4wEV|aA6NV|H*w;q6LE<_R_Ym>p=7BMsRG~V9@|%$pj>_jR7-( zd?(FArPg(r;As{>WNkt^hj|4i>~&!h0wY>iRUhuPv>|8Q$e*LAVH`1CH!0dN-4c`> z(k5LF`6Nlu+6Bfn0a__mtCGL?^564ozy3>Hy!Z&qlS9U{F`~0L*4;$(9UwHcse3y> zxmk?cT!5XK+_w6|mSm^Zf(R+W1r3u-KnRcZ6-tDZ5Z*T&9^U2Nox9*IdF$3yRZYJjTGEmJ?DU?QF6N$=4T)%O|{{9GIDiUu{)Ql1hl_MJ;aCLc?#z=B9R0ESjQKPug zIBFhbub9HxAeI%QQO;U6to;#*9wVe7OA2`VF8?HbhFXOOL5~${bB{_)sAb5RByAH& zYh40bplqPYjtj$ZL63sm(8AKUzF2E8W+UiHDMS9cp5;1%$l-<=H`t*76otetH`@T@ z#F!@Ei?6vK@Vj3bp5Ncd<0ik$3KfN(nD?+Rq>EMv>w|$lh>TTBq7WsvH^>;<6Ujq{ z?yQJl0k%z>CsJ&*^`WoAX`O|^w)y*du|c~O1H%$68G>zV#xO72u>Xg`S06-dlmLn( z*$X+-OpVS)I5$TjIJ&#yOaJDt_=ErbRm}V?KK}fJ{K^-9o-h8=FH)C^Z~XnMT)lS0 zVzK6Te&=_v%M(VqU^-GGKm?B(r6sD(-D>Q{50GdQ zrfEu16jW^+VqeAFnt7ggyzTd=dJ^P?HKimopvd4`YBlA|Crwsz}I1Zpu(JS zw64J&s0?8Cop;{hw|?ulc<8|gIe&1DTOZuuaK2{m+!~TGtJ<)#3Y{O&NKf4q2ssMw z)k31A#;ZVdWSbfxJ!z6q)dnS#Zk?g$X70VGC<>aU!P?MHt@UP4a2{7z(5`8bG1WPT zx0@WJKxcuB3!@SnW$|!*??3aqJPi8o%S}@;EW`aR{${A8Iwh13eh*bsB+^NRNC zyGw}>pZ}o(Y;&$a4AM0HIQ!>^fym*$J-lxJecvJ<%W}D7Hk&b>PVwF|pUXFCH%{O`G4YybF6Jb;}uTi7_YHLpipQfn4}s- z!~EnPN=dAD%&QWeXVkSpTL~7{b;IQ=m&kL?`yaf6r6M0I>bj&DPjQW;t}IGu*2@*n zlO!;U3?5D|7!NCk3xO9bA-(BE*#cVdAsT}Kd z1%B1Vr%M^Elg2<%WL!HrqCP(4+}?=&y+^ooX%iBGb2u42lTIr|qFN{HX>#zrV57c{ zFG;5@+Tt*YWdlxy59hiVN9hB`D2f850+Vgn%T$oV^hOCgneNdvfZn*QPbQH1aP>q( zwT4s&r-#`TCPe`44?hI11$#0Hp)zSmm5Zq%O#;}jR^fI2ASelh0G&XSv_>=!$tVCz zrGgbXrg{`Aw7jZel)`KjK&@}r*U4mpb0=8apq&7xJdF!UtEGZWhkmLXkfXq0E9-z} z6M!^;MJoa_H4qqkL~BmB0W7K{fJ95HAsK~XsMu6g6B-bgIML1p8Tyx#1*ihXAyzba zQAVq^h(G8}n!&=+G!0%!45kz8tqpaT&e1e$rqc<Wr;LGcfxK^vBvn9>7UQH;h^Cu{DlEsaXa4z6%AUj=J5 zoWu41YH)-fgoN_OB7! zwhP2|0zwCfwqpc|f+yR;NZ*}Rhz$|Xun*#OqJ;;w9d{L76BS(tY;Vpx`eIiZvOC81 z?Rvir2sgq}zrTj}>>uwR6GDX8Tx&T#UUD$m2f!FdmW>#td;G#@U*wBF`)OcIUh~{kaDU&(NCR zPoNt1u@E7Fa~vlK!dvX?J}4PpyZ_uokk`*uSQJGE)|_)82w>oj-nZUGCB!a4REUs@ zW7sc4@c&`2UE?3!X(8+(WmyKm(-X#>Gn8du0FAy#LxmxGdxHFLdK(zwt^ z5m-e_CC~w2DP;$$W4*0+NXJ%MiQ%~R$4W}Md2W5Qu5AExBp8Zg9hC?DK8fw=xCaLF zao0N3@8co(*nqFo^$sAX>8?8j5L>aFasCWE4vaCZ*K3?}eDtFqrKxM?^EuX9KKHrL zp|gt^U2w9hsH|ps@DMK9R6IoY+P)Ga z0((U`Uvm1Hj!Hecc5V6>=+@=9cWfz!{B|G2IuDNz!RPQdvH$w_?cXE({=Zy_*OX%pS#LMtM|{Bzr8cE%C;YBniS>v`CPod~jHir5Vh z!%K@4H93M@%$bbW+`I*oaq9-_V3cN95fmhKSz)cAG7Z8DRI12Qjncup(7Tc>b<8eJ z`N-oJdGg7e$DYi1;+dSRb?rU7MB`0=j`wAA(K|K-nD@J89HU_H5n2Uwrxi~=`6QqF zImxQL&i7xsgG|pOWJ8i=NUd=g;uaz#+`0#U_tn4S)z{~UWJcvzRCP_F$5hn`)$$sn zY{E2q8fOv~tD6{Ek`)PFCFJ8vtX77m3T)KEd5SzIPm^x#R7!C?Uj&6$+p**En8|d^ z{OB<7fk=mXlb?Qu=bjfhQ&3h3f*g=&B_T^4iLe1&S*SG} z9m98Cy~S-VQVD^r!LKTc=7>~6!M2k%OkCeG zK!s|wIU!0It{K0wh5U%PQ2sD3YH?nCj}~1SY5MTU*+6%$%Wa1WLcwajcXQ|!!^cTW_?ny zo=<72Ipf(KrUy5m!^0a`Tau>9+gOu59#`VKv?s<<&JgzQDbHSza zj#R?R!rDQt&Qm#w^9hv@tX)ttcmYltybNhoq)HJ&0G>c$zoNauIZZ=~^C4bU;7@Ia zVT?C1VZ-AQL|SW6Qf+O9eW5STD@MU2@Bqt=-%Fxs8pJ{b{2s5IGPmu!r|wRs1n zh=e}TI<|TLVdX61g!s!&lRjws@c3Ex>R*2dA`yDgNT3tlTZ8wE?yf%szQ&kSad>f! z5ki0*xYqajNVN5p?lgH+A0+mHX8b(#?C6*N=l=5(Esybd1k$?zVpJ6LQ?T^gA7fo3 zSy{Bk#&j$39$6NMpq_c=8UDwA@jtLP8}s_BZ}O#o^KW_h@u&FJfASkNz_pu>_io;y z@gokGf<^s4S8uOE`Y0FTcWDWrWZcia+-hhBWfzFP-@W3oxVFW0q7TZgwHpF|=)zkzMWR#^ zULqyQ3$m<02w1LbZXceY_8+1WDb58@;k?31kMa&9JRnjJ^F4St?l^pCF_n%csDOT{lekX4J-$s1eRoq=_SwRZxzZ8dKfl-1&q@E??ne&!6Xs zC&yfRP%$}I;^k_Gqp4sUG=_Z#AAL1jWzZ0{?<{@4PB={j5kP8^<@mZpIM3{%2l@QZ zKgeSF8h4Lg<<{YXnqv}~p;U%-9%m(5CL{?o8GQR?&)5F;9@$u6grRC`lyWrnf;_cg zju7?R;4-XVQTrN{MCb(P7c|D=T|=T;#Tp7{1=a>nu=#vWG0xFhN@E<>E2{b~iI7ZE zh4c-^TfA_18H|bEr8sAhVog)7xpZ)kiwBSM{6{ksDYm=-z9!G6XbUK5NfSpRf>p3? z;Eng!{OQ-<;va6j%__NoN^(+f7}xiZW{vd<;T3NE2Ht6$o$PLHy#>U;zkaHz(|1?l3b6;#}hvH*^B(bPoC#W4r2+fg4GJX{FOsqd)@QO zD~9Pr@tMy(!s8#g!V`~ANgTKp{JTGRljSRimm6`%jDa8{Di43?sDEI8hKYMo7_GnY?R>I6NvILnDQ5T___{ z?q;lq|91&F5!f|N)4Gam$0A9wZEYFuvHk1Em`W!IE=ujj;H5x#ftNw>aH3TuNP+aC zJ%9UpJL`GB(gTZU0mk_Mtc}(C4M~eq+d>~vh-@uW9VK~h1@1s{|9g{n7+qn{B{90YtokGDF zLtWQxj>8R53FEODBc;?9t8TyU(bAJ-`6)}paL(@nNPPuQU%-V8sgKqgQ#V^mrMND{ zbCi;V@PkcUr|6vn+itV{x(gpj?V=?zf}>~=?8gK4t($Rdtap?)cxjxqPTWsH6)lnX z1CTLK=Mabw=hLqH?E;?t{Fy^VSHErj|HIhwcuZ^Ed7(u2`MxC*V6|G2BncNUUZf}r zbP-(6rqd}!k@N0*w-M=>yGJJ+9v-r+jyYOOymwr=a)o!^J=qBVvfW?X658X5#7O|A zC5wt_S?0^d7I50`myI0I&BtCJhQ2u?o@+3k@w&tJ{j@i`iWj>Dgf}$K28mR9>RK=z6_jR$V9lr~P*p=|4BqXLstjK{4kk0Q++mtITCGS`f^dp7 z@%W^{itro+1y11l2vW4bDMyw=5=2zIP$;DlPEj`%*(jtjiTQ4&TO&*eWm8l<^6(y) zXAkh)M+zQ&G$qSRl5rU{t{BEs>U=1oq=FZZExYdVYPNRQjX;aSzN{yhU@k=SM34K zUT{loV_HuM&(3cwl2Z0HwPA`#CAfHb)wvgSqrWRTpymy>FR^ zhR3%`%Nm73%QP(N-iG@L2cw*ief(jZ7kulx*LeAjC0e;Qwgws+ytKGPAX9}(WB{4e z2p2$0ZJ}|;ppHnUV~mzaSK>;EImsC7B~M&P`1Dh7fdHM?i<;>;<+14jU;YZLufD}& zk4*S4ezD-$XEupTl!wI!m$`lYU97G6!e^i2*ME7$r3Zqm^Phcr#oBr%ndNgYKEQwW zj|!f82wr*_zWa?6J~&o*RiIK$Dl}S#Ybyn*%)vwkLIECxb67mq8yu19emgE|mq6Vw zeGuuK!y~$c-Q7!UyI%E)b^7-*K9D(B--<8o|DZSk@ObApwre5qE?B^#_Iz0Hew{y* z7=Y72XM2{8Np$ zD{MXInS^?B`E_I@1R zV7Cl?vAK480zwF;(p>b?b)QciS|^ zprsCbhI0_tMG;(G@2B93`_V8j<*vToH4dA8I(yIjah|WU?kPlY=-*% zwRvKP^Ju928Uo31ea}wP+y98=e&8F}QY6Lx=#J5X_;wrXMXeI$L~9#rZ}F8!OM__~ z9*OfokY87@a^QtWs^IzNY>jm_LN<(Y!IjJVUtKb4gt}Np}Zci1y0DGp)z;~(lj7fJowm{ zpPPP^@4WIJt5?^Ytd>Z#4=y2YE#7$b7W2h>ESGD}UCjB| zr!Fx&H{rE6-{tDnTR1brCo`5+1KzfTb^vNa48WE8aU= z^4>j5xy%^n`2P=siTk?t1{u{an79*^ceQ`64c#Wq*5c-7Uew`W(VvQW2iE+ zJcE47f)Q`ul^k1vuPvs^xU+zH4K{B9jbLj73>$t+y5bbUg|tT~Aj2f`)CekYYtl@i zv*13VwGO_$agh+3-GR3K2mf^GbR@mSCTxJMCQ`yC@1#PAB>1&@12j3_nF_mf$$}l zFHD(?6QtIhEap7>!pGWmYkQ8zzuhmZXWsxlNjbK2eYNz5~k9^3sn_47oBl^^L%PXtmn5O!*BMcj5X@Y(QZ5 zJnvWwPPL!Y_l)B?!&@7~*WupbeOLefeCqdcf88IhfBpB{ z-ZZBzbm%0vJX zVLZw=Xj$`9pLu~VeEvC}cm#4C#Ms3WzW$9R|LXVtFJ5@=Y5uGK@@IMY$&mUZ8wIQ3 zjT`W_ufcb|^E$uzPoL(67ojY}wwg(}bq(IS4*%2t`ukX!f=JqY&lZhGJB=cEb9fn^ zM+-Czu1(mSNiLn~c_&fwtkh>tvff%k7;XIZzg zzg8pK^}<=u0;VIubd+#-Y)OzH1$*Oy&wT1R{`>!Kf&k`+fk`z<9^>U#9^()H@aw$v z{a3hhVZyI`;j?`9XC{niff4upYw)lBk8koPfBH4F(0uWievx1K$4|0%0siQZ$NcNx z|8o}Qn#v|!GR)>tU1Swj>jSS7VtZCdDaOes!a)k8;??Key zEyxuVP0jl5b#!`xiFNF&lFvO+@WoH>^ZcVQ^YF-Yk9h^x47_|}$zOisn3rC?&iS$9 z<3ahQr2qgR07*naRL@=DH-707x(Td9C&%!$@4(-@be;9g@$56_`02+VU?dz@Z>(vI z;G-YOxpkFZ116f2801q zfl?&r&vWIWeX<;!uTiSNS&L8C*mQwY8A{d|XF`rnlcSnIh?IFK#6F3=fGejMQ;-OW z7K%HE$LPH^bv>m5?%jm%f8BHY=3PGdaYa_ZQ_sRjJ}UUcr$y}p7S;;8zNM*_RzbSjun8~j6 zzVCOIyHwS?zr8ov&2ExSa%Mz|qZw)$$yzKy$T*4;S&k#b0+b*z;s8N_1V)l?0rDwv z5CpIV*$DzzHYRptkAWB(Ns+aUq#4Z&XEehmIV6WVY81U91+ZP7RiU*oP3$Zk`T1mZiv9nYV2cUB0J)nSgxp) z3Brd=nEBF|4d0~#d0PKSfDxC6M+qE{inaB1fTQF43@7_!Do3aqDIMiNv$b`CfA5z* z$IpEZW(Tmn=BKq8w@9VA_|zGmy7>eje*7`N_=~^5rL(8NPN^mbTz&0TKDv363r}5K zc)paPQvZsJ`K0@}9em`;6c zVT;xZYYj@MF2*pue*_pYhHMU;=9WOMHT4Q&owVOpjnCzJrt>l-28v)eK05`a5lEIr zOfeDjWU2+g_&6b6N{LC_UsJH1x`8_9Ix9|H*YozU4qawxb&_W-u0`D|Rp#K`X;r4X zI>z}DflxZfmjT?ef^K;nrRT;rPUFm1DS(#8SC(a+^*Xj$3M`{cn1aZ3t;@2E!C=6d zQ>S_PmtW%Ki4zQuj(Ov?tCVZ&y!azOMsH)A{o$1R`(yf>XCdF=&A0FK&8r_W8n+1H z<5Y#zI3iPTNb#bSk26YQ|DxOGa5(HN=F6<4Qc8r@-W?y?t-oCpMmOdFT%)o}#`RYK zRy@>ZD-~)h+ICf6rRS$0Z`Ju7$XAbFbE2Xt#xzI5tk^~}S-Y0!N~*j`%a)WPod4*s zkH;wi|Nk71T1Ot$KJmNMop`xz5y6rix6~C?&?-mgp2$WDjd21K^yWectZT4LL3sC3 zM2nMSoSop9apn1w{Ll}1rTll_bo5HWb1%SbHsFtbUvYA`t-~~ke6OK$>oc1;|4GpVA#M|<#SEShE^D#b6(^W`35?8 zkLr+OqG3wyDvW})jXqNJ&{|`JMF~wVGc*qAW}pqT>OOVz0p(zZ>gNbF4Tfpcu%7i| zPb95o=YNNG?qXzMzUe>GAhg_(k2p_Q6p9*$wZb!|1IPxa8idT)KB36V1}TgOyVjE! zN~e$pasz61j2RAb<35AlI@8$%T}nRn^ct>$t5Q}zOzx~&LiJ$xI8q+cS$)9|Kr!HLL#TQTVGe7i0eDua$bUEO!eeN<(pY>jwYf{l1 z4B5&~qlz64XG0%$MTQaJT8DF>tVSw@P-_S+5vE0FJ@UePHr8#6lOfEaaZpzdiKbtG z4r4x-P$)^MV0W!YRa@50lqa_puRI4&Y=WBjJS1BB{4={J2bjr(-fYH&^ODd1RXDc| zqVXg;<}6GP;m(ac%CnN6{Ol9Fd=V6i?|wL7I5b?o1Ur2XBytJof%7fA@d13Tt(Y{5 zA}^q^4EMmE@?${(+6gkN5Kdy9!3c+w!L%9|Bu5|x2?lTBg&C>5Pl0n|s#!zX+r|ga z2NSqx!a$7RF}S>TYlrYsqLVn`0iz#c65%;$febsPRaPL&9!lpRy#~q&i?IgVdPAy|K5yr`f*vKZ7Ptmfk)yJVMo-8F zJvRFVYk1sxbZ3tnH*PX*EM}(YZ^QZX1D?6)7o)p34*2$8UgP;soZ{8*Y*4Jj-MeuA z!Hj?XJKy8q`Nb<-y5!k>$43v?8I-*6^f^xNgiX@H_6C&FG020k1xVZC4A_vq#W~Mr zR*M{`1kyRAwOFAcFOf=PD>Gk&lSMk!lt$Od*j1@OB&Ec(u45UEo4pNM)0kL2zGBQ{ zjDhq*(ZlXo@s+YJF1ze_5c%*1AM0RnOAO-DiNgU;uBo>-WY?BbE1#sa>W!OA^=J2Ph6<8loDd>UT8BX z0x%V;*#TAZx$8d?fFIo3(`4D{`EmTL5)!&+NynLUr+pfUVvYT~_t9;|g|ln4=7`NL zI3B{u?YY5It!Z#@>Cz5={uhq*^)+7k%x8Jwxw+D+sm9#6al;GpG7Ik7CdA_@a0Z!L zaaL?{j{}rxT~ZMFsQHru34D2do zmNA>n(78rs%Db(~r~n9Vqc|p$Nhf?pw?JTlDfCgwjC4Fax;?xb&pejVubIyJI_e_# zDK6?H)j+TmHKz5%RKg2@LP;{6b!F39ckZyOVj^Q3wPv0QXca?cB$tV)ExI+v1&}6I zD*{AN)THeYSm_bY&&iFg&2FyGX0y(H6&Ae`;@TL$U!_!79$Q@t+j+cf98as$6e~iy$mqpyICUMN_)^bpU*m`&58XNL1gqSm;=Z~PcrKqQmd#@oCAWO zAn|pIar&}rKj%Ei_k0OySklAqZk4+t)~9dy|6n9ow#29J;1y9M<36^t6ap74*YmcE z`~dMgi{BnCZCg_@WjdWu*FMcbp66Jl(7}4;m3d%Yjs^;8c;f69c@AIw1XN+YvODH6)qL$(8b%2kJ3xb%+yF@?1awY8pwAWh?^5C{tU!l@Tw{CQ2Bb0vi~W zJ#hs>tcn{B_jNXa(A7Y)q4D!ed6FHR1uIZ0N6|-FiD+7cX;4{>bzp?VNrO|+SCEN7 zu%;EopwH3dh|#cSy@2%`j_%&%>wo?y6vZ~5`;i~!rB7=vJ$a6cPn_iP6KiZ0@bxd> z<~RP=FYuXHKFQ_3`?oo@2?M=OHM8_HFf*T1a5&S*GB<{GCJLTH2)G{$1B z=LnHlgv@E08e5G+IvVe>+qRZ0D`>4juLEnYWLj6WGklVF1v6tf98Ixmz_@8JZN_eY zi;5X-Q7{3r0^WSrQIvv9>#&o-3#TA|7OuRYIkn;2^xi!f^nH@jmtTU-^=A?44wuiH zfaJj{!Pj4Vm#@81@Z6;{{QM91$?>j_(_?t^dmmBd8Amp!)EPyV`M%9OGA;|q42W67 zMxHYihQ>6s(r+-*IFF|B@XrBF+mg8gq1Hf5fCeEl%3g_g?98yj;AnvvQnp^8i)L|~ zqoe}s7jh3E!EZYnAu_-x8x{2Mj-WY$3?Vd#3fol3tdGhCjv1CJc(`h4TF3|BTCjej zUtjCdD>9}thZF^k>65WRVK-2AfF#4Z7VCUIMW=k+Vj*Ba!w85PD|do^BQme^9G>@G?NqPOfah- z@Y#baY@PLhU{fD*eq)RO;O8`h)`L)$!N|a751KnudRqey4@b=8jJ!uU31*CGR7Gv4 zRE=-b9vMoNn5IWtTi@1VF(I&Xb9bPoZE@1~NX)h5O*df`sOPZ?sc-|{+BKcc7JgTW zE1!xRtF>Np96_QGJ`bo6G;NZHD}vd$*#M25r%o`&C!vi3rF9M`1+8g2!7f@loO86! z`S{8XM8|i#KqRJ=LI?7X4#+xiQiP%#T%Bl4rNCk^BDBp?dJ`Fg&ZWRKb9X-%tn3j0 z&xMbmRd;kkt(4Nw5!Z)fBz1@n53^%RDZ4l?V+__gbe@qFxd%!z zC-0R^CL`*$p|lNoo|6}vsxmY|$yJn|P$w@mO%~fw3)Fkx{sU zs;SULMlUZI&n6%xbzM`}q0RHM0~Jli-yf{QA60jy~%di}Ky=nV#I ztgWr#oMSScGOK6ZxbWk|6Fe!UJgvKgtQVVBnQyKa; z9h=LFpW$%0pqNX`ptVLSPi5aUbL9d!OlxSH2CQH*oG>~X@!dB*WOIFkci+3lwGXcI z&b1p{yLEu-Z7`b}?%q3MGLy)Bhr>zEdb!T5@+lAMs=+w#{-%UOSVLP|j4&ZCSYpCl z%XM(qZEGYJ)703u@k$cs<=56h;~W}K;v+2BghWR;i9mYd9%sSW4jf4dN_fS~%=r7- zkXJHOx^tn7R(!vHdf+MX@%y4%^X8WPbq_=N!g)7E%)kc6{RokFM~y6k%VATfTEasVP86&z6~tU8NLKNo?y~ z`Qx*rCr)|@A#lbkECHmDbNA#3bahV5Fz%9l)CzE|p~w^xg%p`jG9g+Vme#g740Th} zFW0;~t8CDj^Lf@K%w`i>-JtUgoXcn@28=|I;aW#!YPS0dQA0I4L|e;)J9oK$ZJ&!5 zb~tnT9Q#LyjGFUMY;*1Al)>)v>>cFHnr-s@9K%C_&aQCl;0DGRp8wPju)Yg7?!&9E z|0Tnt466jKf|;v98MG*<+ny&r+gL)(XG1v2+y z`Ro|$YUE%5Ofl0bs@JE}T7-!k`_%(g2gc(AsWL!NHx@|`EjKZ`7PMr&FL_m2+P*vUD2 z!Mi7a{ZBt;Q@_IfTNVH0H@|^3+w32VFckdH|I3&8JO9;B^2~EkO?pVTg>#1fAjcWM z7CGDCoJ7&{UJ;_fQF~8d4Ty^V!0!Q*q4yG;O)G>JXi7(ib7W+}3Ump}2Ow-n&U&F8 zBN$Jn=w6?^7_hg0pRfMKH~GWgex3FF0YCM_SNL~-;b(a6xr?+j`0&FIdH=oln2v`0 zy}$QAGCFvGuv50z2kdOGv%R~+@My&P_KEP^U>S75y2Rp`S@k)VfB8tqf2SCb^Vq}G zrSkarcy6_}c1~y`Jz<75?Lv;k<@}1#wKLvt!38pc6D7U-l9AM=#RS1q+qtW5THX{? zqKyXtx!Ft*R098{}71mm+dPdXMWIE*c3-dro(XFdaK-D%_+jjAj zajX=9Or);sPWhBtV1)4LbYi(vz}s0Um#pM*?k?nhb@TYe2>K&M19ne{`SykDdzi)jP11K3GnC}cU~u*OqMKR zF5E9YT*Qc$E?lT<)a7^IieWDbGOmlKNTj6O8@oN;`g%x_6JR02ErR8E_hn1JVot6V z>y;`(gyC?EQo9H(v9dwCpm+}11B8v9OkE%sS~|2=sF3@%5;KGrC# zP?ShF1y@6>P%4i-99mn_3Hl<&vpO>A!=YlhjZzBba%c+Lv7{MUGNakZGhC4~be5`_ zQa2+nkA&_tN?@g>k{0C}YG*NlKcSj6JbCdF<@!l<9~udF_xG8ZDW@-ht6sCtsko1IE)CZC`O%`CRd%#xb=5Wg0x8q{dnqKylu!JBS*evEAc8!3-g) zU`;0Q4M~KOUWRr`c!tstw%7V~43+!5jMB}ZnIYST+|4N2rF38$$Ci*d6uUieLX!0) z{r)M6e1HLtj^WksyhHJx=Kb4OnAMKMqX(QiJ791TPD@Z0HZ!P4mPVGWZJcLw6V@fT zBj_2!*+I@hYnfWlB5Ot7C8dvwC+7^-nqXb=W@xQ7N=szW#QF`(6Fg-)!?kHJt_rUL zK_BRa1xF&Nf<@AV1xXNH=@yO!M%FlW=6}c7NFf4!j2ht0;8U7bBWRIAAw|eT(lJCS zEE;14jR9kQ+?Ncog2oseHMMIIQeeZzX2L$#T4<425%L2G<=d>W4Dyoxy6~7;!~GWC zdLO=XbIPB5^KC{ChWzY{FEPt}ZK`(4554q*{Mz67L5^FfEPVaX;fr7V9!?LKG*AQM z8LV&b@Z*2=0$Zp2B3c2~I@V70`1~*bB)jjGeC6A>Idgi8&0ddQ-}gYMeA_e z(#tfPCr^sCeDX<31@-ih;lUo& zYy{BdxSIo6ADb$r^kBNPd?$U%;`n=%awG+h>A9&zC_Xp-7V8)P&hwmlW;y^AL0THe z)>)l{TWkE@6Ossq!=bn8CF3HsG}TqJ1l-+1S)E<U`&f^eax5An!G5OOeSGHnuD}-O^NRI(d9M%9?Kf@3<}|0uOo<*(u=pt zgfnR$MGIiOSNv^x-AR=r%j-o7eA6)#$4Im!#xlj{#_^D@zsr`!6g)m^tj02=maN!T zsVjE6UOVT=g5qL28vDOPY-Fvxl|0XL*0#3TI(q>p3v$_~>~FKRc^;=W_~`DG^5Y}+ zjzNgvMS=97U3k$-M4(8bc#61gX)THCQ0gEl@Jb1+>(;)mK5|)^HJ_vDUeqfJ&m3zPcoU}jUp)v1P^h;bzJD?msgI^(+pm#CC$J-ge3KNw6Ekd+7VS-XQFj@%D_2EQ|32VL7 zK9!R-25F$R4JKwN@D=hQVoG&s0le$74Z#)CgUDd1k0S?ipy%hFRXCG#v_E6--U#hx zY;SC1nj=g*X6Hl?xxNmQeGnS@eQ4X@J{!kyKy?8?N?NS3n6~vqq|zZ83$DgYMvM+7 ztoKUJpFTmqS3q%+yQ7-=_HC#wdDyz0YC$w0YVVC;TMQQCTC!5}bD#e-KlAxdGps!m z@6|WqJ8!(s#-LAIz^I11^%441$+J&>lHsW z=fghcIM^2D%WSpb^kG|8mGqfYnF}=g`KWjgMEv z2riyHMOkc+NzWK{IEF0WAk)6dwS(c_U2feOar5q7?jKoPmT~zL=XvVsZFaVOT%~Lw z*W0M|vlJVG8gEG~OL*q#4Lzckl?)UUwD}me6=VdS| zSlmRSpqW~4(j&Sf&Rtrg5HdeU2tm4)$NJBe5UassD$p+r@LhdF9Dk~qHl5`!TGu?Wjwh_r&M~QGoux1yDG5~yULG|D zW7$(+(v5Lz7wVR}uC;CJNxA~y=ony={+>VcVM|Rn4wLbzLQG_|jK%v|XM#I!-rdIp z_HQ9XSB6zeo75FI5|cRRXxhfd5hwMEuULj?B~D#dBM6JnO=C-AANC%C761Ss07*na zRHyB`yyh*BukW|^rGPmF@e6K^u(F?HeN&*D0^Vg-*;IjGjG-*OTktc_Jj1X2%CE52 zAMnmQ?{M|%Ri1e2GN1X0pJjb3XEKC$-`it2bXc*$%--jn>-#vTf|W3uzM|l25({Ed zZ&uH_q`|uH1oQP*E}i>0VC0+&uCIck-$y0Z=5+3?+RxH{TcvDTwT`4?W8pXFh50mo z{gLN(eAm8*vULBhjS^5KMTV5RL(x)ZK_1L-DE}-eeK?BnB`W&s z7@)TXpLp>!Qo{9{@MmAy=c`};4xj$i&(jz$r;o>;q4maxci7v%htNHGeV?kMZSL?h zKlL)_FT%Zjc<+NdG);yH?)t5>nD7!!~d zWn^VRmV4G?0swXCE-kE=0lNtO*hU^$dJvTPcY49gQe#`q-u->vdFwW&+T+yD84e!Y z#@Z2|_~g@EeEKxULyPW727^A-WAE-7<~?1UtRphJO5woyeiqhqc0h}*CXA07PHgS) z?4?UgnoY=d>D@Wv?!gdM8)O?54fFL@dRsO=O@>A&xP1@aztOTcY`J@Izy~+(a`(ZQ zqS#{Ac-$q+mMhO(;+OvBQ)E53{sH{PKm0Ox?;YWUMJNxob>V!TM+?r1IcvVe#|MX4 zYi|tmf}F746Dq2Yyz@|o6dAK=gGPXp4F-de9{9BaoC0Klvjw?cN97rPRns#WdF}H_ zBH;&K+~~m0;UV0(d(7#x8~$M}6n4UM=StRgPhyKTZXO5@T8U64M?;Xi;EcDJIkn4C zRr30KuseXi@<}LjPdR+)Y0cU@V5UPxcEq8yOtLKu9?(j;xcQ|5pa5*pfcsY%(83_P zK@qfWL3`l=BDzer;hN<={5 z-GRNUMvg;!>w}OW6j@e=Ao$fFvNlUG9b!?FF3oD|&9cV)QODzcf1D*Fy*>@j*TU1u z&*L}4eNydZBCJI1amsQR1(bz0SqT6G!(syX764lUA|G{h?Ua-)3QEghdtozQJ}2~z zUr1LF;e?|T>}{Hud#>T`u8H@K^$CE{sriO4nU`Z#KP_8k(t5bib{iWT9uy%kQD#>N^-DK<7X*gOT0L!Gm=wdLd5;`$Zp5G}Nwpe*KV zSJ&^48FP!44Y5#{6o{qQM|a35TtyO{n5qM7@!@E}HBoAm&QaR%R_1m(wU>QIzgG!tu$~n$C+SV+9wWxksEgaAD6gExpbjfqH z&af7y(+VjxxR%x!n%0u%k}UIkLftgfb&D1F*kIxFzg4ZF2}$dv&XAc0o}y{7)_G4M z<1MDW{-6U>5wynfk!4voe&Tn_UJofV?sD5LyPKwM8UbKb5&#cbT9++_j~kcE&ra_d z!F@UoqV=Ox#y$IB7x*u9qGlICLh#h~TQ}I+tXiQ}R0Jk(3b1?^>YZqvvdDL{$47DVWXl6A>mS~w zt;cL^o?x)H$?<4Pe^W8o&cU@oevcN&$U2@pS7pd7#NpCZn3x5aJ=XF zPBwZC*l9^58h{Mcg*2z%-bch$7SGA`afO3GKWV89?-Sf_)Yp{kGigT_0?C| zI~wu_UwIXo_Yp=@w-Uh`S??4zTa;zVsB)ey(=%H^LVn}>(622Im45|jUS8|HF2Lu> zl`O5Xc3z(dgwp#EmeR>&f@(ApL2C`pc=y2NHeNnDkocIsU3lK|^J6ua{+_qXBNPX2 z@v~5pK#Y&VulXw6Sh}D{^f&7ir3=0@?(vq$$0~B21M9G2aZeUPK*%w^4C2%K#yTvo zK^+hcN3>sw2qwe36BZp5o%1qD@9CC&XKnn?H;l7*279NGq5zlSoCz|f^+pB+#wm=; z5gOjVKIQ-Z?LXt@?GZw6vbJ#sE4G+6Idu(H12=9yVA`}GPqKaLG_I<#Y6w`)o;k;J z&%uL3_~v)sp=Ax3XGoFbvJ5E=nKM`+(J~_!Ia=l*=EQ*jq18zr;)h;4eDsVt%>!@URtU9Qkr*dUvmz_k$fV~evbjku<5&cZiS1qMzDah%ont?R5KA_k$dq;%;o4K8pb%VTHr<4L2IA4r$=u7}sU>bu7?d9+Y+0bGHv{W>%pp^zPi_5_%nAY%*{?(W_ zK04&X`|r}onsevQv2hQ2J21#$?UZ1r%GlZfG{_#@9YR|j(ks_#fvWcGs#h)ww$5*H zIDEi#{2>qSty7&nN9CEWsj4Z`wiMFPldhw^nJb4Lj-8QGA{9tCCyY=kg?}wRh}7a- zjJb+nFu0(K6!hU;S-SJWAbMzY&0SeTZzVu79rXThfkG%13^GBh;e=l;tk+x{Tu10& zMT?LQXpo{sD*;kdk>QlYk$cu9yp?w{fu`=E)Ec>#SUfXXS=1O^GjuQl_8T~890$`8 z`{Rn8Q>U37H@tKGI$ymy;*-x@=E_;P@)DZcmJn%N9C@+Y})_DR+XZ^3pJicHhAGmP>YE}RCNW1OUQ zJ-^tvaVNy4{cdCbXL{kcbesqw5N0)qOgH>^{i^q64gIn;?{OP&Cmh6kT8j%pqDU+! z(b5P@EOt_MjD8VBtpbrYXsA;`+gi_ts+8(ByeN#ub5_-V`G`V9+&2AZK_q`zo|E04 z9Pb;fYu0&k9q{oL(fazZKtl%-yZYGV9Df2%E+(svbm}oBNmqU$=ItLAk|^MHZ5-Pq z06CnG-)KV|vU3jGW*yiRUOJ?1X8hqF{TtTw9=*>#%MZSI2}*&eU^<;L8IHJj?;dZz z^*xUF?xCpI*;r$HYmK#ybsFR7ZEoTsS&el*xS0S3q$gX56?)WoTOM<1jM;LG+^T+0 z6(UttEnK&p;wH8DrDcjKI?^~fV~i&Q3)l5}z0QIb*XlGrFm=gH$7*~|TK2Te%dVX1 zAp;PfTerjla5C+pK(~AdCCRnVwb-_8mz2J>ma1)V?L0LFKvmb>yvwqTLYE8f*l9dw z1eL~k_Sb&DkJh^DgDlIiZk|IjRsN*yvkbzP`zikRI6%Iii-Y5Vf~4g zxUP+5{Oof`E`}>4_p}ZhHhSx<_hgZ=&pc_%>d+g1pU4TYN|Cud238%brbgO-VySt|IFzgg16#rDEsI zIr8!ZwaGXdYR>LHOX(o1;e`vI;Qqd2IL)v}V>E(nP?D>4e&nT3Qvj0(aO>SY%qU0O z9!+G6mkuG64+vA5%w=eiAw}Db5g{ZepB@QA~qCr-om=Pu6Fw!#eMVygxo>SXI=M2}VjbPwbG3oT`Sm-gt{2|IDZP`JaD@TX(MV?9->% zSc8x6!*qB+MvHb8+Rf1P$(fOf8G@1=g;5Pw1svlX&QwSoLQIh~9?()_+zc5M0$PGp zEm9kbB0~!c85-$ih^6zd#zNiBFes|_n6}BOtff+xX+8i8dj>w72;MnT4CQI2W=Q6? zxOxMgc@{1xAL}?e-edpnjP=bE6l*!M0y92ly^klF=#ROuKHz6R_XL~g``q1og7@Bj zgROPH@fIblufuE%a;7-5ae_0wP2?CvFU&u{6YF?E#S5q2?MhjVGKN-rx1*+kR)e5M zd0JN-jbFrR{lF2WM_eF{C%AB0Ma`! z&lf_Ppc$=kD3ma$kY7@vX{E+d`kae^X`r5gt=7rgS8#@>x${e6TbHCnnvdQ(VxPrSNF-4=G}MT)af0byWpEVS5Qx( zX=`u|!c|zIJPAST{K6m|LioIF(Q2D+6p@`XjVGLsizF^+#p1roq8NW)-cT3grsmf~ zflV%LlFP!HTVXwjhcV`%R2QoN?(+BFPq0f5t+lu8E(zK3eN~>Yv@EIXsg38!XeCRu z?g6}aIVPF6k+pWA9fPjdIcn7{GM zf0NCAK{Yub6OM2HJg%4B|I=&I&nX~F zftykpnUV-MkE4w2pwWt26h(JkbQ6u>ux(q)LD>NyZ%u>RQ}eByQz@wNLi)o1GA(-q zkrCjhRa;{XB}f7|XIG zFAG$j`P4PxnN?MFIrXBlCzd_W^98`vEBovn9Cq!Rg1hucEx;Wq&k}%Kj`vO5Go3r} z88Mb}I-M@`&+@p7uBglIsLSu^7+oHltJbq_E(^V2eeAphgeQJF+CQLeTb_UZd0u(t z6`HE%?%liGzI~f#p8o{Ty!bLzD;OP4nap4?IDyJf@VyTY`PQ2^xcy+(fkzo!ynK$$ zpl(kDT3^10LHNShO~;Y-EV95O*|ocNN$T&M>+(_-x%bd9#-J@-{C7)2)+86(JDt-) zEfUi#gRWJ5)b;TyY`Ro$Cs}l96^lS}d4F8~ylhEb-VZtj8l6P7@GhnFJ!P%mpPcJr zFPHb1I6vY#=ErOt*P?sQ;@t3Y>XD6hxtwx|*l+o8Cgl9=!ZV_hRDz7gt+{g3-zPDe z*cPZjwm2HkL!&*Ok!J2m(6$b#a+(?r_Ybk6r0lJ8bkNc-;fb^GV?X)|hsP}&yBD~9 zXUa#n?s5Irhh$mF4?O=g!+mHg7#)w8RRW}ETJ+X5-?l<}lZZE$cn0b&V$p&%g4Rgt z7Ha31xtdb+$;%8=No-Zq+7=5a3ZOx_5=0N-3^BA!279y!;ZB}~BRq$|c#FWbld$I$ z$bQBX7q-!vjI7cZTns*h>h457UOCmE^pcjt4p0$6E7ikILq z=)7w$S|GBV{`wY;+oT>E9t?-<4W~?JHFX^rXf+{J$(xs@HCW@*yVwSX$8dZ+WAns0 zTD8t(JR&c0s!2-K~P`+c4`30rHhbLCm; z;VrUW4hC+&|1m{la1|IVDjU(m@!99rsDTq2p56Hrx$>yDa&Yx3(C)G>HT{`ob28vu z?uU+)p75oMbCVJ!KuU)aft`;eW)gqjoWh&bn;M}lLbO;nLkR;^9^Z)^>lAaB}zQ~vcv1C;(!x#a|VJi^lIa8@@n}1N=^+f%dG1g96oUd=gJY9nRpHzk zU;MpW{LYsg?Wo73+GS8Ws#cR5hpP(8>>2LdyT?ENzuw?W|36a^!p`FDr(grge6y&mL^!reV#+LB29-2f9Jij6Kbus2qhOlM5Y%3#2Px>%D;X@pKUt2wbw`kc5?$IWpePA0r^Ar^$s zRmUn|k^(LX9mpZHN9(+m)7p7Th0ZN66eJ23QMgn}MOmkFXHDCr>w^d)d04PnZfECQ zN7&K{%SnHvTJY56aQXTOq~j~*(F21O4ZU6uML}gM$}Ho=sdaLF#7i&1i4%~uu#gwo z!uiW5SpV)i7cXAqQ=j@2S1$DtInaPsj=h6@>bhoqcb8e)Qdbqo5QArYjGfPM=4kCa z7A~gJc&Kfc-2ax99I0@g3TY|3XBxX0g)A*IjCI~6M@ptu&8+sI2B~PRqn=ECUP=c@ zMb)&Oi+1O(Ed;aK4Cm(YZq7Nz<8kN%wE(Chkf{TE;xZ^o%WAFlfG!z_)>_|(!Vyz+ zcsJT?QIK>tK(6-v8A!kV)_p$C1qJI5Ywc}g1AQ1b=_G_ z(`Tng1S`??Ii@u!ilSS8A|PJQ7a7OivXUURGR7l*AJ5ZTdn-*cu4CPFXa^~M-p(sm zuJCLB>Aw#auD^GWFMa7tyz*l|&dZ;BmV;xM4q-I$VKuk!!C$`dF$V_+2+{9Aq!-$~ zOSzK1Y^}8+7op#?!Ym6GD(5|f@Ip3AUJyuV+dA}@7m8C597%V4p5G)5i}T=9N=Xx9 z{)Ge;gi&LCTwRtcR6_7%Mc503Oh6J3jlT$tAHs(nZcF3t-9sKDBAy%iBw7o*eJ|ao z8oRJQrKDD?6dG~7b>k;4;f}ehXh4uYy_uQkl@~#IndIvIu|cL!C)PPhCls_YfRch^0f_S)d*utY@6foOsqak%z3s_W0{P` z^h*zhivs$+4W`w7va*lBP>)B9Mk6M}5xp$Ov<-P)&=~Lpk_BaNiz3@)I=RO{8CWl= z>lU4ZU=2r>#N{S(wzUXl(J}8|J40qU=PvX(_rwNJLi0@MoCZ`)E_9IT4G@AB!3!)R z#99W6q!AW`qNbt1g?LEo1(2Bvv}_pjY!Hr2R1XKnp7lhFj-z~=f%9vmBf>$l(LojaGg zba{u?7~Xm3F5mw4hZkCKE+l=j`n@e0&q0T!W1q$^m49bId02tv4&a{>}HP`#UrOhDhK9 z(@D)*=CfL?70{O6BKlwqA3uQaUWdDTl8MovX3P#|%#KR*#vC0>XaOO?YRy4pEm|$EL{JJN=1n=M7_yH>7QWD)+-vF$CzqLR-OW7kfsJBakZeDX-s7i6NzhEaydk4i*kazc8F;~JJAeh8qpet z<(SsAP;ZB%@dqgF7eg9}vl@Y;t@mj32xog>dSG|KN~GOKiiVvXiDI9o&8VtV438x{ zYo4(;*BO!4+ULtMIAxI-@6}*6wxuK1NslP%MBy-QP9C?-0fCZpOVlb5xo}T6ceRS= zrNVi7UOc{EOrdf<`SUzi*8IGf6Vlg5JaldPym(o6y%9KNyUDh@@7#UdrKRg_FwqC^oA+-SAYY8aN`wgJOCyV3uEw%%yxjo^*Y z3j-b`z>S8Qk|>cBC6XeGWU&U;KvorN`sU31a=JrAoWY{^=~DmzAOJ~3K~#%#PDI?u z{Hi*D%(z3`h%=w}d57nH^G&Yqeui-Y@4fvV@4WL)DA77Ul51-}as99?!@3ULT`#JC z`rbL;x()U%AH%wO@7FAo{rfddbB^6qh>+Sq2+;w~USD|cLo61N0alzZ!$sD*VY@#F zeD&*T2JX1&+CI>{Xst`XAF`hg+i(~!obH`SZdR++xiSN5^Kw{^;V~T7{rj~RA|cN8 ze*&%B+uJOcOJ0BZJ$AQuxN+kK^ZA^we)X$-=f^K|d{$BF3FUZ)QMt#RgB9<*^FC!+ zGCv8d=T2xW3U31|WXQE>@mAo(#c_FkH{}Pev5_s>iS;p^*6RfJycp#96>+@#^Mp4p zfv9kU;KuLM`W&rV0vw*kMI}*GWDd_-gfN;u(M|f^;vt3z^!rA5u)T4XVy)7;?S*gq zt}zCSN4xMGtP6ab&IKlPn&qNHL&?%NANTW=@!y@wXv}g)&&KPF*s`}MZsh;VmvNE1hEidDO6C# zxgg{Qxep042MYf3Km0YX{P+qVyj` z)VsX=(z}c|_xRxE3IFe3{FvEn%4@H_!tuhgG0`ZY$r}O6V}!-{CWHq$i#OovC0mmT zO$|*I)9PgWRnEWlQMuqn&37mP47O@vY3oQLJ+(TJ<0Oeu%y)v+XlOG zC~=)CO`7Cx`IUH$Y|Z!7aFd*OH3@=W9eIP|b+_JBAm2 zyhP4Nn8!gkLDP48-|+Gq3vR5gF`YfiYd7Jh1#_m@UXHlF0b5(4pUw=dJiPD|c<(NJ z@24vc{3fH#5lU5vi9(Dz<-QP|wmdCX$(5m1>h?CN@Lv;hLI&UG;O$;xIYm<7geEY8 zE)e1@oN0R2#-19iHGQkNtXM>3<_iNZxWER@mIMNLv93YNC6Wq_#bMGA1q-$jsL?i@ zHQajteNK)}$y62>W{GhUDGH>>K!i+oLR!2(ZF8zi38T>olhNCh-r)5INM9q6=xT;+ z6k@eRRGzFVDSZRQeSB6SWQLTRm}$`Y)AFJ)>z@A@0+MIf{P`#!T>yl{;& zy>p$U6*l_6?>4T%eIkf#EujM;SqRbPnfs`nj`Kq7`8s#+eNU)p^9pwRE6`aYW#W%| z0Eq0zXr|xyL8KP4yJ_zMeNf&X59zZcaCqM_2wu4H+f=}Tm?#8JI408(-h1lhg3ZlM zj_%%N|IS_1((-@Ze1ZS{fBQBM?^(X|>!0FZ{nuaN`r}uTQu6)pf1iVcIq$yvE`R!` zf6AZzAD%*6GT|u;#pY}aA%aU@<2|)&+Oa!q{~-xf|Fet0$6ECU#45vU()j7SJNLmy z7oQ^_dIk_f3HpDXBB*O?Aw1TYb4}X^0m*H02m({tlknHKsIFPcd*FKb3>V!A`@e66 z$sRCrE-<0?0a$wvkpzq`1q}o>q7(vaJxa;Irmb|yHR?Uq2P>zPs!h|;pEqg1_UqNo z0XpSP3o?3b)~~}*DbOb<8qTc;jgcXsPUi{|GR0t8*(zuSu za9#4eF)pN1ap}6Ye!eSb1as+3R5l_AUJ~&)!#`rtyLpwyVXqHG=<9T(m{%d zJ*${bAK~-_isBL{XD9sVrG1L>5Nk*1avP(jA%#wE5VFPy6F{VNWI~V`gHR6NEbvWW zCtohXTgNCLVe^8nxyfHM0k~?c`SwoLFN=nWgteZ zjt%eL*yru{?s4z9Vs1uM)>7maon^=(qakFU(0YY2hg5S9VuCkImUGXYRYSu~vgw4` zG-K%(IBOUcIfVqf1XG{jZ3E&I;pbo#+T{qbKx#pmRV?cT%AC<0dt{}V>Jgbd!K@Bh zt?pyRDg?@S4Q`A?pwu!r#hVe{Eg6js8#Bdt3}-p$ydld&+v>3Y8I;b+VlK~8Lg_(Q z7JphHl*7#>rz?2v?3DeVXDsW68~bOR)ETlI2aT2#XfbC0-hIAvcAGmlxB1>bZL>N# zqN?w*Y8+>)O^n(hyRUigZ{egmMl6rG(k!_)ov=0Cz(_c1mYg;BdVF1UFzLQQs| zgjKU(j%VR^+Q}Y-%k#puwLVZNyKdtN>_Q;XK#8{{$OfqKzQM9Uh&e)O94ow7Avhyw zG+Z1|F%OMTT8{)C9cifx8g>~6TeN6|?3s992gQ-J2vHFvzq5fw@FjOaz4VS8B3`!vSwrRNuGWB3Ol z5nSl}d9sW((9mN8c>h+=x*+B?eXoV&Gw3NY(#=9WcBr>JGyWlX+?V_=s zg#R^QG5{XwNaQY|tJZUNrqBAvPyp^*;?Iwxso(IB&%Eho_$44zm1)9om*tD9jZD5FqP(`FP_0*Q$+UovRHggjTC zRxXk2^&5i7M8qUn2gK>Jb}kH+3Q3tJWl)HPMhJBm-5S@A>+=cRrMN(IPe)tj8M{1j!Ww5j4a=PLb5W) zNDHGv;5=NtI>nj=XU&3oY0#O%EEhO=##C=`a(Ii$s6;9Q){y5KFDja4APuvAg;W+V znh*-6JW`HP&LP}_LP>H3rGmRlI668+h~Qn~O(0B^9;^#iV1b2wgp@l8%|zs=eH zRX+bKPqDo-W$RLg7?-%}44I3rMTHAsk(w?oM>@MGdq)pHL;#s87G8s}@t}&(eyWDNI%U#qkPFz%z*)$bIrFMwZlI}h7-gtwfo_7U=5#z_ zekwRxo$}V9+8(3{1uOSfbfaqBv!{;J?W@ChbMH_4LNg43C}#e%fnA?QB4D*>dM2m zfYJp^v2Yoghs;4H1xj8Hn!MOv#)NjxiZbA3AAx~QTDcPAqvcOT>?y&T%@D8Z2{E^E ze)?t$mu<1skFo?-7A6WtG@abE8Qru5Bwm$lGx|bksn!eLmch|*pDr*8Y0|yzO2r&loRbS}v z-mih}p{3=+ERjRNaghL?%GcNA_ET*1%cBM$(z>Wz5uJeLd+YTO2(=q@dM_g}L;~Hc zx1aA_2OT(<@m`5!;UYn||GSI9W{9hE77DF7Iyzyb6kA){Y-SmM_^+Pkx1IyPyh@q& zB?l^({Odpbm;BAwzDGXZ<;!3GGLK!~!8H|UM~8gl>wm)!e)L0{rfKsrrdUDYLtZW4 z>zn>D1d1tMZD^@V0_$irS{u(p%g~Tfa|i@&Z+svIAWp;-1{VN^&OX4}cj>2{5-^eZ z$P3G-^m_V`ehlZ(Lc9K)4&)|co$%SZV41}E;XV4`zOTqg4BAPkPC{}jpGou1hjDI< zS+gPy=UTFWUIeDR?@}}j*Qx$rKW4JuCPVlAi@<9ipbwvOu217{5}5Pep97f}DFH58 zZy#hq?mtt+dC>o?CBEwQk+qiRo_mfz`lCNWBDi(y7T@~Tw|M%~pW!pV`Wxt?pjpAq zTc^R5FoXZ}x3~G)Kl~U$45tt(06k|As1UO#!g!UeTLPh5!$i9-U3{d_8xJIpIlKp# z<|z1{%WAUb3l9$0uA50IllB!ad;};qJX?0)G3|LmDV!O^X$}sRb^UivAw^J%TYPMb zUY`=dn35rN!5T0lhTHhIolNXA5$oe1$Z#^OD=q=DxXz?HrI<&LSc`=uzW1>&oIih# zO_3@T#+?YyN#(V@{kU&k?4V1xZnnyx)K~N_>_4mjne*7DA(t6tUf_kLiZ1fw@t9?G zM4snlnMM}{Qdx|H*|y*}fBTnN)C#KFs}?wc^Yc0 zZ$LXrIU#R05zQ&T^ywKpTi_a~s})VXWK~sISz-vr2xEdrN+$A1TBX{?@-Aop-We~y z_!f3G=i2ohp8oV@t~@4@8yiu;i-sJZNH3%Ood_3$iMVa|;7ed*519xXqcDqW<@oN; z)6L-SeK3~1AL!p~km;Jg3$HsAi0NHP_8V$RM&X?4VJ zO%0PVOee4~a9l?Yim0dwY^;P3K!TTQrs3!mW*Y!=tk_2u_duOcRdX~_U`Se(*sQf@ zqCD5P9q%9C2z0&r5!48j-N)Kfe32tYk|Vo9yPQ>Xj5nUCzD}uXM*5i2H~7&G2#G2~ z>_jOPd3Fr0#@5GJHKNQM+mnXUIh+I|Kwwb5VryiX%8E&~q^b{D(lDDE9@?9*y%87i z=u#CnAMmyln3a;rlOs%Y8;n!d1!!mHhPoCM(~P|ED3*BH;923@tTc55kS-3ujF3=M zfM1cAntV^s<=YI6eZrEY150M}qy;eu3>Fiwj-#Thn9~rVTT_AlIw>AWk#&^~e2<|m&LW(&bf7BNcheB3g087UZSPcc% zi;fmV#>qR}$rI~ndyfYRZi9RFf8YO148C70+lNRI7YU9R3WCFO#LHWEwgEP7aYkFe zt{nX;4+ZBIEc@Vwnl#wMs`Ob~hyBoR6Dj360Ny`_mbJAq<0;lV10+qZAyoMSqjGTQ-U!Oq?_uD*J;wE!mOP3I+2c6|}XcZmCj zb(if_-eEl3MQzZpTVKhLjy~wT2xt!#EkkhC2P5Z|Fs@~p?Am!<$W`Veq9<8v`+YZ@L;e03p8L=3*R$US{r-1$ zeayGl#qYB$qiGt-vgFApA0g8)8jbkQcfLcOmrSPxwS|NIQ(k-R4K_Efv3=`=Df&G6`!@K^1`@ zQNe=;7g@QT$66CCk`XjYLj42JVZ5$wpY=1)&R-!!jK6Fv8OtBbCqitbAzCA2os5eh zwy%(hag#pYw{_tay?rnqQpyk;=A(PQNM0X?Rb`QqkY8}2*qH^TLu25PN8#W8ufI;^ zqWmNSY-(&Uj%PrjpsqiS*5S1=a8`jFg%t4CLvAB4L*hdbF_VUYrU_&?LJ`El-;-MqB6us}0 z8pp>^ZImOD0wn>=^g8mQU~p9ALXl@BoElz#(7*&o=2KC)JjN#BkCnqqSh0GXc3Yo~si%qg@3n|Z7%njNDjSKN~ zQh{KB7E2z!y2*3DGUM^jUST1(Q64e@+Lx?M#ZqJ-3ktPMsTH=`0OJ{}?J&8-6pR<4F$)I^U*XLuYPC<{G)m9#t%flEL-B7!`h z0HT)&SA@YRV^D4ckYNDEI2jzah3FnoxLzz}8nXDNGv$Y=jIR}b2|s%NCp`b%m$`qu z;^D_0#xn}R%eKZDkI}0DYDFD{G7rvXxN1T(2eJ*Q;mudz#n+EGQUz76vCV=!&ykFf zIk;j$;~jN1qNyd$2NU;rT(Ybz%i7_oQSum#K-C)vBk*Dotpyq(bTFSIBdLK$>kO?G z%f$)R>WDmpOj(3b6xo>5W6OBFhjj%{JO;n_n=l*iVE~;;tUtqYj3vjTf`ft+G$IEd zTzQhUZcRu@@00Q%xy1SNX&%xha?#PJwZBM+z9=TL|9VL5l8yu-rDr|nq7TRV+B3gy ziD)&Y(M>J=tgA;j_l4N>eJhN|`hAEDajrf?Auze)q!^lT|L*li#YAS}VpiDUbGv89 z`qRy6T&K}awMj%3?KtRZ;el35-FN1CkU)D;IYK)-P7e>sbdHja@pz0h7Gr8;)9~Hz z9#x1V!Tx>Tc=H{;^PTT-_r}9u7aZ;1<%d6bp4Do_ z&R!nZGZ!`h=i1aYt)MI=)_1Iz>FB$)LN_kbcu1fjSUJ~;rTU;^2tqHi5M2a5`k(i$ zf~o!b@r*+S%@BO{EoQ^#wd23{U8;}wevMgo*cL(18(7qP^;Ak>nnccX-fcBq7quPX zp6wtB_ix=u2hT`zGSub#SQ~=x4+D4oy7$YLp5NyR7%IQ|YhnK$4|-0&fBIk*y0tRh zFQum$_UrI|7tO60x^^1%lm@cQeobMx*Y z-+KNf78M*H%=zHvJ!V@Eap~G8xOLD_6eDU+a37CjrF|BjhO$%1zfuZqZ0DmAu(jRAQKX)d-C%{@S~S@#ZtUw{hGH z68WW#d1{i}-B~XMDH6IBS_A|wk_8_~FcpcpSHh~{-urj?*{g4H?}i}H9|66I5heI6 znYOL+`raM*=C|JDhcDk_)no``QP#7aZ!w(+tUBPRuDEZuFd|2(CAqEHa-Ljn zQp;@`VX^Wi*4FrDjFMvtU7$11>Dl`6 zWXN49z%+uq%n)kD@BH4c@!YR(VCLJbjvr!mS|ORDD+e_KFI05>wusD8ZX15(m#*VB z3l@Yqok`H_V%cRu&{z}(rV6wlqhmN5fK@xx>1_s11bW!qgQ!56ZPa9&6A`+z2>n7W zLJmhS#|Xd8w0V?~4%aLiSP~}2lrT|joCJa}fW4LxdI#48S2YN)u`W1^HY#XNlmIOR zZ@>LEWwAmO1)Dol^30KJv%&c^kBf8`a?>P%get~E)X-kvIU6QO8Gwu>B}5IT^4`wk zEAT6j0a!r+R^X}zSFL#CwU;zi2Gy^@e>eMml^ z?wdAHEu-)=6gcDAdiP)nhjpt*DqCMzYxATqiA&eF$uhx=33@YZ3SMaz(1 zRf*`f9JTF|#AX>fPk6#+=p_i>x(Hw7@_3Pee-QwL&aHG9N15)Uq+GM62@wHt92Q=h z_?zxI{Ud>-zLl*{Hk0yz4(pI!OQ}4vu%iF~AOJ~3K~&b#fwUk*gwL9K(SoqfD%7<} zmSwHgt4}_ZK)?4s-hZ7SsI?eIcfH}*>!+*uFc8_Ss`eRuMM3%tX-n2qDD+)^`-D0D zzU;s5_w6v=GR25mYr`Cif6h53Ex+4Ob?bkI?l)NCur=W2|Bsv2Cynok@QG< zNn)86z3b}bDmtGe>sL1#1dhdW!MGgZox(c9WU|duPdyRVho2j6-+7OnojpvUFlIrX zjnD#KdU4MG^MC#&C(8ySGrTlZ*3ejobW=)sg);Z#*}E*42P}>YvTTEVJYvx-sN9lr zI>L*L+B6io4uY{6<6Ta(s>m~iXN9#VjHV5F0rR=1sR{~x1*LP&=C^RVrpC}NtiWb436UMYh#C(aVZ+tHdjij&=hCtd= z<1uIoRxYOd^9E0asZX(9k>wJTY3h|nRvzaySte03C{V3|y)C%?LBkK9e+Q9oF&-Dp zj~8T%Bc>zCqJ9roC@Q%_B@|Mw0%uJHzPZo5*$1tV#VJBttXtyjAs|u0P?R;N$0tbN zFe!F$HUqgL8!hovD1RRrvpZOy1+hqENNR+HJezR;{w->M!Y7~o9MAa;N)1J}!(@D) z@puz$Gw`}VH69IkA5p2SD8}Oe4lHER;#|e9Nt{SJ_P_8!`;d8}Jv?H$yzAcDM!;DH z{M86>9FtL!se-Bs{<*oLHLYhkEG;Z_(0U|&fsV}KDvvsd22M{;IbLQg^$05k+G1UiHD#13`$QqTOP478UYQBbqJM*WT%XSszxk9uJG~* zL5=fG2*&m`hzziJA;CL@7buZ3jC*_=Gnp2ss5bI-1g2SRIENA*r50>$8#ZS(XNv!Mv#+%$T>ARyBnJv zo&AJyQ81qDaynlyDYq%hO&T%6W|oCHVLbJmEpH(65we;w9c^;w=mWN|?s7UmL%5u2 zwgbz8yc!`*&3J2{Q@4-b+Qy8goaq9J3H3^{s08w1zX$deGNRALEiqL89cQnf->vQ#+lac+?AK>$kP zg$Qo3LsvHe-Ua{mEXxqUs;=9#1k2@ejm*K}Lm<9Pu0|oxUKguzen;0a&zH9rPfQ6w z6b6kCfWYLW+YLkti0-2f+3o#_3DE~Ii}xrQW^_57a&WxQ<-LNFJ2zNV zbN;(O{B8dE?`%@|1tpeCvnk}TI9l>MU-@0W`S;KB-uw6Xt^e{j+1;72S{`w7a+ja} z>@|*$?z6SGP2H^UHsqqyI!hZ9{-XENM{`UAxg)wo+NsvxnBk)Gw3C zWX+1*&mY*vGmFkGx6e}BHWVH$gJ#wkL)9#iLXb;^H&I|BTAI>4_rXOp*BWmF36HaJ z2FswtkTS&6r7{U25L$<^n}COsLB2~MON!w7>4Lko){?4Pvc0{5MZI)JhDR$$<^#9{)p|XI{*L3D z(RJ_D>$lK^9Z#_z@ zxDI(Hn`36P8BJq3JUnE%tb%DP6{9U*kW+P15VG#A;NyOm<((2K02W2c=?#viu|%C< zJaj^PdMVW;)!^ZgKh)28+AZ4~a#n=j*V>%sE zRV!Y8`Q5vIhSUaIXSt> zcw(`&r=BZvol_K3=2c1U1RI;%)J`CjVO1ZZmEdrH#pY(t>FFVxo15f%hm#}8bknj} zo?;ro#&n0p;*>lOsX7`dq1>Sno|RuQ$qPn8;m_t|8=gNXf% zh@o|{MiY{}ggmTa2q$Z!it{RwVJ7u;-+moOT;edH0V)DVN`pYMLgFby;`y22xef&NmzruLyGBt|YYVurR-3l)yRUO7duEyw5NtG+!n;$WmZd02Q=U`*& zQI5~AR*sF?!%Xxp z$A>jqY@>9+%6vdJszK(gmWEPjj+Zq}nK7B|(VU*(nwnA7!N~qro$QVI-_oKj2FE0>f4MbPjhe@h*-Ra%2lY$kjnyJJ2ID}RRELiB#)tf zR>9F6O!VLsf{+8$Kqf8O*pg2Sg$~HNsRBo-iD83w1-lbiSU99+fybGGE$8{{Sn$|& zLQo%}53?*oW&u<=8y2%Hcy0t1GpVRmxW5#Dx9sjrc=Yir?Cfr#L=rk3*43!!G8z6f zYZ?hwcp6ePn2;)JB0!Q6p-|LZ1pkAy00$GfYzIA}L3$BUau6s`2DIa|&wh*#-hGdk zU%SiE@f{ld5aqaFexg_`mrRRsry(YSBORC{Rg8gjfwT!bp3r0)Azg;|2uh|~mvDu} zFUN??An}Ywo^jD&Iiso!y4d8(m4}%x_R*@qR4XQV#p&V(<1skjP)tJ7*TbU&^eX52 z=n=4I9NzmWauZf^lcka5ML{D+fg?*xik-_eT5;AGj#q}tYR1vEqNzQZF38mw7cD{( z6BEuurWG=>-x8M#lnS6e?mJSbfwq0!GSatD^a0037RSCOJRMH>7VJ1^lb~l=w&qIa zBL?bQG=d=Y5vt&bxI`*jioJ@HEmJx4Hn?sPj36=!_hMi{NIPd3H|IfQs$-UAYx&N) zr$nLi0l_}$>cwKw#`OhFdnd$t?-4qTd9T6(5k;veM2fclNh7Shz~PWcyzt~%u_iQ| z9tnkr?U&+WQoUtrhYRZ8);+p82`M|vcAVX$<`ah6S?=Gz&))1Id=1EkU;E-e-W(w%Jo@+(?ET~|zVel?@aU7F%bbBf|BFB8um00lajqi= zkOOnEr*oZ?Q2`+%oxO|_Y9I~@!b}$h5+g)>xJX0+RuFFJg-3W1gdpcb0CRd~Z;bdT zWZB*TxM+Ty8yACXn#M*8$$Bhf>d%Xajrtw|!)FcW?t`qR-Rop&>8zdM=&T$4wW3c_ zBjQ-P@aS0-`=B#fl9J*oF*pv(oSrev`#7}Hb%1z%e)nBUFRFKXp8$S;?DwBDWSZ@_ z(x=AB6BIW}ONz=2aGV) zit(;O7ND{W?+qC_rBp0c#!=nS)HNfOArUNvq>%y>^Rb0gkSm<8C`%o%d@h=x%&{PK z4&>apHRqq6KjFsRx4C;bq4FiF$T6IPZ_uK^7)v8Oji|7?#%o7qJgeFvMMhbc}8zKc)`G9;PLP%DiUisQ^sX^)VKy}aRfKe5H{ zZH{?p8Y-m}F{fCVz{2%6-Gt4=`g=TAuFV+Fp5oG_UEmBQgHYZWL78X4q$N_YZeULh zM+B8I1~OTL0<%=KU?7mKrKUfqlZH1k&;ThvQmBk?Z~y6MpXTsrN$r2a`?ngJW*G*s zkRgUu`gZfwLX(l9GZo#8;*$fmBFnPC^kpQO7vMFgNBdZN%t+6b0$p!XiE{=wdxta}Q{wv9iW!8ZYY$eNtAlin$aKM^1!Z`!ZqlIn--cYynq62xY_O~~LTe#=DWY6nI z_~7{Tq}4zR5!|ps3kFMsSOdTpAFaSGL`yJ{4jb>~1(Et)cAEaa0M=6&q~EEw76D?V zK2BBw2=`2F5ynjviqiGovAw-ZrVGZSDdVx{Q=gh)4zF;q4|ngtR5k34GgKys8L)Zp zy?flba|iD|2L}htwsr%9nhVT))9JL=fAj><0ho+}`%u76$1nv)ch9iVN|iRup^$np z80-VdbdLvJJACFv=f3OdMZdY|^L|-|%AkJz`oLu9^4JGmtwQI5xz^?#?yU#?_bHW5 zA5iuC!ug)-u2N{(%e$HCeF5n0m$QH02bJ@~+Gz+-`|UM!ZymPZu)l@?65=|Yh+h(b zjot!E%9gd#wS*(0osT{W`AC6CIbTI^CQCp-D2Y;CY^K?-b4 z7GmcKAdTRa(0M5a7svRrZ5v2}S7ccbA>K+M@y@hUx<77gJ8s%q#Ws)LCTZR!cWAnM zbQV8{P&(3zq_tx(P9c;z?Qj14c=@nHh(S#213_2E6LJ0?qIJDqE~{uA3-(RFtJ=JSxyKco#nT z)MGrn_b{J)%JJAEQ#L2F!1$ZHU}+!*ePRfF{S`!j-YI=!$c~7X#*im2j!L=4Q$qUG zEATmMK+-pa+>`N7I-nqvCM0ci4leER=`UQS<|;;iz}LTjf^ij|hD;`FyhEuBodx5U z@kbcD3SNbNf_EiK!1ZgpJoV(1k3BuZml?MY4!L`D%$slQbLXx5Obfx6e*YRzeQcY# zk+>|!wl`xFj#kO-D=>)K3 z1?>yeA%Cc4dvC(Fyo?YTjWcL9CalVJH+Wh$)tHbp4m60CLr>89i4^acUbnkTcYV*{ zrH#68FH4KO0~KutvkAZY+%F;ZHvjlfZ}IBe3#yYdj4hZ+ z27?EIW41A-P>x@I=Cl0PuWxXDD;Rf2!&1(=Uhc-Y;7 zpZ|Qp4_~^;-+t$SjoAjj`McM7_7`9`gM%ASgLw$!cliJQ`Zo6uZc_+o?2_PypfSc$ z*A`X{Ri$Z~1pH{-DUA*bzx56mDe)Vj5i+pz33?2xtP4qLz;`T@A1(Cu1*pCze|Qam z)`8dr8#aF9Y>Z#)H0ON*G->@)Y^J!#9kh2m$O02Tp=pwX`S9pA>%O%u-N!~vY%63B z2zJtDs}evPY^DitnRVHu`@Xe=M)pTK>)*N+C4e(wqwpva$oFkIfI&2Sqh4)BYu)+=M=L9Gh(pWgR4iJJM2#3c9Jn_WGx$*8jGU+L` z<;9l{xq0&zfA;TR;jec-K-KT_+%uo!%U}8;+dE^L#__eUeT`RNeTRd)$Nb5k{0Uo| z1zGM`F7IRPl5siW^z@Y7y({M$w=2hbdHdh@Uq1-I2_aEJ$2ro)8zn1cXy)_Q>2OXl zOr56oqB%7b?uWo6jll=iqfcCQ(J`#k@EE#x4u6x{Uo+&h+mh^A-uyz!ODxywHjz+ z-n;#XUj12P&6WhEQd*n)Ks|Nau>aB!>#VQgDMEB>WY<>$=WPV&BDnraB8g4#unM`b z*Oe4~Vc~(6_6rUl0d;?V^w)=>A|!w~-K)!b8lNHA)%gcXd}78IajhaLA!uVogR5_+ zg!6#RbSnoX1?Nyf@=*ZNixAJ+-X|W$yDsgR2)QeTl1Lx>1J)D=^z;y+-%^ahdfWEr zpmW50!3r-lQhJQ@Nbm60;>4WUrsCiHkN-W7Ju>FtjZ@m5%-}u`1$yI}~3qJeI6@KG4{~5cpF?a94^Ur^qAO84t z1efqmT zxnys5A2C|SRP7c-$Wtk@;IbM3UWj4zF};WAD=cJRNbzy91fG)f@{o5o+BqW1>8?TrPtpa;!^g85ckw+&xVOl^#=%Hn2=-WOU-RE3&d- ztTiQ;rg@)CI~oO*RV9VX3@E=qc7)D&Jre28-nm8cDFiBE1SRL<0=4<~=ApSrHQ* zGN-N@Mxzo?A%Q9i(OMxbA<#Ar%m@gh3u~A_J+RomPT(;C$nd!rBIKrQuZiFhN632< z1-WWL@z5T>Bqkg$6t_=)#s>%cIOC9d67w9(2#(e#LjsSU4ovkbkMs^#osmx#eDd+j zJogOD2z0(m2YTo0yWr;Ay#B_UeDRmB@z|9x_3qq&M=!&Zdt)BE`Y~?Ym~gl%c=#dM zy9zS_pSW63P;mP$eA9a-wIp|vGjC#yZB5f?q}1ePNl_FC(YckWOjFw+G+C_z35$<2 zPYRF{FO&NnEr956>LJd?ch<;g5lk)7&uO-{c_a|?pp7J58wpH=3T2X7krg?4S%4JO zrb|EKe7LqR&`SN`oAl7tZQW9&qDFiT{;mC9CSR;p+iY9Q9Z}#(*1f*)(^^TA#dPqL zbUoI$dA-)28!y&*)FdY|oaoY%EEd+STRD=FT?i3N8tdwPJI@iF1t*Y zulq27+W&s&Hk-gmQv3`-`GcOj{&_g7c>nZgJuN8GqRVOcpf*S@@u^G~3EF+(@^6$txKH;!}xZd(d0MLPOD?`;y+8+e?%iEFB=C z+nkpPq^RCC4(B}HTSk*fH#V(pQ;T%{_o2;;4>mTukNb)XYlDxLRNuOv#(2qeeY6gB zareQSswkp+x$7wb+Zy+e7`vV7?9-kWy^~^_=sfEP#qi)QQY(rqM{CXMY#G*dy1li3 z{xBdb2LIOpa#Yf)2v(&C7I~85yY1Ixsg!F5>suz$PZsV5)e5B~Wt^Ogwvb0W{EswV1)b!IQ+zagfEsAq%B!?C`=MGA%U10L!;5?Mi+YSn#Vie zGvu%bKkU8p42Y0CF;rW9^ z%dq8037L$kMK(N+*#ydIi4Z-!0cSnA)bw)6AXh>5)r81ouAvV+`}8F;e+T4!Ff$N3 zL^-5D$P8R6il;(UUkHTIEvQ`1b6kv_#S?V#e=FY+afbOYrrN)W28u`FL{c7(6&Mtu zxTDAzj85?Ev*&o~$vfOX+T&<%g7kgxiZBcWrV06l-m5^n*9}5cAPq_wEL-=i20`ICS4MLze!fVY1#M7lZsEOgtq{+~Cva{CbS5eE~?TbDnCW{rRJ$G^i@ zeshfWaQ7-mS#kc%2J0g@*nxlZZ@x>$5YY%OzkL%^da_}TuMOBhvrdkG*})QNY}R#+ z#zK~o!yPmZDi5WACX?(`Q}#?w~Fqn3YTp zcPPXGXU+~eHQXXMp4=&9ug9A^JAAOa&&+|r&@?$K%(gHToC^yl$!i=QycL~Eo`#HX zK$gIa+LqBf7z*JiJp^nJqi744KB)ZEuCZ-_Ar*ynmLrp007+Df3X5JH7x(}oJqD3v zgjJjjzGARBBAE%CNVIdr01p4^Fv2aah?5!bThl+O7{YXE$I> zaHPEV+8$+D^W5`i*gOMYdug3DeTv6V2fxhx(DBC0?@~Sa49`3zc={Zi+dRqJKl_0H z^li_Ne|(c?&h7Bue&Y*hG_#$WqdT|BN=4=}l=Fy8F^}HsUa!Yk_ZW}+=xhOeTUEg% zXd+@ADHTL1LNY%HALX<~_}xbp&L9{UCBF%UgOl1_QbScrg=YPK8et)hWs%gvU6P_V7brZ4;7Ew6_DlJbBF$5x?dwGAxfc?) zPMze|&3jxt_cYb)5G5RnA*WBAw<%ByN;`CxEcvvwBg|vZtAD5ILvB4bo=sQAZqnEE-HE4cNTbk z#R!zk=ajND-j3<3s;b&N>+buluumr{*#(1Ln(uK=vh>+%|8{}%YIJP%9IO2Yo%Jai z9$lfHrGAUQw`BC!c(hZ+`Qetgo$c z=faa`yjD<;~PtT6hL`c50j>3d=eaYv`&WDho%Yr zIoOcFbTJ;AY$dta-=tt^zw5q+6F&INLi@t|i=6ybM}-R770yxDHQoybgF&0aYC2S|xKA!agCl(77No1gfw^>ysJ2|u|<)Eee?(4 zdz1h0fBqGp`|KC^=l{c3_}$-mnpa|AgFn!2H>LYof`3@ZMNwZQ$%kR z9iuS-BQ!)lw}`BoMdV13%Jk6@(^;~Yyr8AIwhnpGnMNv1GM|xbbUJuID~<6rnRTHc zrc$vyO+!{VPM;W%i#vE@Q2828WYLKpl#y!#-e(kpA!G_;8>E}lOiHwddIs08e8~6z z{`*X;nlFCoC7%C;;tQXDlEb|_jK{FE3$MKVD!+K^9_S5JZqk7?=`5fYOZD zM`%2_M&PZ8QH#(;wTDtx$nluW8XSgP9`VdY$?yK=d0zZDtUJXC0nJ=96$N*X;FX`l ztFPW9L-FjTG2i&z7kK0pR5Q4D58k^D|L+fvxU#d&vri8A>PzQY%V2UBu3ZP&@AL7G zJ<5~kLO46OK@s+^Utj01e|np1dpS*Ali6PT>{Ya*Gp)(BL#Akx5BUqyhskY86F5#p zVR3ebR|h~wzc<8_W2{A~A)YxN8+{cGf(|vyC!TZyIMK)o$yo@Y2qiyKBvKF{STg40 zfcKhI0M!$tBHj@qpgzQ!%R>-3n_FuPh6Or1k;3!N z6$mSX0xxiM58nLgJKVgrix$7nX9kkZ9-JPGkw+k;=bcyIbELBre)m2-Y2q7*?ybOA8h2OdUb z9GBr*mSq|Z5@gEtN&OuoskBC(Z-cj~4y0r8d_=sjKX+Jxd)p-!L( zkxzVx;5pC1;UU&L4kkxv9M;raI(3RuYXka2sH;#k7zbt^YHcCl%$WhVZf(#s4QI}5 zaOMIaw!m!h>d(i_W;1598S5J-j_;cXx@s9frtz|xQ@8w#To6E5IZps6@!6)eL%0X7 z@j&#x^O}A?P8etP`^N#5Wx%>DBD3mLc~}(dxQN|qU#!w?SI^T0W!-kSB{VuY)vJbR zI{#{sqY^K0@M2`(%3!UYFU@`+7-A-z%9|#m0I+V zbFmCYj567DPPu4XOOy6tWjb#BAVB3RP@$GqXH~y3Z}kGV17vJags@ zU;N@rWJ6eAU+3!8s}%h{!+xJ$4)x5lzq`-wensVmOpazur*oXkW0qZvaQWzL#0Cdc z>)eUgb{#ta5Hb~yPxp3A{Z_Gnf$9ELT-IeWfYVrDkt-=;j-QvbY#SL3>bSb%ZL)RZ zeDMP70`PD?(9&#JGI2ibkKxXQO!6-a^Sb*Q+8;Ms5{0?5!L&v^!QLPl?CJCH^`NQc zkt&oGGfhPk1$kV%pZU&t;{VfL>^lH0=C@k}2u~f4?6WiD*W+Wpe&*A)ob3f74 z?aF*xJ-iS7p6>d=eX!$Mh=+4AXD{xBU3O9T|K5X?qK!(oZRIm#*^ZXFkdK6DOJN z9r5(VF+&9(T)xTAfA}`q40!SLFLH8oz@VQY4?L!-usDo#A-~ak%zPfSQ6spoW^<-T zGi-k&I3KmdTd++-jiagN6kejEj)b!n$eOx5q;3u=3X9Mdyuq3hFBMv4gz|aG`6y%b zTP-mM=_$D-Dh%i3)egc zST@!+IekKNIL(>QGv*%d-P++NFTcTsGoNIA1heWcRk_W^dd8p+TPGF&%m4h(x$>^z z!^lqHMYh$iBtg{D;bSO0h4mhjEve> z^z#|xf#T9RI3r-FVB|tx)cO!k4?sT-_GZQA`WC5m97Q&N3vw5>!XjyqP3->%%f_db@Yd3a7_F#MJ|-N7>)=eP}?X?%!E zwv-zYu2);rM)r)4a`Z}~U6ATe&U3rc3QzFF*L94fbZB?Um<^k$ZUwoWj})+ufz^Tv z!1!3oBJfX9K16D|2D*D@n)UJM{oJT z5m zb!!_V&7E=RB1n%{Te@cV+Q)hFSKIKgsM$wF8dpDC1y9|+TK&6pq&e6|N;*Js^_<=7 zrPl=PTw@-3uR@5W(j`*LR<$uuTV04ScAR|O>wE7hiegEjbT#srA~&l7MXAkMmOXIJ zE{Ivpdt6$d;?bqkrs!h&$#vG=S6ZLK`DNR`ZS5q5;$So{X8gD$5&(!GmC5+Z{?CLvDjOdBahwJU$@p8mrA)U z95x{bQ$$K}cWf-Lf2~d0ng7ATvM4tcBF@Lr_rt5wBKjBtbu-Iygl(`@jrWeVF?a{{ zyh3=1F(F;4$l>WHpP@2`Y;M4hUxRnwybh}7+u!;Qcdzep@6L=zFFeB525jGkEAQOG zmN~P-22;Wl7X`yXL7sbL=@$F5@OTsSD|)>Fu?i8^h8$;di!*W4(ZP1KGB~7)B4a!n zP-w`MfW~5)5@(y}G?w6NgtRf=HkRm${Tn(m0>-wKOXoeGg&!9^yJAA?>=1$nDX=wx z+M0l)iJ&t?HtV`!kPko<&`g6$Ymq^bQHUJj=14my7m`9dn!3W&X&ncx0pY1i!_TmKq^Fr%pj$2-eq!j5jy9aDIgFu(!9*_Rc+K^BJd34EW|B{X;(fUd4}Iy~gFY zZ_yaZ;lZ45{q?u_(r-M)+2{LIWkXrkoY*?Y+9+t>=uJ5DlIE!kPxHZzZC<(ZHnN|Q z7aG&lWO>$(Kg(h+r2VgH8np8sJ%F+)LG(kn)d9OWQ-B-bngN20wL#9 zlka;D_ICJ#|N11kglEpc#+M&u|8T~MQHb!qb!DH!x#W?@*60o3OTP``wE>S`g7pkC z8|p!hhWl(j(kB-cl_~h({Ud((cR%CG-J18xHSW8U&^v+A6_cXEj6kSBLsmM_+!ji0 zin^{*R+HtL5MYTNA;b5>;u^;Y4(BU`7}FnYgb7TLtPaC3l^HO2XF`Ngh<1#Im$s~J zfGZ+JAteDs#w1;#z$=6>aT72I49*!G!MhTdDDVbGy+C}{(CcM5XRx+mUd_SGP`we> zc)apVCKC#)8IMoXAB3}HSx^r)reSX97$wN0qH==XT=b;6 z=++8y;W9|s1J)a~2(=8Q5Dc=cH6(h&0aD5!4&k9+6bNHz=D~0s^!r$6Vx((PPc9ij z$zbx{2XB51yC*NHgD}a3>TEJ@X_L-!jkU=uPHS*VA<48xXpM}*7(Q-(DZ;8n*x+kx zz=9SE9qTp<=y-mkk=*9o1YfG~Q0QK}QD<7?yluril-4x0L+Ws!#yhaKjnGJ~+Wr$B zdU=lb9#hpwtr!hQ?Cjh}D~-pavrt-PKA+PxhTb5oXQ}4oV)2W{ffMxdJOEMW$s#qj zu?8s=d7e{MO^~4X9%Bu-7_F5O?<`weTim~YpRKJebe=IU9apbh=bi04Z0K#i`?o)5 zqj$iQr_b`0FTKd)Pn>2tE4g-UpSqfJ_3BkFUw)Gt*WaV)fe;m!9)E=O@fz#v>y%}Q z^D1t_ft{d~3Lw@rVKaW%Aq8b!wNd^A08(FQp{c8ye$mI6hPtj9t&J&)g0h@ZmL)3B zqJe1_Kq%5Et+nKNZ}H4KK%i@Ub<136t(SnvaXEfzE_A7j$;e9vXSzn$DDR%5TeSRP z042?_?q|zJ`r_}q<$Ai}Eh(q6J79f^* z!1QdoV0b>CKhW-OKd0{=SL!3RX;qLYwMA>a)P@9F!`$lD6jfNenD@HKTLB&^LVe!u zwU^r)qFW26s7Fc>mDn}qv}|i-CJ~-quLsV@b)car3f_G4O@8^yUospFTJ__3?U~hg zKnMFqq7g#2wJz&g;eA1*T!e^F3P41_DAfWev`$VDX|FPt>L6_S))O4{-RCUR>Epd8 z@aRL-v7F6=c#<0oGb{5!R5& zyd)HP1EDgk2NNTbQtB31Eu!T?7|n|quN2WnizSM}^<)rz@r3k|EJsNZ*-M_`a6}o$ zNf=Wqi1|h5(yz<8O^5Xk=|j{_DMhA2@s(6Zy0M|XNP)~WSn$}e9{P|cNt{t)bqWpuwfVzgkAU-E&5Hb{XF}7qfDUr@H9*jcThYR-KXFmN!^#6F8we>TMMu9Q- zgCD%gpZ-t(4Tt+M9>O5sqBJFYJBR%0&0lcq<_^E{`9I|1g;0-Ox;~Qwixz#(oDNgr z^qG@<_s6f%-#AO2=NwE9*gCO^nOEd-ogPFxH0=SVvo1IXd9G-h89k+#PN$*l36RBl z>pBZYdPwyO%8NnYz{EIt%n=a+eCK(2uu09|d8EjYasXl!K%{da!dN({Cz$34-4~z? z-c-SSZ<$_Ae6?ziV8e7lEWS{Y{0B6ve zP}kE=QL@jlcbaKqnCu&R#^QZO*}zwS`*}Y7;`0nPKx%mFGW`8_-ryU5@DhWu#!>O9 zPZyj%Kj5f&j`u#?X7BzX<55o0+W^-`3z$zba(R}Y{p1QKPJWWh@4m{*FaLlqzW5S< z`Y*n~AN|o6dHqhw&Fu-Uv1B@wsmuErPUyJ5g|1D4chlJsn#|**#R=1L%5xbBm|h`W zLFW5Na&oKDbwxghz6ROA{d@cD?Cf*n+DRU}0GmUQ8&GV48-rQ30q0!E< zockCktw|<0>%0c9NHDJro+|t}g_8VG#Y4gwO8p<+y z-xXNnX@o^c$NJ`&$@~sSvwaL3IN*gBKgY*nX=*2UL9t_q1 z2kV7dw9x_3ptWiR2hw2- z%*&FpsUa6+y&`N9t`5{DDG*v=jYH>QL-GQI49WDVsIktomemk|ja&ki&II*3DO4zD z(SprLFqUzbPxMtEpGQ2Yk2#oL1QoWhZKX{$7!%2W_c9onsfJ`#RR|s26DoRtbCCz2 zN_ghBG2#C)2eDfZD~&VnQ!PXhBCrA^5=-3RRg@SPi`-BtLx~jAG+~^0kCHmjhjpN1 z)Yb$#j}Wb-zSbI<`pJ8|Z{i$__neHZ_#6uzHs!jmLw=W*ZDa*0kScnHy+=xgjPJJ* z#ZL4g%W{0AXs!)MY;JBa9uJw%=j`t8GM!FC4kw9KBu-i=im`eEu^p@!$W`Z!%IfeeXGU zq9E_X(cz5oaF_kPilf6BPd)WTGX2}^?cV`PuHX28x~y7*Jj`+58cxO-95xt)Vqth5 zcO-EhcrZGb`ZgI$&N=4uIkVXettI2}n0Z|-dBeM2`qg~P)reO2{naQ@0$kmr3qV(+ z0uPIM+{XFjVxI^o1v2xLZ$5tFm9iMaB?T?3DOC*PtSY{kNtWC#7MiMZC z1u#r|!Yc4xZBGKg$F*@4WOkqHYD7thWihh=qQdV%hX%V3)vgcZ?;5#n#pq*REYdO39}_^(p$j9#TrKUAxA|pL&{)eexx& zD40!aCes?J*D#EE`|2*cm#-pqyZyFCgz^&Ul0aEv4+XoT4Twa0Bhh^EA`(x!wCI&w zQ5I1&Awqh~Xl;xVlG(JPu4}B)S?5$)|8goP>M#wkb_RRaKxBy5FZ?42bUT z7}=Bv;c-F+x~uoGB+2n~;N!sK@;n5g)dKj6urY;mrP$zNJgu$?e&u{C7kc2jNpW_m z4aufs(f6YJesmmnRb12O4mfr843mRHjt&p0BY3nf)bx`o)YE?8-0`)0FY!M(@7qv< zjl@b1QLo|nTTO>Zo|4Yml@~#brJgT9SXwr%wFnhzO$q`i>lG4V6+h4dI=qF@}Co1mNWZqs$mXUDuQ) zC{@u@0xcCn#kEL?Hlpi=MYJ5KXjh9^Hq1*94wVh!6VN~(%8YVm5mr#>0pz2|ryhmM z488(WB77Rgh2d};QA-C?#==V<|WX`?aoBZ9kZ*l!* zpZBj;Oy(t-?t`=(9yK9m1@!tGAcnko`3gIS*V#L|#=JV>l~;ep&ENk5C(ppiQ>VDT zeH2!yj;g)){sB89jZy6-F~7hdT2aOchhRVY;978NplT6iC%IR#1Yg$?L^S6Ih)0A37tw}%d! zgOCUc1R9UV+eA4igN!knq(Bx^-NSXDbIwF()!>Wpf1k&1gvBc(sH^#3&U` z#>kjJ2^~1^F62*Yl_6qIWH1ILd7jhj_2`E{3{3-d^cZGY5o%unQuJ^XOlJp3u|XE6 z$p1S_|h%x;s9G`sgE{N#r- z*2H-}@mx;cgHQd&kns;P?ru-Q;Ns0IAwFT&iSZ8n{IFgDq2a2~`I!^+rDQ$bH zpnVz%F;PA#lsX@xWrIA!)(x|&B-3h<=O`D#HtGB!8cWPQT7X}oAWF!;O=CVnSnmmP z*D}^Q3?ohH@BqC9trS}4cwul&pm6vI%%uu~11^c)$e=ElfM?r(-Y+P*?F36r5%D=1 zgpy>v0)?R0FX;7pR8_^{;UT?ZhV z>WmisoO;$^u@wCrTU7|>c=WOJJpByxeU6`ob(IXpCk8yD2kh+5xOVj>U-`;c_}u4C zQI^mfz`y<9{(_f(@Iz*^8RNB0(n2SJrV06BuBF#3@)nOfqzoY4#z4LB0$p0+D!@$OW;LfToo_W7xVo;V*W+?7SO0$X z^Yoq7^DTj(mA&L)$8k~4Mc+%jT>ym#!D|GD_@(Q8)U{XJmZG&?fRzBGwU#W)I%}(V zpr0PK+Ad1~03ZNKL_t&rAk+7|{db%bB1LS7bUvB>=9n(&j+45sna-vy7)cP zOlH&I9M1E=TJaj?9n#sj?<!J-`!(49P-U?ev^Osr~e)G5nR81gTMN#zv9ck z^$+;O3s2xY+`a|xe|VosDX3kaohkHscR6a}Dlc5fktd`r_*f9$3m2j!-bd%2j6z<) z!PG(uk(R`TRsp0EC-E705Rvu!$TlAjC^B4 zVoYN&4s_AOMh9)k0S{?3fz4tcnzOuGkGJ~_Kl1&A(!vv9QAaZE?aTAwf#=rEc_caX zqvJnpc+1xmuwa0NeqTP%qAl^x7VSg?r&(1})it#>fsUypT4_|CQP0bd6c$RXpw(V^ zC^$~7=zz+=)LGn9D`F-Co!uH}M3+eu)(#iJuCqZ&GezjFF>$}j5faJ;IIDUkEkrz3G5!+p>_x8 z-YK$P$XlGv=O7fuc^c!eHk4)Z&Y^vX*EKfg-3rjTf?T7$r13T|%A~?84U(39lh46CYL+<~@<#nx3^a7!ky_!g$TVf+-!|Sk9h2!PdrEygrFl8(h7! zgOH(;L@q$e3}-{|DJwD>TT<5*NuTE1-+7I{_{;Bc^WFp}H2waV#=z+dX91|@WB&GA zuW)aB$lPw?SVv_A)=hC1 zeRg?(OIQ+4)1Dv>V6Da3;1p;JQn&_EF#0Pui(=T1ZYr$iug97T_-G(by zZtt!H2(^G5y2|*3UvN70RCiw@%r>bPq-vPOrh~ zlkn+b!LRmCackPJH!snZWGK=?8zz;hn?OadCe+XIX~XSI?sk$B7E=l!r&UXBzo!vo zDEdGhfTY*K==O$C$n{}Vvb10&k6Z$hS-e&re+NWP7%B=$jgt*22NMw^mO=s+;7){vTSOgc=WI)_E6Wmr zVm*4BeO0y3)IH>tNWt;Ri!A~K^fFSIy>CBH9!z4i&wE;h*x;mIcoHGBvuPTXNc2O4 z&V#Y;auae4Rj4!RgL^GF&=lMxzmB8KQ(9f~XYG7(-(Ng{sZt65yN-z&u7`q+b}P$#_hgeds&4P?i*eJkRO( z`$3h@7*u8hRX4ivtq+CElb}JGuT4}BwXxK|bQ%m$Q(O|NX%;}LrF}swXk@Jo#z&qp$TEaD!eNL!`d!Bfw+be@z-IL`Yi%2WO8;Mt ze*HQSdEENY1*5CSDj+-V=z^nFaNK?EmKf;*t90EYtg{MMMSSnU5N1Qki(jlOEE~va&RJ`MVxxD=%aYlA z*7m{bm`K-1>aAsiqk)6vBB7iK{nd6?ImR&bBS=L8Lh0KC@()WLIoxl8xza{IP;ofdT!+?H& z%#VJ0nWvxrBB~EZ^*w&|?(6*a*MEc2CXjok^Fwajg(sha)8{wYJe_m?u@h{Z9AkmW zv_j<>78!(@M9?WwQSH!r7r>!}EK?x|SWBdnWKuA%8-&V0cnTR5_f@9JGEgXRQRL2h zT5%>6f($UE9NzRA45$?U^$1mh({x_DvUuPBXSbKzIV=}oMdCP267WwoJ90ba8%VG zEOni5mPQE`oCC_@sjc) z58!AH%>>SG!Eb&Z#;4&-A3k<&i#LBYVR~zZ-p(1D0L6p|5i(;;OymzquR%8X!G*(% zxCnTOAjgvv#QtSF%Yy_<4@n-U_&f|wQ6fbd^C;V;U}<59+jzJZ0?436$mF=(FGeRO^pqGsPkaV4h92CA*oCgN^%et zX_X4e@z&Br&@hSh`uf8`_>Qw=S-yP3D;`SUUjKL_#;<^x?uONYne=^lx0a(m7I)iDvBaR zG9tyr5h5El(uli?l+HPfBq;Ox-~lbGie8b?GR*mAW(_{7TS3%dqjO*2?>T1;P*SCDp-Y(E==Ui7j z%Rd;YOs|P<3yYePumF({Tx(^W>(X^sf4cX&3Lw(^$w8!6)|=!^k}4SH)>=$$n9XJ_ zO+L}HVYxP8xc@|X4gxaPHk75o+TctriY%5NT7dj+-=&g5XU?2qI-T<9 zE&a6&B|~I$UO~S9F4PRDX=c6VgQ^#W50LHQ>A^+Ifo7b;tWOPwtJ8+J`xou2wpg>a5U24 zG}t_(nF`?Mk>{-sO736pasT!nM~8R0c%etx17%=1gfD#dQ(U|x=xso$;lktapS}Z! z+c797p>E)VJNJ0w!w03d+(ezzfh=L@xR*Fn2 zv{zxl7Yg4*DjLhnn}E>!K1cXoOHV;0L2rp9Lof&pBm?gd9D>ZFi>;Hlc`s!As?>evVHRP)9g-<*ch)<`-Vvsn6;<5k3eV3AJoAr~3%eAi=@G!J_GYxzM&i;Tjvn z1=^ow>Yq}weLo5Jlx2wCNm;YLzR?yE4^cqSQK3^8IZe}q{7fO*=t{Tto-->^43>@b z1OU@LC1a;GQVCRHsTH`O0P9_drlv@Oh}V`f$bW0Cv5mpl8s`=fwjhX6w|yQw%F9Nv zjRt-)-m^SgJYzhyX<|-bPHloRt@0jZP*J2~R6C&8&pA4pW1{mx zc!86H3Fl9qWNT{!+1F%qMUiLp`#pr1aQpUcc6V;EzR{yB_c?p+1X?O)vssL?H*x$g zK!tUIV)yH4Q(c;)wU)ZBsp~pCey5nLs*DcMbE;v~QaH~LOX`KBUkaryDS)E76MKV{xS`yxA9Y=AEX!G~tTC}=O z;2%6!02iG;OYQ3PZMS{L0o>JlPTyap5U-Al?z34H%2~Zm7ie~YX!_f(;7&h^qO|nB zbRRKaU&h?BwEmT487S^jB2{n*b^Eq^?c`|cUauAB(Hbc=g~~{gigX{=TAT^=*ju-5 zw10o)$`#&w_g!{(cR7FlJR6&*IJb5t)PR&Zy}>%Y;YsGE$JN_Y_HQ4OWh&NT7C0$T zK19HDbl@5xBk)^x90(C;ceyTt6DpNc@)3BrFo&|Vmd1#7qOl4e3X5e$fhtRcAdbZl z+0V2Nw6mU~@Ht4;y0eo5F6E`~BrLVYLnaB}Z4t%NWzH3CB5MR*&dfT*(O~(vqXY*DXgQ zkG;3fnh+;MmPi&KO*Hjr?xAcg-mLMmKa+H$D__sN>iDJd=M)o7JW{fdjzk> z%qDS6=n=no{X<^<(Ud>k2S@(GV{o5Q&&hv>E&hn4` z$v1f6lTRTOy!F-*2L}~GhMMhODwNJ6XzVz2e6YP6XM%8`s;H?!3x;cJ^!q*V0_`f? zTwxJd3r0IKd~o_EB$~?Q`H-V12tfit9&G8DCKe`R1vE5Gh42j$k8=%0Uy>J^`BBYm zeuzXNCzrJ5gwyOPi=z}XV4p>Yj!SF^d^W7LBxmcraSns6|$$%kjrnPd0hKE4<*DTBgl zSwYs@q}rcilqbg{v_kouy~7ztM-383sY~#|ui%Ye zUZ$!WDl0HeL$5yszbK8^jYOvO!K$jz0fb44$VtXWN~;LUiaHyB>(dBFBRo!fj7q|~ zlJEX_!ry%77CXCRtTznT1@gjxd%&g+b<)ObBFOj}5E@3OpdL+_OzzXHJrSH58$4<@Wt4^P`GEt{L|o!bYNKTto6aC(AtAX>63|5AxYEIf>c@ ztqURpNDDJPWlTo16^BNW#Q|CpavJ5*Fj@?(&Vt$k$nd(T8L0!9^f6D;#&(Db<1`+H z7b>O}r0<6bGNi`9>6g@>yiBn09H334g@Iq;+u+6d~r7iprCtOuG(PKV{<5C1qV^v4GZqeR1 z#7(`^4io9hI_4cYzfg7)GNY<0`u!fGwK3LOdc7V(h<1FWNQonPh!_10(U1}$Z*?#j zMCXLVMwQ$!{zRnJ_@K%bjhWQ$EK@Y|ib{gaC5<&`;K?T+=U@G+bBq+oGR#AO;ntYX zeC7paGx*`lKj&*-`x+m6?s4koh|8B><;OqyK6h{5VK^L;C`@%-<2y!85YtL)#KVs+ zz^P-jwW_MH4#+&J;aMJi^ieKcIEnR+mtTIF>GUYhuSl1Y4;qwRT4MqxU9ghIy!Rnb zrlnnV&eL`Bbe%V==jv`^A7wNi*T&<(>gst`-#-q_cCV3sr0B2~Iv}k}Q9G{9?OM@s zbgUZhzYgSf+xF}3>A0gi?~ePM{}O||1*9wk=HPdVD!a~6RTWiL1w)-=C?6jI?Sl3+ zR=WI#wd zT4zPeCLryxl9ZAu#PT>xHH_O_>b6Z{d2AmuM#8gO8ILJjUqrk9 zbl2VR6W2GtP-||_AOBqX2b&oBH|(EPEJ5YHZ>j6uGBOW1p^v%Oz$0662B-PpK04iC zsgL6Md~yg0zx19`iD3}#DU{}tC{^GvI7<*I)QYmIxP9jyhm%tjeYke(CNj^M)(u7$ z=)9mm9HI{3mv7wViD#eS^DnLO`IpuZ7QXl0hF5=f6(vq{?b;D{6+APD!=ZtA51U8_G zB78QgXLc$egr^ucRiAsK8qvWg;>%ttsa<Jq{r~{Xv12fEGDcMk(v)3Cn<73VK?h8;$V>=`#fV zwok2t#*DbN1CwTi9QH7I#yyvFcLt*YY@UFt_eyTx-RFsuXEDI7!;<&!T;}xpCcPn4 zbw!>ReB${_e0qJI{t&7I*uUo4Tn`{|{{XIDJz{&iBvYC~TdG+E6mdvpQjw_~8CsUvf+p#%TW1%`#alQ8RhKG3z{1Gy#iUl zcVDhymh;mez0WV+yvy2VkDtGG3MofuAMzTn+=PGo?_TEm_GvP`!T#O>o9kQXItw+P zI0_;!Qd8)Hs3Q|%vjS?@r8oLmNH;9n#yJ{aw_a5(B$-sLyuPVwilVptfL7?N$%s;& zXbUWiqf9ES2ZU^w4ne33C55DRfrb<)!;lJm3DE(lHYkerVk9_=ioQM3!(dTf;fV#j zjm3CFCIh`=JQ%k*ezmJHv96aFfsPcsUtwDN?uO@ryu35vyHcvwd#_>%8Lc(tJW87j ziI?%dosXcDwj@Jqe3&SHAww>JPe$m9(e2~r+3Ocei|4y{y(q9ViA;|X=;TB4C>KA%w( zgj%LWP@tUj?p7(p5I*RErA5R5cHU86)WmzkkpA7wO z?q2$S7myy;{_e5*z2mOE3a*a(`;UtDr6aXFeb#NK5F%=Lw*LI6dv%~G%ebbjJoUnr*_THyX)mOKBWS_?E`l{;G3H$7@{%if$ zf2ml~U^rGfes3dVV6kp!+ch?%BJ#oG`|RPr>_`~5zsRQ4Lhx}7w|!3=8rrHQgm_)q zNh%^J9p|lPx#Il%oR?mDiC_KOzXCvA*Zk;5KjIg^{8g@9J3t$FbTZ?e_wI4NykOOW z4Ke+otUSs`CI_UN#1aTf4ReV~>-mQ56{CAzLZreHDU~ksK1co3`JPy+BL6Z+vSI{B zt0aadk-4&5uPIWA5?xg^ZI4fB3XYbpcj&4@t4!aICVI%p_IN@PzlmeU<0U$hv#{L0 z@v+;_#{DBx{W7g|JEFcbZqj)-%%0tTxeF?{`yP;-4?iEBezT1ziE-co5%^>_6PdN6 zHs!WHF&Y_iZA6CaM3VLZf=k@6F!b@9!KYH2$M%cMOoI0z)}9VNpiK-EI3Gn`R4J*p zAXwX?iWGGQT5nTSO|!aK@a_ja|Ky)u;o6lc-}~+xoSX+JH1%Xoi{sJh1xHfy?H|8I zqaX0s|JE-vGm4jga-VO1=VdO|hnU$huiaVlzy5Du=UYF1nirn`G=>Q;|H<3D_0}nC zYml-=f<|kFn1J$*N(@R0W@Q;chKJw;r8LTzC_3mmP9HqL&JHNG#T$oh*Yu&q>C_&& z26YVTD$xd?5^JmXX&pDQ%|s_#IhJ=3u@D@#zd&h+QU!=mAC}ynUFW%HDtuSa{iQE* z^58yCK7AFrUQ?e3+`5Odib{B)AFZ)@t{Mp;5d$D5J3q3$uA+!g<2|pv{synS+p=~w z?>}5{x@yqHgw8{!VCfyoD5kn()oZjbIC-?@yFdIH|N7tkAFSFIU4DkH^>pi&vY0?H z{N&}=x%2vuu+55fKOv|CMAx*PMJpfm9VWNJ|=AV3> z&wc4BM0K2ls)9w=VU&Yl<#R_G z001BWNkl@bgK)xP~(h7YK<;5o$FCSm+E25gK(>I|J%o-J`AoTx zNw6poFw&stQY{=C0jLhpHqbB8W|ri76{?)FUUpPQA+iEJBWNfw7*(O9LV&J;X$8sx z%?0&jhVmUn*J5prl|vR`!vFNYd_+;4(D@~6H$$mIbYIXnj#6Lat$UvT;eTFoSS+AD zW4&zft*5;R5Gq97WPPFdy?^-;|MHLSqg8=(fw$g$A5|RETET}ESLcUF?{H4VLc^V< zD&ry>T&!u-h8VT(l%ms7;nRzW;sO?2@2Gr%Q8CduC_l0@onNnH~pV1tT6F}V*W6zgsDpa?S56ja2#gRXT{MHv_JmS_vkb|Qu93LFwMaBHaW{nm@RmUiOW^+`g z!1f)@x}hpG^ZAUfX(&oXZyN}T*}0sScFb#Ou?05`C5#$Z!#^`G%J0L$cT%}!SpE{ioqhh<80 z@v)|H^v~w?1(Z(nQ3#tlt7PWcW*lh|a(N`BNh;&fx$c8Q8I4U2mDX^euHk!Ydc z9-G-wA|W|U(tYQG>=M9}%iqL)9K6kq5o=2up=sCAp;u{KpX>2PAQ;P~Sk4zqu1;@& zb)25vN9*S}JOUS1SUMWF#%V`&Fu^6K)#S>I^WO81f9FS(#-PG=#H%C)6A;}|l%7TC z>6GH%e*Xjh;2Xb<@fEY_F}j$u)(2Rr@ah_`-EVm7j}}ya^rM)J6$E5TuN^)V1QGha zL%WXJC<<#Sy<(;(xCNMF(4nGGCC)pJ4{9EqpE3(mCQhi#oKp2HEG-89gWO6WPay;tfi#5M5CoKFOQ!bSUl7<~ZimwnE!$obOrLCG{jw z6+NrvDYK~u*G7Wy49-MzZ{6{{512kSG0VP<1yH?1w4pZ;N=-4TQC$(Eayro3iia1l zI)=4}dk-zkCSZ*r)HR)gleOjDJMh{OeEDgZl~5d3JZRy&Z^1Xef1lG;O)7TD6$2y|&-Q5p&pDW1mbL^W|(AyUx1 zpo1TxazdI+O-*kh5c7meqk)dzwiIT%N%p`IYdJPVRVWp`l9%XYDUn-tqLIS{o&je9 zk+LR-#DiEQbRc%fkqFBLGQS08&hqYxi;E>TfYJrid4(<`|JkcpSu#%0p5UUY?sOW* z!?fzScHn5k8Q3LLRp3=cYb|~)tn35CoFTfw2T$P|f;~sM2}ptU!nqe3*FdvEt)p>W z)dz_#xrzmqeMQri1T5A&s(MOQ3sZlAh)|bnyjQqRFh#*+x&YC1jple7sXvuKrz4fg z=mJeaPmE%D8xR-eqeTRpz@YdT$x(>uiov(4e=e5^f;l20n@ms(3 zTPU}tZ_YTJ8E!psmAWo@^zc4U&F7KjW0Ha6EI5xAMNw*;k9FV1eFWG74Eb6!pv=Ie zFj1Uj-8TH-M?d8B{ERzy?j#k=7`Yzkj#;Q;Z0Lo{bj#gsOqU#&>iDFwHI8khJWM%X`Kb`@wuODVsOkPKZe{7By`(8Z9Cc++)lWcoF+CBHU z?`Ddrppe8S3m&}kBT&fT?8)r_n;fvMu^Y~wW`$M-_>M?QN+|(&ls6P=hH?hw9R!C8HUbQK zJS|>&P&Gw4!}uEQ6@{5%gQj;KGAW~A3kA*z-Z%8F8`SdWm>Ph$bf5`z(v18VVG1iN?l`BfRi=6^9X+O?vgj& zE2!rcKYQ16G*dJuaQ@& zmRKL=8_8;`kKa5DDu8&O^6q@fbJ;9LK?G4AoI;C4ahH&nNr}{s5H^t%@3Fn5OF4a) zXhrc?L`sVte(!g$Hb+6!=C{NB<$Lgc$X^@`?ok_z1yOc$)_jQIIHIg%IOcXwAhJ+8 z7XJ2b1F93<)H+L{HsS3fsnWR<#=&%j55DGV-@* zc%$}ET5moJkun^7TwJ_zn9^bGDZvZnbVlepY*=t`r1`=Zp5?#z&A&!>dX8J&;q#w* z5-mN-w0!YP&-2EcZ*tK%KK1G6x&732f?aa<-~-MtPH?WLuIoV|HTNZFE#7uf+*cJt zj_7zB1BqS3XWWl+q;j=d@%GzqvtF+Ux~tX|z_3s5FngUEJAG^X*|`7gb5`tL_wM(* zwIuWB8PE)#|2?4e;{e(i=zScB+~;5#e?Gpyyx*2MOm4TG^N+#bKI3}4Us;v|XoRSE zoX6oa1ph2EyaE{kUzh zSTLK-D2r-vdc?E2rCBkoRu@Y z{mvObd*egyJ!lc17%h_N*bxkLeKUwu5#m~4Lkm_9s-T6^-~+acIl=gtc7gYiY-BDw zfMPpmyCH5W&H7oeMELmroj3123}qnVv3Hfo^XtC8Kg=V$xw$+0?R&QQ`Hr`J<2ZiC z_PF8lys~$`2wXb%zI}Jcx=5^jocrbGpgYGK#>D00WE3&ITzV{yA z_gL#u5^IDN-UM`s89smqm{y_HGKf9EV`KCgcz+BPZ|37&-X}xlhs`)Ym_!<9EuK2 zf%p;$D~z5F`V3tUFr~8-tibf3MjVJT_@Gj0lnGi*34rS~fBNIsD0_!Jdyg;u!Yyt+ zSu#BeC{?11f{^M&UfPEAG}s1|9$A95~Vy?!An#~?v=)c2r7f`kzn!bCZ_+STZ*NaG{^)|25Xm_GWHn6)u<3q zszHT-w~DFvTtAp|m71yr_Yv@*!7M%fqQy8s8&F1&R4dRDDTN`d!Jnb6rcx8MvOIe5 zfbX66{AqBs7d=|v!Zx020)>O7Z3xYhd+nN69xBe>s#z@>PS%FgPIK-RlgV|eUh&$G zKIDy`bTo@I+C_(wg8IraletEPNBHi9DtOjmiuJd+e&Y$4O>q4xiE?ZnbF|~fo+=rD zC33lr7HOz~N1GbN;=5d<5hPe5MD=+#0I?{1teKJkB_ZY<42KQ5qpI}CBmvOeIn}UF z7|sP7h1Oi≪|kR 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 KO}?a)v6(G5XXY0{Sw-T-=A8l^2N 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%0DiDR(tL{`Fqian>0?&lJ`8S50R93 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�?Z^)qs)HVyVYs8JZv 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ðMrwXtI@1m25pWY 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�G2(Bjb4vJu%LnJ+lmqxViRl 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 z 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 literal 0 HcmV?d00001 diff --git a/Documentation/platforms/arm/n32h7/index.rst b/Documentation/platforms/arm/n32h7/index.rst new file mode 100644 index 0000000000000..e1a780815b5c1 --- /dev/null +++ b/Documentation/platforms/arm/n32h7/index.rst @@ -0,0 +1,62 @@ +============ +Nations N32H7 +============ + +Supported MCUs +============== + +The following N32H7 series MCUs are supported in NuttX: + +============ ======= ================ +MCU Support Note +============ ======= ================ +N32H762IIL7 Yes Cortex-M7 @ 600MHz, 1.5MB SRAM, 2MB Flash +N32H76x Yes Currently supported via the N32H762IIL7 BSP +N32H78x No (No plan yet) +============ ======= ================ + +Peripheral Support +================== + +The following list indicates peripherals supported in NuttX for N32H7 family: + +========== ======= ====================== +Peripheral Support Notes +========== ======= ====================== +GPIO Yes +EXTI Yes +RCC Yes +UART Yes +TIM Yes +PWM Yes +ONESHOT Yes +TICKLESS Yes +DMA Yes +USBHS Yes Device and Host modes +SDMMC Yes ADMA2 supported +CORDIC Yes +FLASH Yes MTD driver +UID Yes +WDT No Not yet ported +RTC No Not yet ported +I2C No Not yet ported +SPI No Not yet ported +ADC No Not yet ported +DAC No Not yet ported +CAN/FDCAN No Not yet ported +ETH No Not yet ported +========== ======= ====================== + +.. note:: + The SIP Flash on N32H76x has a limitation that prevents effective cache usage. + Therefore, code running from Flash may have lower performance than expected. + It is recommended to place critical code in ITCM for better performance. + +Supported Boards +================ + +.. toctree:: + :glob: + :maxdepth: 1 + + boards/*/* diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 9bbf8540d5d54..8c67fd0240687 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig @@ -303,6 +303,22 @@ config ARCH_CHIP_MOXART ---help--- MoxART family +config ARCH_CHIP_N32H7 + bool "N32 H7" + select ARCH_CORTEXM7 + select ARCH_HAVE_MPU + select ARCH_HAVE_I2CRESET + select ARCH_HAVE_PROGMEM +# select ARCH_HAVE_HEAPCHECK + select ARCH_HAVE_SPI_BITORDER + select ARM_HAVE_MPU_UNIFIED + select ARMV7M_HAVE_STACKCHECK + select ARCH_HAVE_TICKLESS + select ARCH_HAVE_TIMEKEEPING + ---help--- + Nation Tech N32H7 architectures (ARM Cortex-M7 or + dual ARM Cortex-M7 Cortex-M4). + config ARCH_CHIP_NRF52 bool "Nordic nRF52" select ARCH_CORTEXM4 @@ -1317,6 +1333,7 @@ config ARCH_CHIP default "lpc54xx" if ARCH_CHIP_LPC54XX default "max326xx" if ARCH_CHIP_MAX326XX default "moxart" if ARCH_CHIP_MOXART + default "n32h7" if ARCH_CHIP_N32H7 default "nrf52" if ARCH_CHIP_NRF52 default "nrf53" if ARCH_CHIP_NRF53 default "nrf91" if ARCH_CHIP_NRF91 @@ -1811,6 +1828,9 @@ endif if ARCH_CHIP_MOXART source "arch/arm/src/moxart/Kconfig" endif +if ARCH_CHIP_N32H7 +source "arch/arm/src/n32h7/Kconfig" +endif if ARCH_CHIP_NRF52 source "arch/arm/src/nrf52/Kconfig" endif diff --git a/arch/arm/include/n32h7/chip.h b/arch/arm/include/n32h7/chip.h new file mode 100644 index 0000000000000..65a39c47c4c43 --- /dev/null +++ b/arch/arm/include/n32h7/chip.h @@ -0,0 +1,112 @@ +/**************************************************************************** + * arch/arm/include/n32h7/chip.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __ARCH_ARM_INCLUDE_N32H7_CHIP_H +#define __ARCH_ARM_INCLUDE_N32H7_CHIP_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +/**************************************************************************** + * Pre-processor Prototypes + ****************************************************************************/ + +/* N32H7x3xx Differences between family members: + * + * ----------- ---------------- ----- ---- + * SPI + * PART PACKAGE GPIOs I2S + * ----------- ---------------- ----- ---- + * N32H762Ix LQFP176 138 7/4 + * ----------- ---------------- ----- ---- + * + * Parts N32H7xxxI have 2048Kb of FLASH + * + * The correct FLASH size will be set CONFIG_N32H7_FLASH_CONFIG_x or + * overridden with CONFIG_N32H7_FLASH_OVERRIDE_x + */ + +#if defined (CONFIG_ARCH_CHIP_N32H762II) + +/* Memory */ +# define N32H7_AXI_RAM_SIZE (128*1024) /* Placeholder, actual value to be determined */ +# define N32H7_AHB_RAM_SIZE (352*1024) /* Placeholder, actual value to be determined */ +# if defined(CONFIG_ARMV7M_HAVE_DTCM) +# define N32H7_DTCM_SRAM_SIZE (1024*1024) /* Assume same as N32H7, adjust as needed */ +# else +# define N32H7_DTCM_SRAM_SIZE (0) /* No DTCM SRAM on TCM interface */ +# endif +# if defined(CONFIG_ARMV7M_HAVE_ITCM) +# define N32H7_ITCM_SRAM_SIZE (0) /* Assume same as N32H7, adjust as needed */ +# else +# define N32H7_ITCM_SRAM_SIZE (0) /* No ITCM SRAM on TCM interface */ +# endif + +/* Peripherals */ +# if defined(CONFIG_N32H7_IO_CONFIG_V) +# define N32H7_NGPIO (5) /* Placeholder, actual value to be determined */ +# elif defined(CONFIG_N32H7_IO_CONFIG_Z) +# define N32H7_NGPIO (7) /* Placeholder, actual value to be determined */ +# elif defined(CONFIG_N32H7_IO_CONFIG_I) +# define N32H7_NGPIO (9) /* Placeholder, actual value to be determined */ +# elif defined(CONFIG_N32H7_IO_CONFIG_X) +# define N32H7_NGPIO (11) /* Placeholder, actual value to be determined */ +# else +# error CONFIG_N32H7_IO_CONFIG_x Not Set +# endif + +# define N32H7_NDMA (3) /* Placeholder, actual value to be determined */ +# define N32H7_NADC (3) /* Placeholder, actual value to be determined */ +# define N32H7_NDAC (2) /* Placeholder, actual value to be determined */ +# define N32H7_NCMP (4) /* Placeholder, actual value to be determined */ +# define N32H7_NFMAC (1) /* Placeholder, actual value to be determined */ +# define N32H7_NUSART (7) /* Placeholder, actual value to be determined */ +# define N32H7_NSPI (7) /* Placeholder, actual value to be determined */ +# define N32H7_NI2S (4) /* Placeholder, actual value to be determined */ +# define N32H7_NUART (7) /* Placeholder, actual value to be determined */ +# define N32H7_NI2C (10) /* Placeholder, actual value to be determined */ +# define N32H7_NCAN (4) /* Placeholder, actual value to be determined */ +# define N32H7_NSDMMC (2) /* Placeholder, actual value to be determined */ +#else +# error N32 H7 chip not identified +#endif + +/** + * @brief Compute TCM configuration value from ITCM/DTCM/AXI sizes (KB). + * All sizes must be multiples of 128 and sum to 1024 KB. + * Result matches N32H7 TRM encoding 0x00..0x2C. + */ +#define N32H7_TCM_CFG(itcm_kb, dtcm_kb, axi_kb) \ + ( ( ( (axi_kb) / 128 ) * (19 - (axi_kb) / 128 ) / 2 ) + \ + ( (8 - (axi_kb) / 128) - (itcm_kb) / 128 ) ) + +/* 16 Programmable interrupt levels */ + +#define NVIC_SYSH_PRIORITY_MIN 0xf0 /* All bits set in minimum priority */ +#define NVIC_SYSH_PRIORITY_DEFAULT 0x80 /* Midpoint is the default */ +#define NVIC_SYSH_PRIORITY_MAX 0x00 /* Zero is maximum priority */ +#define NVIC_SYSH_PRIORITY_STEP 0x10 /* Four bits of interrupt priority used */ + +#endif /* __ARCH_ARM_INCLUDE_N32H7_CHIP_H */ diff --git a/arch/arm/include/n32h7/irq.h b/arch/arm/include/n32h7/irq.h new file mode 100644 index 0000000000000..816681783ca1e --- /dev/null +++ b/arch/arm/include/n32h7/irq.h @@ -0,0 +1,88 @@ +/**************************************************************************** + * arch/arm/include/n32h7/irq.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + + #ifndef __ARCH_ARM_INCLUDE_N32H7_IRQ_H + #define __ARCH_ARM_INCLUDE_N32H7_IRQ_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +/**************************************************************************** + * Pre-processor Prototypes + ****************************************************************************/ + +/* N32H7x3xx Differences between family members: + * + * ----------- ---------------- ----- ---- + * SPI + * PART PACKAGE GPIOs I2S + * ----------- ---------------- ----- ---- + * N32H762Ix LQFP176 138 7/4 + * ----------- ---------------- ----- ---- + * + * Parts N32H7xxxI have 2048Kb of FLASH + * + * The correct FLASH size will be set CONFIG_N32H7_FLASH_CONFIG_x or + * overridden with CONFIG_N32H7_FLASH_OVERRIDE_x + */ + +#if defined (CONFIG_ARCH_CHIP_N32H762II) +#else +# error N32 H7 chip not identified +#endif + +/* Processor Exceptions (vectors 0-15) */ + +#define N32_IRQ_RESERVED (0) /* Reserved vector (only used with CONFIG_DEBUG_FEATURES) */ + +/* Vector 0: Reset stack pointer value */ + +/* Vector 1: Reset (not handler as an IRQ) */ +#define N32_IRQ_NMI (2) /* Vector 2: Non-Maskable Interrupt (NMI) */ +#define N32_IRQ_HARDFAULT (3) /* Vector 3: Hard fault */ +#define N32_IRQ_MEMFAULT (4) /* Vector 4: Memory management (MPU) */ +#define N32_IRQ_BUSFAULT (5) /* Vector 5: Bus fault */ +#define N32_IRQ_USAGEFAULT (6) /* Vector 6: Usage fault */ + +/* Vectors 7-10: Reserved */ +#define N32_IRQ_SVCALL (11) /* Vector 11: SVC call */ +#define N32_IRQ_DBGMONITOR (12) /* Vector 12: Debug Monitor */ + +/* Vector 13: Reserved */ +#define N32_IRQ_PENDSV (14) /* Vector 14: Pendable system service request */ +#define N32_IRQ_SYSTICK (15) /* Vector 15: System tick */ + +/* External interrupts (vectors >= 16). These definitions are chip-specific + */ + +#define N32_IRQ_FIRST (16) /* Vector number of the first external interrupt */ + +#if defined(CONFIG_N32H7_N32H76X) +# include +#else +# error "Unsupported N32H7 chip" +#endif + +#endif /* __ARCH_ARM_INCLUDE_N32H7_IRQ_H */ diff --git a/arch/arm/include/n32h7/n32h76x_irq.h b/arch/arm/include/n32h7/n32h76x_irq.h new file mode 100644 index 0000000000000..2962a6cfc275b --- /dev/null +++ b/arch/arm/include/n32h7/n32h76x_irq.h @@ -0,0 +1,301 @@ +/**************************************************************************** + * arch/arm/include/n32h7/n32h76x_irq.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/* This file should never be included directly but, rather, + * only indirectly through arch/irq.h + */ + + #ifndef __ARCH_ARM_INCLUDE_N32H7_N32H76X_IRQ_H + #define __ARCH_ARM_INCLUDE_N32H7_N32H76X_IRQ_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +/**************************************************************************** + * Pre-processor Prototypes + ****************************************************************************/ + +/* IRQ numbers. + * The IRQ number corresponds vector number and hence map directly to bits + * in the NVIC. + * This does, however, waste several words of memory in the IRQ to handle + * mapping tables. + * + * Processor Exceptions (vectors 0-15). These common definitions can be + * found in the file nuttx/arch/arm/include/n32h7/irq.h which includes + * this file + * + * External interrupts (vectors >= 16) + */ + +/* IRQ numbers for N32H76x CM7 (NVIC1) + * The IRQ number corresponds to vector number (offset from 0) + * External interrupts (vectors 16-249) + */ + +#define N32_IRQ_WWDG1 (N32_IRQ_FIRST + 0) +#define N32_IRQ_PVD (N32_IRQ_FIRST + 1) +#define N32_IRQ_RTC_TAMPER (N32_IRQ_FIRST + 2) +#define N32_IRQ_RTC_WKUP (N32_IRQ_FIRST + 3) +#define N32_IRQ_RCC (N32_IRQ_FIRST + 4) +#define N32_IRQ_EXTI0 (N32_IRQ_FIRST + 5) +#define N32_IRQ_EXTI1 (N32_IRQ_FIRST + 6) +#define N32_IRQ_EXTI2 (N32_IRQ_FIRST + 7) +#define N32_IRQ_EXTI3 (N32_IRQ_FIRST + 8) +#define N32_IRQ_EXTI4 (N32_IRQ_FIRST + 9) +#define N32_IRQ_EXTI9_5 (N32_IRQ_FIRST + 10) +#define N32_IRQ_EXTI15_10 (N32_IRQ_FIRST + 11) +#define N32_IRQ_DMA1_CHANNEL0 (N32_IRQ_FIRST + 12) +#define N32_IRQ_DMA1_CHANNEL1 (N32_IRQ_FIRST + 13) +#define N32_IRQ_DMA1_CHANNEL2 (N32_IRQ_FIRST + 14) +#define N32_IRQ_DMA1_CHANNEL3 (N32_IRQ_FIRST + 15) +#define N32_IRQ_DMA1_CHANNEL4 (N32_IRQ_FIRST + 16) +#define N32_IRQ_DMA1_CHANNEL5 (N32_IRQ_FIRST + 17) +#define N32_IRQ_DMA1_CHANNEL6 (N32_IRQ_FIRST + 18) +#define N32_IRQ_DMA1_CHANNEL7 (N32_IRQ_FIRST + 19) +#define N32_IRQ_DMA2_CHANNEL0 (N32_IRQ_FIRST + 20) +#define N32_IRQ_DMA2_CHANNEL1 (N32_IRQ_FIRST + 21) +#define N32_IRQ_DMA2_CHANNEL2 (N32_IRQ_FIRST + 22) +#define N32_IRQ_DMA2_CHANNEL3 (N32_IRQ_FIRST + 23) +#define N32_IRQ_DMA2_CHANNEL4 (N32_IRQ_FIRST + 24) +#define N32_IRQ_DMA2_CHANNEL5 (N32_IRQ_FIRST + 25) +#define N32_IRQ_DMA2_CHANNEL6 (N32_IRQ_FIRST + 26) +#define N32_IRQ_DMA2_CHANNEL7 (N32_IRQ_FIRST + 27) +#define N32_IRQ_DMA3_CHANNEL0 (N32_IRQ_FIRST + 28) +#define N32_IRQ_DMA3_CHANNEL1 (N32_IRQ_FIRST + 29) +#define N32_IRQ_DMA3_CHANNEL2 (N32_IRQ_FIRST + 30) +#define N32_IRQ_DMA3_CHANNEL3 (N32_IRQ_FIRST + 31) +#define N32_IRQ_DMA3_CHANNEL4 (N32_IRQ_FIRST + 32) +#define N32_IRQ_DMA3_CHANNEL5 (N32_IRQ_FIRST + 33) +#define N32_IRQ_DMA3_CHANNEL6 (N32_IRQ_FIRST + 34) +#define N32_IRQ_DMA3_CHANNEL7 (N32_IRQ_FIRST + 35) +#define N32_IRQ_MDMA_CHANNEL0 (N32_IRQ_FIRST + 36) +#define N32_IRQ_MDMA_CHANNEL1 (N32_IRQ_FIRST + 37) +#define N32_IRQ_MDMA_CHANNEL2 (N32_IRQ_FIRST + 38) +#define N32_IRQ_MDMA_CHANNEL3 (N32_IRQ_FIRST + 39) +#define N32_IRQ_MDMA_CHANNEL4 (N32_IRQ_FIRST + 40) +#define N32_IRQ_MDMA_CHANNEL5 (N32_IRQ_FIRST + 41) +#define N32_IRQ_MDMA_CHANNEL6 (N32_IRQ_FIRST + 42) +#define N32_IRQ_MDMA_CHANNEL7 (N32_IRQ_FIRST + 43) +#define N32_IRQ_MDMA_CHANNEL8 (N32_IRQ_FIRST + 44) +#define N32_IRQ_MDMA_CHANNEL9 (N32_IRQ_FIRST + 45) +#define N32_IRQ_MDMA_CHANNEL10 (N32_IRQ_FIRST + 46) +#define N32_IRQ_MDMA_CHANNEL11 (N32_IRQ_FIRST + 47) +#define N32_IRQ_MDMA_CHANNEL12 (N32_IRQ_FIRST + 48) +#define N32_IRQ_MDMA_CHANNEL13 (N32_IRQ_FIRST + 49) +#define N32_IRQ_MDMA_CHANNEL14 (N32_IRQ_FIRST + 50) +#define N32_IRQ_MDMA_CHANNEL15 (N32_IRQ_FIRST + 51) +#define N32_IRQ_SDPU (N32_IRQ_FIRST + 52) + +/* Reserved (53) */ + +/* Reserved (54) */ +#define N32_IRQ_FPU_CPU1 (N32_IRQ_FIRST + 55) +#define N32_IRQ_ECCMON (N32_IRQ_FIRST + 56) +#define N32_IRQ_RTC_ALARM (N32_IRQ_FIRST + 57) +#define N32_IRQ_I2C1_EVENT (N32_IRQ_FIRST + 58) +#define N32_IRQ_I2C1_ERR (N32_IRQ_FIRST + 59) +#define N32_IRQ_I2C2_EVENT (N32_IRQ_FIRST + 60) +#define N32_IRQ_I2C2_ERR (N32_IRQ_FIRST + 61) +#define N32_IRQ_I2C3_EVENT (N32_IRQ_FIRST + 62) +#define N32_IRQ_I2C3_ERR (N32_IRQ_FIRST + 63) +#define N32_IRQ_I2C4_EVENT (N32_IRQ_FIRST + 64) +#define N32_IRQ_I2C4_ERR (N32_IRQ_FIRST + 65) +#define N32_IRQ_I2C5_EVENT (N32_IRQ_FIRST + 66) +#define N32_IRQ_I2C5_ERR (N32_IRQ_FIRST + 67) +#define N32_IRQ_I2C6_EVENT (N32_IRQ_FIRST + 68) +#define N32_IRQ_I2C6_ERR (N32_IRQ_FIRST + 69) +#define N32_IRQ_I2C7_EVENT (N32_IRQ_FIRST + 70) +#define N32_IRQ_I2C7_ERR (N32_IRQ_FIRST + 71) +#define N32_IRQ_I2C8_EVENT (N32_IRQ_FIRST + 72) +#define N32_IRQ_I2C8_ERR (N32_IRQ_FIRST + 73) +#define N32_IRQ_I2C9_EVENT (N32_IRQ_FIRST + 74) +#define N32_IRQ_I2C9_ERR (N32_IRQ_FIRST + 75) +#define N32_IRQ_I2C10_EVENT (N32_IRQ_FIRST + 76) +#define N32_IRQ_I2C10_ERR (N32_IRQ_FIRST + 77) +#define N32_IRQ_I2S1 (N32_IRQ_FIRST + 78) +#define N32_IRQ_I2S2 (N32_IRQ_FIRST + 79) +#define N32_IRQ_I2S3 (N32_IRQ_FIRST + 80) +#define N32_IRQ_I2S4 (N32_IRQ_FIRST + 81) +#define N32_IRQ_xSPI1_IRQ (N32_IRQ_FIRST + 82) +#define N32_IRQ_xSPI2_IRQ (N32_IRQ_FIRST + 83) +#define N32_IRQ_SPI1 (N32_IRQ_FIRST + 84) +#define N32_IRQ_SPI2 (N32_IRQ_FIRST + 85) +#define N32_IRQ_SPI3 (N32_IRQ_FIRST + 86) +#define N32_IRQ_SPI4 (N32_IRQ_FIRST + 87) +#define N32_IRQ_SPI5 (N32_IRQ_FIRST + 88) +#define N32_IRQ_SPI6 (N32_IRQ_FIRST + 89) +#define N32_IRQ_SPI7 (N32_IRQ_FIRST + 90) +#define N32_IRQ_LCD_EVENT (N32_IRQ_FIRST + 91) +#define N32_IRQ_LCD_ERR (N32_IRQ_FIRST + 92) +#define N32_IRQ_DVP1 (N32_IRQ_FIRST + 93) +#define N32_IRQ_DVP2 (N32_IRQ_FIRST + 94) +#define N32_IRQ_DMAMUX2 (N32_IRQ_FIRST + 95) +#define N32_IRQ_USBHS1_HS_EPx_OUT (N32_IRQ_FIRST + 96) +#define N32_IRQ_USBHS1_HS_EPx_IN (N32_IRQ_FIRST + 97) +#define N32_IRQ_USBHS1_HS_WKUP (N32_IRQ_FIRST + 98) +#define N32_IRQ_USBHS1_HS (N32_IRQ_FIRST + 99) +#define N32_IRQ_USBHS2_HS_EPx_OUT (N32_IRQ_FIRST + 100) +#define N32_IRQ_USBHS2_HS_EPx_IN (N32_IRQ_FIRST + 101) +#define N32_IRQ_USBHS2_HS_WKUP (N32_IRQ_FIRST + 102) +#define N32_IRQ_USBHS2_HS (N32_IRQ_FIRST + 103) +#define N32_IRQ_ETH1 (N32_IRQ_FIRST + 104) +#define N32_IRQ_ETH1_PMT_LPI (N32_IRQ_FIRST + 105) +#define N32_IRQ_ETH2 (N32_IRQ_FIRST + 106) +#define N32_IRQ_ETH2_PMT_LPI (N32_IRQ_FIRST + 107) +#define N32_IRQ_FDCAN1_INT0 (N32_IRQ_FIRST + 108) +#define N32_IRQ_FDCAN2_INT0 (N32_IRQ_FIRST + 109) +#define N32_IRQ_FDCAN3_INT0 (N32_IRQ_FIRST + 110) +#define N32_IRQ_FDCAN4_INT0 (N32_IRQ_FIRST + 111) +#define N32_IRQ_FDCAN1_INT1 (N32_IRQ_FIRST + 112) +#define N32_IRQ_FDCAN2_INT1 (N32_IRQ_FIRST + 113) +#define N32_IRQ_FDCAN3_INT1 (N32_IRQ_FIRST + 114) +#define N32_IRQ_FDCAN4_INT1 (N32_IRQ_FIRST + 115) +#define N32_IRQ_USART1 (N32_IRQ_FIRST + 116) +#define N32_IRQ_USART2 (N32_IRQ_FIRST + 117) +#define N32_IRQ_USART3 (N32_IRQ_FIRST + 118) +#define N32_IRQ_USART4 (N32_IRQ_FIRST + 119) +#define N32_IRQ_USART5 (N32_IRQ_FIRST + 120) +#define N32_IRQ_USART6 (N32_IRQ_FIRST + 121) +#define N32_IRQ_USART7 (N32_IRQ_FIRST + 122) +#define N32_IRQ_USART8 (N32_IRQ_FIRST + 123) +#define N32_IRQ_UART9 (N32_IRQ_FIRST + 124) +#define N32_IRQ_UART10 (N32_IRQ_FIRST + 125) +#define N32_IRQ_UART11 (N32_IRQ_FIRST + 126) +#define N32_IRQ_UART12 (N32_IRQ_FIRST + 127) +#define N32_IRQ_UART13 (N32_IRQ_FIRST + 128) +#define N32_IRQ_UART14 (N32_IRQ_FIRST + 129) +#define N32_IRQ_UART15 (N32_IRQ_FIRST + 130) +#define N32_IRQ_LPUART1 (N32_IRQ_FIRST + 131) +#define N32_IRQ_LPUART2 (N32_IRQ_FIRST + 132) +#define N32_IRQ_GPU (N32_IRQ_FIRST + 133) + +/* Reserved (134) */ +#define N32_IRQ_SDMMC1 (N32_IRQ_FIRST + 135) +#define N32_IRQ_SDMMC2 (N32_IRQ_FIRST + 136) +#define N32_IRQ_ADC1 (N32_IRQ_FIRST + 137) +#define N32_IRQ_ADC2 (N32_IRQ_FIRST + 138) +#define N32_IRQ_ADC3 (N32_IRQ_FIRST + 139) +#define N32_IRQ_COMP12 (N32_IRQ_FIRST + 140) +#define N32_IRQ_COMP34 (N32_IRQ_FIRST + 141) +#define N32_IRQ_SHRTIM1_INT1 (N32_IRQ_FIRST + 142) +#define N32_IRQ_SHRTIM1_INT2 (N32_IRQ_FIRST + 143) +#define N32_IRQ_SHRTIM1_INT3 (N32_IRQ_FIRST + 144) +#define N32_IRQ_SHRTIM1_INT4 (N32_IRQ_FIRST + 145) +#define N32_IRQ_SHRTIM1_INT5 (N32_IRQ_FIRST + 146) +#define N32_IRQ_SHRTIM1_INT6 (N32_IRQ_FIRST + 147) +#define N32_IRQ_SHRTIM1_INT7 (N32_IRQ_FIRST + 148) +#define N32_IRQ_SHRTIM1_INT8 (N32_IRQ_FIRST + 149) +#define N32_IRQ_SHRTIM2_INT1 (N32_IRQ_FIRST + 150) +#define N32_IRQ_SHRTIM2_INT2 (N32_IRQ_FIRST + 151) +#define N32_IRQ_SHRTIM2_INT3 (N32_IRQ_FIRST + 152) +#define N32_IRQ_SHRTIM2_INT4 (N32_IRQ_FIRST + 153) +#define N32_IRQ_SHRTIM2_INT5 (N32_IRQ_FIRST + 154) +#define N32_IRQ_SHRTIM2_INT6 (N32_IRQ_FIRST + 155) +#define N32_IRQ_SHRTIM2_INT7 (N32_IRQ_FIRST + 156) +#define N32_IRQ_SHRTIM2_INT8 (N32_IRQ_FIRST + 157) +#define N32_IRQ_FDCAN5_INT0 (N32_IRQ_FIRST + 158) +#define N32_IRQ_FDCAN6_INT0 (N32_IRQ_FIRST + 159) +#define N32_IRQ_FDCAN7_INT0 (N32_IRQ_FIRST + 160) +#define N32_IRQ_FDCAN8_INT0 (N32_IRQ_FIRST + 161) +#define N32_IRQ_FDCAN5_INT1 (N32_IRQ_FIRST + 162) +#define N32_IRQ_FDCAN6_INT1 (N32_IRQ_FIRST + 163) +#define N32_IRQ_FDCAN7_INT1 (N32_IRQ_FIRST + 164) +#define N32_IRQ_FDCAN8_INT1 (N32_IRQ_FIRST + 165) +#define N32_IRQ_DSI (N32_IRQ_FIRST + 166) + +/* Reserved (167) */ +#define N32_IRQ_AHB_CACHE_PARMON (N32_IRQ_FIRST + 168) +#define N32_IRQ_LPTIM5_WKUP (N32_IRQ_FIRST + 169) +#define N32_IRQ_JPEG_SGDMA_H2P (N32_IRQ_FIRST + 170) +#define N32_IRQ_JPEG_SGDMA_P2H (N32_IRQ_FIRST + 171) +#define N32_IRQ_WAKEUP_IO (N32_IRQ_FIRST + 172) +#define N32_IRQ_SEMA4_INT1 (N32_IRQ_FIRST + 173) +#define N32_IRQ_WWDG1_RST (N32_IRQ_FIRST + 174) +#define N32_IRQ_OTPC (N32_IRQ_FIRST + 175) +#define N32_IRQ_FEMC (N32_IRQ_FIRST + 176) +#define N32_IRQ_DCMUA (N32_IRQ_FIRST + 177) +#define N32_IRQ_DAC1 (N32_IRQ_FIRST + 178) +#define N32_IRQ_DAC2 (N32_IRQ_FIRST + 179) +#define N32_IRQ_MDMA_AHBS_ER (N32_IRQ_FIRST + 180) +#define N32_IRQ_CM7_CACHE_READ_ER (N32_IRQ_FIRST + 181) +#define N32_IRQ_DAC3 (N32_IRQ_FIRST + 182) +#define N32_IRQ_DAC4 (N32_IRQ_FIRST + 183) +#define N32_IRQ_EMC (N32_IRQ_FIRST + 184) +#define N32_IRQ_DAC5 (N32_IRQ_FIRST + 185) +#define N32_IRQ_DAC6 (N32_IRQ_FIRST + 186) +#define N32_IRQ_ESC_OPB (N32_IRQ_FIRST + 187) +#define N32_IRQ_ESC_SYNC0 (N32_IRQ_FIRST + 188) +#define N32_IRQ_ESC_SYNC1 (N32_IRQ_FIRST + 189) +#define N32_IRQ_ESC_WRP (N32_IRQ_FIRST + 190) + +/* Reserved (191) */ +#define N32_IRQ_ATIM1_BRK (N32_IRQ_FIRST + 192) +#define N32_IRQ_ATIM1_TRG_COM (N32_IRQ_FIRST + 193) +#define N32_IRQ_ATIM1_CC (N32_IRQ_FIRST + 194) +#define N32_IRQ_ATIM1_UP (N32_IRQ_FIRST + 195) +#define N32_IRQ_ATIM2_BRK (N32_IRQ_FIRST + 196) +#define N32_IRQ_ATIM2_TRG_COM (N32_IRQ_FIRST + 197) +#define N32_IRQ_ATIM2_CC (N32_IRQ_FIRST + 198) +#define N32_IRQ_ATIM2_UP (N32_IRQ_FIRST + 199) +#define N32_IRQ_ATIM3_BRK (N32_IRQ_FIRST + 200) +#define N32_IRQ_ATIM3_TRG_COM (N32_IRQ_FIRST + 201) +#define N32_IRQ_ATIM3_CC (N32_IRQ_FIRST + 202) +#define N32_IRQ_ATIM3_UP (N32_IRQ_FIRST + 203) +#define N32_IRQ_ATIM4_BRK (N32_IRQ_FIRST + 204) +#define N32_IRQ_ATIM4_TRG_COM (N32_IRQ_FIRST + 205) +#define N32_IRQ_ATIM4_CC (N32_IRQ_FIRST + 206) +#define N32_IRQ_ATIM4_UP (N32_IRQ_FIRST + 207) +#define N32_IRQ_GTIMA1 (N32_IRQ_FIRST + 208) +#define N32_IRQ_GTIMA2 (N32_IRQ_FIRST + 209) +#define N32_IRQ_GIIMA3 (N32_IRQ_FIRST + 210) +#define N32_IRQ_GTIMA4 (N32_IRQ_FIRST + 211) +#define N32_IRQ_GTIMA5 (N32_IRQ_FIRST + 212) +#define N32_IRQ_GTIMA6 (N32_IRQ_FIRST + 213) +#define N32_IRQ_GTIMA7 (N32_IRQ_FIRST + 214) +#define N32_IRQ_GTIMB1 (N32_IRQ_FIRST + 215) +#define N32_IRQ_GTIMB2 (N32_IRQ_FIRST + 216) +#define N32_IRQ_GTIMB3 (N32_IRQ_FIRST + 217) +#define N32_IRQ_BTIM1 (N32_IRQ_FIRST + 218) +#define N32_IRQ_BTIM2 (N32_IRQ_FIRST + 219) +#define N32_IRQ_BTIM3 (N32_IRQ_FIRST + 220) +#define N32_IRQ_BTIM4 (N32_IRQ_FIRST + 221) +#define N32_IRQ_LPTIM1_WKUP (N32_IRQ_FIRST + 222) +#define N32_IRQ_LPTIM2_WKUP (N32_IRQ_FIRST + 223) +#define N32_IRQ_LPTIM3_WKUP (N32_IRQ_FIRST + 224) +#define N32_IRQ_LPTIM4_WKUP (N32_IRQ_FIRST + 225) +#define N32_IRQ_DSMU_FLT0 (N32_IRQ_FIRST + 226) +#define N32_IRQ_DSMU_FLT1 (N32_IRQ_FIRST + 227) +#define N32_IRQ_DSMU_FLT2 (N32_IRQ_FIRST + 228) +#define N32_IRQ_DSMU_FLT3 (N32_IRQ_FIRST + 229) +#define N32_IRQ_FMAC (N32_IRQ_FIRST + 230) +#define N32_IRQ_CORDIC (N32_IRQ_FIRST + 231) +#define N32_IRQ_DMAMUX1 (N32_IRQ_FIRST + 232) +#define N32_IRQ_MMU (N32_IRQ_FIRST + 233) + +#define N32H7_IRQ_NEXTINTS 234 +#define NR_IRQS (N32_IRQ_FIRST + N32H7_IRQ_NEXTINTS) + +#endif /* __ARCH_ARM_INCLUDE_N32H7_N32H76X_IRQ_H */ diff --git a/arch/arm/src/n32h7/CMakeLists.txt b/arch/arm/src/n32h7/CMakeLists.txt new file mode 100644 index 0000000000000..f6fdfa1713f2f --- /dev/null +++ b/arch/arm/src/n32h7/CMakeLists.txt @@ -0,0 +1,202 @@ +# ############################################################################## +# arch/arm/src/n32h7/CMakeLists.txt +# +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed to the Apache Software Foundation (ASF) under one or more contributor +# license agreements. See the NOTICE file distributed with this work for +# additional information regarding copyright ownership. The ASF licenses this +# file to you under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. +# +# ############################################################################## + +set(SRCS) + +list( + APPEND + SRCS + n32_allocateheap.c + n32_exti_gpio.c + n32_gpio.c + n32_irq.c + n32_rcc.c + n32_lowputc.c + n32_serial.c + n32_cordic.c + n32_uid.c + n32_systemreset.c + n32_start.c) + +if(CONFIG_N32H7_PROGMEM) + list(APPEND SRCS n32_flash.c) +endif() + +if(CONFIG_ARCH_N32H7_DUALCORE) + list(APPEND SRCS n32_dualcore.c) +endif() + +if(CONFIG_N32H7_HSEM) + list(APPEND SRCS n32_hsem.c) +endif() + +if(CONFIG_RPTUN) + list(APPEND SRCS n32_rptun.c) +endif() + +if(CONFIG_SCHED_TICKLESS) + list(APPEND SRCS n32_tickless.c) +else() + list(APPEND SRCS n32_timerisr.c) +endif() + +if(CONFIG_N32H7_ONESHOT) + list(APPEND SRCS n32_oneshot.c) +endif() + +if(CONFIG_ONESHOT) + list(APPEND SRCS n32_oneshot_lowerhalf.c) +endif() + +if(CONFIG_ARM_MPU) + list(APPEND SRCS n32_mpuinit.c) +endif() + +if(CONFIG_BUILD_PROTECTED) + list(APPEND SRCS n32_userspace.c) +endif() + +if(CONFIG_N32H7_ADC) + list(APPEND SRCS n32_adc.c) +endif() + +if(CONFIG_N32H7_FDCAN) + list(APPEND SRCS n32_fdcan_sock.c) +endif() + +if(CONFIG_N32H7_BBSRAM) + list(APPEND SRCS n32_bbsram.c) +endif() + +if(CONFIG_N32H7_DMA) + list(APPEND SRCS n32_dma.c) +endif() + +if(CONFIG_N32H7_FMC) + list(APPEND SRCS n32_fmc.c) +endif() + +if(CONFIG_N32H7_IWDG OR CONFIG_N32H7_RTC_LSICLOCK) + list(APPEND SRCS n32_lsi.c) +endif() + +if(CONFIG_N32H7_RTC_LSECLOCK) + list(APPEND SRCS n32_lse.c) +endif() + +if(CONFIG_N32H7_I2C) + list(APPEND SRCS n32_i2c.c) +endif() + +if(CONFIG_N32H7_PWR) + list(APPEND SRCS n32_pwr.c) +endif() + +if(CONFIG_ARCH_IDLE_CUSTOM) + list(APPEND SRCS n32_idle.c) +endif() + +if(CONFIG_N32H7_QUADSPI) + list(APPEND SRCS n32_qspi.c) +endif() + +if(CONFIG_N32H7_RTC) + list(APPEND SRCS n32_rtc.c) + if(CONFIG_RTC_ALARM) + list(APPEND SRCS n32_exti_alarm.c) + endif() + if(CONFIG_RTC_PERIODIC) + list(APPEND SRCS n32_exti_wakeup.c) + endif() + if(CONFIG_RTC_DRIVER) + list(APPEND SRCS n32_rtc_lowerhalf.c) + endif() +endif() + +if(CONFIG_N32H7_SPI) + list(APPEND SRCS n32_spi.c) +endif() + +if(CONFIG_SPI_SLAVE) + list(APPEND SRCS n32_spi_slave.c) +endif() + +if(CONFIG_N32H7_SDMMC) + list(APPEND SRCS n32_sdmmc.c) +endif() + +if(CONFIG_TIMER) + list(APPEND SRCS n32_tim_lowerhalf.c) +endif() + +if(CONFIG_N32H7_CAPTURE) + list(APPEND SRCS n32_capture.c) +endif() + +if(CONFIG_CAPTURE) + list(APPEND SRCS n32_capture_lowerhalf.c) +endif() + +if(CONFIG_USBDEV) + list(APPEND SRCS n32_usbhsdev.c) +endif() + +if(CONFIG_USBHOST) + list(APPEND SRCS n32_usbhshost.c) +endif() + +if(CONFIG_N32H7_TIM) + list(APPEND SRCS n32_tim.c) +endif() + +if(CONFIG_N32H7_LPTIM) + list(APPEND SRCS n32_lptim.c) +endif() + +if(CONFIG_N32H7_PWM) + list(APPEND SRCS n32_pwm.c) +endif() + +if(CONFIG_N32H7_ETHMAC) + list(APPEND SRCS n32_ethernet.c) +endif() + +if(CONFIG_SENSORS_QENCODER) + list(APPEND SRCS n32_qencoder.c) +endif() + +if(CONFIG_PM) + list(APPEND SRCS n32_pmsleep.c n32_pmstandby.c n32_pmstop.c) + if(NOT CONFIG_ARCH_CUSTOM_PMINIT) + list(APPEND SRCS n32_pminitialize.c) + endif() +endif() + +if(CONFIG_N32H7_IWDG) + list(APPEND SRCS n32_iwdg.c) +endif() + +if(CONFIG_N32H7_WWDG) + list(APPEND SRCS n32_wwdg.c) +endif() + +target_sources(arch PRIVATE ${SRCS}) diff --git a/arch/arm/src/n32h7/Kconfig b/arch/arm/src/n32h7/Kconfig new file mode 100644 index 0000000000000..864caa2034307 --- /dev/null +++ b/arch/arm/src/n32h7/Kconfig @@ -0,0 +1,5302 @@ +# +# For a description of the syntax of this configuration file, +# see the file kconfig-language.txt in the NuttX tools repository. +# + +if ARCH_CHIP_N32H7 + +# "N32 H7 Configuration Options" + +choice + prompt "N32 H7 Chip Selection" + default ARCH_CHIP_N32H762II + depends on ARCH_CHIP_N32H7 + +config ARCH_CHIP_N32H762II + bool "N32H762IIL7" + select N32H7_N32H76X + select N32H7_FLASH_CONFIG_I + select N32H7_IO_CONFIG_I + ---help--- + N32 H7 Cortex M7, 2048 Kb FLASH, 15K Kb SRAM, + with cryptographic accelerator, LQFP176 +endchoice # N32 H7 Chip Selection + +config N32H7_N32H76X + bool + default n + select ARCH_HAVE_FPU + select ARCH_HAVE_DPFPU + select N32H7_HAVE_ETHERNET + select N32H7_HAVE_FMC + select ARCH_HAVE_SERIAL_TERMIOS + +config N32H7_HAVE_USART8 + bool + default n + +config N32H7_HAVE_FMC + bool + default n + +config N32H7_HAVE_ETHERNET + bool + default n + +choice + prompt "N32 H7 Core selection" + default ARCH_CHIP_N32H7_CORTEXM7 + +config ARCH_CHIP_N32H7_CORTEXM7 + bool "N32H7 Cortex-M7 core" + select ARCH_CORTEXM7 + select ARMV7M_HAVE_ICACHE + select ARMV7M_HAVE_DCACHE + select ARMV7M_HAVE_ITCM + select ARMV7M_HAVE_DTCM + +config ARCH_CHIP_N32H7_CORTEXM4 + bool "N32H7 Cortex-M4 core" + depends on ARCH_N32H7_DUALCORE + select ARCH_CORTEXM4 + +endchoice # N32 H7 Core selection + +config N32H7_FLASH_CONFIG_I + bool + default n + +config N32H7_FLASH_CONFIG_K + bool + default n + +choice + prompt "Override Flash Size Designator" + depends on ARCH_CHIP_N32H7 + default N32H7_FLASH_OVERRIDE_DEFAULT + ---help--- + N32H7 series parts numbering (sans the package type) ends with a + letter that designates the FLASH size. + + Designator Size in KiB + I 2048 + K 4096 + + This configuration option defaults to using the configuration based + on that designator or the default smaller size if there is no last + character designator is present in the N32 Chip Selection. + +config N32H7_FLASH_OVERRIDE_DEFAULT + bool "Default" + +config N32H7_FLASH_OVERRIDE_I + bool "I 2048KiB" + +config N32H7_FLASH_OVERRIDE_K + bool "K 4096KiB" + +endchoice # "Override Flash Size Designator" + +config N32H7_BSRAMEXCLUDE + bool + default y + +config N32H7_IO_CONFIG_V + bool + default n + +config N32H7_IO_CONFIG_Z + bool + default n + +config N32H7_IO_CONFIG_I + bool + default n + +config N32H7_IO_CONFIG_X + bool + default n + +config N32H7_CORDIC + bool "CORDIC" + select MATH_CORDIC + default n + +config N32H7_PWR + bool "PWR" + default n + +config N32H7_DMA + bool "DMA" + select ARCH_DMA + default n + +config N32H7_MDMA + bool "MDMA" + default n + +config N32H7_DMA1 + bool "DMA1" + default n + +config N32H7_DMA2 + bool "DMA2" + default n + +config N32H7_DMA3 + bool "DMA3" + default n + +config N32H7_TIM + bool "TIM" + default n + +config N32H7_PWM + bool "PWM" + default n + +config N32H7_SDMMC + bool "SDMMC" + select MMCSD + select ARCH_HAVE_SDIO + select SDIO_BLOCKSETUP + default n + +if N32H7_SDMMC +config N32H7_SDMMC_ADMA + bool "SDMMC ADMA" + select SDIO_DMA + default n +if N32H7_SDMMC_ADMA +config N32H7_SDMMC_MAX_DESCS + int + default 4 + ---help--- + Maximum number of SDMMC ADMA descriptors. +endif +endif # N32H7_SDMMC + +config N32H7_SDMMC1 + bool "SDMMC1" + default n + select N32H7_SDMMC + +config N32H7_SDMMC2 + bool "SDMMC2" + default n + select N32H7_SDMMC + +config N32H7_PROGMEM + bool "Progmem MTD configuration" + default n + select MTD + select MTD_PROGMEM + +config N32H7_USBHS + bool "USBHS" + default n + +config N32H7_USBHS_FS + bool "USBHS FS" + default n + +if N32H7_USBHS +config N32H7_USBHS_ID_DISABLE + bool "Disable USBHS ID GPIO" + default y + +config N32H7_USBHS_SOFOUTPUT + bool "USBHS SOF Output" + default n +endif # N32H7_USBHS + +config N32H7_USBHS1_DEV + bool "USBHS1 Device" + default n + select USBDEV + select N32H7_USBHS + +config N32H7_USBHS2_DEV + bool "USBHS2 Device" + default n + select USBDEV + select N32H7_USBHS + +config N32H7_USBHS1_HOST + bool "USBHS1 Host" + default n + select USBHOST + select USBHOST_INT_DISABLE + select N32H7_USBHS + +config N32H7_USBHS2_HOST + bool "USBHS2 Host" + default n + select USBHOST + select USBHOST_INT_DISABLE + select N32H7_USBHS + +menuconfig N32H7_SERIAL + bool "Serial Driver Support" + default n + ---help--- + Enable N32H7 serial driver. + +if N32H7_SERIAL +config N32H7_USART1 + bool "USART1" + default n + select USART1_SERIALDRIVER + +endif # N32H7_SERIAL +if N32H7_SERIAL +config N32H7_USART2 + bool "USART2" + default n + select USART2_SERIALDRIVER + +endif # N32H7_SERIAL +if N32H7_SERIAL +config N32H7_USART3 + bool "USART3" + default n + select USART3_SERIALDRIVER + +endif # N32H7_SERIAL +if N32H7_SERIAL +config N32H7_USART4 + bool "USART4" + default n + select USART4_SERIALDRIVER + +endif # N32H7_SERIAL +if N32H7_SERIAL +config N32H7_USART5 + bool "USART5" + default n + select USART5_SERIALDRIVER + +endif # N32H7_SERIAL +if N32H7_SERIAL +config N32H7_USART6 + bool "USART6" + default n + select USART6_SERIALDRIVER + +endif # N32H7_SERIAL +if N32H7_SERIAL +config N32H7_USART7 + bool "USART7" + default n + select USART7_SERIALDRIVER + +endif # N32H7_SERIAL +if N32H7_SERIAL +config N32H7_USART8 + bool "USART8" + default n + select USART8_SERIALDRIVER + +endif # N32H7_SERIAL +if N32H7_SERIAL +config N32H7_UART9 + bool "UART9" + default n + select UART9_SERIALDRIVER + +endif # N32H7_SERIAL +if N32H7_SERIAL +config N32H7_UART10 + bool "UART10" + default n + select UART10_SERIALDRIVER + +endif # N32H7_SERIAL +if N32H7_SERIAL +config N32H7_UART11 + bool "UART11" + default n + select UART11_SERIALDRIVER + +endif # N32H7_SERIAL +if N32H7_SERIAL +config N32H7_UART12 + bool "UART12" + default n + select UART12_SERIALDRIVER + +endif # N32H7_SERIAL +if N32H7_SERIAL +config N32H7_UART13 + bool "UART13" + default n + select UART13_SERIALDRIVER + +endif # N32H7_SERIAL +if N32H7_SERIAL +config N32H7_UART14 + bool "UART14" + default n + select UART14_SERIALDRIVER + +endif # N32H7_SERIAL +if N32H7_SERIAL +config N32H7_UART15 + bool "UART15" + default n + select UART15_SERIALDRIVER + +endif # N32H7_SERIAL + +# +# Timer Configuration for N32H7 - AUTO GENERATED +# Do not edit manually. +# + +menu "Timer Configuration" + +if SCHED_TICKLESS + +config N32H7_TICKLESS_TIMER + int "Tickless hardware timer" + default 15 + range 1 18 + ---help--- + If the Tickless OS feature is enabled, then one timer must be + assigned to provide the timer needed by the OS. + + N32H7 Timer Number Mapping: + 1 = ATIM1 10 = GTIMA6 + 2 = ATIM2 11 = GTIMA7 + 3 = GTIMA1 12 = GTIMB1 + 4 = GTIMA2 13 = GTIMB2 + 5 = GTIMA3 14 = GTIMB3 + 6 = ATIM3 15 = BTIM1 + 7 = ATIM4 16 = BTIM2 + 8 = GTIMA4 17 = BTIM3 + 9 = GTIMA5 18 = BTIM4 + +config N32H7_TICKLESS_CHANNEL + int "Tickless timer channel" + default 1 + range 1 4 + ---help--- + If the Tickless OS feature is enabled, the timer needs one channel + on that timer to handle intervals. + +endif # SCHED_TICKLESS + +config N32H7_ONESHOT + bool "TIM one-shot wrapper" + default n + select ONESHOT + ---help--- + Enable a wrapper around the low level timer/counter functions to + support one-shot timer. + +config N32H7_ONESHOT_MAXCHANNELS + int "Maximum number of oneshot channels" + default 1 + range 1 8 + depends on N32H7_ONESHOT + ---help--- + Determines the maximum number of oneshot timers that can be + supported. This setting pre-allocates some minimal support for each + of the timers and places an upper limit on the number of oneshot + timers that you can use. + +config N32H7_TIMER + bool "N32H7 timer driver support" + default n + select TIMER + ---help--- + Enable support for the N32H7 timer driver (n32_tim.c and + n32_tim_lowerhalf.c). + +config N32H7_TIMER_ADVANCED + bool "Advanced Timers (ATIM1-4)" + select N32H7_TIM + ---help--- + Enable support for Advanced Timers (ATIM1, ATIM2, ATIM3, ATIM4). + These timers support complementary outputs, dead-time, break, + repetition counter, and encoder modes. + +config N32H7_TIMER_GTIMA + bool "General-purpose Timers A (GTIMA1-7)" + select N32H7_TIM + ---help--- + Enable support for General-purpose Timers A (GTIMA1-7). + These timers support PWM, input capture, output compare, + and encoder modes. No complementary outputs. + +config N32H7_TIMER_GTIMB + bool "General-purpose Timers B (GTIMB1-3)" + select N32H7_TIM + ---help--- + Enable support for General-purpose Timers B (GTIMB1-3). + These timers support PWM, input capture, output compare, + complementary outputs (CH1 only), break, and encoder modes. + +config N32H7_TIMER_BASIC + bool "Basic Timers (BTIM1-4)" + select N32H7_TIM + ---help--- + Enable support for Basic Timers (BTIM1, BTIM2, BTIM3, BTIM4). + These timers have a 32-bit counter and only support update events. + No PWM, capture, or encoder modes. + +if N32H7_TIMER_ADVANCED + +config N32H7_ATIM1 + bool "ATIM1" + default n + ---help--- + Enable Advanced Timer ATIM1. + +if N32H7_ATIM1 + +config N32H7_ATIM1_PWM + bool "ATIM1 PWM" + default n + depends on N32H7_PWM + ---help--- + Reserve ATIM1 for use by PWM. + +if N32H7_ATIM1_PWM + +config N32H7_ATIM1_MODE + int "ATIM1 Mode" + default 0 + range 0 4 + ---help--- + Specifies the ATIM1 timer mode: 0=up, 1=down, 2=center1, 3=center2, 4=center3. + +config N32H7_ATIM1_LOCK + int "ATIM1 Lock Level" + default 0 + range 0 3 + ---help--- + ATIM1 BDTR lock level configuration. + +config N32H7_ATIM1_TDTS + int "ATIM1 t_DTS Division" + default 0 + range 0 2 + ---help--- + ATIM1 dead-time and sampling clock division: 0=tCK_INT, 1=2*tCK_INT, 2=4*tCK_INT. + +config N32H7_ATIM1_DEADTIME + int "ATIM1 Initial Dead-time" + default 0 + range 0 255 + ---help--- + ATIM1 initial dead-time value (0-255). + +config N32H7_ATIM1_BREAK1 + bool "ATIM1 Break1 Enable" + default n + ---help--- + Enable Break1 input for ATIM1. + +config N32H7_ATIM1_BRK1POL + int "ATIM1 Break1 Polarity" + default 0 + range 0 1 + depends on N32H7_ATIM1_BREAK1 + ---help--- + ATIM1 Break1 polarity: 0=active high, 1=active low. + +config N32H7_ATIM1_BREAK2 + bool "ATIM1 Break2 Enable" + default n + ---help--- + Enable Break2 input for ATIM1 (ATIM only). + +config N32H7_ATIM1_BRK2POL + int "ATIM1 Break2 Polarity" + default 0 + range 0 1 + depends on N32H7_ATIM1_BREAK2 + ---help--- + ATIM1 Break2 polarity: 0=active high, 1=active low. + +config N32H7_ATIM1_BRK2FLT + int "ATIM1 Break2 Filter" + default 0 + range 0 15 + depends on N32H7_ATIM1_BREAK2 + ---help--- + ATIM1 Break2 filter value (0-15). + +if N32H7_PWM_MULTICHAN + +config N32H7_ATIM1_CHANNEL1 + bool "ATIM1 Channel 1" + default n + +if N32H7_ATIM1_CHANNEL1 + +config N32H7_ATIM1_CH1OUT + bool "ATIM1 Channel 1 Output Enable" + default N32H7_ATIM1_CHANNEL1 + ---help--- + Enable output for ATIM1 Channel 1. If disabled, the channel will not be used. + +config N32H7_ATIM1_CH1MODE + int "ATIM1 Channel 1 Mode" + default 6 + depends on N32H7_ATIM1_CH1OUT + range 0 11 + ---help--- + ATIM1 Channel 1 mode. See enum n32_pwm_chanmode_e. + +config N32H7_ATIM1_CH1POL + int "ATIM1 Channel 1 Polarity" + default 0 + range 0 1 + depends on N32H7_ATIM1_CH1OUT + ---help--- + ATIM1 Channel 1 output polarity: 0=active high, 1=active low. + +config N32H7_ATIM1_CH1IDLE + int "ATIM1 Channel 1 Idle State" + default 0 + range 0 1 + depends on N32H7_ATIM1_CH1OUT + ---help--- + ATIM1 Channel 1 idle state: 0=inactive, 1=active. + +config N32H7_ATIM1_CH1NOUT + bool "ATIM1 Channel 1 Complementary Output Enable" + default n + depends on N32H7_ATIM1_CH1OUT + ---help--- + Enable complementary output for ATIM1 Channel 1. + +config N32H7_ATIM1_CH1NPOL + int "ATIM1 Channel 1 Complementary Polarity" + default 0 + range 0 1 + depends on N32H7_ATIM1_CH1NOUT + ---help--- + ATIM1 Channel 1 complementary polarity: 0=active high, 1=active low. + +config N32H7_ATIM1_CH1NIDLE + int "ATIM1 Channel 1 Complementary Idle State" + default 0 + range 0 1 + depends on N32H7_ATIM1_CH1NOUT + ---help--- + ATIM1 Channel 1 complementary idle state: 0=inactive, 1=active. + +endif # N32H7_ATIM1_CHANNEL1 + +config N32H7_ATIM1_CHANNEL2 + bool "ATIM1 Channel 2" + default n + +if N32H7_ATIM1_CHANNEL2 + +config N32H7_ATIM1_CH2OUT + bool "ATIM1 Channel 2 Output Enable" + default N32H7_ATIM1_CHANNEL2 + ---help--- + Enable output for ATIM1 Channel 2. If disabled, the channel will not be used. + +config N32H7_ATIM1_CH2MODE + int "ATIM1 Channel 2 Mode" + default 6 + depends on N32H7_ATIM1_CH2OUT + range 0 11 + ---help--- + ATIM1 Channel 2 mode. See enum n32_pwm_chanmode_e. + +config N32H7_ATIM1_CH2POL + int "ATIM1 Channel 2 Polarity" + default 0 + range 0 1 + depends on N32H7_ATIM1_CH2OUT + ---help--- + ATIM1 Channel 2 output polarity: 0=active high, 1=active low. + +config N32H7_ATIM1_CH2IDLE + int "ATIM1 Channel 2 Idle State" + default 0 + range 0 1 + depends on N32H7_ATIM1_CH2OUT + ---help--- + ATIM1 Channel 2 idle state: 0=inactive, 1=active. + +config N32H7_ATIM1_CH2NOUT + bool "ATIM1 Channel 2 Complementary Output Enable" + default n + depends on N32H7_ATIM1_CH2OUT + ---help--- + Enable complementary output for ATIM1 Channel 2. + +config N32H7_ATIM1_CH2NPOL + int "ATIM1 Channel 2 Complementary Polarity" + default 0 + range 0 1 + depends on N32H7_ATIM1_CH2NOUT + ---help--- + ATIM1 Channel 2 complementary polarity: 0=active high, 1=active low. + +config N32H7_ATIM1_CH2NIDLE + int "ATIM1 Channel 2 Complementary Idle State" + default 0 + range 0 1 + depends on N32H7_ATIM1_CH2NOUT + ---help--- + ATIM1 Channel 2 complementary idle state: 0=inactive, 1=active. + +endif # N32H7_ATIM1_CHANNEL2 + +config N32H7_ATIM1_CHANNEL3 + bool "ATIM1 Channel 3" + default n + +if N32H7_ATIM1_CHANNEL3 + +config N32H7_ATIM1_CH3OUT + bool "ATIM1 Channel 3 Output Enable" + default N32H7_ATIM1_CHANNEL3 + ---help--- + Enable output for ATIM1 Channel 3. If disabled, the channel will not be used. + +config N32H7_ATIM1_CH3MODE + int "ATIM1 Channel 3 Mode" + default 6 + depends on N32H7_ATIM1_CH3OUT + range 0 11 + ---help--- + ATIM1 Channel 3 mode. See enum n32_pwm_chanmode_e. + +config N32H7_ATIM1_CH3POL + int "ATIM1 Channel 3 Polarity" + default 0 + range 0 1 + depends on N32H7_ATIM1_CH3OUT + ---help--- + ATIM1 Channel 3 output polarity: 0=active high, 1=active low. + +config N32H7_ATIM1_CH3IDLE + int "ATIM1 Channel 3 Idle State" + default 0 + range 0 1 + depends on N32H7_ATIM1_CH3OUT + ---help--- + ATIM1 Channel 3 idle state: 0=inactive, 1=active. + +config N32H7_ATIM1_CH3NOUT + bool "ATIM1 Channel 3 Complementary Output Enable" + default n + depends on N32H7_ATIM1_CH3OUT + ---help--- + Enable complementary output for ATIM1 Channel 3. + +config N32H7_ATIM1_CH3NPOL + int "ATIM1 Channel 3 Complementary Polarity" + default 0 + range 0 1 + depends on N32H7_ATIM1_CH3NOUT + ---help--- + ATIM1 Channel 3 complementary polarity: 0=active high, 1=active low. + +config N32H7_ATIM1_CH3NIDLE + int "ATIM1 Channel 3 Complementary Idle State" + default 0 + range 0 1 + depends on N32H7_ATIM1_CH3NOUT + ---help--- + ATIM1 Channel 3 complementary idle state: 0=inactive, 1=active. + +endif # N32H7_ATIM1_CHANNEL3 + +config N32H7_ATIM1_CHANNEL4 + bool "ATIM1 Channel 4" + default n + +if N32H7_ATIM1_CHANNEL4 + +config N32H7_ATIM1_CH4OUT + bool "ATIM1 Channel 4 Output Enable" + default N32H7_ATIM1_CHANNEL4 + ---help--- + Enable output for ATIM1 Channel 4. If disabled, the channel will not be used. + +config N32H7_ATIM1_CH4MODE + int "ATIM1 Channel 4 Mode" + default 6 + depends on N32H7_ATIM1_CH4OUT + range 0 11 + ---help--- + ATIM1 Channel 4 mode. See enum n32_pwm_chanmode_e. + +config N32H7_ATIM1_CH4POL + int "ATIM1 Channel 4 Polarity" + default 0 + range 0 1 + depends on N32H7_ATIM1_CH4OUT + ---help--- + ATIM1 Channel 4 output polarity: 0=active high, 1=active low. + +config N32H7_ATIM1_CH4IDLE + int "ATIM1 Channel 4 Idle State" + default 0 + range 0 1 + depends on N32H7_ATIM1_CH4OUT + ---help--- + ATIM1 Channel 4 idle state: 0=inactive, 1=active. + +config N32H7_ATIM1_CH4NOUT + bool "ATIM1 Channel 4 Complementary Output Enable" + default n + depends on N32H7_ATIM1_CH4OUT + ---help--- + Enable complementary output for ATIM1 Channel 4. + +config N32H7_ATIM1_CH4NPOL + int "ATIM1 Channel 4 Complementary Polarity" + default 0 + range 0 1 + depends on N32H7_ATIM1_CH4NOUT + ---help--- + ATIM1 Channel 4 complementary polarity: 0=active high, 1=active low. + +config N32H7_ATIM1_CH4NIDLE + int "ATIM1 Channel 4 Complementary Idle State" + default 0 + range 0 1 + depends on N32H7_ATIM1_CH4NOUT + ---help--- + ATIM1 Channel 4 complementary idle state: 0=inactive, 1=active. + +endif # N32H7_ATIM1_CHANNEL4 + +endif # N32H7_PWM_MULTICHAN + +if N32H7_PWM_MULTICHAN = n + +config N32H7_ATIM1_CHANNEL + int "ATIM1 PWM Output Channel" + default 1 + range 1 4 + ---help--- + If ATIM1 is enabled for PWM, specifies the timer output channel {1..4}. + +config N32H7_ATIM1_CHMODE + int "ATIM1 Channel Mode" + default 6 + range 0 11 + ---help--- + ATIM1 channel mode. See enum n32_pwm_chanmode_e. + +endif # N32H7_PWM_MULTICHAN = n + +endif # N32H7_ATIM1_PWM + +config N32H7_ATIM1_QE + bool "ATIM1 Quadrature Encoder" + default n + depends on SENSORS_QENCODER + ---help--- + Reserve ATIM1 for use as a quadrature encoder interface. + +endif # N32H7_ATIM1 + +config N32H7_ATIM2 + bool "ATIM2" + default n + ---help--- + Enable Advanced Timer ATIM2. + +if N32H7_ATIM2 + +config N32H7_ATIM2_PWM + bool "ATIM2 PWM" + default n + depends on N32H7_PWM + ---help--- + Reserve ATIM2 for use by PWM. + +if N32H7_ATIM2_PWM + +config N32H7_ATIM2_MODE + int "ATIM2 Mode" + default 0 + range 0 4 + ---help--- + Specifies the ATIM2 timer mode: 0=up, 1=down, 2=center1, 3=center2, 4=center3. + +config N32H7_ATIM2_LOCK + int "ATIM2 Lock Level" + default 0 + range 0 3 + ---help--- + ATIM2 BDTR lock level configuration. + +config N32H7_ATIM2_TDTS + int "ATIM2 t_DTS Division" + default 0 + range 0 2 + ---help--- + ATIM2 dead-time and sampling clock division: 0=tCK_INT, 1=2*tCK_INT, 2=4*tCK_INT. + +config N32H7_ATIM2_DEADTIME + int "ATIM2 Initial Dead-time" + default 0 + range 0 255 + ---help--- + ATIM2 initial dead-time value (0-255). + +config N32H7_ATIM2_BREAK1 + bool "ATIM2 Break1 Enable" + default n + ---help--- + Enable Break1 input for ATIM2. + +config N32H7_ATIM2_BRK1POL + int "ATIM2 Break1 Polarity" + default 0 + range 0 1 + depends on N32H7_ATIM2_BREAK1 + ---help--- + ATIM2 Break1 polarity: 0=active high, 1=active low. + +config N32H7_ATIM2_BREAK2 + bool "ATIM2 Break2 Enable" + default n + ---help--- + Enable Break2 input for ATIM2 (ATIM only). + +config N32H7_ATIM2_BRK2POL + int "ATIM2 Break2 Polarity" + default 0 + range 0 1 + depends on N32H7_ATIM2_BREAK2 + ---help--- + ATIM2 Break2 polarity: 0=active high, 1=active low. + +config N32H7_ATIM2_BRK2FLT + int "ATIM2 Break2 Filter" + default 0 + range 0 15 + depends on N32H7_ATIM2_BREAK2 + ---help--- + ATIM2 Break2 filter value (0-15). + +if N32H7_PWM_MULTICHAN + +config N32H7_ATIM2_CHANNEL1 + bool "ATIM2 Channel 1" + default n + +if N32H7_ATIM2_CHANNEL1 + +config N32H7_ATIM2_CH1OUT + bool "ATIM2 Channel 1 Output Enable" + default N32H7_ATIM2_CHANNEL1 + ---help--- + Enable output for ATIM2 Channel 1. If disabled, the channel will not be used. + +config N32H7_ATIM2_CH1MODE + int "ATIM2 Channel 1 Mode" + default 6 + depends on N32H7_ATIM2_CH1OUT + range 0 11 + ---help--- + ATIM2 Channel 1 mode. See enum n32_pwm_chanmode_e. + +config N32H7_ATIM2_CH1POL + int "ATIM2 Channel 1 Polarity" + default 0 + range 0 1 + depends on N32H7_ATIM2_CH1OUT + ---help--- + ATIM2 Channel 1 output polarity: 0=active high, 1=active low. + +config N32H7_ATIM2_CH1IDLE + int "ATIM2 Channel 1 Idle State" + default 0 + range 0 1 + depends on N32H7_ATIM2_CH1OUT + ---help--- + ATIM2 Channel 1 idle state: 0=inactive, 1=active. + +config N32H7_ATIM2_CH1NOUT + bool "ATIM2 Channel 1 Complementary Output Enable" + default n + depends on N32H7_ATIM2_CH1OUT + ---help--- + Enable complementary output for ATIM2 Channel 1. + +config N32H7_ATIM2_CH1NPOL + int "ATIM2 Channel 1 Complementary Polarity" + default 0 + range 0 1 + depends on N32H7_ATIM2_CH1NOUT + ---help--- + ATIM2 Channel 1 complementary polarity: 0=active high, 1=active low. + +config N32H7_ATIM2_CH1NIDLE + int "ATIM2 Channel 1 Complementary Idle State" + default 0 + range 0 1 + depends on N32H7_ATIM2_CH1NOUT + ---help--- + ATIM2 Channel 1 complementary idle state: 0=inactive, 1=active. + +endif # N32H7_ATIM2_CHANNEL1 + +config N32H7_ATIM2_CHANNEL2 + bool "ATIM2 Channel 2" + default n + +if N32H7_ATIM2_CHANNEL2 + +config N32H7_ATIM2_CH2OUT + bool "ATIM2 Channel 2 Output Enable" + default N32H7_ATIM2_CHANNEL2 + ---help--- + Enable output for ATIM2 Channel 2. If disabled, the channel will not be used. + +config N32H7_ATIM2_CH2MODE + int "ATIM2 Channel 2 Mode" + default 6 + depends on N32H7_ATIM2_CH2OUT + range 0 11 + ---help--- + ATIM2 Channel 2 mode. See enum n32_pwm_chanmode_e. + +config N32H7_ATIM2_CH2POL + int "ATIM2 Channel 2 Polarity" + default 0 + range 0 1 + depends on N32H7_ATIM2_CH2OUT + ---help--- + ATIM2 Channel 2 output polarity: 0=active high, 1=active low. + +config N32H7_ATIM2_CH2IDLE + int "ATIM2 Channel 2 Idle State" + default 0 + range 0 1 + depends on N32H7_ATIM2_CH2OUT + ---help--- + ATIM2 Channel 2 idle state: 0=inactive, 1=active. + +config N32H7_ATIM2_CH2NOUT + bool "ATIM2 Channel 2 Complementary Output Enable" + default n + depends on N32H7_ATIM2_CH2OUT + ---help--- + Enable complementary output for ATIM2 Channel 2. + +config N32H7_ATIM2_CH2NPOL + int "ATIM2 Channel 2 Complementary Polarity" + default 0 + range 0 1 + depends on N32H7_ATIM2_CH2NOUT + ---help--- + ATIM2 Channel 2 complementary polarity: 0=active high, 1=active low. + +config N32H7_ATIM2_CH2NIDLE + int "ATIM2 Channel 2 Complementary Idle State" + default 0 + range 0 1 + depends on N32H7_ATIM2_CH2NOUT + ---help--- + ATIM2 Channel 2 complementary idle state: 0=inactive, 1=active. + +endif # N32H7_ATIM2_CHANNEL2 + +config N32H7_ATIM2_CHANNEL3 + bool "ATIM2 Channel 3" + default n + +if N32H7_ATIM2_CHANNEL3 + +config N32H7_ATIM2_CH3OUT + bool "ATIM2 Channel 3 Output Enable" + default N32H7_ATIM2_CHANNEL3 + ---help--- + Enable output for ATIM2 Channel 3. If disabled, the channel will not be used. + +config N32H7_ATIM2_CH3MODE + int "ATIM2 Channel 3 Mode" + default 6 + depends on N32H7_ATIM2_CH3OUT + range 0 11 + ---help--- + ATIM2 Channel 3 mode. See enum n32_pwm_chanmode_e. + +config N32H7_ATIM2_CH3POL + int "ATIM2 Channel 3 Polarity" + default 0 + range 0 1 + depends on N32H7_ATIM2_CH3OUT + ---help--- + ATIM2 Channel 3 output polarity: 0=active high, 1=active low. + +config N32H7_ATIM2_CH3IDLE + int "ATIM2 Channel 3 Idle State" + default 0 + range 0 1 + depends on N32H7_ATIM2_CH3OUT + ---help--- + ATIM2 Channel 3 idle state: 0=inactive, 1=active. + +config N32H7_ATIM2_CH3NOUT + bool "ATIM2 Channel 3 Complementary Output Enable" + default n + depends on N32H7_ATIM2_CH3OUT + ---help--- + Enable complementary output for ATIM2 Channel 3. + +config N32H7_ATIM2_CH3NPOL + int "ATIM2 Channel 3 Complementary Polarity" + default 0 + range 0 1 + depends on N32H7_ATIM2_CH3NOUT + ---help--- + ATIM2 Channel 3 complementary polarity: 0=active high, 1=active low. + +config N32H7_ATIM2_CH3NIDLE + int "ATIM2 Channel 3 Complementary Idle State" + default 0 + range 0 1 + depends on N32H7_ATIM2_CH3NOUT + ---help--- + ATIM2 Channel 3 complementary idle state: 0=inactive, 1=active. + +endif # N32H7_ATIM2_CHANNEL3 + +config N32H7_ATIM2_CHANNEL4 + bool "ATIM2 Channel 4" + default n + +if N32H7_ATIM2_CHANNEL4 + +config N32H7_ATIM2_CH4OUT + bool "ATIM2 Channel 4 Output Enable" + default N32H7_ATIM2_CHANNEL4 + ---help--- + Enable output for ATIM2 Channel 4. If disabled, the channel will not be used. + +config N32H7_ATIM2_CH4MODE + int "ATIM2 Channel 4 Mode" + default 6 + depends on N32H7_ATIM2_CH4OUT + range 0 11 + ---help--- + ATIM2 Channel 4 mode. See enum n32_pwm_chanmode_e. + +config N32H7_ATIM2_CH4POL + int "ATIM2 Channel 4 Polarity" + default 0 + range 0 1 + depends on N32H7_ATIM2_CH4OUT + ---help--- + ATIM2 Channel 4 output polarity: 0=active high, 1=active low. + +config N32H7_ATIM2_CH4IDLE + int "ATIM2 Channel 4 Idle State" + default 0 + range 0 1 + depends on N32H7_ATIM2_CH4OUT + ---help--- + ATIM2 Channel 4 idle state: 0=inactive, 1=active. + +config N32H7_ATIM2_CH4NOUT + bool "ATIM2 Channel 4 Complementary Output Enable" + default n + depends on N32H7_ATIM2_CH4OUT + ---help--- + Enable complementary output for ATIM2 Channel 4. + +config N32H7_ATIM2_CH4NPOL + int "ATIM2 Channel 4 Complementary Polarity" + default 0 + range 0 1 + depends on N32H7_ATIM2_CH4NOUT + ---help--- + ATIM2 Channel 4 complementary polarity: 0=active high, 1=active low. + +config N32H7_ATIM2_CH4NIDLE + int "ATIM2 Channel 4 Complementary Idle State" + default 0 + range 0 1 + depends on N32H7_ATIM2_CH4NOUT + ---help--- + ATIM2 Channel 4 complementary idle state: 0=inactive, 1=active. + +endif # N32H7_ATIM2_CHANNEL4 + +endif # N32H7_PWM_MULTICHAN + +if N32H7_PWM_MULTICHAN = n + +config N32H7_ATIM2_CHANNEL + int "ATIM2 PWM Output Channel" + default 1 + range 1 4 + ---help--- + If ATIM2 is enabled for PWM, specifies the timer output channel {1..4}. + +config N32H7_ATIM2_CHMODE + int "ATIM2 Channel Mode" + default 6 + range 0 11 + ---help--- + ATIM2 channel mode. See enum n32_pwm_chanmode_e. + +endif # N32H7_PWM_MULTICHAN = n + +endif # N32H7_ATIM2_PWM + +config N32H7_ATIM2_QE + bool "ATIM2 Quadrature Encoder" + default n + depends on SENSORS_QENCODER + ---help--- + Reserve ATIM2 for use as a quadrature encoder interface. + +endif # N32H7_ATIM2 + +config N32H7_ATIM3 + bool "ATIM3" + default n + ---help--- + Enable Advanced Timer ATIM3. + +if N32H7_ATIM3 + +config N32H7_ATIM3_PWM + bool "ATIM3 PWM" + default n + depends on N32H7_PWM + ---help--- + Reserve ATIM3 for use by PWM. + +if N32H7_ATIM3_PWM + +config N32H7_ATIM3_MODE + int "ATIM3 Mode" + default 0 + range 0 4 + ---help--- + Specifies the ATIM3 timer mode: 0=up, 1=down, 2=center1, 3=center2, 4=center3. + +config N32H7_ATIM3_LOCK + int "ATIM3 Lock Level" + default 0 + range 0 3 + ---help--- + ATIM3 BDTR lock level configuration. + +config N32H7_ATIM3_TDTS + int "ATIM3 t_DTS Division" + default 0 + range 0 2 + ---help--- + ATIM3 dead-time and sampling clock division: 0=tCK_INT, 1=2*tCK_INT, 2=4*tCK_INT. + +config N32H7_ATIM3_DEADTIME + int "ATIM3 Initial Dead-time" + default 0 + range 0 255 + ---help--- + ATIM3 initial dead-time value (0-255). + +config N32H7_ATIM3_BREAK1 + bool "ATIM3 Break1 Enable" + default n + ---help--- + Enable Break1 input for ATIM3. + +config N32H7_ATIM3_BRK1POL + int "ATIM3 Break1 Polarity" + default 0 + range 0 1 + depends on N32H7_ATIM3_BREAK1 + ---help--- + ATIM3 Break1 polarity: 0=active high, 1=active low. + +config N32H7_ATIM3_BREAK2 + bool "ATIM3 Break2 Enable" + default n + ---help--- + Enable Break2 input for ATIM3 (ATIM only). + +config N32H7_ATIM3_BRK2POL + int "ATIM3 Break2 Polarity" + default 0 + range 0 1 + depends on N32H7_ATIM3_BREAK2 + ---help--- + ATIM3 Break2 polarity: 0=active high, 1=active low. + +config N32H7_ATIM3_BRK2FLT + int "ATIM3 Break2 Filter" + default 0 + range 0 15 + depends on N32H7_ATIM3_BREAK2 + ---help--- + ATIM3 Break2 filter value (0-15). + +if N32H7_PWM_MULTICHAN + +config N32H7_ATIM3_CHANNEL1 + bool "ATIM3 Channel 1" + default n + +if N32H7_ATIM3_CHANNEL1 + +config N32H7_ATIM3_CH1OUT + bool "ATIM3 Channel 1 Output Enable" + default N32H7_ATIM3_CHANNEL1 + ---help--- + Enable output for ATIM3 Channel 1. If disabled, the channel will not be used. + +config N32H7_ATIM3_CH1MODE + int "ATIM3 Channel 1 Mode" + default 6 + depends on N32H7_ATIM3_CH1OUT + range 0 11 + ---help--- + ATIM3 Channel 1 mode. See enum n32_pwm_chanmode_e. + +config N32H7_ATIM3_CH1POL + int "ATIM3 Channel 1 Polarity" + default 0 + range 0 1 + depends on N32H7_ATIM3_CH1OUT + ---help--- + ATIM3 Channel 1 output polarity: 0=active high, 1=active low. + +config N32H7_ATIM3_CH1IDLE + int "ATIM3 Channel 1 Idle State" + default 0 + range 0 1 + depends on N32H7_ATIM3_CH1OUT + ---help--- + ATIM3 Channel 1 idle state: 0=inactive, 1=active. + +config N32H7_ATIM3_CH1NOUT + bool "ATIM3 Channel 1 Complementary Output Enable" + default n + depends on N32H7_ATIM3_CH1OUT + ---help--- + Enable complementary output for ATIM3 Channel 1. + +config N32H7_ATIM3_CH1NPOL + int "ATIM3 Channel 1 Complementary Polarity" + default 0 + range 0 1 + depends on N32H7_ATIM3_CH1NOUT + ---help--- + ATIM3 Channel 1 complementary polarity: 0=active high, 1=active low. + +config N32H7_ATIM3_CH1NIDLE + int "ATIM3 Channel 1 Complementary Idle State" + default 0 + range 0 1 + depends on N32H7_ATIM3_CH1NOUT + ---help--- + ATIM3 Channel 1 complementary idle state: 0=inactive, 1=active. + +endif # N32H7_ATIM3_CHANNEL1 + +config N32H7_ATIM3_CHANNEL2 + bool "ATIM3 Channel 2" + default n + +if N32H7_ATIM3_CHANNEL2 + +config N32H7_ATIM3_CH2OUT + bool "ATIM3 Channel 2 Output Enable" + default N32H7_ATIM3_CHANNEL2 + ---help--- + Enable output for ATIM3 Channel 2. If disabled, the channel will not be used. + +config N32H7_ATIM3_CH2MODE + int "ATIM3 Channel 2 Mode" + default 6 + depends on N32H7_ATIM3_CH2OUT + range 0 11 + ---help--- + ATIM3 Channel 2 mode. See enum n32_pwm_chanmode_e. + +config N32H7_ATIM3_CH2POL + int "ATIM3 Channel 2 Polarity" + default 0 + range 0 1 + depends on N32H7_ATIM3_CH2OUT + ---help--- + ATIM3 Channel 2 output polarity: 0=active high, 1=active low. + +config N32H7_ATIM3_CH2IDLE + int "ATIM3 Channel 2 Idle State" + default 0 + range 0 1 + depends on N32H7_ATIM3_CH2OUT + ---help--- + ATIM3 Channel 2 idle state: 0=inactive, 1=active. + +config N32H7_ATIM3_CH2NOUT + bool "ATIM3 Channel 2 Complementary Output Enable" + default n + depends on N32H7_ATIM3_CH2OUT + ---help--- + Enable complementary output for ATIM3 Channel 2. + +config N32H7_ATIM3_CH2NPOL + int "ATIM3 Channel 2 Complementary Polarity" + default 0 + range 0 1 + depends on N32H7_ATIM3_CH2NOUT + ---help--- + ATIM3 Channel 2 complementary polarity: 0=active high, 1=active low. + +config N32H7_ATIM3_CH2NIDLE + int "ATIM3 Channel 2 Complementary Idle State" + default 0 + range 0 1 + depends on N32H7_ATIM3_CH2NOUT + ---help--- + ATIM3 Channel 2 complementary idle state: 0=inactive, 1=active. + +endif # N32H7_ATIM3_CHANNEL2 + +config N32H7_ATIM3_CHANNEL3 + bool "ATIM3 Channel 3" + default n + +if N32H7_ATIM3_CHANNEL3 + +config N32H7_ATIM3_CH3OUT + bool "ATIM3 Channel 3 Output Enable" + default N32H7_ATIM3_CHANNEL3 + ---help--- + Enable output for ATIM3 Channel 3. If disabled, the channel will not be used. + +config N32H7_ATIM3_CH3MODE + int "ATIM3 Channel 3 Mode" + default 6 + depends on N32H7_ATIM3_CH3OUT + range 0 11 + ---help--- + ATIM3 Channel 3 mode. See enum n32_pwm_chanmode_e. + +config N32H7_ATIM3_CH3POL + int "ATIM3 Channel 3 Polarity" + default 0 + range 0 1 + depends on N32H7_ATIM3_CH3OUT + ---help--- + ATIM3 Channel 3 output polarity: 0=active high, 1=active low. + +config N32H7_ATIM3_CH3IDLE + int "ATIM3 Channel 3 Idle State" + default 0 + range 0 1 + depends on N32H7_ATIM3_CH3OUT + ---help--- + ATIM3 Channel 3 idle state: 0=inactive, 1=active. + +config N32H7_ATIM3_CH3NOUT + bool "ATIM3 Channel 3 Complementary Output Enable" + default n + depends on N32H7_ATIM3_CH3OUT + ---help--- + Enable complementary output for ATIM3 Channel 3. + +config N32H7_ATIM3_CH3NPOL + int "ATIM3 Channel 3 Complementary Polarity" + default 0 + range 0 1 + depends on N32H7_ATIM3_CH3NOUT + ---help--- + ATIM3 Channel 3 complementary polarity: 0=active high, 1=active low. + +config N32H7_ATIM3_CH3NIDLE + int "ATIM3 Channel 3 Complementary Idle State" + default 0 + range 0 1 + depends on N32H7_ATIM3_CH3NOUT + ---help--- + ATIM3 Channel 3 complementary idle state: 0=inactive, 1=active. + +endif # N32H7_ATIM3_CHANNEL3 + +config N32H7_ATIM3_CHANNEL4 + bool "ATIM3 Channel 4" + default n + +if N32H7_ATIM3_CHANNEL4 + +config N32H7_ATIM3_CH4OUT + bool "ATIM3 Channel 4 Output Enable" + default N32H7_ATIM3_CHANNEL4 + ---help--- + Enable output for ATIM3 Channel 4. If disabled, the channel will not be used. + +config N32H7_ATIM3_CH4MODE + int "ATIM3 Channel 4 Mode" + default 6 + depends on N32H7_ATIM3_CH4OUT + range 0 11 + ---help--- + ATIM3 Channel 4 mode. See enum n32_pwm_chanmode_e. + +config N32H7_ATIM3_CH4POL + int "ATIM3 Channel 4 Polarity" + default 0 + range 0 1 + depends on N32H7_ATIM3_CH4OUT + ---help--- + ATIM3 Channel 4 output polarity: 0=active high, 1=active low. + +config N32H7_ATIM3_CH4IDLE + int "ATIM3 Channel 4 Idle State" + default 0 + range 0 1 + depends on N32H7_ATIM3_CH4OUT + ---help--- + ATIM3 Channel 4 idle state: 0=inactive, 1=active. + +config N32H7_ATIM3_CH4NOUT + bool "ATIM3 Channel 4 Complementary Output Enable" + default n + depends on N32H7_ATIM3_CH4OUT + ---help--- + Enable complementary output for ATIM3 Channel 4. + +config N32H7_ATIM3_CH4NPOL + int "ATIM3 Channel 4 Complementary Polarity" + default 0 + range 0 1 + depends on N32H7_ATIM3_CH4NOUT + ---help--- + ATIM3 Channel 4 complementary polarity: 0=active high, 1=active low. + +config N32H7_ATIM3_CH4NIDLE + int "ATIM3 Channel 4 Complementary Idle State" + default 0 + range 0 1 + depends on N32H7_ATIM3_CH4NOUT + ---help--- + ATIM3 Channel 4 complementary idle state: 0=inactive, 1=active. + +endif # N32H7_ATIM3_CHANNEL4 + +endif # N32H7_PWM_MULTICHAN + +if N32H7_PWM_MULTICHAN = n + +config N32H7_ATIM3_CHANNEL + int "ATIM3 PWM Output Channel" + default 1 + range 1 4 + ---help--- + If ATIM3 is enabled for PWM, specifies the timer output channel {1..4}. + +config N32H7_ATIM3_CHMODE + int "ATIM3 Channel Mode" + default 6 + range 0 11 + ---help--- + ATIM3 channel mode. See enum n32_pwm_chanmode_e. + +endif # N32H7_PWM_MULTICHAN = n + +endif # N32H7_ATIM3_PWM + +config N32H7_ATIM3_QE + bool "ATIM3 Quadrature Encoder" + default n + depends on SENSORS_QENCODER + ---help--- + Reserve ATIM3 for use as a quadrature encoder interface. + +endif # N32H7_ATIM3 + +config N32H7_ATIM4 + bool "ATIM4" + default n + ---help--- + Enable Advanced Timer ATIM4. + +if N32H7_ATIM4 + +config N32H7_ATIM4_PWM + bool "ATIM4 PWM" + default n + depends on N32H7_PWM + ---help--- + Reserve ATIM4 for use by PWM. + +if N32H7_ATIM4_PWM + +config N32H7_ATIM4_MODE + int "ATIM4 Mode" + default 0 + range 0 4 + ---help--- + Specifies the ATIM4 timer mode: 0=up, 1=down, 2=center1, 3=center2, 4=center3. + +config N32H7_ATIM4_LOCK + int "ATIM4 Lock Level" + default 0 + range 0 3 + ---help--- + ATIM4 BDTR lock level configuration. + +config N32H7_ATIM4_TDTS + int "ATIM4 t_DTS Division" + default 0 + range 0 2 + ---help--- + ATIM4 dead-time and sampling clock division: 0=tCK_INT, 1=2*tCK_INT, 2=4*tCK_INT. + +config N32H7_ATIM4_DEADTIME + int "ATIM4 Initial Dead-time" + default 0 + range 0 255 + ---help--- + ATIM4 initial dead-time value (0-255). + +config N32H7_ATIM4_BREAK1 + bool "ATIM4 Break1 Enable" + default n + ---help--- + Enable Break1 input for ATIM4. + +config N32H7_ATIM4_BRK1POL + int "ATIM4 Break1 Polarity" + default 0 + range 0 1 + depends on N32H7_ATIM4_BREAK1 + ---help--- + ATIM4 Break1 polarity: 0=active high, 1=active low. + +config N32H7_ATIM4_BREAK2 + bool "ATIM4 Break2 Enable" + default n + ---help--- + Enable Break2 input for ATIM4 (ATIM only). + +config N32H7_ATIM4_BRK2POL + int "ATIM4 Break2 Polarity" + default 0 + range 0 1 + depends on N32H7_ATIM4_BREAK2 + ---help--- + ATIM4 Break2 polarity: 0=active high, 1=active low. + +config N32H7_ATIM4_BRK2FLT + int "ATIM4 Break2 Filter" + default 0 + range 0 15 + depends on N32H7_ATIM4_BREAK2 + ---help--- + ATIM4 Break2 filter value (0-15). + +if N32H7_PWM_MULTICHAN + +config N32H7_ATIM4_CHANNEL1 + bool "ATIM4 Channel 1" + default n + +if N32H7_ATIM4_CHANNEL1 + +config N32H7_ATIM4_CH1OUT + bool "ATIM4 Channel 1 Output Enable" + default N32H7_ATIM4_CHANNEL1 + ---help--- + Enable output for ATIM4 Channel 1. If disabled, the channel will not be used. + +config N32H7_ATIM4_CH1MODE + int "ATIM4 Channel 1 Mode" + default 6 + depends on N32H7_ATIM4_CH1OUT + range 0 11 + ---help--- + ATIM4 Channel 1 mode. See enum n32_pwm_chanmode_e. + +config N32H7_ATIM4_CH1POL + int "ATIM4 Channel 1 Polarity" + default 0 + range 0 1 + depends on N32H7_ATIM4_CH1OUT + ---help--- + ATIM4 Channel 1 output polarity: 0=active high, 1=active low. + +config N32H7_ATIM4_CH1IDLE + int "ATIM4 Channel 1 Idle State" + default 0 + range 0 1 + depends on N32H7_ATIM4_CH1OUT + ---help--- + ATIM4 Channel 1 idle state: 0=inactive, 1=active. + +config N32H7_ATIM4_CH1NOUT + bool "ATIM4 Channel 1 Complementary Output Enable" + default n + depends on N32H7_ATIM4_CH1OUT + ---help--- + Enable complementary output for ATIM4 Channel 1. + +config N32H7_ATIM4_CH1NPOL + int "ATIM4 Channel 1 Complementary Polarity" + default 0 + range 0 1 + depends on N32H7_ATIM4_CH1NOUT + ---help--- + ATIM4 Channel 1 complementary polarity: 0=active high, 1=active low. + +config N32H7_ATIM4_CH1NIDLE + int "ATIM4 Channel 1 Complementary Idle State" + default 0 + range 0 1 + depends on N32H7_ATIM4_CH1NOUT + ---help--- + ATIM4 Channel 1 complementary idle state: 0=inactive, 1=active. + +endif # N32H7_ATIM4_CHANNEL1 + +config N32H7_ATIM4_CHANNEL2 + bool "ATIM4 Channel 2" + default n + +if N32H7_ATIM4_CHANNEL2 + +config N32H7_ATIM4_CH2OUT + bool "ATIM4 Channel 2 Output Enable" + default N32H7_ATIM4_CHANNEL2 + ---help--- + Enable output for ATIM4 Channel 2. If disabled, the channel will not be used. + +config N32H7_ATIM4_CH2MODE + int "ATIM4 Channel 2 Mode" + default 6 + depends on N32H7_ATIM4_CH2OUT + range 0 11 + ---help--- + ATIM4 Channel 2 mode. See enum n32_pwm_chanmode_e. + +config N32H7_ATIM4_CH2POL + int "ATIM4 Channel 2 Polarity" + default 0 + range 0 1 + depends on N32H7_ATIM4_CH2OUT + ---help--- + ATIM4 Channel 2 output polarity: 0=active high, 1=active low. + +config N32H7_ATIM4_CH2IDLE + int "ATIM4 Channel 2 Idle State" + default 0 + range 0 1 + depends on N32H7_ATIM4_CH2OUT + ---help--- + ATIM4 Channel 2 idle state: 0=inactive, 1=active. + +config N32H7_ATIM4_CH2NOUT + bool "ATIM4 Channel 2 Complementary Output Enable" + default n + depends on N32H7_ATIM4_CH2OUT + ---help--- + Enable complementary output for ATIM4 Channel 2. + +config N32H7_ATIM4_CH2NPOL + int "ATIM4 Channel 2 Complementary Polarity" + default 0 + range 0 1 + depends on N32H7_ATIM4_CH2NOUT + ---help--- + ATIM4 Channel 2 complementary polarity: 0=active high, 1=active low. + +config N32H7_ATIM4_CH2NIDLE + int "ATIM4 Channel 2 Complementary Idle State" + default 0 + range 0 1 + depends on N32H7_ATIM4_CH2NOUT + ---help--- + ATIM4 Channel 2 complementary idle state: 0=inactive, 1=active. + +endif # N32H7_ATIM4_CHANNEL2 + +config N32H7_ATIM4_CHANNEL3 + bool "ATIM4 Channel 3" + default n + +if N32H7_ATIM4_CHANNEL3 + +config N32H7_ATIM4_CH3OUT + bool "ATIM4 Channel 3 Output Enable" + default N32H7_ATIM4_CHANNEL3 + ---help--- + Enable output for ATIM4 Channel 3. If disabled, the channel will not be used. + +config N32H7_ATIM4_CH3MODE + int "ATIM4 Channel 3 Mode" + default 6 + depends on N32H7_ATIM4_CH3OUT + range 0 11 + ---help--- + ATIM4 Channel 3 mode. See enum n32_pwm_chanmode_e. + +config N32H7_ATIM4_CH3POL + int "ATIM4 Channel 3 Polarity" + default 0 + range 0 1 + depends on N32H7_ATIM4_CH3OUT + ---help--- + ATIM4 Channel 3 output polarity: 0=active high, 1=active low. + +config N32H7_ATIM4_CH3IDLE + int "ATIM4 Channel 3 Idle State" + default 0 + range 0 1 + depends on N32H7_ATIM4_CH3OUT + ---help--- + ATIM4 Channel 3 idle state: 0=inactive, 1=active. + +config N32H7_ATIM4_CH3NOUT + bool "ATIM4 Channel 3 Complementary Output Enable" + default n + depends on N32H7_ATIM4_CH3OUT + ---help--- + Enable complementary output for ATIM4 Channel 3. + +config N32H7_ATIM4_CH3NPOL + int "ATIM4 Channel 3 Complementary Polarity" + default 0 + range 0 1 + depends on N32H7_ATIM4_CH3NOUT + ---help--- + ATIM4 Channel 3 complementary polarity: 0=active high, 1=active low. + +config N32H7_ATIM4_CH3NIDLE + int "ATIM4 Channel 3 Complementary Idle State" + default 0 + range 0 1 + depends on N32H7_ATIM4_CH3NOUT + ---help--- + ATIM4 Channel 3 complementary idle state: 0=inactive, 1=active. + +endif # N32H7_ATIM4_CHANNEL3 + +config N32H7_ATIM4_CHANNEL4 + bool "ATIM4 Channel 4" + default n + +if N32H7_ATIM4_CHANNEL4 + +config N32H7_ATIM4_CH4OUT + bool "ATIM4 Channel 4 Output Enable" + default N32H7_ATIM4_CHANNEL4 + ---help--- + Enable output for ATIM4 Channel 4. If disabled, the channel will not be used. + +config N32H7_ATIM4_CH4MODE + int "ATIM4 Channel 4 Mode" + default 6 + depends on N32H7_ATIM4_CH4OUT + range 0 11 + ---help--- + ATIM4 Channel 4 mode. See enum n32_pwm_chanmode_e. + +config N32H7_ATIM4_CH4POL + int "ATIM4 Channel 4 Polarity" + default 0 + range 0 1 + depends on N32H7_ATIM4_CH4OUT + ---help--- + ATIM4 Channel 4 output polarity: 0=active high, 1=active low. + +config N32H7_ATIM4_CH4IDLE + int "ATIM4 Channel 4 Idle State" + default 0 + range 0 1 + depends on N32H7_ATIM4_CH4OUT + ---help--- + ATIM4 Channel 4 idle state: 0=inactive, 1=active. + +config N32H7_ATIM4_CH4NOUT + bool "ATIM4 Channel 4 Complementary Output Enable" + default n + depends on N32H7_ATIM4_CH4OUT + ---help--- + Enable complementary output for ATIM4 Channel 4. + +config N32H7_ATIM4_CH4NPOL + int "ATIM4 Channel 4 Complementary Polarity" + default 0 + range 0 1 + depends on N32H7_ATIM4_CH4NOUT + ---help--- + ATIM4 Channel 4 complementary polarity: 0=active high, 1=active low. + +config N32H7_ATIM4_CH4NIDLE + int "ATIM4 Channel 4 Complementary Idle State" + default 0 + range 0 1 + depends on N32H7_ATIM4_CH4NOUT + ---help--- + ATIM4 Channel 4 complementary idle state: 0=inactive, 1=active. + +endif # N32H7_ATIM4_CHANNEL4 + +endif # N32H7_PWM_MULTICHAN + +if N32H7_PWM_MULTICHAN = n + +config N32H7_ATIM4_CHANNEL + int "ATIM4 PWM Output Channel" + default 1 + range 1 4 + ---help--- + If ATIM4 is enabled for PWM, specifies the timer output channel {1..4}. + +config N32H7_ATIM4_CHMODE + int "ATIM4 Channel Mode" + default 6 + range 0 11 + ---help--- + ATIM4 channel mode. See enum n32_pwm_chanmode_e. + +endif # N32H7_PWM_MULTICHAN = n + +endif # N32H7_ATIM4_PWM + +config N32H7_ATIM4_QE + bool "ATIM4 Quadrature Encoder" + default n + depends on SENSORS_QENCODER + ---help--- + Reserve ATIM4 for use as a quadrature encoder interface. + +endif # N32H7_ATIM4 + +endif # N32H7_TIMER_ADVANCED + +if N32H7_TIMER_GTIMA + +config N32H7_GTIMA1 + bool "GTIMA1" + default n + ---help--- + Enable General-purpose Timer A GTIMA1. + +if N32H7_GTIMA1 + +config N32H7_GTIMA1_PWM + bool "GTIMA1 PWM" + default n + depends on N32H7_PWM + ---help--- + Reserve GTIMA1 for use by PWM. + +if N32H7_GTIMA1_PWM + +config N32H7_GTIMA1_MODE + int "GTIMA1 Mode" + default 0 + range 0 4 + ---help--- + Specifies the GTIMA1 timer mode: 0=up, 1=down, 2=center1, 3=center2, 4=center3. + +if N32H7_PWM_MULTICHAN + +config N32H7_GTIMA1_CHANNEL1 + bool "GTIMA1 Channel 1" + default n + +if N32H7_GTIMA1_CHANNEL1 + +config N32H7_GTIMA1_CH1OUT + bool "GTIMA1 Channel 1 Output Enable" + default N32H7_GTIMA1_CHANNEL1 + ---help--- + Enable output for GTIMA1 Channel 1. If disabled, the channel will not be used. + +config N32H7_GTIMA1_CH1MODE + int "GTIMA1 Channel 1 Mode" + default 6 + depends on N32H7_GTIMA1_CH1OUT + range 0 9 + ---help--- + GTIMA1 Channel 1 mode. See enum n32_pwm_chanmode_e. + +config N32H7_GTIMA1_CH1POL + int "GTIMA1 Channel 1 Polarity" + default 0 + range 0 1 + depends on N32H7_GTIMA1_CH1OUT + ---help--- + GTIMA1 Channel 1 output polarity: 0=active high, 1=active low. + +config N32H7_GTIMA1_CH1IDLE + int "GTIMA1 Channel 1 Idle State" + default 0 + range 0 1 + depends on N32H7_GTIMA1_CH1OUT + ---help--- + GTIMA1 Channel 1 idle state: 0=inactive, 1=active. + +endif # N32H7_GTIMA1_CHANNEL1 + +config N32H7_GTIMA1_CHANNEL2 + bool "GTIMA1 Channel 2" + default n + +if N32H7_GTIMA1_CHANNEL2 + +config N32H7_GTIMA1_CH2OUT + bool "GTIMA1 Channel 2 Output Enable" + default N32H7_GTIMA1_CHANNEL2 + ---help--- + Enable output for GTIMA1 Channel 2. If disabled, the channel will not be used. + +config N32H7_GTIMA1_CH2MODE + int "GTIMA1 Channel 2 Mode" + default 6 + depends on N32H7_GTIMA1_CH2OUT + range 0 9 + ---help--- + GTIMA1 Channel 2 mode. See enum n32_pwm_chanmode_e. + +config N32H7_GTIMA1_CH2POL + int "GTIMA1 Channel 2 Polarity" + default 0 + range 0 1 + depends on N32H7_GTIMA1_CH2OUT + ---help--- + GTIMA1 Channel 2 output polarity: 0=active high, 1=active low. + +config N32H7_GTIMA1_CH2IDLE + int "GTIMA1 Channel 2 Idle State" + default 0 + range 0 1 + depends on N32H7_GTIMA1_CH2OUT + ---help--- + GTIMA1 Channel 2 idle state: 0=inactive, 1=active. + +endif # N32H7_GTIMA1_CHANNEL2 + +config N32H7_GTIMA1_CHANNEL3 + bool "GTIMA1 Channel 3" + default n + +if N32H7_GTIMA1_CHANNEL3 + +config N32H7_GTIMA1_CH3OUT + bool "GTIMA1 Channel 3 Output Enable" + default N32H7_GTIMA1_CHANNEL3 + ---help--- + Enable output for GTIMA1 Channel 3. If disabled, the channel will not be used. + +config N32H7_GTIMA1_CH3MODE + int "GTIMA1 Channel 3 Mode" + default 6 + depends on N32H7_GTIMA1_CH3OUT + range 0 9 + ---help--- + GTIMA1 Channel 3 mode. See enum n32_pwm_chanmode_e. + +config N32H7_GTIMA1_CH3POL + int "GTIMA1 Channel 3 Polarity" + default 0 + range 0 1 + depends on N32H7_GTIMA1_CH3OUT + ---help--- + GTIMA1 Channel 3 output polarity: 0=active high, 1=active low. + +config N32H7_GTIMA1_CH3IDLE + int "GTIMA1 Channel 3 Idle State" + default 0 + range 0 1 + depends on N32H7_GTIMA1_CH3OUT + ---help--- + GTIMA1 Channel 3 idle state: 0=inactive, 1=active. + +endif # N32H7_GTIMA1_CHANNEL3 + +config N32H7_GTIMA1_CHANNEL4 + bool "GTIMA1 Channel 4" + default n + +if N32H7_GTIMA1_CHANNEL4 + +config N32H7_GTIMA1_CH4OUT + bool "GTIMA1 Channel 4 Output Enable" + default N32H7_GTIMA1_CHANNEL4 + ---help--- + Enable output for GTIMA1 Channel 4. If disabled, the channel will not be used. + +config N32H7_GTIMA1_CH4MODE + int "GTIMA1 Channel 4 Mode" + default 6 + depends on N32H7_GTIMA1_CH4OUT + range 0 9 + ---help--- + GTIMA1 Channel 4 mode. See enum n32_pwm_chanmode_e. + +config N32H7_GTIMA1_CH4POL + int "GTIMA1 Channel 4 Polarity" + default 0 + range 0 1 + depends on N32H7_GTIMA1_CH4OUT + ---help--- + GTIMA1 Channel 4 output polarity: 0=active high, 1=active low. + +config N32H7_GTIMA1_CH4IDLE + int "GTIMA1 Channel 4 Idle State" + default 0 + range 0 1 + depends on N32H7_GTIMA1_CH4OUT + ---help--- + GTIMA1 Channel 4 idle state: 0=inactive, 1=active. + +endif # N32H7_GTIMA1_CHANNEL4 + +endif # N32H7_PWM_MULTICHAN + +if N32H7_PWM_MULTICHAN = n + +config N32H7_GTIMA1_CHANNEL + int "GTIMA1 PWM Output Channel" + default 1 + range 1 4 + ---help--- + If GTIMA1 is enabled for PWM, specifies the timer output channel {1..4}. + +config N32H7_GTIMA1_CHMODE + int "GTIMA1 Channel Mode" + default 6 + range 0 9 + ---help--- + GTIMA1 channel mode. See enum n32_pwm_chanmode_e. + +endif # N32H7_PWM_MULTICHAN = n + +endif # N32H7_GTIMA1_PWM + +config N32H7_GTIMA1_QE + bool "GTIMA1 Quadrature Encoder" + default n + depends on SENSORS_QENCODER + ---help--- + Reserve GTIMA1 for use as a quadrature encoder interface. + +endif # N32H7_GTIMA1 + +config N32H7_GTIMA2 + bool "GTIMA2" + default n + ---help--- + Enable General-purpose Timer A GTIMA2. + +if N32H7_GTIMA2 + +config N32H7_GTIMA2_PWM + bool "GTIMA2 PWM" + default n + depends on N32H7_PWM + ---help--- + Reserve GTIMA2 for use by PWM. + +if N32H7_GTIMA2_PWM + +config N32H7_GTIMA2_MODE + int "GTIMA2 Mode" + default 0 + range 0 4 + ---help--- + Specifies the GTIMA2 timer mode: 0=up, 1=down, 2=center1, 3=center2, 4=center3. + +if N32H7_PWM_MULTICHAN + +config N32H7_GTIMA2_CHANNEL1 + bool "GTIMA2 Channel 1" + default n + +if N32H7_GTIMA2_CHANNEL1 + +config N32H7_GTIMA2_CH1OUT + bool "GTIMA2 Channel 1 Output Enable" + default N32H7_GTIMA2_CHANNEL1 + ---help--- + Enable output for GTIMA2 Channel 1. If disabled, the channel will not be used. + +config N32H7_GTIMA2_CH1MODE + int "GTIMA2 Channel 1 Mode" + default 6 + depends on N32H7_GTIMA2_CH1OUT + range 0 9 + ---help--- + GTIMA2 Channel 1 mode. See enum n32_pwm_chanmode_e. + +config N32H7_GTIMA2_CH1POL + int "GTIMA2 Channel 1 Polarity" + default 0 + range 0 1 + depends on N32H7_GTIMA2_CH1OUT + ---help--- + GTIMA2 Channel 1 output polarity: 0=active high, 1=active low. + +config N32H7_GTIMA2_CH1IDLE + int "GTIMA2 Channel 1 Idle State" + default 0 + range 0 1 + depends on N32H7_GTIMA2_CH1OUT + ---help--- + GTIMA2 Channel 1 idle state: 0=inactive, 1=active. + +endif # N32H7_GTIMA2_CHANNEL1 + +config N32H7_GTIMA2_CHANNEL2 + bool "GTIMA2 Channel 2" + default n + +if N32H7_GTIMA2_CHANNEL2 + +config N32H7_GTIMA2_CH2OUT + bool "GTIMA2 Channel 2 Output Enable" + default N32H7_GTIMA2_CHANNEL2 + ---help--- + Enable output for GTIMA2 Channel 2. If disabled, the channel will not be used. + +config N32H7_GTIMA2_CH2MODE + int "GTIMA2 Channel 2 Mode" + default 6 + depends on N32H7_GTIMA2_CH2OUT + range 0 9 + ---help--- + GTIMA2 Channel 2 mode. See enum n32_pwm_chanmode_e. + +config N32H7_GTIMA2_CH2POL + int "GTIMA2 Channel 2 Polarity" + default 0 + range 0 1 + depends on N32H7_GTIMA2_CH2OUT + ---help--- + GTIMA2 Channel 2 output polarity: 0=active high, 1=active low. + +config N32H7_GTIMA2_CH2IDLE + int "GTIMA2 Channel 2 Idle State" + default 0 + range 0 1 + depends on N32H7_GTIMA2_CH2OUT + ---help--- + GTIMA2 Channel 2 idle state: 0=inactive, 1=active. + +endif # N32H7_GTIMA2_CHANNEL2 + +config N32H7_GTIMA2_CHANNEL3 + bool "GTIMA2 Channel 3" + default n + +if N32H7_GTIMA2_CHANNEL3 + +config N32H7_GTIMA2_CH3OUT + bool "GTIMA2 Channel 3 Output Enable" + default N32H7_GTIMA2_CHANNEL3 + ---help--- + Enable output for GTIMA2 Channel 3. If disabled, the channel will not be used. + +config N32H7_GTIMA2_CH3MODE + int "GTIMA2 Channel 3 Mode" + default 6 + depends on N32H7_GTIMA2_CH3OUT + range 0 9 + ---help--- + GTIMA2 Channel 3 mode. See enum n32_pwm_chanmode_e. + +config N32H7_GTIMA2_CH3POL + int "GTIMA2 Channel 3 Polarity" + default 0 + range 0 1 + depends on N32H7_GTIMA2_CH3OUT + ---help--- + GTIMA2 Channel 3 output polarity: 0=active high, 1=active low. + +config N32H7_GTIMA2_CH3IDLE + int "GTIMA2 Channel 3 Idle State" + default 0 + range 0 1 + depends on N32H7_GTIMA2_CH3OUT + ---help--- + GTIMA2 Channel 3 idle state: 0=inactive, 1=active. + +endif # N32H7_GTIMA2_CHANNEL3 + +config N32H7_GTIMA2_CHANNEL4 + bool "GTIMA2 Channel 4" + default n + +if N32H7_GTIMA2_CHANNEL4 + +config N32H7_GTIMA2_CH4OUT + bool "GTIMA2 Channel 4 Output Enable" + default N32H7_GTIMA2_CHANNEL4 + ---help--- + Enable output for GTIMA2 Channel 4. If disabled, the channel will not be used. + +config N32H7_GTIMA2_CH4MODE + int "GTIMA2 Channel 4 Mode" + default 6 + depends on N32H7_GTIMA2_CH4OUT + range 0 9 + ---help--- + GTIMA2 Channel 4 mode. See enum n32_pwm_chanmode_e. + +config N32H7_GTIMA2_CH4POL + int "GTIMA2 Channel 4 Polarity" + default 0 + range 0 1 + depends on N32H7_GTIMA2_CH4OUT + ---help--- + GTIMA2 Channel 4 output polarity: 0=active high, 1=active low. + +config N32H7_GTIMA2_CH4IDLE + int "GTIMA2 Channel 4 Idle State" + default 0 + range 0 1 + depends on N32H7_GTIMA2_CH4OUT + ---help--- + GTIMA2 Channel 4 idle state: 0=inactive, 1=active. + +endif # N32H7_GTIMA2_CHANNEL4 + +endif # N32H7_PWM_MULTICHAN + +if N32H7_PWM_MULTICHAN = n + +config N32H7_GTIMA2_CHANNEL + int "GTIMA2 PWM Output Channel" + default 1 + range 1 4 + ---help--- + If GTIMA2 is enabled for PWM, specifies the timer output channel {1..4}. + +config N32H7_GTIMA2_CHMODE + int "GTIMA2 Channel Mode" + default 6 + range 0 9 + ---help--- + GTIMA2 channel mode. See enum n32_pwm_chanmode_e. + +endif # N32H7_PWM_MULTICHAN = n + +endif # N32H7_GTIMA2_PWM + +config N32H7_GTIMA2_QE + bool "GTIMA2 Quadrature Encoder" + default n + depends on SENSORS_QENCODER + ---help--- + Reserve GTIMA2 for use as a quadrature encoder interface. + +endif # N32H7_GTIMA2 + +config N32H7_GTIMA3 + bool "GTIMA3" + default n + ---help--- + Enable General-purpose Timer A GTIMA3. + +if N32H7_GTIMA3 + +config N32H7_GTIMA3_PWM + bool "GTIMA3 PWM" + default n + depends on N32H7_PWM + ---help--- + Reserve GTIMA3 for use by PWM. + +if N32H7_GTIMA3_PWM + +config N32H7_GTIMA3_MODE + int "GTIMA3 Mode" + default 0 + range 0 4 + ---help--- + Specifies the GTIMA3 timer mode: 0=up, 1=down, 2=center1, 3=center2, 4=center3. + +if N32H7_PWM_MULTICHAN + +config N32H7_GTIMA3_CHANNEL1 + bool "GTIMA3 Channel 1" + default n + +if N32H7_GTIMA3_CHANNEL1 + +config N32H7_GTIMA3_CH1OUT + bool "GTIMA3 Channel 1 Output Enable" + default N32H7_GTIMA3_CHANNEL1 + ---help--- + Enable output for GTIMA3 Channel 1. If disabled, the channel will not be used. + +config N32H7_GTIMA3_CH1MODE + int "GTIMA3 Channel 1 Mode" + default 6 + depends on N32H7_GTIMA3_CH1OUT + range 0 9 + ---help--- + GTIMA3 Channel 1 mode. See enum n32_pwm_chanmode_e. + +config N32H7_GTIMA3_CH1POL + int "GTIMA3 Channel 1 Polarity" + default 0 + range 0 1 + depends on N32H7_GTIMA3_CH1OUT + ---help--- + GTIMA3 Channel 1 output polarity: 0=active high, 1=active low. + +config N32H7_GTIMA3_CH1IDLE + int "GTIMA3 Channel 1 Idle State" + default 0 + range 0 1 + depends on N32H7_GTIMA3_CH1OUT + ---help--- + GTIMA3 Channel 1 idle state: 0=inactive, 1=active. + +endif # N32H7_GTIMA3_CHANNEL1 + +config N32H7_GTIMA3_CHANNEL2 + bool "GTIMA3 Channel 2" + default n + +if N32H7_GTIMA3_CHANNEL2 + +config N32H7_GTIMA3_CH2OUT + bool "GTIMA3 Channel 2 Output Enable" + default N32H7_GTIMA3_CHANNEL2 + ---help--- + Enable output for GTIMA3 Channel 2. If disabled, the channel will not be used. + +config N32H7_GTIMA3_CH2MODE + int "GTIMA3 Channel 2 Mode" + default 6 + depends on N32H7_GTIMA3_CH2OUT + range 0 9 + ---help--- + GTIMA3 Channel 2 mode. See enum n32_pwm_chanmode_e. + +config N32H7_GTIMA3_CH2POL + int "GTIMA3 Channel 2 Polarity" + default 0 + range 0 1 + depends on N32H7_GTIMA3_CH2OUT + ---help--- + GTIMA3 Channel 2 output polarity: 0=active high, 1=active low. + +config N32H7_GTIMA3_CH2IDLE + int "GTIMA3 Channel 2 Idle State" + default 0 + range 0 1 + depends on N32H7_GTIMA3_CH2OUT + ---help--- + GTIMA3 Channel 2 idle state: 0=inactive, 1=active. + +endif # N32H7_GTIMA3_CHANNEL2 + +config N32H7_GTIMA3_CHANNEL3 + bool "GTIMA3 Channel 3" + default n + +if N32H7_GTIMA3_CHANNEL3 + +config N32H7_GTIMA3_CH3OUT + bool "GTIMA3 Channel 3 Output Enable" + default N32H7_GTIMA3_CHANNEL3 + ---help--- + Enable output for GTIMA3 Channel 3. If disabled, the channel will not be used. + +config N32H7_GTIMA3_CH3MODE + int "GTIMA3 Channel 3 Mode" + default 6 + depends on N32H7_GTIMA3_CH3OUT + range 0 9 + ---help--- + GTIMA3 Channel 3 mode. See enum n32_pwm_chanmode_e. + +config N32H7_GTIMA3_CH3POL + int "GTIMA3 Channel 3 Polarity" + default 0 + range 0 1 + depends on N32H7_GTIMA3_CH3OUT + ---help--- + GTIMA3 Channel 3 output polarity: 0=active high, 1=active low. + +config N32H7_GTIMA3_CH3IDLE + int "GTIMA3 Channel 3 Idle State" + default 0 + range 0 1 + depends on N32H7_GTIMA3_CH3OUT + ---help--- + GTIMA3 Channel 3 idle state: 0=inactive, 1=active. + +endif # N32H7_GTIMA3_CHANNEL3 + +config N32H7_GTIMA3_CHANNEL4 + bool "GTIMA3 Channel 4" + default n + +if N32H7_GTIMA3_CHANNEL4 + +config N32H7_GTIMA3_CH4OUT + bool "GTIMA3 Channel 4 Output Enable" + default N32H7_GTIMA3_CHANNEL4 + ---help--- + Enable output for GTIMA3 Channel 4. If disabled, the channel will not be used. + +config N32H7_GTIMA3_CH4MODE + int "GTIMA3 Channel 4 Mode" + default 6 + depends on N32H7_GTIMA3_CH4OUT + range 0 9 + ---help--- + GTIMA3 Channel 4 mode. See enum n32_pwm_chanmode_e. + +config N32H7_GTIMA3_CH4POL + int "GTIMA3 Channel 4 Polarity" + default 0 + range 0 1 + depends on N32H7_GTIMA3_CH4OUT + ---help--- + GTIMA3 Channel 4 output polarity: 0=active high, 1=active low. + +config N32H7_GTIMA3_CH4IDLE + int "GTIMA3 Channel 4 Idle State" + default 0 + range 0 1 + depends on N32H7_GTIMA3_CH4OUT + ---help--- + GTIMA3 Channel 4 idle state: 0=inactive, 1=active. + +endif # N32H7_GTIMA3_CHANNEL4 + +endif # N32H7_PWM_MULTICHAN + +if N32H7_PWM_MULTICHAN = n + +config N32H7_GTIMA3_CHANNEL + int "GTIMA3 PWM Output Channel" + default 1 + range 1 4 + ---help--- + If GTIMA3 is enabled for PWM, specifies the timer output channel {1..4}. + +config N32H7_GTIMA3_CHMODE + int "GTIMA3 Channel Mode" + default 6 + range 0 9 + ---help--- + GTIMA3 channel mode. See enum n32_pwm_chanmode_e. + +endif # N32H7_PWM_MULTICHAN = n + +endif # N32H7_GTIMA3_PWM + +config N32H7_GTIMA3_QE + bool "GTIMA3 Quadrature Encoder" + default n + depends on SENSORS_QENCODER + ---help--- + Reserve GTIMA3 for use as a quadrature encoder interface. + +endif # N32H7_GTIMA3 + +config N32H7_GTIMA4 + bool "GTIMA4" + default n + ---help--- + Enable General-purpose Timer A GTIMA4. + +if N32H7_GTIMA4 + +config N32H7_GTIMA4_PWM + bool "GTIMA4 PWM" + default n + depends on N32H7_PWM + ---help--- + Reserve GTIMA4 for use by PWM. + +if N32H7_GTIMA4_PWM + +config N32H7_GTIMA4_MODE + int "GTIMA4 Mode" + default 0 + range 0 4 + ---help--- + Specifies the GTIMA4 timer mode: 0=up, 1=down, 2=center1, 3=center2, 4=center3. + +if N32H7_PWM_MULTICHAN + +config N32H7_GTIMA4_CHANNEL1 + bool "GTIMA4 Channel 1" + default n + +if N32H7_GTIMA4_CHANNEL1 + +config N32H7_GTIMA4_CH1OUT + bool "GTIMA4 Channel 1 Output Enable" + default N32H7_GTIMA4_CHANNEL1 + ---help--- + Enable output for GTIMA4 Channel 1. If disabled, the channel will not be used. + +config N32H7_GTIMA4_CH1MODE + int "GTIMA4 Channel 1 Mode" + default 6 + depends on N32H7_GTIMA4_CH1OUT + range 0 9 + ---help--- + GTIMA4 Channel 1 mode. See enum n32_pwm_chanmode_e. + +config N32H7_GTIMA4_CH1POL + int "GTIMA4 Channel 1 Polarity" + default 0 + range 0 1 + depends on N32H7_GTIMA4_CH1OUT + ---help--- + GTIMA4 Channel 1 output polarity: 0=active high, 1=active low. + +config N32H7_GTIMA4_CH1IDLE + int "GTIMA4 Channel 1 Idle State" + default 0 + range 0 1 + depends on N32H7_GTIMA4_CH1OUT + ---help--- + GTIMA4 Channel 1 idle state: 0=inactive, 1=active. + +endif # N32H7_GTIMA4_CHANNEL1 + +config N32H7_GTIMA4_CHANNEL2 + bool "GTIMA4 Channel 2" + default n + +if N32H7_GTIMA4_CHANNEL2 + +config N32H7_GTIMA4_CH2OUT + bool "GTIMA4 Channel 2 Output Enable" + default N32H7_GTIMA4_CHANNEL2 + ---help--- + Enable output for GTIMA4 Channel 2. If disabled, the channel will not be used. + +config N32H7_GTIMA4_CH2MODE + int "GTIMA4 Channel 2 Mode" + default 6 + depends on N32H7_GTIMA4_CH2OUT + range 0 9 + ---help--- + GTIMA4 Channel 2 mode. See enum n32_pwm_chanmode_e. + +config N32H7_GTIMA4_CH2POL + int "GTIMA4 Channel 2 Polarity" + default 0 + range 0 1 + depends on N32H7_GTIMA4_CH2OUT + ---help--- + GTIMA4 Channel 2 output polarity: 0=active high, 1=active low. + +config N32H7_GTIMA4_CH2IDLE + int "GTIMA4 Channel 2 Idle State" + default 0 + range 0 1 + depends on N32H7_GTIMA4_CH2OUT + ---help--- + GTIMA4 Channel 2 idle state: 0=inactive, 1=active. + +endif # N32H7_GTIMA4_CHANNEL2 + +config N32H7_GTIMA4_CHANNEL3 + bool "GTIMA4 Channel 3" + default n + +if N32H7_GTIMA4_CHANNEL3 + +config N32H7_GTIMA4_CH3OUT + bool "GTIMA4 Channel 3 Output Enable" + default N32H7_GTIMA4_CHANNEL3 + ---help--- + Enable output for GTIMA4 Channel 3. If disabled, the channel will not be used. + +config N32H7_GTIMA4_CH3MODE + int "GTIMA4 Channel 3 Mode" + default 6 + depends on N32H7_GTIMA4_CH3OUT + range 0 9 + ---help--- + GTIMA4 Channel 3 mode. See enum n32_pwm_chanmode_e. + +config N32H7_GTIMA4_CH3POL + int "GTIMA4 Channel 3 Polarity" + default 0 + range 0 1 + depends on N32H7_GTIMA4_CH3OUT + ---help--- + GTIMA4 Channel 3 output polarity: 0=active high, 1=active low. + +config N32H7_GTIMA4_CH3IDLE + int "GTIMA4 Channel 3 Idle State" + default 0 + range 0 1 + depends on N32H7_GTIMA4_CH3OUT + ---help--- + GTIMA4 Channel 3 idle state: 0=inactive, 1=active. + +endif # N32H7_GTIMA4_CHANNEL3 + +config N32H7_GTIMA4_CHANNEL4 + bool "GTIMA4 Channel 4" + default n + +if N32H7_GTIMA4_CHANNEL4 + +config N32H7_GTIMA4_CH4OUT + bool "GTIMA4 Channel 4 Output Enable" + default N32H7_GTIMA4_CHANNEL4 + ---help--- + Enable output for GTIMA4 Channel 4. If disabled, the channel will not be used. + +config N32H7_GTIMA4_CH4MODE + int "GTIMA4 Channel 4 Mode" + default 6 + depends on N32H7_GTIMA4_CH4OUT + range 0 9 + ---help--- + GTIMA4 Channel 4 mode. See enum n32_pwm_chanmode_e. + +config N32H7_GTIMA4_CH4POL + int "GTIMA4 Channel 4 Polarity" + default 0 + range 0 1 + depends on N32H7_GTIMA4_CH4OUT + ---help--- + GTIMA4 Channel 4 output polarity: 0=active high, 1=active low. + +config N32H7_GTIMA4_CH4IDLE + int "GTIMA4 Channel 4 Idle State" + default 0 + range 0 1 + depends on N32H7_GTIMA4_CH4OUT + ---help--- + GTIMA4 Channel 4 idle state: 0=inactive, 1=active. + +endif # N32H7_GTIMA4_CHANNEL4 + +endif # N32H7_PWM_MULTICHAN + +if N32H7_PWM_MULTICHAN = n + +config N32H7_GTIMA4_CHANNEL + int "GTIMA4 PWM Output Channel" + default 1 + range 1 4 + ---help--- + If GTIMA4 is enabled for PWM, specifies the timer output channel {1..4}. + +config N32H7_GTIMA4_CHMODE + int "GTIMA4 Channel Mode" + default 6 + range 0 9 + ---help--- + GTIMA4 channel mode. See enum n32_pwm_chanmode_e. + +endif # N32H7_PWM_MULTICHAN = n + +endif # N32H7_GTIMA4_PWM + +config N32H7_GTIMA4_QE + bool "GTIMA4 Quadrature Encoder" + default n + depends on SENSORS_QENCODER + ---help--- + Reserve GTIMA4 for use as a quadrature encoder interface. + +endif # N32H7_GTIMA4 + +config N32H7_GTIMA5 + bool "GTIMA5" + default n + ---help--- + Enable General-purpose Timer A GTIMA5. + +if N32H7_GTIMA5 + +config N32H7_GTIMA5_PWM + bool "GTIMA5 PWM" + default n + depends on N32H7_PWM + ---help--- + Reserve GTIMA5 for use by PWM. + +if N32H7_GTIMA5_PWM + +config N32H7_GTIMA5_MODE + int "GTIMA5 Mode" + default 0 + range 0 4 + ---help--- + Specifies the GTIMA5 timer mode: 0=up, 1=down, 2=center1, 3=center2, 4=center3. + +if N32H7_PWM_MULTICHAN + +config N32H7_GTIMA5_CHANNEL1 + bool "GTIMA5 Channel 1" + default n + +if N32H7_GTIMA5_CHANNEL1 + +config N32H7_GTIMA5_CH1OUT + bool "GTIMA5 Channel 1 Output Enable" + default N32H7_GTIMA5_CHANNEL1 + ---help--- + Enable output for GTIMA5 Channel 1. If disabled, the channel will not be used. + +config N32H7_GTIMA5_CH1MODE + int "GTIMA5 Channel 1 Mode" + default 6 + depends on N32H7_GTIMA5_CH1OUT + range 0 9 + ---help--- + GTIMA5 Channel 1 mode. See enum n32_pwm_chanmode_e. + +config N32H7_GTIMA5_CH1POL + int "GTIMA5 Channel 1 Polarity" + default 0 + range 0 1 + depends on N32H7_GTIMA5_CH1OUT + ---help--- + GTIMA5 Channel 1 output polarity: 0=active high, 1=active low. + +config N32H7_GTIMA5_CH1IDLE + int "GTIMA5 Channel 1 Idle State" + default 0 + range 0 1 + depends on N32H7_GTIMA5_CH1OUT + ---help--- + GTIMA5 Channel 1 idle state: 0=inactive, 1=active. + +endif # N32H7_GTIMA5_CHANNEL1 + +config N32H7_GTIMA5_CHANNEL2 + bool "GTIMA5 Channel 2" + default n + +if N32H7_GTIMA5_CHANNEL2 + +config N32H7_GTIMA5_CH2OUT + bool "GTIMA5 Channel 2 Output Enable" + default N32H7_GTIMA5_CHANNEL2 + ---help--- + Enable output for GTIMA5 Channel 2. If disabled, the channel will not be used. + +config N32H7_GTIMA5_CH2MODE + int "GTIMA5 Channel 2 Mode" + default 6 + depends on N32H7_GTIMA5_CH2OUT + range 0 9 + ---help--- + GTIMA5 Channel 2 mode. See enum n32_pwm_chanmode_e. + +config N32H7_GTIMA5_CH2POL + int "GTIMA5 Channel 2 Polarity" + default 0 + range 0 1 + depends on N32H7_GTIMA5_CH2OUT + ---help--- + GTIMA5 Channel 2 output polarity: 0=active high, 1=active low. + +config N32H7_GTIMA5_CH2IDLE + int "GTIMA5 Channel 2 Idle State" + default 0 + range 0 1 + depends on N32H7_GTIMA5_CH2OUT + ---help--- + GTIMA5 Channel 2 idle state: 0=inactive, 1=active. + +endif # N32H7_GTIMA5_CHANNEL2 + +config N32H7_GTIMA5_CHANNEL3 + bool "GTIMA5 Channel 3" + default n + +if N32H7_GTIMA5_CHANNEL3 + +config N32H7_GTIMA5_CH3OUT + bool "GTIMA5 Channel 3 Output Enable" + default N32H7_GTIMA5_CHANNEL3 + ---help--- + Enable output for GTIMA5 Channel 3. If disabled, the channel will not be used. + +config N32H7_GTIMA5_CH3MODE + int "GTIMA5 Channel 3 Mode" + default 6 + depends on N32H7_GTIMA5_CH3OUT + range 0 9 + ---help--- + GTIMA5 Channel 3 mode. See enum n32_pwm_chanmode_e. + +config N32H7_GTIMA5_CH3POL + int "GTIMA5 Channel 3 Polarity" + default 0 + range 0 1 + depends on N32H7_GTIMA5_CH3OUT + ---help--- + GTIMA5 Channel 3 output polarity: 0=active high, 1=active low. + +config N32H7_GTIMA5_CH3IDLE + int "GTIMA5 Channel 3 Idle State" + default 0 + range 0 1 + depends on N32H7_GTIMA5_CH3OUT + ---help--- + GTIMA5 Channel 3 idle state: 0=inactive, 1=active. + +endif # N32H7_GTIMA5_CHANNEL3 + +config N32H7_GTIMA5_CHANNEL4 + bool "GTIMA5 Channel 4" + default n + +if N32H7_GTIMA5_CHANNEL4 + +config N32H7_GTIMA5_CH4OUT + bool "GTIMA5 Channel 4 Output Enable" + default N32H7_GTIMA5_CHANNEL4 + ---help--- + Enable output for GTIMA5 Channel 4. If disabled, the channel will not be used. + +config N32H7_GTIMA5_CH4MODE + int "GTIMA5 Channel 4 Mode" + default 6 + depends on N32H7_GTIMA5_CH4OUT + range 0 9 + ---help--- + GTIMA5 Channel 4 mode. See enum n32_pwm_chanmode_e. + +config N32H7_GTIMA5_CH4POL + int "GTIMA5 Channel 4 Polarity" + default 0 + range 0 1 + depends on N32H7_GTIMA5_CH4OUT + ---help--- + GTIMA5 Channel 4 output polarity: 0=active high, 1=active low. + +config N32H7_GTIMA5_CH4IDLE + int "GTIMA5 Channel 4 Idle State" + default 0 + range 0 1 + depends on N32H7_GTIMA5_CH4OUT + ---help--- + GTIMA5 Channel 4 idle state: 0=inactive, 1=active. + +endif # N32H7_GTIMA5_CHANNEL4 + +endif # N32H7_PWM_MULTICHAN + +if N32H7_PWM_MULTICHAN = n + +config N32H7_GTIMA5_CHANNEL + int "GTIMA5 PWM Output Channel" + default 1 + range 1 4 + ---help--- + If GTIMA5 is enabled for PWM, specifies the timer output channel {1..4}. + +config N32H7_GTIMA5_CHMODE + int "GTIMA5 Channel Mode" + default 6 + range 0 9 + ---help--- + GTIMA5 channel mode. See enum n32_pwm_chanmode_e. + +endif # N32H7_PWM_MULTICHAN = n + +endif # N32H7_GTIMA5_PWM + +config N32H7_GTIMA5_QE + bool "GTIMA5 Quadrature Encoder" + default n + depends on SENSORS_QENCODER + ---help--- + Reserve GTIMA5 for use as a quadrature encoder interface. + +endif # N32H7_GTIMA5 + +config N32H7_GTIMA6 + bool "GTIMA6" + default n + ---help--- + Enable General-purpose Timer A GTIMA6. + +if N32H7_GTIMA6 + +config N32H7_GTIMA6_PWM + bool "GTIMA6 PWM" + default n + depends on N32H7_PWM + ---help--- + Reserve GTIMA6 for use by PWM. + +if N32H7_GTIMA6_PWM + +config N32H7_GTIMA6_MODE + int "GTIMA6 Mode" + default 0 + range 0 4 + ---help--- + Specifies the GTIMA6 timer mode: 0=up, 1=down, 2=center1, 3=center2, 4=center3. + +if N32H7_PWM_MULTICHAN + +config N32H7_GTIMA6_CHANNEL1 + bool "GTIMA6 Channel 1" + default n + +if N32H7_GTIMA6_CHANNEL1 + +config N32H7_GTIMA6_CH1OUT + bool "GTIMA6 Channel 1 Output Enable" + default N32H7_GTIMA6_CHANNEL1 + ---help--- + Enable output for GTIMA6 Channel 1. If disabled, the channel will not be used. + +config N32H7_GTIMA6_CH1MODE + int "GTIMA6 Channel 1 Mode" + default 6 + depends on N32H7_GTIMA6_CH1OUT + range 0 9 + ---help--- + GTIMA6 Channel 1 mode. See enum n32_pwm_chanmode_e. + +config N32H7_GTIMA6_CH1POL + int "GTIMA6 Channel 1 Polarity" + default 0 + range 0 1 + depends on N32H7_GTIMA6_CH1OUT + ---help--- + GTIMA6 Channel 1 output polarity: 0=active high, 1=active low. + +config N32H7_GTIMA6_CH1IDLE + int "GTIMA6 Channel 1 Idle State" + default 0 + range 0 1 + depends on N32H7_GTIMA6_CH1OUT + ---help--- + GTIMA6 Channel 1 idle state: 0=inactive, 1=active. + +endif # N32H7_GTIMA6_CHANNEL1 + +config N32H7_GTIMA6_CHANNEL2 + bool "GTIMA6 Channel 2" + default n + +if N32H7_GTIMA6_CHANNEL2 + +config N32H7_GTIMA6_CH2OUT + bool "GTIMA6 Channel 2 Output Enable" + default N32H7_GTIMA6_CHANNEL2 + ---help--- + Enable output for GTIMA6 Channel 2. If disabled, the channel will not be used. + +config N32H7_GTIMA6_CH2MODE + int "GTIMA6 Channel 2 Mode" + default 6 + depends on N32H7_GTIMA6_CH2OUT + range 0 9 + ---help--- + GTIMA6 Channel 2 mode. See enum n32_pwm_chanmode_e. + +config N32H7_GTIMA6_CH2POL + int "GTIMA6 Channel 2 Polarity" + default 0 + range 0 1 + depends on N32H7_GTIMA6_CH2OUT + ---help--- + GTIMA6 Channel 2 output polarity: 0=active high, 1=active low. + +config N32H7_GTIMA6_CH2IDLE + int "GTIMA6 Channel 2 Idle State" + default 0 + range 0 1 + depends on N32H7_GTIMA6_CH2OUT + ---help--- + GTIMA6 Channel 2 idle state: 0=inactive, 1=active. + +endif # N32H7_GTIMA6_CHANNEL2 + +config N32H7_GTIMA6_CHANNEL3 + bool "GTIMA6 Channel 3" + default n + +if N32H7_GTIMA6_CHANNEL3 + +config N32H7_GTIMA6_CH3OUT + bool "GTIMA6 Channel 3 Output Enable" + default N32H7_GTIMA6_CHANNEL3 + ---help--- + Enable output for GTIMA6 Channel 3. If disabled, the channel will not be used. + +config N32H7_GTIMA6_CH3MODE + int "GTIMA6 Channel 3 Mode" + default 6 + depends on N32H7_GTIMA6_CH3OUT + range 0 9 + ---help--- + GTIMA6 Channel 3 mode. See enum n32_pwm_chanmode_e. + +config N32H7_GTIMA6_CH3POL + int "GTIMA6 Channel 3 Polarity" + default 0 + range 0 1 + depends on N32H7_GTIMA6_CH3OUT + ---help--- + GTIMA6 Channel 3 output polarity: 0=active high, 1=active low. + +config N32H7_GTIMA6_CH3IDLE + int "GTIMA6 Channel 3 Idle State" + default 0 + range 0 1 + depends on N32H7_GTIMA6_CH3OUT + ---help--- + GTIMA6 Channel 3 idle state: 0=inactive, 1=active. + +endif # N32H7_GTIMA6_CHANNEL3 + +config N32H7_GTIMA6_CHANNEL4 + bool "GTIMA6 Channel 4" + default n + +if N32H7_GTIMA6_CHANNEL4 + +config N32H7_GTIMA6_CH4OUT + bool "GTIMA6 Channel 4 Output Enable" + default N32H7_GTIMA6_CHANNEL4 + ---help--- + Enable output for GTIMA6 Channel 4. If disabled, the channel will not be used. + +config N32H7_GTIMA6_CH4MODE + int "GTIMA6 Channel 4 Mode" + default 6 + depends on N32H7_GTIMA6_CH4OUT + range 0 9 + ---help--- + GTIMA6 Channel 4 mode. See enum n32_pwm_chanmode_e. + +config N32H7_GTIMA6_CH4POL + int "GTIMA6 Channel 4 Polarity" + default 0 + range 0 1 + depends on N32H7_GTIMA6_CH4OUT + ---help--- + GTIMA6 Channel 4 output polarity: 0=active high, 1=active low. + +config N32H7_GTIMA6_CH4IDLE + int "GTIMA6 Channel 4 Idle State" + default 0 + range 0 1 + depends on N32H7_GTIMA6_CH4OUT + ---help--- + GTIMA6 Channel 4 idle state: 0=inactive, 1=active. + +endif # N32H7_GTIMA6_CHANNEL4 + +endif # N32H7_PWM_MULTICHAN + +if N32H7_PWM_MULTICHAN = n + +config N32H7_GTIMA6_CHANNEL + int "GTIMA6 PWM Output Channel" + default 1 + range 1 4 + ---help--- + If GTIMA6 is enabled for PWM, specifies the timer output channel {1..4}. + +config N32H7_GTIMA6_CHMODE + int "GTIMA6 Channel Mode" + default 6 + range 0 9 + ---help--- + GTIMA6 channel mode. See enum n32_pwm_chanmode_e. + +endif # N32H7_PWM_MULTICHAN = n + +endif # N32H7_GTIMA6_PWM + +config N32H7_GTIMA6_QE + bool "GTIMA6 Quadrature Encoder" + default n + depends on SENSORS_QENCODER + ---help--- + Reserve GTIMA6 for use as a quadrature encoder interface. + +endif # N32H7_GTIMA6 + +config N32H7_GTIMA7 + bool "GTIMA7" + default n + ---help--- + Enable General-purpose Timer A GTIMA7. + +if N32H7_GTIMA7 + +config N32H7_GTIMA7_PWM + bool "GTIMA7 PWM" + default n + depends on N32H7_PWM + ---help--- + Reserve GTIMA7 for use by PWM. + +if N32H7_GTIMA7_PWM + +config N32H7_GTIMA7_MODE + int "GTIMA7 Mode" + default 0 + range 0 4 + ---help--- + Specifies the GTIMA7 timer mode: 0=up, 1=down, 2=center1, 3=center2, 4=center3. + +if N32H7_PWM_MULTICHAN + +config N32H7_GTIMA7_CHANNEL1 + bool "GTIMA7 Channel 1" + default n + +if N32H7_GTIMA7_CHANNEL1 + +config N32H7_GTIMA7_CH1OUT + bool "GTIMA7 Channel 1 Output Enable" + default N32H7_GTIMA7_CHANNEL1 + ---help--- + Enable output for GTIMA7 Channel 1. If disabled, the channel will not be used. + +config N32H7_GTIMA7_CH1MODE + int "GTIMA7 Channel 1 Mode" + default 6 + depends on N32H7_GTIMA7_CH1OUT + range 0 9 + ---help--- + GTIMA7 Channel 1 mode. See enum n32_pwm_chanmode_e. + +config N32H7_GTIMA7_CH1POL + int "GTIMA7 Channel 1 Polarity" + default 0 + range 0 1 + depends on N32H7_GTIMA7_CH1OUT + ---help--- + GTIMA7 Channel 1 output polarity: 0=active high, 1=active low. + +config N32H7_GTIMA7_CH1IDLE + int "GTIMA7 Channel 1 Idle State" + default 0 + range 0 1 + depends on N32H7_GTIMA7_CH1OUT + ---help--- + GTIMA7 Channel 1 idle state: 0=inactive, 1=active. + +endif # N32H7_GTIMA7_CHANNEL1 + +config N32H7_GTIMA7_CHANNEL2 + bool "GTIMA7 Channel 2" + default n + +if N32H7_GTIMA7_CHANNEL2 + +config N32H7_GTIMA7_CH2OUT + bool "GTIMA7 Channel 2 Output Enable" + default N32H7_GTIMA7_CHANNEL2 + ---help--- + Enable output for GTIMA7 Channel 2. If disabled, the channel will not be used. + +config N32H7_GTIMA7_CH2MODE + int "GTIMA7 Channel 2 Mode" + default 6 + depends on N32H7_GTIMA7_CH2OUT + range 0 9 + ---help--- + GTIMA7 Channel 2 mode. See enum n32_pwm_chanmode_e. + +config N32H7_GTIMA7_CH2POL + int "GTIMA7 Channel 2 Polarity" + default 0 + range 0 1 + depends on N32H7_GTIMA7_CH2OUT + ---help--- + GTIMA7 Channel 2 output polarity: 0=active high, 1=active low. + +config N32H7_GTIMA7_CH2IDLE + int "GTIMA7 Channel 2 Idle State" + default 0 + range 0 1 + depends on N32H7_GTIMA7_CH2OUT + ---help--- + GTIMA7 Channel 2 idle state: 0=inactive, 1=active. + +endif # N32H7_GTIMA7_CHANNEL2 + +config N32H7_GTIMA7_CHANNEL3 + bool "GTIMA7 Channel 3" + default n + +if N32H7_GTIMA7_CHANNEL3 + +config N32H7_GTIMA7_CH3OUT + bool "GTIMA7 Channel 3 Output Enable" + default N32H7_GTIMA7_CHANNEL3 + ---help--- + Enable output for GTIMA7 Channel 3. If disabled, the channel will not be used. + +config N32H7_GTIMA7_CH3MODE + int "GTIMA7 Channel 3 Mode" + default 6 + depends on N32H7_GTIMA7_CH3OUT + range 0 9 + ---help--- + GTIMA7 Channel 3 mode. See enum n32_pwm_chanmode_e. + +config N32H7_GTIMA7_CH3POL + int "GTIMA7 Channel 3 Polarity" + default 0 + range 0 1 + depends on N32H7_GTIMA7_CH3OUT + ---help--- + GTIMA7 Channel 3 output polarity: 0=active high, 1=active low. + +config N32H7_GTIMA7_CH3IDLE + int "GTIMA7 Channel 3 Idle State" + default 0 + range 0 1 + depends on N32H7_GTIMA7_CH3OUT + ---help--- + GTIMA7 Channel 3 idle state: 0=inactive, 1=active. + +endif # N32H7_GTIMA7_CHANNEL3 + +config N32H7_GTIMA7_CHANNEL4 + bool "GTIMA7 Channel 4" + default n + +if N32H7_GTIMA7_CHANNEL4 + +config N32H7_GTIMA7_CH4OUT + bool "GTIMA7 Channel 4 Output Enable" + default N32H7_GTIMA7_CHANNEL4 + ---help--- + Enable output for GTIMA7 Channel 4. If disabled, the channel will not be used. + +config N32H7_GTIMA7_CH4MODE + int "GTIMA7 Channel 4 Mode" + default 6 + depends on N32H7_GTIMA7_CH4OUT + range 0 9 + ---help--- + GTIMA7 Channel 4 mode. See enum n32_pwm_chanmode_e. + +config N32H7_GTIMA7_CH4POL + int "GTIMA7 Channel 4 Polarity" + default 0 + range 0 1 + depends on N32H7_GTIMA7_CH4OUT + ---help--- + GTIMA7 Channel 4 output polarity: 0=active high, 1=active low. + +config N32H7_GTIMA7_CH4IDLE + int "GTIMA7 Channel 4 Idle State" + default 0 + range 0 1 + depends on N32H7_GTIMA7_CH4OUT + ---help--- + GTIMA7 Channel 4 idle state: 0=inactive, 1=active. + +endif # N32H7_GTIMA7_CHANNEL4 + +endif # N32H7_PWM_MULTICHAN + +if N32H7_PWM_MULTICHAN = n + +config N32H7_GTIMA7_CHANNEL + int "GTIMA7 PWM Output Channel" + default 1 + range 1 4 + ---help--- + If GTIMA7 is enabled for PWM, specifies the timer output channel {1..4}. + +config N32H7_GTIMA7_CHMODE + int "GTIMA7 Channel Mode" + default 6 + range 0 9 + ---help--- + GTIMA7 channel mode. See enum n32_pwm_chanmode_e. + +endif # N32H7_PWM_MULTICHAN = n + +endif # N32H7_GTIMA7_PWM + +config N32H7_GTIMA7_QE + bool "GTIMA7 Quadrature Encoder" + default n + depends on SENSORS_QENCODER + ---help--- + Reserve GTIMA7 for use as a quadrature encoder interface. + +endif # N32H7_GTIMA7 + +endif # N32H7_TIMER_GTIMA + +if N32H7_TIMER_GTIMB + +config N32H7_GTIMB1 + bool "GTIMB1" + default n + ---help--- + Enable General-purpose Timer B GTIMB1. + +if N32H7_GTIMB1 + +config N32H7_GTIMB1_PWM + bool "GTIMB1 PWM" + default n + depends on N32H7_PWM + ---help--- + Reserve GTIMB1 for use by PWM. + +if N32H7_GTIMB1_PWM + +config N32H7_GTIMB1_MODE + int "GTIMB1 Mode" + default 0 + range 0 4 + ---help--- + Specifies the GTIMB1 timer mode: 0=up, 1=down, 2=center1, 3=center2, 4=center3. + +config N32H7_GTIMB1_LOCK + int "GTIMB1 Lock Level" + default 0 + range 0 3 + ---help--- + GTIMB1 BDTR lock level configuration. + +config N32H7_GTIMB1_TDTS + int "GTIMB1 t_DTS Division" + default 0 + range 0 2 + ---help--- + GTIMB1 dead-time and sampling clock division: 0=tCK_INT, 1=2*tCK_INT, 2=4*tCK_INT. + +config N32H7_GTIMB1_DEADTIME + int "GTIMB1 Initial Dead-time" + default 0 + range 0 255 + ---help--- + GTIMB1 initial dead-time value (0-255). + +config N32H7_GTIMB1_BREAK1 + bool "GTIMB1 Break1 Enable" + default n + ---help--- + Enable Break1 input for GTIMB1. + +config N32H7_GTIMB1_BRK1POL + int "GTIMB1 Break1 Polarity" + default 0 + range 0 1 + depends on N32H7_GTIMB1_BREAK1 + ---help--- + GTIMB1 Break1 polarity: 0=active high, 1=active low. + +if N32H7_PWM_MULTICHAN + +config N32H7_GTIMB1_CHANNEL1 + bool "GTIMB1 Channel 1" + default n + +if N32H7_GTIMB1_CHANNEL1 + +config N32H7_GTIMB1_CH1OUT + bool "GTIMB1 Channel 1 Output Enable" + default N32H7_GTIMB1_CHANNEL1 + ---help--- + Enable output for GTIMB1 Channel 1. If disabled, the channel will not be used. + +config N32H7_GTIMB1_CH1MODE + int "GTIMB1 Channel 1 Mode" + default 6 + depends on N32H7_GTIMB1_CH1OUT + range 0 9 + ---help--- + GTIMB1 Channel 1 mode. See enum n32_pwm_chanmode_e. + +config N32H7_GTIMB1_CH1POL + int "GTIMB1 Channel 1 Polarity" + default 0 + range 0 1 + depends on N32H7_GTIMB1_CH1OUT + ---help--- + GTIMB1 Channel 1 output polarity: 0=active high, 1=active low. + +config N32H7_GTIMB1_CH1IDLE + int "GTIMB1 Channel 1 Idle State" + default 0 + range 0 1 + depends on N32H7_GTIMB1_CH1OUT + ---help--- + GTIMB1 Channel 1 idle state: 0=inactive, 1=active. + +config N32H7_GTIMB1_CH1NOUT + bool "GTIMB1 Channel 1 Complementary Output Enable" + default n + depends on N32H7_GTIMB1_CH1OUT + ---help--- + Enable complementary output for GTIMB1 Channel 1. + +config N32H7_GTIMB1_CH1NPOL + int "GTIMB1 Channel 1 Complementary Polarity" + default 0 + range 0 1 + depends on N32H7_GTIMB1_CH1NOUT + ---help--- + GTIMB1 Channel 1 complementary polarity: 0=active high, 1=active low. + +config N32H7_GTIMB1_CH1NIDLE + int "GTIMB1 Channel 1 Complementary Idle State" + default 0 + range 0 1 + depends on N32H7_GTIMB1_CH1NOUT + ---help--- + GTIMB1 Channel 1 complementary idle state: 0=inactive, 1=active. + +endif # N32H7_GTIMB1_CHANNEL1 + +config N32H7_GTIMB1_CHANNEL2 + bool "GTIMB1 Channel 2" + default n + +if N32H7_GTIMB1_CHANNEL2 + +config N32H7_GTIMB1_CH2OUT + bool "GTIMB1 Channel 2 Output Enable" + default N32H7_GTIMB1_CHANNEL2 + ---help--- + Enable output for GTIMB1 Channel 2. If disabled, the channel will not be used. + +config N32H7_GTIMB1_CH2MODE + int "GTIMB1 Channel 2 Mode" + default 6 + depends on N32H7_GTIMB1_CH2OUT + range 0 9 + ---help--- + GTIMB1 Channel 2 mode. See enum n32_pwm_chanmode_e. + +config N32H7_GTIMB1_CH2POL + int "GTIMB1 Channel 2 Polarity" + default 0 + range 0 1 + depends on N32H7_GTIMB1_CH2OUT + ---help--- + GTIMB1 Channel 2 output polarity: 0=active high, 1=active low. + +config N32H7_GTIMB1_CH2IDLE + int "GTIMB1 Channel 2 Idle State" + default 0 + range 0 1 + depends on N32H7_GTIMB1_CH2OUT + ---help--- + GTIMB1 Channel 2 idle state: 0=inactive, 1=active. + +endif # N32H7_GTIMB1_CHANNEL2 + +config N32H7_GTIMB1_CHANNEL3 + bool "GTIMB1 Channel 3" + default n + +if N32H7_GTIMB1_CHANNEL3 + +config N32H7_GTIMB1_CH3OUT + bool "GTIMB1 Channel 3 Output Enable" + default N32H7_GTIMB1_CHANNEL3 + ---help--- + Enable output for GTIMB1 Channel 3. If disabled, the channel will not be used. + +config N32H7_GTIMB1_CH3MODE + int "GTIMB1 Channel 3 Mode" + default 6 + depends on N32H7_GTIMB1_CH3OUT + range 0 9 + ---help--- + GTIMB1 Channel 3 mode. See enum n32_pwm_chanmode_e. + +config N32H7_GTIMB1_CH3POL + int "GTIMB1 Channel 3 Polarity" + default 0 + range 0 1 + depends on N32H7_GTIMB1_CH3OUT + ---help--- + GTIMB1 Channel 3 output polarity: 0=active high, 1=active low. + +config N32H7_GTIMB1_CH3IDLE + int "GTIMB1 Channel 3 Idle State" + default 0 + range 0 1 + depends on N32H7_GTIMB1_CH3OUT + ---help--- + GTIMB1 Channel 3 idle state: 0=inactive, 1=active. + +endif # N32H7_GTIMB1_CHANNEL3 + +config N32H7_GTIMB1_CHANNEL4 + bool "GTIMB1 Channel 4" + default n + +if N32H7_GTIMB1_CHANNEL4 + +config N32H7_GTIMB1_CH4OUT + bool "GTIMB1 Channel 4 Output Enable" + default N32H7_GTIMB1_CHANNEL4 + ---help--- + Enable output for GTIMB1 Channel 4. If disabled, the channel will not be used. + +config N32H7_GTIMB1_CH4MODE + int "GTIMB1 Channel 4 Mode" + default 6 + depends on N32H7_GTIMB1_CH4OUT + range 0 9 + ---help--- + GTIMB1 Channel 4 mode. See enum n32_pwm_chanmode_e. + +config N32H7_GTIMB1_CH4POL + int "GTIMB1 Channel 4 Polarity" + default 0 + range 0 1 + depends on N32H7_GTIMB1_CH4OUT + ---help--- + GTIMB1 Channel 4 output polarity: 0=active high, 1=active low. + +config N32H7_GTIMB1_CH4IDLE + int "GTIMB1 Channel 4 Idle State" + default 0 + range 0 1 + depends on N32H7_GTIMB1_CH4OUT + ---help--- + GTIMB1 Channel 4 idle state: 0=inactive, 1=active. + +endif # N32H7_GTIMB1_CHANNEL4 + +endif # N32H7_PWM_MULTICHAN + +if N32H7_PWM_MULTICHAN = n + +config N32H7_GTIMB1_CHANNEL + int "GTIMB1 PWM Output Channel" + default 1 + range 1 4 + ---help--- + If GTIMB1 is enabled for PWM, specifies the timer output channel {1..4}. + +config N32H7_GTIMB1_CHMODE + int "GTIMB1 Channel Mode" + default 6 + range 0 9 + ---help--- + GTIMB1 channel mode. See enum n32_pwm_chanmode_e. + +endif # N32H7_PWM_MULTICHAN = n + +endif # N32H7_GTIMB1_PWM + +config N32H7_GTIMB1_QE + bool "GTIMB1 Quadrature Encoder" + default n + depends on SENSORS_QENCODER + ---help--- + Reserve GTIMB1 for use as a quadrature encoder interface. + +endif # N32H7_GTIMB1 + +config N32H7_GTIMB2 + bool "GTIMB2" + default n + ---help--- + Enable General-purpose Timer B GTIMB2. + +if N32H7_GTIMB2 + +config N32H7_GTIMB2_PWM + bool "GTIMB2 PWM" + default n + depends on N32H7_PWM + ---help--- + Reserve GTIMB2 for use by PWM. + +if N32H7_GTIMB2_PWM + +config N32H7_GTIMB2_MODE + int "GTIMB2 Mode" + default 0 + range 0 4 + ---help--- + Specifies the GTIMB2 timer mode: 0=up, 1=down, 2=center1, 3=center2, 4=center3. + +config N32H7_GTIMB2_LOCK + int "GTIMB2 Lock Level" + default 0 + range 0 3 + ---help--- + GTIMB2 BDTR lock level configuration. + +config N32H7_GTIMB2_TDTS + int "GTIMB2 t_DTS Division" + default 0 + range 0 2 + ---help--- + GTIMB2 dead-time and sampling clock division: 0=tCK_INT, 1=2*tCK_INT, 2=4*tCK_INT. + +config N32H7_GTIMB2_DEADTIME + int "GTIMB2 Initial Dead-time" + default 0 + range 0 255 + ---help--- + GTIMB2 initial dead-time value (0-255). + +config N32H7_GTIMB2_BREAK1 + bool "GTIMB2 Break1 Enable" + default n + ---help--- + Enable Break1 input for GTIMB2. + +config N32H7_GTIMB2_BRK1POL + int "GTIMB2 Break1 Polarity" + default 0 + range 0 1 + depends on N32H7_GTIMB2_BREAK1 + ---help--- + GTIMB2 Break1 polarity: 0=active high, 1=active low. + +if N32H7_PWM_MULTICHAN + +config N32H7_GTIMB2_CHANNEL1 + bool "GTIMB2 Channel 1" + default n + +if N32H7_GTIMB2_CHANNEL1 + +config N32H7_GTIMB2_CH1OUT + bool "GTIMB2 Channel 1 Output Enable" + default N32H7_GTIMB2_CHANNEL1 + ---help--- + Enable output for GTIMB2 Channel 1. If disabled, the channel will not be used. + +config N32H7_GTIMB2_CH1MODE + int "GTIMB2 Channel 1 Mode" + default 6 + depends on N32H7_GTIMB2_CH1OUT + range 0 9 + ---help--- + GTIMB2 Channel 1 mode. See enum n32_pwm_chanmode_e. + +config N32H7_GTIMB2_CH1POL + int "GTIMB2 Channel 1 Polarity" + default 0 + range 0 1 + depends on N32H7_GTIMB2_CH1OUT + ---help--- + GTIMB2 Channel 1 output polarity: 0=active high, 1=active low. + +config N32H7_GTIMB2_CH1IDLE + int "GTIMB2 Channel 1 Idle State" + default 0 + range 0 1 + depends on N32H7_GTIMB2_CH1OUT + ---help--- + GTIMB2 Channel 1 idle state: 0=inactive, 1=active. + +config N32H7_GTIMB2_CH1NOUT + bool "GTIMB2 Channel 1 Complementary Output Enable" + default n + depends on N32H7_GTIMB2_CH1OUT + ---help--- + Enable complementary output for GTIMB2 Channel 1. + +config N32H7_GTIMB2_CH1NPOL + int "GTIMB2 Channel 1 Complementary Polarity" + default 0 + range 0 1 + depends on N32H7_GTIMB2_CH1NOUT + ---help--- + GTIMB2 Channel 1 complementary polarity: 0=active high, 1=active low. + +config N32H7_GTIMB2_CH1NIDLE + int "GTIMB2 Channel 1 Complementary Idle State" + default 0 + range 0 1 + depends on N32H7_GTIMB2_CH1NOUT + ---help--- + GTIMB2 Channel 1 complementary idle state: 0=inactive, 1=active. + +endif # N32H7_GTIMB2_CHANNEL1 + +config N32H7_GTIMB2_CHANNEL2 + bool "GTIMB2 Channel 2" + default n + +if N32H7_GTIMB2_CHANNEL2 + +config N32H7_GTIMB2_CH2OUT + bool "GTIMB2 Channel 2 Output Enable" + default N32H7_GTIMB2_CHANNEL2 + ---help--- + Enable output for GTIMB2 Channel 2. If disabled, the channel will not be used. + +config N32H7_GTIMB2_CH2MODE + int "GTIMB2 Channel 2 Mode" + default 6 + depends on N32H7_GTIMB2_CH2OUT + range 0 9 + ---help--- + GTIMB2 Channel 2 mode. See enum n32_pwm_chanmode_e. + +config N32H7_GTIMB2_CH2POL + int "GTIMB2 Channel 2 Polarity" + default 0 + range 0 1 + depends on N32H7_GTIMB2_CH2OUT + ---help--- + GTIMB2 Channel 2 output polarity: 0=active high, 1=active low. + +config N32H7_GTIMB2_CH2IDLE + int "GTIMB2 Channel 2 Idle State" + default 0 + range 0 1 + depends on N32H7_GTIMB2_CH2OUT + ---help--- + GTIMB2 Channel 2 idle state: 0=inactive, 1=active. + +endif # N32H7_GTIMB2_CHANNEL2 + +config N32H7_GTIMB2_CHANNEL3 + bool "GTIMB2 Channel 3" + default n + +if N32H7_GTIMB2_CHANNEL3 + +config N32H7_GTIMB2_CH3OUT + bool "GTIMB2 Channel 3 Output Enable" + default N32H7_GTIMB2_CHANNEL3 + ---help--- + Enable output for GTIMB2 Channel 3. If disabled, the channel will not be used. + +config N32H7_GTIMB2_CH3MODE + int "GTIMB2 Channel 3 Mode" + default 6 + depends on N32H7_GTIMB2_CH3OUT + range 0 9 + ---help--- + GTIMB2 Channel 3 mode. See enum n32_pwm_chanmode_e. + +config N32H7_GTIMB2_CH3POL + int "GTIMB2 Channel 3 Polarity" + default 0 + range 0 1 + depends on N32H7_GTIMB2_CH3OUT + ---help--- + GTIMB2 Channel 3 output polarity: 0=active high, 1=active low. + +config N32H7_GTIMB2_CH3IDLE + int "GTIMB2 Channel 3 Idle State" + default 0 + range 0 1 + depends on N32H7_GTIMB2_CH3OUT + ---help--- + GTIMB2 Channel 3 idle state: 0=inactive, 1=active. + +endif # N32H7_GTIMB2_CHANNEL3 + +config N32H7_GTIMB2_CHANNEL4 + bool "GTIMB2 Channel 4" + default n + +if N32H7_GTIMB2_CHANNEL4 + +config N32H7_GTIMB2_CH4OUT + bool "GTIMB2 Channel 4 Output Enable" + default N32H7_GTIMB2_CHANNEL4 + ---help--- + Enable output for GTIMB2 Channel 4. If disabled, the channel will not be used. + +config N32H7_GTIMB2_CH4MODE + int "GTIMB2 Channel 4 Mode" + default 6 + depends on N32H7_GTIMB2_CH4OUT + range 0 9 + ---help--- + GTIMB2 Channel 4 mode. See enum n32_pwm_chanmode_e. + +config N32H7_GTIMB2_CH4POL + int "GTIMB2 Channel 4 Polarity" + default 0 + range 0 1 + depends on N32H7_GTIMB2_CH4OUT + ---help--- + GTIMB2 Channel 4 output polarity: 0=active high, 1=active low. + +config N32H7_GTIMB2_CH4IDLE + int "GTIMB2 Channel 4 Idle State" + default 0 + range 0 1 + depends on N32H7_GTIMB2_CH4OUT + ---help--- + GTIMB2 Channel 4 idle state: 0=inactive, 1=active. + +endif # N32H7_GTIMB2_CHANNEL4 + +endif # N32H7_PWM_MULTICHAN + +if N32H7_PWM_MULTICHAN = n + +config N32H7_GTIMB2_CHANNEL + int "GTIMB2 PWM Output Channel" + default 1 + range 1 4 + ---help--- + If GTIMB2 is enabled for PWM, specifies the timer output channel {1..4}. + +config N32H7_GTIMB2_CHMODE + int "GTIMB2 Channel Mode" + default 6 + range 0 9 + ---help--- + GTIMB2 channel mode. See enum n32_pwm_chanmode_e. + +endif # N32H7_PWM_MULTICHAN = n + +endif # N32H7_GTIMB2_PWM + +config N32H7_GTIMB2_QE + bool "GTIMB2 Quadrature Encoder" + default n + depends on SENSORS_QENCODER + ---help--- + Reserve GTIMB2 for use as a quadrature encoder interface. + +endif # N32H7_GTIMB2 + +config N32H7_GTIMB3 + bool "GTIMB3" + default n + ---help--- + Enable General-purpose Timer B GTIMB3. + +if N32H7_GTIMB3 + +config N32H7_GTIMB3_PWM + bool "GTIMB3 PWM" + default n + depends on N32H7_PWM + ---help--- + Reserve GTIMB3 for use by PWM. + +if N32H7_GTIMB3_PWM + +config N32H7_GTIMB3_MODE + int "GTIMB3 Mode" + default 0 + range 0 4 + ---help--- + Specifies the GTIMB3 timer mode: 0=up, 1=down, 2=center1, 3=center2, 4=center3. + +config N32H7_GTIMB3_LOCK + int "GTIMB3 Lock Level" + default 0 + range 0 3 + ---help--- + GTIMB3 BDTR lock level configuration. + +config N32H7_GTIMB3_TDTS + int "GTIMB3 t_DTS Division" + default 0 + range 0 2 + ---help--- + GTIMB3 dead-time and sampling clock division: 0=tCK_INT, 1=2*tCK_INT, 2=4*tCK_INT. + +config N32H7_GTIMB3_DEADTIME + int "GTIMB3 Initial Dead-time" + default 0 + range 0 255 + ---help--- + GTIMB3 initial dead-time value (0-255). + +config N32H7_GTIMB3_BREAK1 + bool "GTIMB3 Break1 Enable" + default n + ---help--- + Enable Break1 input for GTIMB3. + +config N32H7_GTIMB3_BRK1POL + int "GTIMB3 Break1 Polarity" + default 0 + range 0 1 + depends on N32H7_GTIMB3_BREAK1 + ---help--- + GTIMB3 Break1 polarity: 0=active high, 1=active low. + +if N32H7_PWM_MULTICHAN + +config N32H7_GTIMB3_CHANNEL1 + bool "GTIMB3 Channel 1" + default n + +if N32H7_GTIMB3_CHANNEL1 + +config N32H7_GTIMB3_CH1OUT + bool "GTIMB3 Channel 1 Output Enable" + default N32H7_GTIMB3_CHANNEL1 + ---help--- + Enable output for GTIMB3 Channel 1. If disabled, the channel will not be used. + +config N32H7_GTIMB3_CH1MODE + int "GTIMB3 Channel 1 Mode" + default 6 + depends on N32H7_GTIMB3_CH1OUT + range 0 9 + ---help--- + GTIMB3 Channel 1 mode. See enum n32_pwm_chanmode_e. + +config N32H7_GTIMB3_CH1POL + int "GTIMB3 Channel 1 Polarity" + default 0 + range 0 1 + depends on N32H7_GTIMB3_CH1OUT + ---help--- + GTIMB3 Channel 1 output polarity: 0=active high, 1=active low. + +config N32H7_GTIMB3_CH1IDLE + int "GTIMB3 Channel 1 Idle State" + default 0 + range 0 1 + depends on N32H7_GTIMB3_CH1OUT + ---help--- + GTIMB3 Channel 1 idle state: 0=inactive, 1=active. + +config N32H7_GTIMB3_CH1NOUT + bool "GTIMB3 Channel 1 Complementary Output Enable" + default n + depends on N32H7_GTIMB3_CH1OUT + ---help--- + Enable complementary output for GTIMB3 Channel 1. + +config N32H7_GTIMB3_CH1NPOL + int "GTIMB3 Channel 1 Complementary Polarity" + default 0 + range 0 1 + depends on N32H7_GTIMB3_CH1NOUT + ---help--- + GTIMB3 Channel 1 complementary polarity: 0=active high, 1=active low. + +config N32H7_GTIMB3_CH1NIDLE + int "GTIMB3 Channel 1 Complementary Idle State" + default 0 + range 0 1 + depends on N32H7_GTIMB3_CH1NOUT + ---help--- + GTIMB3 Channel 1 complementary idle state: 0=inactive, 1=active. + +endif # N32H7_GTIMB3_CHANNEL1 + +config N32H7_GTIMB3_CHANNEL2 + bool "GTIMB3 Channel 2" + default n + +if N32H7_GTIMB3_CHANNEL2 + +config N32H7_GTIMB3_CH2OUT + bool "GTIMB3 Channel 2 Output Enable" + default N32H7_GTIMB3_CHANNEL2 + ---help--- + Enable output for GTIMB3 Channel 2. If disabled, the channel will not be used. + +config N32H7_GTIMB3_CH2MODE + int "GTIMB3 Channel 2 Mode" + default 6 + depends on N32H7_GTIMB3_CH2OUT + range 0 9 + ---help--- + GTIMB3 Channel 2 mode. See enum n32_pwm_chanmode_e. + +config N32H7_GTIMB3_CH2POL + int "GTIMB3 Channel 2 Polarity" + default 0 + range 0 1 + depends on N32H7_GTIMB3_CH2OUT + ---help--- + GTIMB3 Channel 2 output polarity: 0=active high, 1=active low. + +config N32H7_GTIMB3_CH2IDLE + int "GTIMB3 Channel 2 Idle State" + default 0 + range 0 1 + depends on N32H7_GTIMB3_CH2OUT + ---help--- + GTIMB3 Channel 2 idle state: 0=inactive, 1=active. + +endif # N32H7_GTIMB3_CHANNEL2 + +config N32H7_GTIMB3_CHANNEL3 + bool "GTIMB3 Channel 3" + default n + +if N32H7_GTIMB3_CHANNEL3 + +config N32H7_GTIMB3_CH3OUT + bool "GTIMB3 Channel 3 Output Enable" + default N32H7_GTIMB3_CHANNEL3 + ---help--- + Enable output for GTIMB3 Channel 3. If disabled, the channel will not be used. + +config N32H7_GTIMB3_CH3MODE + int "GTIMB3 Channel 3 Mode" + default 6 + depends on N32H7_GTIMB3_CH3OUT + range 0 9 + ---help--- + GTIMB3 Channel 3 mode. See enum n32_pwm_chanmode_e. + +config N32H7_GTIMB3_CH3POL + int "GTIMB3 Channel 3 Polarity" + default 0 + range 0 1 + depends on N32H7_GTIMB3_CH3OUT + ---help--- + GTIMB3 Channel 3 output polarity: 0=active high, 1=active low. + +config N32H7_GTIMB3_CH3IDLE + int "GTIMB3 Channel 3 Idle State" + default 0 + range 0 1 + depends on N32H7_GTIMB3_CH3OUT + ---help--- + GTIMB3 Channel 3 idle state: 0=inactive, 1=active. + +endif # N32H7_GTIMB3_CHANNEL3 + +config N32H7_GTIMB3_CHANNEL4 + bool "GTIMB3 Channel 4" + default n + +if N32H7_GTIMB3_CHANNEL4 + +config N32H7_GTIMB3_CH4OUT + bool "GTIMB3 Channel 4 Output Enable" + default N32H7_GTIMB3_CHANNEL4 + ---help--- + Enable output for GTIMB3 Channel 4. If disabled, the channel will not be used. + +config N32H7_GTIMB3_CH4MODE + int "GTIMB3 Channel 4 Mode" + default 6 + depends on N32H7_GTIMB3_CH4OUT + range 0 9 + ---help--- + GTIMB3 Channel 4 mode. See enum n32_pwm_chanmode_e. + +config N32H7_GTIMB3_CH4POL + int "GTIMB3 Channel 4 Polarity" + default 0 + range 0 1 + depends on N32H7_GTIMB3_CH4OUT + ---help--- + GTIMB3 Channel 4 output polarity: 0=active high, 1=active low. + +config N32H7_GTIMB3_CH4IDLE + int "GTIMB3 Channel 4 Idle State" + default 0 + range 0 1 + depends on N32H7_GTIMB3_CH4OUT + ---help--- + GTIMB3 Channel 4 idle state: 0=inactive, 1=active. + +endif # N32H7_GTIMB3_CHANNEL4 + +endif # N32H7_PWM_MULTICHAN + +if N32H7_PWM_MULTICHAN = n + +config N32H7_GTIMB3_CHANNEL + int "GTIMB3 PWM Output Channel" + default 1 + range 1 4 + ---help--- + If GTIMB3 is enabled for PWM, specifies the timer output channel {1..4}. + +config N32H7_GTIMB3_CHMODE + int "GTIMB3 Channel Mode" + default 6 + range 0 9 + ---help--- + GTIMB3 channel mode. See enum n32_pwm_chanmode_e. + +endif # N32H7_PWM_MULTICHAN = n + +endif # N32H7_GTIMB3_PWM + +config N32H7_GTIMB3_QE + bool "GTIMB3 Quadrature Encoder" + default n + depends on SENSORS_QENCODER + ---help--- + Reserve GTIMB3 for use as a quadrature encoder interface. + +endif # N32H7_GTIMB3 + +endif # N32H7_TIMER_GTIMB + +if N32H7_TIMER_BASIC + +config N32H7_BTIM1 + bool "BTIM1" + default n + ---help--- + Enable Basic Timer BTIM1. BTIM timers are 32-bit. + +config N32H7_BTIM2 + bool "BTIM2" + default n + ---help--- + Enable Basic Timer BTIM2. BTIM timers are 32-bit. + +config N32H7_BTIM3 + bool "BTIM3" + default n + ---help--- + Enable Basic Timer BTIM3. BTIM timers are 32-bit. + +config N32H7_BTIM4 + bool "BTIM4" + default n + ---help--- + Enable Basic Timer BTIM4. BTIM timers are 32-bit. + +endif # N32H7_TIMER_BASIC + +config N32H7_PWM + bool "PWM support" + default n + select PWM + ---help--- + Enable PWM support for N32H7 timers. + +config N32H7_PWM_LL_OPS + bool "PWM low-level operations" + default n + depends on N32H7_PWM + ---help--- + Enable low-level PWM ops for direct register access. + +config N32H7_PWM_MULTICHAN + bool "PWM Multiple Output Channels" + default n + depends on N32H7_PWM + select ARCH_HAVE_PWM_MULTICHAN + ---help--- + Specifies that the PWM driver supports multiple output + channels per timer. + +menu "N32H7 TIMx Outputs Configuration" + depends on N32H7_PWM + +config N32H7_ATIM1_CH1POL + int "ATIM1 Channel 1 Output polarity" + default 0 + range 0 1 + depends on N32H7_ATIM1_CH1OUT + +config N32H7_ATIM1_CH1IDLE + int "ATIM1 Channel 1 Output IDLE" + default 0 + range 0 1 + depends on N32H7_ATIM1_CH1OUT + +config N32H7_ATIM1_CH1NPOL + int "ATIM1 Channel 1 Complementary Output polarity" + default 0 + range 0 1 + depends on N32H7_ATIM1_CH1NOUT + +config N32H7_ATIM1_CH1NIDLE + int "ATIM1 Channel 1 Complementary Output IDLE" + default 0 + range 0 1 + depends on N32H7_ATIM1_CH1NOUT + +config N32H7_ATIM1_CH2POL + int "ATIM1 Channel 2 Output polarity" + default 0 + range 0 1 + depends on N32H7_ATIM1_CH2OUT + +config N32H7_ATIM1_CH2IDLE + int "ATIM1 Channel 2 Output IDLE" + default 0 + range 0 1 + depends on N32H7_ATIM1_CH2OUT + +config N32H7_ATIM1_CH3POL + int "ATIM1 Channel 3 Output polarity" + default 0 + range 0 1 + depends on N32H7_ATIM1_CH3OUT + +config N32H7_ATIM1_CH3IDLE + int "ATIM1 Channel 3 Output IDLE" + default 0 + range 0 1 + depends on N32H7_ATIM1_CH3OUT + +config N32H7_ATIM1_CH4POL + int "ATIM1 Channel 4 Output polarity" + default 0 + range 0 1 + depends on N32H7_ATIM1_CH4OUT + +config N32H7_ATIM1_CH4IDLE + int "ATIM1 Channel 4 Output IDLE" + default 0 + range 0 1 + depends on N32H7_ATIM1_CH4OUT + +config N32H7_ATIM2_CH1POL + int "ATIM2 Channel 1 Output polarity" + default 0 + range 0 1 + depends on N32H7_ATIM2_CH1OUT + +config N32H7_ATIM2_CH1IDLE + int "ATIM2 Channel 1 Output IDLE" + default 0 + range 0 1 + depends on N32H7_ATIM2_CH1OUT + +config N32H7_ATIM2_CH1NPOL + int "ATIM2 Channel 1 Complementary Output polarity" + default 0 + range 0 1 + depends on N32H7_ATIM2_CH1NOUT + +config N32H7_ATIM2_CH1NIDLE + int "ATIM2 Channel 1 Complementary Output IDLE" + default 0 + range 0 1 + depends on N32H7_ATIM2_CH1NOUT + +config N32H7_ATIM2_CH2POL + int "ATIM2 Channel 2 Output polarity" + default 0 + range 0 1 + depends on N32H7_ATIM2_CH2OUT + +config N32H7_ATIM2_CH2IDLE + int "ATIM2 Channel 2 Output IDLE" + default 0 + range 0 1 + depends on N32H7_ATIM2_CH2OUT + +config N32H7_ATIM2_CH3POL + int "ATIM2 Channel 3 Output polarity" + default 0 + range 0 1 + depends on N32H7_ATIM2_CH3OUT + +config N32H7_ATIM2_CH3IDLE + int "ATIM2 Channel 3 Output IDLE" + default 0 + range 0 1 + depends on N32H7_ATIM2_CH3OUT + +config N32H7_ATIM2_CH4POL + int "ATIM2 Channel 4 Output polarity" + default 0 + range 0 1 + depends on N32H7_ATIM2_CH4OUT + +config N32H7_ATIM2_CH4IDLE + int "ATIM2 Channel 4 Output IDLE" + default 0 + range 0 1 + depends on N32H7_ATIM2_CH4OUT + +config N32H7_ATIM3_CH1POL + int "ATIM3 Channel 1 Output polarity" + default 0 + range 0 1 + depends on N32H7_ATIM3_CH1OUT + +config N32H7_ATIM3_CH1IDLE + int "ATIM3 Channel 1 Output IDLE" + default 0 + range 0 1 + depends on N32H7_ATIM3_CH1OUT + +config N32H7_ATIM3_CH1NPOL + int "ATIM3 Channel 1 Complementary Output polarity" + default 0 + range 0 1 + depends on N32H7_ATIM3_CH1NOUT + +config N32H7_ATIM3_CH1NIDLE + int "ATIM3 Channel 1 Complementary Output IDLE" + default 0 + range 0 1 + depends on N32H7_ATIM3_CH1NOUT + +config N32H7_ATIM3_CH2POL + int "ATIM3 Channel 2 Output polarity" + default 0 + range 0 1 + depends on N32H7_ATIM3_CH2OUT + +config N32H7_ATIM3_CH2IDLE + int "ATIM3 Channel 2 Output IDLE" + default 0 + range 0 1 + depends on N32H7_ATIM3_CH2OUT + +config N32H7_ATIM3_CH3POL + int "ATIM3 Channel 3 Output polarity" + default 0 + range 0 1 + depends on N32H7_ATIM3_CH3OUT + +config N32H7_ATIM3_CH3IDLE + int "ATIM3 Channel 3 Output IDLE" + default 0 + range 0 1 + depends on N32H7_ATIM3_CH3OUT + +config N32H7_ATIM3_CH4POL + int "ATIM3 Channel 4 Output polarity" + default 0 + range 0 1 + depends on N32H7_ATIM3_CH4OUT + +config N32H7_ATIM3_CH4IDLE + int "ATIM3 Channel 4 Output IDLE" + default 0 + range 0 1 + depends on N32H7_ATIM3_CH4OUT + +config N32H7_ATIM4_CH1POL + int "ATIM4 Channel 1 Output polarity" + default 0 + range 0 1 + depends on N32H7_ATIM4_CH1OUT + +config N32H7_ATIM4_CH1IDLE + int "ATIM4 Channel 1 Output IDLE" + default 0 + range 0 1 + depends on N32H7_ATIM4_CH1OUT + +config N32H7_ATIM4_CH1NPOL + int "ATIM4 Channel 1 Complementary Output polarity" + default 0 + range 0 1 + depends on N32H7_ATIM4_CH1NOUT + +config N32H7_ATIM4_CH1NIDLE + int "ATIM4 Channel 1 Complementary Output IDLE" + default 0 + range 0 1 + depends on N32H7_ATIM4_CH1NOUT + +config N32H7_ATIM4_CH2POL + int "ATIM4 Channel 2 Output polarity" + default 0 + range 0 1 + depends on N32H7_ATIM4_CH2OUT + +config N32H7_ATIM4_CH2IDLE + int "ATIM4 Channel 2 Output IDLE" + default 0 + range 0 1 + depends on N32H7_ATIM4_CH2OUT + +config N32H7_ATIM4_CH3POL + int "ATIM4 Channel 3 Output polarity" + default 0 + range 0 1 + depends on N32H7_ATIM4_CH3OUT + +config N32H7_ATIM4_CH3IDLE + int "ATIM4 Channel 3 Output IDLE" + default 0 + range 0 1 + depends on N32H7_ATIM4_CH3OUT + +config N32H7_ATIM4_CH4POL + int "ATIM4 Channel 4 Output polarity" + default 0 + range 0 1 + depends on N32H7_ATIM4_CH4OUT + +config N32H7_ATIM4_CH4IDLE + int "ATIM4 Channel 4 Output IDLE" + default 0 + range 0 1 + depends on N32H7_ATIM4_CH4OUT + +config N32H7_GTIMA1_CH1POL + int "GTIMA1 Channel 1 Output polarity" + default 0 + range 0 1 + depends on N32H7_GTIMA1_CH1OUT + +config N32H7_GTIMA1_CH1IDLE + int "GTIMA1 Channel 1 Output IDLE" + default 0 + range 0 1 + depends on N32H7_GTIMA1_CH1OUT + +config N32H7_GTIMA1_CH2POL + int "GTIMA1 Channel 2 Output polarity" + default 0 + range 0 1 + depends on N32H7_GTIMA1_CH2OUT + +config N32H7_GTIMA1_CH2IDLE + int "GTIMA1 Channel 2 Output IDLE" + default 0 + range 0 1 + depends on N32H7_GTIMA1_CH2OUT + +config N32H7_GTIMA1_CH3POL + int "GTIMA1 Channel 3 Output polarity" + default 0 + range 0 1 + depends on N32H7_GTIMA1_CH3OUT + +config N32H7_GTIMA1_CH3IDLE + int "GTIMA1 Channel 3 Output IDLE" + default 0 + range 0 1 + depends on N32H7_GTIMA1_CH3OUT + +config N32H7_GTIMA1_CH4POL + int "GTIMA1 Channel 4 Output polarity" + default 0 + range 0 1 + depends on N32H7_GTIMA1_CH4OUT + +config N32H7_GTIMA1_CH4IDLE + int "GTIMA1 Channel 4 Output IDLE" + default 0 + range 0 1 + depends on N32H7_GTIMA1_CH4OUT + +config N32H7_GTIMA2_CH1POL + int "GTIMA2 Channel 1 Output polarity" + default 0 + range 0 1 + depends on N32H7_GTIMA2_CH1OUT + +config N32H7_GTIMA2_CH1IDLE + int "GTIMA2 Channel 1 Output IDLE" + default 0 + range 0 1 + depends on N32H7_GTIMA2_CH1OUT + +config N32H7_GTIMA2_CH2POL + int "GTIMA2 Channel 2 Output polarity" + default 0 + range 0 1 + depends on N32H7_GTIMA2_CH2OUT + +config N32H7_GTIMA2_CH2IDLE + int "GTIMA2 Channel 2 Output IDLE" + default 0 + range 0 1 + depends on N32H7_GTIMA2_CH2OUT + +config N32H7_GTIMA2_CH3POL + int "GTIMA2 Channel 3 Output polarity" + default 0 + range 0 1 + depends on N32H7_GTIMA2_CH3OUT + +config N32H7_GTIMA2_CH3IDLE + int "GTIMA2 Channel 3 Output IDLE" + default 0 + range 0 1 + depends on N32H7_GTIMA2_CH3OUT + +config N32H7_GTIMA2_CH4POL + int "GTIMA2 Channel 4 Output polarity" + default 0 + range 0 1 + depends on N32H7_GTIMA2_CH4OUT + +config N32H7_GTIMA2_CH4IDLE + int "GTIMA2 Channel 4 Output IDLE" + default 0 + range 0 1 + depends on N32H7_GTIMA2_CH4OUT + +config N32H7_GTIMA3_CH1POL + int "GTIMA3 Channel 1 Output polarity" + default 0 + range 0 1 + depends on N32H7_GTIMA3_CH1OUT + +config N32H7_GTIMA3_CH1IDLE + int "GTIMA3 Channel 1 Output IDLE" + default 0 + range 0 1 + depends on N32H7_GTIMA3_CH1OUT + +config N32H7_GTIMA3_CH2POL + int "GTIMA3 Channel 2 Output polarity" + default 0 + range 0 1 + depends on N32H7_GTIMA3_CH2OUT + +config N32H7_GTIMA3_CH2IDLE + int "GTIMA3 Channel 2 Output IDLE" + default 0 + range 0 1 + depends on N32H7_GTIMA3_CH2OUT + +config N32H7_GTIMA3_CH3POL + int "GTIMA3 Channel 3 Output polarity" + default 0 + range 0 1 + depends on N32H7_GTIMA3_CH3OUT + +config N32H7_GTIMA3_CH3IDLE + int "GTIMA3 Channel 3 Output IDLE" + default 0 + range 0 1 + depends on N32H7_GTIMA3_CH3OUT + +config N32H7_GTIMA3_CH4POL + int "GTIMA3 Channel 4 Output polarity" + default 0 + range 0 1 + depends on N32H7_GTIMA3_CH4OUT + +config N32H7_GTIMA3_CH4IDLE + int "GTIMA3 Channel 4 Output IDLE" + default 0 + range 0 1 + depends on N32H7_GTIMA3_CH4OUT + +config N32H7_GTIMA4_CH1POL + int "GTIMA4 Channel 1 Output polarity" + default 0 + range 0 1 + depends on N32H7_GTIMA4_CH1OUT + +config N32H7_GTIMA4_CH1IDLE + int "GTIMA4 Channel 1 Output IDLE" + default 0 + range 0 1 + depends on N32H7_GTIMA4_CH1OUT + +config N32H7_GTIMA4_CH2POL + int "GTIMA4 Channel 2 Output polarity" + default 0 + range 0 1 + depends on N32H7_GTIMA4_CH2OUT + +config N32H7_GTIMA4_CH2IDLE + int "GTIMA4 Channel 2 Output IDLE" + default 0 + range 0 1 + depends on N32H7_GTIMA4_CH2OUT + +config N32H7_GTIMA4_CH3POL + int "GTIMA4 Channel 3 Output polarity" + default 0 + range 0 1 + depends on N32H7_GTIMA4_CH3OUT + +config N32H7_GTIMA4_CH3IDLE + int "GTIMA4 Channel 3 Output IDLE" + default 0 + range 0 1 + depends on N32H7_GTIMA4_CH3OUT + +config N32H7_GTIMA4_CH4POL + int "GTIMA4 Channel 4 Output polarity" + default 0 + range 0 1 + depends on N32H7_GTIMA4_CH4OUT + +config N32H7_GTIMA4_CH4IDLE + int "GTIMA4 Channel 4 Output IDLE" + default 0 + range 0 1 + depends on N32H7_GTIMA4_CH4OUT + +config N32H7_GTIMA5_CH1POL + int "GTIMA5 Channel 1 Output polarity" + default 0 + range 0 1 + depends on N32H7_GTIMA5_CH1OUT + +config N32H7_GTIMA5_CH1IDLE + int "GTIMA5 Channel 1 Output IDLE" + default 0 + range 0 1 + depends on N32H7_GTIMA5_CH1OUT + +config N32H7_GTIMA5_CH2POL + int "GTIMA5 Channel 2 Output polarity" + default 0 + range 0 1 + depends on N32H7_GTIMA5_CH2OUT + +config N32H7_GTIMA5_CH2IDLE + int "GTIMA5 Channel 2 Output IDLE" + default 0 + range 0 1 + depends on N32H7_GTIMA5_CH2OUT + +config N32H7_GTIMA5_CH3POL + int "GTIMA5 Channel 3 Output polarity" + default 0 + range 0 1 + depends on N32H7_GTIMA5_CH3OUT + +config N32H7_GTIMA5_CH3IDLE + int "GTIMA5 Channel 3 Output IDLE" + default 0 + range 0 1 + depends on N32H7_GTIMA5_CH3OUT + +config N32H7_GTIMA5_CH4POL + int "GTIMA5 Channel 4 Output polarity" + default 0 + range 0 1 + depends on N32H7_GTIMA5_CH4OUT + +config N32H7_GTIMA5_CH4IDLE + int "GTIMA5 Channel 4 Output IDLE" + default 0 + range 0 1 + depends on N32H7_GTIMA5_CH4OUT + +config N32H7_GTIMA6_CH1POL + int "GTIMA6 Channel 1 Output polarity" + default 0 + range 0 1 + depends on N32H7_GTIMA6_CH1OUT + +config N32H7_GTIMA6_CH1IDLE + int "GTIMA6 Channel 1 Output IDLE" + default 0 + range 0 1 + depends on N32H7_GTIMA6_CH1OUT + +config N32H7_GTIMA6_CH2POL + int "GTIMA6 Channel 2 Output polarity" + default 0 + range 0 1 + depends on N32H7_GTIMA6_CH2OUT + +config N32H7_GTIMA6_CH2IDLE + int "GTIMA6 Channel 2 Output IDLE" + default 0 + range 0 1 + depends on N32H7_GTIMA6_CH2OUT + +config N32H7_GTIMA6_CH3POL + int "GTIMA6 Channel 3 Output polarity" + default 0 + range 0 1 + depends on N32H7_GTIMA6_CH3OUT + +config N32H7_GTIMA6_CH3IDLE + int "GTIMA6 Channel 3 Output IDLE" + default 0 + range 0 1 + depends on N32H7_GTIMA6_CH3OUT + +config N32H7_GTIMA6_CH4POL + int "GTIMA6 Channel 4 Output polarity" + default 0 + range 0 1 + depends on N32H7_GTIMA6_CH4OUT + +config N32H7_GTIMA6_CH4IDLE + int "GTIMA6 Channel 4 Output IDLE" + default 0 + range 0 1 + depends on N32H7_GTIMA6_CH4OUT + +config N32H7_GTIMA7_CH1POL + int "GTIMA7 Channel 1 Output polarity" + default 0 + range 0 1 + depends on N32H7_GTIMA7_CH1OUT + +config N32H7_GTIMA7_CH1IDLE + int "GTIMA7 Channel 1 Output IDLE" + default 0 + range 0 1 + depends on N32H7_GTIMA7_CH1OUT + +config N32H7_GTIMA7_CH2POL + int "GTIMA7 Channel 2 Output polarity" + default 0 + range 0 1 + depends on N32H7_GTIMA7_CH2OUT + +config N32H7_GTIMA7_CH2IDLE + int "GTIMA7 Channel 2 Output IDLE" + default 0 + range 0 1 + depends on N32H7_GTIMA7_CH2OUT + +config N32H7_GTIMA7_CH3POL + int "GTIMA7 Channel 3 Output polarity" + default 0 + range 0 1 + depends on N32H7_GTIMA7_CH3OUT + +config N32H7_GTIMA7_CH3IDLE + int "GTIMA7 Channel 3 Output IDLE" + default 0 + range 0 1 + depends on N32H7_GTIMA7_CH3OUT + +config N32H7_GTIMA7_CH4POL + int "GTIMA7 Channel 4 Output polarity" + default 0 + range 0 1 + depends on N32H7_GTIMA7_CH4OUT + +config N32H7_GTIMA7_CH4IDLE + int "GTIMA7 Channel 4 Output IDLE" + default 0 + range 0 1 + depends on N32H7_GTIMA7_CH4OUT + +config N32H7_GTIMB1_CH1POL + int "GTIMB1 Channel 1 Output polarity" + default 0 + range 0 1 + depends on N32H7_GTIMB1_CH1OUT + +config N32H7_GTIMB1_CH1IDLE + int "GTIMB1 Channel 1 Output IDLE" + default 0 + range 0 1 + depends on N32H7_GTIMB1_CH1OUT + +config N32H7_GTIMB1_CH1NPOL + int "GTIMB1 Channel 1 Complementary Output polarity" + default 0 + range 0 1 + depends on N32H7_GTIMB1_CH1NOUT + +config N32H7_GTIMB1_CH1NIDLE + int "GTIMB1 Channel 1 Complementary Output IDLE" + default 0 + range 0 1 + depends on N32H7_GTIMB1_CH1NOUT + +config N32H7_GTIMB1_CH2POL + int "GTIMB1 Channel 2 Output polarity" + default 0 + range 0 1 + depends on N32H7_GTIMB1_CH2OUT + +config N32H7_GTIMB1_CH2IDLE + int "GTIMB1 Channel 2 Output IDLE" + default 0 + range 0 1 + depends on N32H7_GTIMB1_CH2OUT + +config N32H7_GTIMB1_CH3POL + int "GTIMB1 Channel 3 Output polarity" + default 0 + range 0 1 + depends on N32H7_GTIMB1_CH3OUT + +config N32H7_GTIMB1_CH3IDLE + int "GTIMB1 Channel 3 Output IDLE" + default 0 + range 0 1 + depends on N32H7_GTIMB1_CH3OUT + +config N32H7_GTIMB1_CH4POL + int "GTIMB1 Channel 4 Output polarity" + default 0 + range 0 1 + depends on N32H7_GTIMB1_CH4OUT + +config N32H7_GTIMB1_CH4IDLE + int "GTIMB1 Channel 4 Output IDLE" + default 0 + range 0 1 + depends on N32H7_GTIMB1_CH4OUT + +config N32H7_GTIMB2_CH1POL + int "GTIMB2 Channel 1 Output polarity" + default 0 + range 0 1 + depends on N32H7_GTIMB2_CH1OUT + +config N32H7_GTIMB2_CH1IDLE + int "GTIMB2 Channel 1 Output IDLE" + default 0 + range 0 1 + depends on N32H7_GTIMB2_CH1OUT + +config N32H7_GTIMB2_CH1NPOL + int "GTIMB2 Channel 1 Complementary Output polarity" + default 0 + range 0 1 + depends on N32H7_GTIMB2_CH1NOUT + +config N32H7_GTIMB2_CH1NIDLE + int "GTIMB2 Channel 1 Complementary Output IDLE" + default 0 + range 0 1 + depends on N32H7_GTIMB2_CH1NOUT + +config N32H7_GTIMB2_CH2POL + int "GTIMB2 Channel 2 Output polarity" + default 0 + range 0 1 + depends on N32H7_GTIMB2_CH2OUT + +config N32H7_GTIMB2_CH2IDLE + int "GTIMB2 Channel 2 Output IDLE" + default 0 + range 0 1 + depends on N32H7_GTIMB2_CH2OUT + +config N32H7_GTIMB2_CH3POL + int "GTIMB2 Channel 3 Output polarity" + default 0 + range 0 1 + depends on N32H7_GTIMB2_CH3OUT + +config N32H7_GTIMB2_CH3IDLE + int "GTIMB2 Channel 3 Output IDLE" + default 0 + range 0 1 + depends on N32H7_GTIMB2_CH3OUT + +config N32H7_GTIMB2_CH4POL + int "GTIMB2 Channel 4 Output polarity" + default 0 + range 0 1 + depends on N32H7_GTIMB2_CH4OUT + +config N32H7_GTIMB2_CH4IDLE + int "GTIMB2 Channel 4 Output IDLE" + default 0 + range 0 1 + depends on N32H7_GTIMB2_CH4OUT + +config N32H7_GTIMB3_CH1POL + int "GTIMB3 Channel 1 Output polarity" + default 0 + range 0 1 + depends on N32H7_GTIMB3_CH1OUT + +config N32H7_GTIMB3_CH1IDLE + int "GTIMB3 Channel 1 Output IDLE" + default 0 + range 0 1 + depends on N32H7_GTIMB3_CH1OUT + +config N32H7_GTIMB3_CH1NPOL + int "GTIMB3 Channel 1 Complementary Output polarity" + default 0 + range 0 1 + depends on N32H7_GTIMB3_CH1NOUT + +config N32H7_GTIMB3_CH1NIDLE + int "GTIMB3 Channel 1 Complementary Output IDLE" + default 0 + range 0 1 + depends on N32H7_GTIMB3_CH1NOUT + +config N32H7_GTIMB3_CH2POL + int "GTIMB3 Channel 2 Output polarity" + default 0 + range 0 1 + depends on N32H7_GTIMB3_CH2OUT + +config N32H7_GTIMB3_CH2IDLE + int "GTIMB3 Channel 2 Output IDLE" + default 0 + range 0 1 + depends on N32H7_GTIMB3_CH2OUT + +config N32H7_GTIMB3_CH3POL + int "GTIMB3 Channel 3 Output polarity" + default 0 + range 0 1 + depends on N32H7_GTIMB3_CH3OUT + +config N32H7_GTIMB3_CH3IDLE + int "GTIMB3 Channel 3 Output IDLE" + default 0 + range 0 1 + depends on N32H7_GTIMB3_CH3OUT + +config N32H7_GTIMB3_CH4POL + int "GTIMB3 Channel 4 Output polarity" + default 0 + range 0 1 + depends on N32H7_GTIMB3_CH4OUT + +config N32H7_GTIMB3_CH4IDLE + int "GTIMB3 Channel 4 Output IDLE" + default 0 + range 0 1 + depends on N32H7_GTIMB3_CH4OUT + +endmenu # N32H7 TIMx Outputs Configuration + +endmenu # Timer Configuration + +menuconfig N32H7_CAPTURE + bool "Timer Input Capture support" + select CAPTURE + default n + ---help--- + Enable input capture support for N32H7 timers. + +if N32H7_CAPTURE + +config N32H7_ATIM1_CAP + bool "ATIM1 Capture" + default n + ---help--- + Enable input capture on ATIM1. + +if N32H7_ATIM1_CAP +config N32H7_ATIM1_CHANNEL + int "Capture channel (1 or 2)" + default 1 + range 1 2 + ---help--- + Select the input capture channel (only 1 or 2 are supported for PWM input). + +config N32H7_ATIM1_CLOCK + int "Timer counting frequency (Hz)" + default 1000000 + ---help--- + Actual clock frequency after prescaler. This affects resolution and range. + Higher frequency gives better resolution but shorter maximum period. + +endif # N32H7_ATIM1_CAP + +config N32H7_ATIM2_CAP + bool "ATIM2 Capture" + default n + ---help--- + Enable input capture on ATIM2. + +if N32H7_ATIM2_CAP +config N32H7_ATIM2_CHANNEL + int "Capture channel (1 or 2)" + default 1 + range 1 2 + ---help--- + Select the input capture channel (only 1 or 2 are supported for PWM input). + +config N32H7_ATIM2_CLOCK + int "Timer counting frequency (Hz)" + default 1000000 + ---help--- + Actual clock frequency after prescaler. This affects resolution and range. + Higher frequency gives better resolution but shorter maximum period. + +endif # N32H7_ATIM2_CAP + +config N32H7_ATIM3_CAP + bool "ATIM3 Capture" + default n + ---help--- + Enable input capture on ATIM3. + +if N32H7_ATIM3_CAP +config N32H7_ATIM3_CHANNEL + int "Capture channel (1 or 2)" + default 1 + range 1 2 + ---help--- + Select the input capture channel (only 1 or 2 are supported for PWM input). + +config N32H7_ATIM3_CLOCK + int "Timer counting frequency (Hz)" + default 1000000 + ---help--- + Actual clock frequency after prescaler. This affects resolution and range. + Higher frequency gives better resolution but shorter maximum period. + +endif # N32H7_ATIM3_CAP + +config N32H7_ATIM4_CAP + bool "ATIM4 Capture" + default n + ---help--- + Enable input capture on ATIM4. + +if N32H7_ATIM4_CAP +config N32H7_ATIM4_CHANNEL + int "Capture channel (1 or 2)" + default 1 + range 1 2 + ---help--- + Select the input capture channel (only 1 or 2 are supported for PWM input). + +config N32H7_ATIM4_CLOCK + int "Timer counting frequency (Hz)" + default 1000000 + ---help--- + Actual clock frequency after prescaler. This affects resolution and range. + Higher frequency gives better resolution but shorter maximum period. + +endif # N32H7_ATIM4_CAP + +config N32H7_GTIMA1_CAP + bool "GTIMA1 Capture" + default n + ---help--- + Enable input capture on GTIMA1. + +if N32H7_GTIMA1_CAP +config N32H7_GTIMA1_CHANNEL + int "Capture channel (1 or 2)" + default 1 + range 1 2 + ---help--- + Select the input capture channel (only 1 or 2 are supported for PWM input). + +config N32H7_GTIMA1_CLOCK + int "Timer counting frequency (Hz)" + default 1000000 + ---help--- + Actual clock frequency after prescaler. This affects resolution and range. + Higher frequency gives better resolution but shorter maximum period. + +endif # N32H7_GTIMA1_CAP + +config N32H7_GTIMA2_CAP + bool "GTIMA2 Capture" + default n + ---help--- + Enable input capture on GTIMA2. + +if N32H7_GTIMA2_CAP +config N32H7_GTIMA2_CHANNEL + int "Capture channel (1 or 2)" + default 1 + range 1 2 + ---help--- + Select the input capture channel (only 1 or 2 are supported for PWM input). + +config N32H7_GTIMA2_CLOCK + int "Timer counting frequency (Hz)" + default 1000000 + ---help--- + Actual clock frequency after prescaler. This affects resolution and range. + Higher frequency gives better resolution but shorter maximum period. + +endif # N32H7_GTIMA2_CAP + +config N32H7_GTIMA3_CAP + bool "GTIMA3 Capture" + default n + ---help--- + Enable input capture on GTIMA3. + +if N32H7_GTIMA3_CAP +config N32H7_GTIMA3_CHANNEL + int "Capture channel (1 or 2)" + default 1 + range 1 2 + ---help--- + Select the input capture channel (only 1 or 2 are supported for PWM input). + +config N32H7_GTIMA3_CLOCK + int "Timer counting frequency (Hz)" + default 1000000 + ---help--- + Actual clock frequency after prescaler. This affects resolution and range. + Higher frequency gives better resolution but shorter maximum period. + +endif # N32H7_GTIMA3_CAP + +config N32H7_GTIMA4_CAP + bool "GTIMA4 Capture" + default n + ---help--- + Enable input capture on GTIMA4. + +if N32H7_GTIMA4_CAP +config N32H7_GTIMA4_CHANNEL + int "Capture channel (1 or 2)" + default 1 + range 1 2 + ---help--- + Select the input capture channel (only 1 or 2 are supported for PWM input). + +config N32H7_GTIMA4_CLOCK + int "Timer counting frequency (Hz)" + default 1000000 + ---help--- + Actual clock frequency after prescaler. This affects resolution and range. + Higher frequency gives better resolution but shorter maximum period. + +endif # N32H7_GTIMA4_CAP + +config N32H7_GTIMA5_CAP + bool "GTIMA5 Capture" + default n + ---help--- + Enable input capture on GTIMA5. + +if N32H7_GTIMA5_CAP +config N32H7_GTIMA5_CHANNEL + int "Capture channel (1 or 2)" + default 1 + range 1 2 + ---help--- + Select the input capture channel (only 1 or 2 are supported for PWM input). + +config N32H7_GTIMA5_CLOCK + int "Timer counting frequency (Hz)" + default 1000000 + ---help--- + Actual clock frequency after prescaler. This affects resolution and range. + Higher frequency gives better resolution but shorter maximum period. + +endif # N32H7_GTIMA5_CAP + +config N32H7_GTIMA6_CAP + bool "GTIMA6 Capture" + default n + ---help--- + Enable input capture on GTIMA6. + +if N32H7_GTIMA6_CAP +config N32H7_GTIMA6_CHANNEL + int "Capture channel (1 or 2)" + default 1 + range 1 2 + ---help--- + Select the input capture channel (only 1 or 2 are supported for PWM input). + +config N32H7_GTIMA6_CLOCK + int "Timer counting frequency (Hz)" + default 1000000 + ---help--- + Actual clock frequency after prescaler. This affects resolution and range. + Higher frequency gives better resolution but shorter maximum period. + +endif # N32H7_GTIMA6_CAP + +config N32H7_GTIMA7_CAP + bool "GTIMA7 Capture" + default n + ---help--- + Enable input capture on GTIMA7. + +if N32H7_GTIMA7_CAP +config N32H7_GTIMA7_CHANNEL + int "Capture channel (1 or 2)" + default 1 + range 1 2 + ---help--- + Select the input capture channel (only 1 or 2 are supported for PWM input). + +config N32H7_GTIMA7_CLOCK + int "Timer counting frequency (Hz)" + default 1000000 + ---help--- + Actual clock frequency after prescaler. This affects resolution and range. + Higher frequency gives better resolution but shorter maximum period. + +endif # N32H7_GTIMA7_CAP + +config N32H7_GTIMB1_CAP + bool "GTIMB1 Capture" + default n + ---help--- + Enable input capture on GTIMB1. + +if N32H7_GTIMB1_CAP +config N32H7_GTIMB1_CHANNEL + int "Capture channel (1 or 2)" + default 1 + range 1 2 + ---help--- + Select the input capture channel (only 1 or 2 are supported for PWM input). + +config N32H7_GTIMB1_CLOCK + int "Timer counting frequency (Hz)" + default 1000000 + ---help--- + Actual clock frequency after prescaler. This affects resolution and range. + Higher frequency gives better resolution but shorter maximum period. + +endif # N32H7_GTIMB1_CAP + +config N32H7_GTIMB2_CAP + bool "GTIMB2 Capture" + default n + ---help--- + Enable input capture on GTIMB2. + +if N32H7_GTIMB2_CAP +config N32H7_GTIMB2_CHANNEL + int "Capture channel (1 or 2)" + default 1 + range 1 2 + ---help--- + Select the input capture channel (only 1 or 2 are supported for PWM input). + +config N32H7_GTIMB2_CLOCK + int "Timer counting frequency (Hz)" + default 1000000 + ---help--- + Actual clock frequency after prescaler. This affects resolution and range. + Higher frequency gives better resolution but shorter maximum period. + +endif # N32H7_GTIMB2_CAP + +config N32H7_GTIMB3_CAP + bool "GTIMB3 Capture" + default n + ---help--- + Enable input capture on GTIMB3. + +if N32H7_GTIMB3_CAP +config N32H7_GTIMB3_CHANNEL + int "Capture channel (1 or 2)" + default 1 + range 1 2 + ---help--- + Select the input capture channel (only 1 or 2 are supported for PWM input). + +config N32H7_GTIMB3_CLOCK + int "Timer counting frequency (Hz)" + default 1000000 + ---help--- + Actual clock frequency after prescaler. This affects resolution and range. + Higher frequency gives better resolution but shorter maximum period. + +endif # N32H7_GTIMB3_CAP +endif # N32H7_CAPTURE + +endif # ARCH_CHIP_N32H7 diff --git a/arch/arm/src/n32h7/Make.defs b/arch/arm/src/n32h7/Make.defs new file mode 100644 index 0000000000000..16a213bff157a --- /dev/null +++ b/arch/arm/src/n32h7/Make.defs @@ -0,0 +1,191 @@ +############################################################################ +# arch/arm/src/n32h7/Make.defs +# +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. The +# ASF licenses this file to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance with the +# License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +# +############################################################################ + +# Common ARM and Cortex-M7 files + +include armv7-m/Make.defs + +CHIP_CSRCS = n32_allocateheap.c n32_exti_gpio.c n32_gpio.c n32_irq.c \ + n32_rcc.c n32_lowputc.c n32_serial.c n32_cordic.c n32_uid.c \ + n32_systemreset.c n32_start.c + +ifeq ($(CONFIG_N32H7_PROGMEM),y) +CHIP_CSRCS += n32_flash.c +endif + +ifeq ($(CONFIG_ARCH_N32H7_DUALCORE),y) +CHIP_CSRCS += n32_dualcore.c +endif + +ifeq ($(CONFIG_N32H7_HSEM),y) +CHIP_CSRCS += n32_hsem.c +endif + +ifeq ($(CONFIG_RPTUN),y) +CHIP_CSRCS += n32_rptun.c +endif + +ifeq ($(CONFIG_SCHED_TICKLESS),y) +CHIP_CSRCS += n32_tickless.c +else +CHIP_CSRCS += n32_timerisr.c +endif + +ifeq ($(CONFIG_N32H7_ONESHOT),y) +CHIP_CSRCS += n32_oneshot.c +endif + +ifeq ($(CONFIG_ONESHOT),y) +CHIP_CSRCS += n32_oneshot_lowerhalf.c +endif + +ifeq ($(CONFIG_ARM_MPU),y) +CHIP_CSRCS += n32_mpuinit.c +endif + +ifeq ($(CONFIG_BUILD_PROTECTED),y) +CHIP_CSRCS += n32_userspace.c +endif + +ifeq ($(CONFIG_N32H7_ADC),y) +CHIP_CSRCS += n32_adc.c +endif + +ifeq ($(CONFIG_N32H7_FDCAN),y) +CHIP_CSRCS += n32_fdcan_sock.c +endif + +ifeq ($(CONFIG_N32H7_BBSRAM),y) +CHIP_CSRCS += n32_bbsram.c +endif + +ifeq ($(CONFIG_N32H7_DMA),y) +CHIP_CSRCS += n32_dma.c +endif + +ifeq ($(CONFIG_N32H7_FMC),y) +CHIP_CSRCS += n32_fmc.c +endif + +ifeq ($(CONFIG_N32H7_IWDG)$(CONFIG_N32H7_RTC_LSICLOCK),yy) +CHIP_CSRCS += n32_lsi.c +endif + +ifeq ($(CONFIG_N32H7_RTC_LSECLOCK),y) +CHIP_CSRCS += n32_lse.c +endif + +ifeq ($(CONFIG_N32H7_I2C),y) +CHIP_CSRCS += n32_i2c.c +endif + +ifeq ($(CONFIG_N32H7_PWR),y) +CHIP_CSRCS += n32_pwr.c +endif + +ifeq ($(CONFIG_ARCH_IDLE_CUSTOM),y) +CHIP_CSRCS += n32_idle.c +endif + +ifeq ($(CONFIG_N32H7_QUADSPI),y) +CHIP_CSRCS += n32_qspi.c +endif + +ifeq ($(CONFIG_N32H7_RTC),y) +CHIP_CSRCS += n32_rtc.c +ifeq ($(CONFIG_RTC_ALARM),y) +CHIP_CSRCS += n32_exti_alarm.c +endif +ifeq ($(CONFIG_RTC_PERIODIC),y) +CHIP_CSRCS += n32_exti_wakeup.c +endif +ifeq ($(CONFIG_RTC_DRIVER),y) +CHIP_CSRCS += n32_rtc_lowerhalf.c +endif +endif + +ifeq ($(CONFIG_N32H7_SPI),y) +CHIP_CSRCS += n32_spi.c +endif + +ifeq ($(CONFIG_SPI_SLAVE),y) +CHIP_CSRCS += n32_spi_slave.c +endif + +ifeq ($(CONFIG_N32H7_SDMMC),y) +CHIP_CSRCS += n32_sdmmc.c +endif + +ifeq ($(CONFIG_TIMER),y) +CHIP_CSRCS += n32_tim_lowerhalf.c +endif + +ifeq ($(CONFIG_USBDEV),y) +CHIP_CSRCS += n32_usbhsdev.c +endif + +ifeq ($(CONFIG_USBHOST),y) +CHIP_CSRCS += n32_usbhshost.c +endif + +ifeq ($(CONFIG_N32H7_TIM),y) +CHIP_CSRCS += n32_tim.c +endif + +ifeq ($(CONFIG_N32H7_LPTIM),y) +CHIP_CSRCS += n32_lptim.c +endif + +ifeq ($(CONFIG_N32H7_CAPTURE),y) +CHIP_CSRCS += n32_capture.c +endif + +ifeq ($(CONFIG_CAPTURE),y) +CHIP_CSRCS += n32_capture_lowerhalf.c +endif + +ifeq ($(CONFIG_N32H7_PWM),y) +CHIP_CSRCS += n32_pwm.c +endif + +ifeq ($(CONFIG_N32H7_ETHMAC),y) +CHIP_CSRCS += n32_ethernet.c +endif + +ifeq ($(CONFIG_SENSORS_QENCODER),y) +CHIP_CSRCS += n32_qencoder.c +endif + +ifeq ($(CONFIG_PM),y) +CHIP_CSRCS += n32_pmsleep.c n32_pmstandby.c n32_pmstop.c +ifneq ($(CONFIG_ARCH_CUSTOM_PMINIT),y) +CHIP_CSRCS += n32_pminitialize.c +endif +endif + +ifeq ($(CONFIG_N32H7_IWDG),y) +CHIP_CSRCS += n32_iwdg.c +endif + +ifeq ($(CONFIG_N32H7_WWDG),y) +CHIP_CSRCS += n32_wwdg.c +endif diff --git a/arch/arm/src/n32h7/chip.h b/arch/arm/src/n32h7/chip.h new file mode 100644 index 0000000000000..ad227e1931dd7 --- /dev/null +++ b/arch/arm/src/n32h7/chip.h @@ -0,0 +1,70 @@ +/**************************************************************************** + * arch/arm/src/n32h7/chip.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __ARCH_ARM_SRC_N32H7_CHIP_H +#define __ARCH_ARM_SRC_N32H7_CHIP_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +/* Include the memory map and the chip definitions file. Other chip + * hardware files should then include this file for the proper setup. + */ + +#include +#include +#include "hardware/n32h7_pinmap.h" +#include "hardware/n32h7_memorymap.h" + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* If the common ARMv7-M vector handling logic is used, then it expects the + * following definition in this file that provides the number of supported + * external interrupts which, for this architecture, is provided in the + * arch/n32h7/chip.h header file. + */ + +#define ARMV7M_PERIPHERAL_INTERRUPTS N32H7_IRQ_NEXTINTS + +/* Cache line sizes (in bytes)for the N32H7 */ + +#define ARMV7M_DCACHE_LINESIZE 32 /* 32 bytes (8 words) */ +#define ARMV7M_ICACHE_LINESIZE 32 /* 32 bytes (8 words) */ + +/**************************************************************************** + * Public Types + ****************************************************************************/ + +/**************************************************************************** + * Public Data + ****************************************************************************/ + +/**************************************************************************** + * Public Function Prototypes + ****************************************************************************/ + +#endif /* __ARCH_ARM_SRC_N32H7_CHIP_H */ diff --git a/arch/arm/src/n32h7/hardware/n32h76x_afio.h b/arch/arm/src/n32h7/hardware/n32h76x_afio.h new file mode 100644 index 0000000000000..8ac81800642e7 --- /dev/null +++ b/arch/arm/src/n32h7/hardware/n32h76x_afio.h @@ -0,0 +1,802 @@ +/**************************************************************************** + * arch/arm/src/n32h7/hardware/n32h76x_afio.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __ARCH_ARM_SRC_N32H7_HARDWARE_N32H76X_AFIO_H +#define __ARCH_ARM_SRC_N32H7_HARDWARE_N32H76X_AFIO_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + + #include + #include "chip.h" + #include "hardware/n32h7_memorymap.h" + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* Register Offsets *********************************************************/ + +#define N32_AFIO_XSPI1_NON_OFFSET(n) (0x0008 + (n) * 4) +#define N32_AFIO_EXTI_CFG_OFFSET(n) (0x0018 + (n) * 4) +#define N32_AFIO_TOL5V_CFG0_2_OFFSET(n) (0x0028 + (n) * 4) +#define N32_AFIO_TOL5V_CFG3_6_OFFSET(n) (0x003C + (n) * 4) +#define N32_AFIO_EFT_CFG_OFFSET(n) (0x0054 + (n) * 4) +#define N32_AFIO_DIGEFT_CFG_OFFSET(n) (0x006C + (n) * 4) +#define N32_AFIO_SHRT1_EXEV_CFG_OFFSET(n) (0x0084 + (n) * 4) +#define N32_AFIO_SHRT2_EXEV_CFG_OFFSET(n) (0x008C + (n) * 4) +#define N32_AFIO_SDRAM_HSMOD_CFG_OFFSET(n) (0x0098 + (n) * 4) +#define N32_AFIO_SDRAM_VREF_EN_OFFSET(n) (0x00D8 + (n) * 4) +#define N32_AFIO_SDRAMDSN_CFG_OFFSET(n) (0x00E4 + (n) * 4) +#define N32_AFIO_SDRAMDSP_CFG_OFFSET(n) (0x00F0 + (n) * 4) + +#define N32_AFIO_RMP_CFG_OFFSET 0x0000 /* Mapping Configuration Register */ +#define N32_AFIO_FILTER_CFG_OFFSET 0x0004 /* IOM Filter Control Register */ +#define N32_AFIO_XSPI1_NON0_OFFSET 0x0008 /* XSPI1 Nonce Register 0 */ +#define N32_AFIO_XSPI1_NON1_OFFSET 0x000C /* XSPI1 Nonce Register 1 */ +#define N32_AFIO_XSPI1_NON2_OFFSET 0x0010 /* XSPI1 Nonce Register 2 */ +#define N32_AFIO_ADCRMP_CFG_OFFSET 0x0014 /* ADC Remap Configure Register */ +#define N32_AFIO_EXTI_CFG0_OFFSET 0x0018 /* External Interrupt Config Reg 0 */ +#define N32_AFIO_EXTI_CFG1_OFFSET 0x001C /* External Interrupt Config Reg 1 */ +#define N32_AFIO_EXTI_CFG2_OFFSET 0x0020 /* External Interrupt Config Reg 2 */ +#define N32_AFIO_EXTI_CFG3_OFFSET 0x0024 /* External Interrupt Config Reg 3 */ +#define N32_AFIO_TOL5V_CFG0_OFFSET 0x0028 /* IO Port 5V Tolerance Config Reg 0 */ +#define N32_AFIO_TOL5V_CFG1_OFFSET 0x002C /* IO Port 5V Tolerance Config Reg 1 */ +#define N32_AFIO_TOL5V_CFG2_OFFSET 0x0030 /* IO Port 5V Tolerance Config Reg 2 */ +#define N32_AFIO_SHRT1_FALT_CFG_OFFSET 0x0034 /* SHRTIM1 Fat Config Register */ +#define N32_AFIO_SHRT2_FALT_CFG_OFFSET 0x0038 /* SHRTIM2 Fat Config Register */ +#define N32_AFIO_TOL5V_CFG3_OFFSET 0x003C /* IO Port 5V Tolerance Config Reg 3 */ +#define N32_AFIO_TOL5V_CFG4_OFFSET 0x0044 /* IO Port 5V Tolerance Config Reg 4 */ +#define N32_AFIO_TOL5V_CFG5_OFFSET 0x0048 /* IO Port 5V Tolerance Config Reg 5 */ +#define N32_AFIO_TOL5V_CFG6_OFFSET 0x004C /* IO Port 5V Tolerance Config Reg 6 */ +#define N32_AFIO_EFT_CFG0_OFFSET 0x0054 /* IO Port Analog Filtering Config Reg 0 */ +#define N32_AFIO_EFT_CFG1_OFFSET 0x0058 /* IO Port Analog Filtering Config Reg 1 */ +#define N32_AFIO_EFT_CFG2_OFFSET 0x005C /* IO Port Analog Filtering Config Reg 2 */ +#define N32_AFIO_EFT_CFG3_OFFSET 0x0060 /* IO Port Analog Filtering Config Reg 3 */ +#define N32_AFIO_EFT_CFG4_OFFSET 0x0064 /* IO Port Analog Filtering Config Reg 4 */ +#define N32_AFIO_EFT_CFG5_OFFSET 0x0068 /* IO Port Analog Filtering Config Reg 5 */ +#define N32_AFIO_DIGEFT_CFG0_OFFSET 0x006C /* IO Port Digital Filtering Config Reg 0 */ +#define N32_AFIO_DIGEFT_CFG1_OFFSET 0x0070 /* IO Port Digital Filtering Config Reg 1 */ +#define N32_AFIO_DIGEFT_CFG2_OFFSET 0x0074 /* IO Port Digital Filtering Config Reg 2 */ +#define N32_AFIO_DIGEFT_CFG3_OFFSET 0x0078 /* IO Port Digital Filtering Config Reg 3 */ +#define N32_AFIO_DIGEFT_CFG4_OFFSET 0x007C /* IO Port Digital Filtering Config Reg 4 */ +#define N32_AFIO_DIGEFT_CFG5_OFFSET 0x0080 /* IO Port Digital Filtering Config Reg 5 */ +#define N32_AFIO_SHRT1_EXEV_CFG0_OFFSET 0x0084 /* SHRTIM1 External Event Config Reg 0 */ +#define N32_AFIO_SHRT1_EXEV_CFG1_OFFSET 0x0088 /* SHRTIM1 External Event Config Reg 1 */ +#define N32_AFIO_SHRT2_EXEV_CFG0_OFFSET 0x008C /* SHRTIM2 External Event Config Reg 0 */ +#define N32_AFIO_SHRT2_EXEV_CFG1_OFFSET 0x0090 /* SHRTIM2 External Event Config Reg 1 */ +#define N32_AFIO_SIP_PUPD_OFFSET 0x0094 /* SIP Pl-up/Pl-down Config Register */ +#define N32_AFIO_SDRAM_HSMOD_CFG0_OFFSET 0x0098 /* SDRAM HS MODE Config Register 0 */ +#define N32_AFIO_SDRAM_HSMOD_CFG1_OFFSET 0x009C /* SDRAM HS MODE Config Register 1 */ +#define N32_AFIO_SDRAM_HSMOD_CFG2_OFFSET 0x00A0 /* SDRAM HS MODE Config Register 2 */ +#define N32_AFIO_SDRAM_HSMOD_CFG3_OFFSET 0x00A4 /* SDRAM HS MODE Config Register 3 */ +#define N32_AFIO_SDRAM_HSMOD_CFG4_OFFSET 0x00A8 /* SDRAM HS MODE Config Register 4 */ +#define N32_AFIO_SIP_SR_OFFSET 0x00B0 /* SIP SR Configuration Register */ +#define N32_AFIO_SIP_DS_OFFSET 0x00B4 /* SIP DS Configuration Register */ +#define N32_AFIO_ADCSW_CFG_OFFSET 0x00D0 /* ADC Switch Configuration Register */ +#define N32_AFIO_SDRAM_VREF_EN0_OFFSET 0x00D8 /* SDRAM VREF Enable 0 Config Register */ +#define N32_AFIO_SDRAM_VREF_EN1_OFFSET 0x00DC /* SDRAM VREF Enable 1 Config Register */ +#define N32_AFIO_SDRAM_VREF_EN2_OFFSET 0x00E0 /* SDRAM VREF Enable 2 Config Register */ +#define N32_AFIO_SDRAMDSN_CFG0_OFFSET 0x00E4 /* SDRAM DSN 0 Config Register */ +#define N32_AFIO_SDRAMDSN_CFG1_OFFSET 0x00E8 /* SDRAM DSN 1 Config Register */ +#define N32_AFIO_SDRAMDSN_CFG2_OFFSET 0x00EC /* SDRAM DSN 2 Config Register */ +#define N32_AFIO_SDRAMDSP_CFG0_OFFSET 0x00F0 /* SDRAM DSP 0 Config Register */ +#define N32_AFIO_SDRAMDSP_CFG1_OFFSET 0x00F4 /* SDRAM DSP 1 Config Register */ +#define N32_AFIO_SDRAMDSP_CFG2_OFFSET 0x00F8 /* SDRAM DSP 2 Config Register */ + +/* Register Addresses *******************************************************/ + +#define N32_AFIO_XSPI1_NON(n) (N32_AFIO_BASE + N32_AFIO_XSPI1_NON_OFFSET(n)) +#define N32_AFIO_EXTI_CFG(n) (N32_AFIO_BASE + N32_AFIO_EXTI_CFG_OFFSET(n)) +#define N32_AFIO_TOL5V_CFG0_2(n) (N32_AFIO_BASE + N32_AFIO_TOL5V_CFG0_2_OFFSET(n)) +#define N32_AFIO_TOL5V_CFG3_6(n) (N32_AFIO_BASE + N32_AFIO_TOL5V_CFG3_6_OFFSET(n)) +#define N32_AFIO_EFT_CFG(n) (N32_AFIO_BASE + N32_AFIO_EFT_CFG_OFFSET(n)) +#define N32_AFIO_DIGEFT_CFG(n) (N32_AFIO_BASE + N32_AFIO_DIGEFT_CFG_OFFSET(n)) +#define N32_AFIO_SHRT1_EXEV_CFG(n) (N32_AFIO_BASE + N32_AFIO_SHRT1_EXEV_CFG_OFFSET(n)) +#define N32_AFIO_SHRT2_EXEV_CFG(n) (N32_AFIO_BASE + N32_AFIO_SHRT2_EXEV_CFG_OFFSET(n)) +#define N32_AFIO_SDRAM_HSMOD_CFG(n) (N32_AFIO_BASE + N32_AFIO_SDRAM_HSMOD_CFG_OFFSET(n)) +#define N32_AFIO_SDRAM_VREF_EN(n) (N32_AFIO_BASE + N32_AFIO_SDRAM_VREF_EN_OFFSET(n)) +#define N32_AFIO_SDRAMDSN_CFG(n) (N32_AFIO_BASE + N32_AFIO_SDRAMDSN_CFG_OFFSET(n)) +#define N32_AFIO_SDRAMDSP_CFG(n) (N32_AFIO_BASE + N32_AFIO_SDRAMDSP_CFG_OFFSET(n)) + +#define N32_AFIO_RMP_CFG (N32_AFIO_BASE + N32_AFIO_RMP_CFG_OFFSET) +#define N32_AFIO_FILTER_CFG (N32_AFIO_BASE + N32_AFIO_FILTER_CFG_OFFSET) +#define N32_AFIO_XSPI1_NON0 (N32_AFIO_BASE + N32_AFIO_XSPI1_NON0_OFFSET) +#define N32_AFIO_XSPI1_NON1 (N32_AFIO_BASE + N32_AFIO_XSPI1_NON1_OFFSET) +#define N32_AFIO_XSPI1_NON2 (N32_AFIO_BASE + N32_AFIO_XSPI1_NON2_OFFSET) +#define N32_AFIO_ADCRMP_CFG (N32_AFIO_BASE + N32_AFIO_ADCRMP_CFG_OFFSET) +#define N32_AFIO_EXTI_CFG0 (N32_AFIO_BASE + N32_AFIO_EXTI_CFG0_OFFSET) +#define N32_AFIO_EXTI_CFG1 (N32_AFIO_BASE + N32_AFIO_EXTI_CFG1_OFFSET) +#define N32_AFIO_EXTI_CFG2 (N32_AFIO_BASE + N32_AFIO_EXTI_CFG2_OFFSET) +#define N32_AFIO_EXTI_CFG3 (N32_AFIO_BASE + N32_AFIO_EXTI_CFG3_OFFSET) +#define N32_AFIO_TOL5V_CFG0 (N32_AFIO_BASE + N32_AFIO_TOL5V_CFG0_OFFSET) +#define N32_AFIO_TOL5V_CFG1 (N32_AFIO_BASE + N32_AFIO_TOL5V_CFG1_OFFSET) +#define N32_AFIO_TOL5V_CFG2 (N32_AFIO_BASE + N32_AFIO_TOL5V_CFG2_OFFSET) +#define N32_AFIO_SHRT1_FALT_CFG (N32_AFIO_BASE + N32_AFIO_SHRT1_FALT_CFG_OFFSET) +#define N32_AFIO_SHRT2_FALT_CFG (N32_AFIO_BASE + N32_AFIO_SHRT2_FALT_CFG_OFFSET) +#define N32_AFIO_TOL5V_CFG3 (N32_AFIO_BASE + N32_AFIO_TOL5V_CFG3_OFFSET) +#define N32_AFIO_TOL5V_CFG4 (N32_AFIO_BASE + N32_AFIO_TOL5V_CFG4_OFFSET) +#define N32_AFIO_TOL5V_CFG5 (N32_AFIO_BASE + N32_AFIO_TOL5V_CFG5_OFFSET) +#define N32_AFIO_TOL5V_CFG6 (N32_AFIO_BASE + N32_AFIO_TOL5V_CFG6_OFFSET) +#define N32_AFIO_EFT_CFG0 (N32_AFIO_BASE + N32_AFIO_EFT_CFG0_OFFSET) +#define N32_AFIO_EFT_CFG1 (N32_AFIO_BASE + N32_AFIO_EFT_CFG1_OFFSET) +#define N32_AFIO_EFT_CFG2 (N32_AFIO_BASE + N32_AFIO_EFT_CFG2_OFFSET) +#define N32_AFIO_EFT_CFG3 (N32_AFIO_BASE + N32_AFIO_EFT_CFG3_OFFSET) +#define N32_AFIO_EFT_CFG4 (N32_AFIO_BASE + N32_AFIO_EFT_CFG4_OFFSET) +#define N32_AFIO_EFT_CFG5 (N32_AFIO_BASE + N32_AFIO_EFT_CFG5_OFFSET) +#define N32_AFIO_DIGEFT_CFG0 (N32_AFIO_BASE + N32_AFIO_DIGEFT_CFG0_OFFSET) +#define N32_AFIO_DIGEFT_CFG1 (N32_AFIO_BASE + N32_AFIO_DIGEFT_CFG1_OFFSET) +#define N32_AFIO_DIGEFT_CFG2 (N32_AFIO_BASE + N32_AFIO_DIGEFT_CFG2_OFFSET) +#define N32_AFIO_DIGEFT_CFG3 (N32_AFIO_BASE + N32_AFIO_DIGEFT_CFG3_OFFSET) +#define N32_AFIO_DIGEFT_CFG4 (N32_AFIO_BASE + N32_AFIO_DIGEFT_CFG4_OFFSET) +#define N32_AFIO_DIGEFT_CFG5 (N32_AFIO_BASE + N32_AFIO_DIGEFT_CFG5_OFFSET) +#define N32_AFIO_SHRT1_EXEV_CFG0 (N32_AFIO_BASE + N32_AFIO_SHRT1_EXEV_CFG0_OFFSET) +#define N32_AFIO_SHRT1_EXEV_CFG1 (N32_AFIO_BASE + N32_AFIO_SHRT1_EXEV_CFG1_OFFSET) +#define N32_AFIO_SHRT2_EXEV_CFG0 (N32_AFIO_BASE + N32_AFIO_SHRT2_EXEV_CFG0_OFFSET) +#define N32_AFIO_SHRT2_EXEV_CFG1 (N32_AFIO_BASE + N32_AFIO_SHRT2_EXEV_CFG1_OFFSET) +#define N32_AFIO_SIP_PUPD (N32_AFIO_BASE + N32_AFIO_SIP_PUPD_OFFSET) +#define N32_AFIO_SDRAM_HSMOD_CFG0 (N32_AFIO_BASE + N32_AFIO_SDRAM_HSMOD_CFG0_OFFSET) +#define N32_AFIO_SDRAM_HSMOD_CFG1 (N32_AFIO_BASE + N32_AFIO_SDRAM_HSMOD_CFG1_OFFSET) +#define N32_AFIO_SDRAM_HSMOD_CFG2 (N32_AFIO_BASE + N32_AFIO_SDRAM_HSMOD_CFG2_OFFSET) +#define N32_AFIO_SDRAM_HSMOD_CFG3 (N32_AFIO_BASE + N32_AFIO_SDRAM_HSMOD_CFG3_OFFSET) +#define N32_AFIO_SDRAM_HSMOD_CFG4 (N32_AFIO_BASE + N32_AFIO_SDRAM_HSMOD_CFG4_OFFSET) +#define N32_AFIO_SIP_SR (N32_AFIO_BASE + N32_AFIO_SIP_SR_OFFSET) +#define N32_AFIO_SIP_DS (N32_AFIO_BASE + N32_AFIO_SIP_DS_OFFSET) +#define N32_AFIO_ADCSW_CFG (N32_AFIO_BASE + N32_AFIO_ADCSW_CFG_OFFSET) +#define N32_AFIO_SDRAM_VREF_EN0 (N32_AFIO_BASE + N32_AFIO_SDRAM_VREF_EN0_OFFSET) +#define N32_AFIO_SDRAM_VREF_EN1 (N32_AFIO_BASE + N32_AFIO_SDRAM_VREF_EN1_OFFSET) +#define N32_AFIO_SDRAM_VREF_EN2 (N32_AFIO_BASE + N32_AFIO_SDRAM_VREF_EN2_OFFSET) +#define N32_AFIO_SDRAMDSN_CFG0 (N32_AFIO_BASE + N32_AFIO_SDRAMDSN_CFG0_OFFSET) +#define N32_AFIO_SDRAMDSN_CFG1 (N32_AFIO_BASE + N32_AFIO_SDRAMDSN_CFG1_OFFSET) +#define N32_AFIO_SDRAMDSN_CFG2 (N32_AFIO_BASE + N32_AFIO_SDRAMDSN_CFG2_OFFSET) +#define N32_AFIO_SDRAMDSP_CFG0 (N32_AFIO_BASE + N32_AFIO_SDRAMDSP_CFG0_OFFSET) +#define N32_AFIO_SDRAMDSP_CFG1 (N32_AFIO_BASE + N32_AFIO_SDRAMDSP_CFG1_OFFSET) +#define N32_AFIO_SDRAMDSP_CFG2 (N32_AFIO_BASE + N32_AFIO_SDRAMDSP_CFG2_OFFSET) + +/* Register Bit Definitions *************************************************/ + +/* AFIO_RMP_CFG - AFIO Mapping Configuration Register (Offset: 0x00) */ + +/* Single-bit fields */ +#define N32_AFIO_RMP_CFG_EXTL_AFLTBYPS (1 << 30) /* Bit 30: Bypass analog filter for EXTI */ +#define N32_AFIO_RMP_CFG_SIP_SDRAM_SEL (1 << 29) /* Bit 29: Set SIP SDRAM PAD priority */ +#define N32_AFIO_RMP_CFG_SPI4SEL (1 << 28) /* Bit 28: Select SPI4/I2S4 function */ +#define N32_AFIO_RMP_CFG_SPI3SEL (1 << 27) /* Bit 27: Select SPI3/I2S3 function */ +#define N32_AFIO_RMP_CFG_SPI2SEL (1 << 26) /* Bit 26: Select SPI2/I2S2 function */ +#define N32_AFIO_RMP_CFG_SPI1SEL (1 << 25) /* Bit 25: Select SPI1/I2S1 function */ +#define N32_AFIO_RMP_CFG_SDMMC1_CLKFB (1 << 24) /* Bit 24: SDMMC1 clock input selection */ +#define N32_AFIO_RMP_CFG_SDMMC2_CLKFB (1 << 23) /* Bit 23: SDMMC2 clock input selection */ +#define N32_AFIO_RMP_CFG_XSPI2_EDN (1 << 19) /* Bit 19: XSPI2 endian selection */ +#define N32_AFIO_RMP_CFG_XSPI1_EDN (1 << 18) /* Bit 18: XSPI1 endian selection */ +#define N32_AFIO_RMP_CFG_FEMCSEL (1 << 17) /* Bit 17: FEMC work mode selection */ +#define N32_AFIO_RMP_CFG_FEMC_NOBYTE (1 << 16) /* Bit 16: FEMC byte strokes support */ +#define N32_AFIO_RMP_CFG_ETH2_PHY (1 << 15) /* Bit 15: ETH2 PHY selection */ +#define N32_AFIO_RMP_CFG_SPI7_NSS (1 << 12) /* Bit 12: SPI7 NSS idle mode */ +#define N32_AFIO_RMP_CFG_SPI6_NSS (1 << 11) /* Bit 11: SPI6 NSS idle mode */ +#define N32_AFIO_RMP_CFG_SPI5_NSS (1 << 10) /* Bit 10: SPI5 NSS idle mode */ +#define N32_AFIO_RMP_CFG_SPI4_NSS (1 << 9) /* Bit 9: SPI4 NSS idle mode */ +#define N32_AFIO_RMP_CFG_SPI3_NSS (1 << 8) /* Bit 8: SPI3 NSS idle mode */ +#define N32_AFIO_RMP_CFG_SPI2_NSS (1 << 7) /* Bit 7: SPI2 NSS idle mode */ +#define N32_AFIO_RMP_CFG_SPI1_NSS (1 << 6) /* Bit 6: SPI1 NSS idle mode */ + +/* Multi-bit fields */ + +/* I2S_FDUP[1:0] (Bits 22-21) */ +#define N32_AFIO_RMP_CFG_I2S_FDUP_SHIFT (21) /* I2S full duplex mode selection shift */ +#define N32_AFIO_RMP_CFG_I2S_FDUP_MASK (0x3 << N32_AFIO_RMP_CFG_I2S_FDUP_SHIFT) +# define N32_AFIO_RMP_CFG_I2S1_FDUP (0x0 << N32_AFIO_RMP_CFG_I2S_FDUP_SHIFT) /* I2S1 full duplex */ +# define N32_AFIO_RMP_CFG_I2S2_FDUP (0x1 << N32_AFIO_RMP_CFG_I2S_FDUP_SHIFT) /* I2S2 full duplex */ +# define N32_AFIO_RMP_CFG_I2S3_FDUP (0x2 << N32_AFIO_RMP_CFG_I2S_FDUP_SHIFT) /* I2S3 full duplex */ +# define N32_AFIO_RMP_CFG_I2S4_FDUP (0x3 << N32_AFIO_RMP_CFG_I2S_FDUP_SHIFT) /* I2S4 full duplex */ + +/* ETH1_PHY[1:0] (Bits 14-13) */ +#define N32_AFIO_RMP_CFG_ETH1_PHY_SHIFT (13) /* ETH1 PHY selection shift */ +#define N32_AFIO_RMP_CFG_ETH1_PHY_MASK (0x3 << N32_AFIO_RMP_CFG_ETH1_PHY_SHIFT) +# define N32_AFIO_RMP_CFG_ETH1_GMII (0x0 << N32_AFIO_RMP_CFG_ETH1_PHY_SHIFT) /* GMII mode */ +# define N32_AFIO_RMP_CFG_ETH1_RGMII (0x1 << N32_AFIO_RMP_CFG_ETH1_PHY_SHIFT) /* RGMII mode */ +# define N32_AFIO_RMP_CFG_ETH1_RMII (0x2 << N32_AFIO_RMP_CFG_ETH1_PHY_SHIFT) /* RMII mode */ +# define N32_AFIO_RMP_CFG_ETH1_MII (0x3 << N32_AFIO_RMP_CFG_ETH1_PHY_SHIFT) /* MII mode */ + +/* SIP_FLASHSEL[2:0] (Bits 2-0) */ +#define N32_AFIO_RMP_CFG_SIP_FLASHSEL_SHIFT (0) /* SIP flash model selection shift */ +#define N32_AFIO_RMP_CFG_SIP_FLASHSEL_MASK (0x7 << N32_AFIO_RMP_CFG_SIP_FLASHSEL_SHIFT) +# define N32_AFIO_RMP_CFG_SIP_IS25WJ032F (0x0 << N32_AFIO_RMP_CFG_SIP_FLASHSEL_SHIFT) /* IS25WJ032F */ +# define N32_AFIO_RMP_CFG_SIP_IS25LP016D (0x1 << N32_AFIO_RMP_CFG_SIP_FLASHSEL_SHIFT) /* IS25LP016D/WP016D */ +# define N32_AFIO_RMP_CFG_SIP_XM25LU32CK (0x2 << N32_AFIO_RMP_CFG_SIP_FLASHSEL_SHIFT) /* XM25LU32CK */ +# define N32_AFIO_RMP_CFG_SIP_GT25Q16A (0x3 << N32_AFIO_RMP_CFG_SIP_FLASHSEL_SHIFT) /* GT25Q16A */ +# define N32_AFIO_RMP_CFG_SIP_GT25Q32A (0x4 << N32_AFIO_RMP_CFG_SIP_FLASHSEL_SHIFT) /* GT25Q32A */ +# define N32_AFIO_RMP_CFG_SIP_DISABLE (0x7 << N32_AFIO_RMP_CFG_SIP_FLASHSEL_SHIFT) /* Disable SIP */ + +/* AFIO_FILTER_CFG - AFIO IOM Filter Control Register (Offset: 0x04) */ + +/* Filter configuration field */ +#define N32_AFIO_FILTER_CFG_IDFLITCFG_SHIFT (0) /* Bits 6-0: Glitch Filter stage control shift */ +#define N32_AFIO_FILTER_CFG_IDFLITCFG_MASK (0x7F << N32_AFIO_FILTER_CFG_IDFLITCFG_SHIFT) +# define N32_AFIO_FILTER_CFG_BYPASS (0x00 << N32_AFIO_FILTER_CFG_IDFLITCFG_SHIFT) /* Filter bypass */ + +/* AFIO_XSPI1_NON0 - AFIO XSPI1 Nonce Register 0 (Offset: 0x08) */ + +/* 32-bit nonce value */ +#define N32_AFIO_XSPI1_NON0_NONCE_SHIFT (0) /* Nonce [31:0] shift */ +#define N32_AFIO_XSPI1_NON0_NONCE_MASK (0xFFFFFFFF << N32_AFIO_XSPI1_NON0_NONCE_SHIFT) + +/* AFIO_XSPI1_NON1 - AFIO XSPI1 Nonce Register 1 (Offset: 0x0C) */ + +/* 32-bit nonce value */ +#define N32_AFIO_XSPI1_NON1_NONCE_SHIFT (0) /* Nonce [63:32] shift */ +#define N32_AFIO_XSPI1_NON1_NONCE_MASK (0xFFFFFFFF << N32_AFIO_XSPI1_NON1_NONCE_SHIFT) + +/* AFIO_XSPI1_NON2 - AFIO XSPI1 Nonce Register 2 (Offset: 0x10) */ + +/* 32-bit nonce value */ +#define N32_AFIO_XSPI1_NON2_NONCE_SHIFT (0) /* Nonce [95:64] shift */ +#define N32_AFIO_XSPI1_NON2_NONCE_MASK (0xFFFFFFFF << N32_AFIO_XSPI1_NON2_NONCE_SHIFT) + +/* AFIO_ADCRMP_CFG - AFIO ADC Remap Configure Register (Offset: 0x14) */ + +/* ADC1 External Trigger Selections */ +#define N32_AFIO_ADCRMP_CFG_ADC1_INJ_EXTI_SHIFT (20) /* Bits 23-20: ADC1 injection channel external trigger */ +#define N32_AFIO_ADCRMP_CFG_ADC1_INJ_EXTI_MASK (0xF << N32_AFIO_ADCRMP_CFG_ADC1_INJ_EXTI_SHIFT) +#define N32_AFIO_ADCRMP_CFG_ADC1_REG_EXTI_SHIFT (16) /* Bits 19-16: ADC1 regular channel external trigger */ +#define N32_AFIO_ADCRMP_CFG_ADC1_REG_EXTI_MASK (0xF << N32_AFIO_ADCRMP_CFG_ADC1_REG_EXTI_SHIFT) + +/* ADC2 External Trigger Selections */ +#define N32_AFIO_ADCRMP_CFG_ADC2_INJ_EXTI_SHIFT (12) /* Bits 15-12: ADC2 injection channel external trigger */ +#define N32_AFIO_ADCRMP_CFG_ADC2_INJ_EXTI_MASK (0xF << N32_AFIO_ADCRMP_CFG_ADC2_INJ_EXTI_SHIFT) +#define N32_AFIO_ADCRMP_CFG_ADC2_REG_EXTI_SHIFT (8) /* Bits 11-8: ADC2 regular channel external trigger */ +#define N32_AFIO_ADCRMP_CFG_ADC2_REG_EXTI_MASK (0xF << N32_AFIO_ADCRMP_CFG_ADC2_REG_EXTI_SHIFT) + +/* ADC3 External Trigger Selections */ +#define N32_AFIO_ADCRMP_CFG_ADC3_INJ_EXTI_SHIFT (4) /* Bits 7-4: ADC3 injection channel external trigger */ +#define N32_AFIO_ADCRMP_CFG_ADC3_INJ_EXTI_MASK (0xF << N32_AFIO_ADCRMP_CFG_ADC3_INJ_EXTI_SHIFT) +#define N32_AFIO_ADCRMP_CFG_ADC3_REG_EXTI_SHIFT (0) /* Bits 3-0: ADC3 regular channel external trigger */ +#define N32_AFIO_ADCRMP_CFG_ADC3_REG_EXTI_MASK (0xF << N32_AFIO_ADCRMP_CFG_ADC3_REG_EXTI_SHIFT) + +/* EXTI Line Selection Values (applies to all ADC trigger fields) */ +#define N32_AFIO_ADC_EXTI_LINE0 0x0 +#define N32_AFIO_ADC_EXTI_LINE1 0x1 +#define N32_AFIO_ADC_EXTI_LINE2 0x2 +#define N32_AFIO_ADC_EXTI_LINE3 0x3 +#define N32_AFIO_ADC_EXTI_LINE4 0x4 +#define N32_AFIO_ADC_EXTI_LINE5 0x5 +#define N32_AFIO_ADC_EXTI_LINE6 0x6 +#define N32_AFIO_ADC_EXTI_LINE7 0x7 +#define N32_AFIO_ADC_EXTI_LINE8 0x8 +#define N32_AFIO_ADC_EXTI_LINE9 0x9 +#define N32_AFIO_ADC_EXTI_LINE10 0xA +#define N32_AFIO_ADC_EXTI_LINE11 0xB +#define N32_AFIO_ADC_EXTI_LINE12 0xC +#define N32_AFIO_ADC_EXTI_LINE13 0xD +#define N32_AFIO_ADC_EXTI_LINE14 0xE +#define N32_AFIO_ADC_EXTI_LINE15 0xF + +/* AFIO External Interrupt Configuration Registers */ + +/* EXTI port selection values */ +#define N32_AFIO_EXTICR_PORTA 0x00 /* 0000: PA[x] pin */ +#define N32_AFIO_EXTICR_PORTB 0x01 /* 0001: PB[x] pin */ +#define N32_AFIO_EXTICR_PORTC 0x02 /* 0010: PC[x] pin */ +#define N32_AFIO_EXTICR_PORTD 0x03 /* 0011: PD[x] pin */ +#define N32_AFIO_EXTICR_PORTE 0x04 /* 0100: PE[x] pin */ +#define N32_AFIO_EXTICR_PORTF 0x05 /* 0101: PF[x] pin */ +#define N32_AFIO_EXTICR_PORTG 0x06 /* 0110: PG[x] pin */ +#define N32_AFIO_EXTICR_PORTH 0x07 /* 0111: PH[x] pin */ +#define N32_AFIO_EXTICR_PORTI 0x08 /* 1000: PI[x] pin */ +#define N32_AFIO_EXTICR_PORTJ 0x09 /* 1001: PJ[x] pin */ +#define N32_AFIO_EXTICR_PORTK 0x0A /* 1010: PK[x] pin */ + +/* Common field definitions */ +#define N32_AFIO_EXTICR_PORT_MASK 0xFF /* 8-bit port selection mask */ +#define N32_AFIO_EXTICR_EXTI_WIDTH 8 /* Bits per EXTI line config */ +#define N32_AFIO_EXTICR_EXTI_SHIFT(g) (((g) & 3) << 3) +#define N32_AFIO_EXTICR_EXTI_MASK(g) (N32_AFIO_EXTICR_PORT_MASK << (N32_AFIO_EXTICR_EXTI_SHIFT(g))) + +/* AFIO_EXTI_CFG0 (Offset: 0x18) */ +#define N32_AFIO_EXTI_CFG0_EXTI0_SHIFT 0 /* Bits 7-0: EXTI0 configuration */ +#define N32_AFIO_EXTI_CFG0_EXTI0_MASK (N32_AFIO_EXTICR_PORT_MASK << N32_AFIO_EXTI_CFG0_EXTI0_SHIFT) +#define N32_AFIO_EXTI_CFG0_EXTI1_SHIFT 8 /* Bits 15-8: EXTI1 configuration */ +#define N32_AFIO_EXTI_CFG0_EXTI1_MASK (N32_AFIO_EXTICR_PORT_MASK << N32_AFIO_EXTI_CFG0_EXTI1_SHIFT) +#define N32_AFIO_EXTI_CFG0_EXTI2_SHIFT 16 /* Bits 23-16: EXTI2 configuration */ +#define N32_AFIO_EXTI_CFG0_EXTI2_MASK (N32_AFIO_EXTICR_PORT_MASK << N32_AFIO_EXTI_CFG0_EXTI2_SHIFT) +#define N32_AFIO_EXTI_CFG0_EXTI3_SHIFT 24 /* Bits 31-24: EXTI3 configuration */ +#define N32_AFIO_EXTI_CFG0_EXTI3_MASK (N32_AFIO_EXTICR_PORT_MASK << N32_AFIO_EXTI_CFG0_EXTI3_SHIFT) + +/* AFIO_EXTI_CFG1 (Offset: 0x1C) */ +#define N32_AFIO_EXTI_CFG1_EXTI4_SHIFT 0 /* Bits 7-0: EXTI4 configuration */ +#define N32_AFIO_EXTI_CFG1_EXTI4_MASK (N32_AFIO_EXTICR_PORT_MASK << N32_AFIO_EXTI_CFG1_EXTI4_SHIFT) +#define N32_AFIO_EXTI_CFG1_EXTI5_SHIFT 8 /* Bits 15-8: EXTI5 configuration */ +#define N32_AFIO_EXTI_CFG1_EXTI5_MASK (N32_AFIO_EXTICR_PORT_MASK << N32_AFIO_EXTI_CFG1_EXTI5_SHIFT) +#define N32_AFIO_EXTI_CFG1_EXTI6_SHIFT 16 /* Bits 23-16: EXTI6 configuration */ +#define N32_AFIO_EXTI_CFG1_EXTI6_MASK (N32_AFIO_EXTICR_PORT_MASK << N32_AFIO_EXTI_CFG1_EXTI6_SHIFT) +#define N32_AFIO_EXTI_CFG1_EXTI7_SHIFT 24 /* Bits 31-24: EXTI7 configuration */ +#define N32_AFIO_EXTI_CFG1_EXTI7_MASK (N32_AFIO_EXTICR_PORT_MASK << N32_AFIO_EXTI_CFG1_EXTI7_SHIFT) + +/* AFIO_EXTI_CFG2 (Offset: 0x20) */ +#define N32_AFIO_EXTI_CFG2_EXTI8_SHIFT 0 /* Bits 7-0: EXTI8 configuration */ +#define N32_AFIO_EXTI_CFG2_EXTI8_MASK (N32_AFIO_EXTICR_PORT_MASK << N32_AFIO_EXTI_CFG2_EXTI8_SHIFT) +#define N32_AFIO_EXTI_CFG2_EXTI9_SHIFT 8 /* Bits 15-8: EXTI9 configuration */ +#define N32_AFIO_EXTI_CFG2_EXTI9_MASK (N32_AFIO_EXTICR_PORT_MASK << N32_AFIO_EXTI_CFG2_EXTI9_SHIFT) +#define N32_AFIO_EXTI_CFG2_EXTI10_SHIFT 16 /* Bits 23-16: EXTI10 configuration */ +#define N32_AFIO_EXTI_CFG2_EXTI10_MASK (N32_AFIO_EXTICR_PORT_MASK << N32_AFIO_EXTI_CFG2_EXTI10_SHIFT) +#define N32_AFIO_EXTI_CFG2_EXTI11_SHIFT 24 /* Bits 31-24: EXTI11 configuration */ +#define N32_AFIO_EXTI_CFG2_EXTI11_MASK (N32_AFIO_EXTICR_PORT_MASK << N32_AFIO_EXTI_CFG2_EXTI11_SHIFT) + +/* AFIO_EXTI_CFG3 (Offset: 0x24) */ +#define N32_AFIO_EXTI_CFG3_EXTI12_SHIFT 0 /* Bits 7-0: EXTI12 configuration */ +#define N32_AFIO_EXTI_CFG3_EXTI12_MASK (N32_AFIO_EXTICR_PORT_MASK << N32_AFIO_EXTI_CFG3_EXTI12_SHIFT) +#define N32_AFIO_EXTI_CFG3_EXTI13_SHIFT 8 /* Bits 15-8: EXTI13 configuration */ +#define N32_AFIO_EXTI_CFG3_EXTI13_MASK (N32_AFIO_EXTICR_PORT_MASK << N32_AFIO_EXTI_CFG3_EXTI13_SHIFT) +#define N32_AFIO_EXTI_CFG3_EXTI14_SHIFT 16 /* Bits 23-16: EXTI14 configuration */ +#define N32_AFIO_EXTI_CFG3_EXTI14_MASK (N32_AFIO_EXTICR_PORT_MASK << N32_AFIO_EXTI_CFG3_EXTI14_SHIFT) +#define N32_AFIO_EXTI_CFG3_EXTI15_SHIFT 24 /* Bits 31-24: EXTI15 configuration */ +#define N32_AFIO_EXTI_CFG3_EXTI15_MASK (N32_AFIO_EXTICR_PORT_MASK << N32_AFIO_EXTI_CFG3_EXTI15_SHIFT) + +/* AFIO_TOL5V_CFG0 (Offset: 0x28) */ +#define N32_AFIO_TOL5V_CFG0_PA7TOLENN (1 << 9) /* Bit 9: PA7 5V tolerance */ +#define N32_AFIO_TOL5V_CFG0_PA6TOLENN (1 << 8) /* Bit 8: PA6 5V tolerance */ +#define N32_AFIO_TOL5V_CFG0_PA5TOLENN (1 << 7) /* Bit 7: PA5 5V tolerance */ +#define N32_AFIO_TOL5V_CFG0_PA4TOLENN (1 << 6) /* Bit 6: PA4 5V tolerance */ +#define N32_AFIO_TOL5V_CFG0_PA3TOLENN (1 << 5) /* Bit 5: PA3 5V tolerance */ +#define N32_AFIO_TOL5V_CFG0_PA2TOLENN (1 << 4) /* Bit 4: PA2 5V tolerance */ +#define N32_AFIO_TOL5V_CFG0_PA1_CTOLENN (1 << 3) /* Bit 3: PA1_C 5V tolerance */ +#define N32_AFIO_TOL5V_CFG0_PA1TOLENN (1 << 2) /* Bit 2: PA1 5V tolerance */ +#define N32_AFIO_TOL5V_CFG0_PA0_CTOLENN (1 << 1) /* Bit 1: PA0_C 5V tolerance */ +#define N32_AFIO_TOL5V_CFG0_PA0TOLENN (1 << 0) /* Bit 0: PA0 5V tolerance */ + +/* AFIO_TOL5V_CFG1 (Offset: 0x2C) */ +#define N32_AFIO_TOL5V_CFG1_PB1TOLENN (1 << 1) /* Bit 1: PB1 5V tolerance */ +#define N32_AFIO_TOL5V_CFG1_PB0TOLENN (1 << 0) /* Bit 0: PB0 5V tolerance */ + +/* AFIO_TOL5V_CFG2 (Offset: 0x30) */ +#define N32_AFIO_TOL5V_CFG2_PC13TOLENN (1 << 10) /* Bit 10: PC13 5V tolerance */ +#define N32_AFIO_TOL5V_CFG2_PC8TOLENN (1 << 9) /* Bit 9: PC8 5V tolerance */ +#define N32_AFIO_TOL5V_CFG2_PC6TOLENN (1 << 8) /* Bit 8: PC6 5V tolerance */ +#define N32_AFIO_TOL5V_CFG2_PC5TOLENN (1 << 7) /* Bit 7: PC5 5V tolerance */ +#define N32_AFIO_TOL5V_CFG2_PC4TOLENN (1 << 6) /* Bit 6: PC4 5V tolerance */ +#define N32_AFIO_TOL5V_CFG2_PC3_CTOLENN (1 << 5) /* Bit 5: PC3_C 5V tolerance */ +#define N32_AFIO_TOL5V_CFG2_PC3TOLENN (1 << 4) /* Bit 4: PC3 5V tolerance */ +#define N32_AFIO_TOL5V_CFG2_PC2_CTOLENN (1 << 3) /* Bit 3: PC2_C 5V tolerance */ +#define N32_AFIO_TOL5V_CFG2_PC2TOLENN (1 << 2) /* Bit 2: PC2 5V tolerance */ +#define N32_AFIO_TOL5V_CFG2_PC1TOLENN (1 << 1) /* Bit 1: PC1 5V tolerance */ +#define N32_AFIO_TOL5V_CFG2_PC0TOLENN (1 << 0) /* Bit 0: PC0 5V tolerance */ + +/* AFIO_TOL5V_CFG3 (Offset: 0x3C) */ +#define N32_AFIO_TOL5V_CFG3_PF14TOLENN (1 << 11) /* Bit 11: PF14 5V tolerance */ +#define N32_AFIO_TOL5V_CFG3_PF13TOLENN (1 << 10) /* Bit 10: PF13 5V tolerance */ +#define N32_AFIO_TOL5V_CFG3_PF12TOLENN (1 << 9) /* Bit 9: PF12 5V tolerance */ +#define N32_AFIO_TOL5V_CFG3_PF11TOLENN (1 << 8) /* Bit 8: PF11 5V tolerance */ +#define N32_AFIO_TOL5V_CFG3_PF10TOLENN (1 << 7) /* Bit 7: PF10 5V tolerance */ +#define N32_AFIO_TOL5V_CFG3_PF9TOLENN (1 << 6) /* Bit 6: PF9 5V tolerance */ +#define N32_AFIO_TOL5V_CFG3_PF8TOLENN (1 << 5) /* Bit 5: PF8 5V tolerance */ +#define N32_AFIO_TOL5V_CFG3_PF7TOLENN (1 << 4) /* Bit 4: PF7 5V tolerance */ +#define N32_AFIO_TOL5V_CFG3_PF6TOLENN (1 << 3) /* Bit 3: PF6 5V tolerance */ +#define N32_AFIO_TOL5V_CFG3_PF5TOLENN (1 << 2) /* Bit 2: PF5 5V tolerance */ +#define N32_AFIO_TOL5V_CFG3_PF4TOLENN (1 << 1) /* Bit 1: PF4 5V tolerance */ +#define N32_AFIO_TOL5V_CFG3_PF3TOLENN (1 << 0) /* Bit 0: PF3 5V tolerance */ + +/* AFIO_TOL5V_CFG4 (Offset: 0x44) */ +#define N32_AFIO_TOL5V_CFG4_PH5TOLENN (1 << 3) /* Bit 3: PH5 5V tolerance */ +#define N32_AFIO_TOL5V_CFG4_PH4TOLENN (1 << 2) /* Bit 2: PH4 5V tolerance */ +#define N32_AFIO_TOL5V_CFG4_PH3TOLENN (1 << 1) /* Bit 1: PH3 5V tolerance */ +#define N32_AFIO_TOL5V_CFG4_PH2TOLENN (1 << 0) /* Bit 0: PH2 5V tolerance */ + +/* AFIO_TOL5V_CFG6 (Offset: 0x4C) */ +#define N32_AFIO_TOL5V_CFG6_PI7TOLENN (1 << 5) /* Bit 5: PI7 5V tolerance */ +#define N32_AFIO_TOL5V_CFG6_PI6TOLENN (1 << 4) /* Bit 4: PI6 5V tolerance */ +#define N32_AFIO_TOL5V_CFG6_PI5TOLENN (1 << 3) /* Bit 3: PI5 5V tolerance */ +#define N32_AFIO_TOL5V_CFG6_PI4TOLENN (1 << 2) /* Bit 2: PI4 5V tolerance */ +#define N32_AFIO_TOL5V_CFG6_PI3TOLENN (1 << 1) /* Bit 1: PI3 5V tolerance */ +#define N32_AFIO_TOL5V_CFG6_PI0TOLENN (1 << 0) /* Bit 0: PI0 5V tolerance */ + +/* AFIO_SHRT1_FALT_CFG (Offset: 0x34) */ + +/* Fault channel selection values */ +#define N32_AFIO_SHRT1_FAULT_PA15 0x1 +#define N32_AFIO_SHRT1_FAULT_PB3 0x2 +#define N32_AFIO_SHRT1_FAULT_PC11 0x3 +#define N32_AFIO_SHRT1_FAULT_PD4 0x4 +#define N32_AFIO_SHRT1_FAULT_PE4 0x5 +#define N32_AFIO_SHRT1_FAULT_PG9 0x6 +#define N32_AFIO_SHRT1_FAULT_PG10 0x7 +#define N32_AFIO_SHRT1_FAULT_PI6 0x8 +#define N32_AFIO_SHRT1_FAULT_PI15 0x9 +#define N32_AFIO_SHRT1_FAULT_PK2 0xA + +/* Fault channel configuration fields */ +#define N32_AFIO_SHRT1_FAULT1_SHIFT (0) /* Bits 3-0: Fault channel 1 */ +#define N32_AFIO_SHRT1_FAULT1_MASK (0xF << N32_AFIO_SHRT1_FAULT1_SHIFT) +#define N32_AFIO_SHRT1_FAULT2_SHIFT (4) /* Bits 7-4: Fault channel 2 */ +#define N32_AFIO_SHRT1_FAULT2_MASK (0xF << N32_AFIO_SHRT1_FAULT2_SHIFT) +#define N32_AFIO_SHRT1_FAULT3_SHIFT (8) /* Bits 11-8: Fault channel 3 */ +#define N32_AFIO_SHRT1_FAULT3_MASK (0xF << N32_AFIO_SHRT1_FAULT3_SHIFT) +#define N32_AFIO_SHRT1_FAULT4_SHIFT (12) /* Bits 15-12: Fault channel 4 */ +#define N32_AFIO_SHRT1_FAULT4_MASK (0xF << N32_AFIO_SHRT1_FAULT4_SHIFT) +#define N32_AFIO_SHRT1_FAULT5_SHIFT (16) /* Bits 19-16: Fault channel 5 */ +#define N32_AFIO_SHRT1_FAULT5_MASK (0xF << N32_AFIO_SHRT1_FAULT5_SHIFT) +#define N32_AFIO_SHRT1_FAULT6_SHIFT (20) /* Bits 23-20: Fault channel 6 */ +#define N32_AFIO_SHRT1_FAULT6_MASK (0xF << N32_AFIO_SHRT1_FAULT6_SHIFT) + +/* AFIO_SHRT2_FALT_CFG (Offset: 0x38) */ + +/* Fault channel selection values */ +#define N32_AFIO_SHRT2_FAULT_PC5 0x1 +#define N32_AFIO_SHRT2_FAULT_PD1 0x2 +#define N32_AFIO_SHRT2_FAULT_PD15 0x3 +#define N32_AFIO_SHRT2_FAULT_PF9 0x4 +#define N32_AFIO_SHRT2_FAULT_PF13 0x5 +#define N32_AFIO_SHRT2_FAULT_PG1 0x6 +#define N32_AFIO_SHRT2_FAULT_PI0 0x7 +#define N32_AFIO_SHRT2_FAULT_PJ9 0x8 +#define N32_AFIO_SHRT2_FAULT_PI13 0x9 +#define N32_AFIO_SHRT2_FAULT_PJ0 0xA +#define N32_AFIO_SHRT2_FAULT_PK1 0xB +#define N32_AFIO_SHRT2_FAULT_PK6 0xC + +/* Fault channel configuration fields */ +#define N32_AFIO_SHRT2_FAULT1_SHIFT (0) /* Bits 3-0: Fault channel 1 */ +#define N32_AFIO_SHRT2_FAULT1_MASK (0xF << N32_AFIO_SHRT2_FAULT1_SHIFT) +#define N32_AFIO_SHRT2_FAULT2_SHIFT (4) /* Bits 7-4: Fault channel 2 */ +#define N32_AFIO_SHRT2_FAULT2_MASK (0xF << N32_AFIO_SHRT2_FAULT2_SHIFT) +#define N32_AFIO_SHRT2_FAULT3_SHIFT (8) /* Bits 11-8: Fault channel 3 */ +#define N32_AFIO_SHRT2_FAULT3_MASK (0xF << N32_AFIO_SHRT2_FAULT3_SHIFT) +#define N32_AFIO_SHRT2_FAULT4_SHIFT (12) /* Bits 15-12: Fault channel 4 */ +#define N32_AFIO_SHRT2_FAULT4_MASK (0xF << N32_AFIO_SHRT2_FAULT4_SHIFT) +#define N32_AFIO_SHRT2_FAULT5_SHIFT (16) /* Bits 19-16: Fault channel 5 */ +#define N32_AFIO_SHRT2_FAULT5_MASK (0xF << N32_AFIO_SHRT2_FAULT5_SHIFT) +#define N32_AFIO_SHRT2_FAULT6_SHIFT (20) /* Bits 23-20: Fault channel 6 */ +#define N32_AFIO_SHRT2_FAULT6_MASK (0xF << N32_AFIO_SHRT2_FAULT6_SHIFT) + +/* Analog Filtering Configuration Registers */ + +/* AFIO_EFT_CFG0 - IO Port Analog Filtering Config 0 (Offset: 0x54) */ +#define N32_AFIO_EFT_CFG0_PA_EFTEN_MASK 0xFFFF /* PAx EFT enable (x=0-15) */ +#define N32_AFIO_EFT_CFG0_PA_EFTEN_SHIFT 0 +#define N32_AFIO_EFT_CFG0_PB_EFTEN_MASK 0xFFFF0000 /* PBx EFT enable (x=0-15) */ +#define N32_AFIO_EFT_CFG0_PB_EFTEN_SHIFT 16 + +/* AFIO_EFT_CFG1 - IO Port Analog Filtering Config 1 (Offset: 0x58) */ +#define N32_AFIO_EFT_CFG1_PC_EFTEN_MASK 0xFFFF /* PCx EFT enable (x=0-15) */ +#define N32_AFIO_EFT_CFG1_PC_EFTEN_SHIFT 0 +#define N32_AFIO_EFT_CFG1_PD_EFTEN_MASK 0xFFFF0000 /* PDx EFT enable (x=0-15) */ +#define N32_AFIO_EFT_CFG1_PD_EFTEN_SHIFT 16 + +/* AFIO_EFT_CFG2 - IO Port Analog Filtering Config 2 (Offset: 0x5C) */ + +/* Note: High word has no supported pads (reserved) */ +#define N32_AFIO_EFT_CFG2_PE_EFTEN_MASK 0xFFFF /* PEx EFT enable (x=0-15) */ +#define N32_AFIO_EFT_CFG2_PE_EFTEN_SHIFT 0 + +/* AFIO_EFT_CFG3 - IO Port Analog Filtering Config 3 (Offset: 0x60) */ +#define N32_AFIO_EFT_CFG3_PG_EFTEN_MASK 0xFFFF /* PGx EFT enable (x=0-15) */ +#define N32_AFIO_EFT_CFG3_PG_EFTEN_SHIFT 0 +#define N32_AFIO_EFT_CFG3_PH_EFTEN_MASK 0xFFFF0000 /* PHx EFT enable (x=0-15) */ +#define N32_AFIO_EFT_CFG3_PH_EFTEN_SHIFT 16 + +/* AFIO_EFT_CFG4 - IO Port Analog Filtering Config 4 (Offset: 0x64) */ +#define N32_AFIO_EFT_CFG4_PJ_EFTEN_MASK 0xFFFF /* PJx EFT enable (x=0-15) */ +#define N32_AFIO_EFT_CFG4_PJ_EFTEN_SHIFT 0 +#define N32_AFIO_EFT_CFG4_PI_EFTEN_MASK 0xFFFF0000 /* PIx EFT enable (x=0-15) */ +#define N32_AFIO_EFT_CFG4_PI_EFTEN_SHIFT 16 + +/* AFIO_EFT_CFG5 - IO Port Analog Filtering Config 5 (Offset: 0x68) */ +#define N32_AFIO_EFT_CFG5_PK_EFTEN_MASK 0xFF /* PKx EFT enable (x=0-7) */ +#define N32_AFIO_EFT_CFG5_PK_EFTEN_SHIFT 0 +#define N32_AFIO_EFT_CFG5_BOOT_EFTEN (1 << 8) /* Bit 8: BOOT pin EFT enable */ +#define N32_AFIO_EFT_CFG5_JRST_EFTBYPS (1 << 9) /* Bit 9: JTAG RST bypass */ + +/* Digital Filtering Configuration Registers */ + +/* AFIO_DIGEFT_CFG0 - IO Port Digital Filtering Config 0 (Offset: 0x6C) */ +#define N32_AFIO_DIGEFT_CFG0_PA_DIGEFTEN_MASK 0xFFFF /* PAx digital filter enable (x=0-15) */ +#define N32_AFIO_DIGEFT_CFG0_PA_DIGEFTEN_SHIFT 0 +#define N32_AFIO_DIGEFT_CFG0_PB_DIGEFTEN_MASK 0xFFFF0000 /* PBx digital filter enable (x=0-15) */ +#define N32_AFIO_DIGEFT_CFG0_PB_DIGEFTEN_SHIFT 16 + +/* AFIO_DIGEFT_CFG1 - IO Port Digital Filtering Config 1 (Offset: 0x70) */ +#define N32_AFIO_DIGEFT_CFG1_PC_DIGEFTEN_MASK 0xFFFF /* PCx digital filter enable (x=0-15) */ +#define N32_AFIO_DIGEFT_CFG1_PC_DIGEFTEN_SHIFT 0 +#define N32_AFIO_DIGEFT_CFG1_PD_DIGEFTEN_MASK 0xFFFF0000 /* PDx digital filter enable (x=0-15) */ +#define N32_AFIO_DIGEFT_CFG1_PD_DIGEFTEN_SHIFT 16 + +/* AFIO_DIGEFT_CFG2 - IO Port Digital Filtering Config 2 (Offset: 0x74) */ +#define N32_AFIO_DIGEFT_CFG2_PE_DIGEFTEN_MASK 0xFFFF /* PEx digital filter enable (x=0-15) */ +#define N32_AFIO_DIGEFT_CFG2_PE_DIGEFTEN_SHIFT 0 +#define N32_AFIO_DIGEFT_CFG2_PF_DIGEFTEN_MASK 0xFFFF0000 /* PFx digital filter enable (x=0-15) */ +#define N32_AFIO_DIGEFT_CFG2_PF_DIGEFTEN_SHIFT 16 + +/* AFIO_DIGEFT_CFG3 - IO Port Digital Filtering Config 3 (Offset: 0x78) */ +#define N32_AFIO_DIGEFT_CFG3_PG_DIGEFTEN_MASK 0xFFFF /* PGx digital filter enable (x=0-15) */ +#define N32_AFIO_DIGEFT_CFG3_PG_DIGEFTEN_SHIFT 0 +#define N32_AFIO_DIGEFT_CFG3_PH_DIGEFTEN_MASK 0xFFFF0000 /* PHx digital filter enable (x=0-15) */ +#define N32_AFIO_DIGEFT_CFG3_PH_DIGEFTEN_SHIFT 16 + +/* AFIO_DIGEFT_CFG4 - IO Port Digital Filtering Config 4 (Offset: 0x7C) */ +#define N32_AFIO_DIGEFT_CFG4_PJ_DIGEFTEN_MASK 0xFFFF /* PJx digital filter enable (x=0-15) */ +#define N32_AFIO_DIGEFT_CFG4_PJ_DIGEFTEN_SHIFT 0 +#define N32_AFIO_DIGEFT_CFG4_PI_DIGEFTEN_MASK 0x7FFF0000 /* PIx digital filter enable (x=0-6, bit16-22) */ +#define N32_AFIO_DIGEFT_CFG4_PI_DIGEFTEN_SHIFT 16 + +/* AFIO_DIGEFT_CFG5 - IO Port Digital Filtering Config 5 (Offset: 0x80) */ +#define N32_AFIO_DIGEFT_CFG5_PK_DIGEFTEN_MASK 0xFF /* PKx digital filter enable (x=0-7) */ +#define N32_AFIO_DIGEFT_CFG5_PK_DIGEFTEN_SHIFT 0 +#define N32_AFIO_DIGEFT_CFG5_RESERVED_MASK 0xFFFFFF00 /* Reserved bits (8-31) */ + +/* SHRTIM1 External Event Configuration Registers */ + +/* AFIO_SHRT1_EXEV_CFG0 - SHRTIM1 External Event Config 0 (Offset: 0x84) */ +#define N32_AFIO_SHRT1_EXEV_CFG0_EV1_MASK 0x1F /* EXEV1 event source (5-bit) */ +#define N32_AFIO_SHRT1_EXEV_CFG0_EV1_SHIFT 0 +#define N32_AFIO_SHRT1_EXEV_CFG0_EV2_MASK 0x1F /* EXEV2 event source (5-bit) */ +#define N32_AFIO_SHRT1_EXEV_CFG0_EV2_SHIFT 5 +#define N32_AFIO_SHRT1_EXEV_CFG0_EV3_MASK 0x1F /* EXEV3 event source (5-bit) */ +#define N32_AFIO_SHRT1_EXEV_CFG0_EV3_SHIFT 10 +#define N32_AFIO_SHRT1_EXEV_CFG0_EV4_MASK 0x1F /* EXEV4 event source (5-bit) */ +#define N32_AFIO_SHRT1_EXEV_CFG0_EV4_SHIFT 15 +#define N32_AFIO_SHRT1_EXEV_CFG0_EV5_MASK 0x1F /* EXEV5 event source (5-bit) */ +#define N32_AFIO_SHRT1_EXEV_CFG0_EV5_SHIFT 20 +#define N32_AFIO_SHRT1_EXEV_CFG0_RESERVED_MASK 0xFE000000 /* Reserved bits (25-31) */ + +/* AFIO_SHRT1_EXEV_CFG1 - SHRTIM1 External Event Config 1 (Offset: 0x88) */ +#define N32_AFIO_SHRT1_EXEV_CFG1_EV6_MASK 0x1F /* EXEV6 event source (5-bit) */ +#define N32_AFIO_SHRT1_EXEV_CFG1_EV6_SHIFT 0 +#define N32_AFIO_SHRT1_EXEV_CFG1_EV7_MASK 0x1F /* EXEV7 event source (5-bit) */ +#define N32_AFIO_SHRT1_EXEV_CFG1_EV7_SHIFT 5 +#define N32_AFIO_SHRT1_EXEV_CFG1_EV8_MASK 0x1F /* EXEV8 event source (5-bit) */ +#define N32_AFIO_SHRT1_EXEV_CFG1_EV8_SHIFT 10 +#define N32_AFIO_SHRT1_EXEV_CFG1_EV9_MASK 0x1F /* EXEV9 event source (5-bit) */ +#define N32_AFIO_SHRT1_EXEV_CFG1_EV9_SHIFT 15 +#define N32_AFIO_SHRT1_EXEV_CFG1_EV10_MASK 0x1F /* EXEV10 event source (5-bit) */ +#define N32_AFIO_SHRT1_EXEV_CFG1_EV10_SHIFT 20 +#define N32_AFIO_SHRT1_EXEV_CFG1_RESERVED_MASK 0xFE000000 /* Reserved bits (25-31) */ + +/* SHRTIM2 External Event Configuration Registers */ + +/* AFIO_SHRT2_EXEV_CFG0 - SHRTIM2 External Event Config 0 (Offset: 0x8C) */ +#define N32_AFIO_SHRT2_EXEV_CFG0_EV1_MASK 0x1F /* EXEV1 event source (5-bit) */ +#define N32_AFIO_SHRT2_EXEV_CFG0_EV1_SHIFT 0 +#define N32_AFIO_SHRT2_EXEV_CFG0_EV2_MASK 0x1F /* EXEV2 event source (5-bit) */ +#define N32_AFIO_SHRT2_EXEV_CFG0_EV2_SHIFT 5 +#define N32_AFIO_SHRT2_EXEV_CFG0_EV3_MASK 0x1F /* EXEV3 event source (5-bit) */ +#define N32_AFIO_SHRT2_EXEV_CFG0_EV3_SHIFT 10 +#define N32_AFIO_SHRT2_EXEV_CFG0_EV4_MASK 0x1F /* EXEV4 event source (5-bit) */ +#define N32_AFIO_SHRT2_EXEV_CFG0_EV4_SHIFT 15 +#define N32_AFIO_SHRT2_EXEV_CFG0_EV5_MASK 0x1F /* EXEV5 event source (5-bit) */ +#define N32_AFIO_SHRT2_EXEV_CFG0_EV5_SHIFT 20 +#define N32_AFIO_SHRT2_EXEV_CFG0_RESERVED_MASK 0xFE000000 /* Reserved bits (25-31) */ + +/* AFIO_SHRT2_EXEV_CFG1 - SHRTIM2 External Event Config 1 (Offset: 0x90) */ +#define N32_AFIO_SHRT2_EXEV_CFG1_EV6_MASK 0x1F /* EXEV6 event source (5-bit) */ +#define N32_AFIO_SHRT2_EXEV_CFG1_EV6_SHIFT 0 +#define N32_AFIO_SHRT2_EXEV_CFG1_EV7_MASK 0x1F /* EXEV7 event source (5-bit) */ +#define N32_AFIO_SHRT2_EXEV_CFG1_EV7_SHIFT 5 +#define N32_AFIO_SHRT2_EXEV_CFG1_EV8_MASK 0x1F /* EXEV8 event source (5-bit) */ +#define N32_AFIO_SHRT2_EXEV_CFG1_EV8_SHIFT 10 +#define N32_AFIO_SHRT2_EXEV_CFG1_EV9_MASK 0x1F /* EXEV9 event source (5-bit) */ +#define N32_AFIO_SHRT2_EXEV_CFG1_EV9_SHIFT 15 +#define N32_AFIO_SHRT2_EXEV_CFG1_EV10_MASK 0x1F /* EXEV10 event source (5-bit) */ +#define N32_AFIO_SHRT2_EXEV_CFG1_EV10_SHIFT 20 +#define N32_AFIO_SHRT2_EXEV_CFG1_RESERVED_MASK 0xFE000000 /* Reserved bits (25-31) */ + +/* Event source encoding (for all EXEVx fields) */ +#define N32_EXEV_SOURCE_PB4 0x01 +#define N32_EXEV_SOURCE_PB5 0x02 +#define N32_EXEV_SOURCE_PB6 0x03 +#define N32_EXEV_SOURCE_PB7 0x04 +#define N32_EXEV_SOURCE_PC10 0x05 +#define N32_EXEV_SOURCE_PC12 0x06 +#define N32_EXEV_SOURCE_PD5 0x07 +#define N32_EXEV_SOURCE_PD8 0x08 +#define N32_EXEV_SOURCE_PD9 0x09 +#define N32_EXEV_SOURCE_PE6 0x0A +#define N32_EXEV_SOURCE_PG0 0x0B +#define N32_EXEV_SOURCE_PG11 0x0C +#define N32_EXEV_SOURCE_PG12 0x0D +#define N32_EXEV_SOURCE_PG13 0x0E +#define N32_EXEV_SOURCE_PI14 0x0F +#define N32_EXEV_SOURCE_PJ5 0x10 +#define N32_EXEV_SOURCE_PK3 0x11 +#define N32_EXEV_SOURCE_PK4 0x12 + +/* SHRTIM2 specific sources */ +#define N32_EXEV_SOURCE_PA2 0x01 +#define N32_EXEV_SOURCE_PC4 0x02 +#define N32_EXEV_SOURCE_PD0 0x03 +#define N32_EXEV_SOURCE_PD11 0x04 +#define N32_EXEV_SOURCE_PE3 0x05 +#define N32_EXEV_SOURCE_PE14 0x06 +#define N32_EXEV_SOURCE_PF10 0x07 +#define N32_EXEV_SOURCE_PG8 0x08 +#define N32_EXEV_SOURCE_PG15 0x09 +#define N32_EXEV_SOURCE_PH7 0x0A +#define N32_EXEV_SOURCE_PH8 0x0B +#define N32_EXEV_SOURCE_PH10 0x0C +#define N32_EXEV_SOURCE_PH11 0x0D +#define N32_EXEV_SOURCE_PH12 0x0E +#define N32_EXEV_SOURCE_PI11 0x0F +#define N32_EXEV_SOURCE_PJ2 0x10 +#define N32_EXEV_SOURCE_PJ14 0x11 +#define N32_EXEV_SOURCE_PK0 0x12 + +/* SIP Pull-up/Pull-down Configuration Register (AFIO_SIP_PUPD) */ +#define N32_AFIO_SIP_PUPD_PUPD0_MASK 0x03 /* SIP pad0 pull config */ +#define N32_AFIO_SIP_PUPD_PUPD0_SHIFT 0 +#define N32_AFIO_SIP_PUPD_PUPD1_MASK 0x0C /* SIP pad1 pull config */ +#define N32_AFIO_SIP_PUPD_PUPD1_SHIFT 2 +#define N32_AFIO_SIP_PUPD_PUPD2_MASK 0x30 /* SIP pad2 pull config */ +#define N32_AFIO_SIP_PUPD_PUPD2_SHIFT 4 +#define N32_AFIO_SIP_PUPD_PUPD3_MASK 0xC0 /* SIP pad3 pull config */ +#define N32_AFIO_SIP_PUPD_PUPD3_SHIFT 6 +#define N32_AFIO_SIP_PUPD_PUPD4_MASK 0x300 /* SIP pad4 pull config */ +#define N32_AFIO_SIP_PUPD_PUPD4_SHIFT 8 +#define N32_AFIO_SIP_PUPD_PUPD5_MASK 0xC00 /* SIP pad5 pull config */ +#define N32_AFIO_SIP_PUPD_PUPD5_SHIFT 10 +#define N32_AFIO_SIP_PUPD_PUPD6_MASK 0x3000 /* SIP pad6 pull config */ +#define N32_AFIO_SIP_PUPD_PUPD6_SHIFT 12 +#define N32_AFIO_SIP_PUPD_PUPD7_MASK 0xC000 /* SIP pad7 pull config */ +#define N32_AFIO_SIP_PUPD_PUPD7_SHIFT 14 +#define N32_AFIO_SIP_PUPD_RESERVED_MASK 0xFFFF0000 /* Reserved bits (16-31) */ + +/* Pull configuration values (for each PUPDx field) */ +#define N32_PUPD_NONE 0x0 /* No pull-up or pull-down */ +#define N32_PUPD_UP 0x1 /* Pull-up enabled */ +#define N32_PUPD_DOWN 0x2 /* Pull-down enabled */ +#define N32_PUPD_RESV 0x3 /* Reserved (do not use) */ + +/* SDRAM High-Speed Mode Configuration Registers */ + +/* AFIO_SDRAM_HSMOD_CFG0 - SDRAM HS Mode Config 0 (Offset: 0x98) */ +#define N32_AFIO_SDRAM_HSMOD_CFG0_HSA_MASK 0xFFFF /* Port A HS enable */ +#define N32_AFIO_SDRAM_HSMOD_CFG0_HSA_SHIFT 0 +#define N32_AFIO_SDRAM_HSMOD_CFG0_HSB_MASK 0xFFFF0000 /* Port B HS enable */ +#define N32_AFIO_SDRAM_HSMOD_CFG0_HSB_SHIFT 16 + +/* AFIO_SDRAM_HSMOD_CFG1 - SDRAM HS Mode Config 1 (Offset: 0x9C) */ +#define N32_AFIO_SDRAM_HSMOD_CFG1_HSC_MASK 0xFFFF /* Port C HS enable */ +#define N32_AFIO_SDRAM_HSMOD_CFG1_HSC_SHIFT 0 +#define N32_AFIO_SDRAM_HSMOD_CFG1_HSD_MASK 0xFFFF0000 /* Port D HS enable */ +#define N32_AFIO_SDRAM_HSMOD_CFG1_HSD_SHIFT 16 + +/* AFIO_SDRAM_HSMOD_CFG2 - SDRAM HS Mode Config 2 (Offset: 0xA0) */ +#define N32_AFIO_SDRAM_HSMOD_CFG2_HSE_MASK 0xFFFF /* Port E HS enable */ +#define N32_AFIO_SDRAM_HSMOD_CFG2_HSE_SHIFT 0 +#define N32_AFIO_SDRAM_HSMOD_CFG2_HSF_MASK 0xFFFF0000 /* Port F HS enable */ +#define N32_AFIO_SDRAM_HSMOD_CFG2_HSF_SHIFT 16 + +/* AFIO_SDRAM_HSMOD_CFG3 - SDRAM HS Mode Config 3 (Offset: 0xA4) */ +#define N32_AFIO_SDRAM_HSMOD_CFG3_HSG_MASK 0xFFFF /* Port G HS enable */ +#define N32_AFIO_SDRAM_HSMOD_CFG3_HSG_SHIFT 0 +#define N32_AFIO_SDRAM_HSMOD_CFG3_HSH_MASK 0xFFFF0000 /* Port H HS enable */ +#define N32_AFIO_SDRAM_HSMOD_CFG3_HSH_SHIFT 16 + +/* AFIO_SDRAM_HSMOD_CFG4 - SDRAM HS Mode Config 4 (Offset: 0xA8) */ +#define N32_AFIO_SDRAM_HSMOD_CFG4_HSI_MASK 0xFFFF /* Port I HS enable */ +#define N32_AFIO_SDRAM_HSMOD_CFG4_HSI_SHIFT 0 +#define N32_AFIO_SDRAM_HSMOD_CFG4_RESERVED_MASK 0xFFFF0000 /* Reserved bits (16-31) */ + +/* HS_EN bit values */ +#define N32_HS_DISABLE 0 /* Disable high-speed mode */ +#define N32_HS_ENABLE 1 /* Enable high-speed mode */ + +/* SIP Slew Rate Configuration Register (AFIO_SIP_SR) */ +#define N32_AFIO_SIP_SR_SR0_MASK 0x01 /* Pad0 slew rate control */ +#define N32_AFIO_SIP_SR_SR0_SHIFT 0 +#define N32_AFIO_SIP_SR_SR1_MASK 0x02 /* Pad1 slew rate control */ +#define N32_AFIO_SIP_SR_SR1_SHIFT 1 +#define N32_AFIO_SIP_SR_SR2_MASK 0x04 /* Pad2 slew rate control */ +#define N32_AFIO_SIP_SR_SR2_SHIFT 2 +#define N32_AFIO_SIP_SR_SR3_MASK 0x08 /* Pad3 slew rate control */ +#define N32_AFIO_SIP_SR_SR3_SHIFT 3 +#define N32_AFIO_SIP_SR_SR4_MASK 0x10 /* Pad4 slew rate control */ +#define N32_AFIO_SIP_SR_SR4_SHIFT 4 +#define N32_AFIO_SIP_SR_SR5_MASK 0x20 /* Pad5 slew rate control */ +#define N32_AFIO_SIP_SR_SR5_SHIFT 5 +#define N32_AFIO_SIP_SR_SR6_MASK 0x40 /* Pad6 slew rate control */ +#define N32_AFIO_SIP_SR_SR6_SHIFT 6 +#define N32_AFIO_SIP_SR_SR7_MASK 0x80 /* Pad7 slew rate control */ +#define N32_AFIO_SIP_SR_SR7_SHIFT 7 +#define N32_AFIO_SIP_SR_RESERVED_MASK 0xFFFFFF00 /* Reserved bits (8-31) */ + +/* Slew Rate values */ +#define N32_SR_FAST 0 /* Fast slew rate */ +#define N32_SR_SLOW 1 /* Slow slew rate */ + +/* SIP Driver Strength Configuration Register (AFIO_SIP_DS) */ +#define N32_AFIO_SIP_DS_DS0_MASK 0x03 /* Pad0 driver strength */ +#define N32_AFIO_SIP_DS_DS0_SHIFT 0 +#define N32_AFIO_SIP_DS_DS1_MASK 0x0C /* Pad1 driver strength */ +#define N32_AFIO_SIP_DS_DS1_SHIFT 2 +#define N32_AFIO_SIP_DS_DS2_MASK 0x30 /* Pad2 driver strength */ +#define N32_AFIO_SIP_DS_DS2_SHIFT 4 +#define N32_AFIO_SIP_DS_DS3_MASK 0xC0 /* Pad3 driver strength */ +#define N32_AFIO_SIP_DS_DS3_SHIFT 6 +#define N32_AFIO_SIP_DS_DS4_MASK 0x300 /* Pad4 driver strength */ +#define N32_AFIO_SIP_DS_DS4_SHIFT 8 +#define N32_AFIO_SIP_DS_DS5_MASK 0xC00 /* Pad5 driver strength */ +#define N32_AFIO_SIP_DS_DS5_SHIFT 10 +#define N32_AFIO_SIP_DS_DS6_MASK 0x3000 /* Pad6 driver strength */ +#define N32_AFIO_SIP_DS_DS6_SHIFT 12 +#define N32_AFIO_SIP_DS_DS7_MASK 0xC000 /* Pad7 driver strength */ +#define N32_AFIO_SIP_DS_DS7_SHIFT 14 +#define N32_AFIO_SIP_DS_RESERVED_MASK 0xFFFF0000 /* Reserved bits (16-31) */ + +/* Driver Strength values (for each DSy field) */ +#define N32_DS_2MA 0x0 /* 2mA drive strength */ +#define N32_DS_8MA 0x1 /* 8mA drive strength */ +#define N32_DS_4MA 0x2 /* 4mA drive strength */ +#define N32_DS_12MA 0x3 /* 12mA drive strength */ + +/* ADC Switch Configuration Register (AFIO_ADCSW_CFG) */ +#define N32_AFIO_ADCSW_CFG_SWPA0_C_MASK 0x0F /* PA0_C switch config */ +#define N32_AFIO_ADCSW_CFG_SWPA0_C_SHIFT 0 +#define N32_AFIO_ADCSW_CFG_SWPC2_C_MASK 0xF0 /* PC2_C switch config */ +#define N32_AFIO_ADCSW_CFG_SWPC2_C_SHIFT 4 +#define N32_AFIO_ADCSW_CFG_SWPC3_C_MASK 0x300 /* PC3_C switch config */ +#define N32_AFIO_ADCSW_CFG_SWPC3_C_SHIFT 8 +#define N32_AFIO_ADCSW_CFG_SWPA1_C_MASK 0xC00 /* PA1_C switch config */ +#define N32_AFIO_ADCSW_CFG_SWPA1_C_SHIFT 10 +#define N32_AFIO_ADCSW_CFG_SWPJ15_MASK 0x3000 /* PJ15 switch config */ +#define N32_AFIO_ADCSW_CFG_SWPJ15_SHIFT 12 +#define N32_AFIO_ADCSW_CFG_VBAT (1 << 14) /* VBAT monitor enable */ +#define N32_AFIO_ADCSW_CFG_DAC_OUT2_MASK 0xE0000 /* DACx_OUT2 config */ +#define N32_AFIO_ADCSW_CFG_DAC_OUT2_SHIFT 17 +#define N32_AFIO_ADCSW_CFG_SWPJ0 (1 << 18) /* PJ0 switch open */ +#define N32_AFIO_ADCSW_CFG_SWPJ3 (1 << 19) /* PJ3 switch open */ +#define N32_AFIO_ADCSW_CFG_TEMP (1 << 20) /* Temp monitor enable */ +#define N32_AFIO_ADCSW_CFG_SWPJ4 (1 << 21) /* PJ4 switch open */ +#define N32_AFIO_ADCSW_CFG_SWPJ5 (1 << 22) /* PJ5 switch open */ +#define N32_AFIO_ADCSW_CFG_DAC_OUT1_MASK 0xE000000 /* DACx_OUT1 config */ +#define N32_AFIO_ADCSW_CFG_DAC_OUT1_SHIFT 23 +#define N32_AFIO_ADCSW_CFG_SWPJ6 (1 << 26) /* PJ6 switch open */ +#define N32_AFIO_ADCSW_CFG_SWPJ7 (1 << 27) /* PJ7 switch open */ +#define N32_AFIO_ADCSW_CFG_VREF (1 << 28) /* VREF monitor enable */ +#define N32_AFIO_ADCSW_CFG_RESERVED_MASK 0xE0000000 /* Reserved bits (29-31) */ + +/* DAC monitor values */ +#define N32_DAC_MON_DISABLE 0x0 /* Disable monitor */ +#define N32_DAC1_MON_EN 0x1 /* Enable DAC1 monitor */ +#define N32_DAC2_MON_EN 0x2 /* Enable DAC2 monitor */ +#define N32_DAC3_MON_EN 0x4 /* Enable DAC3 monitor */ + +/* SDRAM DSN Configuration Registers */ +#define N32_AFIO_SDRAM_DSN_CFG0_OFFSET 0xE4 +#define N32_AFIO_SDRAM_DSN_CFG1_OFFSET 0xE8 +#define N32_AFIO_SDRAM_DSN_CFG2_OFFSET 0xEC + +/* SDRAM DSP Configuration Registers */ +#define N32_AFIO_SDRAM_DSP_CFG0_OFFSET 0xF0 +#define N32_AFIO_SDRAM_DSP_CFG1_OFFSET 0xF4 +#define N32_AFIO_SDRAM_DSP_CFG2_OFFSET 0xF8 + +/* SDRAM pad mapping (for VREF_EN, DSN, DSP) */ +#define N32_SDRAM_PAD_PA4 0 +#define N32_SDRAM_PAD_PA5 1 +#define N32_SDRAM_PAD_PA7 2 +#define N32_SDRAM_PAD_PB5 3 +#define N32_SDRAM_PAD_PB6 4 +#define N32_SDRAM_PAD_PB14 5 +#define N32_SDRAM_PAD_PB15 6 +#define N32_SDRAM_PAD_PC0 7 +/* ... (complete mapping from Table 12-118) */ +#define N32_SDRAM_PAD_PI10 72 + +#endif /* __ARCH_ARM_SRC_N32H7_HARDWARE_N32H76X_AFIO_H */ diff --git a/arch/arm/src/n32h7/hardware/n32h76x_dmamux.h b/arch/arm/src/n32h7/hardware/n32h76x_dmamux.h new file mode 100644 index 0000000000000..32bdaf0fecd63 --- /dev/null +++ b/arch/arm/src/n32h7/hardware/n32h76x_dmamux.h @@ -0,0 +1,1253 @@ +/**************************************************************************** + * arch/arm/src/n32h7/hardware/n32h76x_dmamux.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + ****************************************************************************/ + + #ifndef __ARCH_ARM_SRC_N32H7_HARDWARE_N32H76X_DMAMUX_H + #define __ARCH_ARM_SRC_N32H7_HARDWARE_N32H76X_DMAMUX_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include "n32h7_dma.h" +#include "n32h7_dmamux.h" + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* ========================================================================== + * DMAMUX1 Request Mapping (REQ) + * ========================================================================== + */ + +/* Internal Request Generators */ +#define DMAMUX1_REQ_GEN0 1 +#define DMAMUX1_REQ_GEN1 2 +#define DMAMUX1_REQ_GEN2 3 +#define DMAMUX1_REQ_GEN3 4 +#define DMAMUX1_REQ_GEN4 5 +#define DMAMUX1_REQ_GEN5 6 +#define DMAMUX1_REQ_GEN6 7 +#define DMAMUX1_REQ_GEN7 8 + +/* ADCs */ +#define DMAMUX1_REQ_ADC1 9 +#define DMAMUX1_REQ_ADC2 10 +#define DMAMUX1_REQ_ADC3 11 + +/* SHRTIM */ +#define DMAMUX1_REQ_SHRTIM1_DMA0 12 +#define DMAMUX1_REQ_SHRTIM1_DMA1 13 +#define DMAMUX1_REQ_SHRTIM1_DMA2 14 +#define DMAMUX1_REQ_SHRTIM1_DMA3 15 +#define DMAMUX1_REQ_SHRTIM1_DMA4 16 +#define DMAMUX1_REQ_SHRTIM1_DMA5 17 +#define DMAMUX1_REQ_SHRTIM1_DMA6 18 +#define DMAMUX1_REQ_SHRTIM2_DMA0 19 +#define DMAMUX1_REQ_SHRTIM2_DMA1 20 +#define DMAMUX1_REQ_SHRTIM2_DMA2 21 +#define DMAMUX1_REQ_SHRTIM2_DMA3 22 +#define DMAMUX1_REQ_SHRTIM2_DMA4 23 +#define DMAMUX1_REQ_SHRTIM2_DMA5 24 +#define DMAMUX1_REQ_SHRTIM2_DMA6 25 + +/* ATIM */ +#define DMAMUX1_REQ_ATIM1_UP 26 +#define DMAMUX1_REQ_ATIM1_CH1 27 +#define DMAMUX1_REQ_ATIM1_CH2 28 +#define DMAMUX1_REQ_ATIM1_CH3 29 +#define DMAMUX1_REQ_ATIM1_CH4 30 +#define DMAMUX1_REQ_ATIM1_COM 31 +#define DMAMUX1_REQ_ATIM1_TRG 32 +#define DMAMUX1_REQ_ATIM2_UP 33 +#define DMAMUX1_REQ_ATIM2_CH1 34 +#define DMAMUX1_REQ_ATIM2_CH2 35 +#define DMAMUX1_REQ_ATIM2_CH3 36 +#define DMAMUX1_REQ_ATIM2_CH4 37 +#define DMAMUX1_REQ_ATIM2_COM 38 +#define DMAMUX1_REQ_ATIM2_TRG 39 +#define DMAMUX1_REQ_ATIM3_UP 40 +#define DMAMUX1_REQ_ATIM3_CH1 41 +#define DMAMUX1_REQ_ATIM3_CH2 42 +#define DMAMUX1_REQ_ATIM3_CH3 43 +#define DMAMUX1_REQ_ATIM3_CH4 44 +#define DMAMUX1_REQ_ATIM3_COM 45 +#define DMAMUX1_REQ_ATIM3_TRG 46 +#define DMAMUX1_REQ_ATIM4_UP 47 +#define DMAMUX1_REQ_ATIM4_CH1 48 +#define DMAMUX1_REQ_ATIM4_CH2 49 +#define DMAMUX1_REQ_ATIM4_CH3 50 +#define DMAMUX1_REQ_ATIM4_CH4 51 +#define DMAMUX1_REQ_ATIM4_COM 52 +#define DMAMUX1_REQ_ATIM4_TRG 53 + +/* GTIMA */ +#define DMAMUX1_REQ_GTIMA1_CH1 54 +#define DMAMUX1_REQ_GTIMA1_CH2 55 +#define DMAMUX1_REQ_GTIMA1_CH3 56 +#define DMAMUX1_REQ_GTIMA1_CH4 57 +#define DMAMUX1_REQ_GTIMA1_TRG 58 +#define DMAMUX1_REQ_GTIMA1_UP 59 +#define DMAMUX1_REQ_GTIMA2_CH1 60 +#define DMAMUX1_REQ_GTIMA2_CH2 61 +#define DMAMUX1_REQ_GTIMA2_CH3 62 +#define DMAMUX1_REQ_GTIMA2_CH4 63 +#define DMAMUX1_REQ_GTIMA2_TRG 64 +#define DMAMUX1_REQ_GTIMA2_UP 65 +#define DMAMUX1_REQ_GTIMA3_CH1 66 +#define DMAMUX1_REQ_GTIMA3_CH2 67 +#define DMAMUX1_REQ_GTIMA3_CH3 68 +#define DMAMUX1_REQ_GTIMA3_CH4 69 +#define DMAMUX1_REQ_GTIMA3_TRG 70 +#define DMAMUX1_REQ_GTIMA3_UP 71 +#define DMAMUX1_REQ_GTIMA4_CH1 72 +#define DMAMUX1_REQ_GTIMA4_CH2 73 +#define DMAMUX1_REQ_GTIMA4_CH3 74 +#define DMAMUX1_REQ_GTIMA4_CH4 75 +#define DMAMUX1_REQ_GTIMA4_TRG 76 +#define DMAMUX1_REQ_GTIMA4_UP 77 +#define DMAMUX1_REQ_GTIMA5_CH1 78 +#define DMAMUX1_REQ_GTIMA5_CH2 79 +#define DMAMUX1_REQ_GTIMA5_CH3 80 +#define DMAMUX1_REQ_GTIMA5_CH4 81 +#define DMAMUX1_REQ_GTIMA5_TRG 82 +#define DMAMUX1_REQ_GTIMA5_UP 83 +#define DMAMUX1_REQ_GTIMA6_CH1 84 +#define DMAMUX1_REQ_GTIMA6_CH2 85 +#define DMAMUX1_REQ_GTIMA6_CH3 86 +#define DMAMUX1_REQ_GTIMA6_CH4 87 +#define DMAMUX1_REQ_GTIMA6_TRG 88 +#define DMAMUX1_REQ_GTIMA6_UP 89 +#define DMAMUX1_REQ_GTIMA7_CH1 90 +#define DMAMUX1_REQ_GTIMA7_CH2 91 +#define DMAMUX1_REQ_GTIMA7_CH3 92 +#define DMAMUX1_REQ_GTIMA7_CH4 93 +#define DMAMUX1_REQ_GTIMA7_TRG 94 +#define DMAMUX1_REQ_GTIMA7_UP 95 + +/* GTIMB */ +#define DMAMUX1_REQ_GTIMB1_CH1 96 +#define DMAMUX1_REQ_GTIMB1_CH2 97 +#define DMAMUX1_REQ_GTIMB1_CH3 98 +#define DMAMUX1_REQ_GTIMB1_CH4 99 +#define DMAMUX1_REQ_GTIMB1_TRG 100 +#define DMAMUX1_REQ_GTIMB1_UP 101 +#define DMAMUX1_REQ_GTIMB2_CH1 102 +#define DMAMUX1_REQ_GTIMB2_CH2 103 +#define DMAMUX1_REQ_GTIMB2_CH3 104 +#define DMAMUX1_REQ_GTIMB2_CH4 105 +#define DMAMUX1_REQ_GTIMB2_TRG 106 +#define DMAMUX1_REQ_GTIMB2_UP 107 +#define DMAMUX1_REQ_GTIMB3_CH1 108 +#define DMAMUX1_REQ_GTIMB3_CH2 109 +#define DMAMUX1_REQ_GTIMB3_CH3 110 +#define DMAMUX1_REQ_GTIMB3_CH4 111 +#define DMAMUX1_REQ_GTIMB3_TRG 112 +#define DMAMUX1_REQ_GTIMB3_UP 113 + +/* I2C */ +#define DMAMUX1_REQ_I2C1_RX 114 +#define DMAMUX1_REQ_I2C1_TX 115 +#define DMAMUX1_REQ_I2C2_RX 116 +#define DMAMUX1_REQ_I2C2_TX 117 +#define DMAMUX1_REQ_I2C3_RX 118 +#define DMAMUX1_REQ_I2C3_TX 119 +#define DMAMUX1_REQ_I2C4_RX 120 +#define DMAMUX1_REQ_I2C4_TX 121 +#define DMAMUX1_REQ_I2C5_RX 122 +#define DMAMUX1_REQ_I2C5_TX 123 +#define DMAMUX1_REQ_I2C6_RX 124 +#define DMAMUX1_REQ_I2C6_TX 125 +#define DMAMUX1_REQ_I2C7_RX 126 +#define DMAMUX1_REQ_I2C7_TX 127 +#define DMAMUX1_REQ_I2C8_RX 128 +#define DMAMUX1_REQ_I2C8_TX 129 +#define DMAMUX1_REQ_I2C9_RX 130 +#define DMAMUX1_REQ_I2C9_TX 131 +#define DMAMUX1_REQ_I2C10_RX 132 +#define DMAMUX1_REQ_I2C10_TX 133 + +/* USART */ +#define DMAMUX1_REQ_USART1_RX 134 +#define DMAMUX1_REQ_USART1_TX 135 +#define DMAMUX1_REQ_USART2_RX 136 +#define DMAMUX1_REQ_USART2_TX 137 +#define DMAMUX1_REQ_USART3_RX 138 +#define DMAMUX1_REQ_USART3_TX 139 +#define DMAMUX1_REQ_USART4_RX 140 +#define DMAMUX1_REQ_USART4_TX 141 +#define DMAMUX1_REQ_USART5_RX 142 +#define DMAMUX1_REQ_USART5_TX 143 +#define DMAMUX1_REQ_USART6_RX 144 +#define DMAMUX1_REQ_USART6_TX 145 +#define DMAMUX1_REQ_USART7_RX 146 +#define DMAMUX1_REQ_USART7_TX 147 +#define DMAMUX1_REQ_USART8_RX 148 +#define DMAMUX1_REQ_USART8_TX 149 + +/* UART */ +#define DMAMUX1_REQ_UART9_RX 150 +#define DMAMUX1_REQ_UART9_TX 151 +#define DMAMUX1_REQ_UART10_RX 152 +#define DMAMUX1_REQ_UART10_TX 153 +#define DMAMUX1_REQ_UART11_RX 154 +#define DMAMUX1_REQ_UART11_TX 155 +#define DMAMUX1_REQ_UART12_RX 156 +#define DMAMUX1_REQ_UART12_TX 157 +#define DMAMUX1_REQ_UART13_RX 158 +#define DMAMUX1_REQ_UART13_TX 159 +#define DMAMUX1_REQ_UART14_RX 160 +#define DMAMUX1_REQ_UART14_TX 161 +#define DMAMUX1_REQ_UART15_RX 162 +#define DMAMUX1_REQ_UART15_TX 163 + +/* SPI */ +#define DMAMUX1_REQ_SPI1_RX 164 +#define DMAMUX1_REQ_SPI1_TX 173 +#define DMAMUX1_REQ_SPI2_RX 166 +#define DMAMUX1_REQ_SPI2_TX 175 +#define DMAMUX1_REQ_SPI3_RX 168 +#define DMAMUX1_REQ_SPI3_TX 177 +#define DMAMUX1_REQ_SPI4_RX 170 +#define DMAMUX1_REQ_SPI4_TX 179 +#define DMAMUX1_REQ_SPI5_RX 172 +#define DMAMUX1_REQ_SPI5_TX 181 +#define DMAMUX1_REQ_SPI6_RX 174 +#define DMAMUX1_REQ_SPI6_TX 183 +#define DMAMUX1_REQ_SPI7_RX 176 +#define DMAMUX1_REQ_SPI7_TX 185 + +/* I2S */ +#define DMAMUX1_REQ_I2S1_RX 165 +#define DMAMUX1_REQ_I2S1_TX 174 +#define DMAMUX1_REQ_I2S2_RX 167 +#define DMAMUX1_REQ_I2S2_TX 176 +#define DMAMUX1_REQ_I2S3_RX 169 +#define DMAMUX1_REQ_I2S3_TX 178 +#define DMAMUX1_REQ_I2S4_RX 171 +#define DMAMUX1_REQ_I2S4_TX 180 + +/* LPUART */ +#define DMAMUX1_REQ_LPUART1_RX 186 +#define DMAMUX1_REQ_LPUART1_TX 187 +#define DMAMUX1_REQ_LPUART2_RX 188 +#define DMAMUX1_REQ_LPUART2_TX 189 + +/* DSMU */ +#define DMAMUX1_REQ_DSMU0 192 +#define DMAMUX1_REQ_DSMU1 193 +#define DMAMUX1_REQ_DSMU2 194 +#define DMAMUX1_REQ_DSMU3 195 + +/* FDCAN */ +#define DMAMUX1_REQ_FDCAN1 196 +#define DMAMUX1_REQ_FDCAN2 197 +#define DMAMUX1_REQ_FDCAN3 198 +#define DMAMUX1_REQ_FDCAN4 199 +#define DMAMUX1_REQ_FDCAN5 200 +#define DMAMUX1_REQ_FDCAN6 201 +#define DMAMUX1_REQ_FDCAN7 202 +#define DMAMUX1_REQ_FDCAN8 203 + +/* CORDIC */ +#define DMAMUX1_REQ_CORDIC_RD 204 +#define DMAMUX1_REQ_CORDIC_WR 205 + +/* FMAU */ +#define DMAMUX1_REQ_FMAU_RD 206 +#define DMAMUX1_REQ_FMAU_WR 207 + +/* BTIM */ +#define DMAMUX1_REQ_BTIM1 208 +#define DMAMUX1_REQ_BTIM2 209 +#define DMAMUX1_REQ_BTIM3 210 +#define DMAMUX1_REQ_BTIM4 211 + +/* GTIMB */ +#define DMAMUX1_REQ_GTIMB1_COM 212 +#define DMAMUX1_REQ_GTIMB2_COM 213 +#define DMAMUX1_REQ_GTIMB3_COM 214 + +/* DAC */ +#define DMAMUX1_REQ_DAC12_0 190 +#define DMAMUX1_REQ_DAC12_1 191 +#define DMAMUX1_REQ_DAC34_0 215 +#define DMAMUX1_REQ_DAC34_1 216 +#define DMAMUX1_REQ_DAC56_0 217 +#define DMAMUX1_REQ_DAC56_1 218 + +/* ========================================================================== + * DMAMUX1 Trigger Mapping (TRG) + * ========================================================================== + */ + +#define DMAMUX1_TRG_EVT0_7 0 +#define DMAMUX1_TRG_EVT8_15 1 +#define DMAMUX1_TRG_EVT16_23 2 + +#define DMAMUX1_TRG_LPTIMER1_OUT 3 +#define DMAMUX1_TRG_LPTIMER2_OUT 4 +#define DMAMUX1_TRG_LPTIMER3_OUT 5 +#define DMAMUX1_TRG_LPTIMER4_OUT 6 +#define DMAMUX1_TRG_LPTIMER5_OUT 7 + +#define DMAMUX1_TRG_IOM_EXTI0 8 + +#define DMAMUX1_TRG_FDCAN1_IRQ0 9 +#define DMAMUX1_TRG_FDCAN2_IRQ0 10 +#define DMAMUX1_TRG_FDCAN3_IRQ0 11 +#define DMAMUX1_TRG_FDCAN4_IRQ0 12 +#define DMAMUX1_TRG_FDCAN5_IRQ0 13 +#define DMAMUX1_TRG_FDCAN6_IRQ0 14 +#define DMAMUX1_TRG_FDCAN7_IRQ0 15 +#define DMAMUX1_TRG_FDCAN8_IRQ0 16 + +#define DMAMUX1_TRG_FDCAN1_IRQ1 17 +#define DMAMUX1_TRG_FDCAN2_IRQ1 18 +#define DMAMUX1_TRG_FDCAN3_IRQ1 19 +#define DMAMUX1_TRG_FDCAN4_IRQ1 20 +#define DMAMUX1_TRG_FDCAN5_IRQ1 21 +#define DMAMUX1_TRG_FDCAN6_IRQ1 22 +#define DMAMUX1_TRG_FDCAN7_IRQ1 23 +#define DMAMUX1_TRG_FDCAN8_IRQ1 24 + +/* ========================================================================== + * DMAMUX1 Synchronization Mapping (SYNC) + * ========================================================================== + */ + +#define DMAMUX1_SYNC_EVT0_7 0 +#define DMAMUX1_SYNC_EVT8_15 1 +#define DMAMUX1_SYNC_EVT16_23 2 + +#define DMAMUX1_SYNC_LPTIMER1_OUT 3 +#define DMAMUX1_SYNC_LPTIMER2_OUT 4 +#define DMAMUX1_SYNC_LPTIMER3_OUT 5 +#define DMAMUX1_SYNC_LPTIMER4_OUT 6 +#define DMAMUX1_SYNC_LPTIMER5_OUT 7 + +#define DMAMUX1_SYNC_IOM_EXTI0 8 + +/* ========================================================================== + * DMAMUX2 Request Mapping (REQ) + * ========================================================================== + */ + +#define DMAMUX2_REQ_GEN0 1 +#define DMAMUX2_REQ_GEN1 2 +#define DMAMUX2_REQ_GEN2 3 +#define DMAMUX2_REQ_GEN3 4 +#define DMAMUX2_REQ_GEN4 5 +#define DMAMUX2_REQ_GEN5 6 +#define DMAMUX2_REQ_GEN6 7 +#define DMAMUX2_REQ_GEN7 8 + +#define DMAMUX2_REQ_GEN8 9 +#define DMAMUX2_REQ_GEN9 10 +#define DMAMUX2_REQ_GEN10 11 +#define DMAMUX2_REQ_GEN11 12 +#define DMAMUX2_REQ_GEN12 13 +#define DMAMUX2_REQ_GEN13 14 +#define DMAMUX2_REQ_GEN14 15 +#define DMAMUX2_REQ_GEN15 16 + +#define DMAMUX2_REQ_XSPI1_TX 25 +#define DMAMUX2_REQ_XSPI1_RX 26 +#define DMAMUX2_REQ_XSPI2_TX 27 +#define DMAMUX2_REQ_XSPI2_RX 28 + +/* ========================================================================== + * DMAMUX2 Trigger Mapping (TRG) + * ========================================================================== + */ + +#define DMAMUX2_TRG_DMA1_INT_TFR0 0 +#define DMAMUX2_TRG_DMA1_INT_TFR1 1 +#define DMAMUX2_TRG_DMA1_INT_TFR2 2 +#define DMAMUX2_TRG_DMA1_INT_TFR3 3 +#define DMAMUX2_TRG_DMA1_INT_TFR4 4 +#define DMAMUX2_TRG_DMA1_INT_TFR5 5 +#define DMAMUX2_TRG_DMA1_INT_TFR6 6 +#define DMAMUX2_TRG_DMA1_INT_TFR7 7 + +#define DMAMUX2_TRG_DMA2_INT_TFR0 8 +#define DMAMUX2_TRG_DMA2_INT_TFR1 9 +#define DMAMUX2_TRG_DMA2_INT_TFR2 10 +#define DMAMUX2_TRG_DMA2_INT_TFR3 11 +#define DMAMUX2_TRG_DMA2_INT_TFR4 12 +#define DMAMUX2_TRG_DMA2_INT_TFR5 13 +#define DMAMUX2_TRG_DMA2_INT_TFR6 14 +#define DMAMUX2_TRG_DMA2_INT_TFR7 15 + +#define DMAMUX2_TRG_DMA3_INT_TFR0 16 +#define DMAMUX2_TRG_DMA3_INT_TFR1 17 +#define DMAMUX2_TRG_DMA3_INT_TFR2 18 +#define DMAMUX2_TRG_DMA3_INT_TFR3 19 +#define DMAMUX2_TRG_DMA3_INT_TFR4 20 +#define DMAMUX2_TRG_DMA3_INT_TFR5 21 +#define DMAMUX2_TRG_DMA3_INT_TFR6 22 +#define DMAMUX2_TRG_DMA3_INT_TFR7 23 + +#define DMAMUX2_TRG_LCDC_LI_IT 24 +#define DMAMUX2_TRG_GPU_SPEC_INT 25 +#define DMAMUX2_TRG_JPEG_SGDMA_H2P_INT 26 +#define DMAMUX2_TRG_JPEG_SGDMA_P2H_INT 27 +#define DMAMUX2_TRG_MIPI_DSI_INT 28 +#define DMAMUX2_TRG_USB1_INT 29 +#define DMAMUX2_TRG_USB2_INT 30 +#define DMAMUX2_TRG_SDMMC1_INT 31 +#define DMAMUX2_TRG_SDMMC2_INT 32 +#define DMAMUX2_TRG_DVP1_INT 33 +#define DMAMUX2_TRG_DVP2_INT 34 +#define DMAMUX2_TRG_ETH1_INT 35 +#define DMAMUX2_TRG_ETH2_INT 36 +#define DMAMUX2_TRG_SDPU_INT 37 + +/* ========================================================================== + * DMAMUX2 Synchronization Mapping (SYNC) + * ========================================================================== + */ + +#define DMAMUX2_SYNC_INTERNAL 0 + +/* ========================================================================== + * DMAMAP Definitions for DMAMUX1 + * ========================================================================== + */ + +/* DMA1 Mappings */ +#define DMAMAP_DMA1_1GEN0 DMAMAP_MAP(DMA1, DMAMUX1_REQ_GEN0) +#define DMAMAP_DMA1_1GEN1 DMAMAP_MAP(DMA1, DMAMUX1_REQ_GEN1) +#define DMAMAP_DMA1_1GEN2 DMAMAP_MAP(DMA1, DMAMUX1_REQ_GEN2) +#define DMAMAP_DMA1_1GEN3 DMAMAP_MAP(DMA1, DMAMUX1_REQ_GEN3) +#define DMAMAP_DMA1_1GEN4 DMAMAP_MAP(DMA1, DMAMUX1_REQ_GEN4) +#define DMAMAP_DMA1_1GEN5 DMAMAP_MAP(DMA1, DMAMUX1_REQ_GEN5) +#define DMAMAP_DMA1_1GEN6 DMAMAP_MAP(DMA1, DMAMUX1_REQ_GEN6) +#define DMAMAP_DMA1_1GEN7 DMAMAP_MAP(DMA1, DMAMUX1_REQ_GEN7) + +#define DMAMAP_DMA1_ADC1 DMAMAP_MAP(DMA1, DMAMUX1_REQ_ADC1) +#define DMAMAP_DMA1_ADC2 DMAMAP_MAP(DMA1, DMAMUX1_REQ_ADC2) +#define DMAMAP_DMA1_ADC3 DMAMAP_MAP(DMA1, DMAMUX1_REQ_ADC3) + +#define DMAMAP_DMA1_SHRTIM1_DMA0 DMAMAP_MAP(DMA1, DMAMUX1_REQ_SHRTIM1_DMA0) +#define DMAMAP_DMA1_SHRTIM1_DMA1 DMAMAP_MAP(DMA1, DMAMUX1_REQ_SHRTIM1_DMA1) +#define DMAMAP_DMA1_SHRTIM1_DMA2 DMAMAP_MAP(DMA1, DMAMUX1_REQ_SHRTIM1_DMA2) +#define DMAMAP_DMA1_SHRTIM1_DMA3 DMAMAP_MAP(DMA1, DMAMUX1_REQ_SHRTIM1_DMA3) +#define DMAMAP_DMA1_SHRTIM1_DMA4 DMAMAP_MAP(DMA1, DMAMUX1_REQ_SHRTIM1_DMA4) +#define DMAMAP_DMA1_SHRTIM1_DMA5 DMAMAP_MAP(DMA1, DMAMUX1_REQ_SHRTIM1_DMA5) +#define DMAMAP_DMA1_SHRTIM1_DMA6 DMAMAP_MAP(DMA1, DMAMUX1_REQ_SHRTIM1_DMA6) + +#define DMAMAP_DMA1_SHRTIM2_DMA0 DMAMAP_MAP(DMA1, DMAMUX1_REQ_SHRTIM2_DMA0) +#define DMAMAP_DMA1_SHRTIM2_DMA1 DMAMAP_MAP(DMA1, DMAMUX1_REQ_SHRTIM2_DMA1) +#define DMAMAP_DMA1_SHRTIM2_DMA2 DMAMAP_MAP(DMA1, DMAMUX1_REQ_SHRTIM2_DMA2) +#define DMAMAP_DMA1_SHRTIM2_DMA3 DMAMAP_MAP(DMA1, DMAMUX1_REQ_SHRTIM2_DMA3) +#define DMAMAP_DMA1_SHRTIM2_DMA4 DMAMAP_MAP(DMA1, DMAMUX1_REQ_SHRTIM2_DMA4) +#define DMAMAP_DMA1_SHRTIM2_DMA5 DMAMAP_MAP(DMA1, DMAMUX1_REQ_SHRTIM2_DMA5) +#define DMAMAP_DMA1_SHRTIM2_DMA6 DMAMAP_MAP(DMA1, DMAMUX1_REQ_SHRTIM2_DMA6) + +#define DMAMAP_DMA1_ATIM1_UP DMAMAP_MAP(DMA1, DMAMUX1_REQ_ATIM1_UP) +#define DMAMAP_DMA1_ATIM1_CH1 DMAMAP_MAP(DMA1, DMAMUX1_REQ_ATIM1_CH1) +#define DMAMAP_DMA1_ATIM1_CH2 DMAMAP_MAP(DMA1, DMAMUX1_REQ_ATIM1_CH2) +#define DMAMAP_DMA1_ATIM1_CH3 DMAMAP_MAP(DMA1, DMAMUX1_REQ_ATIM1_CH3) +#define DMAMAP_DMA1_ATIM1_CH4 DMAMAP_MAP(DMA1, DMAMUX1_REQ_ATIM1_CH4) +#define DMAMAP_DMA1_ATIM1_COM DMAMAP_MAP(DMA1, DMAMUX1_REQ_ATIM1_COM) +#define DMAMAP_DMA1_ATIM1_TRG DMAMAP_MAP(DMA1, DMAMUX1_REQ_ATIM1_TRG) + +#define DMAMAP_DMA1_ATIM2_UP DMAMAP_MAP(DMA1, DMAMUX1_REQ_ATIM2_UP) +#define DMAMAP_DMA1_ATIM2_CH1 DMAMAP_MAP(DMA1, DMAMUX1_REQ_ATIM2_CH1) +#define DMAMAP_DMA1_ATIM2_CH2 DMAMAP_MAP(DMA1, DMAMUX1_REQ_ATIM2_CH2) +#define DMAMAP_DMA1_ATIM2_CH3 DMAMAP_MAP(DMA1, DMAMUX1_REQ_ATIM2_CH3) +#define DMAMAP_DMA1_ATIM2_CH4 DMAMAP_MAP(DMA1, DMAMUX1_REQ_ATIM2_CH4) +#define DMAMAP_DMA1_ATIM2_COM DMAMAP_MAP(DMA1, DMAMUX1_REQ_ATIM2_COM) +#define DMAMAP_DMA1_ATIM2_TRG DMAMAP_MAP(DMA1, DMAMUX1_REQ_ATIM2_TRG) + +#define DMAMAP_DMA1_ATIM3_UP DMAMAP_MAP(DMA1, DMAMUX1_REQ_ATIM3_UP) +#define DMAMAP_DMA1_ATIM3_CH1 DMAMAP_MAP(DMA1, DMAMUX1_REQ_ATIM3_CH1) +#define DMAMAP_DMA1_ATIM3_CH2 DMAMAP_MAP(DMA1, DMAMUX1_REQ_ATIM3_CH2) +#define DMAMAP_DMA1_ATIM3_CH3 DMAMAP_MAP(DMA1, DMAMUX1_REQ_ATIM3_CH3) +#define DMAMAP_DMA1_ATIM3_CH4 DMAMAP_MAP(DMA1, DMAMUX1_REQ_ATIM3_CH4) +#define DMAMAP_DMA1_ATIM3_COM DMAMAP_MAP(DMA1, DMAMUX1_REQ_ATIM3_COM) +#define DMAMAP_DMA1_ATIM3_TRG DMAMAP_MAP(DMA1, DMAMUX1_REQ_ATIM3_TRG) + +#define DMAMAP_DMA1_ATIM4_UP DMAMAP_MAP(DMA1, DMAMUX1_REQ_ATIM4_UP) +#define DMAMAP_DMA1_ATIM4_CH1 DMAMAP_MAP(DMA1, DMAMUX1_REQ_ATIM4_CH1) +#define DMAMAP_DMA1_ATIM4_CH2 DMAMAP_MAP(DMA1, DMAMUX1_REQ_ATIM4_CH2) +#define DMAMAP_DMA1_ATIM4_CH3 DMAMAP_MAP(DMA1, DMAMUX1_REQ_ATIM4_CH3) +#define DMAMAP_DMA1_ATIM4_CH4 DMAMAP_MAP(DMA1, DMAMUX1_REQ_ATIM4_CH4) +#define DMAMAP_DMA1_ATIM4_COM DMAMAP_MAP(DMA1, DMAMUX1_REQ_ATIM4_COM) +#define DMAMAP_DMA1_ATIM4_TRG DMAMAP_MAP(DMA1, DMAMUX1_REQ_ATIM4_TRG) + +#define DMAMAP_DMA1_GTIMA1_CH1 DMAMAP_MAP(DMA1, DMAMUX1_REQ_GTIMA1_CH1) +#define DMAMAP_DMA1_GTIMA1_CH2 DMAMAP_MAP(DMA1, DMAMUX1_REQ_GTIMA1_CH2) +#define DMAMAP_DMA1_GTIMA1_CH3 DMAMAP_MAP(DMA1, DMAMUX1_REQ_GTIMA1_CH3) +#define DMAMAP_DMA1_GTIMA1_CH4 DMAMAP_MAP(DMA1, DMAMUX1_REQ_GTIMA1_CH4) +#define DMAMAP_DMA1_GTIMA1_TRG DMAMAP_MAP(DMA1, DMAMUX1_REQ_GTIMA1_TRG) +#define DMAMAP_DMA1_GTIMA1_UP DMAMAP_MAP(DMA1, DMAMUX1_REQ_GTIMA1_UP) + +#define DMAMAP_DMA1_GTIMA2_CH1 DMAMAP_MAP(DMA1, DMAMUX1_REQ_GTIMA2_CH1) +#define DMAMAP_DMA1_GTIMA2_CH2 DMAMAP_MAP(DMA1, DMAMUX1_REQ_GTIMA2_CH2) +#define DMAMAP_DMA1_GTIMA2_CH3 DMAMAP_MAP(DMA1, DMAMUX1_REQ_GTIMA2_CH3) +#define DMAMAP_DMA1_GTIMA2_CH4 DMAMAP_MAP(DMA1, DMAMUX1_REQ_GTIMA2_CH4) +#define DMAMAP_DMA1_GTIMA2_TRG DMAMAP_MAP(DMA1, DMAMUX1_REQ_GTIMA2_TRG) +#define DMAMAP_DMA1_GTIMA2_UP DMAMAP_MAP(DMA1, DMAMUX1_REQ_GTIMA2_UP) + +#define DMAMAP_DMA1_GTIMA3_CH1 DMAMAP_MAP(DMA1, DMAMUX1_REQ_GTIMA3_CH1) +#define DMAMAP_DMA1_GTIMA3_CH2 DMAMAP_MAP(DMA1, DMAMUX1_REQ_GTIMA3_CH2) +#define DMAMAP_DMA1_GTIMA3_CH3 DMAMAP_MAP(DMA1, DMAMUX1_REQ_GTIMA3_CH3) +#define DMAMAP_DMA1_GTIMA3_CH4 DMAMAP_MAP(DMA1, DMAMUX1_REQ_GTIMA3_CH4) +#define DMAMAP_DMA1_GTIMA3_TRG DMAMAP_MAP(DMA1, DMAMUX1_REQ_GTIMA3_TRG) +#define DMAMAP_DMA1_GTIMA3_UP DMAMAP_MAP(DMA1, DMAMUX1_REQ_GTIMA3_UP) + +#define DMAMAP_DMA1_GTIMA4_CH1 DMAMAP_MAP(DMA1, DMAMUX1_REQ_GTIMA4_CH1) +#define DMAMAP_DMA1_GTIMA4_CH2 DMAMAP_MAP(DMA1, DMAMUX1_REQ_GTIMA4_CH2) +#define DMAMAP_DMA1_GTIMA4_CH3 DMAMAP_MAP(DMA1, DMAMUX1_REQ_GTIMA4_CH3) +#define DMAMAP_DMA1_GTIMA4_CH4 DMAMAP_MAP(DMA1, DMAMUX1_REQ_GTIMA4_CH4) +#define DMAMAP_DMA1_GTIMA4_TRG DMAMAP_MAP(DMA1, DMAMUX1_REQ_GTIMA4_TRG) +#define DMAMAP_DMA1_GTIMA4_UP DMAMAP_MAP(DMA1, DMAMUX1_REQ_GTIMA4_UP) + +#define DMAMAP_DMA1_GTIMA5_CH1 DMAMAP_MAP(DMA1, DMAMUX1_REQ_GTIMA5_CH1) +#define DMAMAP_DMA1_GTIMA5_CH2 DMAMAP_MAP(DMA1, DMAMUX1_REQ_GTIMA5_CH2) +#define DMAMAP_DMA1_GTIMA5_CH3 DMAMAP_MAP(DMA1, DMAMUX1_REQ_GTIMA5_CH3) +#define DMAMAP_DMA1_GTIMA5_CH4 DMAMAP_MAP(DMA1, DMAMUX1_REQ_GTIMA5_CH4) +#define DMAMAP_DMA1_GTIMA5_TRG DMAMAP_MAP(DMA1, DMAMUX1_REQ_GTIMA5_TRG) +#define DMAMAP_DMA1_GTIMA5_UP DMAMAP_MAP(DMA1, DMAMUX1_REQ_GTIMA5_UP) + +#define DMAMAP_DMA1_GTIMA6_CH1 DMAMAP_MAP(DMA1, DMAMUX1_REQ_GTIMA6_CH1) +#define DMAMAP_DMA1_GTIMA6_CH2 DMAMAP_MAP(DMA1, DMAMUX1_REQ_GTIMA6_CH2) +#define DMAMAP_DMA1_GTIMA6_CH3 DMAMAP_MAP(DMA1, DMAMUX1_REQ_GTIMA6_CH3) +#define DMAMAP_DMA1_GTIMA6_CH4 DMAMAP_MAP(DMA1, DMAMUX1_REQ_GTIMA6_CH4) +#define DMAMAP_DMA1_GTIMA6_TRG DMAMAP_MAP(DMA1, DMAMUX1_REQ_GTIMA6_TRG) +#define DMAMAP_DMA1_GTIMA6_UP DMAMAP_MAP(DMA1, DMAMUX1_REQ_GTIMA6_UP) + +#define DMAMAP_DMA1_GTIMA7_CH1 DMAMAP_MAP(DMA1, DMAMUX1_REQ_GTIMA7_CH1) +#define DMAMAP_DMA1_GTIMA7_CH2 DMAMAP_MAP(DMA1, DMAMUX1_REQ_GTIMA7_CH2) +#define DMAMAP_DMA1_GTIMA7_CH3 DMAMAP_MAP(DMA1, DMAMUX1_REQ_GTIMA7_CH3) +#define DMAMAP_DMA1_GTIMA7_CH4 DMAMAP_MAP(DMA1, DMAMUX1_REQ_GTIMA7_CH4) +#define DMAMAP_DMA1_GTIMA7_TRG DMAMAP_MAP(DMA1, DMAMUX1_REQ_GTIMA7_TRG) +#define DMAMAP_DMA1_GTIMA7_UP DMAMAP_MAP(DMA1, DMAMUX1_REQ_GTIMA7_UP) + +#define DMAMAP_DMA1_GTIMB1_CH1 DMAMAP_MAP(DMA1, DMAMUX1_REQ_GTIMB1_CH1) +#define DMAMAP_DMA1_GTIMB1_CH2 DMAMAP_MAP(DMA1, DMAMUX1_REQ_GTIMB1_CH2) +#define DMAMAP_DMA1_GTIMB1_CH3 DMAMAP_MAP(DMA1, DMAMUX1_REQ_GTIMB1_CH3) +#define DMAMAP_DMA1_GTIMB1_CH4 DMAMAP_MAP(DMA1, DMAMUX1_REQ_GTIMB1_CH4) +#define DMAMAP_DMA1_GTIMB1_TRG DMAMAP_MAP(DMA1, DMAMUX1_REQ_GTIMB1_TRG) +#define DMAMAP_DMA1_GTIMB1_UP DMAMAP_MAP(DMA1, DMAMUX1_REQ_GTIMB1_UP) + +#define DMAMAP_DMA1_GTIMB2_CH1 DMAMAP_MAP(DMA1, DMAMUX1_REQ_GTIMB2_CH1) +#define DMAMAP_DMA1_GTIMB2_CH2 DMAMAP_MAP(DMA1, DMAMUX1_REQ_GTIMB2_CH2) +#define DMAMAP_DMA1_GTIMB2_CH3 DMAMAP_MAP(DMA1, DMAMUX1_REQ_GTIMB2_CH3) +#define DMAMAP_DMA1_GTIMB2_CH4 DMAMAP_MAP(DMA1, DMAMUX1_REQ_GTIMB2_CH4) +#define DMAMAP_DMA1_GTIMB2_TRG DMAMAP_MAP(DMA1, DMAMUX1_REQ_GTIMB2_TRG) +#define DMAMAP_DMA1_GTIMB2_UP DMAMAP_MAP(DMA1, DMAMUX1_REQ_GTIMB2_UP) + +#define DMAMAP_DMA1_GTIMB3_CH1 DMAMAP_MAP(DMA1, DMAMUX1_REQ_GTIMB3_CH1) +#define DMAMAP_DMA1_GTIMB3_CH2 DMAMAP_MAP(DMA1, DMAMUX1_REQ_GTIMB3_CH2) +#define DMAMAP_DMA1_GTIMB3_CH3 DMAMAP_MAP(DMA1, DMAMUX1_REQ_GTIMB3_CH3) +#define DMAMAP_DMA1_GTIMB3_CH4 DMAMAP_MAP(DMA1, DMAMUX1_REQ_GTIMB3_CH4) +#define DMAMAP_DMA1_GTIMB3_TRG DMAMAP_MAP(DMA1, DMAMUX1_REQ_GTIMB3_TRG) +#define DMAMAP_DMA1_GTIMB3_UP DMAMAP_MAP(DMA1, DMAMUX1_REQ_GTIMB3_UP) + +#define DMAMAP_DMA1_I2C1_RX DMAMAP_MAP(DMA1, DMAMUX1_REQ_I2C1_RX) +#define DMAMAP_DMA1_I2C1_TX DMAMAP_MAP(DMA1, DMAMUX1_REQ_I2C1_TX) +#define DMAMAP_DMA1_I2C2_RX DMAMAP_MAP(DMA1, DMAMUX1_REQ_I2C2_RX) +#define DMAMAP_DMA1_I2C2_TX DMAMAP_MAP(DMA1, DMAMUX1_REQ_I2C2_TX) +#define DMAMAP_DMA1_I2C3_RX DMAMAP_MAP(DMA1, DMAMUX1_REQ_I2C3_RX) +#define DMAMAP_DMA1_I2C3_TX DMAMAP_MAP(DMA1, DMAMUX1_REQ_I2C3_TX) +#define DMAMAP_DMA1_I2C4_RX DMAMAP_MAP(DMA1, DMAMUX1_REQ_I2C4_RX) +#define DMAMAP_DMA1_I2C4_TX DMAMAP_MAP(DMA1, DMAMUX1_REQ_I2C4_TX) +#define DMAMAP_DMA1_I2C5_RX DMAMAP_MAP(DMA1, DMAMUX1_REQ_I2C5_RX) +#define DMAMAP_DMA1_I2C5_TX DMAMAP_MAP(DMA1, DMAMUX1_REQ_I2C5_TX) +#define DMAMAP_DMA1_I2C6_RX DMAMAP_MAP(DMA1, DMAMUX1_REQ_I2C6_RX) +#define DMAMAP_DMA1_I2C6_TX DMAMAP_MAP(DMA1, DMAMUX1_REQ_I2C6_TX) +#define DMAMAP_DMA1_I2C7_RX DMAMAP_MAP(DMA1, DMAMUX1_REQ_I2C7_RX) +#define DMAMAP_DMA1_I2C7_TX DMAMAP_MAP(DMA1, DMAMUX1_REQ_I2C7_TX) +#define DMAMAP_DMA1_I2C8_RX DMAMAP_MAP(DMA1, DMAMUX1_REQ_I2C8_RX) +#define DMAMAP_DMA1_I2C8_TX DMAMAP_MAP(DMA1, DMAMUX1_REQ_I2C8_TX) +#define DMAMAP_DMA1_I2C9_RX DMAMAP_MAP(DMA1, DMAMUX1_REQ_I2C9_RX) +#define DMAMAP_DMA1_I2C9_TX DMAMAP_MAP(DMA1, DMAMUX1_REQ_I2C9_TX) +#define DMAMAP_DMA1_I2C10_RX DMAMAP_MAP(DMA1, DMAMUX1_REQ_I2C10_RX) +#define DMAMAP_DMA1_I2C10_TX DMAMAP_MAP(DMA1, DMAMUX1_REQ_I2C10_TX) + +#define DMAMAP_DMA1_USART1_RX DMAMAP_MAP(DMA1, DMAMUX1_REQ_USART1_RX) +#define DMAMAP_DMA1_USART1_TX DMAMAP_MAP(DMA1, DMAMUX1_REQ_USART1_TX) +#define DMAMAP_DMA1_USART2_RX DMAMAP_MAP(DMA1, DMAMUX1_REQ_USART2_RX) +#define DMAMAP_DMA1_USART2_TX DMAMAP_MAP(DMA1, DMAMUX1_REQ_USART2_TX) +#define DMAMAP_DMA1_USART3_RX DMAMAP_MAP(DMA1, DMAMUX1_REQ_USART3_RX) +#define DMAMAP_DMA1_USART3_TX DMAMAP_MAP(DMA1, DMAMUX1_REQ_USART3_TX) +#define DMAMAP_DMA1_USART4_RX DMAMAP_MAP(DMA1, DMAMUX1_REQ_USART4_RX) +#define DMAMAP_DMA1_USART4_TX DMAMAP_MAP(DMA1, DMAMUX1_REQ_USART4_TX) +#define DMAMAP_DMA1_USART5_RX DMAMAP_MAP(DMA1, DMAMUX1_REQ_USART5_RX) +#define DMAMAP_DMA1_USART5_TX DMAMAP_MAP(DMA1, DMAMUX1_REQ_USART5_TX) +#define DMAMAP_DMA1_USART6_RX DMAMAP_MAP(DMA1, DMAMUX1_REQ_USART6_RX) +#define DMAMAP_DMA1_USART6_TX DMAMAP_MAP(DMA1, DMAMUX1_REQ_USART6_TX) +#define DMAMAP_DMA1_USART7_RX DMAMAP_MAP(DMA1, DMAMUX1_REQ_USART7_RX) +#define DMAMAP_DMA1_USART7_TX DMAMAP_MAP(DMA1, DMAMUX1_REQ_USART7_TX) +#define DMAMAP_DMA1_USART8_RX DMAMAP_MAP(DMA1, DMAMUX1_REQ_USART8_RX) +#define DMAMAP_DMA1_USART8_TX DMAMAP_MAP(DMA1, DMAMUX1_REQ_USART8_TX) + +#define DMAMAP_DMA1_UART9_RX DMAMAP_MAP(DMA1, DMAMUX1_REQ_UART9_RX) +#define DMAMAP_DMA1_UART9_TX DMAMAP_MAP(DMA1, DMAMUX1_REQ_UART9_TX) +#define DMAMAP_DMA1_UART10_RX DMAMAP_MAP(DMA1, DMAMUX1_REQ_UART10_RX) +#define DMAMAP_DMA1_UART10_TX DMAMAP_MAP(DMA1, DMAMUX1_REQ_UART10_TX) +#define DMAMAP_DMA1_UART11_RX DMAMAP_MAP(DMA1, DMAMUX1_REQ_UART11_RX) +#define DMAMAP_DMA1_UART11_TX DMAMAP_MAP(DMA1, DMAMUX1_REQ_UART11_TX) +#define DMAMAP_DMA1_UART12_RX DMAMAP_MAP(DMA1, DMAMUX1_REQ_UART12_RX) +#define DMAMAP_DMA1_UART12_TX DMAMAP_MAP(DMA1, DMAMUX1_REQ_UART12_TX) +#define DMAMAP_DMA1_UART13_RX DMAMAP_MAP(DMA1, DMAMUX1_REQ_UART13_RX) +#define DMAMAP_DMA1_UART13_TX DMAMAP_MAP(DMA1, DMAMUX1_REQ_UART13_TX) +#define DMAMAP_DMA1_UART14_RX DMAMAP_MAP(DMA1, DMAMUX1_REQ_UART14_RX) +#define DMAMAP_DMA1_UART14_TX DMAMAP_MAP(DMA1, DMAMUX1_REQ_UART14_TX) +#define DMAMAP_DMA1_UART15_RX DMAMAP_MAP(DMA1, DMAMUX1_REQ_UART15_RX) +#define DMAMAP_DMA1_UART15_TX DMAMAP_MAP(DMA1, DMAMUX1_REQ_UART15_TX) + +#define DMAMAP_DMA1_SPI1_RX DMAMAP_MAP(DMA1, DMAMUX1_REQ_SPI1_RX) +#define DMAMAP_DMA1_SPI1_TX DMAMAP_MAP(DMA1, DMAMUX1_REQ_SPI1_TX) +#define DMAMAP_DMA1_SPI2_RX DMAMAP_MAP(DMA1, DMAMUX1_REQ_SPI2_RX) +#define DMAMAP_DMA1_SPI2_TX DMAMAP_MAP(DMA1, DMAMUX1_REQ_SPI2_TX) +#define DMAMAP_DMA1_SPI3_RX DMAMAP_MAP(DMA1, DMAMUX1_REQ_SPI3_RX) +#define DMAMAP_DMA1_SPI3_TX DMAMAP_MAP(DMA1, DMAMUX1_REQ_SPI3_TX) +#define DMAMAP_DMA1_SPI4_RX DMAMAP_MAP(DMA1, DMAMUX1_REQ_SPI4_RX) +#define DMAMAP_DMA1_SPI4_TX DMAMAP_MAP(DMA1, DMAMUX1_REQ_SPI4_TX) +#define DMAMAP_DMA1_SPI5_RX DMAMAP_MAP(DMA1, DMAMUX1_REQ_SPI5_RX) +#define DMAMAP_DMA1_SPI5_TX DMAMAP_MAP(DMA1, DMAMUX1_REQ_SPI5_TX) +#define DMAMAP_DMA1_SPI6_RX DMAMAP_MAP(DMA1, DMAMUX1_REQ_SPI6_RX) +#define DMAMAP_DMA1_SPI6_TX DMAMAP_MAP(DMA1, DMAMUX1_REQ_SPI6_TX) +#define DMAMAP_DMA1_SPI7_RX DMAMAP_MAP(DMA1, DMAMUX1_REQ_SPI7_RX) +#define DMAMAP_DMA1_SPI7_TX DMAMAP_MAP(DMA1, DMAMUX1_REQ_SPI7_TX) + +#define DMAMAP_DMA1_I2S1_RX DMAMAP_MAP(DMA1, DMAMUX1_REQ_I2S1_RX) +#define DMAMAP_DMA1_I2S1_TX DMAMAP_MAP(DMA1, DMAMUX1_REQ_I2S1_TX) +#define DMAMAP_DMA1_I2S2_RX DMAMAP_MAP(DMA1, DMAMUX1_REQ_I2S2_RX) +#define DMAMAP_DMA1_I2S2_TX DMAMAP_MAP(DMA1, DMAMUX1_REQ_I2S2_TX) +#define DMAMAP_DMA1_I2S3_RX DMAMAP_MAP(DMA1, DMAMUX1_REQ_I2S3_RX) +#define DMAMAP_DMA1_I2S3_TX DMAMAP_MAP(DMA1, DMAMUX1_REQ_I2S3_TX) +#define DMAMAP_DMA1_I2S4_RX DMAMAP_MAP(DMA1, DMAMUX1_REQ_I2S4_RX) +#define DMAMAP_DMA1_I2S4_TX DMAMAP_MAP(DMA1, DMAMUX1_REQ_I2S4_TX) + +#define DMAMAP_DMA1_LPUART1_RX DMAMAP_MAP(DMA1, DMAMUX1_REQ_LPUART1_RX) +#define DMAMAP_DMA1_LPUART1_TX DMAMAP_MAP(DMA1, DMAMUX1_REQ_LPUART1_TX) +#define DMAMAP_DMA1_LPUART2_RX DMAMAP_MAP(DMA1, DMAMUX1_REQ_LPUART2_RX) +#define DMAMAP_DMA1_LPUART2_TX DMAMAP_MAP(DMA1, DMAMUX1_REQ_LPUART2_TX) + +#define DMAMAP_DMA1_DSMU0 DMAMAP_MAP(DMA1, DMAMUX1_REQ_DSMU0) +#define DMAMAP_DMA1_DSMU1 DMAMAP_MAP(DMA1, DMAMUX1_REQ_DSMU1) +#define DMAMAP_DMA1_DSMU2 DMAMAP_MAP(DMA1, DMAMUX1_REQ_DSMU2) +#define DMAMAP_DMA1_DSMU3 DMAMAP_MAP(DMA1, DMAMUX1_REQ_DSMU3) + +#define DMAMAP_DMA1_FDCAN1 DMAMAP_MAP(DMA1, DMAMUX1_REQ_FDCAN1) +#define DMAMAP_DMA1_FDCAN2 DMAMAP_MAP(DMA1, DMAMUX1_REQ_FDCAN2) +#define DMAMAP_DMA1_FDCAN3 DMAMAP_MAP(DMA1, DMAMUX1_REQ_FDCAN3) +#define DMAMAP_DMA1_FDCAN4 DMAMAP_MAP(DMA1, DMAMUX1_REQ_FDCAN4) +#define DMAMAP_DMA1_FDCAN5 DMAMAP_MAP(DMA1, DMAMUX1_REQ_FDCAN5) +#define DMAMAP_DMA1_FDCAN6 DMAMAP_MAP(DMA1, DMAMUX1_REQ_FDCAN6) +#define DMAMAP_DMA1_FDCAN7 DMAMAP_MAP(DMA1, DMAMUX1_REQ_FDCAN7) +#define DMAMAP_DMA1_FDCAN8 DMAMAP_MAP(DMA1, DMAMUX1_REQ_FDCAN8) + +#define DMAMAP_DMA1_CORDIC_RD DMAMAP_MAP(DMA1, DMAMUX1_REQ_CORDIC_RD) +#define DMAMAP_DMA1_CORDIC_WR DMAMAP_MAP(DMA1, DMAMUX1_REQ_CORDIC_WR) + +#define DMAMAP_DMA1_FMAU_RD DMAMAP_MAP(DMA1, DMAMUX1_REQ_FMAU_RD) +#define DMAMAP_DMA1_FMAU_WR DMAMAP_MAP(DMA1, DMAMUX1_REQ_FMAU_WR) + +#define DMAMAP_DMA1_BTIM1 DMAMAP_MAP(DMA1, DMAMUX1_REQ_BTIM1) +#define DMAMAP_DMA1_BTIM2 DMAMAP_MAP(DMA1, DMAMUX1_REQ_BTIM2) +#define DMAMAP_DMA1_BTIM3 DMAMAP_MAP(DMA1, DMAMUX1_REQ_BTIM3) +#define DMAMAP_DMA1_BTIM4 DMAMAP_MAP(DMA1, DMAMUX1_REQ_BTIM4) + +#define DMAMAP_DMA1_GTIMB1_COM DMAMAP_MAP(DMA1, DMAMUX1_REQ_GTIMB1_COM) +#define DMAMAP_DMA1_GTIMB2_COM DMAMAP_MAP(DMA1, DMAMUX1_REQ_GTIMB2_COM) +#define DMAMAP_DMA1_GTIMB3_COM DMAMAP_MAP(DMA1, DMAMUX1_REQ_GTIMB3_COM) + +#define DMAMAP_DMA1_DAC12_0 DMAMAP_MAP(DMA1, DMAMUX1_REQ_DAC12_0) +#define DMAMAP_DMA1_DAC12_1 DMAMAP_MAP(DMA1, DMAMUX1_REQ_DAC12_1) +#define DMAMAP_DMA1_DAC34_0 DMAMAP_MAP(DMA1, DMAMUX1_REQ_DAC34_0) +#define DMAMAP_DMA1_DAC34_1 DMAMAP_MAP(DMA1, DMAMUX1_REQ_DAC34_1) +#define DMAMAP_DMA1_DAC56_0 DMAMAP_MAP(DMA1, DMAMUX1_REQ_DAC56_0) +#define DMAMAP_DMA1_DAC56_1 DMAMAP_MAP(DMA1, DMAMUX1_REQ_DAC56_1) + +/* DMA2 Mappings */ +#define DMAMAP_DMA2_2GEN0 DMAMAP_MAP(DMA2, DMAMUX1_REQ_GEN0) +#define DMAMAP_DMA2_2GEN1 DMAMAP_MAP(DMA2, DMAMUX1_REQ_GEN1) +#define DMAMAP_DMA2_2GEN2 DMAMAP_MAP(DMA2, DMAMUX1_REQ_GEN2) +#define DMAMAP_DMA2_2GEN3 DMAMAP_MAP(DMA2, DMAMUX1_REQ_GEN3) +#define DMAMAP_DMA2_2GEN4 DMAMAP_MAP(DMA2, DMAMUX1_REQ_GEN4) +#define DMAMAP_DMA2_2GEN5 DMAMAP_MAP(DMA2, DMAMUX1_REQ_GEN5) +#define DMAMAP_DMA2_2GEN6 DMAMAP_MAP(DMA2, DMAMUX1_REQ_GEN6) +#define DMAMAP_DMA2_2GEN7 DMAMAP_MAP(DMA2, DMAMUX1_REQ_GEN7) + +#define DMAMAP_DMA2_ADC1 DMAMAP_MAP(DMA2, DMAMUX1_REQ_ADC1) +#define DMAMAP_DMA2_ADC2 DMAMAP_MAP(DMA2, DMAMUX1_REQ_ADC2) +#define DMAMAP_DMA2_ADC3 DMAMAP_MAP(DMA2, DMAMUX1_REQ_ADC3) + +#define DMAMAP_DMA2_SHRTIM1_DMA0 DMAMAP_MAP(DMA2, DMAMUX1_REQ_SHRTIM1_DMA0) +#define DMAMAP_DMA2_SHRTIM1_DMA1 DMAMAP_MAP(DMA2, DMAMUX1_REQ_SHRTIM1_DMA1) +#define DMAMAP_DMA2_SHRTIM1_DMA2 DMAMAP_MAP(DMA2, DMAMUX1_REQ_SHRTIM1_DMA2) +#define DMAMAP_DMA2_SHRTIM1_DMA3 DMAMAP_MAP(DMA2, DMAMUX1_REQ_SHRTIM1_DMA3) +#define DMAMAP_DMA2_SHRTIM1_DMA4 DMAMAP_MAP(DMA2, DMAMUX1_REQ_SHRTIM1_DMA4) +#define DMAMAP_DMA2_SHRTIM1_DMA5 DMAMAP_MAP(DMA2, DMAMUX1_REQ_SHRTIM1_DMA5) +#define DMAMAP_DMA2_SHRTIM1_DMA6 DMAMAP_MAP(DMA2, DMAMUX1_REQ_SHRTIM1_DMA6) + +#define DMAMAP_DMA2_SHRTIM2_DMA0 DMAMAP_MAP(DMA2, DMAMUX1_REQ_SHRTIM2_DMA0) +#define DMAMAP_DMA2_SHRTIM2_DMA1 DMAMAP_MAP(DMA2, DMAMUX1_REQ_SHRTIM2_DMA1) +#define DMAMAP_DMA2_SHRTIM2_DMA2 DMAMAP_MAP(DMA2, DMAMUX1_REQ_SHRTIM2_DMA2) +#define DMAMAP_DMA2_SHRTIM2_DMA3 DMAMAP_MAP(DMA2, DMAMUX1_REQ_SHRTIM2_DMA3) +#define DMAMAP_DMA2_SHRTIM2_DMA4 DMAMAP_MAP(DMA2, DMAMUX1_REQ_SHRTIM2_DMA4) +#define DMAMAP_DMA2_SHRTIM2_DMA5 DMAMAP_MAP(DMA2, DMAMUX1_REQ_SHRTIM2_DMA5) +#define DMAMAP_DMA2_SHRTIM2_DMA6 DMAMAP_MAP(DMA2, DMAMUX1_REQ_SHRTIM2_DMA6) + +#define DMAMAP_DMA2_ATIM1_UP DMAMAP_MAP(DMA2, DMAMUX1_REQ_ATIM1_UP) +#define DMAMAP_DMA2_ATIM1_CH1 DMAMAP_MAP(DMA2, DMAMUX1_REQ_ATIM1_CH1) +#define DMAMAP_DMA2_ATIM1_CH2 DMAMAP_MAP(DMA2, DMAMUX1_REQ_ATIM1_CH2) +#define DMAMAP_DMA2_ATIM1_CH3 DMAMAP_MAP(DMA2, DMAMUX1_REQ_ATIM1_CH3) +#define DMAMAP_DMA2_ATIM1_CH4 DMAMAP_MAP(DMA2, DMAMUX1_REQ_ATIM1_CH4) +#define DMAMAP_DMA2_ATIM1_COM DMAMAP_MAP(DMA2, DMAMUX1_REQ_ATIM1_COM) +#define DMAMAP_DMA2_ATIM1_TRG DMAMAP_MAP(DMA2, DMAMUX1_REQ_ATIM1_TRG) + +#define DMAMAP_DMA2_ATIM2_UP DMAMAP_MAP(DMA2, DMAMUX1_REQ_ATIM2_UP) +#define DMAMAP_DMA2_ATIM2_CH1 DMAMAP_MAP(DMA2, DMAMUX1_REQ_ATIM2_CH1) +#define DMAMAP_DMA2_ATIM2_CH2 DMAMAP_MAP(DMA2, DMAMUX1_REQ_ATIM2_CH2) +#define DMAMAP_DMA2_ATIM2_CH3 DMAMAP_MAP(DMA2, DMAMUX1_REQ_ATIM2_CH3) +#define DMAMAP_DMA2_ATIM2_CH4 DMAMAP_MAP(DMA2, DMAMUX1_REQ_ATIM2_CH4) +#define DMAMAP_DMA2_ATIM2_COM DMAMAP_MAP(DMA2, DMAMUX1_REQ_ATIM2_COM) +#define DMAMAP_DMA2_ATIM2_TRG DMAMAP_MAP(DMA2, DMAMUX1_REQ_ATIM2_TRG) + +#define DMAMAP_DMA2_ATIM3_UP DMAMAP_MAP(DMA2, DMAMUX1_REQ_ATIM3_UP) +#define DMAMAP_DMA2_ATIM3_CH1 DMAMAP_MAP(DMA2, DMAMUX1_REQ_ATIM3_CH1) +#define DMAMAP_DMA2_ATIM3_CH2 DMAMAP_MAP(DMA2, DMAMUX1_REQ_ATIM3_CH2) +#define DMAMAP_DMA2_ATIM3_CH3 DMAMAP_MAP(DMA2, DMAMUX1_REQ_ATIM3_CH3) +#define DMAMAP_DMA2_ATIM3_CH4 DMAMAP_MAP(DMA2, DMAMUX1_REQ_ATIM3_CH4) +#define DMAMAP_DMA2_ATIM3_COM DMAMAP_MAP(DMA2, DMAMUX1_REQ_ATIM3_COM) +#define DMAMAP_DMA2_ATIM3_TRG DMAMAP_MAP(DMA2, DMAMUX1_REQ_ATIM3_TRG) + +#define DMAMAP_DMA2_ATIM4_UP DMAMAP_MAP(DMA2, DMAMUX1_REQ_ATIM4_UP) +#define DMAMAP_DMA2_ATIM4_CH1 DMAMAP_MAP(DMA2, DMAMUX1_REQ_ATIM4_CH1) +#define DMAMAP_DMA2_ATIM4_CH2 DMAMAP_MAP(DMA2, DMAMUX1_REQ_ATIM4_CH2) +#define DMAMAP_DMA2_ATIM4_CH3 DMAMAP_MAP(DMA2, DMAMUX1_REQ_ATIM4_CH3) +#define DMAMAP_DMA2_ATIM4_CH4 DMAMAP_MAP(DMA2, DMAMUX1_REQ_ATIM4_CH4) +#define DMAMAP_DMA2_ATIM4_COM DMAMAP_MAP(DMA2, DMAMUX1_REQ_ATIM4_COM) +#define DMAMAP_DMA2_ATIM4_TRG DMAMAP_MAP(DMA2, DMAMUX1_REQ_ATIM4_TRG) + +#define DMAMAP_DMA2_GTIMA1_CH1 DMAMAP_MAP(DMA2, DMAMUX1_REQ_GTIMA1_CH1) +#define DMAMAP_DMA2_GTIMA1_CH2 DMAMAP_MAP(DMA2, DMAMUX1_REQ_GTIMA1_CH2) +#define DMAMAP_DMA2_GTIMA1_CH3 DMAMAP_MAP(DMA2, DMAMUX1_REQ_GTIMA1_CH3) +#define DMAMAP_DMA2_GTIMA1_CH4 DMAMAP_MAP(DMA2, DMAMUX1_REQ_GTIMA1_CH4) +#define DMAMAP_DMA2_GTIMA1_TRG DMAMAP_MAP(DMA2, DMAMUX1_REQ_GTIMA1_TRG) +#define DMAMAP_DMA2_GTIMA1_UP DMAMAP_MAP(DMA2, DMAMUX1_REQ_GTIMA1_UP) + +#define DMAMAP_DMA2_GTIMA2_CH1 DMAMAP_MAP(DMA2, DMAMUX1_REQ_GTIMA2_CH1) +#define DMAMAP_DMA2_GTIMA2_CH2 DMAMAP_MAP(DMA2, DMAMUX1_REQ_GTIMA2_CH2) +#define DMAMAP_DMA2_GTIMA2_CH3 DMAMAP_MAP(DMA2, DMAMUX1_REQ_GTIMA2_CH3) +#define DMAMAP_DMA2_GTIMA2_CH4 DMAMAP_MAP(DMA2, DMAMUX1_REQ_GTIMA2_CH4) +#define DMAMAP_DMA2_GTIMA2_TRG DMAMAP_MAP(DMA2, DMAMUX1_REQ_GTIMA2_TRG) +#define DMAMAP_DMA2_GTIMA2_UP DMAMAP_MAP(DMA2, DMAMUX1_REQ_GTIMA2_UP) + +#define DMAMAP_DMA2_GTIMA3_CH1 DMAMAP_MAP(DMA2, DMAMUX1_REQ_GTIMA3_CH1) +#define DMAMAP_DMA2_GTIMA3_CH2 DMAMAP_MAP(DMA2, DMAMUX1_REQ_GTIMA3_CH2) +#define DMAMAP_DMA2_GTIMA3_CH3 DMAMAP_MAP(DMA2, DMAMUX1_REQ_GTIMA3_CH3) +#define DMAMAP_DMA2_GTIMA3_CH4 DMAMAP_MAP(DMA2, DMAMUX1_REQ_GTIMA3_CH4) +#define DMAMAP_DMA2_GTIMA3_TRG DMAMAP_MAP(DMA2, DMAMUX1_REQ_GTIMA3_TRG) +#define DMAMAP_DMA2_GTIMA3_UP DMAMAP_MAP(DMA2, DMAMUX1_REQ_GTIMA3_UP) + +#define DMAMAP_DMA2_GTIMA4_CH1 DMAMAP_MAP(DMA2, DMAMUX1_REQ_GTIMA4_CH1) +#define DMAMAP_DMA2_GTIMA4_CH2 DMAMAP_MAP(DMA2, DMAMUX1_REQ_GTIMA4_CH2) +#define DMAMAP_DMA2_GTIMA4_CH3 DMAMAP_MAP(DMA2, DMAMUX1_REQ_GTIMA4_CH3) +#define DMAMAP_DMA2_GTIMA4_CH4 DMAMAP_MAP(DMA2, DMAMUX1_REQ_GTIMA4_CH4) +#define DMAMAP_DMA2_GTIMA4_TRG DMAMAP_MAP(DMA2, DMAMUX1_REQ_GTIMA4_TRG) +#define DMAMAP_DMA2_GTIMA4_UP DMAMAP_MAP(DMA2, DMAMUX1_REQ_GTIMA4_UP) + +#define DMAMAP_DMA2_GTIMA5_CH1 DMAMAP_MAP(DMA2, DMAMUX1_REQ_GTIMA5_CH1) +#define DMAMAP_DMA2_GTIMA5_CH2 DMAMAP_MAP(DMA2, DMAMUX1_REQ_GTIMA5_CH2) +#define DMAMAP_DMA2_GTIMA5_CH3 DMAMAP_MAP(DMA2, DMAMUX1_REQ_GTIMA5_CH3) +#define DMAMAP_DMA2_GTIMA5_CH4 DMAMAP_MAP(DMA2, DMAMUX1_REQ_GTIMA5_CH4) +#define DMAMAP_DMA2_GTIMA5_TRG DMAMAP_MAP(DMA2, DMAMUX1_REQ_GTIMA5_TRG) +#define DMAMAP_DMA2_GTIMA5_UP DMAMAP_MAP(DMA2, DMAMUX1_REQ_GTIMA5_UP) + +#define DMAMAP_DMA2_GTIMA6_CH1 DMAMAP_MAP(DMA2, DMAMUX1_REQ_GTIMA6_CH1) +#define DMAMAP_DMA2_GTIMA6_CH2 DMAMAP_MAP(DMA2, DMAMUX1_REQ_GTIMA6_CH2) +#define DMAMAP_DMA2_GTIMA6_CH3 DMAMAP_MAP(DMA2, DMAMUX1_REQ_GTIMA6_CH3) +#define DMAMAP_DMA2_GTIMA6_CH4 DMAMAP_MAP(DMA2, DMAMUX1_REQ_GTIMA6_CH4) +#define DMAMAP_DMA2_GTIMA6_TRG DMAMAP_MAP(DMA2, DMAMUX1_REQ_GTIMA6_TRG) +#define DMAMAP_DMA2_GTIMA6_UP DMAMAP_MAP(DMA2, DMAMUX1_REQ_GTIMA6_UP) + +#define DMAMAP_DMA2_GTIMA7_CH1 DMAMAP_MAP(DMA2, DMAMUX1_REQ_GTIMA7_CH1) +#define DMAMAP_DMA2_GTIMA7_CH2 DMAMAP_MAP(DMA2, DMAMUX1_REQ_GTIMA7_CH2) +#define DMAMAP_DMA2_GTIMA7_CH3 DMAMAP_MAP(DMA2, DMAMUX1_REQ_GTIMA7_CH3) +#define DMAMAP_DMA2_GTIMA7_CH4 DMAMAP_MAP(DMA2, DMAMUX1_REQ_GTIMA7_CH4) +#define DMAMAP_DMA2_GTIMA7_TRG DMAMAP_MAP(DMA2, DMAMUX1_REQ_GTIMA7_TRG) +#define DMAMAP_DMA2_GTIMA7_UP DMAMAP_MAP(DMA2, DMAMUX1_REQ_GTIMA7_UP) + +#define DMAMAP_DMA2_GTIMB1_CH1 DMAMAP_MAP(DMA2, DMAMUX1_REQ_GTIMB1_CH1) +#define DMAMAP_DMA2_GTIMB1_CH2 DMAMAP_MAP(DMA2, DMAMUX1_REQ_GTIMB1_CH2) +#define DMAMAP_DMA2_GTIMB1_CH3 DMAMAP_MAP(DMA2, DMAMUX1_REQ_GTIMB1_CH3) +#define DMAMAP_DMA2_GTIMB1_CH4 DMAMAP_MAP(DMA2, DMAMUX1_REQ_GTIMB1_CH4) +#define DMAMAP_DMA2_GTIMB1_TRG DMAMAP_MAP(DMA2, DMAMUX1_REQ_GTIMB1_TRG) +#define DMAMAP_DMA2_GTIMB1_UP DMAMAP_MAP(DMA2, DMAMUX1_REQ_GTIMB1_UP) + +#define DMAMAP_DMA2_GTIMB2_CH1 DMAMAP_MAP(DMA2, DMAMUX1_REQ_GTIMB2_CH1) +#define DMAMAP_DMA2_GTIMB2_CH2 DMAMAP_MAP(DMA2, DMAMUX1_REQ_GTIMB2_CH2) +#define DMAMAP_DMA2_GTIMB2_CH3 DMAMAP_MAP(DMA2, DMAMUX1_REQ_GTIMB2_CH3) +#define DMAMAP_DMA2_GTIMB2_CH4 DMAMAP_MAP(DMA2, DMAMUX1_REQ_GTIMB2_CH4) +#define DMAMAP_DMA2_GTIMB2_TRG DMAMAP_MAP(DMA2, DMAMUX1_REQ_GTIMB2_TRG) +#define DMAMAP_DMA2_GTIMB2_UP DMAMAP_MAP(DMA2, DMAMUX1_REQ_GTIMB2_UP) + +#define DMAMAP_DMA2_GTIMB3_CH1 DMAMAP_MAP(DMA2, DMAMUX1_REQ_GTIMB3_CH1) +#define DMAMAP_DMA2_GTIMB3_CH2 DMAMAP_MAP(DMA2, DMAMUX1_REQ_GTIMB3_CH2) +#define DMAMAP_DMA2_GTIMB3_CH3 DMAMAP_MAP(DMA2, DMAMUX1_REQ_GTIMB3_CH3) +#define DMAMAP_DMA2_GTIMB3_CH4 DMAMAP_MAP(DMA2, DMAMUX1_REQ_GTIMB3_CH4) +#define DMAMAP_DMA2_GTIMB3_TRG DMAMAP_MAP(DMA2, DMAMUX1_REQ_GTIMB3_TRG) +#define DMAMAP_DMA2_GTIMB3_UP DMAMAP_MAP(DMA2, DMAMUX1_REQ_GTIMB3_UP) + +#define DMAMAP_DMA2_I2C1_RX DMAMAP_MAP(DMA2, DMAMUX1_REQ_I2C1_RX) +#define DMAMAP_DMA2_I2C1_TX DMAMAP_MAP(DMA2, DMAMUX1_REQ_I2C1_TX) +#define DMAMAP_DMA2_I2C2_RX DMAMAP_MAP(DMA2, DMAMUX1_REQ_I2C2_RX) +#define DMAMAP_DMA2_I2C2_TX DMAMAP_MAP(DMA2, DMAMUX1_REQ_I2C2_TX) +#define DMAMAP_DMA2_I2C3_RX DMAMAP_MAP(DMA2, DMAMUX1_REQ_I2C3_RX) +#define DMAMAP_DMA2_I2C3_TX DMAMAP_MAP(DMA2, DMAMUX1_REQ_I2C3_TX) +#define DMAMAP_DMA2_I2C4_RX DMAMAP_MAP(DMA2, DMAMUX1_REQ_I2C4_RX) +#define DMAMAP_DMA2_I2C4_TX DMAMAP_MAP(DMA2, DMAMUX1_REQ_I2C4_TX) +#define DMAMAP_DMA2_I2C5_RX DMAMAP_MAP(DMA2, DMAMUX1_REQ_I2C5_RX) +#define DMAMAP_DMA2_I2C5_TX DMAMAP_MAP(DMA2, DMAMUX1_REQ_I2C5_TX) +#define DMAMAP_DMA2_I2C6_RX DMAMAP_MAP(DMA2, DMAMUX1_REQ_I2C6_RX) +#define DMAMAP_DMA2_I2C6_TX DMAMAP_MAP(DMA2, DMAMUX1_REQ_I2C6_TX) +#define DMAMAP_DMA2_I2C7_RX DMAMAP_MAP(DMA2, DMAMUX1_REQ_I2C7_RX) +#define DMAMAP_DMA2_I2C7_TX DMAMAP_MAP(DMA2, DMAMUX1_REQ_I2C7_TX) +#define DMAMAP_DMA2_I2C8_RX DMAMAP_MAP(DMA2, DMAMUX1_REQ_I2C8_RX) +#define DMAMAP_DMA2_I2C8_TX DMAMAP_MAP(DMA2, DMAMUX1_REQ_I2C8_TX) +#define DMAMAP_DMA2_I2C9_RX DMAMAP_MAP(DMA2, DMAMUX1_REQ_I2C9_RX) +#define DMAMAP_DMA2_I2C9_TX DMAMAP_MAP(DMA2, DMAMUX1_REQ_I2C9_TX) +#define DMAMAP_DMA2_I2C10_RX DMAMAP_MAP(DMA2, DMAMUX1_REQ_I2C10_RX) +#define DMAMAP_DMA2_I2C10_TX DMAMAP_MAP(DMA2, DMAMUX1_REQ_I2C10_TX) + +#define DMAMAP_DMA2_USART1_RX DMAMAP_MAP(DMA2, DMAMUX1_REQ_USART1_RX) +#define DMAMAP_DMA2_USART1_TX DMAMAP_MAP(DMA2, DMAMUX1_REQ_USART1_TX) +#define DMAMAP_DMA2_USART2_RX DMAMAP_MAP(DMA2, DMAMUX1_REQ_USART2_RX) +#define DMAMAP_DMA2_USART2_TX DMAMAP_MAP(DMA2, DMAMUX1_REQ_USART2_TX) +#define DMAMAP_DMA2_USART3_RX DMAMAP_MAP(DMA2, DMAMUX1_REQ_USART3_RX) +#define DMAMAP_DMA2_USART3_TX DMAMAP_MAP(DMA2, DMAMUX1_REQ_USART3_TX) +#define DMAMAP_DMA2_USART4_RX DMAMAP_MAP(DMA2, DMAMUX1_REQ_USART4_RX) +#define DMAMAP_DMA2_USART4_TX DMAMAP_MAP(DMA2, DMAMUX1_REQ_USART4_TX) +#define DMAMAP_DMA2_USART5_RX DMAMAP_MAP(DMA2, DMAMUX1_REQ_USART5_RX) +#define DMAMAP_DMA2_USART5_TX DMAMAP_MAP(DMA2, DMAMUX1_REQ_USART5_TX) +#define DMAMAP_DMA2_USART6_RX DMAMAP_MAP(DMA2, DMAMUX1_REQ_USART6_RX) +#define DMAMAP_DMA2_USART6_TX DMAMAP_MAP(DMA2, DMAMUX1_REQ_USART6_TX) +#define DMAMAP_DMA2_USART7_RX DMAMAP_MAP(DMA2, DMAMUX1_REQ_USART7_RX) +#define DMAMAP_DMA2_USART7_TX DMAMAP_MAP(DMA2, DMAMUX1_REQ_USART7_TX) +#define DMAMAP_DMA2_USART8_RX DMAMAP_MAP(DMA2, DMAMUX1_REQ_USART8_RX) +#define DMAMAP_DMA2_USART8_TX DMAMAP_MAP(DMA2, DMAMUX1_REQ_USART8_TX) + +#define DMAMAP_DMA2_UART9_RX DMAMAP_MAP(DMA2, DMAMUX1_REQ_UART9_RX) +#define DMAMAP_DMA2_UART9_TX DMAMAP_MAP(DMA2, DMAMUX1_REQ_UART9_TX) +#define DMAMAP_DMA2_UART10_RX DMAMAP_MAP(DMA2, DMAMUX1_REQ_UART10_RX) +#define DMAMAP_DMA2_UART10_TX DMAMAP_MAP(DMA2, DMAMUX1_REQ_UART10_TX) +#define DMAMAP_DMA2_UART11_RX DMAMAP_MAP(DMA2, DMAMUX1_REQ_UART11_RX) +#define DMAMAP_DMA2_UART11_TX DMAMAP_MAP(DMA2, DMAMUX1_REQ_UART11_TX) +#define DMAMAP_DMA2_UART12_RX DMAMAP_MAP(DMA2, DMAMUX1_REQ_UART12_RX) +#define DMAMAP_DMA2_UART12_TX DMAMAP_MAP(DMA2, DMAMUX1_REQ_UART12_TX) +#define DMAMAP_DMA2_UART13_RX DMAMAP_MAP(DMA2, DMAMUX1_REQ_UART13_RX) +#define DMAMAP_DMA2_UART13_TX DMAMAP_MAP(DMA2, DMAMUX1_REQ_UART13_TX) +#define DMAMAP_DMA2_UART14_RX DMAMAP_MAP(DMA2, DMAMUX1_REQ_UART14_RX) +#define DMAMAP_DMA2_UART14_TX DMAMAP_MAP(DMA2, DMAMUX1_REQ_UART14_TX) +#define DMAMAP_DMA2_UART15_RX DMAMAP_MAP(DMA2, DMAMUX1_REQ_UART15_RX) +#define DMAMAP_DMA2_UART15_TX DMAMAP_MAP(DMA2, DMAMUX1_REQ_UART15_TX) + +#define DMAMAP_DMA2_SPI1_RX DMAMAP_MAP(DMA2, DMAMUX1_REQ_SPI1_RX) +#define DMAMAP_DMA2_SPI1_TX DMAMAP_MAP(DMA2, DMAMUX1_REQ_SPI1_TX) +#define DMAMAP_DMA2_SPI2_RX DMAMAP_MAP(DMA2, DMAMUX1_REQ_SPI2_RX) +#define DMAMAP_DMA2_SPI2_TX DMAMAP_MAP(DMA2, DMAMUX1_REQ_SPI2_TX) +#define DMAMAP_DMA2_SPI3_RX DMAMAP_MAP(DMA2, DMAMUX1_REQ_SPI3_RX) +#define DMAMAP_DMA2_SPI3_TX DMAMAP_MAP(DMA2, DMAMUX1_REQ_SPI3_TX) +#define DMAMAP_DMA2_SPI4_RX DMAMAP_MAP(DMA2, DMAMUX1_REQ_SPI4_RX) +#define DMAMAP_DMA2_SPI4_TX DMAMAP_MAP(DMA2, DMAMUX1_REQ_SPI4_TX) +#define DMAMAP_DMA2_SPI5_RX DMAMAP_MAP(DMA2, DMAMUX1_REQ_SPI5_RX) +#define DMAMAP_DMA2_SPI5_TX DMAMAP_MAP(DMA2, DMAMUX1_REQ_SPI5_TX) +#define DMAMAP_DMA2_SPI6_RX DMAMAP_MAP(DMA2, DMAMUX1_REQ_SPI6_RX) +#define DMAMAP_DMA2_SPI6_TX DMAMAP_MAP(DMA2, DMAMUX1_REQ_SPI6_TX) +#define DMAMAP_DMA2_SPI7_RX DMAMAP_MAP(DMA2, DMAMUX1_REQ_SPI7_RX) +#define DMAMAP_DMA2_SPI7_TX DMAMAP_MAP(DMA2, DMAMUX1_REQ_SPI7_TX) + +#define DMAMAP_DMA2_I2S1_RX DMAMAP_MAP(DMA2, DMAMUX1_REQ_I2S1_RX) +#define DMAMAP_DMA2_I2S1_TX DMAMAP_MAP(DMA2, DMAMUX1_REQ_I2S1_TX) +#define DMAMAP_DMA2_I2S2_RX DMAMAP_MAP(DMA2, DMAMUX1_REQ_I2S2_RX) +#define DMAMAP_DMA2_I2S2_TX DMAMAP_MAP(DMA2, DMAMUX1_REQ_I2S2_TX) +#define DMAMAP_DMA2_I2S3_RX DMAMAP_MAP(DMA2, DMAMUX1_REQ_I2S3_RX) +#define DMAMAP_DMA2_I2S3_TX DMAMAP_MAP(DMA2, DMAMUX1_REQ_I2S3_TX) +#define DMAMAP_DMA2_I2S4_RX DMAMAP_MAP(DMA2, DMAMUX1_REQ_I2S4_RX) +#define DMAMAP_DMA2_I2S4_TX DMAMAP_MAP(DMA2, DMAMUX1_REQ_I2S4_TX) + +#define DMAMAP_DMA2_LPUART1_RX DMAMAP_MAP(DMA2, DMAMUX1_REQ_LPUART1_RX) +#define DMAMAP_DMA2_LPUART1_TX DMAMAP_MAP(DMA2, DMAMUX1_REQ_LPUART1_TX) +#define DMAMAP_DMA2_LPUART2_RX DMAMAP_MAP(DMA2, DMAMUX1_REQ_LPUART2_RX) +#define DMAMAP_DMA2_LPUART2_TX DMAMAP_MAP(DMA2, DMAMUX1_REQ_LPUART2_TX) + +#define DMAMAP_DMA2_DSMU0 DMAMAP_MAP(DMA2, DMAMUX1_REQ_DSMU0) +#define DMAMAP_DMA2_DSMU1 DMAMAP_MAP(DMA2, DMAMUX1_REQ_DSMU1) +#define DMAMAP_DMA2_DSMU2 DMAMAP_MAP(DMA2, DMAMUX1_REQ_DSMU2) +#define DMAMAP_DMA2_DSMU3 DMAMAP_MAP(DMA2, DMAMUX1_REQ_DSMU3) + +#define DMAMAP_DMA2_FDCAN1 DMAMAP_MAP(DMA2, DMAMUX1_REQ_FDCAN1) +#define DMAMAP_DMA2_FDCAN2 DMAMAP_MAP(DMA2, DMAMUX1_REQ_FDCAN2) +#define DMAMAP_DMA2_FDCAN3 DMAMAP_MAP(DMA2, DMAMUX1_REQ_FDCAN3) +#define DMAMAP_DMA2_FDCAN4 DMAMAP_MAP(DMA2, DMAMUX1_REQ_FDCAN4) +#define DMAMAP_DMA2_FDCAN5 DMAMAP_MAP(DMA2, DMAMUX1_REQ_FDCAN5) +#define DMAMAP_DMA2_FDCAN6 DMAMAP_MAP(DMA2, DMAMUX1_REQ_FDCAN6) +#define DMAMAP_DMA2_FDCAN7 DMAMAP_MAP(DMA2, DMAMUX1_REQ_FDCAN7) +#define DMAMAP_DMA2_FDCAN8 DMAMAP_MAP(DMA2, DMAMUX1_REQ_FDCAN8) + +#define DMAMAP_DMA2_CORDIC_RD DMAMAP_MAP(DMA2, DMAMUX1_REQ_CORDIC_RD) +#define DMAMAP_DMA2_CORDIC_WR DMAMAP_MAP(DMA2, DMAMUX1_REQ_CORDIC_WR) + +#define DMAMAP_DMA2_FMAU_RD DMAMAP_MAP(DMA2, DMAMUX1_REQ_FMAU_RD) +#define DMAMAP_DMA2_FMAU_WR DMAMAP_MAP(DMA2, DMAMUX1_REQ_FMAU_WR) + +#define DMAMAP_DMA2_BTIM1 DMAMAP_MAP(DMA2, DMAMUX1_REQ_BTIM1) +#define DMAMAP_DMA2_BTIM2 DMAMAP_MAP(DMA2, DMAMUX1_REQ_BTIM2) +#define DMAMAP_DMA2_BTIM3 DMAMAP_MAP(DMA2, DMAMUX1_REQ_BTIM3) +#define DMAMAP_DMA2_BTIM4 DMAMAP_MAP(DMA2, DMAMUX1_REQ_BTIM4) + +#define DMAMAP_DMA2_GTIMB1_COM DMAMAP_MAP(DMA2, DMAMUX1_REQ_GTIMB1_COM) +#define DMAMAP_DMA2_GTIMB2_COM DMAMAP_MAP(DMA2, DMAMUX1_REQ_GTIMB2_COM) +#define DMAMAP_DMA2_GTIMB3_COM DMAMAP_MAP(DMA2, DMAMUX1_REQ_GTIMB3_COM) + +#define DMAMAP_DMA2_DAC12_0 DMAMAP_MAP(DMA2, DMAMUX1_REQ_DAC12_0) +#define DMAMAP_DMA2_DAC12_1 DMAMAP_MAP(DMA2, DMAMUX1_REQ_DAC12_1) +#define DMAMAP_DMA2_DAC34_0 DMAMAP_MAP(DMA2, DMAMUX1_REQ_DAC34_0) +#define DMAMAP_DMA2_DAC34_1 DMAMAP_MAP(DMA2, DMAMUX1_REQ_DAC34_1) +#define DMAMAP_DMA2_DAC56_0 DMAMAP_MAP(DMA2, DMAMUX1_REQ_DAC56_0) +#define DMAMAP_DMA2_DAC56_1 DMAMAP_MAP(DMA2, DMAMUX1_REQ_DAC56_1) + +/* DMA3 Mappings */ +#define DMAMAP_DMA3_GEN0 DMAMAP_MAP(DMA3, DMAMUX1_REQ_GEN0) +#define DMAMAP_DMA3_GEN1 DMAMAP_MAP(DMA3, DMAMUX1_REQ_GEN1) +#define DMAMAP_DMA3_GEN2 DMAMAP_MAP(DMA3, DMAMUX1_REQ_GEN2) +#define DMAMAP_DMA3_GEN3 DMAMAP_MAP(DMA3, DMAMUX1_REQ_GEN3) +#define DMAMAP_DMA3_GEN4 DMAMAP_MAP(DMA3, DMAMUX1_REQ_GEN4) +#define DMAMAP_DMA3_GEN5 DMAMAP_MAP(DMA3, DMAMUX1_REQ_GEN5) +#define DMAMAP_DMA3_GEN6 DMAMAP_MAP(DMA3, DMAMUX1_REQ_GEN6) +#define DMAMAP_DMA3_GEN7 DMAMAP_MAP(DMA3, DMAMUX1_REQ_GEN7) + +#define DMAMAP_DMA3_ADC1 DMAMAP_MAP(DMA3, DMAMUX1_REQ_ADC1) +#define DMAMAP_DMA3_ADC2 DMAMAP_MAP(DMA3, DMAMUX1_REQ_ADC2) +#define DMAMAP_DMA3_ADC3 DMAMAP_MAP(DMA3, DMAMUX1_REQ_ADC3) + +#define DMAMAP_DMA3_SHRTIM1_DMA0 DMAMAP_MAP(DMA3, DMAMUX1_REQ_SHRTIM1_DMA0) +#define DMAMAP_DMA3_SHRTIM1_DMA1 DMAMAP_MAP(DMA3, DMAMUX1_REQ_SHRTIM1_DMA1) +#define DMAMAP_DMA3_SHRTIM1_DMA2 DMAMAP_MAP(DMA3, DMAMUX1_REQ_SHRTIM1_DMA2) +#define DMAMAP_DMA3_SHRTIM1_DMA3 DMAMAP_MAP(DMA3, DMAMUX1_REQ_SHRTIM1_DMA3) +#define DMAMAP_DMA3_SHRTIM1_DMA4 DMAMAP_MAP(DMA3, DMAMUX1_REQ_SHRTIM1_DMA4) +#define DMAMAP_DMA3_SHRTIM1_DMA5 DMAMAP_MAP(DMA3, DMAMUX1_REQ_SHRTIM1_DMA5) +#define DMAMAP_DMA3_SHRTIM1_DMA6 DMAMAP_MAP(DMA3, DMAMUX1_REQ_SHRTIM1_DMA6) + +#define DMAMAP_DMA3_SHRTIM2_DMA0 DMAMAP_MAP(DMA3, DMAMUX1_REQ_SHRTIM2_DMA0) +#define DMAMAP_DMA3_SHRTIM2_DMA1 DMAMAP_MAP(DMA3, DMAMUX1_REQ_SHRTIM2_DMA1) +#define DMAMAP_DMA3_SHRTIM2_DMA2 DMAMAP_MAP(DMA3, DMAMUX1_REQ_SHRTIM2_DMA2) +#define DMAMAP_DMA3_SHRTIM2_DMA3 DMAMAP_MAP(DMA3, DMAMUX1_REQ_SHRTIM2_DMA3) +#define DMAMAP_DMA3_SHRTIM2_DMA4 DMAMAP_MAP(DMA3, DMAMUX1_REQ_SHRTIM2_DMA4) +#define DMAMAP_DMA3_SHRTIM2_DMA5 DMAMAP_MAP(DMA3, DMAMUX1_REQ_SHRTIM2_DMA5) +#define DMAMAP_DMA3_SHRTIM2_DMA6 DMAMAP_MAP(DMA3, DMAMUX1_REQ_SHRTIM2_DMA6) + +#define DMAMAP_DMA3_ATIM1_UP DMAMAP_MAP(DMA3, DMAMUX1_REQ_ATIM1_UP) +#define DMAMAP_DMA3_ATIM1_CH1 DMAMAP_MAP(DMA3, DMAMUX1_REQ_ATIM1_CH1) +#define DMAMAP_DMA3_ATIM1_CH2 DMAMAP_MAP(DMA3, DMAMUX1_REQ_ATIM1_CH2) +#define DMAMAP_DMA3_ATIM1_CH3 DMAMAP_MAP(DMA3, DMAMUX1_REQ_ATIM1_CH3) +#define DMAMAP_DMA3_ATIM1_CH4 DMAMAP_MAP(DMA3, DMAMUX1_REQ_ATIM1_CH4) +#define DMAMAP_DMA3_ATIM1_COM DMAMAP_MAP(DMA3, DMAMUX1_REQ_ATIM1_COM) +#define DMAMAP_DMA3_ATIM1_TRG DMAMAP_MAP(DMA3, DMAMUX1_REQ_ATIM1_TRG) + +#define DMAMAP_DMA3_ATIM2_UP DMAMAP_MAP(DMA3, DMAMUX1_REQ_ATIM2_UP) +#define DMAMAP_DMA3_ATIM2_CH1 DMAMAP_MAP(DMA3, DMAMUX1_REQ_ATIM2_CH1) +#define DMAMAP_DMA3_ATIM2_CH2 DMAMAP_MAP(DMA3, DMAMUX1_REQ_ATIM2_CH2) +#define DMAMAP_DMA3_ATIM2_CH3 DMAMAP_MAP(DMA3, DMAMUX1_REQ_ATIM2_CH3) +#define DMAMAP_DMA3_ATIM2_CH4 DMAMAP_MAP(DMA3, DMAMUX1_REQ_ATIM2_CH4) +#define DMAMAP_DMA3_ATIM2_COM DMAMAP_MAP(DMA3, DMAMUX1_REQ_ATIM2_COM) +#define DMAMAP_DMA3_ATIM2_TRG DMAMAP_MAP(DMA3, DMAMUX1_REQ_ATIM2_TRG) + +#define DMAMAP_DMA3_ATIM3_UP DMAMAP_MAP(DMA3, DMAMUX1_REQ_ATIM3_UP) +#define DMAMAP_DMA3_ATIM3_CH1 DMAMAP_MAP(DMA3, DMAMUX1_REQ_ATIM3_CH1) +#define DMAMAP_DMA3_ATIM3_CH2 DMAMAP_MAP(DMA3, DMAMUX1_REQ_ATIM3_CH2) +#define DMAMAP_DMA3_ATIM3_CH3 DMAMAP_MAP(DMA3, DMAMUX1_REQ_ATIM3_CH3) +#define DMAMAP_DMA3_ATIM3_CH4 DMAMAP_MAP(DMA3, DMAMUX1_REQ_ATIM3_CH4) +#define DMAMAP_DMA3_ATIM3_COM DMAMAP_MAP(DMA3, DMAMUX1_REQ_ATIM3_COM) +#define DMAMAP_DMA3_ATIM3_TRG DMAMAP_MAP(DMA3, DMAMUX1_REQ_ATIM3_TRG) + +#define DMAMAP_DMA3_ATIM4_UP DMAMAP_MAP(DMA3, DMAMUX1_REQ_ATIM4_UP) +#define DMAMAP_DMA3_ATIM4_CH1 DMAMAP_MAP(DMA3, DMAMUX1_REQ_ATIM4_CH1) +#define DMAMAP_DMA3_ATIM4_CH2 DMAMAP_MAP(DMA3, DMAMUX1_REQ_ATIM4_CH2) +#define DMAMAP_DMA3_ATIM4_CH3 DMAMAP_MAP(DMA3, DMAMUX1_REQ_ATIM4_CH3) +#define DMAMAP_DMA3_ATIM4_CH4 DMAMAP_MAP(DMA3, DMAMUX1_REQ_ATIM4_CH4) +#define DMAMAP_DMA3_ATIM4_COM DMAMAP_MAP(DMA3, DMAMUX1_REQ_ATIM4_COM) +#define DMAMAP_DMA3_ATIM4_TRG DMAMAP_MAP(DMA3, DMAMUX1_REQ_ATIM4_TRG) + +#define DMAMAP_DMA3_GTIMA1_CH1 DMAMAP_MAP(DMA3, DMAMUX1_REQ_GTIMA1_CH1) +#define DMAMAP_DMA3_GTIMA1_CH2 DMAMAP_MAP(DMA3, DMAMUX1_REQ_GTIMA1_CH2) +#define DMAMAP_DMA3_GTIMA1_CH3 DMAMAP_MAP(DMA3, DMAMUX1_REQ_GTIMA1_CH3) +#define DMAMAP_DMA3_GTIMA1_CH4 DMAMAP_MAP(DMA3, DMAMUX1_REQ_GTIMA1_CH4) +#define DMAMAP_DMA3_GTIMA1_TRG DMAMAP_MAP(DMA3, DMAMUX1_REQ_GTIMA1_TRG) +#define DMAMAP_DMA3_GTIMA1_UP DMAMAP_MAP(DMA3, DMAMUX1_REQ_GTIMA1_UP) + +#define DMAMAP_DMA3_GTIMA2_CH1 DMAMAP_MAP(DMA3, DMAMUX1_REQ_GTIMA2_CH1) +#define DMAMAP_DMA3_GTIMA2_CH2 DMAMAP_MAP(DMA3, DMAMUX1_REQ_GTIMA2_CH2) +#define DMAMAP_DMA3_GTIMA2_CH3 DMAMAP_MAP(DMA3, DMAMUX1_REQ_GTIMA2_CH3) +#define DMAMAP_DMA3_GTIMA2_CH4 DMAMAP_MAP(DMA3, DMAMUX1_REQ_GTIMA2_CH4) +#define DMAMAP_DMA3_GTIMA2_TRG DMAMAP_MAP(DMA3, DMAMUX1_REQ_GTIMA2_TRG) +#define DMAMAP_DMA3_GTIMA2_UP DMAMAP_MAP(DMA3, DMAMUX1_REQ_GTIMA2_UP) + +#define DMAMAP_DMA3_GTIMA3_CH1 DMAMAP_MAP(DMA3, DMAMUX1_REQ_GTIMA3_CH1) +#define DMAMAP_DMA3_GTIMA3_CH2 DMAMAP_MAP(DMA3, DMAMUX1_REQ_GTIMA3_CH2) +#define DMAMAP_DMA3_GTIMA3_CH3 DMAMAP_MAP(DMA3, DMAMUX1_REQ_GTIMA3_CH3) +#define DMAMAP_DMA3_GTIMA3_CH4 DMAMAP_MAP(DMA3, DMAMUX1_REQ_GTIMA3_CH4) +#define DMAMAP_DMA3_GTIMA3_TRG DMAMAP_MAP(DMA3, DMAMUX1_REQ_GTIMA3_TRG) +#define DMAMAP_DMA3_GTIMA3_UP DMAMAP_MAP(DMA3, DMAMUX1_REQ_GTIMA3_UP) + +#define DMAMAP_DMA3_GTIMA4_CH1 DMAMAP_MAP(DMA3, DMAMUX1_REQ_GTIMA4_CH1) +#define DMAMAP_DMA3_GTIMA4_CH2 DMAMAP_MAP(DMA3, DMAMUX1_REQ_GTIMA4_CH2) +#define DMAMAP_DMA3_GTIMA4_CH3 DMAMAP_MAP(DMA3, DMAMUX1_REQ_GTIMA4_CH3) +#define DMAMAP_DMA3_GTIMA4_CH4 DMAMAP_MAP(DMA3, DMAMUX1_REQ_GTIMA4_CH4) +#define DMAMAP_DMA3_GTIMA4_TRG DMAMAP_MAP(DMA3, DMAMUX1_REQ_GTIMA4_TRG) +#define DMAMAP_DMA3_GTIMA4_UP DMAMAP_MAP(DMA3, DMAMUX1_REQ_GTIMA4_UP) + +#define DMAMAP_DMA3_GTIMA5_CH1 DMAMAP_MAP(DMA3, DMAMUX1_REQ_GTIMA5_CH1) +#define DMAMAP_DMA3_GTIMA5_CH2 DMAMAP_MAP(DMA3, DMAMUX1_REQ_GTIMA5_CH2) +#define DMAMAP_DMA3_GTIMA5_CH3 DMAMAP_MAP(DMA3, DMAMUX1_REQ_GTIMA5_CH3) +#define DMAMAP_DMA3_GTIMA5_CH4 DMAMAP_MAP(DMA3, DMAMUX1_REQ_GTIMA5_CH4) +#define DMAMAP_DMA3_GTIMA5_TRG DMAMAP_MAP(DMA3, DMAMUX1_REQ_GTIMA5_TRG) +#define DMAMAP_DMA3_GTIMA5_UP DMAMAP_MAP(DMA3, DMAMUX1_REQ_GTIMA5_UP) + +#define DMAMAP_DMA3_GTIMA6_CH1 DMAMAP_MAP(DMA3, DMAMUX1_REQ_GTIMA6_CH1) +#define DMAMAP_DMA3_GTIMA6_CH2 DMAMAP_MAP(DMA3, DMAMUX1_REQ_GTIMA6_CH2) +#define DMAMAP_DMA3_GTIMA6_CH3 DMAMAP_MAP(DMA3, DMAMUX1_REQ_GTIMA6_CH3) +#define DMAMAP_DMA3_GTIMA6_CH4 DMAMAP_MAP(DMA3, DMAMUX1_REQ_GTIMA6_CH4) +#define DMAMAP_DMA3_GTIMA6_TRG DMAMAP_MAP(DMA3, DMAMUX1_REQ_GTIMA6_TRG) +#define DMAMAP_DMA3_GTIMA6_UP DMAMAP_MAP(DMA3, DMAMUX1_REQ_GTIMA6_UP) + +#define DMAMAP_DMA3_GTIMA7_CH1 DMAMAP_MAP(DMA3, DMAMUX1_REQ_GTIMA7_CH1) +#define DMAMAP_DMA3_GTIMA7_CH2 DMAMAP_MAP(DMA3, DMAMUX1_REQ_GTIMA7_CH2) +#define DMAMAP_DMA3_GTIMA7_CH3 DMAMAP_MAP(DMA3, DMAMUX1_REQ_GTIMA7_CH3) +#define DMAMAP_DMA3_GTIMA7_CH4 DMAMAP_MAP(DMA3, DMAMUX1_REQ_GTIMA7_CH4) +#define DMAMAP_DMA3_GTIMA7_TRG DMAMAP_MAP(DMA3, DMAMUX1_REQ_GTIMA7_TRG) +#define DMAMAP_DMA3_GTIMA7_UP DMAMAP_MAP(DMA3, DMAMUX1_REQ_GTIMA7_UP) + +#define DMAMAP_DMA3_GTIMB1_CH1 DMAMAP_MAP(DMA3, DMAMUX1_REQ_GTIMB1_CH1) +#define DMAMAP_DMA3_GTIMB1_CH2 DMAMAP_MAP(DMA3, DMAMUX1_REQ_GTIMB1_CH2) +#define DMAMAP_DMA3_GTIMB1_CH3 DMAMAP_MAP(DMA3, DMAMUX1_REQ_GTIMB1_CH3) +#define DMAMAP_DMA3_GTIMB1_CH4 DMAMAP_MAP(DMA3, DMAMUX1_REQ_GTIMB1_CH4) +#define DMAMAP_DMA3_GTIMB1_TRG DMAMAP_MAP(DMA3, DMAMUX1_REQ_GTIMB1_TRG) +#define DMAMAP_DMA3_GTIMB1_UP DMAMAP_MAP(DMA3, DMAMUX1_REQ_GTIMB1_UP) + +#define DMAMAP_DMA3_GTIMB2_CH1 DMAMAP_MAP(DMA3, DMAMUX1_REQ_GTIMB2_CH1) +#define DMAMAP_DMA3_GTIMB2_CH2 DMAMAP_MAP(DMA3, DMAMUX1_REQ_GTIMB2_CH2) +#define DMAMAP_DMA3_GTIMB2_CH3 DMAMAP_MAP(DMA3, DMAMUX1_REQ_GTIMB2_CH3) +#define DMAMAP_DMA3_GTIMB2_CH4 DMAMAP_MAP(DMA3, DMAMUX1_REQ_GTIMB2_CH4) +#define DMAMAP_DMA3_GTIMB2_TRG DMAMAP_MAP(DMA3, DMAMUX1_REQ_GTIMB2_TRG) +#define DMAMAP_DMA3_GTIMB2_UP DMAMAP_MAP(DMA3, DMAMUX1_REQ_GTIMB2_UP) + +#define DMAMAP_DMA3_GTIMB3_CH1 DMAMAP_MAP(DMA3, DMAMUX1_REQ_GTIMB3_CH1) +#define DMAMAP_DMA3_GTIMB3_CH2 DMAMAP_MAP(DMA3, DMAMUX1_REQ_GTIMB3_CH2) +#define DMAMAP_DMA3_GTIMB3_CH3 DMAMAP_MAP(DMA3, DMAMUX1_REQ_GTIMB3_CH3) +#define DMAMAP_DMA3_GTIMB3_CH4 DMAMAP_MAP(DMA3, DMAMUX1_REQ_GTIMB3_CH4) +#define DMAMAP_DMA3_GTIMB3_TRG DMAMAP_MAP(DMA3, DMAMUX1_REQ_GTIMB3_TRG) +#define DMAMAP_DMA3_GTIMB3_UP DMAMAP_MAP(DMA3, DMAMUX1_REQ_GTIMB3_UP) + +#define DMAMAP_DMA3_I2C1_RX DMAMAP_MAP(DMA3, DMAMUX1_REQ_I2C1_RX) +#define DMAMAP_DMA3_I2C1_TX DMAMAP_MAP(DMA3, DMAMUX1_REQ_I2C1_TX) +#define DMAMAP_DMA3_I2C2_RX DMAMAP_MAP(DMA3, DMAMUX1_REQ_I2C2_RX) +#define DMAMAP_DMA3_I2C2_TX DMAMAP_MAP(DMA3, DMAMUX1_REQ_I2C2_TX) +#define DMAMAP_DMA3_I2C3_RX DMAMAP_MAP(DMA3, DMAMUX1_REQ_I2C3_RX) +#define DMAMAP_DMA3_I2C3_TX DMAMAP_MAP(DMA3, DMAMUX1_REQ_I2C3_TX) +#define DMAMAP_DMA3_I2C4_RX DMAMAP_MAP(DMA3, DMAMUX1_REQ_I2C4_RX) +#define DMAMAP_DMA3_I2C4_TX DMAMAP_MAP(DMA3, DMAMUX1_REQ_I2C4_TX) +#define DMAMAP_DMA3_I2C5_RX DMAMAP_MAP(DMA3, DMAMUX1_REQ_I2C5_RX) +#define DMAMAP_DMA3_I2C5_TX DMAMAP_MAP(DMA3, DMAMUX1_REQ_I2C5_TX) +#define DMAMAP_DMA3_I2C6_RX DMAMAP_MAP(DMA3, DMAMUX1_REQ_I2C6_RX) +#define DMAMAP_DMA3_I2C6_TX DMAMAP_MAP(DMA3, DMAMUX1_REQ_I2C6_TX) +#define DMAMAP_DMA3_I2C7_RX DMAMAP_MAP(DMA3, DMAMUX1_REQ_I2C7_RX) +#define DMAMAP_DMA3_I2C7_TX DMAMAP_MAP(DMA3, DMAMUX1_REQ_I2C7_TX) +#define DMAMAP_DMA3_I2C8_RX DMAMAP_MAP(DMA3, DMAMUX1_REQ_I2C8_RX) +#define DMAMAP_DMA3_I2C8_TX DMAMAP_MAP(DMA3, DMAMUX1_REQ_I2C8_TX) +#define DMAMAP_DMA3_I2C9_RX DMAMAP_MAP(DMA3, DMAMUX1_REQ_I2C9_RX) +#define DMAMAP_DMA3_I2C9_TX DMAMAP_MAP(DMA3, DMAMUX1_REQ_I2C9_TX) +#define DMAMAP_DMA3_I2C10_RX DMAMAP_MAP(DMA3, DMAMUX1_REQ_I2C10_RX) +#define DMAMAP_DMA3_I2C10_TX DMAMAP_MAP(DMA3, DMAMUX1_REQ_I2C10_TX) + +#define DMAMAP_DMA3_USART1_RX DMAMAP_MAP(DMA3, DMAMUX1_REQ_USART1_RX) +#define DMAMAP_DMA3_USART1_TX DMAMAP_MAP(DMA3, DMAMUX1_REQ_USART1_TX) +#define DMAMAP_DMA3_USART2_RX DMAMAP_MAP(DMA3, DMAMUX1_REQ_USART2_RX) +#define DMAMAP_DMA3_USART2_TX DMAMAP_MAP(DMA3, DMAMUX1_REQ_USART2_TX) +#define DMAMAP_DMA3_USART3_RX DMAMAP_MAP(DMA3, DMAMUX1_REQ_USART3_RX) +#define DMAMAP_DMA3_USART3_TX DMAMAP_MAP(DMA3, DMAMUX1_REQ_USART3_TX) +#define DMAMAP_DMA3_USART4_RX DMAMAP_MAP(DMA3, DMAMUX1_REQ_USART4_RX) +#define DMAMAP_DMA3_USART4_TX DMAMAP_MAP(DMA3, DMAMUX1_REQ_USART4_TX) +#define DMAMAP_DMA3_USART5_RX DMAMAP_MAP(DMA3, DMAMUX1_REQ_USART5_RX) +#define DMAMAP_DMA3_USART5_TX DMAMAP_MAP(DMA3, DMAMUX1_REQ_USART5_TX) +#define DMAMAP_DMA3_USART6_RX DMAMAP_MAP(DMA3, DMAMUX1_REQ_USART6_RX) +#define DMAMAP_DMA3_USART6_TX DMAMAP_MAP(DMA3, DMAMUX1_REQ_USART6_TX) +#define DMAMAP_DMA3_USART7_RX DMAMAP_MAP(DMA3, DMAMUX1_REQ_USART7_RX) +#define DMAMAP_DMA3_USART7_TX DMAMAP_MAP(DMA3, DMAMUX1_REQ_USART7_TX) +#define DMAMAP_DMA3_USART8_RX DMAMAP_MAP(DMA3, DMAMUX1_REQ_USART8_RX) +#define DMAMAP_DMA3_USART8_TX DMAMAP_MAP(DMA3, DMAMUX1_REQ_USART8_TX) + +#define DMAMAP_DMA3_UART9_RX DMAMAP_MAP(DMA3, DMAMUX1_REQ_UART9_RX) +#define DMAMAP_DMA3_UART9_TX DMAMAP_MAP(DMA3, DMAMUX1_REQ_UART9_TX) +#define DMAMAP_DMA3_UART10_RX DMAMAP_MAP(DMA3, DMAMUX1_REQ_UART10_RX) +#define DMAMAP_DMA3_UART10_TX DMAMAP_MAP(DMA3, DMAMUX1_REQ_UART10_TX) +#define DMAMAP_DMA3_UART11_RX DMAMAP_MAP(DMA3, DMAMUX1_REQ_UART11_RX) +#define DMAMAP_DMA3_UART11_TX DMAMAP_MAP(DMA3, DMAMUX1_REQ_UART11_TX) +#define DMAMAP_DMA3_UART12_RX DMAMAP_MAP(DMA3, DMAMUX1_REQ_UART12_RX) +#define DMAMAP_DMA3_UART12_TX DMAMAP_MAP(DMA3, DMAMUX1_REQ_UART12_TX) +#define DMAMAP_DMA3_UART13_RX DMAMAP_MAP(DMA3, DMAMUX1_REQ_UART13_RX) +#define DMAMAP_DMA3_UART13_TX DMAMAP_MAP(DMA3, DMAMUX1_REQ_UART13_TX) +#define DMAMAP_DMA3_UART14_RX DMAMAP_MAP(DMA3, DMAMUX1_REQ_UART14_RX) +#define DMAMAP_DMA3_UART14_TX DMAMAP_MAP(DMA3, DMAMUX1_REQ_UART14_TX) +#define DMAMAP_DMA3_UART15_RX DMAMAP_MAP(DMA3, DMAMUX1_REQ_UART15_RX) +#define DMAMAP_DMA3_UART15_TX DMAMAP_MAP(DMA3, DMAMUX1_REQ_UART15_TX) + +#define DMAMAP_DMA3_SPI1_RX DMAMAP_MAP(DMA3, DMAMUX1_REQ_SPI1_RX) +#define DMAMAP_DMA3_SPI1_TX DMAMAP_MAP(DMA3, DMAMUX1_REQ_SPI1_TX) +#define DMAMAP_DMA3_SPI2_RX DMAMAP_MAP(DMA3, DMAMUX1_REQ_SPI2_RX) +#define DMAMAP_DMA3_SPI2_TX DMAMAP_MAP(DMA3, DMAMUX1_REQ_SPI2_TX) +#define DMAMAP_DMA3_SPI3_RX DMAMAP_MAP(DMA3, DMAMUX1_REQ_SPI3_RX) +#define DMAMAP_DMA3_SPI3_TX DMAMAP_MAP(DMA3, DMAMUX1_REQ_SPI3_TX) +#define DMAMAP_DMA3_SPI4_RX DMAMAP_MAP(DMA3, DMAMUX1_REQ_SPI4_RX) +#define DMAMAP_DMA3_SPI4_TX DMAMAP_MAP(DMA3, DMAMUX1_REQ_SPI4_TX) +#define DMAMAP_DMA3_SPI5_RX DMAMAP_MAP(DMA3, DMAMUX1_REQ_SPI5_RX) +#define DMAMAP_DMA3_SPI5_TX DMAMAP_MAP(DMA3, DMAMUX1_REQ_SPI5_TX) +#define DMAMAP_DMA3_SPI6_RX DMAMAP_MAP(DMA3, DMAMUX1_REQ_SPI6_RX) +#define DMAMAP_DMA3_SPI6_TX DMAMAP_MAP(DMA3, DMAMUX1_REQ_SPI6_TX) +#define DMAMAP_DMA3_SPI7_RX DMAMAP_MAP(DMA3, DMAMUX1_REQ_SPI7_RX) +#define DMAMAP_DMA3_SPI7_TX DMAMAP_MAP(DMA3, DMAMUX1_REQ_SPI7_TX) + +#define DMAMAP_DMA3_I2S1_RX DMAMAP_MAP(DMA3, DMAMUX1_REQ_I2S1_RX) +#define DMAMAP_DMA3_I2S1_TX DMAMAP_MAP(DMA3, DMAMUX1_REQ_I2S1_TX) +#define DMAMAP_DMA3_I2S2_RX DMAMAP_MAP(DMA3, DMAMUX1_REQ_I2S2_RX) +#define DMAMAP_DMA3_I2S2_TX DMAMAP_MAP(DMA3, DMAMUX1_REQ_I2S2_TX) +#define DMAMAP_DMA3_I2S3_RX DMAMAP_MAP(DMA3, DMAMUX1_REQ_I2S3_RX) +#define DMAMAP_DMA3_I2S3_TX DMAMAP_MAP(DMA3, DMAMUX1_REQ_I2S3_TX) +#define DMAMAP_DMA3_I2S4_RX DMAMAP_MAP(DMA3, DMAMUX1_REQ_I2S4_RX) +#define DMAMAP_DMA3_I2S4_TX DMAMAP_MAP(DMA3, DMAMUX1_REQ_I2S4_TX) + +#define DMAMAP_DMA3_LPUART1_RX DMAMAP_MAP(DMA3, DMAMUX1_REQ_LPUART1_RX) +#define DMAMAP_DMA3_LPUART1_TX DMAMAP_MAP(DMA3, DMAMUX1_REQ_LPUART1_TX) +#define DMAMAP_DMA3_LPUART2_RX DMAMAP_MAP(DMA3, DMAMUX1_REQ_LPUART2_RX) +#define DMAMAP_DMA3_LPUART2_TX DMAMAP_MAP(DMA3, DMAMUX1_REQ_LPUART2_TX) + +#define DMAMAP_DMA3_DSMU0 DMAMAP_MAP(DMA3, DMAMUX1_REQ_DSMU0) +#define DMAMAP_DMA3_DSMU1 DMAMAP_MAP(DMA3, DMAMUX1_REQ_DSMU1) +#define DMAMAP_DMA3_DSMU2 DMAMAP_MAP(DMA3, DMAMUX1_REQ_DSMU2) +#define DMAMAP_DMA3_DSMU3 DMAMAP_MAP(DMA3, DMAMUX1_REQ_DSMU3) + +#define DMAMAP_DMA3_FDCAN1 DMAMAP_MAP(DMA3, DMAMUX1_REQ_FDCAN1) +#define DMAMAP_DMA3_FDCAN2 DMAMAP_MAP(DMA3, DMAMUX1_REQ_FDCAN2) +#define DMAMAP_DMA3_FDCAN3 DMAMAP_MAP(DMA3, DMAMUX1_REQ_FDCAN3) +#define DMAMAP_DMA3_FDCAN4 DMAMAP_MAP(DMA3, DMAMUX1_REQ_FDCAN4) +#define DMAMAP_DMA3_FDCAN5 DMAMAP_MAP(DMA3, DMAMUX1_REQ_FDCAN5) +#define DMAMAP_DMA3_FDCAN6 DMAMAP_MAP(DMA3, DMAMUX1_REQ_FDCAN6) +#define DMAMAP_DMA3_FDCAN7 DMAMAP_MAP(DMA3, DMAMUX1_REQ_FDCAN7) +#define DMAMAP_DMA3_FDCAN8 DMAMAP_MAP(DMA3, DMAMUX1_REQ_FDCAN8) + +#define DMAMAP_DMA3_CORDIC_RD DMAMAP_MAP(DMA3, DMAMUX1_REQ_CORDIC_RD) +#define DMAMAP_DMA3_CORDIC_WR DMAMAP_MAP(DMA3, DMAMUX1_REQ_CORDIC_WR) + +#define DMAMAP_DMA3_FMAU_RD DMAMAP_MAP(DMA3, DMAMUX1_REQ_FMAU_RD) +#define DMAMAP_DMA3_FMAU_WR DMAMAP_MAP(DMA3, DMAMUX1_REQ_FMAU_WR) + +#define DMAMAP_DMA3_BTIM1 DMAMAP_MAP(DMA3, DMAMUX1_REQ_BTIM1) +#define DMAMAP_DMA3_BTIM2 DMAMAP_MAP(DMA3, DMAMUX1_REQ_BTIM2) +#define DMAMAP_DMA3_BTIM3 DMAMAP_MAP(DMA3, DMAMUX1_REQ_BTIM3) +#define DMAMAP_DMA3_BTIM4 DMAMAP_MAP(DMA3, DMAMUX1_REQ_BTIM4) + +#define DMAMAP_DMA3_GTIMB1_COM DMAMAP_MAP(DMA3, DMAMUX1_REQ_GTIMB1_COM) +#define DMAMAP_DMA3_GTIMB2_COM DMAMAP_MAP(DMA3, DMAMUX1_REQ_GTIMB2_COM) +#define DMAMAP_DMA3_GTIMB3_COM DMAMAP_MAP(DMA3, DMAMUX1_REQ_GTIMB3_COM) + +#define DMAMAP_DMA3_DAC12_0 DMAMAP_MAP(DMA3, DMAMUX1_REQ_DAC12_0) +#define DMAMAP_DMA3_DAC12_1 DMAMAP_MAP(DMA3, DMAMUX1_REQ_DAC12_1) +#define DMAMAP_DMA3_DAC34_0 DMAMAP_MAP(DMA3, DMAMUX1_REQ_DAC34_0) +#define DMAMAP_DMA3_DAC34_1 DMAMAP_MAP(DMA3, DMAMUX1_REQ_DAC34_1) +#define DMAMAP_DMA3_DAC56_0 DMAMAP_MAP(DMA3, DMAMUX1_REQ_DAC56_0) +#define DMAMAP_DMA3_DAC56_1 DMAMAP_MAP(DMA3, DMAMUX1_REQ_DAC56_1) + +/* ========================================================================== + * DMAMAP Definitions for DMAMUX2 + * ========================================================================== + */ + +/* DMA1 Mappings */ +#define DMAMAP_DMA1_GEN0 DMAMAP_MAP(DMA1, DMAMUX2_REQ_GEN0) +#define DMAMAP_DMA1_GEN1 DMAMAP_MAP(DMA1, DMAMUX2_REQ_GEN1) +#define DMAMAP_DMA1_GEN2 DMAMAP_MAP(DMA1, DMAMUX2_REQ_GEN2) +#define DMAMAP_DMA1_GEN3 DMAMAP_MAP(DMA1, DMAMUX2_REQ_GEN3) +#define DMAMAP_DMA1_GEN4 DMAMAP_MAP(DMA1, DMAMUX2_REQ_GEN4) +#define DMAMAP_DMA1_GEN5 DMAMAP_MAP(DMA1, DMAMUX2_REQ_GEN5) +#define DMAMAP_DMA1_GEN6 DMAMAP_MAP(DMA1, DMAMUX2_REQ_GEN6) +#define DMAMAP_DMA1_GEN7 DMAMAP_MAP(DMA1, DMAMUX2_REQ_GEN7) +#define DMAMAP_DMA1_GEN8 DMAMAP_MAP(DMA1, DMAMUX2_REQ_GEN8) +#define DMAMAP_DMA1_GEN9 DMAMAP_MAP(DMA1, DMAMUX2_REQ_GEN9) +#define DMAMAP_DMA1_GEN10 DMAMAP_MAP(DMA1, DMAMUX2_REQ_GEN10) +#define DMAMAP_DMA1_GEN11 DMAMAP_MAP(DMA1, DMAMUX2_REQ_GEN11) +#define DMAMAP_DMA1_GEN12 DMAMAP_MAP(DMA1, DMAMUX2_REQ_GEN12) +#define DMAMAP_DMA1_GEN13 DMAMAP_MAP(DMA1, DMAMUX2_REQ_GEN13) +#define DMAMAP_DMA1_GEN14 DMAMAP_MAP(DMA1, DMAMUX2_REQ_GEN14) +#define DMAMAP_DMA1_GEN15 DMAMAP_MAP(DMA1, DMAMUX2_REQ_GEN15) +#define DMAMAP_DMA1_XSPI1_TX DMAMAP_MAP(DMA1, DMAMUX2_REQ_XSPI1_TX) +#define DMAMAP_DMA1_XSPI1_RX DMAMAP_MAP(DMA1, DMAMUX2_REQ_XSPI1_RX) +#define DMAMAP_DMA1_XSPI2_TX DMAMAP_MAP(DMA1, DMAMUX2_REQ_XSPI2_TX) +#define DMAMAP_DMA1_XSPI2_RX DMAMAP_MAP(DMA1, DMAMUX2_REQ_XSPI2_RX) + +/* DMA2 Mappings */ +#define DMAMAP_DMA2_GEN0 DMAMAP_MAP(DMA2, DMAMUX2_REQ_GEN0) +#define DMAMAP_DMA2_GEN1 DMAMAP_MAP(DMA2, DMAMUX2_REQ_GEN1) +#define DMAMAP_DMA2_GEN2 DMAMAP_MAP(DMA2, DMAMUX2_REQ_GEN2) +#define DMAMAP_DMA2_GEN3 DMAMAP_MAP(DMA2, DMAMUX2_REQ_GEN3) +#define DMAMAP_DMA2_GEN4 DMAMAP_MAP(DMA2, DMAMUX2_REQ_GEN4) +#define DMAMAP_DMA2_GEN5 DMAMAP_MAP(DMA2, DMAMUX2_REQ_GEN5) +#define DMAMAP_DMA2_GEN6 DMAMAP_MAP(DMA2, DMAMUX2_REQ_GEN6) +#define DMAMAP_DMA2_GEN7 DMAMAP_MAP(DMA2, DMAMUX2_REQ_GEN7) +#define DMAMAP_DMA2_GEN8 DMAMAP_MAP(DMA2, DMAMUX2_REQ_GEN8) +#define DMAMAP_DMA2_GEN9 DMAMAP_MAP(DMA2, DMAMUX2_REQ_GEN9) +#define DMAMAP_DMA2_GEN10 DMAMAP_MAP(DMA2, DMAMUX2_REQ_GEN10) +#define DMAMAP_DMA2_GEN11 DMAMAP_MAP(DMA2, DMAMUX2_REQ_GEN11) +#define DMAMAP_DMA2_GEN12 DMAMAP_MAP(DMA2, DMAMUX2_REQ_GEN12) +#define DMAMAP_DMA2_GEN13 DMAMAP_MAP(DMA2, DMAMUX2_REQ_GEN13) +#define DMAMAP_DMA2_GEN14 DMAMAP_MAP(DMA2, DMAMUX2_REQ_GEN14) +#define DMAMAP_DMA2_GEN15 DMAMAP_MAP(DMA2, DMAMUX2_REQ_GEN15) +#define DMAMAP_DMA2_XSPI1_TX DMAMAP_MAP(DMA2, DMAMUX2_REQ_XSPI1_TX) +#define DMAMAP_DMA2_XSPI1_RX DMAMAP_MAP(DMA2, DMAMUX2_REQ_XSPI1_RX) +#define DMAMAP_DMA2_XSPI2_TX DMAMAP_MAP(DMA2, DMAMUX2_REQ_XSPI2_TX) +#define DMAMAP_DMA2_XSPI2_RX DMAMAP_MAP(DMA2, DMAMUX2_REQ_XSPI2_RX) + +/* DMA3 Mappings */ +#define DMAMAP_DMA3_2GEN0 DMAMAP_MAP(DMA3, DMAMUX2_REQ_GEN0) +#define DMAMAP_DMA3_2GEN1 DMAMAP_MAP(DMA3, DMAMUX2_REQ_GEN1) +#define DMAMAP_DMA3_2GEN2 DMAMAP_MAP(DMA3, DMAMUX2_REQ_GEN2) +#define DMAMAP_DMA3_2GEN3 DMAMAP_MAP(DMA3, DMAMUX2_REQ_GEN3) +#define DMAMAP_DMA3_2GEN4 DMAMAP_MAP(DMA3, DMAMUX2_REQ_GEN4) +#define DMAMAP_DMA3_2GEN5 DMAMAP_MAP(DMA3, DMAMUX2_REQ_GEN5) +#define DMAMAP_DMA3_2GEN6 DMAMAP_MAP(DMA3, DMAMUX2_REQ_GEN6) +#define DMAMAP_DMA3_2GEN7 DMAMAP_MAP(DMA3, DMAMUX2_REQ_GEN7) +#define DMAMAP_DMA3_2GEN8 DMAMAP_MAP(DMA3, DMAMUX2_REQ_GEN8) +#define DMAMAP_DMA3_2GEN9 DMAMAP_MAP(DMA3, DMAMUX2_REQ_GEN9) +#define DMAMAP_DMA3_2GEN10 DMAMAP_MAP(DMA3, DMAMUX2_REQ_GEN10) +#define DMAMAP_DMA3_2GEN11 DMAMAP_MAP(DMA3, DMAMUX2_REQ_GEN11) +#define DMAMAP_DMA3_2GEN12 DMAMAP_MAP(DMA3, DMAMUX2_REQ_GEN12) +#define DMAMAP_DMA3_2GEN13 DMAMAP_MAP(DMA3, DMAMUX2_REQ_GEN13) +#define DMAMAP_DMA3_2GEN14 DMAMAP_MAP(DMA3, DMAMUX2_REQ_GEN14) +#define DMAMAP_DMA3_2GEN15 DMAMAP_MAP(DMA3, DMAMUX2_REQ_GEN15) +#define DMAMAP_DMA3_XSPI1_TX DMAMAP_MAP(DMA3, DMAMUX2_REQ_XSPI1_TX) +#define DMAMAP_DMA3_XSPI1_RX DMAMAP_MAP(DMA3, DMAMUX2_REQ_XSPI1_RX) +#define DMAMAP_DMA3_XSPI2_TX DMAMAP_MAP(DMA3, DMAMUX2_REQ_XSPI2_TX) +#define DMAMAP_DMA3_XSPI2_RX DMAMAP_MAP(DMA3, DMAMUX2_REQ_XSPI2_RX) + +#endif /* __ARCH_ARM_SRC_N32H7_HARDWARE_N32H76X_DMAMUX_H */ diff --git a/arch/arm/src/n32h7/hardware/n32h76x_gpio.h b/arch/arm/src/n32h7/hardware/n32h76x_gpio.h new file mode 100644 index 0000000000000..099ab93e96efd --- /dev/null +++ b/arch/arm/src/n32h7/hardware/n32h76x_gpio.h @@ -0,0 +1,415 @@ +/**************************************************************************** + * arch/arm/src/n32h7/hardware/n32h76x_gpio.h + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************/ + +#ifndef __ARCH_ARM_SRC_N32H7_HARDWARE_N32H76X_GPIO_H +#define __ARCH_ARM_SRC_N32H7_HARDWARE_N32H76X_GPIO_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* Register Offsets *********************************************************/ + +#define N32_GPIO_MODER_OFFSET 0x0000 /* Port mode register */ +#define N32_GPIO_OTYPER_OFFSET 0x0004 /* Output type register */ +#define N32_GPIO_SR_OFFSET 0x0008 /* Output speed register */ +#define N32_GPIO_PUPD_OFFSET 0x000c /* Pull-up/pull-down register */ +#define N32_GPIO_PID_OFFSET 0x0010 /* Input data register */ +#define N32_GPIO_POD_OFFSET 0x0014 /* Output data register */ +#define N32_GPIO_PBSC_OFFSET 0x0018 /* Bit set/reset register */ +#define N32_GPIO_PLOCK_OFFSET 0x001c /* Configuration lock register */ +#define N32_GPIO_AFL_OFFSET 0x0020 /* Alternate function low register */ +#define N32_GPIO_AFH_OFFSET 0x0024 /* Alternate function high register */ +#define N32_GPIO_PBC_OFFSET 0x0028 /* Bit clear register */ +#define N32_GPIO_DS_OFFSET 0x002c /* Driver strength configuration register */ + +/* Register Addresses *******************************************************/ + +#if N32H7_NGPIO > 0 +# define N32_GPIOA_MODER (N32_GPIOA_BASE + N32_GPIO_MODER_OFFSET) +# define N32_GPIOA_OTYPER (N32_GPIOA_BASE + N32_GPIO_OTYPER_OFFSET) +# define N32_GPIOA_SR (N32_GPIOA_BASE + N32_GPIO_SR_OFFSET) +# define N32_GPIOA_PUPD (N32_GPIOA_BASE + N32_GPIO_PUPD_OFFSET) +# define N32_GPIOA_PID (N32_GPIOA_BASE + N32_GPIO_PID_OFFSET) +# define N32_GPIOA_POD (N32_GPIOA_BASE + N32_GPIO_POD_OFFSET) +# define N32_GPIOA_PBSC (N32_GPIOA_BASE + N32_GPIO_PBSC_OFFSET) +# define N32_GPIOA_PLOCK (N32_GPIOA_BASE + N32_GPIO_PLOCK_OFFSET) +# define N32_GPIOA_AFL (N32_GPIOA_BASE + N32_GPIO_AFL_OFFSET) +# define N32_GPIOA_AFH (N32_GPIOA_BASE + N32_GPIO_AFH_OFFSET) +# define N32_GPIOA_PBC (N32_GPIOA_BASE + N32_GPIO_PBC_OFFSET) +# define N32_GPIOA_DS (N32_GPIOA_BASE + N32_GPIO_DS_OFFSET) +#endif + +#if N32H7_NGPIO > 1 +# define N32_GPIOB_MODER (N32_GPIOB_BASE + N32_GPIO_MODER_OFFSET) +# define N32_GPIOB_OTYPER (N32_GPIOB_BASE + N32_GPIO_OTYPER_OFFSET) +# define N32_GPIOB_SR (N32_GPIOB_BASE + N32_GPIO_SR_OFFSET) +# define N32_GPIOB_PUPD (N32_GPIOB_BASE + N32_GPIO_PUPD_OFFSET) +# define N32_GPIOB_PID (N32_GPIOB_BASE + N32_GPIO_PID_OFFSET) +# define N32_GPIOB_POD (N32_GPIOB_BASE + N32_GPIO_POD_OFFSET) +# define N32_GPIOB_PBSC (N32_GPIOB_BASE + N32_GPIO_PBSC_OFFSET) +# define N32_GPIOB_PLOCK (N32_GPIOB_BASE + N32_GPIO_PLOCK_OFFSET) +# define N32_GPIOB_AFL (N32_GPIOB_BASE + N32_GPIO_AFL_OFFSET) +# define N32_GPIOB_AFH (N32_GPIOB_BASE + N32_GPIO_AFH_OFFSET) +# define N32_GPIOB_PBC (N32_GPIOB_BASE + N32_GPIO_PBC_OFFSET) +# define N32_GPIOB_DS (N32_GPIOB_BASE + N32_GPIO_DS_OFFSET) +#endif + +#if N32H7_NGPIO > 2 +# define N32_GPIOC_MODER (N32_GPIOC_BASE + N32_GPIO_MODER_OFFSET) +# define N32_GPIOC_OTYPER (N32_GPIOC_BASE + N32_GPIO_OTYPER_OFFSET) +# define N32_GPIOC_SR (N32_GPIOC_BASE + N32_GPIO_SR_OFFSET) +# define N32_GPIOC_PUPD (N32_GPIOC_BASE + N32_GPIO_PUPD_OFFSET) +# define N32_GPIOC_PID (N32_GPIOC_BASE + N32_GPIO_PID_OFFSET) +# define N32_GPIOC_POD (N32_GPIOC_BASE + N32_GPIO_POD_OFFSET) +# define N32_GPIOC_PBSC (N32_GPIOC_BASE + N32_GPIO_PBSC_OFFSET) +# define N32_GPIOC_PLOCK (N32_GPIOC_BASE + N32_GPIO_PLOCK_OFFSET) +# define N32_GPIOC_AFL (N32_GPIOC_BASE + N32_GPIO_AFL_OFFSET) +# define N32_GPIOC_AFH (N32_GPIOC_BASE + N32_GPIO_AFH_OFFSET) +# define N32_GPIOC_PBC (N32_GPIOC_BASE + N32_GPIO_PBC_OFFSET) +# define N32_GPIOC_DS (N32_GPIOC_BASE + N32_GPIO_DS_OFFSET) +#endif + +#if N32H7_NGPIO > 3 +# define N32_GPIOD_MODER (N32_GPIOD_BASE + N32_GPIO_MODER_OFFSET) +# define N32_GPIOD_OTYPER (N32_GPIOD_BASE + N32_GPIO_OTYPER_OFFSET) +# define N32_GPIOD_SR (N32_GPIOD_BASE + N32_GPIO_SR_OFFSET) +# define N32_GPIOD_PUPD (N32_GPIOD_BASE + N32_GPIO_PUPD_OFFSET) +# define N32_GPIOD_PID (N32_GPIOD_BASE + N32_GPIO_PID_OFFSET) +# define N32_GPIOD_POD (N32_GPIOD_BASE + N32_GPIO_POD_OFFSET) +# define N32_GPIOD_PBSC (N32_GPIOD_BASE + N32_GPIO_PBSC_OFFSET) +# define N32_GPIOD_PLOCK (N32_GPIOD_BASE + N32_GPIO_PLOCK_OFFSET) +# define N32_GPIOD_AFL (N32_GPIOD_BASE + N32_GPIO_AFL_OFFSET) +# define N32_GPIOD_AFH (N32_GPIOD_BASE + N32_GPIO_AFH_OFFSET) +# define N32_GPIOD_PBC (N32_GPIOD_BASE + N32_GPIO_PBC_OFFSET) +# define N32_GPIOD_DS (N32_GPIOD_BASE + N32_GPIO_DS_OFFSET) +#endif + +#if N32H7_NGPIO > 4 +# define N32_GPIOE_MODER (N32_GPIOE_BASE + N32_GPIO_MODER_OFFSET) +# define N32_GPIOE_OTYPER (N32_GPIOE_BASE + N32_GPIO_OTYPER_OFFSET) +# define N32_GPIOE_SR (N32_GPIOE_BASE + N32_GPIO_SR_OFFSET) +# define N32_GPIOE_PUPD (N32_GPIOE_BASE + N32_GPIO_PUPD_OFFSET) +# define N32_GPIOE_PID (N32_GPIOE_BASE + N32_GPIO_PID_OFFSET) +# define N32_GPIOE_POD (N32_GPIOE_BASE + N32_GPIO_POD_OFFSET) +# define N32_GPIOE_PBSC (N32_GPIOE_BASE + N32_GPIO_PBSC_OFFSET) +# define N32_GPIOE_PLOCK (N32_GPIOE_BASE + N32_GPIO_PLOCK_OFFSET) +# define N32_GPIOE_AFL (N32_GPIOE_BASE + N32_GPIO_AFL_OFFSET) +# define N32_GPIOE_AFH (N32_GPIOE_BASE + N32_GPIO_AFH_OFFSET) +# define N32_GPIOE_PBC (N32_GPIOE_BASE + N32_GPIO_PBC_OFFSET) +# define N32_GPIOE_DS (N32_GPIOE_BASE + N32_GPIO_DS_OFFSET) +#endif + +#if N32H7_NGPIO > 5 +# define N32_GPIOF_MODER (N32_GPIOF_BASE + N32_GPIO_MODER_OFFSET) +# define N32_GPIOF_OTYPER (N32_GPIOF_BASE + N32_GPIO_OTYPER_OFFSET) +# define N32_GPIOF_SR (N32_GPIOF_BASE + N32_GPIO_SR_OFFSET) +# define N32_GPIOF_PUPD (N32_GPIOF_BASE + N32_GPIO_PUPD_OFFSET) +# define N32_GPIOF_PID (N32_GPIOF_BASE + N32_GPIO_PID_OFFSET) +# define N32_GPIOF_POD (N32_GPIOF_BASE + N32_GPIO_POD_OFFSET) +# define N32_GPIOF_PBSC (N32_GPIOF_BASE + N32_GPIO_PBSC_OFFSET) +# define N32_GPIOF_PLOCK (N32_GPIOF_BASE + N32_GPIO_PLOCK_OFFSET) +# define N32_GPIOF_AFL (N32_GPIOF_BASE + N32_GPIO_AFL_OFFSET) +# define N32_GPIOF_AFH (N32_GPIOF_BASE + N32_GPIO_AFH_OFFSET) +# define N32_GPIOF_PBC (N32_GPIOF_BASE + N32_GPIO_PBC_OFFSET) +# define N32_GPIOF_DS (N32_GPIOF_BASE + N32_GPIO_DS_OFFSET) +#endif + +#if N32H7_NGPIO > 6 +# define N32_GPIOG_MODER (N32_GPIOG_BASE + N32_GPIO_MODER_OFFSET) +# define N32_GPIOG_OTYPER (N32_GPIOG_BASE + N32_GPIO_OTYPER_OFFSET) +# define N32_GPIOG_SR (N32_GPIOG_BASE + N32_GPIO_SR_OFFSET) +# define N32_GPIOG_PUPD (N32_GPIOG_BASE + N32_GPIO_PUPD_OFFSET) +# define N32_GPIOG_PID (N32_GPIOG_BASE + N32_GPIO_PID_OFFSET) +# define N32_GPIOG_POD (N32_GPIOG_BASE + N32_GPIO_POD_OFFSET) +# define N32_GPIOG_PBSC (N32_GPIOG_BASE + N32_GPIO_PBSC_OFFSET) +# define N32_GPIOG_PLOCK (N32_GPIOG_BASE + N32_GPIO_PLOCK_OFFSET) +# define N32_GPIOG_AFL (N32_GPIOG_BASE + N32_GPIO_AFL_OFFSET) +# define N32_GPIOG_AFH (N32_GPIOG_BASE + N32_GPIO_AFH_OFFSET) +# define N32_GPIOG_PBC (N32_GPIOG_BASE + N32_GPIO_PBC_OFFSET) +# define N32_GPIOG_DS (N32_GPIOG_BASE + N32_GPIO_DS_OFFSET) +#endif + +#if N32H7_NGPIO > 7 +# define N32_GPIOH_MODER (N32_GPIOH_BASE + N32_GPIO_MODER_OFFSET) +# define N32_GPIOH_OTYPER (N32_GPIOH_BASE + N32_GPIO_OTYPER_OFFSET) +# define N32_GPIOH_SR (N32_GPIOH_BASE + N32_GPIO_SR_OFFSET) +# define N32_GPIOH_PUPD (N32_GPIOH_BASE + N32_GPIO_PUPD_OFFSET) +# define N32_GPIOH_PID (N32_GPIOH_BASE + N32_GPIO_PID_OFFSET) +# define N32_GPIOH_POD (N32_GPIOH_BASE + N32_GPIO_POD_OFFSET) +# define N32_GPIOH_PBSC (N32_GPIOH_BASE + N32_GPIO_PBSC_OFFSET) +# define N32_GPIOH_PLOCK (N32_GPIOH_BASE + N32_GPIO_PLOCK_OFFSET) +# define N32_GPIOH_AFL (N32_GPIOH_BASE + N32_GPIO_AFL_OFFSET) +# define N32_GPIOH_AFH (N32_GPIOH_BASE + N32_GPIO_AFH_OFFSET) +# define N32_GPIOH_PBC (N32_GPIOH_BASE + N32_GPIO_PBC_OFFSET) +# define N32_GPIOH_DS (N32_GPIOH_BASE + N32_GPIO_DS_OFFSET) +#endif + +#if N32H7_NGPIO > 8 +# define N32_GPIOI_MODER (N32_GPIOI_BASE + N32_GPIO_MODER_OFFSET) +# define N32_GPIOI_OTYPER (N32_GPIOI_BASE + N32_GPIO_OTYPER_OFFSET) +# define N32_GPIOI_SR (N32_GPIOI_BASE + N32_GPIO_SR_OFFSET) +# define N32_GPIOI_PUPD (N32_GPIOI_BASE + N32_GPIO_PUPD_OFFSET) +# define N32_GPIOI_PID (N32_GPIOI_BASE + N32_GPIO_PID_OFFSET) +# define N32_GPIOI_POD (N32_GPIOI_BASE + N32_GPIO_POD_OFFSET) +# define N32_GPIOI_PBSC (N32_GPIOI_BASE + N32_GPIO_PBSC_OFFSET) +# define N32_GPIOI_PLOCK (N32_GPIOI_BASE + N32_GPIO_PLOCK_OFFSET) +# define N32_GPIOI_AFL (N32_GPIOI_BASE + N32_GPIO_AFL_OFFSET) +# define N32_GPIOI_AFH (N32_GPIOI_BASE + N32_GPIO_AFH_OFFSET) +# define N32_GPIOI_PBC (N32_GPIOI_BASE + N32_GPIO_PBC_OFFSET) +# define N32_GPIOI_DS (N32_GPIOI_BASE + N32_GPIO_DS_OFFSET) +#endif + +#if N32H7_NGPIO > 9 +# define N32_GPIOJ_MODER (N32_GPIOJ_BASE + N32_GPIO_MODER_OFFSET) +# define N32_GPIOJ_OTYPER (N32_GPIOJ_BASE + N32_GPIO_OTYPER_OFFSET) +# define N32_GPIOJ_SR (N32_GPIOJ_BASE + N32_GPIO_SR_OFFSET) +# define N32_GPIOJ_PUPD (N32_GPIOJ_BASE + N32_GPIO_PUPD_OFFSET) +# define N32_GPIOJ_PID (N32_GPIOJ_BASE + N32_GPIO_PID_OFFSET) +# define N32_GPIOJ_POD (N32_GPIOJ_BASE + N32_GPIO_POD_OFFSET) +# define N32_GPIOJ_PBSC (N32_GPIOJ_BASE + N32_GPIO_PBSC_OFFSET) +# define N32_GPIOJ_PLOCK (N32_GPIOJ_BASE + N32_GPIO_PLOCK_OFFSET) +# define N32_GPIOJ_AFL (N32_GPIOJ_BASE + N32_GPIO_AFL_OFFSET) +# define N32_GPIOJ_AFH (N32_GPIOJ_BASE + N32_GPIO_AFH_OFFSET) +# define N32_GPIOJ_PBC (N32_GPIOJ_BASE + N32_GPIO_PBC_OFFSET) +# define N32_GPIOJ_DS (N32_GPIOJ_BASE + N32_GPIO_DS_OFFSET) +#endif + +#if N32H7_NGPIO > 10 +# define N32_GPIOK_MODER (N32_GPIOK_BASE + N32_GPIO_MODER_OFFSET) +# define N32_GPIOK_OTYPER (N32_GPIOK_BASE + N32_GPIO_OTYPER_OFFSET) +# define N32_GPIOK_SR (N32_GPIOK_BASE + N32_GPIO_SR_OFFSET) +# define N32_GPIOK_PUPD (N32_GPIOK_BASE + N32_GPIO_PUPD_OFFSET) +# define N32_GPIOK_PID (N32_GPIOK_BASE + N32_GPIO_PID_OFFSET) +# define N32_GPIOK_POD (N32_GPIOK_BASE + N32_GPIO_POD_OFFSET) +# define N32_GPIOK_PBSC (N32_GPIOK_BASE + N32_GPIO_PBSC_OFFSET) +# define N32_GPIOK_PLOCK (N32_GPIOK_BASE + N32_GPIO_PLOCK_OFFSET) +# define N32_GPIOK_AFL (N32_GPIOK_BASE + N32_GPIO_AFL_OFFSET) +# define N32_GPIOK_AFH (N32_GPIOK_BASE + N32_GPIO_AFH_OFFSET) +# define N32_GPIOK_PBC (N32_GPIOK_BASE + N32_GPIO_PBC_OFFSET) +# define N32_GPIOK_DS (N32_GPIOK_BASE + N32_GPIO_DS_OFFSET) +#endif + +/* Register Bitfield Definitions ********************************************/ + +/* GPIO port mode register */ + +#define GPIO_MODER_INPUT (0) /* Input */ +#define GPIO_MODER_OUTPUT (1) /* General purpose output mode */ +#define GPIO_MODER_ALT (2) /* Alternate mode */ +#define GPIO_MODER_ANALOG (3) /* Analog mode */ + +#define GPIO_MODER_SHIFT(n) ((n) * 2) +#define GPIO_MODER_MASK(n) (3 << GPIO_MODER_SHIFT(n)) + +#define GPIO_MODER0_SHIFT (0) +#define GPIO_MODER0_MASK (3 << GPIO_MODER0_SHIFT) +#define GPIO_MODER1_SHIFT (2) +#define GPIO_MODER1_MASK (3 << GPIO_MODER1_SHIFT) +#define GPIO_MODER2_SHIFT (4) +#define GPIO_MODER2_MASK (3 << GPIO_MODER2_SHIFT) +#define GPIO_MODER3_SHIFT (6) +#define GPIO_MODER3_MASK (3 << GPIO_MODER3_SHIFT) +#define GPIO_MODER4_SHIFT (8) +#define GPIO_MODER4_MASK (3 << GPIO_MODER4_SHIFT) +#define GPIO_MODER5_SHIFT (10) +#define GPIO_MODER5_MASK (3 << GPIO_MODER5_SHIFT) +#define GPIO_MODER6_SHIFT (12) +#define GPIO_MODER6_MASK (3 << GPIO_MODER6_SHIFT) +#define GPIO_MODER7_SHIFT (14) +#define GPIO_MODER7_MASK (3 << GPIO_MODER7_SHIFT) +#define GPIO_MODER8_SHIFT (16) +#define GPIO_MODER8_MASK (3 << GPIO_MODER8_SHIFT) +#define GPIO_MODER9_SHIFT (18) +#define GPIO_MODER9_MASK (3 << GPIO_MODER9_SHIFT) +#define GPIO_MODER10_SHIFT (20) +#define GPIO_MODER10_MASK (3 << GPIO_MODER10_SHIFT) +#define GPIO_MODER11_SHIFT (22) +#define GPIO_MODER11_MASK (3 << GPIO_MODER11_SHIFT) +#define GPIO_MODER12_SHIFT (24) +#define GPIO_MODER12_MASK (3 << GPIO_MODER12_SHIFT) +#define GPIO_MODER13_SHIFT (26) +#define GPIO_MODER13_MASK (3 << GPIO_MODER13_SHIFT) +#define GPIO_MODER14_SHIFT (28) +#define GPIO_MODER14_MASK (3 << GPIO_MODER14_SHIFT) +#define GPIO_MODER15_SHIFT (30) +#define GPIO_MODER15_MASK (3 << GPIO_MODER15_SHIFT) + +/* GPIO port output type register */ + +#define GPIO_OTYPER_OD(n) (1 << (n)) /* 1=Output open-drain */ +#define GPIO_OTYPER_PP(n) (0) /* 0=Output push-pull */ + +/* GPIO port slew rate register */ + +#define GPIO_SR_SLOW_SLEW(n) (1 << (n)) /* 1=Slow slew rate */ +#define GPIO_SR_FAST_SLEW(n) (0) /* 0=Fast slew rate */ + +/* GPIO port pull-up/pull-down register */ + +#define GPIO_PUPDR_NONE (0) /* No pull-up, pull-down */ +#define GPIO_PUPDR_PULLUP (1) /* Pull-up */ +#define GPIO_PUPDR_PULLDOWN (2) /* Pull-down */ + +#define GPIO_PUPDR_SHIFT(n) ((n) << 1) +#define GPIO_PUPDR_MASK(n) (3 << GPIO_PUPDR_SHIFT(n)) + +#define GPIO_PUPDR0_SHIFT (0) +#define GPIO_PUPDR0_MASK (3 << GPIO_PUPDR0_SHIFT) +#define GPIO_PUPDR1_SHIFT (2) +#define GPIO_PUPDR1_MASK (3 << GPIO_PUPDR1_SHIFT) +#define GPIO_PUPDR2_SHIFT (4) +#define GPIO_PUPDR2_MASK (3 << GPIO_PUPDR2_SHIFT) +#define GPIO_PUPDR3_SHIFT (6) +#define GPIO_PUPDR3_MASK (3 << GPIO_PUPDR3_SHIFT) +#define GPIO_PUPDR4_SHIFT (8) +#define GPIO_PUPDR4_MASK (3 << GPIO_PUPDR4_SHIFT) +#define GPIO_PUPDR5_SHIFT (10) +#define GPIO_PUPDR5_MASK (3 << GPIO_PUPDR5_SHIFT) +#define GPIO_PUPDR6_SHIFT (12) +#define GPIO_PUPDR6_MASK (3 << GPIO_PUPDR6_SHIFT) +#define GPIO_PUPDR7_SHIFT (14) +#define GPIO_PUPDR7_MASK (3 << GPIO_PUPDR7_SHIFT) +#define GPIO_PUPDR8_SHIFT (16) +#define GPIO_PUPDR8_MASK (3 << GPIO_PUPDR8_SHIFT) +#define GPIO_PUPDR9_SHIFT (18) +#define GPIO_PUPDR9_MASK (3 << GPIO_PUPDR9_SHIFT) +#define GPIO_PUPDR10_SHIFT (20) +#define GPIO_PUPDR10_MASK (3 << GPIO_PUPDR10_SHIFT) +#define GPIO_PUPDR11_SHIFT (22) +#define GPIO_PUPDR11_MASK (3 << GPIO_PUPDR11_SHIFT) +#define GPIO_PUPDR12_SHIFT (24) +#define GPIO_PUPDR12_MASK (3 << GPIO_PUPDR12_SHIFT) +#define GPIO_PUPDR13_SHIFT (26) +#define GPIO_PUPDR13_MASK (3 << GPIO_PUPDR13_SHIFT) +#define GPIO_PUPDR14_SHIFT (28) +#define GPIO_PUPDR14_MASK (3 << GPIO_PUPDR14_SHIFT) +#define GPIO_PUPDR15_SHIFT (30) +#define GPIO_PUPDR15_MASK (3 << GPIO_PUPDR15_SHIFT) + +/* GPIO port input data register */ + +#define GPIO_PID(n) (1 << (n)) + +/* GPIO port output data register */ + +#define GPIO_POD(n) (1 << (n)) + +/* GPIO port bit set/reset register */ + +#define GPIO_PBSC_SET(n) (1 << (n)) +#define GPIO_PBSC_RESET(n) (1 << (n + 16)) + +/* GPIO port configuration lock register */ + +#define GPIO_PLOCKR(n) (1 << (n)) +#define GPIO_PLOCKK (1 << 16) /* Lock key */ + +/* GPIO alternate function low/high register */ + +#define GPIO_AFR_SHIFT(n) ((n) << 2) +#define GPIO_AFR_MASK(n) (15 << GPIO_AFR_SHIFT(n)) + +#define GPIO_AFRL0_SHIFT (0) +#define GPIO_AFRL0_MASK (15 << GPIO_AFRL0_SHIFT) +#define GPIO_AFRL1_SHIFT (4) +#define GPIO_AFRL1_MASK (15 << GPIO_AFRL1_SHIFT) +#define GPIO_AFRL2_SHIFT (8) +#define GPIO_AFRL2_MASK (15 << GPIO_AFRL2_SHIFT) +#define GPIO_AFRL3_SHIFT (12) +#define GPIO_AFRL3_MASK (15 << GPIO_AFRL3_SHIFT) +#define GPIO_AFRL4_SHIFT (16) +#define GPIO_AFRL4_MASK (15 << GPIO_AFRL4_SHIFT) +#define GPIO_AFRL5_SHIFT (20) +#define GPIO_AFRL5_MASK (15 << GPIO_AFRL5_SHIFT) +#define GPIO_AFRL6_SHIFT (24) +#define GPIO_AFRL6_MASK (15 << GPIO_AFRL6_SHIFT) +#define GPIO_AFRL7_SHIFT (28) +#define GPIO_AFRL7_MASK (15 << GPIO_AFRL7_SHIFT) + +#define GPIO_AFRH8_SHIFT (0) +#define GPIO_AFRH8_MASK (15 << GPIO_AFRH8_SHIFT) +#define GPIO_AFRH9_SHIFT (4) +#define GPIO_AFRH9_MASK (15 << GPIO_AFRH9_SHIFT) +#define GPIO_AFRH10_SHIFT (8) +#define GPIO_AFRH10_MASK (15 << GPIO_AFRH10_SHIFT) +#define GPIO_AFRH11_SHIFT (12) +#define GPIO_AFRH11_MASK (15 << GPIO_AFRH11_SHIFT) +#define GPIO_AFRH12_SHIFT (16) +#define GPIO_AFRH12_MASK (15 << GPIO_AFRH12_SHIFT) +#define GPIO_AFRH13_SHIFT (20) +#define GPIO_AFRH13_MASK (15 << GPIO_AFRH13_SHIFT) +#define GPIO_AFRH14_SHIFT (24) +#define GPIO_AFRH14_MASK (15 << GPIO_AFRH14_SHIFT) +#define GPIO_AFRH15_SHIFT (28) +#define GPIO_AFRH15_MASK (15 << GPIO_AFRH15_SHIFT) + +/* GPIO port data bit clear register */ + +#define GPIO_PBC(n) (1 << (n)) + +/* GPIO port driver strength configuration register */ + +#define GPIO_DS_2mA (0) /* Drive strength is 2mA */ +#define GPIO_DS_4mA (2) /* Drive strength is 4mA */ +#define GPIO_DS_8mA (1) /* Drive strength is 8mA */ +#define GPIO_DS_12mA (3) /* Drive strength is 12mA */ + +#define GPIO_DS_SHIFT(n) ((n) << 1) +#define GPIO_DS_MASK(n) (3 << GPIO_DS_SHIFT(n)) + +#define GPIO_DS_SHIFT0 (0) +#define GPIO_DS_MASK0 (3 << GPIO_DS_SHIFT0) +#define GPIO_DS_SHIFT1 (2) +#define GPIO_DS_MASK1 (3 << GPIO_DS_SHIFT1) +#define GPIO_DS_SHIFT2 (4) +#define GPIO_DS_MASK2 (3 << GPIO_DS_SHIFT2) +#define GPIO_DS_SHIFT3 (6) +#define GPIO_DS_MASK3 (3 << GPIO_DS_SHIFT3) +#define GPIO_DS_SHIFT4 (8) +#define GPIO_DS_MASK4 (3 << GPIO_DS_SHIFT4) +#define GPIO_DS_SHIFT5 (10) +#define GPIO_DS_MASK5 (3 << GPIO_DS_SHIFT5) +#define GPIO_DS_SHIFT6 (12) +#define GPIO_DS_MASK6 (3 << GPIO_DS_SHIFT6) +#define GPIO_DS_SHIFT7 (14) +#define GPIO_DS_MASK7 (3 << GPIO_DS_SHIFT7) +#define GPIO_DS_SHIFT8 (16) +#define GPIO_DS_MASK8 (3 << GPIO_DS_SHIFT8) +#define GPIO_DS_SHIFT9 (18) +#define GPIO_DS_MASK9 (3 << GPIO_DS_SHIFT9) +#define GPIO_DS_SHIFT10 (20) +#define GPIO_DS_MASK10 (3 << GPIO_DS_SHIFT10) +#define GPIO_DS_SHIFT11 (22) +#define GPIO_DS_MASK11 (3 << GPIO_DS_SHIFT11) +#define GPIO_DS_SHIFT12 (24) +#define GPIO_DS_MASK12 (3 << GPIO_DS_SHIFT12) +#define GPIO_DS_SHIFT13 (26) +#define GPIO_DS_MASK13 (3 << GPIO_DS_SHIFT13) +#define GPIO_DS_SHIFT14 (28) +#define GPIO_DS_MASK14 (3 << GPIO_DS_SHIFT14) +#define GPIO_DS_SHIFT15 (30) +#define GPIO_DS_MASK15 (3 << GPIO_DS_SHIFT15) + +#endif /* __ARCH_ARM_SRC_N32H7_HARDWARE_N32H76X_GPIO_H */ diff --git a/arch/arm/src/n32h7/hardware/n32h76x_memorymap.h b/arch/arm/src/n32h7/hardware/n32h76x_memorymap.h new file mode 100644 index 0000000000000..a6fb6a638e573 --- /dev/null +++ b/arch/arm/src/n32h7/hardware/n32h76x_memorymap.h @@ -0,0 +1,284 @@ +/**************************************************************************** + * arch/arm/src/n32h7/hardware/n32h76x_memorymap.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + + #ifndef __ARCH_ARM_SRC_N32H7_HARDWARE_N32H76X_MEMORYMAP_H + #define __ARCH_ARM_SRC_N32H7_HARDWARE_N32H76X_MEMORYMAP_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* N32H76X Address Blocks ***************************************************/ + +#define N32_VECTOR_SIZE 0x000003E4 + +#define N32_CODE_BASE 0x00000000 /* 0x00000000-0x1fffffff: 512Mb CODE block */ +#define N32_RAM_BASE 0x20000000 /* 0x20000000-0x3fffffff: 512Mb RAM block */ +#define N32_PERIPH_BASE 0x40000000 /* 0x40000000-0x5fffffff: 512Mb Peripheral blocks */ +#define N32_EXTMEM_BASE 0x60000000 /* 0x60000000-0x9fffffff: 1Gb External memory blocks */ +#define N32_EXTDEV_BASE 0xa0000000 /* 0xa0000000-0xdfffffff: 1Gb External device blocks */ +#define N32_CORTEX_BASE 0xe0000000 /* 0xe0000000-0xffffffff: 512Mb Cortex-M7 block */ + +#define N32_PERIPH_SIZE 0x20000000 +#define N32_ITCRAM_SIZE 0x00020000 +#define N32_DTCRAM_SIZE 0x000E0000 + +#define N32_REGION_MASK 0xff000000 +#define N32_IS_RAM(a) ((((uint32_t)(a)) & N32_REGION_MASK) == N32_RAM_BASE) +#define N32_IS_EXTMEM(a) ((((uint32_t)(a)) & N32_REGION_MASK) == N32_EXTMEM_BASE) + +/* Code Base Addresses ******************************************************/ + +#define N32_ITCRAM_BASE 0x00000000 /* 0x00000000-0x0001ffff: ITCM */ +#define N32_FLASH_BANK1 0x15000000 /* 0x15000000-0x151fffff: FLASH memory 1 */ +#define N32_FLASH_BANK2 0x17000000 /* 0x17000000-0x18ffffff: FLASH memory 2 */ +#define N32_FLASH_BASE N32_FLASH_BANK1 + +#if defined(CONFIG_N32H7_FLASH_CONFIG_I) + #define N32_FLASH_SIZE (0x00200000-0x00020000) +#endif +#if defined(CONFIG_N32H7_FLASH_CONFIG_K) + #define N32_FLASH_SIZE (0x00400000-0x00020000) +#endif + +/* SRAM Base Addresses ******************************************************/ + +#define N32_DTCRAM_BASE 0x20000000 /* 0x20000000-0x200cffff: DTCM-RAM on TCM interface */ +#define N32_AXISRAM_BASE 0x24000000 /* 0x24000000-0x2401ffff: System AXI SRAM */ + +#ifdef CONFIG_ARCH_CHIP_N32H7_CORTEXM7 +# define N32_AHBSRAM_BASE 0x30000000 /* 0x30000000-0x30057fff: System SRAM1 */ +#else +# error "CONFIG_ARCH_CHIP_N32H7_CORTEXM7 not defined" +#endif +#define N32_BSRAM_BASE 0x38000000 /* 0x38800000-0x38800fff: System Backup SRAM */ + +/* Peripheral Base Addresses ************************************************/ + +#define N32_PREGION_MASK 0xff000000 +#define N32_D2_BASE 0x40000000 /* 0x40000000-0x401403ff: D2 domain */ +# define N32_APB1_BASE 0x40000000 /* 0x40000000-0x4003ffff: APB1 */ +# define N32_AHB1_BASE 0x40040000 /* 0x40040000-0x400affff: AHB1 */ +# define N32_AHB9_BASE 0x400b0000 /* 0x400b0000-0x400cffff: AHB9 */ +# define N32_APB2_BASE 0x400d0000 /* 0x400d0000-0x400effff: APB2 */ +# define N32_AHB2_BASE 0x400f0000 /* 0x400f0000-0x401403ff: AHB2 */ +#define N32_D1_BASE 0x50000000 /* 0x50000000-0x51120fff: D1 domain */ +# define N32_APB3_BASE 0x50000000 /* 0x50000000-0x50090fff: APB6 */ +# define N32_AHB3_BASE 0x51000000 /* 0x51000000-0x51120fff: AHB6 */ +#define N32_D3_BASE 0x58000000 /* 0x58000000-0x58036fff: D3 domain */ +# define N32_APB4_BASE 0x58000000 /* 0x58000000-0x58005bff: APB5 */ +# define N32_AHB4_BASE 0x58030000 /* 0x58030000-0x58036fff: AHB5 */ + +/* APB1 Base Addresses ******************************************************/ + +#define N32_FDCAN1_BASE 0x40000000 +#define N32_FDCAN2_BASE 0x40000400 +#define N32_FDCAN5_BASE 0x40000800 +#define N32_FDCAN6_BASE 0x40000c00 +#define N32_AHB_ICACHE_BASE 0x40008000 +#define N32_AHB_DCACHE_BASE 0x40009000 +#define N32_BTIMER1_BASE 0x4000a000 +#define N32_BTIMER2_BASE 0x4000a400 +#define N32_GTIMERB1_BASE 0x4000a800 +#define N32_GTIMERB2_BASE 0x4000ac00 +#define N32_GTIMERB3_BASE 0x4000b000 +#define N32_GTIMERA4_BASE 0x4000b400 +#define N32_GTIMERA5_BASE 0x4000b800 +#define N32_GTIMERA6_BASE 0x4000bc00 +#define N32_GTIMERA7_BASE 0x4000c000 +#define N32_USART1_BASE 0x4000c400 +#define N32_USART2_BASE 0x4000c800 +#define N32_USART3_BASE 0x4000cc00 +#define N32_USART4_BASE 0x4000d000 +#define N32_UART9_BASE 0x4000d400 +#define N32_UART10_BASE 0x4000d800 +#define N32_UART11_BASE 0x4000dc00 +#define N32_UART12_BASE 0x4000e000 +#define N32_SPI3_BASE 0x4000e400 +#define N32_I2C1_BASE 0x4000e800 +#define N32_I2C2_BASE 0x4000ec00 +#define N32_I2C3_BASE 0x4000f000 +#define N32_I2S3_BASE 0x4000f400 +#define N32_I2S4_BASE 0x4000f800 +#define N32_DAC12_BASE 0x4000fc00 +#define N32_WWDG2_BASE 0x40010000 +#define N32_BTIMER3_BASE 0x40010800 +#define N32_BTIMER4_BASE 0x40010c00 + +/* AHB1 Base Addresses ******************************************************/ + +#define N32_ETH2_BASE 0x40042000 +#define N32_ADC1_BASE 0x40044000 +#define N32_ADC2_BASE 0x40044400 +#define N32_ADC3_BASE 0x40044800 +#define N32_AHB_CACHE_PARMON_BASE 0x40045000 +#define N32_DMAMUX1_BASE 0x40046400 +#define N32_DMA1_BASE 0x40046800 +#define N32_DMA2_BASE 0x40046C00 +#define N32_DMA3_BASE 0x40047000 +#define N32_SDMMC2_CFG_BASE 0x4004A000 +#define N32_SDHOST2_BASE 0x40050000 +#define N32_USBCTRL2_BASE 0x40060000 +#define N32_USBCTRL2_WRAPPER_BASE 0x400A0000 + +/* AHB9 Base Addresses ******************************************************/ + +#define N32_ESC_BASE 0x400B0000 +#define N32_ESC_WRAPPER_BASE 0x400C0000 + +/* APB2 Base Addresses ******************************************************/ + +#define N32_FDCAN3_BASE 0x400D0000 +#define N32_FDCAN4_BASE 0x400D0400 +#define N32_FDCAN7_BASE 0x400D0800 +#define N32_FDCAN8_BASE 0x400D0C00 +#define N32_SHRTIM1_BASE 0x400D8000 +#define N32_SHRTIM2_BASE 0x400D9000 +#define N32_DSMU_BASE 0x400DA000 +#define N32_ATIMER1_BASE 0x400DB000 +#define N32_ATIMER2_BASE 0x400DB400 +#define N32_I2S1_BASE 0x400DB800 +#define N32_I2S2_BASE 0x400DBC00 +#define N32_SPI1_BASE 0x400DC000 +#define N32_SPI2_BASE 0x400DC400 +#define N32_GTIMERA1_BASE 0x400DC800 +#define N32_GTIMERA2_BASE 0x400DCC00 +#define N32_GTIMERA3_BASE 0x400DD000 +#define N32_I2C4_BASE 0x400DD400 +#define N32_I2C5_BASE 0x400DD800 +#define N32_I2C6_BASE 0x400DDC00 +#define N32_USART5_BASE 0x400DE000 +#define N32_USART6_BASE 0x400DE400 +#define N32_USART7_BASE 0x400DE800 +#define N32_USART8_BASE 0x400DEC00 +#define N32_UART13_BASE 0x400DF000 +#define N32_UART14_BASE 0x400DF400 +#define N32_UART15_BASE 0x400DF800 + +/* AHB2 Base Addresses ******************************************************/ + +#define N32_ECCMON2_BASE 0x400F0000 +#define N32_CORDIC_BASE 0x400F1000 +#define N32_FMAC_BASE 0x400F1400 +#define N32_DAC34_BASE 0x400F1800 +#define N32_DAC56_BASE 0x400F1C00 +#define N32_SDPU_BASE 0x400F2000 +#define N32_ETH1_BASE 0x400F4000 +#define N32_SEMA4_BASE 0x400F6000 +#define N32_DCMUA_BASE 0x400F7000 +#define N32_DCMUB_BASE 0x400F8000 +#define N32_USBCTRL1_BASE 0x40100000 +#define N32_USBCTRL1_WRAPPER_BASE 0x40140000 + +/* APB6 Base Addresses ******************************************************/ + +#define N32_DSIHOST_BASE 0x50000000 +#define N32_2_5D_GPU_BASE 0x50040000 +#define N32_DVP1_BASE 0x50048000 +#define N32_DVP2_BASE 0x50049000 +#define N32_LCDC_BASE 0x5004a000 +#define N32_WWDG1_BASE 0x5004a800 +#define N32_DSIHOST_WRAPPER_BASE 0x5004ac00 +#define N32_TCMSRAMC_BASE 0x5004b000 +#define N32_FEMC_BASE 0x5004c000 +#define N32_JPEG_ENC_BASE 0x50060000 +#define N32_JPEG_RBC_BASE 0x50070000 +#define N32_JPEG_H2P_SGDMA_BASE 0x50070400 +#define N32_JPEG_DEC_BASE 0x50080000 +#define N32_JPEG_BRC_BASE 0x50090000 +#define N32_JPEG_P2H_SGDMA_BASE 0x50090400 +#define N32_JPEG_CTRL_BASE 0x50090800 + +/* AHB6 Base Addresses ******************************************************/ + +#define N32_GPV_BASE 0x51000000 +#define N32_xSPI1_BASE 0x51100000 +#define N32_xSPI2_BASE 0x51101000 +#define N32_MDMA_BASE 0x51102000 +#define N32_ECCMON1_BASE 0x51104000 +#define N32_MMU_BASE 0x51105000 +#define N32_SDRAM_BASE 0x51106000 +#define N32_SDMMC1_CFG_BASE 0x51107000 +#define N32_SDHOST1_BASE 0x51110000 +#define N32_OTPC_BASE 0x51118000 +#define N32_DMAMUX2_BASE 0x51120000 +#define N32_MDMA_WRAPPER_BASE 0x51120800 + +/* APB5 Base Addresses ******************************************************/ +#define N32_EXTI_WKUP_BASE 0x58000000 +#define N32_AFEC_BASE 0x58000400 +#define N32_LPUART1_BASE 0x58000800 +#define N32_LPUART2_BASE 0x58000C00 +#define N32_LPTIMER1_BASE 0x58001000 +#define N32_LPTIMER_BASE 0x58001400 +#define N32_LPTIMER3_BASE 0x58001800 +#define N32_LPTIMER4_BASE 0x58001C00 +#define N32_SPI4_BASE 0x58002000 +#define N32_SPI5_BASE 0x58002400 +#define N32_SPI6_BASE 0x58002800 +#define N32_SPI7_BASE 0x58002C00 +#define N32_I2C7_BASE 0x58003000 +#define N32_I2C8_BASE 0x58003400 +#define N32_I2C9_BASE 0x58003800 +#define N32_I2C10_BASE 0x58003C00 +#define N32_ATIMER3_BASE 0x58004000 +#define N32_ATIMER4_BASE 0x58004400 +#define N32_COMPCTRL_BASE 0x58004800 +#define N32_IWDG1_BASE 0x58004C00 +#define N32_IWDG2_BASE 0x58005000 +#define N32_RTC_BASE 0x58005400 +#define N32_LPTIMER5_BASE 0x58005800 + +/* AHB5 Base Addresses ******************************************************/ +#define N32_AFIO_BASE 0x58032400 +#define N32_CRC_BASE 0x58032000 +#define N32_PWR_BASE 0x58031000 +#define N32_RCC_BASE 0x58030000 +#define N32_GPIOA_BASE 0x58032800 +#define N32_GPIOB_BASE 0x58032C00 +#define N32_GPIOC_BASE 0x58033000 +#define N32_GPIOD_BASE 0x58033400 +#define N32_GPIOE_BASE 0x58033800 +#define N32_GPIOF_BASE 0x58033C00 +#define N32_GPIOG_BASE 0x58034000 +#define N32_GPIOH_BASE 0x58034400 +#define N32_GPIOI_BASE 0x58034800 +#define N32_GPIOJ_BASE 0x58034C00 +#define N32_GPIOK_BASE 0x58035000 +#define N32_ECCMON3_BASE 0x58036000 + +#define N32_SYSMEM_UID 0x0238 + +/* The DBGMCU registers are accessible to the debugger via the APB-D bus + * at base address 0xe00e1000. They are also accessible by the processor + * core at base address 0x58035400. + */ + +#define N32_DEBUGMCU_BASE 0x58035400 + +#endif /* __ARCH_ARM_SRC_N32H7_HARDWARE_N32H76X_MEMORYMAP_H */ diff --git a/arch/arm/src/n32h7/hardware/n32h76x_pinmap.h b/arch/arm/src/n32h7/hardware/n32h76x_pinmap.h new file mode 100644 index 0000000000000..5cc9726332ab9 --- /dev/null +++ b/arch/arm/src/n32h7/hardware/n32h76x_pinmap.h @@ -0,0 +1,1225 @@ +/**************************************************************************** + * arch/arm/src/n32h7/hardware/n32h76x_pinmap.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __ARCH_ARM_SRC_N32H7_HARDWARE_N32H76X_PINMAP_H +#define __ARCH_ARM_SRC_N32H7_HARDWARE_N32H76X_PINMAP_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include "n32_gpio.h" + +#if defined(CONFIG_N32H7_N32H76X) + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* Alternate Pin Functions. + * All members of the N32H76|7xxx family share the same pin multiplexing + *(although they may differ in the pins physically available). + * + * Alternative pin selections are provided with a numeric suffix like _1, _2, + * etc. Drivers, however, will use the pin selection without the numeric + * suffix. + * Additional definitions are required in the board.h file. For example, + * if CAN1_RX connects via PA11 on some board, then the following definitions + * should appear in the board.h header file for that board: + * + * #define GPIO_CAN1_RX GPIO_CAN1_RX_1 + * + * The driver will then automatically configure PA11 as the CAN1 RX pin. + */ + +/* WARNING!!! WARNING!!! WARNING!!! WARNING!!! WARNING!!! WARNING!!! + * Additional effort is required to select specific GPIO options such as + * frequency, open-drain/push-pull, and pull-up/down! Just the basics are + * defined for most pins in this file. + */ + +/* MCO */ +#define GPIO_MCO1_0 (GPIO_ALT|GPIO_AF15|GPIO_PORTA|GPIO_PIN8) +#define GPIO_MCO2_0 (GPIO_ALT|GPIO_AF15|GPIO_PORTC|GPIO_PIN9) + +/* Timestamp */ +#define GPIO_TIMESTAMP_TRIG_IN_0 (GPIO_ALT|GPIO_AF9|GPIO_PORTC|GPIO_PIN13) +#define GPIO_TIMESTAMP_TRIG_IN_1 (GPIO_ALT|GPIO_AF9|GPIO_PORTC|GPIO_PIN14) +#define GPIO_TIMESTAMP_TRIG_IN_2 (GPIO_ALT|GPIO_AF9|GPIO_PORTC|GPIO_PIN15) + +/* JTAG/SWD */ +#define GPIO_JTMS_SWDIO_0 (GPIO_ALT|GPIO_AF15|GPIO_PORTA|GPIO_PIN13) +#define GPIO_JTCK_SWCLK_0 (GPIO_ALT|GPIO_AF15|GPIO_PORTA|GPIO_PIN14) +#define GPIO_JTDI_0 (GPIO_ALT|GPIO_AF15|GPIO_PORTA|GPIO_PIN15) +#define GPIO_JTDO_0 (GPIO_ALT|GPIO_AF15|GPIO_PORTB|GPIO_PIN3) +#define GPIO_NJTRST_0 (GPIO_ALT|GPIO_AF15|GPIO_PORTB|GPIO_PIN4) + +/* SHRTIM1 */ +#define GPIO_SHRTIM1_CHA1_0 (GPIO_ALT|GPIO_AF7|GPIO_PUSHPULL|GPIO_PORTC|GPIO_PIN6) +#define GPIO_SHRTIM1_CHA2_0 (GPIO_ALT|GPIO_AF7|GPIO_PUSHPULL|GPIO_PORTC|GPIO_PIN7) +#define GPIO_SHRTIM1_CHB1_0 (GPIO_ALT|GPIO_AF4|GPIO_PUSHPULL|GPIO_PORTC|GPIO_PIN8) +#define GPIO_SHRTIM1_CHB2_0 (GPIO_ALT|GPIO_AF3|GPIO_PUSHPULL|GPIO_PORTA|GPIO_PIN8) +#define GPIO_SHRTIM1_CHC1_0 (GPIO_ALT|GPIO_AF5|GPIO_PUSHPULL|GPIO_PORTA|GPIO_PIN9) +#define GPIO_SHRTIM1_CHC2_0 (GPIO_ALT|GPIO_AF3|GPIO_PUSHPULL|GPIO_PORTA|GPIO_PIN10) +#define GPIO_SHRTIM1_CHD1_0 (GPIO_ALT|GPIO_AF4|GPIO_PUSHPULL|GPIO_PORTA|GPIO_PIN11) +#define GPIO_SHRTIM1_CHD2_0 (GPIO_ALT|GPIO_AF3|GPIO_PUSHPULL|GPIO_PORTA|GPIO_PIN12) +#define GPIO_SHRTIM1_CHE1_0 (GPIO_ALT|GPIO_AF5|GPIO_PUSHPULL|GPIO_PORTG|GPIO_PIN6) +#define GPIO_SHRTIM1_CHE2_0 (GPIO_ALT|GPIO_AF5|GPIO_PUSHPULL|GPIO_PORTG|GPIO_PIN7) +#define GPIO_SHRTIM1_CHF1_0 (GPIO_ALT|GPIO_AF6|GPIO_PUSHPULL|GPIO_PORTG|GPIO_PIN4) +#define GPIO_SHRTIM1_CHF2_0 (GPIO_ALT|GPIO_AF7|GPIO_PUSHPULL|GPIO_PORTG|GPIO_PIN5) +#define GPIO_SHRTIM1_SCIN_0 (GPIO_ALT|GPIO_AF3|GPIO_PUSHPULL|GPIO_PORTB|GPIO_PIN11) +#define GPIO_SHRTIM1_SCIN_1 (GPIO_ALT|GPIO_AF5|GPIO_PUSHPULL|GPIO_PORTE|GPIO_PIN0) +#define GPIO_SHRTIM1_SCOUT_0 (GPIO_ALT|GPIO_AF6|GPIO_PUSHPULL|GPIO_PORTB|GPIO_PIN10) +#define GPIO_SHRTIM1_SCOUT_1 (GPIO_ALT|GPIO_AF5|GPIO_PUSHPULL|GPIO_PORTE|GPIO_PIN1) + +/* SHRTIM2 */ +#define GPIO_SHRTIM2_CHA1_0 (GPIO_ALT|GPIO_AF5|GPIO_PUSHPULL|GPIO_PORTF|GPIO_PIN0) +#define GPIO_SHRTIM2_CHA2_0 (GPIO_ALT|GPIO_AF6|GPIO_PUSHPULL|GPIO_PORTF|GPIO_PIN1) +#define GPIO_SHRTIM2_CHB1_0 (GPIO_ALT|GPIO_AF6|GPIO_PUSHPULL|GPIO_PORTF|GPIO_PIN2) +#define GPIO_SHRTIM2_CHB2_0 (GPIO_ALT|GPIO_AF6|GPIO_PUSHPULL|GPIO_PORTF|GPIO_PIN3) +#define GPIO_SHRTIM2_CHC1_0 (GPIO_ALT|GPIO_AF7|GPIO_PUSHPULL|GPIO_PORTF|GPIO_PIN4) +#define GPIO_SHRTIM2_CHC2_0 (GPIO_ALT|GPIO_AF6|GPIO_PUSHPULL|GPIO_PORTF|GPIO_PIN5) +#define GPIO_SHRTIM2_CHD1_0 (GPIO_ALT|GPIO_AF6|GPIO_PUSHPULL|GPIO_PORTH|GPIO_PIN2) +#define GPIO_SHRTIM2_CHD2_0 (GPIO_ALT|GPIO_AF5|GPIO_PUSHPULL|GPIO_PORTH|GPIO_PIN3) +#define GPIO_SHRTIM2_CHE1_0 (GPIO_ALT|GPIO_AF4|GPIO_PUSHPULL|GPIO_PORTH|GPIO_PIN4) +#define GPIO_SHRTIM2_CHE2_0 (GPIO_ALT|GPIO_AF4|GPIO_PUSHPULL|GPIO_PORTH|GPIO_PIN5) +#define GPIO_SHRTIM2_CHF1_0 (GPIO_ALT|GPIO_AF4|GPIO_PUSHPULL|GPIO_PORTF|GPIO_PIN14) +#define GPIO_SHRTIM2_CHF2_0 (GPIO_ALT|GPIO_AF5|GPIO_PUSHPULL|GPIO_PORTF|GPIO_PIN15) +#define GPIO_SHRTIM2_SCIN_0 (GPIO_ALT|GPIO_AF4|GPIO_PUSHPULL|GPIO_PORTD|GPIO_PIN8) +#define GPIO_SHRTIM2_SCIN_1 (GPIO_ALT|GPIO_AF5|GPIO_PUSHPULL|GPIO_PORTG|GPIO_PIN2) +#define GPIO_SHRTIM2_SCOUT_0 (GPIO_ALT|GPIO_AF3|GPIO_PUSHPULL|GPIO_PORTD|GPIO_PIN9) +#define GPIO_SHRTIM2_SCOUT_1 (GPIO_ALT|GPIO_AF3|GPIO_PUSHPULL|GPIO_PORTG|GPIO_PIN3) + +/* ATIM1 */ +#define GPIO_ATIM1_ETR_0 (GPIO_ALT|GPIO_AF5|GPIO_FLOAT|GPIO_PORTA|GPIO_PIN12) +#define GPIO_ATIM1_ETR_1 (GPIO_ALT|GPIO_AF8|GPIO_FLOAT|GPIO_PORTG|GPIO_PIN5) +#define GPIO_ATIM1_ETR_2 (GPIO_ALT|GPIO_AF6|GPIO_FLOAT|GPIO_PORTE|GPIO_PIN7) +#define GPIO_ATIM1_BKIN1_0 (GPIO_ALT|GPIO_AF8|GPIO_FLOAT|GPIO_PORTA|GPIO_PIN6) +#define GPIO_ATIM1_BKIN1_1 (GPIO_ALT|GPIO_AF4|GPIO_FLOAT|GPIO_PORTE|GPIO_PIN15) +#define GPIO_ATIM1_BKIN1_2 (GPIO_ALT|GPIO_AF6|GPIO_FLOAT|GPIO_PORTB|GPIO_PIN12) +#define GPIO_ATIM1_BKIN2_0 (GPIO_ALT|GPIO_AF4|GPIO_FLOAT|GPIO_PORTE|GPIO_PIN6) +#define GPIO_ATIM1_BKIN2_1 (GPIO_ALT|GPIO_AF7|GPIO_FLOAT|GPIO_PORTG|GPIO_PIN4) +#define GPIO_ATIM1_CH1IN_0 (GPIO_ALT|GPIO_AF4|GPIO_FLOAT|GPIO_PORTA|GPIO_PIN8) +#define GPIO_ATIM1_CH1IN_1 (GPIO_ALT|GPIO_AF6|GPIO_FLOAT|GPIO_PORTE|GPIO_PIN9) +#define GPIO_ATIM1_CH1OUT_0 (GPIO_ALT|GPIO_AF4|GPIO_PUSHPULL|GPIO_PORTA|GPIO_PIN8) +#define GPIO_ATIM1_CH1OUT_1 (GPIO_ALT|GPIO_AF6|GPIO_PUSHPULL|GPIO_PORTE|GPIO_PIN9) +#define GPIO_ATIM1_CH2IN_0 (GPIO_ALT|GPIO_AF6|GPIO_FLOAT|GPIO_PORTA|GPIO_PIN9) +#define GPIO_ATIM1_CH2IN_1 (GPIO_ALT|GPIO_AF5|GPIO_FLOAT|GPIO_PORTE|GPIO_PIN11) +#define GPIO_ATIM1_CH2OUT_0 (GPIO_ALT|GPIO_AF6|GPIO_PUSHPULL|GPIO_PORTA|GPIO_PIN9) +#define GPIO_ATIM1_CH2OUT_1 (GPIO_ALT|GPIO_AF5|GPIO_PUSHPULL|GPIO_PORTE|GPIO_PIN11) +#define GPIO_ATIM1_CH3IN_0 (GPIO_ALT|GPIO_AF4|GPIO_FLOAT|GPIO_PORTA|GPIO_PIN10) +#define GPIO_ATIM1_CH3IN_1 (GPIO_ALT|GPIO_AF5|GPIO_FLOAT|GPIO_PORTE|GPIO_PIN13) +#define GPIO_ATIM1_CH3OUT_0 (GPIO_ALT|GPIO_AF4|GPIO_PUSHPULL|GPIO_PORTA|GPIO_PIN10) +#define GPIO_ATIM1_CH3OUT_1 (GPIO_ALT|GPIO_AF5|GPIO_PUSHPULL|GPIO_PORTE|GPIO_PIN13) +#define GPIO_ATIM1_CH4IN_0 (GPIO_ALT|GPIO_AF5|GPIO_FLOAT|GPIO_PORTA|GPIO_PIN11) +#define GPIO_ATIM1_CH4IN_1 (GPIO_ALT|GPIO_AF6|GPIO_FLOAT|GPIO_PORTE|GPIO_PIN14) +#define GPIO_ATIM1_CH4OUT_0 (GPIO_ALT|GPIO_AF5|GPIO_PUSHPULL|GPIO_PORTA|GPIO_PIN11) +#define GPIO_ATIM1_CH4OUT_1 (GPIO_ALT|GPIO_AF6|GPIO_PUSHPULL|GPIO_PORTE|GPIO_PIN14) +#define GPIO_ATIM1_CH1NOUT_0 (GPIO_ALT|GPIO_AF9|GPIO_PUSHPULL|GPIO_PORTA|GPIO_PIN7) +#define GPIO_ATIM1_CH1NOUT_1 (GPIO_ALT|GPIO_AF6|GPIO_PUSHPULL|GPIO_PORTB|GPIO_PIN13) +#define GPIO_ATIM1_CH1NOUT_2 (GPIO_ALT|GPIO_AF6|GPIO_PUSHPULL|GPIO_PORTE|GPIO_PIN8) +#define GPIO_ATIM1_CH2NOUT_0 (GPIO_ALT|GPIO_AF5|GPIO_PUSHPULL|GPIO_PORTB|GPIO_PIN0) +#define GPIO_ATIM1_CH2NOUT_1 (GPIO_ALT|GPIO_AF6|GPIO_PUSHPULL|GPIO_PORTB|GPIO_PIN14) +#define GPIO_ATIM1_CH2NOUT_2 (GPIO_ALT|GPIO_AF5|GPIO_PUSHPULL|GPIO_PORTE|GPIO_PIN10) +#define GPIO_ATIM1_CH3NOUT_0 (GPIO_ALT|GPIO_AF7|GPIO_PUSHPULL|GPIO_PORTB|GPIO_PIN1) +#define GPIO_ATIM1_CH3NOUT_1 (GPIO_ALT|GPIO_AF6|GPIO_PUSHPULL|GPIO_PORTB|GPIO_PIN15) +#define GPIO_ATIM1_CH3NOUT_2 (GPIO_ALT|GPIO_AF6|GPIO_PUSHPULL|GPIO_PORTE|GPIO_PIN12) +#define GPIO_ATIM1_CH4NOUT_0 (GPIO_ALT|GPIO_AF8|GPIO_PUSHPULL|GPIO_PORTB|GPIO_PIN2) +#define GPIO_ATIM1_CH4NOUT_1 (GPIO_ALT|GPIO_AF5|GPIO_PUSHPULL|GPIO_PORTD|GPIO_PIN10) +#define GPIO_ATIM1_CH4NOUT_2 (GPIO_ALT|GPIO_AF6|GPIO_PUSHPULL|GPIO_PORTH|GPIO_PIN6) + +/* ATIM2 */ +#define GPIO_ATIM2_ETR_0 (GPIO_ALT|GPIO_AF5|GPIO_FLOAT|GPIO_PORTA|GPIO_PIN0) +#define GPIO_ATIM2_ETR_1 (GPIO_ALT|GPIO_AF6|GPIO_FLOAT|GPIO_PORTG|GPIO_PIN8) +#define GPIO_ATIM2_ETR_2 (GPIO_ALT|GPIO_AF7|GPIO_FLOAT|GPIO_PORTI|GPIO_PIN3) +#define GPIO_ATIM2_BKIN1_0 (GPIO_ALT|GPIO_AF9|GPIO_FLOAT|GPIO_PORTA|GPIO_PIN6) +#define GPIO_ATIM2_BKIN1_1 (GPIO_ALT|GPIO_AF6|GPIO_FLOAT|GPIO_PORTG|GPIO_PIN2) +#define GPIO_ATIM2_BKIN1_2 (GPIO_ALT|GPIO_AF7|GPIO_FLOAT|GPIO_PORTI|GPIO_PIN4) +#define GPIO_ATIM2_BKIN2_0 (GPIO_ALT|GPIO_AF4|GPIO_FLOAT|GPIO_PORTG|GPIO_PIN3) +#define GPIO_ATIM2_BKIN2_1 (GPIO_ALT|GPIO_AF5|GPIO_FLOAT|GPIO_PORTA|GPIO_PIN8) +#define GPIO_ATIM2_CH1IN_0 (GPIO_ALT|GPIO_AF8|GPIO_FLOAT|GPIO_PORTC|GPIO_PIN6) +#define GPIO_ATIM2_CH1IN_1 (GPIO_ALT|GPIO_AF8|GPIO_FLOAT|GPIO_PORTI|GPIO_PIN5) +#define GPIO_ATIM2_CH1OUT_0 (GPIO_ALT|GPIO_AF8|GPIO_PUSHPULL|GPIO_PORTC|GPIO_PIN6) +#define GPIO_ATIM2_CH1OUT_1 (GPIO_ALT|GPIO_AF8|GPIO_PUSHPULL|GPIO_PORTI|GPIO_PIN5) +#define GPIO_ATIM2_CH2IN_0 (GPIO_ALT|GPIO_AF7|GPIO_FLOAT|GPIO_PORTI|GPIO_PIN6) +#define GPIO_ATIM2_CH2IN_1 (GPIO_ALT|GPIO_AF8|GPIO_FLOAT|GPIO_PORTC|GPIO_PIN7) +#define GPIO_ATIM2_CH2OUT_0 (GPIO_ALT|GPIO_AF7|GPIO_PUSHPULL|GPIO_PORTI|GPIO_PIN6) +#define GPIO_ATIM2_CH2OUT_1 (GPIO_ALT|GPIO_AF8|GPIO_PUSHPULL|GPIO_PORTC|GPIO_PIN7) +#define GPIO_ATIM2_CH3IN_0 (GPIO_ALT|GPIO_AF5|GPIO_FLOAT|GPIO_PORTC|GPIO_PIN8) +#define GPIO_ATIM2_CH3IN_1 (GPIO_ALT|GPIO_AF8|GPIO_FLOAT|GPIO_PORTI|GPIO_PIN7) +#define GPIO_ATIM2_CH3OUT_0 (GPIO_ALT|GPIO_AF5|GPIO_PUSHPULL|GPIO_PORTC|GPIO_PIN8) +#define GPIO_ATIM2_CH3OUT_1 (GPIO_ALT|GPIO_AF8|GPIO_PUSHPULL|GPIO_PORTI|GPIO_PIN7) +#define GPIO_ATIM2_CH4IN_0 (GPIO_ALT|GPIO_AF7|GPIO_FLOAT|GPIO_PORTI|GPIO_PIN2) +#define GPIO_ATIM2_CH4IN_1 (GPIO_ALT|GPIO_AF9|GPIO_FLOAT|GPIO_PORTA|GPIO_PIN5) +#define GPIO_ATIM2_CH4OUT_0 (GPIO_ALT|GPIO_AF7|GPIO_PUSHPULL|GPIO_PORTI|GPIO_PIN2) +#define GPIO_ATIM2_CH4OUT_1 (GPIO_ALT|GPIO_AF9|GPIO_PUSHPULL|GPIO_PORTA|GPIO_PIN5) +#define GPIO_ATIM2_CH1NOUT_0 (GPIO_ALT|GPIO_AF8|GPIO_PUSHPULL|GPIO_PORTA|GPIO_PIN5) +#define GPIO_ATIM2_CH1NOUT_1 (GPIO_ALT|GPIO_AF10|GPIO_PUSHPULL|GPIO_PORTA|GPIO_PIN7) +#define GPIO_ATIM2_CH1NOUT_2 (GPIO_ALT|GPIO_AF8|GPIO_PUSHPULL|GPIO_PORTI|GPIO_PIN1) +#define GPIO_ATIM2_CH2NOUT_0 (GPIO_ALT|GPIO_AF5|GPIO_PUSHPULL|GPIO_PORTH|GPIO_PIN13) +#define GPIO_ATIM2_CH2NOUT_1 (GPIO_ALT|GPIO_AF6|GPIO_PUSHPULL|GPIO_PORTB|GPIO_PIN0) +#define GPIO_ATIM2_CH2NOUT_2 (GPIO_ALT|GPIO_AF7|GPIO_PUSHPULL|GPIO_PORTB|GPIO_PIN14) +#define GPIO_ATIM2_CH3NOUT_0 (GPIO_ALT|GPIO_AF8|GPIO_PUSHPULL|GPIO_PORTB|GPIO_PIN1) +#define GPIO_ATIM2_CH3NOUT_1 (GPIO_ALT|GPIO_AF7|GPIO_PUSHPULL|GPIO_PORTB|GPIO_PIN15) +#define GPIO_ATIM2_CH3NOUT_2 (GPIO_ALT|GPIO_AF5|GPIO_PUSHPULL|GPIO_PORTH|GPIO_PIN15) +#define GPIO_ATIM2_CH4NOUT_0 (GPIO_ALT|GPIO_AF9|GPIO_PUSHPULL|GPIO_PORTB|GPIO_PIN2) +#define GPIO_ATIM2_CH4NOUT_1 (GPIO_ALT|GPIO_AF6|GPIO_PUSHPULL|GPIO_PORTI|GPIO_PIN0) + +/* ATIM3 */ +#define GPIO_ATIM3_ETR_0 (GPIO_ALT|GPIO_AF6|GPIO_FLOAT|GPIO_PORTF|GPIO_PIN6) +#define GPIO_ATIM3_ETR_1 (GPIO_ALT|GPIO_AF7|GPIO_FLOAT|GPIO_PORTH|GPIO_PIN12) +#define GPIO_ATIM3_BKIN1_0 (GPIO_ALT|GPIO_AF7|GPIO_FLOAT|GPIO_PORTF|GPIO_PIN5) +#define GPIO_ATIM3_BKIN1_1 (GPIO_ALT|GPIO_AF5|GPIO_FLOAT|GPIO_PORTH|GPIO_PIN7) +#define GPIO_ATIM3_BKIN2_0 (GPIO_ALT|GPIO_AF5|GPIO_FLOAT|GPIO_PORTI|GPIO_PIN14) +#define GPIO_ATIM3_BKIN2_1 (GPIO_ALT|GPIO_AF4|GPIO_FLOAT|GPIO_PORTI|GPIO_PIN15) +#define GPIO_ATIM3_CH1IN_0 (GPIO_ALT|GPIO_AF6|GPIO_FLOAT|GPIO_PORTF|GPIO_PIN8) +#define GPIO_ATIM3_CH1IN_1 (GPIO_ALT|GPIO_AF10|GPIO_FLOAT|GPIO_PORTA|GPIO_PIN6) +#define GPIO_ATIM3_CH1OUT_0 (GPIO_ALT|GPIO_AF6|GPIO_PUSHPULL|GPIO_PORTF|GPIO_PIN8) +#define GPIO_ATIM3_CH1OUT_1 (GPIO_ALT|GPIO_AF10|GPIO_PUSHPULL|GPIO_PORTA|GPIO_PIN6) +#define GPIO_ATIM3_CH2IN_0 (GPIO_ALT|GPIO_AF7|GPIO_FLOAT|GPIO_PORTF|GPIO_PIN9) +#define GPIO_ATIM3_CH2IN_1 (GPIO_ALT|GPIO_AF6|GPIO_FLOAT|GPIO_PORTH|GPIO_PIN10) +#define GPIO_ATIM3_CH2OUT_0 (GPIO_ALT|GPIO_AF7|GPIO_PUSHPULL|GPIO_PORTF|GPIO_PIN9) +#define GPIO_ATIM3_CH2OUT_1 (GPIO_ALT|GPIO_AF6|GPIO_PUSHPULL|GPIO_PORTH|GPIO_PIN10) +#define GPIO_ATIM3_CH3IN_0 (GPIO_ALT|GPIO_AF5|GPIO_FLOAT|GPIO_PORTF|GPIO_PIN10) +#define GPIO_ATIM3_CH3IN_1 (GPIO_ALT|GPIO_AF5|GPIO_FLOAT|GPIO_PORTD|GPIO_PIN8) +#define GPIO_ATIM3_CH3OUT_0 (GPIO_ALT|GPIO_AF5|GPIO_PUSHPULL|GPIO_PORTF|GPIO_PIN10) +#define GPIO_ATIM3_CH3OUT_1 (GPIO_ALT|GPIO_AF5|GPIO_PUSHPULL|GPIO_PORTD|GPIO_PIN8) +#define GPIO_ATIM3_CH4IN_0 (GPIO_ALT|GPIO_AF5|GPIO_FLOAT|GPIO_PORTF|GPIO_PIN7) +#define GPIO_ATIM3_CH4IN_1 (GPIO_ALT|GPIO_AF5|GPIO_FLOAT|GPIO_PORTD|GPIO_PIN14) +#define GPIO_ATIM3_CH4OUT_0 (GPIO_ALT|GPIO_AF5|GPIO_PUSHPULL|GPIO_PORTF|GPIO_PIN7) +#define GPIO_ATIM3_CH4OUT_1 (GPIO_ALT|GPIO_AF5|GPIO_PUSHPULL|GPIO_PORTD|GPIO_PIN14) +#define GPIO_ATIM3_CH1NOUT_0 (GPIO_ALT|GPIO_AF5|GPIO_PUSHPULL|GPIO_PORTH|GPIO_PIN9) +#define GPIO_ATIM3_CH2NOUT_0 (GPIO_ALT|GPIO_AF5|GPIO_PUSHPULL|GPIO_PORTH|GPIO_PIN11) +#define GPIO_ATIM3_CH3NOUT_0 (GPIO_ALT|GPIO_AF4|GPIO_PUSHPULL|GPIO_PORTD|GPIO_PIN9) +#define GPIO_ATIM3_CH4NOUT_0 (GPIO_ALT|GPIO_AF5|GPIO_PUSHPULL|GPIO_PORTD|GPIO_PIN15) + +/* GTIMA1 */ +#define GPIO_GTIMA1_ETR_0 (GPIO_ALT|GPIO_AF7|GPIO_FLOAT|GPIO_PORTA|GPIO_PIN0) +#define GPIO_GTIMA1_ETR_1 (GPIO_ALT|GPIO_AF10|GPIO_FLOAT|GPIO_PORTA|GPIO_PIN5) +#define GPIO_GTIMA1_ETR_2 (GPIO_ALT|GPIO_AF10|GPIO_FLOAT|GPIO_PORTA|GPIO_PIN15) +#define GPIO_GTIMA1_ETR_3 (GPIO_ALT|GPIO_AF8|GPIO_FLOAT|GPIO_PORTF|GPIO_PIN4) +#define GPIO_GTIMA1_CH1IN_0 (GPIO_ALT|GPIO_AF6|GPIO_FLOAT|GPIO_PORTF|GPIO_PIN0) +#define GPIO_GTIMA1_CH1IN_1 (GPIO_ALT|GPIO_AF6|GPIO_FLOAT|GPIO_PORTA|GPIO_PIN0) +#define GPIO_GTIMA1_CH1IN_2 (GPIO_ALT|GPIO_AF9|GPIO_FLOAT|GPIO_PORTA|GPIO_PIN5) +#define GPIO_GTIMA1_CH1IN_3 (GPIO_ALT|GPIO_AF9|GPIO_FLOAT|GPIO_PORTA|GPIO_PIN15) +#define GPIO_GTIMA1_CH1OUT_0 (GPIO_ALT|GPIO_AF6|GPIO_PUSHPULL|GPIO_PORTF|GPIO_PIN0) +#define GPIO_GTIMA1_CH1OUT_1 (GPIO_ALT|GPIO_AF6|GPIO_PUSHPULL|GPIO_PORTA|GPIO_PIN0) +#define GPIO_GTIMA1_CH1OUT_2 (GPIO_ALT|GPIO_AF9|GPIO_PUSHPULL|GPIO_PORTA|GPIO_PIN5) +#define GPIO_GTIMA1_CH1OUT_3 (GPIO_ALT|GPIO_AF9|GPIO_PUSHPULL|GPIO_PORTA|GPIO_PIN15) +#define GPIO_GTIMA1_CH2IN_0 (GPIO_ALT|GPIO_AF7|GPIO_FLOAT|GPIO_PORTF|GPIO_PIN1) +#define GPIO_GTIMA1_CH2IN_1 (GPIO_ALT|GPIO_AF4|GPIO_FLOAT|GPIO_PORTA|GPIO_PIN1) +#define GPIO_GTIMA1_CH2IN_2 (GPIO_ALT|GPIO_AF8|GPIO_FLOAT|GPIO_PORTB|GPIO_PIN3) +#define GPIO_GTIMA1_CH2OUT_0 (GPIO_ALT|GPIO_AF7|GPIO_PUSHPULL|GPIO_PORTF|GPIO_PIN1) +#define GPIO_GTIMA1_CH2OUT_1 (GPIO_ALT|GPIO_AF4|GPIO_PUSHPULL|GPIO_PORTA|GPIO_PIN1) +#define GPIO_GTIMA1_CH2OUT_2 (GPIO_ALT|GPIO_AF8|GPIO_PUSHPULL|GPIO_PORTB|GPIO_PIN3) +#define GPIO_GTIMA1_CH3IN_0 (GPIO_ALT|GPIO_AF7|GPIO_FLOAT|GPIO_PORTF|GPIO_PIN2) +#define GPIO_GTIMA1_CH3IN_1 (GPIO_ALT|GPIO_AF3|GPIO_FLOAT|GPIO_PORTA|GPIO_PIN2) +#define GPIO_GTIMA1_CH3IN_2 (GPIO_ALT|GPIO_AF7|GPIO_FLOAT|GPIO_PORTB|GPIO_PIN10) +#define GPIO_GTIMA1_CH3OUT_0 (GPIO_ALT|GPIO_AF7|GPIO_PUSHPULL|GPIO_PORTF|GPIO_PIN2) +#define GPIO_GTIMA1_CH3OUT_1 (GPIO_ALT|GPIO_AF3|GPIO_PUSHPULL|GPIO_PORTA|GPIO_PIN2) +#define GPIO_GTIMA1_CH3OUT_2 (GPIO_ALT|GPIO_AF7|GPIO_PUSHPULL|GPIO_PORTB|GPIO_PIN10) +#define GPIO_GTIMA1_CH4IN_0 (GPIO_ALT|GPIO_AF7|GPIO_FLOAT|GPIO_PORTF|GPIO_PIN3) +#define GPIO_GTIMA1_CH4IN_1 (GPIO_ALT|GPIO_AF7|GPIO_FLOAT|GPIO_PORTA|GPIO_PIN3) +#define GPIO_GTIMA1_CH4IN_2 (GPIO_ALT|GPIO_AF4|GPIO_FLOAT|GPIO_PORTB|GPIO_PIN11) +#define GPIO_GTIMA1_CH4OUT_0 (GPIO_ALT|GPIO_AF7|GPIO_PUSHPULL|GPIO_PORTF|GPIO_PIN3) +#define GPIO_GTIMA1_CH4OUT_1 (GPIO_ALT|GPIO_AF7|GPIO_PUSHPULL|GPIO_PORTA|GPIO_PIN3) +#define GPIO_GTIMA1_CH4OUT_2 (GPIO_ALT|GPIO_AF4|GPIO_PUSHPULL|GPIO_PORTB|GPIO_PIN11) + +/* GTIMA2 */ +#define GPIO_GTIMA2_ETR_0 (GPIO_ALT|GPIO_AF7|GPIO_FLOAT|GPIO_PORTD|GPIO_PIN2) +#define GPIO_GTIMA2_ETR_1 (GPIO_ALT|GPIO_AF6|GPIO_FLOAT|GPIO_PORTB|GPIO_PIN8) +#define GPIO_GTIMA2_CH1IN_0 (GPIO_ALT|GPIO_AF11|GPIO_FLOAT|GPIO_PORTA|GPIO_PIN6) +#define GPIO_GTIMA2_CH1IN_1 (GPIO_ALT|GPIO_AF9|GPIO_FLOAT|GPIO_PORTC|GPIO_PIN6) +#define GPIO_GTIMA2_CH1IN_2 (GPIO_ALT|GPIO_AF10|GPIO_FLOAT|GPIO_PORTB|GPIO_PIN4) +#define GPIO_GTIMA2_CH1OUT_0 (GPIO_ALT|GPIO_AF11|GPIO_PUSHPULL|GPIO_PORTA|GPIO_PIN6) +#define GPIO_GTIMA2_CH1OUT_1 (GPIO_ALT|GPIO_AF9|GPIO_PUSHPULL|GPIO_PORTC|GPIO_PIN6) +#define GPIO_GTIMA2_CH1OUT_2 (GPIO_ALT|GPIO_AF10|GPIO_PUSHPULL|GPIO_PORTB|GPIO_PIN4) +#define GPIO_GTIMA2_CH2IN_0 (GPIO_ALT|GPIO_AF12|GPIO_FLOAT|GPIO_PORTA|GPIO_PIN7) +#define GPIO_GTIMA2_CH2IN_1 (GPIO_ALT|GPIO_AF9|GPIO_FLOAT|GPIO_PORTC|GPIO_PIN7) +#define GPIO_GTIMA2_CH2IN_2 (GPIO_ALT|GPIO_AF8|GPIO_FLOAT|GPIO_PORTB|GPIO_PIN5) +#define GPIO_GTIMA2_CH2OUT_0 (GPIO_ALT|GPIO_AF12|GPIO_PUSHPULL|GPIO_PORTA|GPIO_PIN7) +#define GPIO_GTIMA2_CH2OUT_1 (GPIO_ALT|GPIO_AF9|GPIO_PUSHPULL|GPIO_PORTC|GPIO_PIN7) +#define GPIO_GTIMA2_CH2OUT_2 (GPIO_ALT|GPIO_AF8|GPIO_PUSHPULL|GPIO_PORTB|GPIO_PIN5) +#define GPIO_GTIMA2_CH3IN_0 (GPIO_ALT|GPIO_AF7|GPIO_FLOAT|GPIO_PORTB|GPIO_PIN0) +#define GPIO_GTIMA2_CH3IN_1 (GPIO_ALT|GPIO_AF6|GPIO_FLOAT|GPIO_PORTC|GPIO_PIN8) +#define GPIO_GTIMA2_CH3IN_2 (GPIO_ALT|GPIO_AF4|GPIO_FLOAT|GPIO_PORTB|GPIO_PIN6) +#define GPIO_GTIMA2_CH3OUT_0 (GPIO_ALT|GPIO_AF7|GPIO_PUSHPULL|GPIO_PORTB|GPIO_PIN0) +#define GPIO_GTIMA2_CH3OUT_1 (GPIO_ALT|GPIO_AF6|GPIO_PUSHPULL|GPIO_PORTC|GPIO_PIN8) +#define GPIO_GTIMA2_CH3OUT_2 (GPIO_ALT|GPIO_AF4|GPIO_PUSHPULL|GPIO_PORTB|GPIO_PIN6) +#define GPIO_GTIMA2_CH4IN_0 (GPIO_ALT|GPIO_AF9|GPIO_FLOAT|GPIO_PORTB|GPIO_PIN1) +#define GPIO_GTIMA2_CH4IN_1 (GPIO_ALT|GPIO_AF10|GPIO_FLOAT|GPIO_PORTC|GPIO_PIN9) +#define GPIO_GTIMA2_CH4IN_2 (GPIO_ALT|GPIO_AF5|GPIO_FLOAT|GPIO_PORTB|GPIO_PIN7) +#define GPIO_GTIMA2_CH4OUT_0 (GPIO_ALT|GPIO_AF9|GPIO_PUSHPULL|GPIO_PORTB|GPIO_PIN1) +#define GPIO_GTIMA2_CH4OUT_1 (GPIO_ALT|GPIO_AF10|GPIO_PUSHPULL|GPIO_PORTC|GPIO_PIN9) +#define GPIO_GTIMA2_CH4OUT_2 (GPIO_ALT|GPIO_AF5|GPIO_PUSHPULL|GPIO_PORTB|GPIO_PIN7) + +/* GTIMA3 */ +#define GPIO_GTIMA3_ETR_0 (GPIO_ALT|GPIO_AF3|GPIO_FLOAT|GPIO_PORTD|GPIO_PIN11) +#define GPIO_GTIMA3_ETR_1 (GPIO_ALT|GPIO_AF6|GPIO_FLOAT|GPIO_PORTE|GPIO_PIN0) +#define GPIO_GTIMA3_CH1IN_0 (GPIO_ALT|GPIO_AF3|GPIO_FLOAT|GPIO_PORTD|GPIO_PIN12) +#define GPIO_GTIMA3_CH1IN_1 (GPIO_ALT|GPIO_AF5|GPIO_FLOAT|GPIO_PORTB|GPIO_PIN6) +#define GPIO_GTIMA3_CH1OUT_0 (GPIO_ALT|GPIO_AF3|GPIO_PUSHPULL|GPIO_PORTD|GPIO_PIN12) +#define GPIO_GTIMA3_CH1OUT_1 (GPIO_ALT|GPIO_AF5|GPIO_PUSHPULL|GPIO_PORTB|GPIO_PIN6) +#define GPIO_GTIMA3_CH2IN_0 (GPIO_ALT|GPIO_AF3|GPIO_FLOAT|GPIO_PORTD|GPIO_PIN13) +#define GPIO_GTIMA3_CH2IN_1 (GPIO_ALT|GPIO_AF6|GPIO_FLOAT|GPIO_PORTB|GPIO_PIN7) +#define GPIO_GTIMA3_CH2OUT_0 (GPIO_ALT|GPIO_AF3|GPIO_PUSHPULL|GPIO_PORTD|GPIO_PIN13) +#define GPIO_GTIMA3_CH2OUT_1 (GPIO_ALT|GPIO_AF6|GPIO_PUSHPULL|GPIO_PORTB|GPIO_PIN7) +#define GPIO_GTIMA3_CH3IN_0 (GPIO_ALT|GPIO_AF6|GPIO_FLOAT|GPIO_PORTD|GPIO_PIN14) +#define GPIO_GTIMA3_CH3IN_1 (GPIO_ALT|GPIO_AF7|GPIO_FLOAT|GPIO_PORTB|GPIO_PIN8) +#define GPIO_GTIMA3_CH3OUT_0 (GPIO_ALT|GPIO_AF6|GPIO_PUSHPULL|GPIO_PORTD|GPIO_PIN14) +#define GPIO_GTIMA3_CH3OUT_1 (GPIO_ALT|GPIO_AF7|GPIO_PUSHPULL|GPIO_PORTB|GPIO_PIN8) +#define GPIO_GTIMA3_CH4IN_0 (GPIO_ALT|GPIO_AF6|GPIO_FLOAT|GPIO_PORTD|GPIO_PIN15) +#define GPIO_GTIMA3_CH4IN_1 (GPIO_ALT|GPIO_AF6|GPIO_FLOAT|GPIO_PORTB|GPIO_PIN9) +#define GPIO_GTIMA3_CH4OUT_0 (GPIO_ALT|GPIO_AF6|GPIO_PUSHPULL|GPIO_PORTD|GPIO_PIN15) +#define GPIO_GTIMA3_CH4OUT_1 (GPIO_ALT|GPIO_AF6|GPIO_PUSHPULL|GPIO_PORTB|GPIO_PIN9) + +/* GTIMA4 */ +#define GPIO_GTIMA4_ETR_0 (GPIO_ALT|GPIO_AF10|GPIO_FLOAT|GPIO_PORTA|GPIO_PIN4) +#define GPIO_GTIMA4_ETR_1 (GPIO_ALT|GPIO_AF7|GPIO_FLOAT|GPIO_PORTH|GPIO_PIN8) +#define GPIO_GTIMA4_CH1IN_0 (GPIO_ALT|GPIO_AF8|GPIO_FLOAT|GPIO_PORTA|GPIO_PIN0) +#define GPIO_GTIMA4_CH1IN_1 (GPIO_ALT|GPIO_AF7|GPIO_FLOAT|GPIO_PORTH|GPIO_PIN10) +#define GPIO_GTIMA4_CH1OUT_0 (GPIO_ALT|GPIO_AF8|GPIO_PUSHPULL|GPIO_PORTA|GPIO_PIN0) +#define GPIO_GTIMA4_CH1OUT_1 (GPIO_ALT|GPIO_AF7|GPIO_PUSHPULL|GPIO_PORTH|GPIO_PIN10) +#define GPIO_GTIMA4_CH2IN_0 (GPIO_ALT|GPIO_AF5|GPIO_FLOAT|GPIO_PORTA|GPIO_PIN1) +#define GPIO_GTIMA4_CH2IN_1 (GPIO_ALT|GPIO_AF6|GPIO_FLOAT|GPIO_PORTH|GPIO_PIN11) +#define GPIO_GTIMA4_CH2OUT_0 (GPIO_ALT|GPIO_AF5|GPIO_PUSHPULL|GPIO_PORTA|GPIO_PIN1) +#define GPIO_GTIMA4_CH2OUT_1 (GPIO_ALT|GPIO_AF6|GPIO_PUSHPULL|GPIO_PORTH|GPIO_PIN11) +#define GPIO_GTIMA4_CH3IN_0 (GPIO_ALT|GPIO_AF4|GPIO_FLOAT|GPIO_PORTA|GPIO_PIN2) +#define GPIO_GTIMA4_CH3IN_1 (GPIO_ALT|GPIO_AF8|GPIO_FLOAT|GPIO_PORTH|GPIO_PIN12) +#define GPIO_GTIMA4_CH3OUT_0 (GPIO_ALT|GPIO_AF4|GPIO_PUSHPULL|GPIO_PORTA|GPIO_PIN2) +#define GPIO_GTIMA4_CH3OUT_1 (GPIO_ALT|GPIO_AF8|GPIO_PUSHPULL|GPIO_PORTH|GPIO_PIN12) +#define GPIO_GTIMA4_CH4IN_0 (GPIO_ALT|GPIO_AF8|GPIO_FLOAT|GPIO_PORTA|GPIO_PIN3) +#define GPIO_GTIMA4_CH4IN_1 (GPIO_ALT|GPIO_AF7|GPIO_FLOAT|GPIO_PORTI|GPIO_PIN0) +#define GPIO_GTIMA4_CH4OUT_0 (GPIO_ALT|GPIO_AF8|GPIO_PUSHPULL|GPIO_PORTA|GPIO_PIN3) +#define GPIO_GTIMA4_CH4OUT_1 (GPIO_ALT|GPIO_AF7|GPIO_PUSHPULL|GPIO_PORTI|GPIO_PIN0) + +/* GTIMA5 */ +#define GPIO_GTIMA5_ETR_0 (GPIO_ALT|GPIO_AF10|GPIO_FLOAT|GPIO_PORTB|GPIO_PIN2) +#define GPIO_GTIMA5_ETR_1 (GPIO_ALT|GPIO_AF5|GPIO_FLOAT|GPIO_PORTG|GPIO_PIN3) +#define GPIO_GTIMA5_CH1IN_0 (GPIO_ALT|GPIO_AF7|GPIO_FLOAT|GPIO_PORTF|GPIO_PIN0) +#define GPIO_GTIMA5_CH1IN_1 (GPIO_ALT|GPIO_AF8|GPIO_FLOAT|GPIO_PORTF|GPIO_PIN6) +#define GPIO_GTIMA5_CH1IN_2 (GPIO_ALT|GPIO_AF9|GPIO_FLOAT|GPIO_PORTG|GPIO_PIN12) +#define GPIO_GTIMA5_CH1OUT_0 (GPIO_ALT|GPIO_AF7|GPIO_PUSHPULL|GPIO_PORTF|GPIO_PIN0) +#define GPIO_GTIMA5_CH1OUT_1 (GPIO_ALT|GPIO_AF8|GPIO_PUSHPULL|GPIO_PORTF|GPIO_PIN6) +#define GPIO_GTIMA5_CH1OUT_2 (GPIO_ALT|GPIO_AF9|GPIO_PUSHPULL|GPIO_PORTG|GPIO_PIN12) +#define GPIO_GTIMA5_CH2IN_0 (GPIO_ALT|GPIO_AF8|GPIO_FLOAT|GPIO_PORTF|GPIO_PIN1) +#define GPIO_GTIMA5_CH2IN_1 (GPIO_ALT|GPIO_AF7|GPIO_FLOAT|GPIO_PORTF|GPIO_PIN7) +#define GPIO_GTIMA5_CH2IN_2 (GPIO_ALT|GPIO_AF7|GPIO_FLOAT|GPIO_PORTG|GPIO_PIN13) +#define GPIO_GTIMA5_CH2OUT_0 (GPIO_ALT|GPIO_AF8|GPIO_PUSHPULL|GPIO_PORTF|GPIO_PIN1) +#define GPIO_GTIMA5_CH2OUT_1 (GPIO_ALT|GPIO_AF7|GPIO_PUSHPULL|GPIO_PORTF|GPIO_PIN7) +#define GPIO_GTIMA5_CH2OUT_2 (GPIO_ALT|GPIO_AF7|GPIO_PUSHPULL|GPIO_PORTG|GPIO_PIN13) +#define GPIO_GTIMA5_CH3IN_0 (GPIO_ALT|GPIO_AF8|GPIO_FLOAT|GPIO_PORTF|GPIO_PIN2) +#define GPIO_GTIMA5_CH3IN_1 (GPIO_ALT|GPIO_AF8|GPIO_FLOAT|GPIO_PORTF|GPIO_PIN8) +#define GPIO_GTIMA5_CH3IN_2 (GPIO_ALT|GPIO_AF8|GPIO_FLOAT|GPIO_PORTG|GPIO_PIN14) +#define GPIO_GTIMA5_CH3OUT_0 (GPIO_ALT|GPIO_AF8|GPIO_PUSHPULL|GPIO_PORTF|GPIO_PIN2) +#define GPIO_GTIMA5_CH3OUT_1 (GPIO_ALT|GPIO_AF8|GPIO_PUSHPULL|GPIO_PORTF|GPIO_PIN8) +#define GPIO_GTIMA5_CH3OUT_2 (GPIO_ALT|GPIO_AF8|GPIO_PUSHPULL|GPIO_PORTG|GPIO_PIN14) +#define GPIO_GTIMA5_CH4IN_0 (GPIO_ALT|GPIO_AF8|GPIO_FLOAT|GPIO_PORTF|GPIO_PIN3) +#define GPIO_GTIMA5_CH4IN_1 (GPIO_ALT|GPIO_AF9|GPIO_FLOAT|GPIO_PORTF|GPIO_PIN9) +#define GPIO_GTIMA5_CH4OUT_0 (GPIO_ALT|GPIO_AF8|GPIO_PUSHPULL|GPIO_PORTF|GPIO_PIN3) +#define GPIO_GTIMA5_CH4OUT_1 (GPIO_ALT|GPIO_AF9|GPIO_PUSHPULL|GPIO_PORTF|GPIO_PIN9) + +/* GTIMA6 */ +#define GPIO_GTIMA6_ETR_0 (GPIO_ALT|GPIO_AF7|GPIO_FLOAT|GPIO_PORTG|GPIO_PIN2) +#define GPIO_GTIMA6_ETR_1 (GPIO_ALT|GPIO_AF9|GPIO_FLOAT|GPIO_PORTB|GPIO_PIN3) +#define GPIO_GTIMA6_CH1IN_0 (GPIO_ALT|GPIO_AF4|GPIO_FLOAT|GPIO_PORTF|GPIO_PIN11) +#define GPIO_GTIMA6_CH1OUT_0 (GPIO_ALT|GPIO_AF4|GPIO_PUSHPULL|GPIO_PORTF|GPIO_PIN11) +#define GPIO_GTIMA6_CH2IN_0 (GPIO_ALT|GPIO_AF5|GPIO_FLOAT|GPIO_PORTF|GPIO_PIN12) +#define GPIO_GTIMA6_CH2OUT_0 (GPIO_ALT|GPIO_AF5|GPIO_PUSHPULL|GPIO_PORTF|GPIO_PIN12) +#define GPIO_GTIMA6_CH3IN_0 (GPIO_ALT|GPIO_AF6|GPIO_FLOAT|GPIO_PORTF|GPIO_PIN13) +#define GPIO_GTIMA6_CH3OUT_0 (GPIO_ALT|GPIO_AF6|GPIO_PUSHPULL|GPIO_PORTF|GPIO_PIN13) +#define GPIO_GTIMA6_CH4IN_0 (GPIO_ALT|GPIO_AF5|GPIO_FLOAT|GPIO_PORTF|GPIO_PIN14) +#define GPIO_GTIMA6_CH4OUT_0 (GPIO_ALT|GPIO_AF5|GPIO_PUSHPULL|GPIO_PORTF|GPIO_PIN14) + +/* GTIMA7 */ +#define GPIO_GTIMA7_ETR_0 (GPIO_ALT|GPIO_AF5|GPIO_FLOAT|GPIO_PORTI|GPIO_PIN11) +#define GPIO_GTIMA7_ETR_1 (GPIO_ALT|GPIO_AF6|GPIO_FLOAT|GPIO_PORTI|GPIO_PIN14) +#define GPIO_GTIMA7_CH1IN_0 (GPIO_ALT|GPIO_AF7|GPIO_FLOAT|GPIO_PORTH|GPIO_PIN6) +#define GPIO_GTIMA7_CH1IN_1 (GPIO_ALT|GPIO_AF8|GPIO_FLOAT|GPIO_PORTB|GPIO_PIN14) +#define GPIO_GTIMA7_CH1OUT_0 (GPIO_ALT|GPIO_AF7|GPIO_PUSHPULL|GPIO_PORTH|GPIO_PIN6) +#define GPIO_GTIMA7_CH1OUT_1 (GPIO_ALT|GPIO_AF8|GPIO_PUSHPULL|GPIO_PORTB|GPIO_PIN14) +#define GPIO_GTIMA7_CH2IN_0 (GPIO_ALT|GPIO_AF6|GPIO_FLOAT|GPIO_PORTH|GPIO_PIN9) +#define GPIO_GTIMA7_CH2IN_1 (GPIO_ALT|GPIO_AF8|GPIO_FLOAT|GPIO_PORTB|GPIO_PIN15) +#define GPIO_GTIMA7_CH2OUT_0 (GPIO_ALT|GPIO_AF6|GPIO_PUSHPULL|GPIO_PORTH|GPIO_PIN9) +#define GPIO_GTIMA7_CH2OUT_1 (GPIO_ALT|GPIO_AF8|GPIO_PUSHPULL|GPIO_PORTB|GPIO_PIN15) +#define GPIO_GTIMA7_CH3IN_0 (GPIO_ALT|GPIO_AF5|GPIO_FLOAT|GPIO_PORTI|GPIO_PIN9) +#define GPIO_GTIMA7_CH3IN_1 (GPIO_ALT|GPIO_AF5|GPIO_FLOAT|GPIO_PORTI|GPIO_PIN12) +#define GPIO_GTIMA7_CH3OUT_0 (GPIO_ALT|GPIO_AF5|GPIO_PUSHPULL|GPIO_PORTI|GPIO_PIN9) +#define GPIO_GTIMA7_CH3OUT_1 (GPIO_ALT|GPIO_AF5|GPIO_PUSHPULL|GPIO_PORTI|GPIO_PIN12) +#define GPIO_GTIMA7_CH4IN_0 (GPIO_ALT|GPIO_AF6|GPIO_FLOAT|GPIO_PORTI|GPIO_PIN10) +#define GPIO_GTIMA7_CH4IN_1 (GPIO_ALT|GPIO_AF5|GPIO_FLOAT|GPIO_PORTI|GPIO_PIN13) +#define GPIO_GTIMA7_CH4OUT_0 (GPIO_ALT|GPIO_AF6|GPIO_PUSHPULL|GPIO_PORTI|GPIO_PIN10) +#define GPIO_GTIMA7_CH4OUT_1 (GPIO_ALT|GPIO_AF5|GPIO_PUSHPULL|GPIO_PORTI|GPIO_PIN13) + +/* GTIMB1 */ +#define GPIO_GTIMB1_ETR_0 (GPIO_ALT|GPIO_AF5|GPIO_FLOAT|GPIO_PORTE|GPIO_PIN2) +#define GPIO_GTIMB1_ETR_1 (GPIO_ALT|GPIO_AF8|GPIO_FLOAT|GPIO_PORTG|GPIO_PIN1) +#define GPIO_GTIMB1_CH1NIN_0 (GPIO_ALT|GPIO_AF5|GPIO_FLOAT|GPIO_PORTE|GPIO_PIN4) +#define GPIO_GTIMB1_CH1NIN_1 (GPIO_ALT|GPIO_AF6|GPIO_FLOAT|GPIO_PORTA|GPIO_PIN1) +#define GPIO_GTIMB1_CH1NOUT_0 (GPIO_ALT|GPIO_AF5|GPIO_PUSHPULL|GPIO_PORTE|GPIO_PIN4) +#define GPIO_GTIMB1_CH1NOUT_1 (GPIO_ALT|GPIO_AF5|GPIO_PUSHPULL|GPIO_PORTA|GPIO_PIN1) +#define GPIO_GTIMB1_CH1PIN_0 (GPIO_ALT|GPIO_AF5|GPIO_FLOAT|GPIO_PORTE|GPIO_PIN5) +#define GPIO_GTIMB1_CH1PIN_1 (GPIO_ALT|GPIO_AF5|GPIO_FLOAT|GPIO_PORTA|GPIO_PIN2) +#define GPIO_GTIMB1_CH1PIN_2 (GPIO_ALT|GPIO_AF9|GPIO_FLOAT|GPIO_PORTC|GPIO_PIN12) +#define GPIO_GTIMB1_CH1POUT_0 (GPIO_ALT|GPIO_AF5|GPIO_PUSHPULL|GPIO_PORTE|GPIO_PIN5) +#define GPIO_GTIMB1_CH1POUT_1 (GPIO_ALT|GPIO_AF5|GPIO_PUSHPULL|GPIO_PORTA|GPIO_PIN2) +#define GPIO_GTIMB1_CH1POUT_2 (GPIO_ALT|GPIO_AF9|GPIO_PUSHPULL|GPIO_PORTC|GPIO_PIN12) +#define GPIO_GTIMB1_CH2IN_0 (GPIO_ALT|GPIO_AF5|GPIO_FLOAT|GPIO_PORTE|GPIO_PIN6) +#define GPIO_GTIMB1_CH2IN_1 (GPIO_ALT|GPIO_AF9|GPIO_FLOAT|GPIO_PORTA|GPIO_PIN3) +#define GPIO_GTIMB1_CH2OUT_0 (GPIO_ALT|GPIO_AF5|GPIO_PUSHPULL|GPIO_PORTE|GPIO_PIN6) +#define GPIO_GTIMB1_CH2OUT_1 (GPIO_ALT|GPIO_AF9|GPIO_PUSHPULL|GPIO_PORTA|GPIO_PIN3) +#define GPIO_GTIMB1_CH3IN_0 (GPIO_ALT|GPIO_AF7|GPIO_FLOAT|GPIO_PORTE|GPIO_PIN0) +#define GPIO_GTIMB1_CH3OUT_0 (GPIO_ALT|GPIO_AF7|GPIO_PUSHPULL|GPIO_PORTE|GPIO_PIN0) +#define GPIO_GTIMB1_CH4IN_0 (GPIO_ALT|GPIO_AF6|GPIO_FLOAT|GPIO_PORTE|GPIO_PIN1) +#define GPIO_GTIMB1_CH4OUT_0 (GPIO_ALT|GPIO_AF6|GPIO_PUSHPULL|GPIO_PORTE|GPIO_PIN1) +#define GPIO_GTIMB1_BRK_0 (GPIO_ALT|GPIO_AF3|GPIO_FLOAT|GPIO_PORTE|GPIO_PIN3) +#define GPIO_GTIMB1_BRK_1 (GPIO_ALT|GPIO_AF9|GPIO_FLOAT|GPIO_PORTA|GPIO_PIN0) +#define GPIO_GTIMB1_BRK_2 (GPIO_ALT|GPIO_AF8|GPIO_FLOAT|GPIO_PORTD|GPIO_PIN2) + +/* GTIMB2 */ +#define GPIO_GTIMB2_ETR_0 (GPIO_ALT|GPIO_AF9|GPIO_FLOAT|GPIO_PORTF|GPIO_PIN2) +#define GPIO_GTIMB2_ETR_1 (GPIO_ALT|GPIO_AF5|GPIO_FLOAT|GPIO_PORTD|GPIO_PIN5) +#define GPIO_GTIMB2_CH1NIN_0 (GPIO_ALT|GPIO_AF9|GPIO_FLOAT|GPIO_PORTF|GPIO_PIN8) +#define GPIO_GTIMB2_CH1NIN_1 (GPIO_ALT|GPIO_AF5|GPIO_FLOAT|GPIO_PORTD|GPIO_PIN0) +#define GPIO_GTIMB2_CH1NIN_2 (GPIO_ALT|GPIO_AF6|GPIO_FLOAT|GPIO_PORTB|GPIO_PIN6) +#define GPIO_GTIMB2_CH1NOUT_0 (GPIO_ALT|GPIO_AF9|GPIO_PUSHPULL|GPIO_PORTF|GPIO_PIN8) +#define GPIO_GTIMB2_CH1NOUT_1 (GPIO_ALT|GPIO_AF4|GPIO_PUSHPULL|GPIO_PORTD|GPIO_PIN0) +#define GPIO_GTIMB2_CH1NOUT_2 (GPIO_ALT|GPIO_AF8|GPIO_PUSHPULL|GPIO_PORTB|GPIO_PIN6) +#define GPIO_GTIMB2_CH1PIN_0 (GPIO_ALT|GPIO_AF9|GPIO_FLOAT|GPIO_PORTF|GPIO_PIN6) +#define GPIO_GTIMB2_CH1PIN_1 (GPIO_ALT|GPIO_AF4|GPIO_FLOAT|GPIO_PORTD|GPIO_PIN1) +#define GPIO_GTIMB2_CH1PIN_2 (GPIO_ALT|GPIO_AF8|GPIO_FLOAT|GPIO_PORTB|GPIO_PIN8) +#define GPIO_GTIMB2_CH1POUT_0 (GPIO_ALT|GPIO_AF9|GPIO_PUSHPULL|GPIO_PORTF|GPIO_PIN6) +#define GPIO_GTIMB2_CH1POUT_1 (GPIO_ALT|GPIO_AF4|GPIO_PUSHPULL|GPIO_PORTD|GPIO_PIN1) +#define GPIO_GTIMB2_CH1POUT_2 (GPIO_ALT|GPIO_AF8|GPIO_PUSHPULL|GPIO_PORTB|GPIO_PIN8) +#define GPIO_GTIMB2_CH2IN_0 (GPIO_ALT|GPIO_AF8|GPIO_FLOAT|GPIO_PORTF|GPIO_PIN5) +#define GPIO_GTIMB2_CH2IN_1 (GPIO_ALT|GPIO_AF9|GPIO_FLOAT|GPIO_PORTD|GPIO_PIN2) +#define GPIO_GTIMB2_CH2OUT_0 (GPIO_ALT|GPIO_AF8|GPIO_PUSHPULL|GPIO_PORTF|GPIO_PIN5) +#define GPIO_GTIMB2_CH2OUT_1 (GPIO_ALT|GPIO_AF9|GPIO_PUSHPULL|GPIO_PORTD|GPIO_PIN2) +#define GPIO_GTIMB2_CH3IN_0 (GPIO_ALT|GPIO_AF9|GPIO_FLOAT|GPIO_PORTF|GPIO_PIN4) +#define GPIO_GTIMB2_CH3IN_1 (GPIO_ALT|GPIO_AF6|GPIO_FLOAT|GPIO_PORTD|GPIO_PIN3) +#define GPIO_GTIMB2_CH3OUT_0 (GPIO_ALT|GPIO_AF9|GPIO_PUSHPULL|GPIO_PORTF|GPIO_PIN4) +#define GPIO_GTIMB2_CH3OUT_1 (GPIO_ALT|GPIO_AF6|GPIO_PUSHPULL|GPIO_PORTD|GPIO_PIN3) +#define GPIO_GTIMB2_CH4IN_0 (GPIO_ALT|GPIO_AF9|GPIO_FLOAT|GPIO_PORTF|GPIO_PIN3) +#define GPIO_GTIMB2_CH4IN_1 (GPIO_ALT|GPIO_AF6|GPIO_FLOAT|GPIO_PORTD|GPIO_PIN4) +#define GPIO_GTIMB2_CH4OUT_0 (GPIO_ALT|GPIO_AF9|GPIO_PUSHPULL|GPIO_PORTF|GPIO_PIN3) +#define GPIO_GTIMB2_CH4OUT_1 (GPIO_ALT|GPIO_AF6|GPIO_PUSHPULL|GPIO_PORTD|GPIO_PIN4) +#define GPIO_GTIMB2_BRK_0 (GPIO_ALT|GPIO_AF7|GPIO_FLOAT|GPIO_PORTF|GPIO_PIN10) +#define GPIO_GTIMB2_BRK_1 (GPIO_ALT|GPIO_AF11|GPIO_FLOAT|GPIO_PORTB|GPIO_PIN4) + +/* GTIMB3 */ +#define GPIO_GTIMB3_ETR_0 (GPIO_ALT|GPIO_AF5|GPIO_FLOAT|GPIO_PORTH|GPIO_PIN5) +#define GPIO_GTIMB3_ETR_1 (GPIO_ALT|GPIO_AF5|GPIO_FLOAT|GPIO_PORTI|GPIO_PIN15) +#define GPIO_GTIMB3_CH1NIN_0 (GPIO_ALT|GPIO_AF10|GPIO_FLOAT|GPIO_PORTF|GPIO_PIN9) +#define GPIO_GTIMB3_CH1NIN_2 (GPIO_ALT|GPIO_AF7|GPIO_FLOAT|GPIO_PORTB|GPIO_PIN7) +#define GPIO_GTIMB3_CH1NOUT_0 (GPIO_ALT|GPIO_AF10|GPIO_PUSHPULL|GPIO_PORTF|GPIO_PIN9) +#define GPIO_GTIMB3_CH1NOUT_2 (GPIO_ALT|GPIO_AF7|GPIO_PUSHPULL|GPIO_PORTB|GPIO_PIN7) +#define GPIO_GTIMB3_CH1PIN_0 (GPIO_ALT|GPIO_AF8|GPIO_FLOAT|GPIO_PORTF|GPIO_PIN7) +#define GPIO_GTIMB3_CH1PIN_2 (GPIO_ALT|GPIO_AF7|GPIO_FLOAT|GPIO_PORTB|GPIO_PIN9) +#define GPIO_GTIMB3_CH1POUT_0 (GPIO_ALT|GPIO_AF8|GPIO_PUSHPULL|GPIO_PORTF|GPIO_PIN7) +#define GPIO_GTIMB3_CH1POUT_2 (GPIO_ALT|GPIO_AF7|GPIO_PUSHPULL|GPIO_PORTB|GPIO_PIN9) +#define GPIO_GTIMB3_CH2IN_0 (GPIO_ALT|GPIO_AF7|GPIO_FLOAT|GPIO_PORTH|GPIO_PIN2) +#define GPIO_GTIMB3_CH2OUT_0 (GPIO_ALT|GPIO_AF7|GPIO_PUSHPULL|GPIO_PORTH|GPIO_PIN2) +#define GPIO_GTIMB3_CH3IN_0 (GPIO_ALT|GPIO_AF6|GPIO_FLOAT|GPIO_PORTH|GPIO_PIN3) +#define GPIO_GTIMB3_CH3OUT_0 (GPIO_ALT|GPIO_AF6|GPIO_PUSHPULL|GPIO_PORTH|GPIO_PIN3) +#define GPIO_GTIMB3_CH4IN_0 (GPIO_ALT|GPIO_AF5|GPIO_FLOAT|GPIO_PORTH|GPIO_PIN4) +#define GPIO_GTIMB3_CH4OUT_0 (GPIO_ALT|GPIO_AF5|GPIO_PUSHPULL|GPIO_PORTH|GPIO_PIN4) +#define GPIO_GTIMB3_BRK_0 (GPIO_ALT|GPIO_AF6|GPIO_FLOAT|GPIO_PORTG|GPIO_PIN6) +#define GPIO_GTIMB3_BRK_1 (GPIO_ALT|GPIO_AF9|GPIO_FLOAT|GPIO_PORTB|GPIO_PIN5) + +/* LPTIM1 */ +#define GPIO_LPTIM1_ETR_0 (GPIO_ALT|GPIO_AF9|GPIO_FLOAT|GPIO_PORTG|GPIO_PIN14) +#define GPIO_LPTIM1_ETR_1 (GPIO_ALT|GPIO_AF8|GPIO_FLOAT|GPIO_PORTE|GPIO_PIN0) +#define GPIO_LPTIM1_IN1_0 (GPIO_ALT|GPIO_AF4|GPIO_FLOAT|GPIO_PORTD|GPIO_PIN12) +#define GPIO_LPTIM1_IN1_1 (GPIO_ALT|GPIO_AF10|GPIO_FLOAT|GPIO_PORTG|GPIO_PIN12) +#define GPIO_LPTIM1_IN2_0 (GPIO_ALT|GPIO_AF8|GPIO_FLOAT|GPIO_PORTH|GPIO_PIN2) +#define GPIO_LPTIM1_IN2_1 (GPIO_ALT|GPIO_AF8|GPIO_FLOAT|GPIO_PORTG|GPIO_PIN11) +#define GPIO_LPTIM1_IN2_2 (GPIO_ALT|GPIO_AF7|GPIO_FLOAT|GPIO_PORTE|GPIO_PIN1) +#define GPIO_LPTIM1_OUT_0 (GPIO_ALT|GPIO_AF4|GPIO_PUSHPULL|GPIO_PORTD|GPIO_PIN13) +#define GPIO_LPTIM1_OUT_1 (GPIO_ALT|GPIO_AF8|GPIO_PUSHPULL|GPIO_PORTG|GPIO_PIN13) + +/* LPTIM2 */ +#define GPIO_LPTIM2_ETR_0 (GPIO_ALT|GPIO_AF5|GPIO_FLOAT|GPIO_PORTB|GPIO_PIN11) +#define GPIO_LPTIM2_ETR_1 (GPIO_ALT|GPIO_AF9|GPIO_FLOAT|GPIO_PORTE|GPIO_PIN0) +#define GPIO_LPTIM2_IN1_0 (GPIO_ALT|GPIO_AF8|GPIO_FLOAT|GPIO_PORTB|GPIO_PIN10) +#define GPIO_LPTIM2_IN1_1 (GPIO_ALT|GPIO_AF5|GPIO_FLOAT|GPIO_PORTD|GPIO_PIN12) +#define GPIO_LPTIM2_IN2_0 (GPIO_ALT|GPIO_AF7|GPIO_FLOAT|GPIO_PORTB|GPIO_PIN12) +#define GPIO_LPTIM2_IN2_1 (GPIO_ALT|GPIO_AF4|GPIO_FLOAT|GPIO_PORTD|GPIO_PIN11) +#define GPIO_LPTIM2_OUT_0 (GPIO_ALT|GPIO_AF7|GPIO_PUSHPULL|GPIO_PORTB|GPIO_PIN13) +#define GPIO_LPTIM2_OUT_1 (GPIO_ALT|GPIO_AF6|GPIO_PUSHPULL|GPIO_PORTD|GPIO_PIN10) + +/* LPTIM3 */ +#define GPIO_LPTIM3_ETR_0 (GPIO_ALT|GPIO_AF7|GPIO_FLOAT|GPIO_PORTI|GPIO_PIN10) +#define GPIO_LPTIM3_IN1_0 (GPIO_ALT|GPIO_AF4|GPIO_FLOAT|GPIO_PORTI|GPIO_PIN8) +#define GPIO_LPTIM3_IN2_0 (GPIO_ALT|GPIO_AF6|GPIO_FLOAT|GPIO_PORTI|GPIO_PIN9) +#define GPIO_LPTIM3_OUT_0 (GPIO_ALT|GPIO_AF7|GPIO_PUSHPULL|GPIO_PORTA|GPIO_PIN1) + +/* LPTIM4 */ +#define GPIO_LPTIM4_ETR_0 (GPIO_ALT|GPIO_AF6|GPIO_FLOAT|GPIO_PORTF|GPIO_PIN15) +#define GPIO_LPTIM4_IN1_0 (GPIO_ALT|GPIO_AF8|GPIO_FLOAT|GPIO_PORTG|GPIO_PIN0) +#define GPIO_LPTIM4_IN2_0 (GPIO_ALT|GPIO_AF9|GPIO_FLOAT|GPIO_PORTG|GPIO_PIN1) +#define GPIO_LPTIM4_OUT_0 (GPIO_ALT|GPIO_AF6|GPIO_PUSHPULL|GPIO_PORTA|GPIO_PIN2) + +/* LPTIM5 */ +#define GPIO_LPTIM5_IN1_0 (GPIO_ALT|GPIO_AF8|GPIO_FLOAT|GPIO_PORTH|GPIO_PIN6) +#define GPIO_LPTIM5_IN2_0 (GPIO_ALT|GPIO_AF6|GPIO_FLOAT|GPIO_PORTH|GPIO_PIN7) +#define GPIO_LPTIM5_OUT_0 (GPIO_ALT|GPIO_AF10|GPIO_PUSHPULL|GPIO_PORTA|GPIO_PIN3) + +/* FDCAN1 */ +#define GPIO_FDCAN1_TX_0 (GPIO_ALT|GPIO_AF5|GPIO_PUSHPULL|GPIO_PORTI|GPIO_PIN8) +#define GPIO_FDCAN1_TX_1 (GPIO_ALT|GPIO_AF7|GPIO_PUSHPULL|GPIO_PORTH|GPIO_PIN13) +#define GPIO_FDCAN1_TX_2 (GPIO_ALT|GPIO_AF9|GPIO_PUSHPULL|GPIO_PORTB|GPIO_PIN9) +#define GPIO_FDCAN1_TX_3 (GPIO_ALT|GPIO_AF10|GPIO_PUSHPULL|GPIO_PORTB|GPIO_PIN8) +#define GPIO_FDCAN1_RX_0 (GPIO_ALT|GPIO_AF9|GPIO_PUSHPULL|GPIO_PORTA|GPIO_PIN12) +#define GPIO_FDCAN1_RX_1 (GPIO_ALT|GPIO_AF6|GPIO_PUSHPULL|GPIO_PORTD|GPIO_PIN1) +#define GPIO_FDCAN1_RX_2 (GPIO_ALT|GPIO_AF8|GPIO_PUSHPULL|GPIO_PORTI|GPIO_PIN9) +#define GPIO_FDCAN1_RX_3 (GPIO_ALT|GPIO_AF9|GPIO_PUSHPULL|GPIO_PORTA|GPIO_PIN11) + +/* FDCAN2 */ +#define GPIO_FDCAN2_TX_0 (GPIO_ALT|GPIO_AF9|GPIO_PUSHPULL|GPIO_PORTH|GPIO_PIN9) +#define GPIO_FDCAN2_TX_1 (GPIO_ALT|GPIO_AF10|GPIO_PUSHPULL|GPIO_PORTB|GPIO_PIN13) +#define GPIO_FDCAN2_TX_2 (GPIO_ALT|GPIO_AF10|GPIO_PUSHPULL|GPIO_PORTB|GPIO_PIN6) +#define GPIO_FDCAN2_RX_0 (GPIO_ALT|GPIO_AF10|GPIO_PUSHPULL|GPIO_PORTH|GPIO_PIN8) +#define GPIO_FDCAN2_RX_1 (GPIO_ALT|GPIO_AF10|GPIO_PUSHPULL|GPIO_PORTB|GPIO_PIN12) +#define GPIO_FDCAN2_RX_2 (GPIO_ALT|GPIO_AF11|GPIO_PUSHPULL|GPIO_PORTB|GPIO_PIN5) + +/* FDCAN3 */ +#define GPIO_FDCAN3_TX_0 (GPIO_ALT|GPIO_AF10|GPIO_PUSHPULL|GPIO_PORTF|GPIO_PIN7) +#define GPIO_FDCAN3_TX_1 (GPIO_ALT|GPIO_AF8|GPIO_PUSHPULL|GPIO_PORTF|GPIO_PIN15) +#define GPIO_FDCAN3_TX_2 (GPIO_ALT|GPIO_AF7|GPIO_PUSHPULL|GPIO_PORTD|GPIO_PIN13) +#define GPIO_FDCAN3_TX_3 (GPIO_ALT|GPIO_AF8|GPIO_PUSHPULL|GPIO_PORTG|GPIO_PIN9) +#define GPIO_FDCAN3_RX_0 (GPIO_ALT|GPIO_AF11|GPIO_PUSHPULL|GPIO_PORTF|GPIO_PIN6) +#define GPIO_FDCAN3_RX_1 (GPIO_ALT|GPIO_AF7|GPIO_PUSHPULL|GPIO_PORTF|GPIO_PIN14) +#define GPIO_FDCAN3_RX_2 (GPIO_ALT|GPIO_AF9|GPIO_PUSHPULL|GPIO_PORTD|GPIO_PIN12) +#define GPIO_FDCAN3_RX_3 (GPIO_ALT|GPIO_AF11|GPIO_PUSHPULL|GPIO_PORTG|GPIO_PIN10) + +/* FDCAN4 */ +#define GPIO_FDCAN4_TX_0 (GPIO_ALT|GPIO_AF7|GPIO_PUSHPULL|GPIO_PORTE|GPIO_PIN2) +#define GPIO_FDCAN4_TX_1 (GPIO_ALT|GPIO_AF8|GPIO_PUSHPULL|GPIO_PORTI|GPIO_PIN10) +#define GPIO_FDCAN4_TX_2 (GPIO_ALT|GPIO_AF9|GPIO_PUSHPULL|GPIO_PORTF|GPIO_PIN0) +#define GPIO_FDCAN4_RX_0 (GPIO_ALT|GPIO_AF5|GPIO_PUSHPULL|GPIO_PORTE|GPIO_PIN3) +#define GPIO_FDCAN4_RX_1 (GPIO_ALT|GPIO_AF6|GPIO_PUSHPULL|GPIO_PORTI|GPIO_PIN11) +#define GPIO_FDCAN4_RX_2 (GPIO_ALT|GPIO_AF10|GPIO_PUSHPULL|GPIO_PORTF|GPIO_PIN1) + +/* USART1 */ +#define GPIO_USART1_TX_0 (GPIO_ALT|GPIO_AF8|GPIO_PUSHPULL|GPIO_PULLUP|GPIO_PORTF|GPIO_PIN0) +#define GPIO_USART1_TX_1 (GPIO_ALT|GPIO_AF9|GPIO_PUSHPULL|GPIO_PULLUP|GPIO_PORTB|GPIO_PIN14) +#define GPIO_USART1_TX_2 (GPIO_ALT|GPIO_AF7|GPIO_PUSHPULL|GPIO_PULLUP|GPIO_PORTA|GPIO_PIN9) +#define GPIO_USART1_TX_3 (GPIO_ALT|GPIO_AF7|GPIO_PUSHPULL|GPIO_PULLUP|GPIO_PORTB|GPIO_PIN6) +#define GPIO_USART1_RX_0 (GPIO_ALT|GPIO_AF9|GPIO_PULLUP|GPIO_PORTF|GPIO_PIN1) +#define GPIO_USART1_RX_1 (GPIO_ALT|GPIO_AF9|GPIO_PULLUP|GPIO_PORTB|GPIO_PIN15) +#define GPIO_USART1_RX_2 (GPIO_ALT|GPIO_AF5|GPIO_PULLUP|GPIO_PORTA|GPIO_PIN10) +#define GPIO_USART1_RX_3 (GPIO_ALT|GPIO_AF8|GPIO_PULLUP|GPIO_PORTB|GPIO_PIN7) +#define GPIO_USART1_CK_0 (GPIO_ALT|GPIO_AF10|GPIO_PORTF|GPIO_PIN2) +#define GPIO_USART1_CK_1 (GPIO_ALT|GPIO_AF6|GPIO_PORTA|GPIO_PIN8) +#define GPIO_USART1_CTS_0 (GPIO_ALT|GPIO_AF10|GPIO_PORTF|GPIO_PIN3) +#define GPIO_USART1_CTS_1 (GPIO_ALT|GPIO_AF6|GPIO_PORTA|GPIO_PIN11) +#define GPIO_USART1_RTS_DE_0 (GPIO_ALT|GPIO_AF10|GPIO_PORTF|GPIO_PIN4) +#define GPIO_USART1_RTS_DE_1 (GPIO_ALT|GPIO_AF6|GPIO_PORTA|GPIO_PIN12) + +/* USART2 */ +#define GPIO_USART2_TX_0 (GPIO_ALT|GPIO_AF7|GPIO_PUSHPULL|GPIO_PULLUP|GPIO_PORTA|GPIO_PIN2) +#define GPIO_USART2_TX_1 (GPIO_ALT|GPIO_AF6|GPIO_PUSHPULL|GPIO_PULLUP|GPIO_PORTD|GPIO_PIN5) +#define GPIO_USART2_RX_0 (GPIO_ALT|GPIO_AF11|GPIO_PULLUP|GPIO_PORTA|GPIO_PIN3) +#define GPIO_USART2_RX_1 (GPIO_ALT|GPIO_AF7|GPIO_PULLUP|GPIO_PORTD|GPIO_PIN6) +#define GPIO_USART2_CK_0 (GPIO_ALT|GPIO_AF11|GPIO_PORTA|GPIO_PIN4) +#define GPIO_USART2_CK_1 (GPIO_ALT|GPIO_AF7|GPIO_PORTD|GPIO_PIN7) +#define GPIO_USART2_CTS_0 (GPIO_ALT|GPIO_AF10|GPIO_PORTA|GPIO_PIN0) +#define GPIO_USART2_CTS_1 (GPIO_ALT|GPIO_AF7|GPIO_PORTD|GPIO_PIN3) +#define GPIO_USART2_RTS_DE_0 (GPIO_ALT|GPIO_AF8|GPIO_PORTA|GPIO_PIN1) +#define GPIO_USART2_RTS_DE_1 (GPIO_ALT|GPIO_AF7|GPIO_PORTD|GPIO_PIN4) + +/* USART3 */ +#define GPIO_USART3_TX_0 (GPIO_ALT|GPIO_AF9|GPIO_PUSHPULL|GPIO_PULLUP|GPIO_PORTB|GPIO_PIN10) +#define GPIO_USART3_TX_1 (GPIO_ALT|GPIO_AF6|GPIO_PUSHPULL|GPIO_PULLUP|GPIO_PORTD|GPIO_PIN8) +#define GPIO_USART3_TX_2 (GPIO_ALT|GPIO_AF7|GPIO_PUSHPULL|GPIO_PULLUP|GPIO_PORTC|GPIO_PIN10) +#define GPIO_USART3_RX_0 (GPIO_ALT|GPIO_AF6|GPIO_PULLUP|GPIO_PORTB|GPIO_PIN11) +#define GPIO_USART3_RX_1 (GPIO_ALT|GPIO_AF5|GPIO_PULLUP|GPIO_PORTD|GPIO_PIN9) +#define GPIO_USART3_RX_2 (GPIO_ALT|GPIO_AF7|GPIO_PULLUP|GPIO_PORTC|GPIO_PIN11) +#define GPIO_USART3_CK_0 (GPIO_ALT|GPIO_AF8|GPIO_PORTA|GPIO_PIN12) +#define GPIO_USART3_CK_1 (GPIO_ALT|GPIO_AF10|GPIO_PORTC|GPIO_PIN12) +#define GPIO_USART3_CK_2 (GPIO_ALT|GPIO_AF6|GPIO_PORTD|GPIO_PIN12) +#define GPIO_USART3_CTS_0 (GPIO_ALT|GPIO_AF8|GPIO_PORTA|GPIO_PIN11) +#define GPIO_USART3_CTS_1 (GPIO_ALT|GPIO_AF7|GPIO_PORTD|GPIO_PIN10) +#define GPIO_USART3_RTS_DE_0 (GPIO_ALT|GPIO_AF5|GPIO_PORTA|GPIO_PIN1) +#define GPIO_USART3_RTS_DE_1 (GPIO_ALT|GPIO_AF10|GPIO_PORTB|GPIO_PIN14) + +/* USART4 */ +#define GPIO_USART4_TX_0 (GPIO_ALT|GPIO_AF10|GPIO_PUSHPULL|GPIO_PULLUP|GPIO_PORTC|GPIO_PIN6) +#define GPIO_USART4_TX_1 (GPIO_ALT|GPIO_AF10|GPIO_PUSHPULL|GPIO_PULLUP|GPIO_PORTG|GPIO_PIN14) +#define GPIO_USART4_RX_0 (GPIO_ALT|GPIO_AF10|GPIO_PULLUP|GPIO_PORTC|GPIO_PIN7) +#define GPIO_USART4_RX_1 (GPIO_ALT|GPIO_AF7|GPIO_PULLUP|GPIO_PORTG|GPIO_PIN9) +#define GPIO_USART4_CK_0 (GPIO_ALT|GPIO_AF6|GPIO_PORTG|GPIO_PIN7) +#define GPIO_USART4_CK_1 (GPIO_ALT|GPIO_AF7|GPIO_PORTC|GPIO_PIN8) +#define GPIO_USART4_CTS_0 (GPIO_ALT|GPIO_AF9|GPIO_PORTG|GPIO_PIN13) +#define GPIO_USART4_CTS_1 (GPIO_ALT|GPIO_AF5|GPIO_PORTG|GPIO_PIN15) +#define GPIO_USART4_RTS_DE_0 (GPIO_ALT|GPIO_AF7|GPIO_PORTG|GPIO_PIN8) +#define GPIO_USART4_RTS_DE_1 (GPIO_ALT|GPIO_AF11|GPIO_PORTG|GPIO_PIN12) + +/* USART5 */ +#define GPIO_USART5_TX_0 (GPIO_ALT|GPIO_AF4|GPIO_PUSHPULL|GPIO_PULLUP|GPIO_PORTE|GPIO_PIN3) +#define GPIO_USART5_TX_1 (GPIO_ALT|GPIO_AF12|GPIO_PUSHPULL|GPIO_PULLUP|GPIO_PORTG|GPIO_PIN12) +#define GPIO_USART5_RX_0 (GPIO_ALT|GPIO_AF6|GPIO_PULLUP|GPIO_PORTE|GPIO_PIN2) +#define GPIO_USART5_RX_1 (GPIO_ALT|GPIO_AF9|GPIO_PULLUP|GPIO_PORTG|GPIO_PIN11) +#define GPIO_USART5_CK_0 (GPIO_ALT|GPIO_AF5|GPIO_PORTE|GPIO_PIN15) +#define GPIO_USART5_CK_1 (GPIO_ALT|GPIO_AF6|GPIO_PORTG|GPIO_PIN15) +#define GPIO_USART5_CTS_0 (GPIO_ALT|GPIO_AF10|GPIO_PORTG|GPIO_PIN13) +#define GPIO_USART5_RTS_DE_0 (GPIO_ALT|GPIO_AF11|GPIO_PORTG|GPIO_PIN14) + +/* USART6 */ +#define GPIO_USART6_TX_0 (GPIO_ALT|GPIO_AF6|GPIO_PUSHPULL|GPIO_PULLUP|GPIO_PORTE|GPIO_PIN5) +#define GPIO_USART6_TX_1 (GPIO_ALT|GPIO_AF8|GPIO_PUSHPULL|GPIO_PULLUP|GPIO_PORTH|GPIO_PIN15) +#define GPIO_USART6_RX_0 (GPIO_ALT|GPIO_AF6|GPIO_PULLUP|GPIO_PORTE|GPIO_PIN4) +#define GPIO_USART6_RX_1 (GPIO_ALT|GPIO_AF7|GPIO_PULLUP|GPIO_PORTH|GPIO_PIN14) +#define GPIO_USART6_CK_0 (GPIO_ALT|GPIO_AF7|GPIO_PORTE|GPIO_PIN14) +#define GPIO_USART6_CTS_0 (GPIO_ALT|GPIO_AF8|GPIO_PORTG|GPIO_PIN4) +#define GPIO_USART6_RTS_DE_0 (GPIO_ALT|GPIO_AF9|GPIO_PORTG|GPIO_PIN5) + +/* USART7 */ +#define GPIO_USART7_TX_0 (GPIO_ALT|GPIO_AF6|GPIO_PUSHPULL|GPIO_PULLUP|GPIO_PORTH|GPIO_PIN5) +#define GPIO_USART7_TX_1 (GPIO_ALT|GPIO_AF7|GPIO_PUSHPULL|GPIO_PULLUP|GPIO_PORTF|GPIO_PIN15) +#define GPIO_USART7_RX_0 (GPIO_ALT|GPIO_AF6|GPIO_PULLUP|GPIO_PORTH|GPIO_PIN4) +#define GPIO_USART7_RX_1 (GPIO_ALT|GPIO_AF6|GPIO_PULLUP|GPIO_PORTF|GPIO_PIN14) +#define GPIO_USART7_CK_0 (GPIO_ALT|GPIO_AF7|GPIO_PORTH|GPIO_PIN3) +#define GPIO_USART7_CK_1 (GPIO_ALT|GPIO_AF7|GPIO_PORTF|GPIO_PIN13) +#define GPIO_USART7_CTS_0 (GPIO_ALT|GPIO_AF8|GPIO_PORTG|GPIO_PIN2) +#define GPIO_USART7_RTS_DE_0 (GPIO_ALT|GPIO_AF6|GPIO_PORTG|GPIO_PIN3) + +/* UART9 */ +#define GPIO_UART9_TX_0 (GPIO_ALT|GPIO_AF11|GPIO_PUSHPULL|GPIO_PULLUP|GPIO_PORTA|GPIO_PIN0) +#define GPIO_UART9_TX_1 (GPIO_ALT|GPIO_AF7|GPIO_PUSHPULL|GPIO_PULLUP|GPIO_PORTA|GPIO_PIN12) +#define GPIO_UART9_TX_2 (GPIO_ALT|GPIO_AF6|GPIO_PUSHPULL|GPIO_PULLUP|GPIO_PORTH|GPIO_PIN13) +#define GPIO_UART9_TX_3 (GPIO_ALT|GPIO_AF8|GPIO_PUSHPULL|GPIO_PULLUP|GPIO_PORTC|GPIO_PIN10) +#define GPIO_UART9_TX_4 (GPIO_ALT|GPIO_AF5|GPIO_PUSHPULL|GPIO_PULLUP|GPIO_PORTD|GPIO_PIN1) +#define GPIO_UART9_TX_5 (GPIO_ALT|GPIO_AF8|GPIO_PUSHPULL|GPIO_PULLUP|GPIO_PORTB|GPIO_PIN9) +#define GPIO_UART9_RX_0 (GPIO_ALT|GPIO_AF7|GPIO_PULLUP|GPIO_PORTI|GPIO_PIN9) +#define GPIO_UART9_RX_1 (GPIO_ALT|GPIO_AF9|GPIO_PULLUP|GPIO_PORTA|GPIO_PIN1) +#define GPIO_UART9_RX_2 (GPIO_ALT|GPIO_AF7|GPIO_PULLUP|GPIO_PORTA|GPIO_PIN11) +#define GPIO_UART9_RX_3 (GPIO_ALT|GPIO_AF8|GPIO_PULLUP|GPIO_PORTH|GPIO_PIN14) +#define GPIO_UART9_RX_4 (GPIO_ALT|GPIO_AF8|GPIO_PULLUP|GPIO_PORTC|GPIO_PIN11) +#define GPIO_UART9_RX_5 (GPIO_ALT|GPIO_AF6|GPIO_PULLUP|GPIO_PORTD|GPIO_PIN0) +#define GPIO_UART9_RX_6 (GPIO_ALT|GPIO_AF9|GPIO_PULLUP|GPIO_PORTB|GPIO_PIN8) +#define GPIO_UART9_CTS_0 (GPIO_ALT|GPIO_AF8|GPIO_PORTB|GPIO_PIN0) +#define GPIO_UART9_CTS_1 (GPIO_ALT|GPIO_AF10|GPIO_PORTB|GPIO_PIN15) +#define GPIO_UART9_RTS_DE_0 (GPIO_ALT|GPIO_AF11|GPIO_PORTB|GPIO_PIN14) +#define GPIO_UART9_RTS_DE_1 (GPIO_ALT|GPIO_AF11|GPIO_PORTA|GPIO_PIN15) + +/* UART10 */ +#define GPIO_UART10_TX_0 (GPIO_ALT|GPIO_AF9|GPIO_PUSHPULL|GPIO_PULLUP|GPIO_PORTH|GPIO_PIN12) +#define GPIO_UART10_TX_1 (GPIO_ALT|GPIO_AF9|GPIO_PUSHPULL|GPIO_PULLUP|GPIO_PORTB|GPIO_PIN13) +#define GPIO_UART10_TX_2 (GPIO_ALT|GPIO_AF11|GPIO_PUSHPULL|GPIO_PULLUP|GPIO_PORTC|GPIO_PIN12) +#define GPIO_UART10_TX_3 (GPIO_ALT|GPIO_AF8|GPIO_PUSHPULL|GPIO_PULLUP|GPIO_PORTB|GPIO_PIN6) +#define GPIO_UART10_RX_0 (GPIO_ALT|GPIO_AF7|GPIO_PULLUP|GPIO_PORTH|GPIO_PIN11) +#define GPIO_UART10_RX_1 (GPIO_ALT|GPIO_AF9|GPIO_PULLUP|GPIO_PORTB|GPIO_PIN12) +#define GPIO_UART10_RX_2 (GPIO_ALT|GPIO_AF10|GPIO_PULLUP|GPIO_PORTD|GPIO_PIN2) +#define GPIO_UART10_RX_3 (GPIO_ALT|GPIO_AF10|GPIO_PULLUP|GPIO_PORTB|GPIO_PIN5) +#define GPIO_UART10_CTS_0 (GPIO_ALT|GPIO_AF7|GPIO_PORTH|GPIO_PIN9) +#define GPIO_UART10_CTS_1 (GPIO_ALT|GPIO_AF11|GPIO_PORTC|GPIO_PIN9) +#define GPIO_UART10_RTS_DE_0 (GPIO_ALT|GPIO_AF8|GPIO_PORTH|GPIO_PIN8) +#define GPIO_UART10_RTS_DE_1 (GPIO_ALT|GPIO_AF8|GPIO_PORTC|GPIO_PIN8) + +/* UART11 */ +#define GPIO_UART11_TX_0 (GPIO_ALT|GPIO_AF9|GPIO_PUSHPULL|GPIO_PULLUP|GPIO_PORTF|GPIO_PIN7) +#define GPIO_UART11_TX_1 (GPIO_ALT|GPIO_AF7|GPIO_PUSHPULL|GPIO_PULLUP|GPIO_PORTE|GPIO_PIN8) +#define GPIO_UART11_TX_2 (GPIO_ALT|GPIO_AF12|GPIO_PUSHPULL|GPIO_PULLUP|GPIO_PORTA|GPIO_PIN15) +#define GPIO_UART11_TX_3 (GPIO_ALT|GPIO_AF12|GPIO_PUSHPULL|GPIO_PULLUP|GPIO_PORTB|GPIO_PIN4) +#define GPIO_UART11_RX_0 (GPIO_ALT|GPIO_AF10|GPIO_PULLUP|GPIO_PORTF|GPIO_PIN6) +#define GPIO_UART11_RX_1 (GPIO_ALT|GPIO_AF7|GPIO_PULLUP|GPIO_PORTE|GPIO_PIN7) +#define GPIO_UART11_RX_2 (GPIO_ALT|GPIO_AF7|GPIO_PULLUP|GPIO_PORTA|GPIO_PIN8) +#define GPIO_UART11_RX_3 (GPIO_ALT|GPIO_AF10|GPIO_PULLUP|GPIO_PORTB|GPIO_PIN3) +#define GPIO_UART11_CTS_0 (GPIO_ALT|GPIO_AF11|GPIO_PORTF|GPIO_PIN9) +#define GPIO_UART11_CTS_1 (GPIO_ALT|GPIO_AF6|GPIO_PORTE|GPIO_PIN10) +#define GPIO_UART11_RTS_DE_0 (GPIO_ALT|GPIO_AF10|GPIO_PORTF|GPIO_PIN8) +#define GPIO_UART11_RTS_DE_1 (GPIO_ALT|GPIO_AF7|GPIO_PORTE|GPIO_PIN9) + +/* UART12 */ +#define GPIO_UART12_TX_0 (GPIO_ALT|GPIO_AF7|GPIO_PUSHPULL|GPIO_PULLUP|GPIO_PORTD|GPIO_PIN12) +#define GPIO_UART12_TX_2 (GPIO_ALT|GPIO_AF8|GPIO_PUSHPULL|GPIO_PULLUP|GPIO_PORTE|GPIO_PIN1) +#define GPIO_UART12_RX_2 (GPIO_ALT|GPIO_AF5|GPIO_PULLUP|GPIO_PORTD|GPIO_PIN13) +#define GPIO_UART12_RX_1 (GPIO_ALT|GPIO_AF10|GPIO_PULLUP|GPIO_PORTE|GPIO_PIN0) +#define GPIO_UART12_CTS_0 (GPIO_ALT|GPIO_AF7|GPIO_PORTD|GPIO_PIN14) +#define GPIO_UART12_RTS_DE_0 (GPIO_ALT|GPIO_AF7|GPIO_PORTD|GPIO_PIN15) + +/* UART13 */ +#define GPIO_UART13_TX_0 (GPIO_ALT|GPIO_AF10|GPIO_PUSHPULL|GPIO_PULLUP|GPIO_PORTG|GPIO_PIN1) +#define GPIO_UART13_TX_1 (GPIO_ALT|GPIO_AF6|GPIO_PUSHPULL|GPIO_PULLUP|GPIO_PORTE|GPIO_PIN13) +#define GPIO_UART13_TX_2 (GPIO_ALT|GPIO_AF8|GPIO_PUSHPULL|GPIO_PULLUP|GPIO_PORTD|GPIO_PIN15) +#define GPIO_UART13_RX_0 (GPIO_ALT|GPIO_AF9|GPIO_PULLUP|GPIO_PORTG|GPIO_PIN0) +#define GPIO_UART13_RX_1 (GPIO_ALT|GPIO_AF7|GPIO_PULLUP|GPIO_PORTE|GPIO_PIN12) +#define GPIO_UART13_RX_2 (GPIO_ALT|GPIO_AF8|GPIO_PULLUP|GPIO_PORTD|GPIO_PIN14) +#define GPIO_UART13_CTS_1 (GPIO_ALT|GPIO_AF8|GPIO_PORTE|GPIO_PIN14) +#define GPIO_UART13_CTS_2 (GPIO_ALT|GPIO_AF8|GPIO_PORTD|GPIO_PIN12) +#define GPIO_UART13_CTS_3 (GPIO_ALT|GPIO_AF7|GPIO_PORTD|GPIO_PIN0) +#define GPIO_UART13_RTS_DE_1 (GPIO_ALT|GPIO_AF6|GPIO_PORTE|GPIO_PIN15) +#define GPIO_UART13_RTS_DE_2 (GPIO_ALT|GPIO_AF6|GPIO_PORTD|GPIO_PIN13) + +/* UART14 */ +#define GPIO_UART14_TX_0 (GPIO_ALT|GPIO_AF7|GPIO_PUSHPULL|GPIO_PULLUP|GPIO_PORTH|GPIO_PIN7) +#define GPIO_UART14_RX_0 (GPIO_ALT|GPIO_AF9|GPIO_PULLUP|GPIO_PORTH|GPIO_PIN6) +#define GPIO_UART14_CTS_0 (GPIO_ALT|GPIO_AF8|GPIO_PORTH|GPIO_PIN9) +#define GPIO_UART14_RTS_DE_0 (GPIO_ALT|GPIO_AF9|GPIO_PORTH|GPIO_PIN8) + +/* UART15 */ +#define GPIO_UART15_TX_0 (GPIO_ALT|GPIO_AF8|GPIO_PUSHPULL|GPIO_PULLUP|GPIO_PORTH|GPIO_PIN3) +#define GPIO_UART15_RX_0 (GPIO_ALT|GPIO_AF9|GPIO_PULLUP|GPIO_PORTH|GPIO_PIN2) +#define GPIO_UART15_CTS_0 (GPIO_ALT|GPIO_AF7|GPIO_PORTH|GPIO_PIN5) +#define GPIO_UART15_RTS_DE_0 (GPIO_ALT|GPIO_AF7|GPIO_PORTH|GPIO_PIN4) + +/* LPUART1 */ +#define GPIO_LPUART1_CTS_0 (GPIO_ALT|GPIO_AF8|GPIO_PORTA|GPIO_PIN11) +#define GPIO_LPUART1_DE_RTS_0 (GPIO_ALT|GPIO_AF8|GPIO_PORTA|GPIO_PIN12) +#define GPIO_LPUART1_RX_0 (GPIO_ALT|GPIO_AF6|GPIO_PULLUP|GPIO_PORTA|GPIO_PIN10) +#define GPIO_LPUART1_RX_1 (GPIO_ALT|GPIO_AF9|GPIO_PULLUP|GPIO_PORTB|GPIO_PIN7) +#define GPIO_LPUART1_TX_0 (GPIO_ALT|GPIO_AF8|GPIO_PUSHPULL|GPIO_PULLUP|GPIO_PORTA|GPIO_PIN9) +#define GPIO_LPUART1_TX_1 (GPIO_ALT|GPIO_AF9|GPIO_PUSHPULL|GPIO_PULLUP|GPIO_PORTB|GPIO_PIN6) + +/* LPUART2 */ +#define GPIO_LPUART2_CTS_0 (GPIO_ALT|GPIO_AF11|GPIO_PORTD|GPIO_PIN2) +#define GPIO_LPUART2_DE_RTS_0 (GPIO_ALT|GPIO_AF8|GPIO_PORTD|GPIO_PIN3) +#define GPIO_LPUART2_RX_0 (GPIO_ALT|GPIO_AF9|GPIO_PULLUP|GPIO_PORTI|GPIO_PIN3) +#define GPIO_LPUART2_RX_1 (GPIO_ALT|GPIO_AF7|GPIO_PULLUP|GPIO_PORTD|GPIO_PIN5) +#define GPIO_LPUART2_TX_0 (GPIO_ALT|GPIO_AF9|GPIO_PUSHPULL|GPIO_PULLUP|GPIO_PORTI|GPIO_PIN2) +#define GPIO_LPUART2_TX_1 (GPIO_ALT|GPIO_AF8|GPIO_PUSHPULL|GPIO_PULLUP|GPIO_PORTD|GPIO_PIN4) + +/* I2C1 */ +#define GPIO_I2C1_SCL_0 (GPIO_ALT|GPIO_AF10|GPIO_OPENDRAIN|GPIO_PORTG|GPIO_PIN5) +#define GPIO_I2C1_SCL_1 (GPIO_ALT|GPIO_AF9|GPIO_OPENDRAIN|GPIO_PORTD|GPIO_PIN4) +#define GPIO_I2C1_SCL_2 (GPIO_ALT|GPIO_AF11|GPIO_OPENDRAIN|GPIO_PORTB|GPIO_PIN6) +#define GPIO_I2C1_SCL_3 (GPIO_ALT|GPIO_AF11|GPIO_OPENDRAIN|GPIO_PORTB|GPIO_PIN8) +#define GPIO_I2C1_SDA_0 (GPIO_ALT|GPIO_AF9|GPIO_OPENDRAIN|GPIO_PORTG|GPIO_PIN4) +#define GPIO_I2C1_SDA_1 (GPIO_ALT|GPIO_AF8|GPIO_OPENDRAIN|GPIO_PORTD|GPIO_PIN5) +#define GPIO_I2C1_SDA_2 (GPIO_ALT|GPIO_AF10|GPIO_OPENDRAIN|GPIO_PORTB|GPIO_PIN7) +#define GPIO_I2C1_SDA_3 (GPIO_ALT|GPIO_AF10|GPIO_OPENDRAIN|GPIO_PORTB|GPIO_PIN9) +#define GPIO_I2C1_SMBA_0 (GPIO_ALT|GPIO_AF7|GPIO_PUSHPULL|GPIO_PORTG|GPIO_PIN6) +#define GPIO_I2C1_SMBA_1 (GPIO_ALT|GPIO_AF7|GPIO_PUSHPULL|GPIO_PORTD|GPIO_PIN1) +#define GPIO_I2C1_SMBA_2 (GPIO_ALT|GPIO_AF12|GPIO_PUSHPULL|GPIO_PORTB|GPIO_PIN5) + +/* I2C2 */ +#define GPIO_I2C2_SCL_0 (GPIO_ALT|GPIO_AF11|GPIO_OPENDRAIN|GPIO_PORTF|GPIO_PIN1) +#define GPIO_I2C2_SCL_1 (GPIO_ALT|GPIO_AF9|GPIO_OPENDRAIN|GPIO_PORTH|GPIO_PIN4) +#define GPIO_I2C2_SCL_2 (GPIO_ALT|GPIO_AF10|GPIO_OPENDRAIN|GPIO_PORTB|GPIO_PIN10) +#define GPIO_I2C2_SDA_0 (GPIO_ALT|GPIO_AF10|GPIO_OPENDRAIN|GPIO_PORTF|GPIO_PIN0) +#define GPIO_I2C2_SDA_1 (GPIO_ALT|GPIO_AF9|GPIO_OPENDRAIN|GPIO_PORTH|GPIO_PIN5) +#define GPIO_I2C2_SDA_2 (GPIO_ALT|GPIO_AF7|GPIO_OPENDRAIN|GPIO_PORTB|GPIO_PIN11) +#define GPIO_I2C2_SMBA_0 (GPIO_ALT|GPIO_AF11|GPIO_PUSHPULL|GPIO_PORTF|GPIO_PIN2) +#define GPIO_I2C2_SMBA_1 (GPIO_ALT|GPIO_AF11|GPIO_PUSHPULL|GPIO_PORTH|GPIO_PIN6) +#define GPIO_I2C2_SMBA_2 (GPIO_ALT|GPIO_AF12|GPIO_PUSHPULL|GPIO_PORTB|GPIO_PIN12) + +/* I2C3 */ +#define GPIO_I2C3_SCL_0 (GPIO_ALT|GPIO_AF9|GPIO_OPENDRAIN|GPIO_PORTH|GPIO_PIN7) +#define GPIO_I2C3_SCL_2 (GPIO_ALT|GPIO_AF9|GPIO_OPENDRAIN|GPIO_PORTA|GPIO_PIN8) +#define GPIO_I2C3_SDA_0 (GPIO_ALT|GPIO_AF11|GPIO_OPENDRAIN|GPIO_PORTH|GPIO_PIN8) +#define GPIO_I2C3_SDA_2 (GPIO_ALT|GPIO_AF12|GPIO_OPENDRAIN|GPIO_PORTC|GPIO_PIN9) +#define GPIO_I2C3_SMBA_0 (GPIO_ALT|GPIO_AF10|GPIO_PUSHPULL|GPIO_PORTH|GPIO_PIN9) +#define GPIO_I2C3_SMBA_2 (GPIO_ALT|GPIO_AF10|GPIO_PUSHPULL|GPIO_PORTA|GPIO_PIN9) + +/* I2C4 */ +#define GPIO_I2C4_SCL_0 (GPIO_ALT|GPIO_AF8|GPIO_OPENDRAIN|GPIO_PORTF|GPIO_PIN14) +#define GPIO_I2C4_SCL_1 (GPIO_ALT|GPIO_AF8|GPIO_OPENDRAIN|GPIO_PORTH|GPIO_PIN11) +#define GPIO_I2C4_SCL_2 (GPIO_ALT|GPIO_AF10|GPIO_OPENDRAIN|GPIO_PORTD|GPIO_PIN12) +#define GPIO_I2C4_SCL_3 (GPIO_ALT|GPIO_AF12|GPIO_OPENDRAIN|GPIO_PORTB|GPIO_PIN8) +#define GPIO_I2C4_SCL_4 (GPIO_ALT|GPIO_AF12|GPIO_OPENDRAIN|GPIO_PORTB|GPIO_PIN6) +#define GPIO_I2C4_SDA_0 (GPIO_ALT|GPIO_AF9|GPIO_OPENDRAIN|GPIO_PORTF|GPIO_PIN15) +#define GPIO_I2C4_SDA_1 (GPIO_ALT|GPIO_AF10|GPIO_OPENDRAIN|GPIO_PORTH|GPIO_PIN12) +#define GPIO_I2C4_SDA_2 (GPIO_ALT|GPIO_AF8|GPIO_OPENDRAIN|GPIO_PORTD|GPIO_PIN13) +#define GPIO_I2C4_SDA_3 (GPIO_ALT|GPIO_AF11|GPIO_OPENDRAIN|GPIO_PORTB|GPIO_PIN7) +#define GPIO_I2C4_SDA_4 (GPIO_ALT|GPIO_AF11|GPIO_OPENDRAIN|GPIO_PORTB|GPIO_PIN9) +#define GPIO_I2C4_SMBA_0 (GPIO_ALT|GPIO_AF9|GPIO_PUSHPULL|GPIO_PORTF|GPIO_PIN13) +#define GPIO_I2C4_SMBA_1 (GPIO_ALT|GPIO_AF8|GPIO_PUSHPULL|GPIO_PORTH|GPIO_PIN10) +#define GPIO_I2C4_SMBA_2 (GPIO_ALT|GPIO_AF6|GPIO_PUSHPULL|GPIO_PORTD|GPIO_PIN11) +#define GPIO_I2C4_SMBA_3 (GPIO_ALT|GPIO_AF13|GPIO_PUSHPULL|GPIO_PORTB|GPIO_PIN5) +#define GPIO_I2C4_SMBA_4 (GPIO_ALT|GPIO_AF12|GPIO_PUSHPULL|GPIO_PORTB|GPIO_PIN9) + +/* I2C5 */ +#define GPIO_I2C5_SCL_0 (GPIO_ALT|GPIO_AF12|GPIO_OPENDRAIN|GPIO_PORTF|GPIO_PIN1) +#define GPIO_I2C5_SCL_1 (GPIO_ALT|GPIO_AF10|GPIO_OPENDRAIN|GPIO_PORTA|GPIO_PIN8) +#define GPIO_I2C5_SCL_2 (GPIO_ALT|GPIO_AF9|GPIO_OPENDRAIN|GPIO_PORTC|GPIO_PIN11) +#define GPIO_I2C5_SDA_0 (GPIO_ALT|GPIO_AF11|GPIO_OPENDRAIN|GPIO_PORTF|GPIO_PIN0) +#define GPIO_I2C5_SDA_1 (GPIO_ALT|GPIO_AF13|GPIO_OPENDRAIN|GPIO_PORTC|GPIO_PIN9) +#define GPIO_I2C5_SDA_2 (GPIO_ALT|GPIO_AF9|GPIO_OPENDRAIN|GPIO_PORTC|GPIO_PIN10) +#define GPIO_I2C5_SMBA_0 (GPIO_ALT|GPIO_AF12|GPIO_PUSHPULL|GPIO_PORTF|GPIO_PIN2) +#define GPIO_I2C5_SMBA_1 (GPIO_ALT|GPIO_AF11|GPIO_PUSHPULL|GPIO_PORTA|GPIO_PIN9) +#define GPIO_I2C5_SMBA_2 (GPIO_ALT|GPIO_AF12|GPIO_PUSHPULL|GPIO_PORTC|GPIO_PIN12) + +/* I2C6 */ +#define GPIO_I2C6_SCL_0 (GPIO_ALT|GPIO_AF12|GPIO_OPENDRAIN|GPIO_PORTF|GPIO_PIN4) +#define GPIO_I2C6_SCL_1 (GPIO_ALT|GPIO_AF7|GPIO_OPENDRAIN|GPIO_PORTF|GPIO_PIN12) +#define GPIO_I2C6_SCL_2 (GPIO_ALT|GPIO_AF10|GPIO_OPENDRAIN|GPIO_PORTE|GPIO_PIN14) +#define GPIO_I2C6_SDA_0 (GPIO_ALT|GPIO_AF11|GPIO_OPENDRAIN|GPIO_PORTF|GPIO_PIN3) +#define GPIO_I2C6_SDA_1 (GPIO_ALT|GPIO_AF5|GPIO_OPENDRAIN|GPIO_PORTF|GPIO_PIN11) +#define GPIO_I2C6_SDA_2 (GPIO_ALT|GPIO_AF8|GPIO_OPENDRAIN|GPIO_PORTE|GPIO_PIN13) +#define GPIO_I2C6_SMBA_0 (GPIO_ALT|GPIO_AF10|GPIO_PUSHPULL|GPIO_PORTF|GPIO_PIN5) +#define GPIO_I2C6_SMBA_1 (GPIO_ALT|GPIO_AF10|GPIO_PUSHPULL|GPIO_PORTF|GPIO_PIN13) +#define GPIO_I2C6_SMBA_2 (GPIO_ALT|GPIO_AF7|GPIO_PUSHPULL|GPIO_PORTE|GPIO_PIN15) + +/* I2C7 */ +#define GPIO_I2C7_SCL_0 (GPIO_ALT|GPIO_AF7|GPIO_OPENDRAIN|GPIO_PORTI|GPIO_PIN13) +#define GPIO_I2C7_SCL_1 (GPIO_ALT|GPIO_AF9|GPIO_OPENDRAIN|GPIO_PORTE|GPIO_PIN8) +#define GPIO_I2C7_SCL_2 (GPIO_ALT|GPIO_AF6|GPIO_OPENDRAIN|GPIO_PORTD|GPIO_PIN9) +#define GPIO_I2C7_SDA_0 (GPIO_ALT|GPIO_AF7|GPIO_OPENDRAIN|GPIO_PORTI|GPIO_PIN12) +#define GPIO_I2C7_SDA_1 (GPIO_ALT|GPIO_AF8|GPIO_OPENDRAIN|GPIO_PORTE|GPIO_PIN7) +#define GPIO_I2C7_SDA_2 (GPIO_ALT|GPIO_AF7|GPIO_OPENDRAIN|GPIO_PORTD|GPIO_PIN8) +#define GPIO_I2C7_SMBA_0 (GPIO_ALT|GPIO_AF7|GPIO_PUSHPULL|GPIO_PORTI|GPIO_PIN14) +#define GPIO_I2C7_SMBA_1 (GPIO_ALT|GPIO_AF9|GPIO_PUSHPULL|GPIO_PORTE|GPIO_PIN9) +#define GPIO_I2C7_SMBA_2 (GPIO_ALT|GPIO_AF8|GPIO_PUSHPULL|GPIO_PORTD|GPIO_PIN10) + +/* I2C8 */ +#define GPIO_I2C8_SCL_0 (GPIO_ALT|GPIO_AF9|GPIO_OPENDRAIN|GPIO_PORTD|GPIO_PIN15) +#define GPIO_I2C8_SCL_2 (GPIO_ALT|GPIO_AF11|GPIO_OPENDRAIN|GPIO_PORTG|GPIO_PIN5) +#define GPIO_I2C8_SCL_3 (GPIO_ALT|GPIO_AF10|GPIO_OPENDRAIN|GPIO_PORTI|GPIO_PIN3) +#define GPIO_I2C8_SDA_0 (GPIO_ALT|GPIO_AF9|GPIO_OPENDRAIN|GPIO_PORTD|GPIO_PIN14) +#define GPIO_I2C8_SDA_2 (GPIO_ALT|GPIO_AF10|GPIO_OPENDRAIN|GPIO_PORTG|GPIO_PIN4) +#define GPIO_I2C8_SDA_3 (GPIO_ALT|GPIO_AF10|GPIO_OPENDRAIN|GPIO_PORTI|GPIO_PIN2) +#define GPIO_I2C8_SMBA_0 (GPIO_ALT|GPIO_AF9|GPIO_PUSHPULL|GPIO_PORTD|GPIO_PIN13) +#define GPIO_I2C8_SMBA_2 (GPIO_ALT|GPIO_AF8|GPIO_PUSHPULL|GPIO_PORTG|GPIO_PIN6) +#define GPIO_I2C8_SMBA_3 (GPIO_ALT|GPIO_AF10|GPIO_PUSHPULL|GPIO_PORTI|GPIO_PIN1) + +/* I2C9 */ +#define GPIO_I2C9_SCL_0 (GPIO_ALT|GPIO_AF7|GPIO_OPENDRAIN|GPIO_PORTI|GPIO_PIN11) +#define GPIO_I2C9_SCL_3 (GPIO_ALT|GPIO_AF9|GPIO_OPENDRAIN|GPIO_PORTH|GPIO_PIN15) +#define GPIO_I2C9_SDA_0 (GPIO_ALT|GPIO_AF9|GPIO_OPENDRAIN|GPIO_PORTI|GPIO_PIN10) +#define GPIO_I2C9_SDA_3 (GPIO_ALT|GPIO_AF10|GPIO_OPENDRAIN|GPIO_PORTH|GPIO_PIN14) +#define GPIO_I2C9_SMBA_0 (GPIO_ALT|GPIO_AF9|GPIO_PUSHPULL|GPIO_PORTI|GPIO_PIN9) +#define GPIO_I2C9_SMBA_2 (GPIO_ALT|GPIO_AF8|GPIO_PUSHPULL|GPIO_PORTH|GPIO_PIN13) + +/* I2C10 */ +#define GPIO_I2C10_SCL_0 (GPIO_ALT|GPIO_AF11|GPIO_OPENDRAIN|GPIO_PORTI|GPIO_PIN1) +#define GPIO_I2C10_SCL_4 (GPIO_ALT|GPIO_AF9|GPIO_OPENDRAIN|GPIO_PORTI|GPIO_PIN6) +#define GPIO_I2C10_SDA_0 (GPIO_ALT|GPIO_AF8|GPIO_OPENDRAIN|GPIO_PORTI|GPIO_PIN0) +#define GPIO_I2C10_SDA_4 (GPIO_ALT|GPIO_AF10|GPIO_OPENDRAIN|GPIO_PORTI|GPIO_PIN5) +#define GPIO_I2C10_SMBA_0 (GPIO_ALT|GPIO_AF11|GPIO_PUSHPULL|GPIO_PORTI|GPIO_PIN3) +#define GPIO_I2C10_SMBA_3 (GPIO_ALT|GPIO_AF9|GPIO_PUSHPULL|GPIO_PORTI|GPIO_PIN4) + +/* SPI1 */ +#define GPIO_SPI1_NSS_0 (GPIO_ALT|GPIO_AF4|GPIO_PORTA|GPIO_PIN4) +#define GPIO_SPI1_NSS_1 (GPIO_ALT|GPIO_AF2|GPIO_PORTA|GPIO_PIN15) +#define GPIO_SPI1_NSS_2 (GPIO_ALT|GPIO_AF8|GPIO_PORTG|GPIO_PIN10) +#define GPIO_SPI1_SCK_0 (GPIO_ALT|GPIO_AF4|GPIO_PORTA|GPIO_PIN5) +#define GPIO_SPI1_SCK_1 (GPIO_ALT|GPIO_AF6|GPIO_PORTG|GPIO_PIN11) +#define GPIO_SPI1_SCK_2 (GPIO_ALT|GPIO_AF1|GPIO_PORTB|GPIO_PIN3) +#define GPIO_SPI1_MISO_0 (GPIO_ALT|GPIO_AF4|GPIO_PORTA|GPIO_PIN6) +#define GPIO_SPI1_MISO_1 (GPIO_ALT|GPIO_AF5|GPIO_PORTG|GPIO_PIN9) +#define GPIO_SPI1_MISO_2 (GPIO_ALT|GPIO_AF2|GPIO_PORTB|GPIO_PIN4) +#define GPIO_SPI1_MOSI_0 (GPIO_ALT|GPIO_AF5|GPIO_PORTA|GPIO_PIN7) +#define GPIO_SPI1_MOSI_1 (GPIO_ALT|GPIO_AF3|GPIO_PORTD|GPIO_PIN7) + +/* SPI2 */ +#define GPIO_SPI2_NSS_0 (GPIO_ALT|GPIO_AF2|GPIO_PORTA|GPIO_PIN11) +#define GPIO_SPI2_NSS_1 (GPIO_ALT|GPIO_AF4|GPIO_PORTI|GPIO_PIN0) +#define GPIO_SPI2_NSS_2 (GPIO_ALT|GPIO_AF3|GPIO_PORTB|GPIO_PIN4) +#define GPIO_SPI2_SCK_0 (GPIO_ALT|GPIO_AF4|GPIO_PORTB|GPIO_PIN10) +#define GPIO_SPI2_SCK_1 (GPIO_ALT|GPIO_AF4|GPIO_PORTB|GPIO_PIN13) +#define GPIO_SPI2_SCK_2 (GPIO_ALT|GPIO_AF3|GPIO_PORTA|GPIO_PIN9) +#define GPIO_SPI2_SCK_3 (GPIO_ALT|GPIO_AF1|GPIO_PORTA|GPIO_PIN12) +#define GPIO_SPI2_SCK_4 (GPIO_ALT|GPIO_AF6|GPIO_PORTI|GPIO_PIN1) +#define GPIO_SPI2_SCK_5 (GPIO_ALT|GPIO_AF4|GPIO_PORTD|GPIO_PIN3) +#define GPIO_SPI2_MISO_0 (GPIO_ALT|GPIO_AF6|GPIO_PORTC|GPIO_PIN2) +#define GPIO_SPI2_MISO_1 (GPIO_ALT|GPIO_AF4|GPIO_PORTB|GPIO_PIN14) +#define GPIO_SPI2_MISO_2 (GPIO_ALT|GPIO_AF5|GPIO_PORTI|GPIO_PIN2) +#define GPIO_SPI2_MOSI_0 (GPIO_ALT|GPIO_AF4|GPIO_PORTC|GPIO_PIN1) +#define GPIO_SPI2_MOSI_1 (GPIO_ALT|GPIO_AF6|GPIO_PORTC|GPIO_PIN3) +#define GPIO_SPI2_MOSI_2 (GPIO_ALT|GPIO_AF4|GPIO_PORTB|GPIO_PIN15) +#define GPIO_SPI2_MOSI_3 (GPIO_ALT|GPIO_AF5|GPIO_PORTI|GPIO_PIN3) + +/* SPI3 */ +#define GPIO_SPI3_NSS_0 (GPIO_ALT|GPIO_AF5|GPIO_PORTA|GPIO_PIN4) +#define GPIO_SPI3_NSS_1 (GPIO_ALT|GPIO_AF3|GPIO_PORTA|GPIO_PIN15) +#define GPIO_SPI3_NSS_2 (GPIO_ALT|GPIO_AF4|GPIO_PORTD|GPIO_PIN4) +#define GPIO_SPI3_SCK_0 (GPIO_ALT|GPIO_AF5|GPIO_PORTC|GPIO_PIN10) +#define GPIO_SPI3_SCK_1 (GPIO_ALT|GPIO_AF4|GPIO_PORTD|GPIO_PIN7) +#define GPIO_SPI3_SCK_2 (GPIO_ALT|GPIO_AF2|GPIO_PORTB|GPIO_PIN3) +#define GPIO_SPI3_MISO_0 (GPIO_ALT|GPIO_AF6|GPIO_PORTB|GPIO_PIN1) +#define GPIO_SPI3_MISO_1 (GPIO_ALT|GPIO_AF4|GPIO_PORTC|GPIO_PIN11) +#define GPIO_SPI3_MISO_2 (GPIO_ALT|GPIO_AF4|GPIO_PORTD|GPIO_PIN5) +#define GPIO_SPI3_MISO_3 (GPIO_ALT|GPIO_AF4|GPIO_PORTB|GPIO_PIN4) +#define GPIO_SPI3_MOSI_0 (GPIO_ALT|GPIO_AF6|GPIO_PORTB|GPIO_PIN2) +#define GPIO_SPI3_MOSI_1 (GPIO_ALT|GPIO_AF5|GPIO_PORTC|GPIO_PIN12) +#define GPIO_SPI3_MOSI_2 (GPIO_ALT|GPIO_AF5|GPIO_PORTD|GPIO_PIN6) + +/* SPI4 */ +#define GPIO_SPI4_NSS_0 (GPIO_ALT|GPIO_AF3|GPIO_PORTA|GPIO_PIN0) +#define GPIO_SPI4_NSS_1 (GPIO_ALT|GPIO_AF6|GPIO_PORTA|GPIO_PIN4) +#define GPIO_SPI4_NSS_2 (GPIO_ALT|GPIO_AF4|GPIO_PORTG|GPIO_PIN8) +#define GPIO_SPI4_NSS_3 (GPIO_ALT|GPIO_AF4|GPIO_PORTA|GPIO_PIN15) +#define GPIO_SPI4_SCK_0 (GPIO_ALT|GPIO_AF5|GPIO_PORTA|GPIO_PIN5) +#define GPIO_SPI4_SCK_1 (GPIO_ALT|GPIO_AF6|GPIO_PORTC|GPIO_PIN12) +#define GPIO_SPI4_SCK_2 (GPIO_ALT|GPIO_AF5|GPIO_PORTG|GPIO_PIN13) +#define GPIO_SPI4_SCK_3 (GPIO_ALT|GPIO_AF3|GPIO_PORTB|GPIO_PIN3) +#define GPIO_SPI4_MISO_0 (GPIO_ALT|GPIO_AF5|GPIO_PORTA|GPIO_PIN6) +#define GPIO_SPI4_MISO_1 (GPIO_ALT|GPIO_AF7|GPIO_PORTG|GPIO_PIN12) +#define GPIO_SPI4_MISO_2 (GPIO_ALT|GPIO_AF5|GPIO_PORTB|GPIO_PIN4) +#define GPIO_SPI4_MOSI_0 (GPIO_ALT|GPIO_AF6|GPIO_PORTA|GPIO_PIN7) +#define GPIO_SPI4_MOSI_1 (GPIO_ALT|GPIO_AF6|GPIO_PORTG|GPIO_PIN14) + +/* SPI5 */ +#define GPIO_SPI5_NSS_0 (GPIO_ALT|GPIO_AF5|GPIO_PORTF|GPIO_PIN6) +#define GPIO_SPI5_NSS_1 (GPIO_ALT|GPIO_AF3|GPIO_PORTH|GPIO_PIN5) +#define GPIO_SPI5_SCK_0 (GPIO_ALT|GPIO_AF4|GPIO_PORTF|GPIO_PIN7) +#define GPIO_SPI5_SCK_1 (GPIO_ALT|GPIO_AF5|GPIO_PORTH|GPIO_PIN6) +#define GPIO_SPI5_MISO_0 (GPIO_ALT|GPIO_AF5|GPIO_PORTF|GPIO_PIN8) +#define GPIO_SPI5_MISO_1 (GPIO_ALT|GPIO_AF4|GPIO_PORTH|GPIO_PIN7) +#define GPIO_SPI5_MOSI_0 (GPIO_ALT|GPIO_AF5|GPIO_PORTF|GPIO_PIN9) +#define GPIO_SPI5_MOSI_1 (GPIO_ALT|GPIO_AF3|GPIO_PORTF|GPIO_PIN11) + +/* SPI6 */ +#define GPIO_SPI6_NSS_0 (GPIO_ALT|GPIO_AF4|GPIO_PORTE|GPIO_PIN4) +#define GPIO_SPI6_NSS_1 (GPIO_ALT|GPIO_AF5|GPIO_PORTF|GPIO_PIN2) +#define GPIO_SPI6_NSS_2 (GPIO_ALT|GPIO_AF4|GPIO_PORTE|GPIO_PIN11) +#define GPIO_SPI6_SCK_0 (GPIO_ALT|GPIO_AF4|GPIO_PORTE|GPIO_PIN2) +#define GPIO_SPI6_SCK_1 (GPIO_ALT|GPIO_AF5|GPIO_PORTF|GPIO_PIN3) +#define GPIO_SPI6_SCK_2 (GPIO_ALT|GPIO_AF5|GPIO_PORTE|GPIO_PIN12) +#define GPIO_SPI6_MISO_0 (GPIO_ALT|GPIO_AF4|GPIO_PORTE|GPIO_PIN5) +#define GPIO_SPI6_MISO_1 (GPIO_ALT|GPIO_AF6|GPIO_PORTF|GPIO_PIN4) +#define GPIO_SPI6_MISO_2 (GPIO_ALT|GPIO_AF4|GPIO_PORTE|GPIO_PIN13) +#define GPIO_SPI6_MOSI_0 (GPIO_ALT|GPIO_AF3|GPIO_PORTE|GPIO_PIN6) +#define GPIO_SPI6_MOSI_1 (GPIO_ALT|GPIO_AF5|GPIO_PORTF|GPIO_PIN5) +#define GPIO_SPI6_MOSI_2 (GPIO_ALT|GPIO_AF5|GPIO_PORTE|GPIO_PIN14) + +/* SPI7 */ +#define GPIO_SPI7_NSS_0 (GPIO_ALT|GPIO_AF4|GPIO_PORTI|GPIO_PIN12) +#define GPIO_SPI7_NSS_2 (GPIO_ALT|GPIO_AF6|GPIO_PORTH|GPIO_PIN12) +#define GPIO_SPI7_NSS_3 (GPIO_ALT|GPIO_AF4|GPIO_PORTH|GPIO_PIN13) +#define GPIO_SPI7_SCK_0 (GPIO_ALT|GPIO_AF3|GPIO_PORTI|GPIO_PIN8) +#define GPIO_SPI7_MISO_0 (GPIO_ALT|GPIO_AF4|GPIO_PORTI|GPIO_PIN13) +#define GPIO_SPI7_MISO_2 (GPIO_ALT|GPIO_AF5|GPIO_PORTH|GPIO_PIN14) +#define GPIO_SPI7_MOSI_0 (GPIO_ALT|GPIO_AF4|GPIO_PORTI|GPIO_PIN14) +#define GPIO_SPI7_MOSI_2 (GPIO_ALT|GPIO_AF6|GPIO_PORTH|GPIO_PIN15) + +/* I2S1 */ +#define GPIO_I2S1_CK_0 (GPIO_ALT|GPIO_AF6|GPIO_PORTA|GPIO_PIN5) +#define GPIO_I2S1_CK_1 (GPIO_ALT|GPIO_AF7|GPIO_PORTG|GPIO_PIN11) +#define GPIO_I2S1_CK_2 (GPIO_ALT|GPIO_AF4|GPIO_PORTB|GPIO_PIN3) +#define GPIO_I2S1_CKIN_0 (GPIO_ALT|GPIO_AF5|GPIO_PORTC|GPIO_PIN9) +#define GPIO_I2S1_MCK_0 (GPIO_ALT|GPIO_AF5|GPIO_PORTC|GPIO_PIN4) +#define GPIO_I2S1_SDI_0 (GPIO_ALT|GPIO_AF6|GPIO_PORTA|GPIO_PIN6) +#define GPIO_I2S1_SDI_1 (GPIO_ALT|GPIO_AF6|GPIO_PORTG|GPIO_PIN9) +#define GPIO_I2S1_SDI_2 (GPIO_ALT|GPIO_AF6|GPIO_PORTB|GPIO_PIN4) +#define GPIO_I2S1_SDO_0 (GPIO_ALT|GPIO_AF7|GPIO_PORTA|GPIO_PIN7) +#define GPIO_I2S1_SDO_1 (GPIO_ALT|GPIO_AF5|GPIO_PORTD|GPIO_PIN7) +#define GPIO_I2S1_WS_0 (GPIO_ALT|GPIO_AF7|GPIO_PORTA|GPIO_PIN4) +#define GPIO_I2S1_WS_1 (GPIO_ALT|GPIO_AF5|GPIO_PORTA|GPIO_PIN15) +#define GPIO_I2S1_WS_2 (GPIO_ALT|GPIO_AF9|GPIO_PORTG|GPIO_PIN10) + +/* I2S2 */ +#define GPIO_I2S2_CK_0 (GPIO_ALT|GPIO_AF5|GPIO_PORTB|GPIO_PIN10) +#define GPIO_I2S2_CK_1 (GPIO_ALT|GPIO_AF5|GPIO_PORTB|GPIO_PIN13) +#define GPIO_I2S2_CK_2 (GPIO_ALT|GPIO_AF4|GPIO_PORTA|GPIO_PIN9) +#define GPIO_I2S2_CK_3 (GPIO_ALT|GPIO_AF2|GPIO_PORTA|GPIO_PIN12) +#define GPIO_I2S2_CK_4 (GPIO_ALT|GPIO_AF7|GPIO_PORTI|GPIO_PIN1) +#define GPIO_I2S2_CK_5 (GPIO_ALT|GPIO_AF5|GPIO_PORTD|GPIO_PIN3) +#define GPIO_I2S2_CKIN_0 (GPIO_ALT|GPIO_AF6|GPIO_PORTC|GPIO_PIN9) +#define GPIO_I2S2_MCK_0 (GPIO_ALT|GPIO_AF6|GPIO_PORTC|GPIO_PIN6) +#define GPIO_I2S2_SDI_0 (GPIO_ALT|GPIO_AF7|GPIO_PORTC|GPIO_PIN2) +#define GPIO_I2S2_SDI_1 (GPIO_ALT|GPIO_AF5|GPIO_PORTB|GPIO_PIN14) +#define GPIO_I2S2_SDI_2 (GPIO_ALT|GPIO_AF6|GPIO_PORTI|GPIO_PIN2) +#define GPIO_I2S2_SDO_0 (GPIO_ALT|GPIO_AF5|GPIO_PORTC|GPIO_PIN1) +#define GPIO_I2S2_SDO_1 (GPIO_ALT|GPIO_AF7|GPIO_PORTC|GPIO_PIN3) +#define GPIO_I2S2_SDO_2 (GPIO_ALT|GPIO_AF5|GPIO_PORTB|GPIO_PIN15) +#define GPIO_I2S2_SDO_3 (GPIO_ALT|GPIO_AF6|GPIO_PORTI|GPIO_PIN3) +#define GPIO_I2S2_WS_0 (GPIO_ALT|GPIO_AF3|GPIO_PORTA|GPIO_PIN11) +#define GPIO_I2S2_WS_1 (GPIO_ALT|GPIO_AF5|GPIO_PORTI|GPIO_PIN0) +#define GPIO_I2S2_WS_2 (GPIO_ALT|GPIO_AF7|GPIO_PORTB|GPIO_PIN4) + +/* I2S3 */ +#define GPIO_I2S3_CK_0 (GPIO_ALT|GPIO_AF6|GPIO_PORTC|GPIO_PIN10) +#define GPIO_I2S3_CK_1 (GPIO_ALT|GPIO_AF5|GPIO_PORTB|GPIO_PIN3) +#define GPIO_I2S3_CKIN_0 (GPIO_ALT|GPIO_AF7|GPIO_PORTC|GPIO_PIN9) +#define GPIO_I2S3_MCK_0 (GPIO_ALT|GPIO_AF6|GPIO_PORTC|GPIO_PIN7) +#define GPIO_I2S3_SDI_0 (GPIO_ALT|GPIO_AF5|GPIO_PORTC|GPIO_PIN11) +#define GPIO_I2S3_SDI_1 (GPIO_ALT|GPIO_AF8|GPIO_PORTB|GPIO_PIN4) +#define GPIO_I2S3_SDO_0 (GPIO_ALT|GPIO_AF7|GPIO_PORTB|GPIO_PIN2) +#define GPIO_I2S3_SDO_1 (GPIO_ALT|GPIO_AF7|GPIO_PORTC|GPIO_PIN12) +#define GPIO_I2S3_SDO_2 (GPIO_ALT|GPIO_AF6|GPIO_PORTD|GPIO_PIN6) +#define GPIO_I2S3_WS_0 (GPIO_ALT|GPIO_AF8|GPIO_PORTA|GPIO_PIN4) +#define GPIO_I2S3_WS_1 (GPIO_ALT|GPIO_AF6|GPIO_PORTA|GPIO_PIN15) + +/* I2S4 */ +#define GPIO_I2S4_CK_0 (GPIO_ALT|GPIO_AF7|GPIO_PORTA|GPIO_PIN5) +#define GPIO_I2S4_CK_1 (GPIO_ALT|GPIO_AF8|GPIO_PORTC|GPIO_PIN12) +#define GPIO_I2S4_CK_2 (GPIO_ALT|GPIO_AF6|GPIO_PORTG|GPIO_PIN13) +#define GPIO_I2S4_CK_3 (GPIO_ALT|GPIO_AF6|GPIO_PORTB|GPIO_PIN3) +#define GPIO_I2S4_CKIN_0 (GPIO_ALT|GPIO_AF8|GPIO_PORTC|GPIO_PIN9) +#define GPIO_I2S4_MCK_0 (GPIO_ALT|GPIO_AF6|GPIO_PORTA|GPIO_PIN3) +#define GPIO_I2S4_SDI_0 (GPIO_ALT|GPIO_AF7|GPIO_PORTA|GPIO_PIN6) +#define GPIO_I2S4_SDI_1 (GPIO_ALT|GPIO_AF8|GPIO_PORTG|GPIO_PIN12) +#define GPIO_I2S4_SDI_2 (GPIO_ALT|GPIO_AF9|GPIO_PORTB|GPIO_PIN4) +#define GPIO_I2S4_SDO_0 (GPIO_ALT|GPIO_AF8|GPIO_PORTA|GPIO_PIN7) +#define GPIO_I2S4_SDO_1 (GPIO_ALT|GPIO_AF7|GPIO_PORTG|GPIO_PIN14) +#define GPIO_I2S4_WS_0 (GPIO_ALT|GPIO_AF4|GPIO_PORTA|GPIO_PIN0) +#define GPIO_I2S4_WS_1 (GPIO_ALT|GPIO_AF9|GPIO_PORTA|GPIO_PIN4) +#define GPIO_I2S4_WS_2 (GPIO_ALT|GPIO_AF5|GPIO_PORTG|GPIO_PIN8) +#define GPIO_I2S4_WS_3 (GPIO_ALT|GPIO_AF7|GPIO_PORTA|GPIO_PIN15) + +/* SPI1/I2S1 */ +#define GPIO_SPI1_MOSI_2 (GPIO_ALT|GPIO_AF5|GPIO_PORTB|GPIO_PIN5) +#define GPIO_I2S1_SDO_2 (GPIO_ALT|GPIO_AF5|GPIO_PORTB|GPIO_PIN5) + +/* SPI3/I2S3 */ +#define GPIO_SPI3_MOSI_3 (GPIO_ALT|GPIO_AF6|GPIO_PORTB|GPIO_PIN5) +#define GPIO_I2S3_SDO_3 (GPIO_ALT|GPIO_AF6|GPIO_PORTB|GPIO_PIN5) + +/* SPI4/I2S4 */ +#define GPIO_SPI4_MOSI_2 (GPIO_ALT|GPIO_AF7|GPIO_PORTB|GPIO_PIN5) +#define GPIO_I2S4_SDO_2 (GPIO_ALT|GPIO_AF7|GPIO_PORTB|GPIO_PIN5) + +/* SPI2/I2S2 */ +#define GPIO_SPI2_NSS_3 (GPIO_ALT|GPIO_AF5|GPIO_PORTB|GPIO_PIN9) +#define GPIO_SPI2_NSS_4 (GPIO_ALT|GPIO_AF5|GPIO_PORTB|GPIO_PIN12) +#define GPIO_I2S2_WS_3 (GPIO_ALT|GPIO_AF5|GPIO_PORTB|GPIO_PIN9) +#define GPIO_I2S2_WS_4 (GPIO_ALT|GPIO_AF5|GPIO_PORTB|GPIO_PIN12) + +/* XSPI1 */ +#define GPIO_XSPI_CLK_0 (GPIO_ALT|GPIO_AF0|GPIO_PORTF|GPIO_PIN10) +#define GPIO_XSPI_CLK_1 (GPIO_ALT|GPIO_AF0|GPIO_PORTB|GPIO_PIN2) +#define GPIO_XSPI_CLK_2 (GPIO_ALT|GPIO_AF0|GPIO_PORTA|GPIO_PIN3) +#define GPIO_XSPI_IO0_0 (GPIO_ALT|GPIO_AF0|GPIO_PORTF|GPIO_PIN8) +#define GPIO_XSPI_IO0_1 (GPIO_ALT|GPIO_AF0|GPIO_PORTA|GPIO_PIN2) +#define GPIO_XSPI_IO0_2 (GPIO_ALT|GPIO_AF0|GPIO_PORTB|GPIO_PIN1) +#define GPIO_XSPI_IO0_3 (GPIO_ALT|GPIO_AF0|GPIO_PORTD|GPIO_PIN11) +#define GPIO_XSPI_IO0_4 (GPIO_ALT|GPIO_AF0|GPIO_PORTC|GPIO_PIN9) +#define GPIO_XSPI_IO0_5 (GPIO_ALT|GPIO_AF2|GPIO_PORTC|GPIO_PIN3) +#define GPIO_XSPI_IO0_6 (GPIO_ALT|GPIO_AF0|GPIO_PORTB|GPIO_PIN12) +#define GPIO_XSPI_IO1_0 (GPIO_ALT|GPIO_AF0|GPIO_PORTF|GPIO_PIN9) +#define GPIO_XSPI_IO1_1 (GPIO_ALT|GPIO_AF0|GPIO_PORTB|GPIO_PIN0) +#define GPIO_XSPI_IO1_2 (GPIO_ALT|GPIO_AF0|GPIO_PORTD|GPIO_PIN12) +#define GPIO_XSPI_IO1_3 (GPIO_ALT|GPIO_AF0|GPIO_PORTC|GPIO_PIN10) +#define GPIO_XSPI_IO2_0 (GPIO_ALT|GPIO_AF1|GPIO_PORTA|GPIO_PIN3) +#define GPIO_XSPI_IO2_1 (GPIO_ALT|GPIO_AF0|GPIO_PORTE|GPIO_PIN2) +#define GPIO_XSPI_IO2_2 (GPIO_ALT|GPIO_AF0|GPIO_PORTF|GPIO_PIN7) +#define GPIO_XSPI_IO2_3 (GPIO_ALT|GPIO_AF1|GPIO_PORTA|GPIO_PIN7) +#define GPIO_XSPI_IO2_4 (GPIO_ALT|GPIO_AF0|GPIO_PORTB|GPIO_PIN13) +#define GPIO_XSPI_IO2_5 (GPIO_ALT|GPIO_AF2|GPIO_PORTC|GPIO_PIN2) +#define GPIO_XSPI_IO3_0 (GPIO_ALT|GPIO_AF1|GPIO_PORTA|GPIO_PIN1) +#define GPIO_XSPI_IO3_1 (GPIO_ALT|GPIO_AF0|GPIO_PORTF|GPIO_PIN6) +#define GPIO_XSPI_IO3_2 (GPIO_ALT|GPIO_AF0|GPIO_PORTA|GPIO_PIN6) +#define GPIO_XSPI_IO3_3 (GPIO_ALT|GPIO_AF0|GPIO_PORTD|GPIO_PIN13) +#define GPIO_XSPI_IO4_0 (GPIO_ALT|GPIO_AF0|GPIO_PORTC|GPIO_PIN1) +#define GPIO_XSPI_IO4_1 (GPIO_ALT|GPIO_AF2|GPIO_PORTH|GPIO_PIN2) +#define GPIO_XSPI_IO4_2 (GPIO_ALT|GPIO_AF0|GPIO_PORTD|GPIO_PIN4) +#define GPIO_XSPI_IO4_3 (GPIO_ALT|GPIO_AF1|GPIO_PORTE|GPIO_PIN7) +#define GPIO_XSPI_IO5_0 (GPIO_ALT|GPIO_AF3|GPIO_PORTC|GPIO_PIN2) +#define GPIO_XSPI_IO5_1 (GPIO_ALT|GPIO_AF1|GPIO_PORTH|GPIO_PIN3) +#define GPIO_XSPI_IO5_2 (GPIO_ALT|GPIO_AF2|GPIO_PORTE|GPIO_PIN8) +#define GPIO_XSPI_IO5_3 (GPIO_ALT|GPIO_AF0|GPIO_PORTD|GPIO_PIN5) +#define GPIO_XSPI_IO6_0 (GPIO_ALT|GPIO_AF3|GPIO_PORTC|GPIO_PIN3) +#define GPIO_XSPI_IO6_1 (GPIO_ALT|GPIO_AF0|GPIO_PORTD|GPIO_PIN6) +#define GPIO_XSPI_IO6_2 (GPIO_ALT|GPIO_AF2|GPIO_PORTE|GPIO_PIN9) +#define GPIO_XSPI_IO6_3 (GPIO_ALT|GPIO_AF0|GPIO_PORTG|GPIO_PIN9) +#define GPIO_XSPI_IO7_0 (GPIO_ALT|GPIO_AF0|GPIO_PORTD|GPIO_PIN7) +#define GPIO_XSPI_IO7_1 (GPIO_ALT|GPIO_AF2|GPIO_PORTE|GPIO_PIN10) +#define GPIO_XSPI_IO7_2 (GPIO_ALT|GPIO_AF0|GPIO_PORTG|GPIO_PIN14) +#define GPIO_XSPI_DQS_0 (GPIO_ALT|GPIO_AF1|GPIO_PORTB|GPIO_PIN2) +#define GPIO_XSPI_DQS_1 (GPIO_ALT|GPIO_AF1|GPIO_PORTC|GPIO_PIN5) +#define GPIO_XSPI_DQS_2 (GPIO_ALT|GPIO_AF0|GPIO_PORTA|GPIO_PIN1) +#define GPIO_XSPI1_NCLK_0 (GPIO_ALT|GPIO_AF1|GPIO_PORTB|GPIO_PIN12) +#define GPIO_XSPI1_NCLK_1 (GPIO_ALT|GPIO_AF6|GPIO_PORTI|GPIO_PIN15) +#define GPIO_XSPI1_NCLK_2 (GPIO_ALT|GPIO_AF1|GPIO_PORTF|GPIO_PIN11) +#define GPIO_XSPI1_NCS1_0 (GPIO_ALT|GPIO_AF0|GPIO_PORTB|GPIO_PIN10) +#define GPIO_XSPI1_NCS1_2 (GPIO_ALT|GPIO_AF1|GPIO_PORTB|GPIO_PIN6) +#define GPIO_XSPI1_NCS2_0 (GPIO_ALT|GPIO_AF2|GPIO_PORTE|GPIO_PIN7) +#define GPIO_XSPI1_NCS2_1 (GPIO_ALT|GPIO_AF0|GPIO_PORTC|GPIO_PIN11) +#define GPIO_XSPI1_NCS3_0 (GPIO_ALT|GPIO_AF3|GPIO_PORTE|GPIO_PIN8) +#define GPIO_XSPI1_NCS3_1 (GPIO_ALT|GPIO_AF1|GPIO_PORTE|GPIO_PIN11) +#define GPIO_XSPI1_NCS4_0 (GPIO_ALT|GPIO_AF3|GPIO_PORTE|GPIO_PIN9) +#define GPIO_XSPI1_NCS4_1 (GPIO_ALT|GPIO_AF0|GPIO_PORTG|GPIO_PIN6) +#define GPIO_XSPI1_NCSIN_0 (GPIO_ALT|GPIO_AF3|GPIO_PORTE|GPIO_PIN10) +#define GPIO_XSPI1_NCSIN_1 (GPIO_ALT|GPIO_AF1|GPIO_PORTE|GPIO_PIN1) + +/* ETH1 */ +#define GPIO_ETH1_CLK125_0 (GPIO_ALT|GPIO_AF1|GPIO_PUSHPULL|GPIO_PORTD|GPIO_PIN10) +#define GPIO_ETH1_GMII_GTX_CLK_0 (GPIO_ALT|GPIO_AF2|GPIO_PUSHPULL|GPIO_PORTF|GPIO_PIN5) +#define GPIO_ETH1_MII_RXD0_0 (GPIO_ALT|GPIO_AF1|GPIO_PUSHPULL|GPIO_PORTC|GPIO_PIN4) +#define GPIO_ETH1_MII_RXD1_0 (GPIO_ALT|GPIO_AF2|GPIO_PUSHPULL|GPIO_PORTC|GPIO_PIN5) +#define GPIO_ETH1_MII_RXD2_0 (GPIO_ALT|GPIO_AF2|GPIO_PUSHPULL|GPIO_PORTB|GPIO_PIN0) +#define GPIO_ETH1_MII_RXD2_1 (GPIO_ALT|GPIO_AF2|GPIO_PUSHPULL|GPIO_PORTH|GPIO_PIN6) +#define GPIO_ETH1_MII_RXD3_0 (GPIO_ALT|GPIO_AF2|GPIO_PUSHPULL|GPIO_PORTB|GPIO_PIN1) +#define GPIO_ETH1_MII_RXD3_1 (GPIO_ALT|GPIO_AF1|GPIO_PUSHPULL|GPIO_PORTH|GPIO_PIN7) +#define GPIO_ETH1_GMII_RXD4_0 (GPIO_ALT|GPIO_AF2|GPIO_PUSHPULL|GPIO_PORTE|GPIO_PIN12) +#define GPIO_ETH1_GMII_RXD4_1 (GPIO_ALT|GPIO_AF2|GPIO_PUSHPULL|GPIO_PORTH|GPIO_PIN8) +#define GPIO_ETH1_GMII_RXD5_0 (GPIO_ALT|GPIO_AF1|GPIO_PUSHPULL|GPIO_PORTE|GPIO_PIN13) +#define GPIO_ETH1_GMII_RXD5_1 (GPIO_ALT|GPIO_AF1|GPIO_PUSHPULL|GPIO_PORTH|GPIO_PIN9) +#define GPIO_ETH1_GMII_RXD6_0 (GPIO_ALT|GPIO_AF2|GPIO_PUSHPULL|GPIO_PORTE|GPIO_PIN14) +#define GPIO_ETH1_GMII_RXD6_1 (GPIO_ALT|GPIO_AF2|GPIO_PUSHPULL|GPIO_PORTH|GPIO_PIN10) +#define GPIO_ETH1_GMII_RXD7_0 (GPIO_ALT|GPIO_AF1|GPIO_PUSHPULL|GPIO_PORTE|GPIO_PIN15) +#define GPIO_ETH1_GMII_RXD7_1 (GPIO_ALT|GPIO_AF1|GPIO_PUSHPULL|GPIO_PORTH|GPIO_PIN11) +#define GPIO_ETH1_MII_TXD0_0 (GPIO_ALT|GPIO_AF2|GPIO_PUSHPULL|GPIO_PORTB|GPIO_PIN12) +#define GPIO_ETH1_MII_TXD0_1 (GPIO_ALT|GPIO_AF0|GPIO_PUSHPULL|GPIO_PORTG|GPIO_PIN13) +#define GPIO_ETH1_MII_TXD1_0 (GPIO_ALT|GPIO_AF1|GPIO_PUSHPULL|GPIO_PORTB|GPIO_PIN13) +#define GPIO_ETH1_MII_TXD1_1 (GPIO_ALT|GPIO_AF1|GPIO_PUSHPULL|GPIO_PORTG|GPIO_PIN12) +#define GPIO_ETH1_MII_TXD1_2 (GPIO_ALT|GPIO_AF1|GPIO_PUSHPULL|GPIO_PORTG|GPIO_PIN14) +#define GPIO_ETH1_MII_TXD2_0 (GPIO_ALT|GPIO_AF0|GPIO_PUSHPULL|GPIO_PORTE|GPIO_PIN3) +#define GPIO_ETH1_MII_TXD2_1 (GPIO_ALT|GPIO_AF4|GPIO_PUSHPULL|GPIO_PORTC|GPIO_PIN2) +#define GPIO_ETH1_MII_TXD2_2 (GPIO_ALT|GPIO_AF0|GPIO_PUSHPULL|GPIO_PORTB|GPIO_PIN7) +#define GPIO_ETH1_MII_TXD3_0 (GPIO_ALT|GPIO_AF1|GPIO_PUSHPULL|GPIO_PORTE|GPIO_PIN2) +#define GPIO_ETH1_MII_TXD3_1 (GPIO_ALT|GPIO_AF0|GPIO_PUSHPULL|GPIO_PORTB|GPIO_PIN8) +#define GPIO_ETH1_GMII_TXD4_0 (GPIO_ALT|GPIO_AF2|GPIO_PUSHPULL|GPIO_PORTF|GPIO_PIN0) +#define GPIO_ETH1_GMII_TXD4_1 (GPIO_ALT|GPIO_AF2|GPIO_PUSHPULL|GPIO_PORTI|GPIO_PIN4) +#define GPIO_ETH1_GMII_TXD5_0 (GPIO_ALT|GPIO_AF3|GPIO_PUSHPULL|GPIO_PORTF|GPIO_PIN1) +#define GPIO_ETH1_GMII_TXD5_1 (GPIO_ALT|GPIO_AF3|GPIO_PUSHPULL|GPIO_PORTI|GPIO_PIN5) +#define GPIO_ETH1_GMII_TXD6_0 (GPIO_ALT|GPIO_AF2|GPIO_PUSHPULL|GPIO_PORTF|GPIO_PIN2) +#define GPIO_ETH1_GMII_TXD6_1 (GPIO_ALT|GPIO_AF2|GPIO_PUSHPULL|GPIO_PORTI|GPIO_PIN6) +#define GPIO_ETH1_GMII_TXD7_0 (GPIO_ALT|GPIO_AF2|GPIO_PUSHPULL|GPIO_PORTF|GPIO_PIN3) +#define GPIO_ETH1_GMII_TXD7_1 (GPIO_ALT|GPIO_AF3|GPIO_PUSHPULL|GPIO_PORTI|GPIO_PIN7) +#define GPIO_ETH1_MDC_0 (GPIO_ALT|GPIO_AF1|GPIO_PUSHPULL|GPIO_PORTC|GPIO_PIN1) +#define GPIO_ETH1_MDIO_0 (GPIO_ALT|GPIO_AF1|GPIO_PUSHPULL|GPIO_PORTA|GPIO_PIN2) +#define GPIO_ETH1_MII_COL_0 (GPIO_ALT|GPIO_AF3|GPIO_PUSHPULL|GPIO_PORTH|GPIO_PIN3) +#define GPIO_ETH1_MII_COL_1 (GPIO_ALT|GPIO_AF2|GPIO_PUSHPULL|GPIO_PORTA|GPIO_PIN3) +#define GPIO_ETH1_MII_CRS_0 (GPIO_ALT|GPIO_AF0|GPIO_PUSHPULL|GPIO_PORTA|GPIO_PIN0) +#define GPIO_ETH1_MII_CRS_1 (GPIO_ALT|GPIO_AF4|GPIO_PUSHPULL|GPIO_PORTH|GPIO_PIN2) +#define GPIO_ETH1_MII_RX_CLK_0 (GPIO_ALT|GPIO_AF2|GPIO_PUSHPULL|GPIO_PORTA|GPIO_PIN1) +#define GPIO_ETH1_MII_RX_DV_0 (GPIO_ALT|GPIO_AF3|GPIO_PUSHPULL|GPIO_PORTA|GPIO_PIN7) +#define GPIO_ETH1_MII_RX_ER_0 (GPIO_ALT|GPIO_AF3|GPIO_PUSHPULL|GPIO_PORTI|GPIO_PIN10) +#define GPIO_ETH1_MII_RX_ER_1 (GPIO_ALT|GPIO_AF1|GPIO_PUSHPULL|GPIO_PORTB|GPIO_PIN10) +#define GPIO_ETH1_MII_TX_CLK_0 (GPIO_ALT|GPIO_AF4|GPIO_PUSHPULL|GPIO_PORTC|GPIO_PIN3) +#define GPIO_ETH1_MII_TX_EN_0 (GPIO_ALT|GPIO_AF0|GPIO_PUSHPULL|GPIO_PORTB|GPIO_PIN11) +#define GPIO_ETH1_MII_TX_EN_1 (GPIO_ALT|GPIO_AF2|GPIO_PUSHPULL|GPIO_PORTG|GPIO_PIN11) +#define GPIO_ETH1_MII_TX_ER_0 (GPIO_ALT|GPIO_AF3|GPIO_PUSHPULL|GPIO_PORTB|GPIO_PIN2) +#define GPIO_ETH1_MII_TX_ER_1 (GPIO_ALT|GPIO_AF0|GPIO_PUSHPULL|GPIO_PORTA|GPIO_PIN9) +#define GPIO_ETH1_PHY_INTN_0 (GPIO_ALT|GPIO_AF1|GPIO_PUSHPULL|GPIO_PORTD|GPIO_PIN15) +#define GPIO_ETH1_PHY_INTN_1 (GPIO_ALT|GPIO_AF1|GPIO_PUSHPULL|GPIO_PORTG|GPIO_PIN7) +#define GPIO_ETH1_PHY_INTN_2 (GPIO_ALT|GPIO_AF2|GPIO_PUSHPULL|GPIO_PORTG|GPIO_PIN15) +#define GPIO_ETH1_PHY_INTN_3 (GPIO_ALT|GPIO_AF0|GPIO_PUSHPULL|GPIO_PORTB|GPIO_PIN4) +#define GPIO_ETH1_PPS_OUT_0 (GPIO_ALT|GPIO_AF2|GPIO_PUSHPULL|GPIO_PORTD|GPIO_PIN14) +#define GPIO_ETH1_PPS_OUT_1 (GPIO_ALT|GPIO_AF2|GPIO_PUSHPULL|GPIO_PORTG|GPIO_PIN8) +#define GPIO_ETH1_PPS_OUT_2 (GPIO_ALT|GPIO_AF2|GPIO_PUSHPULL|GPIO_PORTB|GPIO_PIN5) + +/* ETH2 */ +#define GPIO_ETH2_MII_RXD0_0 (GPIO_ALT|GPIO_AF2|GPIO_PUSHPULL|GPIO_PORTG|GPIO_PIN2) +#define GPIO_ETH2_MII_RXD0_1 (GPIO_ALT|GPIO_AF2|GPIO_PUSHPULL|GPIO_PORTI|GPIO_PIN1) +#define GPIO_ETH2_MII_RXD0_2 (GPIO_ALT|GPIO_AF1|GPIO_PUSHPULL|GPIO_PORTG|GPIO_PIN9) +#define GPIO_ETH2_MII_RXD1_0 (GPIO_ALT|GPIO_AF0|GPIO_PUSHPULL|GPIO_PORTG|GPIO_PIN3) +#define GPIO_ETH2_MII_RXD1_1 (GPIO_ALT|GPIO_AF1|GPIO_PUSHPULL|GPIO_PORTI|GPIO_PIN2) +#define GPIO_ETH2_MII_RXD1_2 (GPIO_ALT|GPIO_AF2|GPIO_PUSHPULL|GPIO_PORTG|GPIO_PIN10) +#define GPIO_ETH2_MII_RXD2_1 (GPIO_ALT|GPIO_AF1|GPIO_PUSHPULL|GPIO_PORTG|GPIO_PIN4) +#define GPIO_ETH2_MII_RXD3_1 (GPIO_ALT|GPIO_AF2|GPIO_PUSHPULL|GPIO_PORTG|GPIO_PIN5) +#define GPIO_ETH2_MII_TX_CLK_0 (GPIO_ALT|GPIO_AF0|GPIO_PUSHPULL|GPIO_PORTI|GPIO_PIN8) +#define GPIO_ETH2_MII_TX_CLK_1 (GPIO_ALT|GPIO_AF4|GPIO_PUSHPULL|GPIO_PORTG|GPIO_PIN0) +#define GPIO_ETH2_MII_TX_EN_0 (GPIO_ALT|GPIO_AF6|GPIO_PUSHPULL|GPIO_PORTF|GPIO_PIN11) +#define GPIO_ETH2_MII_TX_EN_1 (GPIO_ALT|GPIO_AF1|GPIO_PUSHPULL|GPIO_PORTH|GPIO_PIN13) +#define GPIO_ETH2_MII_TX_ER_0 (GPIO_ALT|GPIO_AF4|GPIO_PUSHPULL|GPIO_PORTG|GPIO_PIN1) +#define GPIO_ETH2_MII_TXD0_0 (GPIO_ALT|GPIO_AF0|GPIO_PUSHPULL|GPIO_PORTH|GPIO_PIN4) +#define GPIO_ETH2_MII_TXD0_1 (GPIO_ALT|GPIO_AF2|GPIO_PUSHPULL|GPIO_PORTF|GPIO_PIN12) +#define GPIO_ETH2_MII_TXD0_2 (GPIO_ALT|GPIO_AF1|GPIO_PUSHPULL|GPIO_PORTH|GPIO_PIN14) +#define GPIO_ETH2_MII_TXD1_0 (GPIO_ALT|GPIO_AF1|GPIO_PUSHPULL|GPIO_PORTH|GPIO_PIN5) +#define GPIO_ETH2_MII_TXD1_1 (GPIO_ALT|GPIO_AF2|GPIO_PUSHPULL|GPIO_PORTF|GPIO_PIN13) +#define GPIO_ETH2_MII_TXD1_2 (GPIO_ALT|GPIO_AF2|GPIO_PUSHPULL|GPIO_PORTH|GPIO_PIN15) +#define GPIO_ETH2_MII_TXD2_1 (GPIO_ALT|GPIO_AF1|GPIO_PUSHPULL|GPIO_PORTF|GPIO_PIN14) +#define GPIO_ETH2_MII_TXD3_1 (GPIO_ALT|GPIO_AF2|GPIO_PUSHPULL|GPIO_PORTF|GPIO_PIN15) +#define GPIO_ETH2_PHY_INTN_0 (GPIO_ALT|GPIO_AF0|GPIO_PUSHPULL|GPIO_PORTE|GPIO_PIN4) +#define GPIO_ETH2_PHY_INTN_1 (GPIO_ALT|GPIO_AF4|GPIO_PUSHPULL|GPIO_PORTE|GPIO_PIN7) +#define GPIO_ETH2_PHY_INTN_2 (GPIO_ALT|GPIO_AF2|GPIO_PUSHPULL|GPIO_PORTD|GPIO_PIN15) +#define GPIO_ETH2_PPS_OUT_0 (GPIO_ALT|GPIO_AF2|GPIO_PUSHPULL|GPIO_PORTF|GPIO_PIN10) +#define GPIO_ETH2_PPS_OUT_1 (GPIO_ALT|GPIO_AF0|GPIO_PUSHPULL|GPIO_PORTI|GPIO_PIN15) +#define GPIO_ETH2_PPS_OUT_2 (GPIO_ALT|GPIO_AF2|GPIO_PUSHPULL|GPIO_PORTD|GPIO_PIN10) +#define GPIO_ETH2_MDC_0 (GPIO_ALT|GPIO_AF2|GPIO_PUSHPULL|GPIO_PORTF|GPIO_PIN7) +#define GPIO_ETH2_MDIO_0 (GPIO_ALT|GPIO_AF2|GPIO_PUSHPULL|GPIO_PORTF|GPIO_PIN6) +#define GPIO_ETH2_MII_COL_0 (GPIO_ALT|GPIO_AF2|GPIO_PUSHPULL|GPIO_PORTF|GPIO_PIN8) +#define GPIO_ETH2_MII_CRS_0 (GPIO_ALT|GPIO_AF2|GPIO_PUSHPULL|GPIO_PORTF|GPIO_PIN9) +#define GPIO_ETH2_MII_RX_CLK_0 (GPIO_ALT|GPIO_AF3|GPIO_PUSHPULL|GPIO_PORTF|GPIO_PIN4) +#define GPIO_ETH2_MII_RX_CLK_2 (GPIO_ALT|GPIO_AF0|GPIO_PUSHPULL|GPIO_PORTA|GPIO_PIN8) +#define GPIO_ETH2_MII_RX_DV_0 (GPIO_ALT|GPIO_AF2|GPIO_PUSHPULL|GPIO_PORTC|GPIO_PIN0) +#define GPIO_ETH2_MII_RX_DV_2 (GPIO_ALT|GPIO_AF2|GPIO_PUSHPULL|GPIO_PORTH|GPIO_PIN12) +#define GPIO_ETH2_MII_RX_ER_0 (GPIO_ALT|GPIO_AF1|GPIO_PUSHPULL|GPIO_PORTG|GPIO_PIN6) +#define GPIO_ETH2_MII_RX_ER_1 (GPIO_ALT|GPIO_AF2|GPIO_PUSHPULL|GPIO_PORTI|GPIO_PIN3) + +/* SDMMC1 */ +#define GPIO_SDMMC1_CD_0 (GPIO_ALT|GPIO_AF2|GPIO_PORTD|GPIO_PIN1) +#define GPIO_SDMMC1_CDIR_0 (GPIO_ALT|GPIO_AF0|GPIO_PORTB|GPIO_PIN9) +#define GPIO_SDMMC1_D0_0 (GPIO_ALT|GPIO_AF2|GPIO_PUSHPULL|GPIO_PORTB|GPIO_PIN13) +#define GPIO_SDMMC1_D0_1 (GPIO_ALT|GPIO_AF0|GPIO_PUSHPULL|GPIO_PORTC|GPIO_PIN8) +#define GPIO_SDMMC1_D0DIR_0 (GPIO_ALT|GPIO_AF0|GPIO_PORTG|GPIO_PIN6) +#define GPIO_SDMMC1_D1_0 (GPIO_ALT|GPIO_AF1|GPIO_PUSHPULL|GPIO_PORTC|GPIO_PIN9) +#define GPIO_SDMMC1_D2_0 (GPIO_ALT|GPIO_AF1|GPIO_PUSHPULL|GPIO_PORTC|GPIO_PIN10) +#define GPIO_SDMMC1_D3_0 (GPIO_ALT|GPIO_AF1|GPIO_PUSHPULL|GPIO_PORTC|GPIO_PIN11) +#define GPIO_SDMMC1_D4_0 (GPIO_ALT|GPIO_AF2|GPIO_PUSHPULL|GPIO_PORTB|GPIO_PIN8) +#define GPIO_SDMMC1_D4_1 (GPIO_ALT|GPIO_AF3|GPIO_PUSHPULL|GPIO_PORTD|GPIO_PIN14) +#define GPIO_SDMMC1_D5_0 (GPIO_ALT|GPIO_AF1|GPIO_PUSHPULL|GPIO_PORTB|GPIO_PIN9) +#define GPIO_SDMMC1_D5_1 (GPIO_ALT|GPIO_AF3|GPIO_PUSHPULL|GPIO_PORTD|GPIO_PIN15) +#define GPIO_SDMMC1_D6_0 (GPIO_ALT|GPIO_AF1|GPIO_PUSHPULL|GPIO_PORTC|GPIO_PIN6) +#define GPIO_SDMMC1_D6_1 (GPIO_ALT|GPIO_AF2|GPIO_PUSHPULL|GPIO_PORTB|GPIO_PIN6) +#define GPIO_SDMMC1_D7_0 (GPIO_ALT|GPIO_AF1|GPIO_PUSHPULL|GPIO_PORTC|GPIO_PIN7) +#define GPIO_SDMMC1_D7_1 (GPIO_ALT|GPIO_AF1|GPIO_PUSHPULL|GPIO_PORTB|GPIO_PIN7) +#define GPIO_SDMMC1_CK_0 (GPIO_ALT|GPIO_AF1|GPIO_PORTC|GPIO_PIN12) +#define GPIO_SDMMC1_CKIN_0 (GPIO_ALT|GPIO_AF1|GPIO_PUSHPULL|GPIO_PORTB|GPIO_PIN8) +#define GPIO_SDMMC1_CMD_0 (GPIO_ALT|GPIO_AF2|GPIO_PUSHPULL|GPIO_PORTD|GPIO_PIN2) +#define GPIO_SDMMC1_D123DIR_0 (GPIO_ALT|GPIO_AF0|GPIO_PORTC|GPIO_PIN7) +#define GPIO_SDMMC1_LEDCTRL_0 (GPIO_ALT|GPIO_AF0|GPIO_PUSHPULL|GPIO_PORTC|GPIO_PIN7) +#define GPIO_SDMMC1_LEDCTRL_1 (GPIO_ALT|GPIO_AF1|GPIO_PUSHPULL|GPIO_PORTI|GPIO_PIN11) +#define GPIO_SDMMC1_LEDCTRL_2 (GPIO_ALT|GPIO_AF3|GPIO_PUSHPULL|GPIO_PORTF|GPIO_PIN9) +#define GPIO_SDMMC1_LEDCTRL_3 (GPIO_ALT|GPIO_AF4|GPIO_PUSHPULL|GPIO_PORTE|GPIO_PIN8) +#define GPIO_SDMMC1_RST_0 (GPIO_ALT|GPIO_AF0|GPIO_PUSHPULL|GPIO_PORTD|GPIO_PIN3) +#define GPIO_SDMMC1_SEL_0 (GPIO_ALT|GPIO_AF1|GPIO_PUSHPULL|GPIO_PORTI|GPIO_PIN8) +#define GPIO_SDMMC1_SEL_1 (GPIO_ALT|GPIO_AF0|GPIO_PUSHPULL|GPIO_PORTA|GPIO_PIN11) +#define GPIO_SDMMC1_WP_0 (GPIO_ALT|GPIO_AF2|GPIO_PUSHPULL|GPIO_PULLUP|GPIO_PORTD|GPIO_PIN0) + +/* SDMMC2 */ +#define GPIO_SDMMC2_CD_0 (GPIO_ALT|GPIO_AF1|GPIO_PORTD|GPIO_PIN5) +#define GPIO_SDMMC2_CDIR_0 (GPIO_ALT|GPIO_AF3|GPIO_PORTG|GPIO_PIN5) +#define GPIO_SDMMC2_D0_0 (GPIO_ALT|GPIO_AF1|GPIO_PUSHPULL|GPIO_PORTB|GPIO_PIN14) +#define GPIO_SDMMC2_D0_1 (GPIO_ALT|GPIO_AF2|GPIO_PUSHPULL|GPIO_PORTG|GPIO_PIN9) +#define GPIO_SDMMC2_D0DIR_0 (GPIO_ALT|GPIO_AF1|GPIO_PORTG|GPIO_PIN13) +#define GPIO_SDMMC2_D1_0 (GPIO_ALT|GPIO_AF1|GPIO_PUSHPULL|GPIO_PORTB|GPIO_PIN15) +#define GPIO_SDMMC2_D1_1 (GPIO_ALT|GPIO_AF3|GPIO_PUSHPULL|GPIO_PORTG|GPIO_PIN10) +#define GPIO_SDMMC2_D2_0 (GPIO_ALT|GPIO_AF3|GPIO_PUSHPULL|GPIO_PORTG|GPIO_PIN11) +#define GPIO_SDMMC2_D2_1 (GPIO_ALT|GPIO_AF0|GPIO_PUSHPULL|GPIO_PORTB|GPIO_PIN3) +#define GPIO_SDMMC2_D3_0 (GPIO_ALT|GPIO_AF2|GPIO_PUSHPULL|GPIO_PORTG|GPIO_PIN12) +#define GPIO_SDMMC2_D3_1 (GPIO_ALT|GPIO_AF1|GPIO_PUSHPULL|GPIO_PORTB|GPIO_PIN4) +#define GPIO_SDMMC2_D4_0 (GPIO_ALT|GPIO_AF3|GPIO_PUSHPULL|GPIO_PORTG|GPIO_PIN4) +#define GPIO_SDMMC2_D4_1 (GPIO_ALT|GPIO_AF3|GPIO_PUSHPULL|GPIO_PORTB|GPIO_PIN8) +#define GPIO_SDMMC2_D5_0 (GPIO_ALT|GPIO_AF4|GPIO_PUSHPULL|GPIO_PORTG|GPIO_PIN5) +#define GPIO_SDMMC2_D5_1 (GPIO_ALT|GPIO_AF2|GPIO_PUSHPULL|GPIO_PORTB|GPIO_PIN9) +#define GPIO_SDMMC2_D6_0 (GPIO_ALT|GPIO_AF2|GPIO_PUSHPULL|GPIO_PORTG|GPIO_PIN13) +#define GPIO_SDMMC2_D6_1 (GPIO_ALT|GPIO_AF2|GPIO_PUSHPULL|GPIO_PORTC|GPIO_PIN6) +#define GPIO_SDMMC2_D7_0 (GPIO_ALT|GPIO_AF3|GPIO_PUSHPULL|GPIO_PORTG|GPIO_PIN14) +#define GPIO_SDMMC2_D7_1 (GPIO_ALT|GPIO_AF2|GPIO_PUSHPULL|GPIO_PORTC|GPIO_PIN7) +#define GPIO_SDMMC2_CK_0 (GPIO_ALT|GPIO_AF2|GPIO_PORTC|GPIO_PIN1) +#define GPIO_SDMMC2_CK_1 (GPIO_ALT|GPIO_AF1|GPIO_PORTD|GPIO_PIN6) +#define GPIO_SDMMC2_CKIN_0 (GPIO_ALT|GPIO_AF2|GPIO_PORTC|GPIO_PIN4) +#define GPIO_SDMMC2_CKIN_1 (GPIO_ALT|GPIO_AF2|GPIO_PORTG|GPIO_PIN4) +#define GPIO_SDMMC2_CMD_0 (GPIO_ALT|GPIO_AF1|GPIO_PUSHPULL|GPIO_PORTA|GPIO_PIN0) +#define GPIO_SDMMC2_CMD_1 (GPIO_ALT|GPIO_AF1|GPIO_PUSHPULL|GPIO_PORTD|GPIO_PIN7) +#define GPIO_SDMMC2_D123DIR_0 (GPIO_ALT|GPIO_AF2|GPIO_PORTG|GPIO_PIN14) +#define GPIO_SDMMC2_LEDCTRL_0 (GPIO_ALT|GPIO_AF2|GPIO_PUSHPULL|GPIO_PORTI|GPIO_PIN11) +#define GPIO_SDMMC2_LEDCTRL_1 (GPIO_ALT|GPIO_AF3|GPIO_PUSHPULL|GPIO_PORTF|GPIO_PIN8) +#define GPIO_SDMMC2_LEDCTRL_2 (GPIO_ALT|GPIO_AF4|GPIO_PUSHPULL|GPIO_PORTE|GPIO_PIN9) +#define GPIO_SDMMC2_RST_0 (GPIO_ALT|GPIO_AF3|GPIO_PUSHPULL|GPIO_PULLUP|GPIO_PORTG|GPIO_PIN15) +#define GPIO_SDMMC2_SEL_0 (GPIO_ALT|GPIO_AF2|GPIO_PUSHPULL|GPIO_PORTI|GPIO_PIN8) +#define GPIO_SDMMC2_SEL_1 (GPIO_ALT|GPIO_AF8|GPIO_PUSHPULL|GPIO_PORTC|GPIO_PIN5) +#define GPIO_SDMMC2_WP_0 (GPIO_ALT|GPIO_AF1|GPIO_PUSHPULL|GPIO_PORTD|GPIO_PIN4) + +/* USBHS1 */ +#define GPIO_USBHS1_SOF_0 (GPIO_ALT|GPIO_AF8|GPIO_PUSHPULL|GPIO_PORTA|GPIO_PIN8) +#define GPIO_USBHS1_VBUS_0 (GPIO_ALT|GPIO_AF9|GPIO_PUSHPULL|GPIO_PORTA|GPIO_PIN9) +#define GPIO_USBHS1_ID_0 (GPIO_ALT|GPIO_AF7|GPIO_PUSHPULL|GPIO_PORTA|GPIO_PIN10) +#define GPIO_USBHS1_DM_0 (GPIO_ALT|GPIO_AF10|GPIO_PUSHPULL|GPIO_PORTA|GPIO_PIN11) +#define GPIO_USBHS1_DP_0 (GPIO_ALT|GPIO_AF10|GPIO_PUSHPULL|GPIO_PORTA|GPIO_PIN12) + +/* USBHS2 */ +#define GPIO_USBHS2_SOF_0 (GPIO_ALT|GPIO_AF12|GPIO_PUSHPULL|GPIO_PORTA|GPIO_PIN4) +#define GPIO_USBHS2_ID_0 (GPIO_ALT|GPIO_AF11|GPIO_PUSHPULL|GPIO_PORTB|GPIO_PIN12) +#define GPIO_USBHS2_VBUS_0 (GPIO_ALT|GPIO_AF11|GPIO_PUSHPULL|GPIO_PORTB|GPIO_PIN13) +#define GPIO_USBHS2_DM_0 (GPIO_ALT|GPIO_AF12|GPIO_PUSHPULL|GPIO_PORTB|GPIO_PIN14) +#define GPIO_USBHS2_DP_0 (GPIO_ALT|GPIO_AF11|GPIO_PUSHPULL|GPIO_PORTB|GPIO_PIN15) + +#endif /* CONFIG_N32H7_N32H76X */ +#endif /* __ARCH_ARM_SRC_N32H7_HARDWARE_N32H76X_PINMAP_H */ diff --git a/arch/arm/src/n32h7/hardware/n32h76x_pwr.h b/arch/arm/src/n32h7/hardware/n32h76x_pwr.h new file mode 100644 index 0000000000000..2f99066485fb1 --- /dev/null +++ b/arch/arm/src/n32h7/hardware/n32h76x_pwr.h @@ -0,0 +1,712 @@ +/**************************************************************************** + * arch/arm/src/n32h7/hardware/n32h76x_pwr.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __ARCH_ARM_SRC_N32H7_HARDWARE_N32H76X_PWR_H +#define __ARCH_ARM_SRC_N32H7_HARDWARE_N32H76X_PWR_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* Register Offsets *********************************************************/ + +#define N32_PWR_C1_PWR_CR_OFFSET 0x0000 /* Core1 power control register */ +#define N32_PWR_C1_PWR_CSR_OFFSET 0x0004 /* Core1 power status register */ +#define N32_PWR_C1_PWR_CR2_OFFSET 0x0008 /* Core1 power control register 2 */ + +#define N32_PWR_C2_PWR_CR_OFFSET 0x0020 /* Core2 power control register */ +#define N32_PWR_C2_PWR_CSR_OFFSET 0x0024 /* Core2 power status register */ +#define N32_PWR_C2_PWR_CR2_OFFSET 0x0028 /* Core2 power control register 2 */ + +#define N32_PWR_SYS_PWR_CR_OFFSET 0x0040 /* System power control register */ +#define N32_PWR_SYS_PWR_CSR_OFFSET 0x0044 /* System power status register */ +#define N32_PWR_SYS_PWR_CR2_OFFSET 0x0048 /* System power control register 2 */ +#define N32_PWR_SYS_PWR_CR3_OFFSET 0x004C /* System power control register 3 */ +#define N32_PWR_SYS_PWR_CR4_OFFSET 0x0050 /* System power control register 4 */ +#define N32_PWR_SYS_PWR_BOR_CR_OFFSET 0x0054 /* System brown-out reset control register */ +#define N32_PWR_IP_MEMPWR_CR_OFFSET 0x0058 /* IP memory power control register */ +#define N32_PWR_IP_MEMPWR_CSR_OFFSET 0x005C /* IP memory power status register */ + +#define N32_PWR_C1_MEM_LPCR1_OFFSET 0x0060 /* Core1 memory low-power control register 1 */ +#define N32_PWR_C1_MEM_LPSR1_OFFSET 0x0064 /* Core1 memory low-power status register 1 */ +#define N32_PWR_C1_TCM_PG0_OFFSET 0x0068 /* Core1 TCM power gating register 0 */ +#define N32_PWR_C1_TCM_PG1_OFFSET 0x006C /* Core1 TCM power gating register 1 */ +#define N32_PWR_C1_TCM_RET1N0_OFFSET 0x0070 /* Core1 TCM retention register 1N0 */ +#define N32_PWR_C1_TCM_RET1N1_OFFSET 0x0074 /* Core1 TCM retention register 1N1 */ +#define N32_PWR_C1_TCM_RET2N0_OFFSET 0x0078 /* Core1 TCM retention register 2N0 */ +#define N32_PWR_C1_TCM_RET2N1_OFFSET 0x007C /* Core1 TCM retention register 2N1 */ + +#define N32_PWR_C2_MEM_LPCR_OFFSET 0x0090 /* Core2 memory low-power control register */ + +#define N32_PWR_SYS_MEM_LPCR_OFFSET 0x00A0 /* System memory low-power control register */ + +#define N32_PWR_SYS_PWR_SHRT_CR_OFFSET 0x00B0 /* System power short control register */ +#define N32_PWR_SYS_PWR_MDMA_CR_OFFSET 0x00B4 /* System power MDMA control register */ +#define N32_PWR_SYS_PWR_ETHCAT_CR_OFFSET 0x00B8 /* System power EtherCAT control register */ + +#define N32_PWR_PWR_EMC_CR0_OFFSET 0x0100 /* EMC power control register 0 */ +#define N32_PWR_PWR_EMC_CR1_OFFSET 0x0104 /* EMC power control register 1 */ +#define N32_PWR_PWR_EMC_CR2_OFFSET 0x0108 /* EMC power control register 2 */ +#define N32_PWR_PWR_EMC_CR3_OFFSET 0x010C /* EMC power control register 3 */ +#define N32_PWR_PWR_EMC_CR4_OFFSET 0x0110 /* EMC power control register 4 */ +#define N32_PWR_PWR_EMC_CR5_OFFSET 0x0114 /* EMC power control register 5 */ +#define N32_PWR_PWR_EMC_CR6_OFFSET 0x0118 /* EMC power control register 6 */ +#define N32_PWR_PWR_EMC_CR7_OFFSET 0x011C /* EMC power control register 7 */ +#define N32_PWR_PWR_BKP_EMC_CR0_OFFSET 0x0120 /* Backup EMC power control register 0 */ +#define N32_PWR_PWR_BKP_EMC_CR1_OFFSET 0x0124 /* Backup EMC power control register 1 */ + +/* Register Addresses *******************************************************/ + +/** POR BOR DCDC VSEL Control Register **/ +#define PVD_Contrl (N32_AFEC_BASE + 0x2CU) +#define AVD_Contrl (N32_AFEC_BASE + 0x00U) +#define DCDC_Contrl (N32_AFEC_BASE + 0x30U) + +#define N32_PWR_C1_PWR_CR (N32_PWR_BASE + N32_PWR_C1_PWR_CR_OFFSET) +#define N32_PWR_C1_PWR_CSR (N32_PWR_BASE + N32_PWR_C1_PWR_CSR_OFFSET) +#define N32_PWR_C1_PWR_CR2 (N32_PWR_BASE + N32_PWR_C1_PWR_CR2_OFFSET) + +#define N32_PWR_C2_PWR_CR (N32_PWR_BASE + N32_PWR_C2_PWR_CR_OFFSET) +#define N32_PWR_C2_PWR_CSR (N32_PWR_BASE + N32_PWR_C2_PWR_CSR_OFFSET) +#define N32_PWR_C2_PWR_CR2 (N32_PWR_BASE + N32_PWR_C2_PWR_CR2_OFFSET) + +#define N32_PWR_SYS_PWR_CR (N32_PWR_BASE + N32_PWR_SYS_PWR_CR_OFFSET) +#define N32_PWR_SYS_PWR_CSR (N32_PWR_BASE + N32_PWR_SYS_PWR_CSR_OFFSET) +#define N32_PWR_SYS_PWR_CR2 (N32_PWR_BASE + N32_PWR_SYS_PWR_CR2_OFFSET) +#define N32_PWR_SYS_PWR_CR3 (N32_PWR_BASE + N32_PWR_SYS_PWR_CR3_OFFSET) +#define N32_PWR_SYS_PWR_CR4 (N32_PWR_BASE + N32_PWR_SYS_PWR_CR4_OFFSET) +#define N32_PWR_SYS_PWR_BOR_CR (N32_PWR_BASE + N32_PWR_SYS_PWR_BOR_CR_OFFSET) +#define N32_PWR_IP_MEMPWR_CR (N32_PWR_BASE + N32_PWR_IP_MEMPWR_CR_OFFSET) +#define N32_PWR_IP_MEMPWR_CSR (N32_PWR_BASE + N32_PWR_IP_MEMPWR_CSR_OFFSET) + +#define N32_PWR_C1_MEM_LPCR1 (N32_PWR_BASE + N32_PWR_C1_MEM_LPCR1_OFFSET) +#define N32_PWR_C1_MEM_LPSR1 (N32_PWR_BASE + N32_PWR_C1_MEM_LPSR1_OFFSET) +#define N32_PWR_C1_TCM_PG0 (N32_PWR_BASE + N32_PWR_C1_TCM_PG0_OFFSET) +#define N32_PWR_C1_TCM_PG1 (N32_PWR_BASE + N32_PWR_C1_TCM_PG1_OFFSET) +#define N32_PWR_C1_TCM_RET1N0 (N32_PWR_BASE + N32_PWR_C1_TCM_RET1N0_OFFSET) +#define N32_PWR_C1_TCM_RET1N1 (N32_PWR_BASE + N32_PWR_C1_TCM_RET1N1_OFFSET) +#define N32_PWR_C1_TCM_RET2N0 (N32_PWR_BASE + N32_PWR_C1_TCM_RET2N0_OFFSET) +#define N32_PWR_C1_TCM_RET2N1 (N32_PWR_BASE + N32_PWR_C1_TCM_RET2N1_OFFSET) + +#define N32_PWR_C2_MEM_LPCR (N32_PWR_BASE + N32_PWR_C2_MEM_LPCR_OFFSET) + +#define N32_PWR_SYS_MEM_LPCR (N32_PWR_BASE + N32_PWR_SYS_MEM_LPCR_OFFSET) + +#define N32_PWR_SYS_PWR_SHRT_CR (N32_PWR_BASE + N32_PWR_SYS_PWR_SHRT_CR_OFFSET) +#define N32_PWR_SYS_PWR_MDMA_CR (N32_PWR_BASE + N32_PWR_SYS_PWR_MDMA_CR_OFFSET) +#define N32_PWR_SYS_PWR_ETHCAT_CR (N32_PWR_BASE + N32_PWR_SYS_PWR_ETHCAT_CR_OFFSET) + +#define N32_PWR_PWR_EMC_CR0 (N32_PWR_BASE + N32_PWR_PWR_EMC_CR0_OFFSET) +#define N32_PWR_PWR_EMC_CR1 (N32_PWR_BASE + N32_PWR_PWR_EMC_CR1_OFFSET) +#define N32_PWR_PWR_EMC_CR2 (N32_PWR_BASE + N32_PWR_PWR_EMC_CR2_OFFSET) +#define N32_PWR_PWR_EMC_CR3 (N32_PWR_BASE + N32_PWR_PWR_EMC_CR3_OFFSET) +#define N32_PWR_PWR_EMC_CR4 (N32_PWR_BASE + N32_PWR_PWR_EMC_CR4_OFFSET) +#define N32_PWR_PWR_EMC_CR5 (N32_PWR_BASE + N32_PWR_PWR_EMC_CR5_OFFSET) +#define N32_PWR_PWR_EMC_CR6 (N32_PWR_BASE + N32_PWR_PWR_EMC_CR6_OFFSET) +#define N32_PWR_PWR_EMC_CR7 (N32_PWR_BASE + N32_PWR_PWR_EMC_CR7_OFFSET) +#define N32_PWR_PWR_BKP_EMC_CR0 (N32_PWR_BASE + N32_PWR_PWR_BKP_EMC_CR0_OFFSET) +#define N32_PWR_PWR_BKP_EMC_CR1 (N32_PWR_BASE + N32_PWR_PWR_BKP_EMC_CR1_OFFSET) + +/* Register Bitfield Definitions ********************************************/ + +/** PVD level config **/ +#define PWR_PVD_LEVEL_MASK ((uint32_t)0x001E0000U) +#define PWR_PVD_LEVEL_1V78 ((uint32_t)0x00000000U) +#define PWR_PVD_LEVEL_1V88 ((uint32_t)0x00020000U) +#define PWR_PVD_LEVEL_1V98 ((uint32_t)0x00040000U) +#define PWR_PVD_LEVEL_2V08 ((uint32_t)0x00060000U) +#define PWR_PVD_LEVEL_2V18 ((uint32_t)0x00080000U) +#define PWR_PVD_LEVEL_2V28 ((uint32_t)0x000A0000U) +#define PWR_PVD_LEVEL_2V38 ((uint32_t)0x000C0000U) +#define PWR_PVD_LEVEL_2V48 ((uint32_t)0x000E0000U) +#define PWR_PVD_LEVEL_2V58 ((uint32_t)0x00100000U) +#define PWR_PVD_LEVEL_2V68 ((uint32_t)0x00120000U) +#define PWR_PVD_LEVEL_2V78 ((uint32_t)0x00140000U) +#define PWR_PVD_LEVEL_2V88 ((uint32_t)0x00160000U) +#define PWR_PVD_LEVEL_3V28 ((uint32_t)0x00180000U) +#define PWR_PVD_LEVEL_3V38 ((uint32_t)0x001A0000U) +#define PWR_PVD_LEVEL_3V48 ((uint32_t)0x001C0000U) +#define PWR_PVD_LEVEL_3V58 ((uint32_t)0x001E0000U) + +/** AVD level config **/ +#define PWR_AVD_LEVEL_MASK ((uint32_t)0x0000F000U) +#define PWR_AVD_LEVEL_1V78 ((uint32_t)0x00000000U) +#define PWR_AVD_LEVEL_1V88 ((uint32_t)0x00001000U) +#define PWR_AVD_LEVEL_1V98 ((uint32_t)0x00002000U) +#define PWR_AVD_LEVEL_2V08 ((uint32_t)0x00003000U) +#define PWR_AVD_LEVEL_2V18 ((uint32_t)0x00004000U) +#define PWR_AVD_LEVEL_2V28 ((uint32_t)0x00005000U) +#define PWR_AVD_LEVEL_2V38 ((uint32_t)0x00006000U) +#define PWR_AVD_LEVEL_2V48 ((uint32_t)0x00007000U) +#define PWR_AVD_LEVEL_2V58 ((uint32_t)0x00008000U) +#define PWR_AVD_LEVEL_2V68 ((uint32_t)0x00009000U) +#define PWR_AVD_LEVEL_2V78 ((uint32_t)0x0000A000U) +#define PWR_AVD_LEVEL_2V88 ((uint32_t)0x0000B000U) +#define PWR_AVD_LEVEL_3V28 ((uint32_t)0x0000C000U) +#define PWR_AVD_LEVEL_3V38 ((uint32_t)0x0000D000U) +#define PWR_AVD_LEVEL_3V48 ((uint32_t)0x0000E000U) +#define PWR_AVD_LEVEL_3V58 ((uint32_t)0x0000F000U) + +/* PWR M7 Control register 1 (PWR_M7CTRL1) */ +#define PWR_M7CTRL1_CVBTF (1 << 16) /* Bit 16: Clear VBAT flags */ +#define PWR_M7CTRL1_CSBF (1 << 3) /* Bit 3: Clear STANDBY flags */ +#define PWR_M7CTRL1_CWKUPF (1 << 2) /* Bit 2: Clear the pin wakeup bit */ +#define PWR_M7CTRL1_PDSEN (1 << 1) /* Bit 1: Power down deep sleep enable bit */ + +/* PWR M7 Control Status register (PWR_M7CTRLSTS) */ +#define PWR_M7CTRLSTS_WKUP6F (1 << 26) /* Bit 26: RTC wakeup flag */ +#define PWR_M7CTRLSTS_WKUP5F (1 << 25) /* Bit 25: WKUP5 pin PC1 wakeup flag */ +#define PWR_M7CTRLSTS_WKUP4F (1 << 24) /* Bit 24: WKUP4 pin PI11 wakeup flag */ +#define PWR_M7CTRLSTS_WKUP3F (1 << 23) /* Bit 23: WKUP3 pin PI8 wakeup flag */ +#define PWR_M7CTRLSTS_WKUP2F (1 << 22) /* Bit 22: WKUP2 pin PC13 wakeup flag */ +#define PWR_M7CTRLSTS_WKUP1F (1 << 21) /* Bit 21: WKUP1 pin PA2 wakeup flag */ +#define PWR_M7CTRLSTS_WKUP0F (1 << 20) /* Bit 20: WKUP0 pin PA0 wakeup flag */ + +#define PWR_M7CTRLSTS_WKUP5POL (1 << 19) /* Bit 19: Wake-up polarity for the WKUP5 pin PC1 */ +#define PWR_M7CTRLSTS_WKUP4POL (1 << 18) /* Bit 18: Wake-up polarity for the WKUP4 pin PI11 */ +#define PWR_M7CTRLSTS_WKUP3POL (1 << 17) /* Bit 17: Wake-up polarity for the WKUP3 pin PI8 */ +#define PWR_M7CTRLSTS_WKUP2POL (1 << 16) /* Bit 16: Wake-up polarity for the WKUP2 pin PC13 */ +#define PWR_M7CTRLSTS_WKUP1POL (1 << 15) /* Bit 15: Wake-up polarity for the WKUP1 pin PA2 */ +#define PWR_M7CTRLSTS_WKUP0POL (1 << 14) /* Bit 14: Wake-up polarity for the WKUP0 pin PA0 */ + +#define PWR_M7CTRLSTS_WKUP5EN (1 << 13) /* Bit 13: WKUP5 pin PC1 wakeup enable */ +#define PWR_M7CTRLSTS_WKUP4EN (1 << 12) /* Bit 12: WKUP4 pin PI11 wakeup enable */ +#define PWR_M7CTRLSTS_WKUP3EN (1 << 11) /* Bit 11: WKUP3 pin PI8 wakeup enable */ +#define PWR_M7CTRLSTS_WKUP2EN (1 << 10) /* Bit 10: WKUP2 pin PC13 wakeup enable */ +#define PWR_M7CTRLSTS_WKUP1EN (1 << 9) /* Bit 9: WKUP1 pin PA2 wakeup enable */ +#define PWR_M7CTRLSTS_WKUP0EN (1 << 8) /* Bit 8: WKUP0 pin PA0 wakeup enable */ + +#define PWR_M7CTRLSTS_VBATF (1 << 2) /* Bit 2: VBAT flag */ +#define PWR_M7CTRLSTS_SBF (1 << 1) /* Bit 1: STANDBY flag */ + +/* PWR M7 Control register 2 (PWR_M7CTRL2) */ +#define PWR_M7CTRL2_MEM_CNTVAL_SHIFT (25) /* Bits 25-30: Counter value for memory power ready count down */ +#define PWR_M7CTRL2_MEM_CNTVAL_MASK (0x3F << PWR_M7CTRL2_MEM_CNTVAL_SHIFT) + +#define PWR_M7CTRL2_PWR_CNTVAL_SHIFT (17) /* Bits 17-24: Counter value for CM7 logic power ready count down */ +#define PWR_M7CTRL2_PWR_CNTVAL_MASK (0xFF << PWR_M7CTRL2_PWR_CNTVAL_SHIFT) + +#define PWR_M7CTRL2_TCM_RDYMD_SHIFT (15) /* Bits 15-16: Selected the way of check TCM power ready for CM7 domain */ +#define PWR_M7CTRL2_TCM_RDYMD_MASK (0x3 << PWR_M7CTRL2_TCM_RDYMD_SHIFT) +# define PWR_M7CTRL2_TCM_RDYMD_RDY_ONLY (0x0 << PWR_M7CTRL2_TCM_RDYMD_SHIFT) /* 00: Check only RDY signal */ +# define PWR_M7CTRL2_TCM_RDYMD_DELAY (0x1 << PWR_M7CTRL2_TCM_RDYMD_SHIFT) /* 01: Check delay after enabled */ +# define PWR_M7CTRL2_TCM_RDYMD_RDY_DELAY (0x2 << PWR_M7CTRL2_TCM_RDYMD_SHIFT)/* 10: Check delay and RDY signal */ +# define PWR_M7CTRL2_TCM_RDYMD_DELAY_RDY (0x3 << PWR_M7CTRL2_TCM_RDYMD_SHIFT)/* 11: Check delay after RDY signal */ + +#define PWR_M7CTRL2_PWR_RDYMD_SHIFT (13) /* Bits 13-14: Selected the way of check power ready for CM7 domain */ +#define PWR_M7CTRL2_PWR_RDYMD_MASK (0x3 << PWR_M7CTRL2_PWR_RDYMD_SHIFT) +# define PWR_M7CTRL2_PWR_RDYMD_RDY_ONLY (0x0 << PWR_M7CTRL2_PWR_RDYMD_SHIFT) /* 00: Check only RDY signal */ +# define PWR_M7CTRL2_PWR_RDYMD_DELAY (0x1 << PWR_M7CTRL2_PWR_RDYMD_SHIFT) /* 01: Check delay after enabled */ +# define PWR_M7CTRL2_PWR_RDYMD_RDY_DELAY (0x2 << PWR_M7CTRL2_PWR_RDYMD_SHIFT)/* 10: Check delay and RDY signal */ +# define PWR_M7CTRL2_PWR_RDYMD_DELAY_RDY (0x3 << PWR_M7CTRL2_PWR_RDYMD_SHIFT)/* 11: Check delay after RDY signal */ + +#define PWR_M7CTRL2_HCLK_ONINSLP (1 << 12) /* Bit 12: HCLK on in sleep mode */ +#define PWR_M7CTRL2_NRST_WUPEN (1 << 11) /* Bit 11: NRST wakeup event enable in standby mode for M7 core */ +#define PWR_M7CTRL2_RTC_ALMWUPEN (1 << 8) /* Bit 8: RTC_ALARM wakeup enable in standby mode for M7 core */ +#define PWR_M7CTRL2_BSRSTBRET (1 << 2) /* Bit 2: Backup SRAM retention enable in STANDBY mode */ +#define PWR_M7CTRL2_BSRVBRET (1 << 1) /* Bit 1: Backup SRAM retention enable in VBAT mode */ +#define PWR_M7CTRL2_STOP2EN (1 << 0) /* Bit 0: M7 core STOP2 mode enable */ + +/* PWR M4 Control register 1 (PWR_M4CTRL1) */ +#define PWR_M4CTRL1_CVBTF (1 << 16) /* Bit 16: Clear VBAT flags */ +#define PWR_M4CTRL1_CSBF (1 << 3) /* Bit 3: Clear STANDBY flags */ +#define PWR_M4CTRL1_CWKUPF (1 << 2) /* Bit 2: Clear the pin wakeup bit */ +#define PWR_M4CTRL1_PDS (1 << 1) /* Bit 1: Power down deep sleep bit */ + +/* PWR M4 Control Status register (PWR_M4CTRLSTS) */ +#define PWR_M4CTRLSTS_WKUP6F (1 << 26) /* Bit 26: RTC wakeup flag */ +#define PWR_M4CTRLSTS_WKUP5F (1 << 25) /* Bit 25: WKUP5 pin PC1 wakeup flag */ +#define PWR_M4CTRLSTS_WKUP4F (1 << 24) /* Bit 24: WKUP4 pin PI11 wakeup flag */ +#define PWR_M4CTRLSTS_WKUP3F (1 << 23) /* Bit 23: WKUP3 pin PI8 wakeup flag */ +#define PWR_M4CTRLSTS_WKUP2F (1 << 22) /* Bit 22: WKUP2 pin PC13 wakeup flag */ +#define PWR_M4CTRLSTS_WKUP1F (1 << 21) /* Bit 21: WKUP1 pin PA2 wakeup flag */ +#define PWR_M4CTRLSTS_WKUP0F (1 << 20) /* Bit 20: WKUP0 pin PA0 wakeup flag */ + +#define PWR_M4CTRLSTS_WKUP5POL (1 << 19) /* Bit 19: Wake-up polarity for the WKUP5 pin PC1 */ +#define PWR_M4CTRLSTS_WKUP4POL (1 << 18) /* Bit 18: Wake-up polarity for the WKUP4 pin PI11 */ +#define PWR_M4CTRLSTS_WKUP3POL (1 << 17) /* Bit 17: Wake-up polarity for the WKUP3 pin PI8 */ +#define PWR_M4CTRLSTS_WKUP2POL (1 << 16) /* Bit 16: Wake-up polarity for the WKUP2 pin PC13 */ +#define PWR_M4CTRLSTS_WKUP1POL (1 << 15) /* Bit 15: Wake-up polarity for the WKUP1 pin PA2 */ +#define PWR_M4CTRLSTS_WKUP0POL (1 << 14) /* Bit 14: Wake-up polarity for the WKUP0 pin PA0 */ + +#define PWR_M4CTRLSTS_WKUP5EN (1 << 13) /* Bit 13: WKUP5 pin PC1 wakeup enable */ +#define PWR_M4CTRLSTS_WKUP4EN (1 << 12) /* Bit 12: WKUP4 pin PI11 wakeup enable */ +#define PWR_M4CTRLSTS_WKUP3EN (1 << 11) /* Bit 11: WKUP3 pin PI8 wakeup enable */ +#define PWR_M4CTRLSTS_WKUP2EN (1 << 10) /* Bit 10: WKUP2 pin PC13 wakeup enable */ +#define PWR_M4CTRLSTS_WKUP1EN (1 << 9) /* Bit 9: WKUP1 pin PA2 wakeup enable */ +#define PWR_M4CTRLSTS_WKUP0EN (1 << 8) /* Bit 8: WKUP0 pin PA0 wakeup enable */ + +#define PWR_M4CTRLSTS_VBATF (1 << 2) /* Bit 2: VBAT flag */ +#define PWR_M4CTRLSTS_SBF (1 << 1) /* Bit 1: STANDBY flag */ + +/* PWR M4 Control register 2 (PWR_M4CTRL2) */ +#define PWR_M4CTRL2_MEM_CNTVAL_SHIFT (25) /* Bits 25-30: Counter value for memory power ready count down */ +#define PWR_M4CTRL2_MEM_CNTVAL_MASK (0x3F << PWR_M4CTRL2_MEM_CNTVAL_SHIFT) + +#define PWR_M4CTRL2_PWR_CNTVAL_SHIFT (17) /* Bits 17-24: Counter value for CM4 logic power ready count down */ +#define PWR_M4CTRL2_PWR_CNTVAL_MASK (0xFF << PWR_M4CTRL2_PWR_CNTVAL_SHIFT) + +#define PWR_M4CTRL2_TCM_RDYMD_SHIFT (15) /* Bits 15-16: Selected the way of check TCM power ready for CM4 domain */ +#define PWR_M4CTRL2_TCM_RDYMD_MASK (0x3 << PWR_M4CTRL2_TCM_RDYMD_SHIFT) +# define PWR_M4CTRL2_TCM_RDYMD_RDY_ONLY (0x0 << PWR_M4CTRL2_TCM_RDYMD_SHIFT) /* 00: Check only RDY signal */ +# define PWR_M4CTRL2_TCM_RDYMD_DELAY (0x1 << PWR_M4CTRL2_TCM_RDYMD_SHIFT) /* 01: Check delay after enabled */ +# define PWR_M4CTRL2_TCM_RDYMD_RDY_DELAY (0x2 << PWR_M4CTRL2_TCM_RDYMD_SHIFT)/* 10: Check delay and RDY signal */ +# define PWR_M4CTRL2_TCM_RDYMD_DELAY_RDY (0x3 << PWR_M4CTRL2_TCM_RDYMD_SHIFT)/* 11: Check delay after RDY signal */ + +#define PWR_M4CTRL2_PWR_RDYMD_SHIFT (13) /* Bits 13-14: Selected the way of check power ready for CM4 domain */ +#define PWR_M4CTRL2_PWR_RDYMD_MASK (0x3 << PWR_M4CTRL2_PWR_RDYMD_SHIFT) +# define PWR_M4CTRL2_PWR_RDYMD_RDY_ONLY (0x0 << PWR_M4CTRL2_PWR_RDYMD_SHIFT) /* 00: Check only RDY signal */ +# define PWR_M4CTRL2_PWR_RDYMD_DELAY (0x1 << PWR_M4CTRL2_PWR_RDYMD_SHIFT) /* 01: Check delay after enabled */ +# define PWR_M4CTRL2_PWR_RDYMD_RDY_DELAY (0x2 << PWR_M4CTRL2_PWR_RDYMD_SHIFT)/* 10: Check delay and RDY signal */ +# define PWR_M4CTRL2_PWR_RDYMD_DELAY_RDY (0x3 << PWR_M4CTRL2_PWR_RDYMD_SHIFT)/* 11: Check delay after RDY signal */ + +#define PWR_M4CTRL2_HCLK_ONINSLP (1 << 12) /* Bit 12: HCLK on in sleep mode */ +#define PWR_M4CTRL2_NRST_WUPEN (1 << 11) /* Bit 11: NRST wakeup event enable in standby mode for M4 core */ +#define PWR_M4CTRL2_RTC_ALMWUPEN (1 << 8) /* Bit 8: RTC_ALARM wakeup enable in standby mode for M4 core */ +#define PWR_M4CTRL2_BSRSTBRET (1 << 2) /* Bit 2: Backup SRAM retention enable in STANDBY mode */ +#define PWR_M4CTRL2_BSRVBRET (1 << 1) /* Bit 1: Backup SRAM retention enable in VBAT mode */ +#define PWR_M4CTRL2_STOP2EN (1 << 0) /* Bit 0: M4 core STOP2 mode enable */ + +/* PWR System Control register 1 (PWR_SYSCTRL1) */ +#define PWR_SYSCTRL1_DCDC_VSELKEY_SHIFT (28) /* Bits 28-31: DCDC_VSELKEY_UNLOCK key */ +#define PWR_SYSCTRL1_DCDC_VSELKEY_MASK (0xF << PWR_SYSCTRL1_DCDC_VSELKEY_SHIFT) +# define PWR_SYSCTRL1_DCDC_VSELKEY_UNLOCK (0xF << PWR_SYSCTRL1_DCDC_VSELKEY_SHIFT) /* 1111: Unlock */ + +#define PWR_SYSCTRL1_NRST_DGFCNT_SHIFT (16) /* Bits 16-27: Digital Glitch Filter on NRST filtered pulse width configuration */ +#define PWR_SYSCTRL1_NRST_DGFCNT_MASK (0xFFF << PWR_SYSCTRL1_NRST_DGFCNT_SHIFT) + +#define PWR_SYSCTRL1_NRST_DGFBP (1 << 15) /* Bit 15: Bypass digital glitch Filter on NRST */ +#define PWR_SYSCTRL1_AGF_STBWUPPBP (1 << 13) /* Bit 13: Bypass analog glitch filter on standby wakeup pads */ +#define PWR_SYSCTRL1_AGF_DTASGBP (1 << 12) /* Bit 12: Bypass analog glitch filter on some digital to analog enable signals */ +#define PWR_SYSCTRL1_AGF_ARSTOBP (1 << 11) /* Bit 11: Bypass analog glitch filter on analog reset outputs */ +#define PWR_SYSCTRL1_DBKP (1 << 8) /* Bit 8: Disable write protection for the backup domain */ +#define PWR_SYSCTRL1_PVDEN (1 << 4) /* Bit 4: Power Voltage Detector (PVD) Enable */ +#define PWR_SYSCTRL1_AVDEN (1 << 3) /* Bit 3: Analog Voltage Detector (AVD) Enable */ +#define PWR_SYSCTRL1_BKPLDOEN (1 << 1) /* Bit 1: Backup LDO enable */ +#define PWR_SYSCTRL1_BKPLDO_CTRLEN (1 << 0) /* Bit 0: Backup LDO control enable */ + +/* PWR System Control Status register (PWR_SYSCTRLSTS) */ +#define PWR_SYSCTRLSTS_PVDO (1 << 4) /* Bit 4: PVD output */ +#define PWR_SYSCTRLSTS_AVDO (1 << 3) /* Bit 3: AVD output */ +#define PWR_SYSCTRLSTS_OTPPWRRDY (1 << 1) /* Bit 1: OTP Power Ready */ +#define PWR_SYSCTRLSTS_DCDCBPF (1 << 0) /* Bit 0: DCDC Bypass flag */ + +/* PWR System Control register 2 (PWR_SYSCTRL2) */ +#define PWR_SYSCTRL2_OTP_LPCLKDIV_SHIFT (24) /* Bits 24-26: Clock divisor for OTP low power mode */ +#define PWR_SYSCTRL2_OTP_LPCLKDIV_MASK (0x7 << PWR_SYSCTRL2_OTP_LPCLKDIV_SHIFT) +# define PWR_SYSCTRL2_OTP_LPCLKDIV_DIV1 (0x0 << PWR_SYSCTRL2_OTP_LPCLKDIV_SHIFT) /* 000: No division */ +# define PWR_SYSCTRL2_OTP_LPCLKDIV_DIV2 (0x1 << PWR_SYSCTRL2_OTP_LPCLKDIV_SHIFT) /* 001: Divide by 2 */ +# define PWR_SYSCTRL2_OTP_LPCLKDIV_DIV3 (0x2 << PWR_SYSCTRL2_OTP_LPCLKDIV_SHIFT) /* 010: Divide by 3 */ +# define PWR_SYSCTRL2_OTP_LPCLKDIV_DIV4 (0x3 << PWR_SYSCTRL2_OTP_LPCLKDIV_SHIFT) /* 011: Divide by 4 */ +# define PWR_SYSCTRL2_OTP_LPCLKDIV_DIV5 (0x4 << PWR_SYSCTRL2_OTP_LPCLKDIV_SHIFT) /* 100: Divide by 5 */ +# define PWR_SYSCTRL2_OTP_LPCLKDIV_DIV6 (0x5 << PWR_SYSCTRL2_OTP_LPCLKDIV_SHIFT) /* 101: Divide by 6 */ +# define PWR_SYSCTRL2_OTP_LPCLKDIV_DIV7 (0x6 << PWR_SYSCTRL2_OTP_LPCLKDIV_SHIFT) /* 110: Divide by 7 */ +# define PWR_SYSCTRL2_OTP_LPCLKDIV_DIV8 (0x7 << PWR_SYSCTRL2_OTP_LPCLKDIV_SHIFT) /* 111: Divide by 8 */ + +#define PWR_SYSCTRL2_OTP_FRCSTB (1 << 23) /* Bit 23: OTP force STBY */ +#define PWR_SYSCTRL2_OTP_FRCDSTB (1 << 22) /* Bit 22: OTP force DSTBY */ +#define PWR_SYSCTRL2_OTP_STB_INSTP0 (1 << 21) /* Bit 21: OTP STBY in STOP0 mode */ +#define PWR_SYSCTRL2_OTP_DSTB_INSTP0 (1 << 20) /* Bit 20: OTP DSTBY in STOP0 mode */ +#define PWR_SYSCTRL2_OTP_STB_INSTP2 (1 << 19) /* Bit 19: OTP STBY in STOP2 mode */ +#define PWR_SYSCTRL2_OTP_DSTB_INSTP2 (1 << 18) /* Bit 18: OTP DSTBY in STOP2 mode */ +#define PWR_SYSCTRL2_EXTI_MASKRSTEN (1 << 17) /* Bit 17: EXTI mask reset enable */ +#define PWR_SYSCTRL2_VDDDM_RDYMD (1 << 16) /* Bit 16: VDDDM ready mode */ +#define PWR_SYSCTRL2_BKPLDO_CTRLEN (1 << 11) /* Bit 11: Backup LDO control enable */ +#define PWR_SYSCTRL2_MR_STBOFFEN (1 << 1) /* Bit 1: Main regulator off in standby mode */ + +/* PWR System Control register 3 (PWR_SYSCTRL3) */ +#define PWR_SYSCTRL3_HSC2_PSWACK1 (1 << 22) /* Bit 22: HSC2 power switch ACK1 */ +#define PWR_SYSCTRL3_HSC1_PSWACK1 (1 << 21) /* Bit 21: HSC1 power switch ACK1 */ +#define PWR_SYSCTRL3_GRC_PSWACK1 (1 << 20) /* Bit 20: GRC power switch ACK1 */ + +#define PWR_SYSCTRL3_HSC2_PWRRDY (1 << 18) /* Bit 18: HSC2 power domain ready flag */ +#define PWR_SYSCTRL3_HSC1_PWRRDY (1 << 17) /* Bit 17: HSC1 power domain ready flag */ +#define PWR_SYSCTRL3_GRC_PWRRDY (1 << 16) /* Bit 16: GRC power domain ready flag */ + +#define PWR_SYSCTRL3_HSC2_ISNEN (1 << 10) /* Bit 10: HSC2 power domain isolation signal */ +#define PWR_SYSCTRL3_HSC1_ISNEN (1 << 9) /* Bit 9: HSC1 power domain isolation signal */ +#define PWR_SYSCTRL3_GRC_ISNEN (1 << 8) /* Bit 8: GRC power domain isolation signal */ + +#define PWR_SYSCTRL3_HSC2_FUCEN (1 << 6) /* Bit 6: HSC2 function mode enable */ +#define PWR_SYSCTRL3_HSC1_FUCEN (1 << 5) /* Bit 5: HSC1 function mode enable */ +#define PWR_SYSCTRL3_GRC_FUCEN (1 << 4) /* Bit 4: GRC function mode enable */ + +#define PWR_SYSCTRL3_HSC2_PGEN (1 << 2) /* Bit 2: HSC2 power gate enable */ +#define PWR_SYSCTRL3_HSC1_PGEN (1 << 1) /* Bit 1: HSC1 power gate enable */ +#define PWR_SYSCTRL3_GRC_PGEN (1 << 0) /* Bit 0: GRC power gate enable */ + +/* PWR System Control register 4 (PWR_SYSCTRL4) */ +#define PWR_SYSCTRL4_MR_LP_VSELEN (1 << 29) /* Bit 29: Enable targeting MR voltage output in low power mode */ +#define PWR_SYSCTRL4_DCDC_LP_VSEL_SHIFT (24) /* Bits 24-27: Targeting dcdc voltage in low power mode */ +#define PWR_SYSCTRL4_DCDC_LP_VSEL_MASK (0xF << PWR_SYSCTRL4_DCDC_LP_VSEL_SHIFT) +# define PWR_SYSCTRL4_DCDC_LP_VSEL_0_80V (0x5 << PWR_SYSCTRL4_DCDC_LP_VSEL_SHIFT) /* 0101: 0.80V */ +# define PWR_SYSCTRL4_DCDC_LP_VSEL_0_85V (0x6 << PWR_SYSCTRL4_DCDC_LP_VSEL_SHIFT) /* 0110: 0.85V */ +# define PWR_SYSCTRL4_DCDC_LP_VSEL_0_90V (0x7 << PWR_SYSCTRL4_DCDC_LP_VSEL_SHIFT) /* 0111: 0.90V */ + +#define PWR_SYSCTRL4_VDDD_LP_PORSEL_SHIFT (22) /* Bits 22-23: VDDD POR config in low power mode */ +#define PWR_SYSCTRL4_VDDD_LP_PORSEL_MASK (0x3 << PWR_SYSCTRL4_VDDD_LP_PORSEL_SHIFT) +# define PWR_SYSCTRL4_VDDD_LP_PORSEL_0_7V_0_65V (0x0 << PWR_SYSCTRL4_VDDD_LP_PORSEL_SHIFT) /* 00: POR 0.7V, PDR 0.65V */ +# define PWR_SYSCTRL4_VDDD_LP_PORSEL_0_7V_0_65V_ALT (0x1 << PWR_SYSCTRL4_VDDD_LP_PORSEL_SHIFT) /* 01: POR 0.7V, PDR 0.65V */ +# define PWR_SYSCTRL4_VDDD_LP_PORSEL_0_75V_0_7V (0x2 << PWR_SYSCTRL4_VDDD_LP_PORSEL_SHIFT) /* 10: POR 0.75V, PDR 0.7V */ +# define PWR_SYSCTRL4_VDDD_LP_PORSEL_0_8V_0_75V (0x3 << PWR_SYSCTRL4_VDDD_LP_PORSEL_SHIFT) /* 11: POR 0.8V, PDR 0.75V */ + +#define PWR_SYSCTRL4_DCDC_LP_PORVSEL_SHIFT (17) /* Bits 17-21: DCDC POR voltage value in low power mode */ +#define PWR_SYSCTRL4_DCDC_LP_PORVSEL_MASK (0x1F << PWR_SYSCTRL4_DCDC_LP_PORVSEL_SHIFT) +# define PWR_SYSCTRL4_DCDC_LP_PORVSEL_0_8V (0x5 << PWR_SYSCTRL4_DCDC_LP_PORVSEL_SHIFT) /* 00101: 0.8V */ +# define PWR_SYSCTRL4_DCDC_LP_PORVSEL_0_85V (0x6 << PWR_SYSCTRL4_DCDC_LP_PORVSEL_SHIFT) /* 00110: 0.85V */ +# define PWR_SYSCTRL4_DCDC_LP_PORVSEL_0_9V (0x7 << PWR_SYSCTRL4_DCDC_LP_PORVSEL_SHIFT) /* 00111: 0.9V */ + +#define PWR_SYSCTRL4_BG_LPVREF (1 << 16) /* Bit 16: Targeting BG ref in low power mode */ +#define PWR_SYSCTRL4_BG_VREF (1 << 15) /* Bit 15: BG voltage reference select */ +#define PWR_SYSCTRL4_VDDD_PORSEL_SHIFT (12) /* Bits 12-13: VDDD POR config in low power mode */ +#define PWR_SYSCTRL4_VDDD_PORSEL_MASK (0x3 << PWR_SYSCTRL4_VDDD_PORSEL_SHIFT) +# define PWR_SYSCTRL4_VDDD_PORSEL_0_7V_0_65V (0x0 << PWR_SYSCTRL4_VDDD_PORSEL_SHIFT) /* 00: POR 0.7V, PDR 0.65V */ +# define PWR_SYSCTRL4_VDDD_PORSEL_0_75V_0_7V (0x2 << PWR_SYSCTRL4_VDDD_PORSEL_SHIFT) /* 10: POR 0.75V, PDR 0.7V */ +# define PWR_SYSCTRL4_VDDD_PORSEL_0_8V_0_75V (0x3 << PWR_SYSCTRL4_VDDD_PORSEL_SHIFT) /* 11: POR 0.8V, PDR 0.75V */ + +#define PWR_SYSCTRL4_MLDO_LPO_VSEL_SHIFT (8) /* Bits 8-9: Output voltage of Main Regulator LDO option in SYS STOP2 and STANDBY mode */ +#define PWR_SYSCTRL4_MLDO_LPO_VSEL_MASK (0x3 << PWR_SYSCTRL4_MLDO_LPO_VSEL_SHIFT) +# define PWR_SYSCTRL4_MLDO_LPO_VSEL_0_8V (0x0 << PWR_SYSCTRL4_MLDO_LPO_VSEL_SHIFT) /* 00: 0.8V */ +# define PWR_SYSCTRL4_MLDO_LPO_VSEL_0_85V (0x1 << PWR_SYSCTRL4_MLDO_LPO_VSEL_SHIFT) /* 01: 0.85V */ +# define PWR_SYSCTRL4_MLDO_LPO_VSEL_0_9V (0x2 << PWR_SYSCTRL4_MLDO_LPO_VSEL_SHIFT) /* 10: 0.9V */ + +#define PWR_SYSCTRL4_MLDO_OVSEL_SHIFT (8) /* Bits 8-9: Output voltage of Main Regulator LDO option in SYS RUN mode */ +#define PWR_SYSCTRL4_MLDO_OVSEL_MASK (0x3 << PWR_SYSCTRL4_MLDO_OVSEL_SHIFT) +# define PWR_SYSCTRL4_MLDO_OVSEL_0_8V (0x0 << PWR_SYSCTRL4_MLDO_OVSEL_SHIFT) /* 00: 0.8V */ +# define PWR_SYSCTRL4_MLDO_OVSEL_0_85V (0x1 << PWR_SYSCTRL4_MLDO_OVSEL_SHIFT) /* 01: 0.85V */ +# define PWR_SYSCTRL4_MLDO_OVSEL_0_9V (0x2 << PWR_SYSCTRL4_MLDO_OVSEL_SHIFT) /* 10: 0.9V */ + +#define PWR_SYSCTRL4_DCD_FRCEN (1 << 3) /* Bit 3: DCDC force enable */ +#define PWR_SYSCTRL4_DCDEN (1 << 2) /* Bit 2: DCDC enable */ +#define PWR_SYSCTRL4_MLDOEN (1 << 1) /* Bit 1: Main regulator LDO enable */ +#define PWR_SYSCTRL4_VCORESRC (1 << 0) /* Bit 0: VCORE source select */ + +#define PWR_VCORESRC_MASK (PWR_SYSCTRL4_DCD_FRCEN|PWR_SYSCTRL4_DCDEN|\ + PWR_SYSCTRL4_MLDOEN|PWR_SYSCTRL4_VCORESRC) + +typedef enum +{ + PWR_VCORESRC_EXT = 0, + PWR_VCORESRC_LDO, + PWR_VCORESRC_SMPS, +} pwr_vcoresrc_e; + +/* PWR IP Memory Control register (PWR_IPMEMCTRL) */ +#define PWR_IPMEMCTRL_ESC_PGEN (1 << 12) /* Bit 12: ESC memory power gate enable */ +#define PWR_IPMEMCTRL_FMAC_PGEN (1 << 11) /* Bit 11: FMAC memory power gate enable */ +#define PWR_IPMEMCTRL_SDMMC1_PGEN (1 << 10) /* Bit 10: SDMMC1 memory power gate enable */ +#define PWR_IPMEMCTRL_USB1_PGEN (1 << 9) /* Bit 9: USB1 memory power gate enable */ +#define PWR_IPMEMCTRL_ETH1_PGEN (1 << 8) /* Bit 8: ETH1 memory power gate enable */ +#define PWR_IPMEMCTRL_SDMMC2_PGEN (1 << 7) /* Bit 7: SDMMC2 memory power gate enable */ +#define PWR_IPMEMCTRL_USB2_PGEN (1 << 6) /* Bit 6: USB2 memory power gate enable */ +#define PWR_IPMEMCTRL_ETH2_PGEN (1 << 5) /* Bit 5: ETH2 memory power gate enable */ +#define PWR_IPMEMCTRL_DVP_PGEN (1 << 4) /* Bit 4: DVP memory power gate enable */ +#define PWR_IPMEMCTRL_DSI_PGEN (1 << 3) /* Bit 3: DSI memory power gate enable */ +#define PWR_IPMEMCTRL_JPEG_PGEN (1 << 2) /* Bit 2: JPEG memory power gate enable */ +#define PWR_IPMEMCTRL_LCDC_PGEN (1 << 1) /* Bit 1: LCDC memory power gate enable */ +#define PWR_IPMEMCTRL_GPU_PGEN (1 << 0) /* Bit 0: GPU memory power gate enable */ + +/* PWR IP Memory Status register (PWR_IPMEMSTS) */ +#define PWR_IPMEMSTS_ALLIP_PRDY (1 << 31) /* Bit 31: ALL IP memory power ready flag */ +#define PWR_IPMEMSTS_ESC_PRDY (1 << 12) /* Bit 12: ESC memory power ready flag */ +#define PWR_IPMEMSTS_FMAC_PRDY (1 << 11) /* Bit 11: FMAC memory power ready flag */ +#define PWR_IPMEMSTS_SDMMC1_PRDY (1 << 10) /* Bit 10: SDMMC1 memory power ready flag */ +#define PWR_IPMEMSTS_USB1_PRDY (1 << 9) /* Bit 9: USB1 memory power ready flag */ +#define PWR_IPMEMSTS_ETH1_PRDY (1 << 8) /* Bit 8: ETH1 memory power ready flag */ +#define PWR_IPMEMSTS_SDMMC2_PRDY (1 << 7) /* Bit 7: SDMMC2 memory power ready flag */ +#define PWR_IPMEMSTS_USB2_PRDY (1 << 6) /* Bit 6: USB2 memory power ready flag */ +#define PWR_IPMEMSTS_ETH2_PRDY (1 << 5) /* Bit 5: ETH2 memory power ready flag */ +#define PWR_IPMEMSTS_DVP_PRDY (1 << 4) /* Bit 4: DVP memory power ready flag */ +#define PWR_IPMEMSTS_DSI_PRDY (1 << 3) /* Bit 3: DSI memory power ready flag */ +#define PWR_IPMEMSTS_JPEG_PRDY (1 << 2) /* Bit 2: JPEG memory power ready flag */ +#define PWR_IPMEMSTS_LCDC_PRDY (1 << 1) /* Bit 1: LCDC memory power ready flag */ +#define PWR_IPMEMSTS_GPU_PRDY (1 << 0) /* Bit 0: GPU memory power ready flag */ + +/* PWR CM7 Memory Low Power Control register (PWR_M7MEMLPCTRL) */ +#define PWR_M7MEMLPCTRL_MEM_PGCFG_SHIFT (2) /* Bits 2-3: Memory power gate sequence control */ +#define PWR_M7MEMLPCTRL_MEM_PGCFG_MASK (0x3 << PWR_M7MEMLPCTRL_MEM_PGCFG_SHIFT) +# define PWR_M7MEMLPCTRL_MEM_PGCFG_CM7ALL (0x0 << PWR_M7MEMLPCTRL_MEM_PGCFG_SHIFT) /* 00: All CM7 memories in one daisy chain */ +# define PWR_M7MEMLPCTRL_MEM_PGCFG_DITCM (0x1 << PWR_M7MEMLPCTRL_MEM_PGCFG_SHIFT) /* 01: D-cache -> I-cache -> TCM daisy */ +# define PWR_M7MEMLPCTRL_MEM_PGCFG_DIC (0x2 << PWR_M7MEMLPCTRL_MEM_PGCFG_SHIFT) /* 10: D-cache + I-cache -> every 4 pieces of TCM memory */ +# define PWR_M7MEMLPCTRL_MEM_PGCFG_ALL (0x3 << PWR_M7MEMLPCTRL_MEM_PGCFG_SHIFT) /* 11: All memory in one daisy chain */ + +#define PWR_M7MEMLPCTRL_MEM_RETSTP0EN_SHIFT (0) /* Bits 0-1: Memory retention mode select in STOP0 */ +#define PWR_M7MEMLPCTRL_MEM_RETSTP0EN_MASK (0x3 << PWR_M7MEMLPCTRL_MEM_RETSTP0EN_SHIFT) +# define PWR_M7MEMLPCTRL_MEM_RETSTP0EN_CHIP_DISABLE (0x0 << PWR_M7MEMLPCTRL_MEM_RETSTP0EN_SHIFT) /* 00: Chip disable mode */ +# define PWR_M7MEMLPCTRL_MEM_RETSTP0EN_PRECHARGE (0x1 << PWR_M7MEMLPCTRL_MEM_RETSTP0EN_SHIFT) /* 01: Precharge mode */ +# define PWR_M7MEMLPCTRL_MEM_RETSTP0EN_RETENTION1 (0x3 << PWR_M7MEMLPCTRL_MEM_RETSTP0EN_SHIFT) /* 11: Retention 1 mode */ + +#define PWR_M7MEMLPCTRL_MEM_PGSTP0EN_SHIFT (0) /* Bits 0-1: Memory power gate mode select in STOP0 */ +#define PWR_M7MEMLPCTRL_MEM_PGSTP0EN_MASK (0x3 << PWR_M7MEMLPCTRL_MEM_PGSTP0EN_SHIFT) +# define PWR_M7MEMLPCTRL_MEM_PGSTP0EN_CHIP_DISABLE (0x0 << PWR_M7MEMLPCTRL_MEM_PGSTP0EN_SHIFT) /* 00: Chip disable mode */ +# define PWR_M7MEMLPCTRL_MEM_PGSTP0EN_PRECHARGE (0x1 << PWR_M7MEMLPCTRL_MEM_PGSTP0EN_SHIFT) /* 01: Precharge mode */ +# define PWR_M7MEMLPCTRL_MEM_PGSTP0EN_RETENTION1 (0x3 << PWR_M7MEMLPCTRL_MEM_PGSTP0EN_SHIFT) /* 11: Retention 1 mode */ + +/* PWR CM7 Memory Low Power Status register (PWR_M7MEMLPSTS) */ +#define PWR_M7MEMLPSTS_TCMRDY (1 << 31) /* Bit 31: All enabled TCM memory power ready flag */ + +/* PWR CM7 TCM Part0 Program register (PWR_M7TCMPG0) */ +#define PWR_M7TCMPG0_TCM_PG0_SHIFT (0) /* Bits 0-31: Software control to power gate TCM Part0 memories */ +#define PWR_M7TCMPG0_TCM_PG0_MASK (0xFFFFFFFF << PWR_M7TCMPG0_TCM_PG0_SHIFT) + +/* PWR CM7 TCM Part1 Program register (PWR_M7TCMPG1) */ +#define PWR_M7TCMPG1_TCM_PG1_SHIFT (0) /* Bits 0-31: Software control to power gate TCM Part1 memories */ +#define PWR_M7TCMPG1_TCM_PG1_MASK (0xFFFFFFFF << PWR_M7TCMPG1_TCM_PG1_SHIFT) + +/* PWR CM7 TCM Part0 Retain 1 register (PWR_M7TCMRET1N0) */ +#define PWR_M7TCMRET1N0_TCM_RENT1N0_SHIFT (0) /* Bits 0-31: TCM Part0 Retain 1 mode select */ +#define PWR_M7TCMRET1N0_TCM_RENT1N0_MASK (0xFFFFFFFF << PWR_M7TCMRET1N0_TCM_RENT1N0_SHIFT) + +/* PWR CM7 TCM Part1 Retain 1 register (PWR_M7TCMRET1N1) */ +#define PWR_M7TCMRET1N1_TCM_RENT1N1_SHIFT (0) /* Bits 0-31: TCM Part1 Retain 1 mode select */ +#define PWR_M7TCMRET1N1_TCM_RENT1N1_MASK (0xFFFFFFFF << PWR_M7TCMRET1N1_TCM_RENT1N1_SHIFT) + +/* PWR CM7 TCM Part0 Retain 2 register (PWR_M7TCMRET2N0) */ +#define PWR_M7TCMRET2N0_TCM_RENT2N0_SHIFT (0) /* Bits 0-31: TCM Part0 Retain 2 mode select */ +#define PWR_M7TCMRET2N0_TCM_RENT2N0_MASK (0xFFFFFFFF << PWR_M7TCMRET2N0_TCM_RENT2N0_SHIFT) + +/* PWR CM7 TCM Part1 Retain 2 register (PWR_M7TCMRET2N1) */ +#define PWR_M7TCMRET2N1_TCM_RENT2N1_SHIFT (0) /* Bits 0-31: TCM Part1 Retain 2 mode select */ +#define PWR_M7TCMRET2N1_TCM_RENT2N1_MASK (0xFFFFFFFF << PWR_M7TCMRET2N1_TCM_RENT2N1_SHIFT) + +/* PWR CM7 TCM Part0 Power Ready register (PWR_M7TCMRDY0) */ +#define PWR_M7TCMRDY0_TCM_RDY0_SHIFT (0) /* Bits 0-31: TCM Part0 Power Ready flag */ +#define PWR_M7TCMRDY0_TCM_RDY0_MASK (0xFFFFFFFF << PWR_M7TCMRDY0_TCM_RDY0_SHIFT) + +/* PWR CM7 TCM Part1 Power Ready register (PWR_M7TCMRDY1) */ +#define PWR_M7TCMRDY1_TCM_RDY1_SHIFT (0) /* Bits 0-31: TCM Part1 Power Ready flag */ +#define PWR_M7TCMRDY1_TCM_RDY1_MASK (0xFFFFFFFF << PWR_M7TCMRDY1_TCM_RDY1_SHIFT) + +/* PWR CM4 Memory Low Power Control register (PWR_M4MEMLPCTRL) */ +#define PWR_M4MEMLPCTRL_MEM_PGCFG_SHIFT (2) /* Bits 2-3: Memory power gate sequence control */ +#define PWR_M4MEMLPCTRL_MEM_PGCFG_MASK (0x3 << PWR_M4MEMLPCTRL_MEM_PGCFG_SHIFT) +# define PWR_M4MEMLPCTRL_MEM_PGCFG_CM4ALL (0x0 << PWR_M4MEMLPCTRL_MEM_PGCFG_SHIFT) /* 00: All CM4 memories in one daisy chain */ +# define PWR_M4MEMLPCTRL_MEM_PGCFG_ALL_PARALLEL (0x1 << PWR_M4MEMLPCTRL_MEM_PGCFG_SHIFT) /* 01: All memory parallel */ +# define PWR_M4MEMLPCTRL_MEM_PGCFG_DITCM (0x2 << PWR_M4MEMLPCTRL_MEM_PGCFG_SHIFT) /* 10: D-cache -> I-cache, parallel within each group */ +# define PWR_M4MEMLPCTRL_MEM_PGCFG_ALL (0x3 << PWR_M4MEMLPCTRL_MEM_PGCFG_SHIFT) /* 11: All memory in one daisy chain */ + +#define PWR_M4MEMLPCTRL_MEM_RETSTP0EN_SHIFT (0) /* Bits 0-1: Memory retention mode select in STOP0 */ +#define PWR_M4MEMLPCTRL_MEM_RETSTP0EN_MASK (0x3 << PWR_M4MEMLPCTRL_MEM_RETSTP0EN_SHIFT) +# define PWR_M4MEMLPCTRL_MEM_RETSTP0EN_CHIP_DISABLE (0x0 << PWR_M4MEMLPCTRL_MEM_RETSTP0EN_SHIFT) /* 00: Chip disable mode */ +# define PWR_M4MEMLPCTRL_MEM_RETSTP0EN_PRECHARGE (0x1 << PWR_M4MEMLPCTRL_MEM_RETSTP0EN_SHIFT) /* 01: Precharge mode */ +# define PWR_M4MEMLPCTRL_MEM_RETSTP0EN_RETENTION1 (0x3 << PWR_M4MEMLPCTRL_MEM_RETSTP0EN_SHIFT) /* 11: Retention 1 mode */ + +#define PWR_M4MEMLPCTRL_MEM_PGSTP0EN_SHIFT (0) /* Bits 0-1: Memory power gate mode select in STOP0 */ +#define PWR_M4MEMLPCTRL_MEM_PGSTP0EN_MASK (0x3 << PWR_M4MEMLPCTRL_MEM_PGSTP0EN_SHIFT) +# define PWR_M4MEMLPCTRL_MEM_PGSTP0EN_CHIP_DISABLE (0x0 << PWR_M4MEMLPCTRL_MEM_PGSTP0EN_SHIFT) /* 00: Chip disable mode */ +# define PWR_M4MEMLPCTRL_MEM_PGSTP0EN_PRECHARGE (0x1 << PWR_M4MEMLPCTRL_MEM_PGSTP0EN_SHIFT) /* 01: Precharge mode */ +# define PWR_M4MEMLPCTRL_MEM_PGSTP0EN_RETENTION1 (0x3 << PWR_M4MEMLPCTRL_MEM_PGSTP0EN_SHIFT) /* 11: Retention 1 mode */ + +/* PWR System Memory Low Power Control register (PWR_SYSMEMLPCTRL) */ +#define PWR_SYSMEMLPCTRL_PRDY (1 << 31) /* Bit 31: All enabled system memory power ready flag */ +#define PWR_SYSMEMLPCTRL_AHBSRM5S2_RET2N (1 << 26) /* Bit 26: AHBSRM5S2 Retention 2 mode select */ +#define PWR_SYSMEMLPCTRL_AHBSRM5S2_RET1N (1 << 25) /* Bit 25: AHBSRM5S2 Retention 1 mode select */ +#define PWR_SYSMEMLPCTRL_AHBSRM5S1_RET2N (1 << 24) /* Bit 24: AHBSRM5S1 Retention 2 mode select */ +#define PWR_SYSMEMLPCTRL_AHBSRM5S1_RET1N (1 << 23) /* Bit 23: AHBSRM5S1 Retention 1 mode select */ +#define PWR_SYSMEMLPCTRL_AHBSRM4_RET2N (1 << 22) /* Bit 22: AHBSRM4 Retention 2 mode select */ +#define PWR_SYSMEMLPCTRL_AHBSRM4_RET1N (1 << 21) /* Bit 21: AHBSRM4 Retention 1 mode select */ +#define PWR_SYSMEMLPCTRL_AHBSRM3_RET2N (1 << 20) /* Bit 20: AHBSRM3 Retention 2 mode select */ +#define PWR_SYSMEMLPCTRL_AHBSRM3_RET1N (1 << 19) /* Bit 19: AHBSRM3 Retention 1 mode select */ +#define PWR_SYSMEMLPCTRL_AHBSRM2_RET2N (1 << 18) /* Bit 18: AHBSRM2 Retention 2 mode select */ +#define PWR_SYSMEMLPCTRL_AHBSRM2_RET1N (1 << 17) /* Bit 17: AHBSRM2 Retention 1 mode select */ +#define PWR_SYSMEMLPCTRL_AHBSRM1_RET2N (1 << 16) /* Bit 16: AHBSRM1 Retention 2 mode select */ +#define PWR_SYSMEMLPCTRL_AHBSRM1_RET1N (1 << 15) /* Bit 15: AHBSRM1 Retention 1 mode select */ +#define PWR_SYSMEMLPCTRL_AXISRM_RET2N (1 << 14) /* Bit 14: AXISRM Retention 2 mode select */ +#define PWR_SYSMEMLPCTRL_AXISRM_RET1N (1 << 13) /* Bit 13: AXISRM Retention 1 mode select */ + +#define PWR_SYSMEMLPCTRL_MEM_RETSTP0EN_SHIFT (8) /* Bits 8-9: Memory retention mode select in STOP0 */ +#define PWR_SYSMEMLPCTRL_MEM_RETSTP0EN_MASK (0x3 << PWR_SYSMEMLPCTRL_MEM_RETSTP0EN_SHIFT) +# define PWR_SYSMEMLPCTRL_MEM_RETSTP0EN_CHIP_DISABLE (0x0 << PWR_SYSMEMLPCTRL_MEM_RETSTP0EN_SHIFT) /* 00: Chip disable mode */ +# define PWR_SYSMEMLPCTRL_MEM_RETSTP0EN_PRECHARGE (0x1 << PWR_SYSMEMLPCTRL_MEM_RETSTP0EN_SHIFT) /* 01: Precharge mode */ +# define PWR_SYSMEMLPCTRL_MEM_RETSTP0EN_RETENTION1 (0x3 << PWR_SYSMEMLPCTRL_MEM_RETSTP0EN_SHIFT) /* 11: Retention 1 mode */ + +#define PWR_SYSMEMLPCTRL_MEM_PGSTP0EN_SHIFT (8) /* Bits 8-9: Memory power gate mode select in STOP0 */ +#define PWR_SYSMEMLPCTRL_MEM_PGSTP0EN_MASK (0x3 << PWR_SYSMEMLPCTRL_MEM_PGSTP0EN_SHIFT) +# define PWR_SYSMEMLPCTRL_MEM_PGSTP0EN_CHIP_DISABLE (0x0 << PWR_SYSMEMLPCTRL_MEM_PGSTP0EN_SHIFT) /* 00: Chip disable mode */ +# define PWR_SYSMEMLPCTRL_MEM_PGSTP0EN_PRECHARGE (0x1 << PWR_SYSMEMLPCTRL_MEM_PGSTP0EN_SHIFT) /* 01: Precharge mode */ +# define PWR_SYSMEMLPCTRL_MEM_PGSTP0EN_RETENTION1 (0x3 << PWR_SYSMEMLPCTRL_MEM_PGSTP0EN_SHIFT) /* 11: Retention 1 mode */ + +#define PWR_SYSMEMLPCTRL_AHBSRM5S2_PG (1 << 6) /* Bit 6: AHBSRM5S2 power gate enable */ +#define PWR_SYSMEMLPCTRL_AHBSRM5S1_PG (1 << 5) /* Bit 5: AHBSRM5S1 power gate enable */ +#define PWR_SYSMEMLPCTRL_AHBSRM4_PG (1 << 4) /* Bit 4: AHBSRM4 power gate enable */ +#define PWR_SYSMEMLPCTRL_AHBSRM3_PG (1 << 3) /* Bit 3: AHBSRM3 power gate enable */ +#define PWR_SYSMEMLPCTRL_AHBSRM2_PG (1 << 2) /* Bit 2: AHBSRM2 power gate enable */ +#define PWR_SYSMEMLPCTRL_AHBSRM1_PG (1 << 1) /* Bit 1: AHBSRM1 power gate enable */ +#define PWR_SYSMEMLPCTRL_AXISRM_PG (1 << 0) /* Bit 0: AXISRM power gate enable */ + +/* PWR System SHRTIM Power Control register (PWR_SHRTIMCTRL) */ +#define PWR_SHRTIMCTRL_SHRA_PSWACK1 (1 << 20) /* Bit 20: SHRTIM AFE power switch ACK1 */ +#define PWR_SHRTIMCTRL_SHRA_PWRRDY (1 << 19) /* Bit 19: SHRTIM AFE power domain ready flag */ +#define PWR_SHRTIMCTRL_SHRA_ISNEN (1 << 18) /* Bit 18: SHRTIM AFE power domain isolation signal */ +#define PWR_SHRTIMCTRL_SHRA_FUCEN (1 << 17) /* Bit 17: SHRTIM AFE function mode enable */ +#define PWR_SHRTIMCTRL_SHRA_PGEN (1 << 16) /* Bit 16: SHRTIM AFE power gate enable */ + +#define PWR_SHRTIMCTRL_SHR2_PSWACK1 (1 << 12) /* Bit 12: SHRTIM2 power switch ACK1 */ +#define PWR_SHRTIMCTRL_SHR2_PWRRDY (1 << 11) /* Bit 11: SHRTIM2 power domain ready flag */ +#define PWR_SHRTIMCTRL_SHR2_ISNEN (1 << 10) /* Bit 10: SHRTIM2 power domain isolation signal */ +#define PWR_SHRTIMCTRL_SHR2_FUCEN (1 << 9) /* Bit 9: SHRTIM2 function mode enable */ +#define PWR_SHRTIMCTRL_SHR2_PGEN (1 << 8) /* Bit 8: SHRTIM2 power gate enable */ + +#define PWR_SHRTIMCTRL_SHR1_PSWACK1 (1 << 4) /* Bit 4: SHRTIM1 power switch ACK1 */ +#define PWR_SHRTIMCTRL_SHR1_PWRRDY (1 << 3) /* Bit 3: SHRTIM1 power domain ready flag */ +#define PWR_SHRTIMCTRL_SHR1_ISNEN (1 << 2) /* Bit 2: SHRTIM1 power domain isolation signal */ +#define PWR_SHRTIMCTRL_SHR1_FUCEN (1 << 1) /* Bit 1: SHRTIM1 function mode enable */ +#define PWR_SHRTIMCTRL_SHR1_PGEN (1 << 0) /* Bit 0: SHRTIM1 power gate enable */ + +/* PWR System MDMA Power Control register (PWR_MDMACTRL) */ +#define PWR_MDMACTRL_MDMA_PSWACK1 (1 << 4) /* Bit 4: MDMA power switch ACK1 */ +#define PWR_MDMACTRL_MDMA_PWRRDY (1 << 3) /* Bit 3: MDMA power domain ready flag */ +#define PWR_MDMACTRL_MDMA_ISNEN (1 << 2) /* Bit 2: MDMA power domain isolation signal */ +#define PWR_MDMACTRL_MDMA_FUCEN (1 << 1) /* Bit 1: MDMA function mode enable */ +#define PWR_MDMACTRL_MDMA_PGEN (1 << 0) /* Bit 0: MDMA power gate enable */ + +/* PWR System ESC Power Control register (PWR_ESCCTRL) */ +#define PWR_ESCCTRL_ESC_PSWACK1 (1 << 4) /* Bit 4: ESC power switch ACK1 */ +#define PWR_ESCCTRL_ESC_PWRRDY (1 << 3) /* Bit 3: ESC power domain ready flag */ +#define PWR_ESCCTRL_ESC_ISNEN (1 << 2) /* Bit 2: ESC power domain isolation signal */ +#define PWR_ESCCTRL_ESC_FUCEN (1 << 1) /* Bit 1: ESC function mode enable */ +#define PWR_ESCCTRL_ESC_PGEN (1 << 0) /* Bit 0: ESC power gate enable */ + +/* PWR EMC RET Control Register 1 (PWR_EMCRETCTRL1) */ +#define PWR_EMCRETCTRL1_RETGB3DET (1 << 11) /* Bit 11: RET domain EMC GB3 detection enable */ +#define PWR_EMCRETCTRL1_RETGB2DET (1 << 10) /* Bit 10: RET domain EMC GB2 detection enable */ +#define PWR_EMCRETCTRL1_RETGB1DET (1 << 9) /* Bit 9: RET domain EMC GB1 detection enable */ +#define PWR_EMCRETCTRL1_RETGB0DET (1 << 8) /* Bit 8: RET domain EMC GB0 detection enable */ +#define PWR_EMCRETCTRL1_RETGBN3DET (1 << 7) /* Bit 7: RET domain EMC GBN3 detection enable */ +#define PWR_EMCRETCTRL1_RETGBN2DET (1 << 6) /* Bit 6: RET domain EMC GBN2 detection enable */ +#define PWR_EMCRETCTRL1_RETGBN1DET (1 << 5) /* Bit 5: RET domain EMC GBN1 detection enable */ +#define PWR_EMCRETCTRL1_RETGBN0DET (1 << 4) /* Bit 4: RET domain EMC GBN0 detection enable */ +#define PWR_EMCRETCTRL1_RETCLP3DET (1 << 3) /* Bit 3: RET domain EMC Clamp3 detection enable */ +#define PWR_EMCRETCTRL1_RETCLP2DET (1 << 2) /* Bit 2: RET domain EMC Clamp2 detection enable */ +#define PWR_EMCRETCTRL1_RETCLP1DET (1 << 1) /* Bit 1: RET domain EMC Clamp1 detection enable */ +#define PWR_EMCRETCTRL1_RETCLP0DET (1 << 0) /* Bit 0: RET domain EMC Clamp0 detection enable */ + +/* PWR EMC RET Status Register 1 (PWR_EMCRETSTS1) */ +#define PWR_EMCRETSTS1_EMCFCLR (1 << 24) /* Bit 24: Clear EMC Flag */ +#define PWR_EMCRETSTS1_GB3F (1 << 11) /* Bit 11: RET Domain EMC GB3 Flag */ +#define PWR_EMCRETSTS1_GB2F (1 << 10) /* Bit 10: RET Domain EMC GB2 Flag */ +#define PWR_EMCRETSTS1_GB1F (1 << 9) /* Bit 9: RET Domain EMC GB1 Flag */ +#define PWR_EMCRETSTS1_GB0F (1 << 8) /* Bit 8: RET Domain EMC GB0 Flag */ +#define PWR_EMCRETSTS1_GBN3F (1 << 7) /* Bit 7: RET Domain EMC GBN3 Flag */ +#define PWR_EMCRETSTS1_GBN2F (1 << 6) /* Bit 6: RET Domain EMC GBN2 Flag */ +#define PWR_EMCRETSTS1_GBN1F (1 << 5) /* Bit 5: RET Domain EMC GBN1 Flag */ +#define PWR_EMCRETSTS1_GBN0F (1 << 4) /* Bit 4: RET Domain EMC GBN0 Flag */ +#define PWR_EMCRETSTS1_CLP3F (1 << 3) /* Bit 3: RET Domain EMC Clamp3 Flag */ +#define PWR_EMCRETSTS1_CLP2F (1 << 2) /* Bit 2: RET Domain EMC Clamp2 Flag */ +#define PWR_EMCRETSTS1_CLP1F (1 << 1) /* Bit 1: RET Domain EMC Clamp1 Flag */ +#define PWR_EMCRETSTS1_CLP0F (1 << 0) /* Bit 0: RET Domain EMC Clamp0 Flag */ + +/* PWR EMC RET Control Register 2 (PWR_EMCRETCTRL2) */ +#define PWR_EMCRETCTRL2_RETGB7DET (1 << 11) /* Bit 11: RET domain EMC GB7 detection enable */ +#define PWR_EMCRETCTRL2_RETGB6DET (1 << 10) /* Bit 10: RET domain EMC GB6 detection enable */ +#define PWR_EMCRETCTRL2_RETGB5DET (1 << 9) /* Bit 9: RET domain EMC GB5 detection enable */ +#define PWR_EMCRETCTRL2_RETGB4DET (1 << 8) /* Bit 8: RET domain EMC GB4 detection enable */ +#define PWR_EMCRETCTRL2_RETGBN7DET (1 << 7) /* Bit 7: RET domain EMC GBN7 detection enable */ +#define PWR_EMCRETCTRL2_RETGBN6DET (1 << 6) /* Bit 6: RET domain EMC GBN6 detection enable */ +#define PWR_EMCRETCTRL2_RETGBN5DET (1 << 5) /* Bit 5: RET domain EMC GBN5 detection enable */ +#define PWR_EMCRETCTRL2_RETGBN4DET (1 << 4) /* Bit 4: RET domain EMC GBN4 detection enable */ +#define PWR_EMCRETCTRL2_RETCLP7DET (1 << 3) /* Bit 3: RET domain EMC Clamp7 detection enable */ +#define PWR_EMCRETCTRL2_RETCLP6DET (1 << 2) /* Bit 2: RET domain EMC Clamp6 detection enable */ +#define PWR_EMCRETCTRL2_RETCLP5DET (1 << 1) /* Bit 1: RET domain EMC Clamp5 detection enable */ +#define PWR_EMCRETCTRL2_RETCLP4DET (1 << 0) /* Bit 0: RET domain EMC Clamp4 detection enable */ + +/* PWR EMC RET Status Register 2 (PWR_EMCRETSTS2) */ +#define PWR_EMCRETSTS2_GB7F (1 << 11) /* Bit 11: RET Domain EMC GB7 Flag */ +#define PWR_EMCRETSTS2_GB6F (1 << 10) /* Bit 10: RET Domain EMC GB6 Flag */ +#define PWR_EMCRETSTS2_GB5F (1 << 9) /* Bit 9: RET Domain EMC GB5 Flag */ +#define PWR_EMCRETSTS2_GB4F (1 << 8) /* Bit 8: RET Domain EMC GB4 Flag */ +#define PWR_EMCRETSTS2_GBN7F (1 << 7) /* Bit 7: RET Domain EMC GBN7 Flag */ +#define PWR_EMCRETSTS2_GBN6F (1 << 6) /* Bit 6: RET Domain EMC GBN6 Flag */ +#define PWR_EMCRETSTS2_GBN5F (1 << 5) /* Bit 5: RET Domain EMC GBN5 Flag */ +#define PWR_EMCRETSTS2_GBN4F (1 << 4) /* Bit 4: RET Domain EMC GBN4 Flag */ +#define PWR_EMCRETSTS2_CLP7F (1 << 3) /* Bit 3: RET Domain EMC Clamp7 Flag */ +#define PWR_EMCRETSTS2_CLP6F (1 << 2) /* Bit 2: RET Domain EMC Clamp6 Flag */ +#define PWR_EMCRETSTS2_CLP5F (1 << 1) /* Bit 1: RET Domain EMC Clamp5 Flag */ +#define PWR_EMCRETSTS2_CLP4F (1 << 0) /* Bit 0: RET Domain EMC Clamp4 Flag */ + +/* PWR EMC RET Control Register 3 (PWR_EMCRETCTRL3) */ +#define PWR_EMCRETCTRL3_RETGB11DET (1 << 11) /* Bit 11: RET domain EMC GB11 detection enable */ +#define PWR_EMCRETCTRL3_RETGB10DET (1 << 10) /* Bit 10: RET domain EMC GB10 detection enable */ +#define PWR_EMCRETCTRL3_RETGB9DET (1 << 9) /* Bit 9: RET domain EMC GB9 detection enable */ +#define PWR_EMCRETCTRL3_RETGB8DET (1 << 8) /* Bit 8: RET domain EMC GB8 detection enable */ +#define PWR_EMCRETCTRL3_RETGBN11DET (1 << 7) /* Bit 7: RET domain EMC GBN11 detection enable */ +#define PWR_EMCRETCTRL3_RETGBN10DET (1 << 6) /* Bit 6: RET domain EMC GBN10 detection enable */ +#define PWR_EMCRETCTRL3_RETGBN9DET (1 << 5) /* Bit 5: RET domain EMC GBN9 detection enable */ +#define PWR_EMCRETCTRL3_RETGBN8DET (1 << 4) /* Bit 4: RET domain EMC GBN8 detection enable */ +#define PWR_EMCRETCTRL3_RETCLP11DET (1 << 3) /* Bit 3: RET domain EMC Clamp11 detection enable */ +#define PWR_EMCRETCTRL3_RETCLP10DET (1 << 2) /* Bit 2: RET domain EMC Clamp10 detection enable */ +#define PWR_EMCRETCTRL3_RETCLP9DET (1 << 1) /* Bit 1: RET domain EMC Clamp9 detection enable */ +#define PWR_EMCRETCTRL3_RETCLP8DET (1 << 0) /* Bit 0: RET domain EMC Clamp8 detection enable */ + +/* PWR EMC RET Status Register 3 (PWR_EMCRETSTS3) */ +#define PWR_EMCRETSTS3_GB11F (1 << 11) /* Bit 11: RET Domain EMC GB11 Flag */ +#define PWR_EMCRETSTS3_GB10F (1 << 10) /* Bit 10: RET Domain EMC GB10 Flag */ +#define PWR_EMCRETSTS3_GB9F (1 << 9) /* Bit 9: RET Domain EMC GB9 Flag */ +#define PWR_EMCRETSTS3_GB8F (1 << 8) /* Bit 8: RET Domain EMC GB8 Flag */ +#define PWR_EMCRETSTS3_GBN11F (1 << 7) /* Bit 7: RET Domain EMC GBN11 Flag */ +#define PWR_EMCRETSTS3_GBN10F (1 << 6) /* Bit 6: RET Domain EMC GBN10 Flag */ +#define PWR_EMCRETSTS3_GBN9F (1 << 5) /* Bit 5: RET Domain EMC GBN9 Flag */ +#define PWR_EMCRETSTS3_GBN8F (1 << 4) /* Bit 4: RET Domain EMC GBN8 Flag */ +#define PWR_EMCRETSTS3_CLP11F (1 << 3) /* Bit 3: RET Domain EMC Clamp11 Flag */ +#define PWR_EMCRETSTS3_CLP10F (1 << 2) /* Bit 2: RET Domain EMC Clamp10 Flag */ +#define PWR_EMCRETSTS3_CLP9F (1 << 1) /* Bit 1: RET Domain EMC Clamp9 Flag */ +#define PWR_EMCRETSTS3_CLP8F (1 << 0) /* Bit 0: RET Domain EMC Clamp8 Flag */ + +/* PWR EMC RET Control Register 4 (PWR_EMCRETCTRL4) */ +#define PWR_EMCRETCTRL4_RETGB14DET (1 << 10) /* Bit 10: RET domain EMC GB14 detection enable */ +#define PWR_EMCRETCTRL4_RETGB13DET (1 << 9) /* Bit 9: RET domain EMC GB13 detection enable */ +#define PWR_EMCRETCTRL4_RETGB12DET (1 << 8) /* Bit 8: RET domain EMC GB12 detection enable */ +#define PWR_EMCRETCTRL4_RETGBN14DET (1 << 6) /* Bit 6: RET domain EMC GBN14 detection enable */ +#define PWR_EMCRETCTRL4_RETGBN13DET (1 << 5) /* Bit 5: RET domain EMC GBN13 detection enable */ +#define PWR_EMCRETCTRL4_RETGBN12DET (1 << 4) /* Bit 4: RET domain EMC GBN12 detection enable */ +#define PWR_EMCRETCTRL4_RETCLP14DET (1 << 2) /* Bit 2: RET domain EMC Clamp14 detection enable */ +#define PWR_EMCRETCTRL4_RETCLP13DET (1 << 1) /* Bit 1: RET domain EMC Clamp13 detection enable */ +#define PWR_EMCRETCTRL4_RETCLP12DET (1 << 0) /* Bit 0: RET domain EMC Clamp12 detection enable */ + +/* PWR EMC RET Status Register 4 (PWR_EMCRETSTS4) */ +#define PWR_EMCRETSTS4_GB14F (1 << 10) /* Bit 10: RET Domain EMC GB14 Flag */ +#define PWR_EMCRETSTS4_GB13F (1 << 9) /* Bit 9: RET Domain EMC GB13 Flag */ +#define PWR_EMCRETSTS4_GB12F (1 << 8) /* Bit 8: RET Domain EMC GB12 Flag */ +#define PWR_EMCRETSTS4_GBN14F (1 << 6) /* Bit 6: RET Domain EMC GBN14 Flag */ +#define PWR_EMCRETSTS4_GBN13F (1 << 5) /* Bit 5: RET Domain EMC GBN13 Flag */ +#define PWR_EMCRETSTS4_GBN12F (1 << 4) /* Bit 4: RET Domain EMC GBN12 Flag */ +#define PWR_EMCRETSTS4_CLP14F (1 << 2) /* Bit 2: RET Domain EMC Clamp14 Flag */ +#define PWR_EMCRETSTS4_CLP13F (1 << 1) /* Bit 1: RET Domain EMC Clamp13 Flag */ +#define PWR_EMCRETSTS4_CLP12F (1 << 0) /* Bit 0: RET Domain EMC Clamp12 Flag */ + +/* PWR EMC BKP Control Register (PWR_EMCBKPCTRL) */ +#define PWR_EMCBKPCTRL_BKPGBDET (1 << 8) /* Bit 8: Backup domain EMC GB detection enable */ +#define PWR_EMCBKPCTRL_BKPGBNDET (1 << 4) /* Bit 4: Backup domain EMC GBN detection enable */ +#define PWR_EMCBKPCTRL_BKPCLPDET (1 << 0) /* Bit 0: Backup domain EMC Clamp detection enable */ + +/* PWR EMC BKP Status Register (PWR_EMCRETSTS) */ +#define PWR_EMCRETSTS_BKPGBF (1 << 8) /* Bit 8: Backup Domain EMC GB Flag */ +#define PWR_EMCRETSTS_BKPGBNF (1 << 4) /* Bit 4: Backup Domain EMC GBN Flag */ +#define PWR_EMCRETSTS_BKPCLPF (1 << 0) /* Bit 0: Backup Domain EMC Clamp Flag */ + +#endif /* __ARCH_ARM_SRC_N32H7_HARDWARE_N32H76X_PWR_H */ diff --git a/arch/arm/src/n32h7/hardware/n32h76x_rcc.h b/arch/arm/src/n32h7/hardware/n32h76x_rcc.h new file mode 100644 index 0000000000000..492e3a0f089e7 --- /dev/null +++ b/arch/arm/src/n32h7/hardware/n32h76x_rcc.h @@ -0,0 +1,3415 @@ +/**************************************************************************** + * arch/arm/src/n32h7/hardware/n32h76x_rcc.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __ARCH_ARM_SRC_N32H7_HARDWARE_N32H76X_RCC_H +#define __ARCH_ARM_SRC_N32H7_HARDWARE_N32H76X_RCC_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include "chip.h" +#include "hardware/n32h7_memorymap.h" + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +#define DWT_CR (*(volatile uint32_t *)0xE0001000U) +#define DWT_CYCCNT (*(volatile uint32_t *)0xE0001004U) +#define DEM_CR (*(volatile uint32_t *)0xE000EDFCU) +#define DEM_CR_TRCENA ((uint32_t)0x01000000U) +#define DWT_CR_CYCCNTENA ((uint32_t)0x00000001U) + +#define CPU_DELAY_INTI() do{ \ + /* Enable DWT*/ \ + DEM_CR |= DEM_CR_TRCENA; \ + /* Clear DWT CYCCNT*/ \ + DWT_CYCCNT = 0U; \ + /* Enable DWT CYCCNT*/ \ + DWT_CR |= DWT_CR_CYCCNTENA; \ + }while(0) + +#define CPU_DELAY_DISABLE() do{ \ + /* Disable DWT*/ \ + DEM_CR &= (uint32_t)(~(uint32_t)DEM_CR_TRCENA); \ + }while(0) + +#define __RCC_DELAY_US(usec)do{ \ + uint32_t delay_end; \ + CPU_DELAY_INTI(); \ + /* Delay*/ \ + delay_end = DWT_CYCCNT + (usec * (600000000/1000000)); \ + while(DWT_CYCCNT < delay_end){}; \ + CPU_DELAY_DISABLE(); \ + }while(0) + +#define __RCC_DELAY_MS(msec)do{ \ + uint32_t delay_end; \ + CPU_DELAY_INTI(); \ + /* Delay*/ \ + delay_end = DWT_CYCCNT + (msec * (600000000/1000)); \ + while(DWT_CYCCNT < delay_end){}; \ + CPU_DELAY_DISABLE(); \ + }while(0) + +/* Register Offsets *********************************************************/ + +#define N32_RCC_PLL1CTRL1_OFFSET 0x0000 /* PLL1 Control Register 1 */ +#define N32_RCC_PLL1CTRL2_OFFSET 0x0004 /* PLL1 Control Register 2 */ +#define N32_RCC_PLL2CTRL1_OFFSET 0x0010 /* PLL2 Control Register 1 */ +#define N32_RCC_PLL2CTRL2_OFFSET 0x0014 /* PLL2 Control Register 2 */ +#define N32_RCC_PLL3CTRL1_OFFSET 0x0020 /* PLL3 Control Register 1 */ +#define N32_RCC_PLL3CTRL2_OFFSET 0x0024 /* PLL3 Control Register 2 */ +#define N32_RCC_SRCCTRL1_OFFSET 0x0030 /* Source Control Register 1 */ +#define N32_RCC_PLL1DIV_OFFSET 0x0034 /* PLL1 Divider Register */ +#define N32_RCC_PLL2DIV_OFFSET 0x0038 /* PLL2 Divider Register */ +#define N32_RCC_PLL3DIV_OFFSET 0x003C /* PLL3 Divider Register */ +#define N32_RCC_SYSBUSDIV1_OFFSET 0x0040 /* System Bus Divider 1 */ +#define N32_RCC_SYSBUSDIV2_OFFSET 0x0044 /* System Bus Divider 2 */ +#define N32_RCC_BOOTMODE_OFFSET 0x0048 /* Boot Mode Register */ +#define N32_RCC_AHB1DIV1_OFFSET 0x004C /* AHB1 Divider 1 */ +#define N32_RCC_AHB1SEL1_OFFSET 0x0050 /* AHB1 Select 1 */ +#define N32_RCC_AHB1EN1_OFFSET 0x0054 /* AHB1 Enable 1 */ +#define N32_RCC_AHB1EN2_OFFSET 0x0058 /* AHB1 Enable 2 */ +#define N32_RCC_AHB1EN3_OFFSET 0x005C /* AHB1 Enable 3 */ +#define N32_RCC_AHB1EN4_OFFSET 0x0060 /* AHB1 Enable 4 */ +#define N32_RCC_AHB1RST1_OFFSET 0x0064 /* AHB1 Reset 1 */ +#define N32_RCC_AHB1RST2_OFFSET 0x0068 /* AHB1 Reset 2 */ +#define N32_RCC_AHB1RST3_OFFSET 0x006C /* AHB1 Reset 3 */ +#define N32_RCC_AHB1RST4_OFFSET 0x0070 /* AHB1 Reset 4 */ +#define N32_RCC_APB1DIV1_OFFSET 0x0074 /* APB1 Divider 1 */ +#define N32_RCC_APB1SEL1_OFFSET 0x0078 /* APB1 Select 1 */ +#define N32_RCC_APB1SEL2_OFFSET 0x007C /* APB1 Select 2 */ +#define N32_RCC_APB1EN1_OFFSET 0x0080 /* APB1 Enable 1 */ +#define N32_RCC_APB1EN2_OFFSET 0x0084 /* APB1 Enable 2 */ +#define N32_RCC_APB1EN3_OFFSET 0x0088 /* APB1 Enable 3 */ +#define N32_RCC_APB1EN4_OFFSET 0x008C /* APB1 Enable 4 */ +#define N32_RCC_APB1EN5_OFFSET 0x0090 /* APB1 Enable 5 */ +#define N32_RCC_APB1RST1_OFFSET 0x0094 /* APB1 Reset 1 */ +#define N32_RCC_APB1RST2_OFFSET 0x0098 /* APB1 Reset 2 */ +#define N32_RCC_APB1RST3_OFFSET 0x009C /* APB1 Reset 3 */ +#define N32_RCC_APB1RST4_OFFSET 0x00A0 /* APB1 Reset 4 */ +#define N32_RCC_APB1RST5_OFFSET 0x00A4 /* APB1 Reset 5 */ +#define N32_RCC_AHB2DIV1_OFFSET 0x00A8 /* AHB2 Divider 1 */ +#define N32_RCC_AHB2SEL1_OFFSET 0x00AC /* AHB2 Select 1 */ +#define N32_RCC_AHB2EN1_OFFSET 0x00B0 /* AHB2 Enable 1 */ +#define N32_RCC_AHB2RST1_OFFSET 0x00B4 /* AHB2 Reset 1 */ +#define N32_RCC_APB2DIV1_OFFSET 0x00B8 /* APB2 Divider 1 */ +#define N32_RCC_APB2SEL1_OFFSET 0x00BC /* APB2 Select 1 */ +#define N32_RCC_APB2SEL2_OFFSET 0x00C0 /* APB2 Select 2 */ +#define N32_RCC_APB2EN1_OFFSET 0x00C4 /* APB2 Enable 1 */ +#define N32_RCC_APB2EN2_OFFSET 0x00C8 /* APB2 Enable 2 */ +#define N32_RCC_APB2EN3_OFFSET 0x00CC /* APB2 Enable 3 */ +#define N32_RCC_APB2EN4_OFFSET 0x00D0 /* APB2 Enable 4 */ +#define N32_RCC_APB2RST1_OFFSET 0x00D4 /* APB2 Reset 1 */ +#define N32_RCC_APB2RST2_OFFSET 0x00D8 /* APB2 Reset 2 */ +#define N32_RCC_APB2RST3_OFFSET 0x00DC /* APB2 Reset 3 */ +#define N32_RCC_APB2RST4_OFFSET 0x00E0 /* APB2 Reset 4 */ +#define N32_RCC_AHB5EN1_OFFSET 0x00E4 /* AHB5 Enable 1 */ +#define N32_RCC_AHB5EN2_OFFSET 0x00E8 /* AHB5 Enable 2 */ +#define N32_RCC_AHB5RST1_OFFSET 0x00EC /* AHB5 Reset 1 */ +#define N32_RCC_AHB5RST2_OFFSET 0x00F0 /* AHB5 Reset 2 */ +#define N32_RCC_APB5DIV1_OFFSET 0x00F4 /* APB5 Divider 1 */ +#define N32_RCC_APB5SEL1_OFFSET 0x00F8 /* APB5 Select 1 */ +#define N32_RCC_APB5EN1_OFFSET 0x00FC /* APB5 Enable 1 */ +#define N32_RCC_APB5EN2_OFFSET 0x0100 /* APB5 Enable 2 */ +#define N32_RCC_APB5RST1_OFFSET 0x0104 /* APB5 Reset 1 */ +#define N32_RCC_APB5RST2_OFFSET 0x0108 /* APB5 Reset 2 */ +#define N32_RCC_RDDIV1_OFFSET 0x010C /* RD Divider 1 */ +#define N32_RCC_RDSEL1_OFFSET 0x0110 /* RD Select 1 */ +#define N32_RCC_RDEN1_OFFSET 0x0114 /* RD Enable 1 */ +#define N32_RCC_RDEN2_OFFSET 0x0118 /* RD Enable 2 */ +#define N32_RCC_RDRST1_OFFSET 0x011C /* RD Reset 1 */ +#define N32_RCC_RDRST2_OFFSET 0x0120 /* RD Reset 2 */ +#define N32_RCC_BDCTRL_OFFSET 0x0124 /* Backup Domain Control */ +#define N32_RCC_CTRLSTS_OFFSET 0x0128 /* Control and Status */ +#define N32_RCC_CLKINT1_OFFSET 0x012C /* Clock Interrupt 1 */ +#define N32_RCC_CLKINT2_OFFSET 0x0130 /* Clock Interrupt 2 */ +#define N32_RCC_CFG1_OFFSET 0x0134 /* Configuration 1 */ +#define N32_RCC_AXIDIV1_OFFSET 0x0138 /* AXI Divider 1 */ +#define N32_RCC_AXISEL1_OFFSET 0x013C /* AXI Select 1 */ +#define N32_RCC_AXIEN1_OFFSET 0x0140 /* AXI Enable 1 */ +#define N32_RCC_AXIEN2_OFFSET 0x0144 /* AXI Enable 2 */ +#define N32_RCC_AXIEN3_OFFSET 0x0148 /* AXI Enable 3 */ +#define N32_RCC_AXIEN4_OFFSET 0x014C /* AXI Enable 4 */ +#define N32_RCC_AXIRST1_OFFSET 0x0150 /* AXI Reset 1 */ +#define N32_RCC_AXIRST2_OFFSET 0x0154 /* AXI Reset 2 */ +#define N32_RCC_AXIRST3_OFFSET 0x0158 /* AXI Reset 3 */ +#define N32_RCC_AXIRST4_OFFSET 0x015C /* AXI Reset 4 */ +#define N32_RCC_CFG2_OFFSET 0x0160 /* Configuration 2 */ +#define N32_RCC_CFG3_OFFSET 0x0164 /* Configuration 3 */ +#define N32_RCC_CFG4_OFFSET 0x0168 /* Configuration 4 */ +#define N32_RCC_SRCCTRL2_OFFSET 0x016C /* Source Control 2 */ +#define N32_RCC_CFG5_OFFSET 0x0170 /* Configuration 5 */ +#define N32_RCC_M4RSTREL_OFFSET 0x0174 /* M4 Reset Release */ +#define N32_RCC_AXIDIV2_OFFSET 0x0178 /* AXI Divider 2 */ +#define N32_RCC_AXISEL2_OFFSET 0x017C /* AXI Select 2 */ +#define N32_RCC_SHRPLLCTRL1_OFFSET 0x018C /* Shared PLL Control 1 */ +#define N32_RCC_SHRPLLCTRL2_OFFSET 0x0190 /* Shared PLL Control 2 */ +#define N32_RCC_AHB1DIV2_OFFSET 0x0194 /* AHB1 Divider 2 */ +#define N32_RCC_LSERDDL_OFFSET 0x0198 /* LSE Ready Delay */ +#define N32_RCC_MSIRDDL_OFFSET 0x019C /* MSI Ready Delay */ +#define N32_RCC_HSERDDL_OFFSET 0x01A0 /* HSE Ready Delay */ +#define N32_RCC_PLLSFTLK_OFFSET 0x01A4 /* PLL Soft Lock */ +#define N32_RCC_RDCTRL1_OFFSET 0x01A8 /* RD Control 1 */ +#define N32_RCC_RDCTRL2_OFFSET 0x01AC /* RD Control 2 */ +#define N32_RCC_RDCTRL3_OFFSET 0x01B0 /* RD Control 3 */ +#define N32_RCC_AHB2EN2_OFFSET 0x01B4 /* AHB2 Enable 2 */ +#define N32_RCC_AHB9DIV1_OFFSET 0x01B8 /* AHB9 Divider 1 */ +#define N32_RCC_AHB9SEL1_OFFSET 0x01BC /* AHB9 Select 1 */ +#define N32_RCC_AHB9EN1_OFFSET 0x01C0 /* AHB9 Enable 1 */ +#define N32_RCC_AHB9RST1_OFFSET 0x01C4 /* AHB9 Reset 1 */ +#define N32_RCC_HSEOS_OFFSET 0x01C8 /* HSE Oscillator Status */ +#define N32_RCC_LSEOS_OFFSET 0x01CC /* LSE Oscillator Status */ +#define N32_RCC_HSECAL_OFFSET 0x01D0 /* HSE Calibration */ +#define N32_RCC_CLKINT3_OFFSET 0x01D4 /* Clock Interrupt 3 */ +#define N32_RCC_PLLFD_OFFSET 0x01D8 /* PLL Frequency Detect */ +#define N32_RCC_SRCCTRL3_OFFSET 0x01DC /* Source Control 3 */ +#define N32_RCC_LSICSSDL_OFFSET 0x01E0 /* LSI CSS Delay */ + +/* Register Addresses *******************************************************/ + +#define N32_RCC_PLL1CTRL1 (N32_RCC_BASE + N32_RCC_PLL1CTRL1_OFFSET) /* PLL1 Control Register 1 */ +#define N32_RCC_PLL1CTRL2 (N32_RCC_BASE + N32_RCC_PLL1CTRL2_OFFSET) /* PLL1 Control Register 2 */ +#define N32_RCC_PLL2CTRL1 (N32_RCC_BASE + N32_RCC_PLL2CTRL1_OFFSET) /* PLL2 Control Register 1 */ +#define N32_RCC_PLL2CTRL2 (N32_RCC_BASE + N32_RCC_PLL2CTRL2_OFFSET) /* PLL2 Control Register 2 */ +#define N32_RCC_PLL3CTRL1 (N32_RCC_BASE + N32_RCC_PLL3CTRL1_OFFSET) /* PLL3 Control Register 1 */ +#define N32_RCC_PLL3CTRL2 (N32_RCC_BASE + N32_RCC_PLL3CTRL2_OFFSET) /* PLL3 Control Register 2 */ +#define N32_RCC_SRCCTRL1 (N32_RCC_BASE + N32_RCC_SRCCTRL1_OFFSET) /* Source Control Register 1 */ +#define N32_RCC_PLL1DIV (N32_RCC_BASE + N32_RCC_PLL1DIV_OFFSET) /* PLL1 Divider Register */ +#define N32_RCC_PLL2DIV (N32_RCC_BASE + N32_RCC_PLL2DIV_OFFSET) /* PLL2 Divider Register */ +#define N32_RCC_PLL3DIV (N32_RCC_BASE + N32_RCC_PLL3DIV_OFFSET) /* PLL3 Divider Register */ +#define N32_RCC_SYSBUSDIV1 (N32_RCC_BASE + N32_RCC_SYSBUSDIV1_OFFSET) /* System Bus Divider 1 */ +#define N32_RCC_SYSBUSDIV2 (N32_RCC_BASE + N32_RCC_SYSBUSDIV2_OFFSET) /* System Bus Divider 2 */ +#define N32_RCC_BOOTMODE (N32_RCC_BASE + N32_RCC_BOOTMODE_OFFSET) /* Boot Mode Register */ +#define N32_RCC_AHB1DIV1 (N32_RCC_BASE + N32_RCC_AHB1DIV1_OFFSET) /* AHB1 Divider 1 */ +#define N32_RCC_AHB1SEL1 (N32_RCC_BASE + N32_RCC_AHB1SEL1_OFFSET) /* AHB1 Select 1 */ +#define N32_RCC_AHB1EN1 (N32_RCC_BASE + N32_RCC_AHB1EN1_OFFSET) /* AHB1 Enable 1 */ +#define N32_RCC_AHB1EN2 (N32_RCC_BASE + N32_RCC_AHB1EN2_OFFSET) /* AHB1 Enable 2 */ +#define N32_RCC_AHB1EN3 (N32_RCC_BASE + N32_RCC_AHB1EN3_OFFSET) /* AHB1 Enable 3 */ +#define N32_RCC_AHB1EN4 (N32_RCC_BASE + N32_RCC_AHB1EN4_OFFSET) /* AHB1 Enable 4 */ +#define N32_RCC_AHB1RST1 (N32_RCC_BASE + N32_RCC_AHB1RST1_OFFSET) /* AHB1 Reset 1 */ +#define N32_RCC_AHB1RST2 (N32_RCC_BASE + N32_RCC_AHB1RST2_OFFSET) /* AHB1 Reset 2 */ +#define N32_RCC_AHB1RST3 (N32_RCC_BASE + N32_RCC_AHB1RST3_OFFSET) /* AHB1 Reset 3 */ +#define N32_RCC_AHB1RST4 (N32_RCC_BASE + N32_RCC_AHB1RST4_OFFSET) /* AHB1 Reset 4 */ +#define N32_RCC_APB1DIV1 (N32_RCC_BASE + N32_RCC_APB1DIV1_OFFSET) /* APB1 Divider 1 */ +#define N32_RCC_APB1SEL1 (N32_RCC_BASE + N32_RCC_APB1SEL1_OFFSET) /* APB1 Select 1 */ +#define N32_RCC_APB1SEL2 (N32_RCC_BASE + N32_RCC_APB1SEL2_OFFSET) /* APB1 Select 2 */ +#define N32_RCC_APB1EN1 (N32_RCC_BASE + N32_RCC_APB1EN1_OFFSET) /* APB1 Enable 1 */ +#define N32_RCC_APB1EN2 (N32_RCC_BASE + N32_RCC_APB1EN2_OFFSET) /* APB1 Enable 2 */ +#define N32_RCC_APB1EN3 (N32_RCC_BASE + N32_RCC_APB1EN3_OFFSET) /* APB1 Enable 3 */ +#define N32_RCC_APB1EN4 (N32_RCC_BASE + N32_RCC_APB1EN4_OFFSET) /* APB1 Enable 4 */ +#define N32_RCC_APB1EN5 (N32_RCC_BASE + N32_RCC_APB1EN5_OFFSET) /* APB1 Enable 5 */ +#define N32_RCC_APB1RST1 (N32_RCC_BASE + N32_RCC_APB1RST1_OFFSET) /* APB1 Reset 1 */ +#define N32_RCC_APB1RST2 (N32_RCC_BASE + N32_RCC_APB1RST2_OFFSET) /* APB1 Reset 2 */ +#define N32_RCC_APB1RST3 (N32_RCC_BASE + N32_RCC_APB1RST3_OFFSET) /* APB1 Reset 3 */ +#define N32_RCC_APB1RST4 (N32_RCC_BASE + N32_RCC_APB1RST4_OFFSET) /* APB1 Reset 4 */ +#define N32_RCC_APB1RST5 (N32_RCC_BASE + N32_RCC_APB1RST5_OFFSET) /* APB1 Reset 5 */ +#define N32_RCC_AHB2DIV1 (N32_RCC_BASE + N32_RCC_AHB2DIV1_OFFSET) /* AHB2 Divider 1 */ +#define N32_RCC_AHB2SEL1 (N32_RCC_BASE + N32_RCC_AHB2SEL1_OFFSET) /* AHB2 Select 1 */ +#define N32_RCC_AHB2EN1 (N32_RCC_BASE + N32_RCC_AHB2EN1_OFFSET) /* AHB2 Enable 1 */ +#define N32_RCC_AHB2RST1 (N32_RCC_BASE + N32_RCC_AHB2RST1_OFFSET) /* AHB2 Reset 1 */ +#define N32_RCC_APB2DIV1 (N32_RCC_BASE + N32_RCC_APB2DIV1_OFFSET) /* APB2 Divider 1 */ +#define N32_RCC_APB2SEL1 (N32_RCC_BASE + N32_RCC_APB2SEL1_OFFSET) /* APB2 Select 1 */ +#define N32_RCC_APB2SEL2 (N32_RCC_BASE + N32_RCC_APB2SEL2_OFFSET) /* APB2 Select 2 */ +#define N32_RCC_APB2EN1 (N32_RCC_BASE + N32_RCC_APB2EN1_OFFSET) /* APB2 Enable 1 */ +#define N32_RCC_APB2EN2 (N32_RCC_BASE + N32_RCC_APB2EN2_OFFSET) /* APB2 Enable 2 */ +#define N32_RCC_APB2EN3 (N32_RCC_BASE + N32_RCC_APB2EN3_OFFSET) /* APB2 Enable 3 */ +#define N32_RCC_APB2EN4 (N32_RCC_BASE + N32_RCC_APB2EN4_OFFSET) /* APB2 Enable 4 */ +#define N32_RCC_APB2RST1 (N32_RCC_BASE + N32_RCC_APB2RST1_OFFSET) /* APB2 Reset 1 */ +#define N32_RCC_APB2RST2 (N32_RCC_BASE + N32_RCC_APB2RST2_OFFSET) /* APB2 Reset 2 */ +#define N32_RCC_APB2RST3 (N32_RCC_BASE + N32_RCC_APB2RST3_OFFSET) /* APB2 Reset 3 */ +#define N32_RCC_APB2RST4 (N32_RCC_BASE + N32_RCC_APB2RST4_OFFSET) /* APB2 Reset 4 */ +#define N32_RCC_AHB5EN1 (N32_RCC_BASE + N32_RCC_AHB5EN1_OFFSET) /* AHB5 Enable 1 */ +#define N32_RCC_AHB5EN2 (N32_RCC_BASE + N32_RCC_AHB5EN2_OFFSET) /* AHB5 Enable 2 */ +#define N32_RCC_AHB5RST1 (N32_RCC_BASE + N32_RCC_AHB5RST1_OFFSET) /* AHB5 Reset 1 */ +#define N32_RCC_AHB5RST2 (N32_RCC_BASE + N32_RCC_AHB5RST2_OFFSET) /* AHB5 Reset 2 */ +#define N32_RCC_APB5DIV1 (N32_RCC_BASE + N32_RCC_APB5DIV1_OFFSET) /* APB5 Divider 1 */ +#define N32_RCC_APB5SEL1 (N32_RCC_BASE + N32_RCC_APB5SEL1_OFFSET) /* APB5 Select 1 */ +#define N32_RCC_APB5EN1 (N32_RCC_BASE + N32_RCC_APB5EN1_OFFSET) /* APB5 Enable 1 */ +#define N32_RCC_APB5EN2 (N32_RCC_BASE + N32_RCC_APB5EN2_OFFSET) /* APB5 Enable 2 */ +#define N32_RCC_APB5RST1 (N32_RCC_BASE + N32_RCC_APB5RST1_OFFSET) /* APB5 Reset 1 */ +#define N32_RCC_APB5RST2 (N32_RCC_BASE + N32_RCC_APB5RST2_OFFSET) /* APB5 Reset 2 */ +#define N32_RCC_RDDIV1 (N32_RCC_BASE + N32_RCC_RDDIV1_OFFSET) /* RD Divider 1 */ +#define N32_RCC_RDSEL1 (N32_RCC_BASE + N32_RCC_RDSEL1_OFFSET) /* RD Select 1 */ +#define N32_RCC_RDEN1 (N32_RCC_BASE + N32_RCC_RDEN1_OFFSET) /* RD Enable 1 */ +#define N32_RCC_RDEN2 (N32_RCC_BASE + N32_RCC_RDEN2_OFFSET) /* RD Enable 2 */ +#define N32_RCC_RDRST1 (N32_RCC_BASE + N32_RCC_RDRST1_OFFSET) /* RD Reset 1 */ +#define N32_RCC_RDRST2 (N32_RCC_BASE + N32_RCC_RDRST2_OFFSET) /* RD Reset 2 */ +#define N32_RCC_BDCTRL (N32_RCC_BASE + N32_RCC_BDCTRL_OFFSET) /* Backup Domain Control */ +#define N32_RCC_CTRLSTS (N32_RCC_BASE + N32_RCC_CTRLSTS_OFFSET) /* Control and Status */ +#define N32_RCC_CLKINT1 (N32_RCC_BASE + N32_RCC_CLKINT1_OFFSET) /* Clock Interrupt 1 */ +#define N32_RCC_CLKINT2 (N32_RCC_BASE + N32_RCC_CLKINT2_OFFSET) /* Clock Interrupt 2 */ +#define N32_RCC_CFG1 (N32_RCC_BASE + N32_RCC_CFG1_OFFSET) /* Configuration 1 */ +#define N32_RCC_AXIDIV1 (N32_RCC_BASE + N32_RCC_AXIDIV1_OFFSET) /* AXI Divider 1 */ +#define N32_RCC_AXISEL1 (N32_RCC_BASE + N32_RCC_AXISEL1_OFFSET) /* AXI Select 1 */ +#define N32_RCC_AXIEN1 (N32_RCC_BASE + N32_RCC_AXIEN1_OFFSET) /* AXI Enable 1 */ +#define N32_RCC_AXIEN2 (N32_RCC_BASE + N32_RCC_AXIEN2_OFFSET) /* AXI Enable 2 */ +#define N32_RCC_AXIEN3 (N32_RCC_BASE + N32_RCC_AXIEN3_OFFSET) /* AXI Enable 3 */ +#define N32_RCC_AXIEN4 (N32_RCC_BASE + N32_RCC_AXIEN4_OFFSET) /* AXI Enable 4 */ +#define N32_RCC_AXIRST1 (N32_RCC_BASE + N32_RCC_AXIRST1_OFFSET) /* AXI Reset 1 */ +#define N32_RCC_AXIRST2 (N32_RCC_BASE + N32_RCC_AXIRST2_OFFSET) /* AXI Reset 2 */ +#define N32_RCC_AXIRST3 (N32_RCC_BASE + N32_RCC_AXIRST3_OFFSET) /* AXI Reset 3 */ +#define N32_RCC_AXIRST4 (N32_RCC_BASE + N32_RCC_AXIRST4_OFFSET) /* AXI Reset 4 */ +#define N32_RCC_CFG2 (N32_RCC_BASE + N32_RCC_CFG2_OFFSET) /* Configuration 2 */ +#define N32_RCC_CFG3 (N32_RCC_BASE + N32_RCC_CFG3_OFFSET) /* Configuration 3 */ +#define N32_RCC_CFG4 (N32_RCC_BASE + N32_RCC_CFG4_OFFSET) /* Configuration 4 */ +#define N32_RCC_SRCCTRL2 (N32_RCC_BASE + N32_RCC_SRCCTRL2_OFFSET) /* Source Control 2 */ +#define N32_RCC_CFG5 (N32_RCC_BASE + N32_RCC_CFG5_OFFSET) /* Configuration 5 */ +#define N32_RCC_M4RSTREL (N32_RCC_BASE + N32_RCC_M4RSTREL_OFFSET) /* M4 Reset Release */ +#define N32_RCC_AXIDIV2 (N32_RCC_BASE + N32_RCC_AXIDIV2_OFFSET) /* AXI Divider 2 */ +#define N32_RCC_AXISEL2 (N32_RCC_BASE + N32_RCC_AXISEL2_OFFSET) /* AXI Select 2 */ +#define N32_RCC_SHRPLLCTRL1 (N32_RCC_BASE + N32_RCC_SHRPLLCTRL1_OFFSET)/* Shared PLL Control 1 */ +#define N32_RCC_SHRPLLCTRL2 (N32_RCC_BASE + N32_RCC_SHRPLLCTRL2_OFFSET)/* Shared PLL Control 2 */ +#define N32_RCC_AHB1DIV2 (N32_RCC_BASE + N32_RCC_AHB1DIV2_OFFSET) /* AHB1 Divider 2 */ +#define N32_RCC_LSERDDL (N32_RCC_BASE + N32_RCC_LSERDDL_OFFSET) /* LSE Ready Delay */ +#define N32_RCC_MSIRDDL (N32_RCC_BASE + N32_RCC_MSIRDDL_OFFSET) /* MSI Ready Delay */ +#define N32_RCC_HSERDDL (N32_RCC_BASE + N32_RCC_HSERDDL_OFFSET) /* HSE Ready Delay */ +#define N32_RCC_PLLSFTLK (N32_RCC_BASE + N32_RCC_PLLSFTLK_OFFSET) /* PLL Soft Lock */ +#define N32_RCC_RDCTRL1 (N32_RCC_BASE + N32_RCC_RDCTRL1_OFFSET) /* RD Control 1 */ +#define N32_RCC_RDCTRL2 (N32_RCC_BASE + N32_RCC_RDCTRL2_OFFSET) /* RD Control 2 */ +#define N32_RCC_RDCTRL3 (N32_RCC_BASE + N32_RCC_RDCTRL3_OFFSET) /* RD Control 3 */ +#define N32_RCC_AHB2EN2 (N32_RCC_BASE + N32_RCC_AHB2EN2_OFFSET) /* AHB2 Enable 2 */ +#define N32_RCC_AHB9DIV1 (N32_RCC_BASE + N32_RCC_AHB9DIV1_OFFSET) /* AHB9 Divider 1 */ +#define N32_RCC_AHB9SEL1 (N32_RCC_BASE + N32_RCC_AHB9SEL1_OFFSET) /* AHB9 Select 1 */ +#define N32_RCC_AHB9EN1 (N32_RCC_BASE + N32_RCC_AHB9EN1_OFFSET) /* AHB9 Enable 1 */ +#define N32_RCC_AHB9RST1 (N32_RCC_BASE + N32_RCC_AHB9RST1_OFFSET) /* AHB9 Reset 1 */ +#define N32_RCC_HSEOS (N32_RCC_BASE + N32_RCC_HSEOS_OFFSET) /* HSE Oscillator Status */ +#define N32_RCC_LSEOS (N32_RCC_BASE + N32_RCC_LSEOS_OFFSET) /* LSE Oscillator Status */ +#define N32_RCC_HSECAL (N32_RCC_BASE + N32_RCC_HSECAL_OFFSET) /* HSE Calibration */ +#define N32_RCC_CLKINT3 (N32_RCC_BASE + N32_RCC_CLKINT3_OFFSET) /* Clock Interrupt 3 */ +#define N32_RCC_PLLFD (N32_RCC_BASE + N32_RCC_PLLFD_OFFSET) /* PLL Frequency Detect */ +#define N32_RCC_SRCCTRL3 (N32_RCC_BASE + N32_RCC_SRCCTRL3_OFFSET) /* Source Control 3 */ +#define N32_RCC_LSICSSDL (N32_RCC_BASE + N32_RCC_LSICSSDL_OFFSET) /* LSI CSS Delay */ + +/* Register Bitfield Definitions ********************************************/ + +/* Bit definition for RCC_PLL1CTRL1 register ********************************/ +#define RCC_PLL1CTRL1_PLL1SRC_SHIFT (28) /* Bits 28-29: PLL1 clock source selection */ +#define RCC_PLL1CTRL1_PLL1SRC_MASK (0x3 << RCC_PLL1CTRL1_PLL1SRC_SHIFT) +#define RCC_PLL1CTRL1_PLL1SRC_0 (1 << 28) /* Bit 28 */ +#define RCC_PLL1CTRL1_PLL1SRC_1 (1 << 29) /* Bit 29 */ + +#define RCC_PLL1CTRL1_PLL1SRC_HSI (0x0 << RCC_PLL1CTRL1_PLL1SRC_SHIFT) /* HSI Clock is the PLL source clock */ +#define RCC_PLL1CTRL1_PLL1SRC_NONE (0x1 << RCC_PLL1CTRL1_PLL1SRC_SHIFT) /* No clock */ +#define RCC_PLL1CTRL1_PLL1SRC_MSI (0x2 << RCC_PLL1CTRL1_PLL1SRC_SHIFT) /* MSI Clock is the PLL source clock */ +#define RCC_PLL1CTRL1_PLL1SRC_HSE (0x3 << RCC_PLL1CTRL1_PLL1SRC_SHIFT) /* HSE Clock is the PLL source clock */ + +#define RCC_PLL1CTRL1_PLL1PHLK (1 << 20) /* Bit 20: PLL1 PH lock */ +#define RCC_PLL1CTRL1_PLL1LDOEN (1 << 19) /* Bit 19: PLL1 LDO enable */ +#define RCC_PLL1CTRL1_PLL1EN (1 << 18) /* Bit 18: PLL1 enable */ +#define RCC_PLL1CTRL1_PLL1RST (1 << 17) /* Bit 17: PLL1 reset */ +#define RCC_PLL1CTRL1_PLL1PD (1 << 16) /* Bit 16: PLL1 power down */ + +#define RCC_PLL1CTRL1_PLL1BWAJ_SHIFT (0) /* Bits 0-11: PLL1 BWAJ value */ +#define RCC_PLL1CTRL1_PLL1BWAJ_MASK (0xFFF << RCC_PLL1CTRL1_PLL1BWAJ_SHIFT) +#define RCC_PLL1CTRL1_PLL1BWAJ_0 (1 << 0) /* Bit 0 */ +#define RCC_PLL1CTRL1_PLL1BWAJ_1 (1 << 1) /* Bit 1 */ +#define RCC_PLL1CTRL1_PLL1BWAJ_2 (1 << 2) /* Bit 2 */ +#define RCC_PLL1CTRL1_PLL1BWAJ_3 (1 << 3) /* Bit 3 */ +#define RCC_PLL1CTRL1_PLL1BWAJ_4 (1 << 4) /* Bit 4 */ +#define RCC_PLL1CTRL1_PLL1BWAJ_5 (1 << 5) /* Bit 5 */ +#define RCC_PLL1CTRL1_PLL1BWAJ_6 (1 << 6) /* Bit 6 */ +#define RCC_PLL1CTRL1_PLL1BWAJ_7 (1 << 7) /* Bit 7 */ +#define RCC_PLL1CTRL1_PLL1BWAJ_8 (1 << 8) /* Bit 8 */ +#define RCC_PLL1CTRL1_PLL1BWAJ_9 (1 << 9) /* Bit 9 */ +#define RCC_PLL1CTRL1_PLL1BWAJ_10 (1 << 10) /* Bit 10 */ +#define RCC_PLL1CTRL1_PLL1BWAJ_11 (1 << 11) /* Bit 11 */ + +#define RCC_PLL1CTRL1_PLL1BWAJ(n) ((n) << RCC_PLL1CTRL1_PLL1BWAJ_SHIFT) + +/* Bit definition for RCC_PLL1CTRL2 register ********************************/ +#define RCC_PLL1CTRL2_PLL1CLKR_SHIFT (26) /* Bits 26-31: PLL1 clock R divider */ +#define RCC_PLL1CTRL2_PLL1CLKR_MASK (0x3F << RCC_PLL1CTRL2_PLL1CLKR_SHIFT) +#define RCC_PLL1CTRL2_PLL1CLKR_0 (1 << 26) /* Bit 26 */ +#define RCC_PLL1CTRL2_PLL1CLKR_1 (1 << 27) /* Bit 27 */ +#define RCC_PLL1CTRL2_PLL1CLKR_2 (1 << 28) /* Bit 28 */ +#define RCC_PLL1CTRL2_PLL1CLKR_3 (1 << 29) /* Bit 29 */ +#define RCC_PLL1CTRL2_PLL1CLKR_4 (1 << 30) /* Bit 30 */ +#define RCC_PLL1CTRL2_PLL1CLKR_5 (1 << 31) /* Bit 31 */ + +#define RCC_PLL1CTRL2_PLL1CLKR(n) ((n) << RCC_PLL1CTRL2_PLL1CLKR_SHIFT) + +#define RCC_PLL1CTRL2_PLL1CLKF_SHIFT (0) /* Bits 0-25: PLL1 clock F multiplier */ +#define RCC_PLL1CTRL2_PLL1CLKF_MASK (0x3FFFFFF << RCC_PLL1CTRL2_PLL1CLKF_SHIFT) +#define RCC_PLL1CTRL2_PLL1CLKF_0 (1 << 0) /* Bit 0 */ +#define RCC_PLL1CTRL2_PLL1CLKF_1 (1 << 1) /* Bit 1 */ +#define RCC_PLL1CTRL2_PLL1CLKF_2 (1 << 2) /* Bit 2 */ +#define RCC_PLL1CTRL2_PLL1CLKF_3 (1 << 3) /* Bit 3 */ +#define RCC_PLL1CTRL2_PLL1CLKF_4 (1 << 4) /* Bit 4 */ +#define RCC_PLL1CTRL2_PLL1CLKF_5 (1 << 5) /* Bit 5 */ +#define RCC_PLL1CTRL2_PLL1CLKF_6 (1 << 6) /* Bit 6 */ +#define RCC_PLL1CTRL2_PLL1CLKF_7 (1 << 7) /* Bit 7 */ +#define RCC_PLL1CTRL2_PLL1CLKF_8 (1 << 8) /* Bit 8 */ +#define RCC_PLL1CTRL2_PLL1CLKF_9 (1 << 9) /* Bit 9 */ +#define RCC_PLL1CTRL2_PLL1CLKF_10 (1 << 10) /* Bit 10 */ +#define RCC_PLL1CTRL2_PLL1CLKF_11 (1 << 11) /* Bit 11 */ +#define RCC_PLL1CTRL2_PLL1CLKF_12 (1 << 12) /* Bit 12 */ +#define RCC_PLL1CTRL2_PLL1CLKF_13 (1 << 13) /* Bit 13 */ +#define RCC_PLL1CTRL2_PLL1CLKF_14 (1 << 14) /* Bit 14 */ +#define RCC_PLL1CTRL2_PLL1CLKF_15 (1 << 15) /* Bit 15 */ +#define RCC_PLL1CTRL2_PLL1CLKF_16 (1 << 16) /* Bit 16 */ +#define RCC_PLL1CTRL2_PLL1CLKF_17 (1 << 17) /* Bit 17 */ +#define RCC_PLL1CTRL2_PLL1CLKF_18 (1 << 18) /* Bit 18 */ +#define RCC_PLL1CTRL2_PLL1CLKF_19 (1 << 19) /* Bit 19 */ +#define RCC_PLL1CTRL2_PLL1CLKF_20 (1 << 20) /* Bit 20 */ +#define RCC_PLL1CTRL2_PLL1CLKF_21 (1 << 21) /* Bit 21 */ +#define RCC_PLL1CTRL2_PLL1CLKF_22 (1 << 22) /* Bit 22 */ +#define RCC_PLL1CTRL2_PLL1CLKF_23 (1 << 23) /* Bit 23 */ +#define RCC_PLL1CTRL2_PLL1CLKF_24 (1 << 24) /* Bit 24 */ +#define RCC_PLL1CTRL2_PLL1CLKF_25 (1 << 25) /* Bit 25 */ + +#define RCC_PLL1CTRL2_PLL1CLKF(n) ((n) << RCC_PLL1CTRL2_PLL1CLKF_SHIFT) + +/* Bit definition for RCC_PLL2CTRL1 register ********************************/ +#define RCC_PLL2CTRL1_PLL2SRC_SHIFT (28) /* Bits 28-29: PLL2 clock source selection */ +#define RCC_PLL2CTRL1_PLL2SRC_MASK (0x3 << RCC_PLL2CTRL1_PLL2SRC_SHIFT) +#define RCC_PLL2CTRL1_PLL2SRC_0 (1 << 28) /* Bit 28 */ +#define RCC_PLL2CTRL1_PLL2SRC_1 (1 << 29) /* Bit 29 */ + +#define RCC_PLL2CTRL1_PLL2SRC_HSI (0x0 << RCC_PLL2CTRL1_PLL2SRC_SHIFT) /* HSI Clock is the PLL source clock */ +#define RCC_PLL2CTRL1_PLL2SRC_NONE (0x1 << RCC_PLL2CTRL1_PLL2SRC_SHIFT) /* No clock */ +#define RCC_PLL2CTRL1_PLL2SRC_MSI (0x2 << RCC_PLL2CTRL1_PLL2SRC_SHIFT) /* MSI Clock is the PLL source clock */ +#define RCC_PLL2CTRL1_PLL2SRC_HSE (0x3 << RCC_PLL2CTRL1_PLL2SRC_SHIFT) /* HSE Clock is the PLL source clock */ + +#define RCC_PLL2CTRL1_PLL2PHLK (1 << 20) /* Bit 20: PLL2 PH lock */ +#define RCC_PLL2CTRL1_PLL2LDOEN (1 << 19) /* Bit 19: PLL2 LDO enable */ +#define RCC_PLL2CTRL1_PLL2EN (1 << 18) /* Bit 18: PLL2 enable */ +#define RCC_PLL2CTRL1_PLL2RST (1 << 17) /* Bit 17: PLL2 reset */ +#define RCC_PLL2CTRL1_PLL2PD (1 << 16) /* Bit 16: PLL2 power down */ + +#define RCC_PLL2CTRL1_PLL2BWAJ_SHIFT (0) /* Bits 0-11: PLL2 BWAJ value */ +#define RCC_PLL2CTRL1_PLL2BWAJ_MASK (0xFFF << RCC_PLL2CTRL1_PLL2BWAJ_SHIFT) +#define RCC_PLL2CTRL1_PLL2BWAJ_0 (1 << 0) /* Bit 0 */ +#define RCC_PLL2CTRL1_PLL2BWAJ_1 (1 << 1) /* Bit 1 */ +#define RCC_PLL2CTRL1_PLL2BWAJ_2 (1 << 2) /* Bit 2 */ +#define RCC_PLL2CTRL1_PLL2BWAJ_3 (1 << 3) /* Bit 3 */ +#define RCC_PLL2CTRL1_PLL2BWAJ_4 (1 << 4) /* Bit 4 */ +#define RCC_PLL2CTRL1_PLL2BWAJ_5 (1 << 5) /* Bit 5 */ +#define RCC_PLL2CTRL1_PLL2BWAJ_6 (1 << 6) /* Bit 6 */ +#define RCC_PLL2CTRL1_PLL2BWAJ_7 (1 << 7) /* Bit 7 */ +#define RCC_PLL2CTRL1_PLL2BWAJ_8 (1 << 8) /* Bit 8 */ +#define RCC_PLL2CTRL1_PLL2BWAJ_9 (1 << 9) /* Bit 9 */ +#define RCC_PLL2CTRL1_PLL2BWAJ_10 (1 << 10) /* Bit 10 */ +#define RCC_PLL2CTRL1_PLL2BWAJ_11 (1 << 11) /* Bit 11 */ + +#define RCC_PLL2CTRL1_PLL2BWAJ(n) ((n) << RCC_PLL2CTRL1_PLL2BWAJ_SHIFT) + +/* Bit definition for RCC_PLL2CTRL2 register ********************************/ +#define RCC_PLL2CTRL2_PLL2CLKR_SHIFT (26) /* Bits 26-31: PLL2 clock R divider */ +#define RCC_PLL2CTRL2_PLL2CLKR_MASK (0x3F << RCC_PLL2CTRL2_PLL2CLKR_SHIFT) +#define RCC_PLL2CTRL2_PLL2CLKR_0 (1 << 26) /* Bit 26 */ +#define RCC_PLL2CTRL2_PLL2CLKR_1 (1 << 27) /* Bit 27 */ +#define RCC_PLL2CTRL2_PLL2CLKR_2 (1 << 28) /* Bit 28 */ +#define RCC_PLL2CTRL2_PLL2CLKR_3 (1 << 29) /* Bit 29 */ +#define RCC_PLL2CTRL2_PLL2CLKR_4 (1 << 30) /* Bit 30 */ +#define RCC_PLL2CTRL2_PLL2CLKR_5 (1 << 31) /* Bit 31 */ + +#define RCC_PLL2CTRL2_PLL2CLKR(n) ((n) << RCC_PLL2CTRL2_PLL2CLKR_SHIFT) + +#define RCC_PLL2CTRL2_PLL2CLKF_SHIFT (0) /* Bits 0-25: PLL2 clock F multiplier */ +#define RCC_PLL2CTRL2_PLL2CLKF_MASK (0x3FFFFFF << RCC_PLL2CTRL2_PLL2CLKF_SHIFT) +#define RCC_PLL2CTRL2_PLL2CLKF_0 (1 << 0) /* Bit 0 */ +#define RCC_PLL2CTRL2_PLL2CLKF_1 (1 << 1) /* Bit 1 */ +#define RCC_PLL2CTRL2_PLL2CLKF_2 (1 << 2) /* Bit 2 */ +#define RCC_PLL2CTRL2_PLL2CLKF_3 (1 << 3) /* Bit 3 */ +#define RCC_PLL2CTRL2_PLL2CLKF_4 (1 << 4) /* Bit 4 */ +#define RCC_PLL2CTRL2_PLL2CLKF_5 (1 << 5) /* Bit 5 */ +#define RCC_PLL2CTRL2_PLL2CLKF_6 (1 << 6) /* Bit 6 */ +#define RCC_PLL2CTRL2_PLL2CLKF_7 (1 << 7) /* Bit 7 */ +#define RCC_PLL2CTRL2_PLL2CLKF_8 (1 << 8) /* Bit 8 */ +#define RCC_PLL2CTRL2_PLL2CLKF_9 (1 << 9) /* Bit 9 */ +#define RCC_PLL2CTRL2_PLL2CLKF_10 (1 << 10) /* Bit 10 */ +#define RCC_PLL2CTRL2_PLL2CLKF_11 (1 << 11) /* Bit 11 */ +#define RCC_PLL2CTRL2_PLL2CLKF_12 (1 << 12) /* Bit 12 */ +#define RCC_PLL2CTRL2_PLL2CLKF_13 (1 << 13) /* Bit 13 */ +#define RCC_PLL2CTRL2_PLL2CLKF_14 (1 << 14) /* Bit 14 */ +#define RCC_PLL2CTRL2_PLL2CLKF_15 (1 << 15) /* Bit 15 */ +#define RCC_PLL2CTRL2_PLL2CLKF_16 (1 << 16) /* Bit 16 */ +#define RCC_PLL2CTRL2_PLL2CLKF_17 (1 << 17) /* Bit 17 */ +#define RCC_PLL2CTRL2_PLL2CLKF_18 (1 << 18) /* Bit 18 */ +#define RCC_PLL2CTRL2_PLL2CLKF_19 (1 << 19) /* Bit 19 */ +#define RCC_PLL2CTRL2_PLL2CLKF_20 (1 << 20) /* Bit 20 */ +#define RCC_PLL2CTRL2_PLL2CLKF_21 (1 << 21) /* Bit 21 */ +#define RCC_PLL2CTRL2_PLL2CLKF_22 (1 << 22) /* Bit 22 */ +#define RCC_PLL2CTRL2_PLL2CLKF_23 (1 << 23) /* Bit 23 */ +#define RCC_PLL2CTRL2_PLL2CLKF_24 (1 << 24) /* Bit 24 */ +#define RCC_PLL2CTRL2_PLL2CLKF_25 (1 << 25) /* Bit 25 */ + +#define RCC_PLL2CTRL2_PLL2CLKF(n) ((n) << RCC_PLL2CTRL2_PLL2CLKF_SHIFT) + +/* Bit definition for RCC_PLL3CTRL1 register ********************************/ +#define RCC_PLL3CTRL1_PLL3SRC_SHIFT (28) /* Bits 28-29: PLL3 clock source selection */ +#define RCC_PLL3CTRL1_PLL3SRC_MASK (0x3 << RCC_PLL3CTRL1_PLL3SRC_SHIFT) +#define RCC_PLL3CTRL1_PLL3SRC_0 (1 << 28) /* Bit 28 */ +#define RCC_PLL3CTRL1_PLL3SRC_1 (1 << 29) /* Bit 29 */ + +#define RCC_PLL3CTRL1_PLL3SRC_HSI (0x0 << RCC_PLL3CTRL1_PLL3SRC_SHIFT) /* HSI Clock is the PLL source clock */ +#define RCC_PLL3CTRL1_PLL3SRC_NONE (0x1 << RCC_PLL3CTRL1_PLL3SRC_SHIFT) /* No clock */ +#define RCC_PLL3CTRL1_PLL3SRC_MSI (0x2 << RCC_PLL3CTRL1_PLL3SRC_SHIFT) /* MSI Clock is the PLL source clock */ +#define RCC_PLL3CTRL1_PLL3SRC_HSE (0x3 << RCC_PLL3CTRL1_PLL3SRC_SHIFT) /* HSE Clock is the PLL source clock */ + +#define RCC_PLL3CTRL1_PLL3PHLK (1 << 20) /* Bit 20: PLL3 PH lock */ +#define RCC_PLL3CTRL1_PLL3LDOEN (1 << 19) /* Bit 19: PLL3 LDO enable */ +#define RCC_PLL3CTRL1_PLL3EN (1 << 18) /* Bit 18: PLL3 enable */ +#define RCC_PLL3CTRL1_PLL3RST (1 << 17) /* Bit 17: PLL3 reset */ +#define RCC_PLL3CTRL1_PLL3PD (1 << 16) /* Bit 16: PLL3 power down */ + +#define RCC_PLL3CTRL1_PLL3BWAJ_SHIFT (0) /* Bits 0-11: PLL3 BWAJ value */ +#define RCC_PLL3CTRL1_PLL3BWAJ_MASK (0xFFF << RCC_PLL3CTRL1_PLL3BWAJ_SHIFT) +#define RCC_PLL3CTRL1_PLL3BWAJ_0 (1 << 0) /* Bit 0 */ +#define RCC_PLL3CTRL1_PLL3BWAJ_1 (1 << 1) /* Bit 1 */ +#define RCC_PLL3CTRL1_PLL3BWAJ_2 (1 << 2) /* Bit 2 */ +#define RCC_PLL3CTRL1_PLL3BWAJ_3 (1 << 3) /* Bit 3 */ +#define RCC_PLL3CTRL1_PLL3BWAJ_4 (1 << 4) /* Bit 4 */ +#define RCC_PLL3CTRL1_PLL3BWAJ_5 (1 << 5) /* Bit 5 */ +#define RCC_PLL3CTRL1_PLL3BWAJ_6 (1 << 6) /* Bit 6 */ +#define RCC_PLL3CTRL1_PLL3BWAJ_7 (1 << 7) /* Bit 7 */ +#define RCC_PLL3CTRL1_PLL3BWAJ_8 (1 << 8) /* Bit 8 */ +#define RCC_PLL3CTRL1_PLL3BWAJ_9 (1 << 9) /* Bit 9 */ +#define RCC_PLL3CTRL1_PLL3BWAJ_10 (1 << 10) /* Bit 10 */ +#define RCC_PLL3CTRL1_PLL3BWAJ_11 (1 << 11) /* Bit 11 */ + +#define RCC_PLL3CTRL1_PLL3BWAJ(n) ((n) << RCC_PLL3CTRL1_PLL3BWAJ_SHIFT) + +/* Bit definition for RCC_PLL3CTRL2 register ********************************/ +#define RCC_PLL3CTRL2_PLL3CLKR_SHIFT (26) /* Bits 26-31: PLL3 clock R divider */ +#define RCC_PLL3CTRL2_PLL3CLKR_MASK (0x3F << RCC_PLL3CTRL2_PLL3CLKR_SHIFT) +#define RCC_PLL3CTRL2_PLL3CLKR_0 (1 << 26) /* Bit 26 */ +#define RCC_PLL3CTRL2_PLL3CLKR_1 (1 << 27) /* Bit 27 */ +#define RCC_PLL3CTRL2_PLL3CLKR_2 (1 << 28) /* Bit 28 */ +#define RCC_PLL3CTRL2_PLL3CLKR_3 (1 << 29) /* Bit 29 */ +#define RCC_PLL3CTRL2_PLL3CLKR_4 (1 << 30) /* Bit 30 */ +#define RCC_PLL3CTRL2_PLL3CLKR_5 (1 << 31) /* Bit 31 */ + +#define RCC_PLL3CTRL2_PLL3CLKR(n) ((n) << RCC_PLL3CTRL2_PLL3CLKR_SHIFT) + +#define RCC_PLL3CTRL2_PLL3CLKF_SHIFT (0) /* Bits 0-25: PLL3 clock F multiplier */ +#define RCC_PLL3CTRL2_PLL3CLKF_MASK (0x3FFFFFF << RCC_PLL3CTRL2_PLL3CLKF_SHIFT) +#define RCC_PLL3CTRL2_PLL3CLKF_0 (1 << 0) /* Bit 0 */ +#define RCC_PLL3CTRL2_PLL3CLKF_1 (1 << 1) /* Bit 1 */ +#define RCC_PLL3CTRL2_PLL3CLKF_2 (1 << 2) /* Bit 2 */ +#define RCC_PLL3CTRL2_PLL3CLKF_3 (1 << 3) /* Bit 3 */ +#define RCC_PLL3CTRL2_PLL3CLKF_4 (1 << 4) /* Bit 4 */ +#define RCC_PLL3CTRL2_PLL3CLKF_5 (1 << 5) /* Bit 5 */ +#define RCC_PLL3CTRL2_PLL3CLKF_6 (1 << 6) /* Bit 6 */ +#define RCC_PLL3CTRL2_PLL3CLKF_7 (1 << 7) /* Bit 7 */ +#define RCC_PLL3CTRL2_PLL3CLKF_8 (1 << 8) /* Bit 8 */ +#define RCC_PLL3CTRL2_PLL3CLKF_9 (1 << 9) /* Bit 9 */ +#define RCC_PLL3CTRL2_PLL3CLKF_10 (1 << 10) /* Bit 10 */ +#define RCC_PLL3CTRL2_PLL3CLKF_11 (1 << 11) /* Bit 11 */ +#define RCC_PLL3CTRL2_PLL3CLKF_12 (1 << 12) /* Bit 12 */ +#define RCC_PLL3CTRL2_PLL3CLKF_13 (1 << 13) /* Bit 13 */ +#define RCC_PLL3CTRL2_PLL3CLKF_14 (1 << 14) /* Bit 14 */ +#define RCC_PLL3CTRL2_PLL3CLKF_15 (1 << 15) /* Bit 15 */ +#define RCC_PLL3CTRL2_PLL3CLKF_16 (1 << 16) /* Bit 16 */ +#define RCC_PLL3CTRL2_PLL3CLKF_17 (1 << 17) /* Bit 17 */ +#define RCC_PLL3CTRL2_PLL3CLKF_18 (1 << 18) /* Bit 18 */ +#define RCC_PLL3CTRL2_PLL3CLKF_19 (1 << 19) /* Bit 19 */ +#define RCC_PLL3CTRL2_PLL3CLKF_20 (1 << 20) /* Bit 20 */ +#define RCC_PLL3CTRL2_PLL3CLKF_21 (1 << 21) /* Bit 21 */ +#define RCC_PLL3CTRL2_PLL3CLKF_22 (1 << 22) /* Bit 22 */ +#define RCC_PLL3CTRL2_PLL3CLKF_23 (1 << 23) /* Bit 23 */ +#define RCC_PLL3CTRL2_PLL3CLKF_24 (1 << 24) /* Bit 24 */ +#define RCC_PLL3CTRL2_PLL3CLKF_25 (1 << 25) /* Bit 25 */ + +#define RCC_PLL3CTRL2_PLL3CLKF(n) ((n) << RCC_PLL3CTRL2_PLL3CLKF_SHIFT) + +/* Bit definition for RCC_SHRPLLCTRL1 register ******************************/ + +/* Bits 29:28 SHRPLL clock source selection */ +#define RCC_SHRPLLCTRL1_SHRPLLSRC_SHIFT (28) +#define RCC_SHRPLLCTRL1_SHRPLLSRC_MASK (0x3 << RCC_SHRPLLCTRL1_SHRPLLSRC_SHIFT) +#define RCC_SHRPLLCTRL1_SHRPLLSRC_0 (0x1 << 28) /* Bit 28 */ +#define RCC_SHRPLLCTRL1_SHRPLLSRC_1 (0x1 << 29) /* Bit 29 */ + +#define RCC_SHRPLLCTRL1_SHRPLLSRC_HSI (0x0 << RCC_SHRPLLCTRL1_SHRPLLSRC_SHIFT) /* HSI Clock is the PLL source clock */ +#define RCC_SHRPLLCTRL1_SHRPLLSRC_NONE (0x1 << RCC_SHRPLLCTRL1_SHRPLLSRC_SHIFT) /* No clock */ +#define RCC_SHRPLLCTRL1_SHRPLLSRC_MSI (0x2 << RCC_SHRPLLCTRL1_SHRPLLSRC_SHIFT) /* MSI Clock is the PLL source clock */ +#define RCC_SHRPLLCTRL1_SHRPLLSRC_HSE (0x3 << RCC_SHRPLLCTRL1_SHRPLLSRC_SHIFT) /* HSE Clock is the PLL source clock */ + +/* Bit 20 SHRPLL PH lock */ +#define RCC_SHRPLLCTRL1_SHRPLLPHLK (0x1 << 20) + +/* Bit 19 SHRPLL LDO enable */ +#define RCC_SHRPLLCTRL1_SHRPLLLDOEN (0x1 << 19) + +/* Bit 18 SHRPLL enable */ +#define RCC_SHRPLLCTRL1_SHRPLLEN (0x1 << 18) + +/* Bit 17 SHRPLL reset */ +#define RCC_SHRPLLCTRL1_SHRPLLRST (0x1 << 17) + +/* Bit 16 SHRPLL power down */ +#define RCC_SHRPLLCTRL1_SHRPLLPD (0x1 << 16) + +/* Bits 11:0 SHRPLL bandwidth adjustment */ +#define RCC_SHRPLLCTRL1_SHRPLLBWAJ_SHIFT (0) +#define RCC_SHRPLLCTRL1_SHRPLLBWAJ_MASK (0xFFF << RCC_SHRPLLCTRL1_SHRPLLBWAJ_SHIFT) +#define RCC_SHRPLLCTRL1_SHRPLLBWAJ_0 (0x1 << 0) +#define RCC_SHRPLLCTRL1_SHRPLLBWAJ_1 (0x1 << 1) +#define RCC_SHRPLLCTRL1_SHRPLLBWAJ_2 (0x1 << 2) +#define RCC_SHRPLLCTRL1_SHRPLLBWAJ_3 (0x1 << 3) +#define RCC_SHRPLLCTRL1_SHRPLLBWAJ_4 (0x1 << 4) +#define RCC_SHRPLLCTRL1_SHRPLLBWAJ_5 (0x1 << 5) +#define RCC_SHRPLLCTRL1_SHRPLLBWAJ_6 (0x1 << 6) +#define RCC_SHRPLLCTRL1_SHRPLLBWAJ_7 (0x1 << 7) +#define RCC_SHRPLLCTRL1_SHRPLLBWAJ_8 (0x1 << 8) +#define RCC_SHRPLLCTRL1_SHRPLLBWAJ_9 (0x1 << 9) +#define RCC_SHRPLLCTRL1_SHRPLLBWAJ_10 (0x1 << 10) +#define RCC_SHRPLLCTRL1_SHRPLLBWAJ_11 (0x1 << 11) + +#define RCC_SHRPLLCTRL1_SHRPLLBWAJ(n) ((n) << RCC_SHRPLLCTRL1_SHRPLLBWAJ_SHIFT) + +/* Bit definition for RCC_SHRPLLCTRL2 register ******************************/ + +/* Bits 31:26 SHRPLL clock R divider */ +#define RCC_SHRPLLCTRL2_SHRPLLCLKR_SHIFT (26) +#define RCC_SHRPLLCTRL2_SHRPLLCLKR_MASK (0x3F << RCC_SHRPLLCTRL2_SHRPLLCLKR_SHIFT) +#define RCC_SHRPLLCTRL2_SHRPLLCLKR_0 (0x1 << 26) +#define RCC_SHRPLLCTRL2_SHRPLLCLKR_1 (0x1 << 27) +#define RCC_SHRPLLCTRL2_SHRPLLCLKR_2 (0x1 << 28) +#define RCC_SHRPLLCTRL2_SHRPLLCLKR_3 (0x1 << 29) +#define RCC_SHRPLLCTRL2_SHRPLLCLKR_4 (0x1 << 30) +#define RCC_SHRPLLCTRL2_SHRPLLCLKR_5 (0x1 << 31) + +#define RCC_SHRPLLCTRL2_SHRPLLCLKR(n) ((n) << RCC_SHRPLLCTRL2_SHRPLLCLKR_SHIFT) + +/* Bits 25:0 SHRPLL clock F multiplier */ +#define RCC_SHRPLLCTRL2_SHRPLLCLKF_SHIFT (0) +#define RCC_SHRPLLCTRL2_SHRPLLCLKF_MASK (0x3FFFFFF << RCC_SHRPLLCTRL2_SHRPLLCLKF_SHIFT) +#define RCC_SHRPLLCTRL2_SHRPLLCLKF_0 (0x1 << 0) +#define RCC_SHRPLLCTRL2_SHRPLLCLKF_1 (0x1 << 1) +#define RCC_SHRPLLCTRL2_SHRPLLCLKF_2 (0x1 << 2) +#define RCC_SHRPLLCTRL2_SHRPLLCLKF_3 (0x1 << 3) +#define RCC_SHRPLLCTRL2_SHRPLLCLKF_4 (0x1 << 4) +#define RCC_SHRPLLCTRL2_SHRPLLCLKF_5 (0x1 << 5) +#define RCC_SHRPLLCTRL2_SHRPLLCLKF_6 (0x1 << 6) +#define RCC_SHRPLLCTRL2_SHRPLLCLKF_7 (0x1 << 7) +#define RCC_SHRPLLCTRL2_SHRPLLCLKF_8 (0x1 << 8) +#define RCC_SHRPLLCTRL2_SHRPLLCLKF_9 (0x1 << 9) +#define RCC_SHRPLLCTRL2_SHRPLLCLKF_10 (0x1 << 10) +#define RCC_SHRPLLCTRL2_SHRPLLCLKF_11 (0x1 << 11) +#define RCC_SHRPLLCTRL2_SHRPLLCLKF_12 (0x1 << 12) +#define RCC_SHRPLLCTRL2_SHRPLLCLKF_13 (0x1 << 13) +#define RCC_SHRPLLCTRL2_SHRPLLCLKF_14 (0x1 << 14) +#define RCC_SHRPLLCTRL2_SHRPLLCLKF_15 (0x1 << 15) +#define RCC_SHRPLLCTRL2_SHRPLLCLKF_16 (0x1 << 16) +#define RCC_SHRPLLCTRL2_SHRPLLCLKF_17 (0x1 << 17) +#define RCC_SHRPLLCTRL2_SHRPLLCLKF_18 (0x1 << 18) +#define RCC_SHRPLLCTRL2_SHRPLLCLKF_19 (0x1 << 19) +#define RCC_SHRPLLCTRL2_SHRPLLCLKF_20 (0x1 << 20) +#define RCC_SHRPLLCTRL2_SHRPLLCLKF_21 (0x1 << 21) +#define RCC_SHRPLLCTRL2_SHRPLLCLKF_22 (0x1 << 22) +#define RCC_SHRPLLCTRL2_SHRPLLCLKF_23 (0x1 << 23) +#define RCC_SHRPLLCTRL2_SHRPLLCLKF_24 (0x1 << 24) +#define RCC_SHRPLLCTRL2_SHRPLLCLKF_25 (0x1 << 25) + +#define RCC_SHRPLLCTRL2_SHRPLLCLKF(n) ((n) << RCC_SHRPLLCTRL2_SHRPLLCLKF_SHIFT) + +/* Bit definition for RCC_SRCCTRL1 register *********************************/ +#define RCC_SRCCTRL1_AFEMSIRDF (1 << 31) /* Bit 31: AFE MSI ready flag */ +#define RCC_SRCCTRL1_AFEHSIRDF (1 << 30) /* Bit 30: AFE HSI ready flag */ + +#define RCC_SRCCTRL1_SCLKSTS_SHIFT (26) /* Bits 26-27: System clock status */ +#define RCC_SRCCTRL1_SCLKSTS_MASK (0x3 << RCC_SRCCTRL1_SCLKSTS_SHIFT) +#define RCC_SRCCTRL1_SCLKSTS_HSI (0x0 << RCC_SRCCTRL1_SCLKSTS_SHIFT) +#define RCC_SRCCTRL1_SCLKSTS_MSI (0x1 << RCC_SRCCTRL1_SCLKSTS_SHIFT) +#define RCC_SRCCTRL1_SCLKSTS_HSE (0x2 << RCC_SRCCTRL1_SCLKSTS_SHIFT) +#define RCC_SRCCTRL1_SCLKSTS_PLL1A (0x3 << RCC_SRCCTRL1_SCLKSTS_SHIFT) + +#define RCC_SRCCTRL1_SCLKSW_SHIFT (24) /* Bits 24-25: System clock switch */ +#define RCC_SRCCTRL1_SCLKSW_MASK (0x3 << RCC_SRCCTRL1_SCLKSW_SHIFT) +#define RCC_SRCCTRL1_SCLKSW_HSI (0x0 << RCC_SRCCTRL1_SCLKSW_SHIFT) +#define RCC_SRCCTRL1_SCLKSW_MSI (0x1 << RCC_SRCCTRL1_SCLKSW_SHIFT) +#define RCC_SRCCTRL1_SCLKSW_HSE (0x2 << RCC_SRCCTRL1_SCLKSW_SHIFT) +#define RCC_SRCCTRL1_SCLKSW_PLL1A (0x3 << RCC_SRCCTRL1_SCLKSW_SHIFT) + +#define RCC_SRCCTRL1_HSERDCNTEN (1 << 8) /* Bit 8: HSE ready counter enable */ +#define RCC_SRCCTRL1_MSIRDF (1 << 7) /* Bit 7: MSI ready flag */ +#define RCC_SRCCTRL1_MSIEN (1 << 6) /* Bit 6: MSI enable */ +#define RCC_SRCCTRL1_HSECSSEN (1 << 5) /* Bit 5: HSE clock security system enable */ +#define RCC_SRCCTRL1_HSEBP (1 << 4) /* Bit 4: HSE bypass */ +#define RCC_SRCCTRL1_HSERDF (1 << 3) /* Bit 3: HSE ready flag */ +#define RCC_SRCCTRL1_HSEEN (1 << 2) /* Bit 2: HSE enable */ +#define RCC_SRCCTRL1_HSIRDF (1 << 1) /* Bit 1: HSI ready flag */ +#define RCC_SRCCTRL1_HSIEN (1 << 0) /* Bit 0: HSI enable */ + +/* Bit definition for RCC_SRCCTRL2 register *********************************/ +#define RCC_SRCCTRL2_BORF (0x1 << 30) /* Bit 30: Brown-out reset flag */ +#define RCC_SRCCTRL2_HSICALEF (0x1 << 29) /* Bit 29: HSI calibration error flag */ +#define RCC_SRCCTRL2_MSICALEF (0x1 << 28) /* Bit 28: MSI calibration error flag */ + +#define RCC_SRCCTRL2_M7HYPSEL_SHIFT (17) +#define RCC_SRCCTRL2_M7HYPSEL_MASK (0x1 << RCC_SRCCTRL2_M7HYPSEL_SHIFT) /* Bit 17: M7 hypervisor clock source selection */ +#define RCC_SRCCTRL2_M7HYPSEL_PLL1A (0x0 << RCC_SRCCTRL2_M7HYPSEL_SHIFT) /* Use PLL1A as M7 hypervisor clock source */ +#define RCC_SRCCTRL2_M7HYPSEL_PLL2A (0x1 << RCC_SRCCTRL2_M7HYPSEL_SHIFT) /* Use PLL2A as M7 hypervisor clock source */ + +#define RCC_SRCCTRL2_AXIHYPSEL_SHIFT (16) +#define RCC_SRCCTRL2_AXIHYPSEL_MASK (0x1 << RCC_SRCCTRL2_AXIHYPSEL_SHIFT) /* Bit 16: AXI hypervisor clock source selection */ +#define RCC_SRCCTRL2_AXIHYPSEL_PLL1A (0x0 << RCC_SRCCTRL2_AXIHYPSEL_SHIFT) /* Use PLL1A as AXI hypervisor clock source */ +#define RCC_SRCCTRL2_AXIHYPSEL_PLL2A (0x1 << RCC_SRCCTRL2_AXIHYPSEL_SHIFT) /* Use PLL2A as AXI hypervisor clock source */ + +/* Bits 12:8 MSI calibration value */ +#define RCC_SRCCTRL2_MSICAL_SHIFT (8) +#define RCC_SRCCTRL2_MSICAL_MASK (0x1F << RCC_SRCCTRL2_MSICAL_SHIFT) +#define RCC_SRCCTRL2_MSICAL_0 (0x1 << (RCC_SRCCTRL2_MSICAL_SHIFT + 0)) /* Bit 8 */ +#define RCC_SRCCTRL2_MSICAL_1 (0x1 << (RCC_SRCCTRL2_MSICAL_SHIFT + 1)) /* Bit 9 */ +#define RCC_SRCCTRL2_MSICAL_2 (0x1 << (RCC_SRCCTRL2_MSICAL_SHIFT + 2)) /* Bit 10 */ +#define RCC_SRCCTRL2_MSICAL_3 (0x1 << (RCC_SRCCTRL2_MSICAL_SHIFT + 3)) /* Bit 11 */ +#define RCC_SRCCTRL2_MSICAL_4 (0x1 << (RCC_SRCCTRL2_MSICAL_SHIFT + 4)) /* Bit 12 */ + +/* Bits 4:0 MSI trim value */ +#define RCC_SRCCTRL2_MSITRIM_SHIFT (0) +#define RCC_SRCCTRL2_MSITRIM_MASK (0x1F << RCC_SRCCTRL2_MSITRIM_SHIFT) +#define RCC_SRCCTRL2_MSITRIM_0 (0x1 << (RCC_SRCCTRL2_MSITRIM_SHIFT + 0)) /* Bit 0 */ +#define RCC_SRCCTRL2_MSITRIM_1 (0x1 << (RCC_SRCCTRL2_MSITRIM_SHIFT + 1)) /* Bit 1 */ +#define RCC_SRCCTRL2_MSITRIM_2 (0x1 << (RCC_SRCCTRL2_MSITRIM_SHIFT + 2)) /* Bit 2 */ +#define RCC_SRCCTRL2_MSITRIM_3 (0x1 << (RCC_SRCCTRL2_MSITRIM_SHIFT + 3)) /* Bit 3 */ +#define RCC_SRCCTRL2_MSITRIM_4 (0x1 << (RCC_SRCCTRL2_MSITRIM_SHIFT + 4)) /* Bit 4 */ + +/* Bit definition for RCC_SRCCTRL3 register *********************************/ + +/* Bits 24:16 HSI calibration value */ +#define RCC_SRCCTRL3_HSICAL_SHIFT (16) +#define RCC_SRCCTRL3_HSICAL_MASK (0x1FF << RCC_SRCCTRL3_HSICAL_SHIFT) +#define RCC_SRCCTRL3_HSICAL_0 (0x1 << (RCC_SRCCTRL3_HSICAL_SHIFT + 0)) /* Bit 16 */ +#define RCC_SRCCTRL3_HSICAL_1 (0x1 << (RCC_SRCCTRL3_HSICAL_SHIFT + 1)) /* Bit 17 */ +#define RCC_SRCCTRL3_HSICAL_2 (0x1 << (RCC_SRCCTRL3_HSICAL_SHIFT + 2)) /* Bit 18 */ +#define RCC_SRCCTRL3_HSICAL_3 (0x1 << (RCC_SRCCTRL3_HSICAL_SHIFT + 3)) /* Bit 19 */ +#define RCC_SRCCTRL3_HSICAL_4 (0x1 << (RCC_SRCCTRL3_HSICAL_SHIFT + 4)) /* Bit 20 */ +#define RCC_SRCCTRL3_HSICAL_5 (0x1 << (RCC_SRCCTRL3_HSICAL_SHIFT + 5)) /* Bit 21 */ +#define RCC_SRCCTRL3_HSICAL_6 (0x1 << (RCC_SRCCTRL3_HSICAL_SHIFT + 6)) /* Bit 22 */ +#define RCC_SRCCTRL3_HSICAL_7 (0x1 << (RCC_SRCCTRL3_HSICAL_SHIFT + 7)) /* Bit 23 */ +#define RCC_SRCCTRL3_HSICAL_8 (0x1 << (RCC_SRCCTRL3_HSICAL_SHIFT + 8)) /* Bit 24 */ + +/* Bits 8:0 HSI trim value */ +#define RCC_SRCCTRL3_HSITRIM_SHIFT (0) +#define RCC_SRCCTRL3_HSITRIM_MASK (0x1FF << RCC_SRCCTRL3_HSITRIM_SHIFT) +#define RCC_SRCCTRL3_HSITRIM_0 (0x1 << (RCC_SRCCTRL3_HSITRIM_SHIFT + 0)) /* Bit 0 */ +#define RCC_SRCCTRL3_HSITRIM_1 (0x1 << (RCC_SRCCTRL3_HSITRIM_SHIFT + 1)) /* Bit 1 */ +#define RCC_SRCCTRL3_HSITRIM_2 (0x1 << (RCC_SRCCTRL3_HSITRIM_SHIFT + 2)) /* Bit 2 */ +#define RCC_SRCCTRL3_HSITRIM_3 (0x1 << (RCC_SRCCTRL3_HSITRIM_SHIFT + 3)) /* Bit 3 */ +#define RCC_SRCCTRL3_HSITRIM_4 (0x1 << (RCC_SRCCTRL3_HSITRIM_SHIFT + 4)) /* Bit 4 */ +#define RCC_SRCCTRL3_HSITRIM_5 (0x1 << (RCC_SRCCTRL3_HSITRIM_SHIFT + 5)) /* Bit 5 */ +#define RCC_SRCCTRL3_HSITRIM_6 (0x1 << (RCC_SRCCTRL3_HSITRIM_SHIFT + 6)) /* Bit 6 */ +#define RCC_SRCCTRL3_HSITRIM_7 (0x1 << (RCC_SRCCTRL3_HSITRIM_SHIFT + 7)) /* Bit 7 */ +#define RCC_SRCCTRL3_HSITRIM_8 (0x1 << (RCC_SRCCTRL3_HSITRIM_SHIFT + 8)) /* Bit 8 */ + +/* Bit definition for RCC_PLL1DIV register **********************************/ + +/* Bit[21:16] PLL1CDIV */ +#define RCC_PLL1DIV_PLL1CDIV_SHIFT (16) +#define RCC_PLL1DIV_PLL1CDIV_MASK (0x3F << RCC_PLL1DIV_PLL1CDIV_SHIFT) +#define RCC_PLL1DIV_PLL1CDIV_0 (0x1 << (RCC_PLL1DIV_PLL1CDIV_SHIFT + 0)) /* Bit16 */ + +/* Bit definition for RCC_HSECAL register ***********************************/ + +/* [31:18] Reserved */ + +/* [17] HSE Calibration Count Enable */ +#define RCC_PLL1DIV_PLL1CDIV_1 (0x1 << (RCC_PLL1DIV_PLL1CDIV_SHIFT + 1)) /* Bit17 */ +#define RCC_PLL1DIV_PLL1CDIV_2 (0x1 << (RCC_PLL1DIV_PLL1CDIV_SHIFT + 2)) /* Bit18 */ +#define RCC_PLL1DIV_PLL1CDIV_3 (0x1 << (RCC_PLL1DIV_PLL1CDIV_SHIFT + 3)) /* Bit19 */ +#define RCC_PLL1DIV_PLL1CDIV_4 (0x1 << (RCC_PLL1DIV_PLL1CDIV_SHIFT + 4)) /* Bit20 */ +#define RCC_PLL1DIV_PLL1CDIV_5 (0x1 << (RCC_PLL1DIV_PLL1CDIV_SHIFT + 5)) /* Bit21 */ + +#define RCC_PLL1DIV_PLL1CDIV_DIV(n) ((n) << RCC_PLL1DIV_PLL1CDIV_SHIFT) + +/* Bit[13:8] PLL1BDIV */ +#define RCC_PLL1DIV_PLL1BDIV_SHIFT (8) +#define RCC_PLL1DIV_PLL1BDIV_MASK (0x3F << RCC_PLL1DIV_PLL1BDIV_SHIFT) +#define RCC_PLL1DIV_PLL1BDIV_0 (0x1 << (RCC_PLL1DIV_PLL1BDIV_SHIFT + 0)) /* Bit8 */ +#define RCC_PLL1DIV_PLL1BDIV_1 (0x1 << (RCC_PLL1DIV_PLL1BDIV_SHIFT + 1)) /* Bit9 */ +#define RCC_PLL1DIV_PLL1BDIV_2 (0x1 << (RCC_PLL1DIV_PLL1BDIV_SHIFT + 2)) /* Bit10 */ +#define RCC_PLL1DIV_PLL1BDIV_3 (0x1 << (RCC_PLL1DIV_PLL1BDIV_SHIFT + 3)) /* Bit11 */ +#define RCC_PLL1DIV_PLL1BDIV_4 (0x1 << (RCC_PLL1DIV_PLL1BDIV_SHIFT + 4)) /* Bit12 */ +#define RCC_PLL1DIV_PLL1BDIV_5 (0x1 << (RCC_PLL1DIV_PLL1BDIV_SHIFT + 5)) /* Bit13 */ + +#define RCC_PLL1DIV_PLL1BDIV_DIV(n) ((n) << RCC_PLL1DIV_PLL1BDIV_SHIFT) + +/* Bit definition for RCC_PLL1DIV register **********************************/ + +/* Bit[5:0] PLL1ADIV */ +#define RCC_PLL1DIV_PLL1ADIV_SHIFT (0) +#define RCC_PLL1DIV_PLL1ADIV_MASK (0x3F << RCC_PLL1DIV_PLL1ADIV_SHIFT) +#define RCC_PLL1DIV_PLL1ADIV_0 (0x1 << (RCC_PLL1DIV_PLL1ADIV_SHIFT + 0)) /* Bit0 */ +#define RCC_PLL1DIV_PLL1ADIV_1 (0x1 << (RCC_PLL1DIV_PLL1ADIV_SHIFT + 1)) /* Bit1 */ +#define RCC_PLL1DIV_PLL1ADIV_2 (0x1 << (RCC_PLL1DIV_PLL1ADIV_SHIFT + 2)) /* Bit2 */ +#define RCC_PLL1DIV_PLL1ADIV_3 (0x1 << (RCC_PLL1DIV_PLL1ADIV_SHIFT + 3)) /* Bit3 */ +#define RCC_PLL1DIV_PLL1ADIV_4 (0x1 << (RCC_PLL1DIV_PLL1ADIV_SHIFT + 4)) /* Bit4 */ +#define RCC_PLL1DIV_PLL1ADIV_5 (0x1 << (RCC_PLL1DIV_PLL1ADIV_SHIFT + 5)) /* Bit5 */ + +#define RCC_PLL1DIV_PLL1ADIV_DIV(n) ((n) << RCC_PLL1DIV_PLL1ADIV_SHIFT) + +/* Bit definition for RCC_PLL2DIV register **********************************/ + +/* Bit[21:16] PLL2CDIV */ +#define RCC_PLL2DIV_PLL2CDIV_SHIFT (16) +#define RCC_PLL2DIV_PLL2CDIV_MASK (0x3F << RCC_PLL2DIV_PLL2CDIV_SHIFT) +#define RCC_PLL2DIV_PLL2CDIV_0 (0x1 << (RCC_PLL2DIV_PLL2CDIV_SHIFT + 0)) /* Bit16 */ +#define RCC_PLL2DIV_PLL2CDIV_1 (0x1 << (RCC_PLL2DIV_PLL2CDIV_SHIFT + 1)) /* Bit17 */ +#define RCC_PLL2DIV_PLL2CDIV_2 (0x1 << (RCC_PLL2DIV_PLL2CDIV_SHIFT + 2)) /* Bit18 */ +#define RCC_PLL2DIV_PLL2CDIV_3 (0x1 << (RCC_PLL2DIV_PLL2CDIV_SHIFT + 3)) /* Bit19 */ +#define RCC_PLL2DIV_PLL2CDIV_4 (0x1 << (RCC_PLL2DIV_PLL2CDIV_SHIFT + 4)) /* Bit20 */ +#define RCC_PLL2DIV_PLL2CDIV_5 (0x1 << (RCC_PLL2DIV_PLL2CDIV_SHIFT + 5)) /* Bit21 */ + +#define RCC_PLL2DIV_PLL2CDIV_DIV(n) ((n) << RCC_PLL2DIV_PLL2CDIV_SHIFT) + +/* Bit[13:8] PLL2BDIV */ +#define RCC_PLL2DIV_PLL2BDIV_SHIFT (8) +#define RCC_PLL2DIV_PLL2BDIV_MASK (0x3F << RCC_PLL2DIV_PLL2BDIV_SHIFT) +#define RCC_PLL2DIV_PLL2BDIV_0 (0x1 << (RCC_PLL2DIV_PLL2BDIV_SHIFT + 0)) /* Bit8 */ +#define RCC_PLL2DIV_PLL2BDIV_1 (0x1 << (RCC_PLL2DIV_PLL2BDIV_SHIFT + 1)) /* Bit9 */ +#define RCC_PLL2DIV_PLL2BDIV_2 (0x1 << (RCC_PLL2DIV_PLL2BDIV_SHIFT + 2)) /* Bit10 */ +#define RCC_PLL2DIV_PLL2BDIV_3 (0x1 << (RCC_PLL2DIV_PLL2BDIV_SHIFT + 3)) /* Bit11 */ +#define RCC_PLL2DIV_PLL2BDIV_4 (0x1 << (RCC_PLL2DIV_PLL2BDIV_SHIFT + 4)) /* Bit12 */ +#define RCC_PLL2DIV_PLL2BDIV_5 (0x1 << (RCC_PLL2DIV_PLL2BDIV_SHIFT + 5)) /* Bit13 */ + +#define RCC_PLL2DIV_PLL2BDIV_DIV(n) ((n) << RCC_PLL2DIV_PLL2BDIV_SHIFT) + +/* Bit definition for RCC_PLL2DIV register **********************************/ +#define RCC_PLL2DIV_PLL2ADIV_SHIFT (0) +#define RCC_PLL2DIV_PLL2ADIV_MASK (0x3F << RCC_PLL2DIV_PLL2ADIV_SHIFT) +#define RCC_PLL2DIV_PLL2ADIV_0 (0x1 << (RCC_PLL2DIV_PLL2ADIV_SHIFT + 0)) /* Bit0 */ +#define RCC_PLL2DIV_PLL2ADIV_1 (0x1 << (RCC_PLL2DIV_PLL2ADIV_SHIFT + 1)) /* Bit1 */ +#define RCC_PLL2DIV_PLL2ADIV_2 (0x1 << (RCC_PLL2DIV_PLL2ADIV_SHIFT + 2)) /* Bit2 */ +#define RCC_PLL2DIV_PLL2ADIV_3 (0x1 << (RCC_PLL2DIV_PLL2ADIV_SHIFT + 3)) /* Bit3 */ +#define RCC_PLL2DIV_PLL2ADIV_4 (0x1 << (RCC_PLL2DIV_PLL2ADIV_SHIFT + 4)) /* Bit4 */ +#define RCC_PLL2DIV_PLL2ADIV_5 (0x1 << (RCC_PLL2DIV_PLL2ADIV_SHIFT + 5)) /* Bit5 */ + +#define RCC_PLL2DIV_PLL2ADIV_DIV(n) ((n) << RCC_PLL2DIV_PLL2ADIV_SHIFT) + +/* Bit definition for RCC_PLL3DIV register **********************************/ + +/* Bit[21:16] PLL3CDIV */ +#define RCC_PLL3DIV_PLL3CDIV_SHIFT (16) +#define RCC_PLL3DIV_PLL3CDIV_MASK (0x3F << RCC_PLL3DIV_PLL3CDIV_SHIFT) +#define RCC_PLL3DIV_PLL3CDIV_0 (0x1 << (RCC_PLL3DIV_PLL3CDIV_SHIFT + 0)) /* Bit16 */ +#define RCC_PLL3DIV_PLL3CDIV_1 (0x1 << (RCC_PLL3DIV_PLL3CDIV_SHIFT + 1)) /* Bit17 */ +#define RCC_PLL3DIV_PLL3CDIV_2 (0x1 << (RCC_PLL3DIV_PLL3CDIV_SHIFT + 2)) /* Bit18 */ +#define RCC_PLL3DIV_PLL3CDIV_3 (0x1 << (RCC_PLL3DIV_PLL3CDIV_SHIFT + 3)) /* Bit19 */ +#define RCC_PLL3DIV_PLL3CDIV_4 (0x1 << (RCC_PLL3DIV_PLL3CDIV_SHIFT + 4)) /* Bit20 */ +#define RCC_PLL3DIV_PLL3CDIV_5 (0x1 << (RCC_PLL3DIV_PLL3CDIV_SHIFT + 5)) /* Bit21 */ + +#define RCC_PLL3DIV_PLL3CDIV_DIV(n) ((n) << RCC_PLL3DIV_PLL3CDIV_SHIFT) + +/* Bit[13:8] PLL3BDIV */ +#define RCC_PLL3DIV_PLL3BDIV_SHIFT (8) +#define RCC_PLL3DIV_PLL3BDIV_MASK (0x3F << RCC_PLL3DIV_PLL3BDIV_SHIFT) +#define RCC_PLL3DIV_PLL3BDIV_0 (0x1 << (RCC_PLL3DIV_PLL3BDIV_SHIFT + 0)) /* Bit8 */ +#define RCC_PLL3DIV_PLL3BDIV_1 (0x1 << (RCC_PLL3DIV_PLL3BDIV_SHIFT + 1)) /* Bit9 */ +#define RCC_PLL3DIV_PLL3BDIV_2 (0x1 << (RCC_PLL3DIV_PLL3BDIV_SHIFT + 2)) /* Bit10 */ +#define RCC_PLL3DIV_PLL3BDIV_3 (0x1 << (RCC_PLL3DIV_PLL3BDIV_SHIFT + 3)) /* Bit11 */ +#define RCC_PLL3DIV_PLL3BDIV_4 (0x1 << (RCC_PLL3DIV_PLL3BDIV_SHIFT + 4)) /* Bit12 */ +#define RCC_PLL3DIV_PLL3BDIV_5 (0x1 << (RCC_PLL3DIV_PLL3BDIV_SHIFT + 5)) /* Bit13 */ + +#define RCC_PLL3DIV_PLL3BDIV_DIV(n) ((n) << RCC_PLL3DIV_PLL3BDIV_SHIFT) + +/* Bit definition for RCC_PLL3DIV register **********************************/ +#define RCC_PLL3DIV_PLL3ADIV_SHIFT (0) +#define RCC_PLL3DIV_PLL3ADIV_MASK (0x3F << RCC_PLL3DIV_PLL3ADIV_SHIFT) +#define RCC_PLL3DIV_PLL3ADIV_0 (0x1 << (RCC_PLL3DIV_PLL3ADIV_SHIFT + 0)) /* Bit0 */ +#define RCC_PLL3DIV_PLL3ADIV_1 (0x1 << (RCC_PLL3DIV_PLL3ADIV_SHIFT + 1)) /* Bit1 */ +#define RCC_PLL3DIV_PLL3ADIV_2 (0x1 << (RCC_PLL3DIV_PLL3ADIV_SHIFT + 2)) /* Bit2 */ +#define RCC_PLL3DIV_PLL3ADIV_3 (0x1 << (RCC_PLL3DIV_PLL3ADIV_SHIFT + 3)) /* Bit3 */ +#define RCC_PLL3DIV_PLL3ADIV_4 (0x1 << (RCC_PLL3DIV_PLL3ADIV_SHIFT + 4)) /* Bit4 */ +#define RCC_PLL3DIV_PLL3ADIV_5 (0x1 << (RCC_PLL3DIV_PLL3ADIV_SHIFT + 5)) /* Bit5 */ + +#define RCC_PLL3DIV_PLL3ADIV_DIV(n) ((n) << RCC_PLL3DIV_PLL3ADIV_SHIFT) + +/* Bit definition for RCC_SYSBUSDIV1 register *******************************/ + +/* Bit[27:24] AXIHYPDIV */ +#define RCC_SYSBUSDIV1_AXIHYPDIV_SHIFT (24) +#define RCC_SYSBUSDIV1_AXIHYPDIV_MASK (0x0F << RCC_SYSBUSDIV1_AXIHYPDIV_SHIFT) +#define RCC_SYSBUSDIV1_AXIHYPDIV_0 (0x01 << RCC_SYSBUSDIV1_AXIHYPDIV_SHIFT) /* Bit24 */ +#define RCC_SYSBUSDIV1_AXIHYPDIV_1 (0x02 << RCC_SYSBUSDIV1_AXIHYPDIV_SHIFT) /* Bit25 */ +#define RCC_SYSBUSDIV1_AXIHYPDIV_2 (0x04 << RCC_SYSBUSDIV1_AXIHYPDIV_SHIFT) /* Bit26 */ +#define RCC_SYSBUSDIV1_AXIHYPDIV_3 (0x08 << RCC_SYSBUSDIV1_AXIHYPDIV_SHIFT) /* Bit27 */ +#define RCC_SYSBUSDIV1_AXIHYPDIV_DIV(n) \ + ( (n) == 1 ? 0x00000000U << 24 : \ + (n) == 2 ? 0x00000001U << 24 : \ + (n) == 4 ? 0x00000002U << 24 : \ + (n) == 8 ? 0x00000004U << 24 : \ + (n) == 16 ? 0x00000007U << 24 : \ + (n) == 32 ? 0x00000008U << 24 : \ + (n) == 64 ? 0x00000009U << 24 : \ + (n) == 128 ? 0x0000000AU << 24 : \ + (n) == 256 ? 0x0000000BU << 24 : \ + (n) == 512 ? 0x0000000CU << 24 : \ + 0x00000000U << 24 ) + +/* Bit[23:20] HSIDIV */ +#define RCC_SYSBUSDIV1_HSIDIV_SHIFT (20) +#define RCC_SYSBUSDIV1_HSIDIV_MASK (0x0F << RCC_SYSBUSDIV1_HSIDIV_SHIFT) +#define RCC_SYSBUSDIV1_HSIDIV_0 (0x01 << RCC_SYSBUSDIV1_HSIDIV_SHIFT) /* Bit20 */ +#define RCC_SYSBUSDIV1_HSIDIV_1 (0x02 << RCC_SYSBUSDIV1_HSIDIV_SHIFT) /* Bit21 */ +#define RCC_SYSBUSDIV1_HSIDIV_2 (0x04 << RCC_SYSBUSDIV1_HSIDIV_SHIFT) /* Bit22 */ +#define RCC_SYSBUSDIV1_HSIDIV_3 (0x08 << RCC_SYSBUSDIV1_HSIDIV_SHIFT) /* Bit23 */ +#define RCC_SYSBUSDIV1_HSIDIV_DIV(n) \ + ( (n) == 1 ? 0x00000000U << 20 : \ + (n) == 2 ? 0x00000001U << 20 : \ + (n) == 4 ? 0x00000002U << 20 : \ + (n) == 8 ? 0x00000004U << 20 : \ + (n) == 16 ? 0x00000007U << 20 : \ + (n) == 32 ? 0x00000008U << 20 : \ + (n) == 64 ? 0x00000009U << 20 : \ + (n) == 128 ? 0x0000000AU << 20 : \ + (n) == 256 ? 0x0000000BU << 20 : \ + (n) == 512 ? 0x0000000CU << 20 : \ + 0x00000000U << 20 ) + +/* Bit[19:16] M7HYPDIV */ +#define RCC_SYSBUSDIV1_M7HYPDIV_SHIFT (16) +#define RCC_SYSBUSDIV1_M7HYPDIV_MASK (0x0F << RCC_SYSBUSDIV1_M7HYPDIV_SHIFT) +#define RCC_SYSBUSDIV1_M7HYPDIV_0 (0x01 << RCC_SYSBUSDIV1_M7HYPDIV_SHIFT) /* Bit16 */ +#define RCC_SYSBUSDIV1_M7HYPDIV_1 (0x02 << RCC_SYSBUSDIV1_M7HYPDIV_SHIFT) /* Bit17 */ +#define RCC_SYSBUSDIV1_M7HYPDIV_2 (0x04 << RCC_SYSBUSDIV1_M7HYPDIV_SHIFT) /* Bit18 */ +#define RCC_SYSBUSDIV1_M7HYPDIV_3 (0x08 << RCC_SYSBUSDIV1_M7HYPDIV_SHIFT) /* Bit19 */ +#define RCC_SYSBUSDIV1_M7HYPDIV_DIV(n) \ + ( (n) == 1 ? 0x00000000U << 16 : \ + (n) == 2 ? 0x00000001U << 16 : \ + (n) == 4 ? 0x00000002U << 16 : \ + (n) == 8 ? 0x00000004U << 16 : \ + (n) == 16 ? 0x00000007U << 16 : \ + (n) == 32 ? 0x00000008U << 16 : \ + (n) == 64 ? 0x00000009U << 16 : \ + (n) == 128 ? 0x0000000AU << 16 : \ + (n) == 256 ? 0x0000000BU << 16 : \ + (n) == 512 ? 0x0000000CU << 16 : \ + 0x00000000U << 16 ) + +/* Bit[15:12] AXIDIV */ +#define RCC_SYSBUSDIV1_AXIDIV_SHIFT (12) +#define RCC_SYSBUSDIV1_AXIDIV_MASK (0x0F << RCC_SYSBUSDIV1_AXIDIV_SHIFT) +#define RCC_SYSBUSDIV1_AXIDIV_0 (0x01 << RCC_SYSBUSDIV1_AXIDIV_SHIFT) /* Bit12 */ +#define RCC_SYSBUSDIV1_AXIDIV_1 (0x02 << RCC_SYSBUSDIV1_AXIDIV_SHIFT) /* Bit13 */ +#define RCC_SYSBUSDIV1_AXIDIV_2 (0x04 << RCC_SYSBUSDIV1_AXIDIV_SHIFT) /* Bit14 */ +#define RCC_SYSBUSDIV1_AXIDIV_3 (0x08 << RCC_SYSBUSDIV1_AXIDIV_SHIFT) /* Bit15 */ +#define RCC_SYSBUSDIV1_AXIDIV_DIV(n) \ + ( (n) == 1 ? 0x00000000U << 12 : \ + (n) == 2 ? 0x00000001U << 12 : \ + (n) == 4 ? 0x00000002U << 12 : \ + (n) == 8 ? 0x00000004U << 12 : \ + (n) == 16 ? 0x00000007U << 12 : \ + (n) == 32 ? 0x00000008U << 12 : \ + (n) == 64 ? 0x00000009U << 12 : \ + (n) == 128 ? 0x0000000AU << 12 : \ + (n) == 256 ? 0x0000000BU << 12 : \ + (n) == 512 ? 0x0000000CU << 12 : \ + 0x00000000U << 12 ) + +/* Bit[11:8] BUSDIV */ +#define RCC_SYSBUSDIV1_BUSDIV_SHIFT (8) +#define RCC_SYSBUSDIV1_BUSDIV_MASK (0x0F << RCC_SYSBUSDIV1_BUSDIV_SHIFT) +#define RCC_SYSBUSDIV1_BUSDIV_0 (0x01 << RCC_SYSBUSDIV1_BUSDIV_SHIFT) /* Bit8 */ +#define RCC_SYSBUSDIV1_BUSDIV_1 (0x02 << RCC_SYSBUSDIV1_BUSDIV_SHIFT) /* Bit9 */ +#define RCC_SYSBUSDIV1_BUSDIV_2 (0x04 << RCC_SYSBUSDIV1_BUSDIV_SHIFT) /* Bit10 */ +#define RCC_SYSBUSDIV1_BUSDIV_3 (0x08 << RCC_SYSBUSDIV1_BUSDIV_SHIFT) /* Bit11 */ +#define RCC_SYSBUSDIV1_BUSDIV_DIV(n) \ + ( (n) == 1 ? 0x00000000U << 8 : \ + (n) == 2 ? 0x00000001U << 8 : \ + (n) == 4 ? 0x00000002U << 8 : \ + (n) == 8 ? 0x00000004U << 8 : \ + (n) == 16 ? 0x00000007U << 8 : \ + (n) == 32 ? 0x00000008U << 8 : \ + (n) == 64 ? 0x00000009U << 8 : \ + (n) == 128 ? 0x0000000AU << 8 : \ + (n) == 256 ? 0x0000000BU << 8 : \ + (n) == 512 ? 0x0000000CU << 8 : \ + 0x00000000U << 8 ) + +/* Bit[7:4] MSIDIV */ +#define RCC_SYSBUSDIV1_MSIDIV_SHIFT (4) +#define RCC_SYSBUSDIV1_MSIDIV_MASK (0x0F << RCC_SYSBUSDIV1_MSIDIV_SHIFT) +#define RCC_SYSBUSDIV1_MSIDIV_0 (0x01 << RCC_SYSBUSDIV1_MSIDIV_SHIFT) /* Bit4 */ +#define RCC_SYSBUSDIV1_MSIDIV_1 (0x02 << RCC_SYSBUSDIV1_MSIDIV_SHIFT) /* Bit5 */ +#define RCC_SYSBUSDIV1_MSIDIV_2 (0x04 << RCC_SYSBUSDIV1_MSIDIV_SHIFT) /* Bit6 */ +#define RCC_SYSBUSDIV1_MSIDIV_3 (0x08 << RCC_SYSBUSDIV1_MSIDIV_SHIFT) /* Bit7 */ +#define RCC_SYSBUSDIV1_MSIDIV_DIV(n) \ + ( (n) == 1 ? 0x00000000U << 4 : \ + (n) == 2 ? 0x00000001U << 4 : \ + (n) == 4 ? 0x00000002U << 4 : \ + (n) == 8 ? 0x00000004U << 4 : \ + (n) == 16 ? 0x00000007U << 4 : \ + (n) == 32 ? 0x00000008U << 4 : \ + (n) == 64 ? 0x00000009U << 4 : \ + (n) == 128 ? 0x0000000AU << 4 : \ + (n) == 256 ? 0x0000000BU << 4 : \ + (n) == 512 ? 0x0000000CU << 4 : \ + 0x00000000U << 4 ) + +/* Bit[3:0] SYSCLKDIV */ +#define RCC_SYSBUSDIV1_SYSCLKDIV_SHIFT (0) +#define RCC_SYSBUSDIV1_SYSCLKDIV_MASK (0x0F << RCC_SYSBUSDIV1_SYSCLKDIV_SHIFT) +#define RCC_SYSBUSDIV1_SYSCLKDIV_0 (0x01 << RCC_SYSBUSDIV1_SYSCLKDIV_SHIFT) /* Bit0 */ +#define RCC_SYSBUSDIV1_SYSCLKDIV_1 (0x02 << RCC_SYSBUSDIV1_SYSCLKDIV_SHIFT) /* Bit1 */ +#define RCC_SYSBUSDIV1_SYSCLKDIV_2 (0x04 << RCC_SYSBUSDIV1_SYSCLKDIV_SHIFT) /* Bit2 */ +#define RCC_SYSBUSDIV1_SYSCLKDIV_3 (0x08 << RCC_SYSBUSDIV1_SYSCLKDIV_SHIFT) /* Bit3 */ +#define RCC_SYSBUSDIV1_SYSCLKDIV_DIV(n) \ + ( (n) == 1 ? 0x00000000U : \ + (n) == 2 ? 0x00000001U : \ + (n) == 4 ? 0x00000002U : \ + (n) == 8 ? 0x00000004U : \ + (n) == 16 ? 0x00000007U : \ + (n) == 32 ? 0x00000008U : \ + (n) == 64 ? 0x00000009U : \ + (n) == 128 ? 0x0000000AU : \ + (n) == 256 ? 0x0000000BU : \ + (n) == 512 ? 0x0000000CU : \ + 0x00000000U ) + +/* Bit definition for RCC_SYSBUSDIV2 register *******************************/ + +/* Bit[26:24] APB6DIV */ +#define RCC_SYSBUSDIV2_APB6DIV_SHIFT (24) +#define RCC_SYSBUSDIV2_APB6DIV_MASK (0x07 << RCC_SYSBUSDIV2_APB6DIV_SHIFT) +#define RCC_SYSBUSDIV2_APB6DIV_0 (0x01 << RCC_SYSBUSDIV2_APB6DIV_SHIFT) /* Bit24 */ +#define RCC_SYSBUSDIV2_APB6DIV_1 (0x02 << RCC_SYSBUSDIV2_APB6DIV_SHIFT) /* Bit25 */ +#define RCC_SYSBUSDIV2_APB6DIV_2 (0x04 << RCC_SYSBUSDIV2_APB6DIV_SHIFT) /* Bit26 */ +#define RCC_SYSBUSDIV2_APB6DIV_DIV(n) \ + ( (n) == 1 ? 0x00000000U << RCC_SYSBUSDIV2_APB6DIV_SHIFT : \ + (n) == 2 ? 0x00000004U << RCC_SYSBUSDIV2_APB6DIV_SHIFT : \ + (n) == 4 ? 0x00000005U << RCC_SYSBUSDIV2_APB6DIV_SHIFT : \ + (n) == 8 ? 0x00000006U << RCC_SYSBUSDIV2_APB6DIV_SHIFT : \ + (n) == 16 ? 0x00000007U << RCC_SYSBUSDIV2_APB6DIV_SHIFT : \ + 0x00000000U << RCC_SYSBUSDIV2_APB6DIV_SHIFT ) + +/* Bit[18:16] APB5DIV */ +#define RCC_SYSBUSDIV2_APB5DIV_SHIFT (16) +#define RCC_SYSBUSDIV2_APB5DIV_MASK (0x07 << RCC_SYSBUSDIV2_APB5DIV_SHIFT) +#define RCC_SYSBUSDIV2_APB5DIV_0 (0x01 << RCC_SYSBUSDIV2_APB5DIV_SHIFT) /* Bit16 */ +#define RCC_SYSBUSDIV2_APB5DIV_1 (0x02 << RCC_SYSBUSDIV2_APB5DIV_SHIFT) /* Bit17 */ +#define RCC_SYSBUSDIV2_APB5DIV_2 (0x04 << RCC_SYSBUSDIV2_APB5DIV_SHIFT) /* Bit18 */ +#define RCC_SYSBUSDIV2_APB5DIV_DIV(n) \ + ( (n) == 1 ? 0x00000000U << RCC_SYSBUSDIV2_APB5DIV_SHIFT : \ + (n) == 2 ? 0x00000004U << RCC_SYSBUSDIV2_APB5DIV_SHIFT : \ + (n) == 4 ? 0x00000005U << RCC_SYSBUSDIV2_APB5DIV_SHIFT : \ + (n) == 8 ? 0x00000006U << RCC_SYSBUSDIV2_APB5DIV_SHIFT : \ + (n) == 16 ? 0x00000007U << RCC_SYSBUSDIV2_APB5DIV_SHIFT : \ + 0x00000000U << RCC_SYSBUSDIV2_APB5DIV_SHIFT ) + +/* Bit[10:8] APB2DIV */ +#define RCC_SYSBUSDIV2_APB2DIV_SHIFT (8) +#define RCC_SYSBUSDIV2_APB2DIV_MASK (0x07 << RCC_SYSBUSDIV2_APB2DIV_SHIFT) +#define RCC_SYSBUSDIV2_APB2DIV_0 (0x01 << RCC_SYSBUSDIV2_APB2DIV_SHIFT) /* Bit8 */ +#define RCC_SYSBUSDIV2_APB2DIV_1 (0x02 << RCC_SYSBUSDIV2_APB2DIV_SHIFT) /* Bit9 */ +#define RCC_SYSBUSDIV2_APB2DIV_2 (0x04 << RCC_SYSBUSDIV2_APB2DIV_SHIFT) /* Bit10 */ +#define RCC_SYSBUSDIV2_APB2DIV_DIV(n) \ + ( (n) == 1 ? 0x00000000U << RCC_SYSBUSDIV2_APB2DIV_SHIFT : \ + (n) == 2 ? 0x00000004U << RCC_SYSBUSDIV2_APB2DIV_SHIFT : \ + (n) == 4 ? 0x00000005U << RCC_SYSBUSDIV2_APB2DIV_SHIFT : \ + (n) == 8 ? 0x00000006U << RCC_SYSBUSDIV2_APB2DIV_SHIFT : \ + (n) == 16 ? 0x00000007U << RCC_SYSBUSDIV2_APB2DIV_SHIFT : \ + 0x00000000U << RCC_SYSBUSDIV2_APB2DIV_SHIFT ) + +/* Bit[2:0] APB1DIV */ +#define RCC_SYSBUSDIV2_APB1DIV_SHIFT (0) +#define RCC_SYSBUSDIV2_APB1DIV_MASK (0x07 << RCC_SYSBUSDIV2_APB1DIV_SHIFT) +#define RCC_SYSBUSDIV2_APB1DIV_0 (0x01 << RCC_SYSBUSDIV2_APB1DIV_SHIFT) /* Bit0 */ +#define RCC_SYSBUSDIV2_APB1DIV_1 (0x02 << RCC_SYSBUSDIV2_APB1DIV_SHIFT) /* Bit1 */ +#define RCC_SYSBUSDIV2_APB1DIV_2 (0x04 << RCC_SYSBUSDIV2_APB1DIV_SHIFT) /* Bit2 */ +#define RCC_SYSBUSDIV2_APB1DIV_DIV(n) \ + ( (n) == 1 ? 0x00000000U << RCC_SYSBUSDIV2_APB1DIV_SHIFT : \ + (n) == 2 ? 0x00000004U << RCC_SYSBUSDIV2_APB1DIV_SHIFT : \ + (n) == 4 ? 0x00000005U << RCC_SYSBUSDIV2_APB1DIV_SHIFT : \ + (n) == 8 ? 0x00000006U << RCC_SYSBUSDIV2_APB1DIV_SHIFT : \ + (n) == 16 ? 0x00000007U << RCC_SYSBUSDIV2_APB1DIV_SHIFT : \ + 0x00000000U << RCC_SYSBUSDIV2_APB1DIV_SHIFT ) + +/* Bit definition for RCC_BOOTMODE register *********************************/ + +#define RCC_BOOTMODE_BOOTMODE_SHIFT (0) +#define RCC_BOOTMODE_BOOTMODE_MASK (0xFFFFFFFF << RCC_BOOTMODE_BOOTMODE_SHIFT) +#define RCC_BOOTMODE_BOOTMODE(n) ((n) << RCC_BOOTMODE_BOOTMODE_SHIFT) + +/* Bit definition for RCC_AHB1DIV1 register *********************************/ + +/* Bit[31:28] ETH2SYSDIV */ +#define RCC_AHB1DIV1_ETH2SYSDIV_SHIFT (28) +#define RCC_AHB1DIV1_ETH2SYSDIV_MASK (0x0F << RCC_AHB1DIV1_ETH2SYSDIV_SHIFT) +#define RCC_AHB1DIV1_ETH2SYSDIV_DIV1 (0x00000000U << RCC_AHB1DIV1_ETH2SYSDIV_SHIFT) +#define RCC_AHB1DIV1_ETH2SYSDIV_DIV2 (0x00000001U << RCC_AHB1DIV1_ETH2SYSDIV_SHIFT) +#define RCC_AHB1DIV1_ETH2SYSDIV_DIV4 (0x00000002U << RCC_AHB1DIV1_ETH2SYSDIV_SHIFT) +#define RCC_AHB1DIV1_ETH2SYSDIV_DIV8 (0x00000004U << RCC_AHB1DIV1_ETH2SYSDIV_SHIFT) +#define RCC_AHB1DIV1_ETH2SYSDIV_DIV16 (0x00000007U << RCC_AHB1DIV1_ETH2SYSDIV_SHIFT) +#define RCC_AHB1DIV1_ETH2SYSDIV_DIV32 (0x00000008U << RCC_AHB1DIV1_ETH2SYSDIV_SHIFT) +#define RCC_AHB1DIV1_ETH2SYSDIV_DIV64 (0x00000009U << RCC_AHB1DIV1_ETH2SYSDIV_SHIFT) +#define RCC_AHB1DIV1_ETH2SYSDIV_DIV128 (0x0000000AU << RCC_AHB1DIV1_ETH2SYSDIV_SHIFT) +#define RCC_AHB1DIV1_ETH2SYSDIV_DIV256 (0x0000000BU << RCC_AHB1DIV1_ETH2SYSDIV_SHIFT) +#define RCC_AHB1DIV1_ETH2SYSDIV_DIV512 (0x0000000CU << RCC_AHB1DIV1_ETH2SYSDIV_SHIFT) + +/* Bit[27:24] SDMMC2SYSDIV */ +#define RCC_AHB1DIV1_SDMMC2SYSDIV_SHIFT (24) +#define RCC_AHB1DIV1_SDMMC2SYSDIV_MASK (0x0F << RCC_AHB1DIV1_SDMMC2SYSDIV_SHIFT) +#define RCC_AHB1DIV1_SDMMC2SYSDIV_DIV1 (0x00000000U << RCC_AHB1DIV1_SDMMC2SYSDIV_SHIFT) +#define RCC_AHB1DIV1_SDMMC2SYSDIV_DIV2 (0x00000001U << RCC_AHB1DIV1_SDMMC2SYSDIV_SHIFT) +#define RCC_AHB1DIV1_SDMMC2SYSDIV_DIV4 (0x00000002U << RCC_AHB1DIV1_SDMMC2SYSDIV_SHIFT) +#define RCC_AHB1DIV1_SDMMC2SYSDIV_DIV8 (0x00000004U << RCC_AHB1DIV1_SDMMC2SYSDIV_SHIFT) +#define RCC_AHB1DIV1_SDMMC2SYSDIV_DIV16 (0x00000007U << RCC_AHB1DIV1_SDMMC2SYSDIV_SHIFT) +#define RCC_AHB1DIV1_SDMMC2SYSDIV_DIV32 (0x00000008U << RCC_AHB1DIV1_SDMMC2SYSDIV_SHIFT) +#define RCC_AHB1DIV1_SDMMC2SYSDIV_DIV64 (0x00000009U << RCC_AHB1DIV1_SDMMC2SYSDIV_SHIFT) +#define RCC_AHB1DIV1_SDMMC2SYSDIV_DIV128 (0x0000000AU << RCC_AHB1DIV1_SDMMC2SYSDIV_SHIFT) +#define RCC_AHB1DIV1_SDMMC2SYSDIV_DIV256 (0x0000000BU << RCC_AHB1DIV1_SDMMC2SYSDIV_SHIFT) +#define RCC_AHB1DIV1_SDMMC2SYSDIV_DIV512 (0x0000000CU << RCC_AHB1DIV1_SDMMC2SYSDIV_SHIFT) + +/* Bit definition for RCC_AHB1DIV2 register *********************************/ + +/* Bit[21:16] ADC3SYSDIV */ +#define RCC_AHB1DIV2_ADC3SYSDIV_SHIFT (16) +#define RCC_AHB1DIV2_ADC3SYSDIV_MASK (0x3F << RCC_AHB1DIV2_ADC3SYSDIV_SHIFT) +#define RCC_AHB1DIV2_ADC3SYSDIV_DIV(n) ((n >= 1 && n <= 63) ? (n << RCC_AHB1DIV2_ADC3SYSDIV_SHIFT) : 0) + +/* Bit[13:8] ADC2SYSDIV */ +#define RCC_AHB1DIV2_ADC2SYSDIV_SHIFT (8) +#define RCC_AHB1DIV2_ADC2SYSDIV_MASK (0x3F << RCC_AHB1DIV2_ADC2SYSDIV_SHIFT) +#define RCC_AHB1DIV2_ADC2SYSDIV_DIV(n) ((n >= 1 && n <= 63) ? (n << RCC_AHB1DIV2_ADC2SYSDIV_SHIFT) : 0) + +/* Bit[5:0] ADC1SYSDIV */ +#define RCC_AHB1DIV2_ADC1SYSDIV_SHIFT (0) +#define RCC_AHB1DIV2_ADC1SYSDIV_MASK (0x3F << RCC_AHB1DIV2_ADC1SYSDIV_SHIFT) +#define RCC_AHB1DIV2_ADC1SYSDIV_DIV(n) ((n >= 1 && n <= 63) ? (n << RCC_AHB1DIV2_ADC1SYSDIV_SHIFT) : 0) + +/* Bit definition for RCC_AHB1SEL1 register *********************************/ + +/* Bit[21:20] ETH2PTPSEL */ +#define RCC_AHB1SEL1_ETH2PTPSEL_SHIFT (20) +#define RCC_AHB1SEL1_ETH2PTPSEL_MASK (0x03 << RCC_AHB1SEL1_ETH2PTPSEL_SHIFT) +#define RCC_AHB1SEL1_ETH2PTPSEL_SYSCLK (0x00000000U << RCC_AHB1SEL1_ETH2PTPSEL_SHIFT) + +#define RCC_AHB1SEL1_ETH2PTPSEL_PERIPH (0x00000001U << RCC_AHB1SEL1_ETH2PTPSEL_SHIFT) +#define RCC_AHB1SEL1_ETH2PTPSEL_PLL2C (0x00000002U << RCC_AHB1SEL1_ETH2PTPSEL_SHIFT) +#define RCC_AHB1SEL1_ETH2PTPSEL_PLL3A (0x00000003U << RCC_AHB1SEL1_ETH2PTPSEL_SHIFT) + +/* Bit[14:12] SDMMC2KERSEL */ +#define RCC_AHB1SEL1_SDMMC2KERSEL_SHIFT (12) +#define RCC_AHB1SEL1_SDMMC2KERSEL_MASK (0x07 << RCC_AHB1SEL1_SDMMC2KERSEL_SHIFT) +#define RCC_AHB1SEL1_SDMMC2KERSEL_SYSCLK (0x00000000U << RCC_AHB1SEL1_SDMMC2KERSEL_SHIFT) +#define RCC_AHB1SEL1_SDMMC2KERSEL_PERIPH (0x00000001U << RCC_AHB1SEL1_SDMMC2KERSEL_SHIFT) +#define RCC_AHB1SEL1_SDMMC2KERSEL_PLL2A (0x00000002U << RCC_AHB1SEL1_SDMMC2KERSEL_SHIFT) +#define RCC_AHB1SEL1_SDMMC2KERSEL_PLL3A (0x00000003U << RCC_AHB1SEL1_SDMMC2KERSEL_SHIFT) +#define RCC_AHB1SEL1_SDMMC2KERSEL_PLL1B (0x00000004U << RCC_AHB1SEL1_SDMMC2KERSEL_SHIFT) + +/* Bit[9:8] ADC3PLLSEL */ +#define RCC_AHB1SEL1_ADC3PLLSEL_SHIFT (8) +#define RCC_AHB1SEL1_ADC3PLLSEL_MASK (0x03 << RCC_AHB1SEL1_ADC3PLLSEL_SHIFT) +#define RCC_AHB1SEL1_ADC3PLLSEL_PLL2B (0x00000000U << RCC_AHB1SEL1_ADC3PLLSEL_SHIFT) +#define RCC_AHB1SEL1_ADC3PLLSEL_PLL1B (0x00000001U << RCC_AHB1SEL1_ADC3PLLSEL_SHIFT) +#define RCC_AHB1SEL1_ADC3PLLSEL_PLL3B (0x00000002U << RCC_AHB1SEL1_ADC3PLLSEL_SHIFT) +#define RCC_AHB1SEL1_ADC3PLLSEL_PLL3C (0x00000003U << RCC_AHB1SEL1_ADC3PLLSEL_SHIFT) + +/* Bit[5:4] ADC2PLLSEL */ +#define RCC_AHB1SEL1_ADC2PLLSEL_SHIFT (4) +#define RCC_AHB1SEL1_ADC2PLLSEL_MASK (0x03 << RCC_AHB1SEL1_ADC2PLLSEL_SHIFT) +#define RCC_AHB1SEL1_ADC2PLLSEL_PLL2B (0x00000000U << RCC_AHB1SEL1_ADC2PLLSEL_SHIFT) +#define RCC_AHB1SEL1_ADC2PLLSEL_PLL1B (0x00000001U << RCC_AHB1SEL1_ADC2PLLSEL_SHIFT) +#define RCC_AHB1SEL1_ADC2PLLSEL_PLL3B (0x00000002U << RCC_AHB1SEL1_ADC2PLLSEL_SHIFT) +#define RCC_AHB1SEL1_ADC2PLLSEL_PLL3C (0x00000003U << RCC_AHB1SEL1_ADC2PLLSEL_SHIFT) + +/* Bit[1:0] ADC1PLLSEL */ +#define RCC_AHB1SEL1_ADC1PLLSEL_SHIFT (0) +#define RCC_AHB1SEL1_ADC1PLLSEL_MASK (0x03 << RCC_AHB1SEL1_ADC1PLLSEL_SHIFT) +#define RCC_AHB1SEL1_ADC1PLLSEL_PLL2B (0x00000000U << RCC_AHB1SEL1_ADC1PLLSEL_SHIFT) +#define RCC_AHB1SEL1_ADC1PLLSEL_PLL1B (0x00000001U << RCC_AHB1SEL1_ADC1PLLSEL_SHIFT) +#define RCC_AHB1SEL1_ADC1PLLSEL_PLL3B (0x00000002U << RCC_AHB1SEL1_ADC1PLLSEL_SHIFT) +#define RCC_AHB1SEL1_ADC1PLLSEL_PLL3C (0x00000003U << RCC_AHB1SEL1_ADC1PLLSEL_SHIFT) + +/* Bit definition for RCC_AHB1EN1 register **********************************/ + +#define RCC_AHB1EN1_M7SDMMC2EN (1U << 31) /* Bit[31] */ +#define RCC_AHB1EN1_M4SDMMC2EN (1U << 30) /* Bit[30] */ +#define RCC_AHB1EN1_M7SDMMC2LPEN (1U << 29) /* Bit[29] */ +#define RCC_AHB1EN1_M4SDMMC2LPEN (1U << 28) /* Bit[28] */ +#define RCC_AHB1EN1_M7USB2EN (1U << 23) /* Bit[23] */ +#define RCC_AHB1EN1_M4USB2EN (1U << 22) /* Bit[22] */ +#define RCC_AHB1EN1_M7USB2LPEN (1U << 21) /* Bit[21] */ +#define RCC_AHB1EN1_M4USB2LPEN (1U << 20) /* Bit[20] */ +#define RCC_AHB1EN1_M7DMAMUX1EN (1U << 19) /* Bit[19] */ +#define RCC_AHB1EN1_M4DMAMUX1EN (1U << 18) /* Bit[18] */ +#define RCC_AHB1EN1_M7DMAMUX1LPEN (1U << 17) /* Bit[17] */ +#define RCC_AHB1EN1_M4DMAMUX1LPEN (1U << 16) /* Bit[16] */ +#define RCC_AHB1EN1_M7ADC1PLLEN (1U << 15) /* Bit[15] */ +#define RCC_AHB1EN1_M4ADC1PLLEN (1U << 14) /* Bit[14] */ +#define RCC_AHB1EN1_M7ADC1PLLLPEN (1U << 13) /* Bit[13] */ +#define RCC_AHB1EN1_M4ADC1PLLLPEN (1U << 12) /* Bit[12] */ +#define RCC_AHB1EN1_M7ADC1SYSEN (1U << 11) /* Bit[11] */ +#define RCC_AHB1EN1_M4ADC1SYSEN (1U << 10) /* Bit[10] */ +#define RCC_AHB1EN1_M7ADC1SYSLPEN (1U << 9) /* Bit[9] */ +#define RCC_AHB1EN1_M4ADC1SYSLPEN (1U << 8) /* Bit[8] */ +#define RCC_AHB1EN1_M7ADC1BUSEN (1U << 3) /* Bit[3] */ +#define RCC_AHB1EN1_M4ADC1BUSEN (1U << 2) /* Bit[2] */ +#define RCC_AHB1EN1_M7ADC1BUSLPEN (1U << 1) /* Bit[1] */ +#define RCC_AHB1EN1_M4ADC1BUSLPEN (1U << 0) /* Bit[0] */ + +/* Bit definition for RCC_AHB1EN2 register **********************************/ + +#define RCC_AHB1EN2_M7ETH2TXEN (1U << 11) /* Bit[11] */ +#define RCC_AHB1EN2_M4ETH2TXEN (1U << 10) /* Bit[10] */ +#define RCC_AHB1EN2_M7ETH2TXLPEN (1U << 9) /* Bit[9] */ +#define RCC_AHB1EN2_M4ETH2TXLPEN (1U << 8) /* Bit[8] */ +#define RCC_AHB1EN2_M7ETH2RXEN (1U << 7) /* Bit[7] */ +#define RCC_AHB1EN2_M4ETH2RXEN (1U << 6) /* Bit[6] */ +#define RCC_AHB1EN2_M7ETH2RXLPEN (1U << 5) /* Bit[5] */ +#define RCC_AHB1EN2_M4ETH2RXLPEN (1U << 4) /* Bit[4] */ +#define RCC_AHB1EN2_M7ETH2MACEN (1U << 3) /* Bit[3] */ +#define RCC_AHB1EN2_M4ETH2MACEN (1U << 2) /* Bit[2] */ +#define RCC_AHB1EN2_M7ETH2MACLPEN (1U << 1) /* Bit[1] */ +#define RCC_AHB1EN2_M4ETH2MACLPEN (1U << 0) /* Bit[0] */ + +/* Bit definition for RCC_AHB1EN3 register **********************************/ + +#define RCC_AHB1EN3_M7ECCMACEN (1U << 27) /* Bit[27] */ +#define RCC_AHB1EN3_M4ECCMACEN (1U << 26) /* Bit[26] */ +#define RCC_AHB1EN3_M7ECCMACLPEN (1U << 25) /* Bit[25] */ +#define RCC_AHB1EN3_M4ECCMACLPEN (1U << 24) /* Bit[24] */ +#define RCC_AHB1EN3_M7DMA1EN (1U << 19) /* Bit[19] */ +#define RCC_AHB1EN3_M4DMA1EN (1U << 18) /* Bit[18] */ +#define RCC_AHB1EN3_M7DMA1LPEN (1U << 17) /* Bit[17] */ +#define RCC_AHB1EN3_M4DMA1LPEN (1U << 16) /* Bit[16] */ +#define RCC_AHB1EN3_M7DMA2EN (1U << 11) /* Bit[11] */ +#define RCC_AHB1EN3_M4DMA2EN (1U << 10) /* Bit[10] */ +#define RCC_AHB1EN3_M7DMA2LPEN (1U << 9) /* Bit[9] */ +#define RCC_AHB1EN3_M4DMA2LPEN (1U << 8) /* Bit[8] */ +#define RCC_AHB1EN3_M7DMA3EN (1U << 3) /* Bit[3] */ +#define RCC_AHB1EN3_M4DMA3EN (1U << 2) /* Bit[2] */ +#define RCC_AHB1EN3_M7DMA3LPEN (1U << 1) /* Bit[1] */ +#define RCC_AHB1EN3_M4DMA3LPEN (1U << 0) /* Bit[0] */ + +/* Bit definition for RCC_AHB1EN4 register **********************************/ + +#define RCC_AHB1EN4_M7ADC2PLLEN (1U << 31) /* Bit[31] */ +#define RCC_AHB1EN4_M4ADC2PLLEN (1U << 30) /* Bit[30] */ +#define RCC_AHB1EN4_M7ADC2PLLLPEN (1U << 29) /* Bit[29] */ +#define RCC_AHB1EN4_M4ADC2PLLLPEN (1U << 28) /* Bit[28] */ +#define RCC_AHB1EN4_M7ADC2SYSEN (1U << 27) /* Bit[27] */ +#define RCC_AHB1EN4_M4ADC2SYSEN (1U << 26) /* Bit[26] */ +#define RCC_AHB1EN4_M7ADC2SYSLPEN (1U << 25) /* Bit[25] */ +#define RCC_AHB1EN4_M4ADC2SYSLPEN (1U << 24) /* Bit[24] */ +#define RCC_AHB1EN4_M7ADC2BUSEN (1U << 19) /* Bit[19] */ +#define RCC_AHB1EN4_M4ADC2BUSEN (1U << 18) /* Bit[18] */ +#define RCC_AHB1EN4_M7ADC2BUSLPEN (1U << 17) /* Bit[17] */ +#define RCC_AHB1EN4_M4ADC2BUSLPEN (1U << 16) /* Bit[16] */ +#define RCC_AHB1EN4_M7ADC3PLLEN (1U << 15) /* Bit[15] */ +#define RCC_AHB1EN4_M4ADC3PLLEN (1U << 14) /* Bit[14] */ +#define RCC_AHB1EN4_M7ADC3PLLLPEN (1U << 13) /* Bit[13] */ +#define RCC_AHB1EN4_M4ADC3PLLLPEN (1U << 12) /* Bit[12] */ +#define RCC_AHB1EN4_M7ADC3SYSEN (1U << 11) /* Bit[11] */ +#define RCC_AHB1EN4_M4ADC3SYSEN (1U << 10) /* Bit[10] */ +#define RCC_AHB1EN4_M7ADC3SYSLPEN (1U << 9) /* Bit[9] */ +#define RCC_AHB1EN4_M4ADC3SYSLPEN (1U << 8) /* Bit[8] */ +#define RCC_AHB1EN4_M7ADC3BUSEN (1U << 3) /* Bit[3] */ +#define RCC_AHB1EN4_M4ADC3BUSEN (1U << 2) /* Bit[2] */ +#define RCC_AHB1EN4_M7ADC3BUSLPEN (1U << 1) /* Bit[1] */ +#define RCC_AHB1EN4_M4ADC3BUSLPEN (1U << 0) /* Bit[0] */ + +/* Bit definition for RCC_AHB1RST1 register *********************************/ + +#define RCC_AHB1RST1_SDMMC2RST (1U << 29) /* Bit[29] */ +#define RCC_AHB1RST1_SDHOST2RST (1U << 28) /* Bit[28] */ +#define RCC_AHB1RST1_USB2WRAPRST (1U << 22) /* Bit[22] */ +#define RCC_AHB1RST1_USB2PORRST (1U << 21) /* Bit[21] */ +#define RCC_AHB1RST1_USB2RST (1U << 20) /* Bit[20] */ +#define RCC_AHB1RST1_DMAMUX1RST (1U << 16) /* Bit[16] */ +#define RCC_AHB1RST1_ADC1RST (1U << 0) /* Bit[0] */ + +/* Bit definition for RCC_AHB1RST2 register *********************************/ + +#define RCC_AHB1RST2_ETH2RST (1U << 0) /* Bit[0] */ + +/* Bit definition for RCC_AHB1RST3 register *********************************/ + +#define RCC_AHB1RST3_ECCMACRST (1U << 24) /* Bit[24] */ +#define RCC_AHB1RST3_DMA1RST (1U << 16) /* Bit[16] */ +#define RCC_AHB1RST3_DMA2RST (1U << 8) /* Bit[8] */ +#define RCC_AHB1RST3_DMA3RST (1U << 0) /* Bit[0] */ + +/* Bit definition for RCC_AHB1RST4 register *********************************/ + +#define RCC_AHB1RST4_ADC2RST (1U << 16) /* Bit[16] */ +#define RCC_AHB1RST4_ADC3RST (1U << 0) /* Bit[0] */ + +/* Bit definition for RCC_APB1DIV1 register *********************************/ + +/* Bit[30:28] APB1USARTDIV */ +#define RCC_APB1DIV1_APB1USARTDIV_SHIFT (28) +#define RCC_APB1DIV1_APB1USARTDIV_MASK (0x07 << RCC_APB1DIV1_APB1USARTDIV_SHIFT) +#define RCC_APB1DIV1_APB1USARTDIV_DIV1 (0x00000000U << RCC_APB1DIV1_APB1USARTDIV_SHIFT) +#define RCC_APB1DIV1_APB1USARTDIV_DIV2 (0x00000004U << RCC_APB1DIV1_APB1USARTDIV_SHIFT) +#define RCC_APB1DIV1_APB1USARTDIV_DIV4 (0x00000005U << RCC_APB1DIV1_APB1USARTDIV_SHIFT) +#define RCC_APB1DIV1_APB1USARTDIV_DIV8 (0x00000006U << RCC_APB1DIV1_APB1USARTDIV_SHIFT) +#define RCC_APB1DIV1_APB1USARTDIV_DIV16 (0x00000007U << RCC_APB1DIV1_APB1USARTDIV_SHIFT) + +/* Bit[26:24] APB1BTIMDIV */ +#define RCC_APB1DIV1_APB1BTIMDIV_SHIFT (24) +#define RCC_APB1DIV1_APB1BTIMDIV_MASK (0x07 << RCC_APB1DIV1_APB1BTIMDIV_SHIFT) +#define RCC_APB1DIV1_APB1BTIMDIV_DIV1 (0x00000000U << RCC_APB1DIV1_APB1BTIMDIV_SHIFT) +#define RCC_APB1DIV1_APB1BTIMDIV_DIV2 (0x00000004U << RCC_APB1DIV1_APB1BTIMDIV_SHIFT) +#define RCC_APB1DIV1_APB1BTIMDIV_DIV4 (0x00000005U << RCC_APB1DIV1_APB1BTIMDIV_SHIFT) +#define RCC_APB1DIV1_APB1BTIMDIV_DIV8 (0x00000006U << RCC_APB1DIV1_APB1BTIMDIV_SHIFT) +#define RCC_APB1DIV1_APB1BTIMDIV_DIV16 (0x00000007U << RCC_APB1DIV1_APB1BTIMDIV_SHIFT) + +/* Bit[18:16] APB1GTIMDIV */ +#define RCC_APB1DIV1_APB1GTIMDIV_SHIFT (16) +#define RCC_APB1DIV1_APB1GTIMDIV_MASK (0x07 << RCC_APB1DIV1_APB1GTIMDIV_SHIFT) +#define RCC_APB1DIV1_APB1GTIMDIV_DIV1 (0x00000000U << RCC_APB1DIV1_APB1GTIMDIV_SHIFT) +#define RCC_APB1DIV1_APB1GTIMDIV_DIV2 (0x00000004U << RCC_APB1DIV1_APB1GTIMDIV_SHIFT) +#define RCC_APB1DIV1_APB1GTIMDIV_DIV4 (0x00000005U << RCC_APB1DIV1_APB1GTIMDIV_SHIFT) +#define RCC_APB1DIV1_APB1GTIMDIV_DIV8 (0x00000006U << RCC_APB1DIV1_APB1GTIMDIV_SHIFT) +#define RCC_APB1DIV1_APB1GTIMDIV_DIV16 (0x00000007U << RCC_APB1DIV1_APB1GTIMDIV_SHIFT) + +/* Bit[10:8] APB1I2SDIV */ +#define RCC_APB1DIV1_APB1I2SDIV_SHIFT (8) +#define RCC_APB1DIV1_APB1I2SDIV_MASK (0x07 << RCC_APB1DIV1_APB1I2SDIV_SHIFT) +#define RCC_APB1DIV1_APB1I2SDIV_DIV1 (0x00000000U << RCC_APB1DIV1_APB1I2SDIV_SHIFT) +#define RCC_APB1DIV1_APB1I2SDIV_DIV2 (0x00000004U << RCC_APB1DIV1_APB1I2SDIV_SHIFT) +#define RCC_APB1DIV1_APB1I2SDIV_DIV4 (0x00000005U << RCC_APB1DIV1_APB1I2SDIV_SHIFT) +#define RCC_APB1DIV1_APB1I2SDIV_DIV8 (0x00000006U << RCC_APB1DIV1_APB1I2SDIV_SHIFT) +#define RCC_APB1DIV1_APB1I2SDIV_DIV16 (0x00000007U << RCC_APB1DIV1_APB1I2SDIV_SHIFT) + +/* Bit[6:4] APB1FDCANDIV */ +#define RCC_APB1DIV1_APB1FDCANDIV_SHIFT (4) +#define RCC_APB1DIV1_APB1FDCANDIV_MASK (0x07 << RCC_APB1DIV1_APB1FDCANDIV_SHIFT) +#define RCC_APB1DIV1_APB1FDCANDIV_DIV1 (0x00000000U << RCC_APB1DIV1_APB1FDCANDIV_SHIFT) +#define RCC_APB1DIV1_APB1FDCANDIV_DIV2 (0x00000004U << RCC_APB1DIV1_APB1FDCANDIV_SHIFT) +#define RCC_APB1DIV1_APB1FDCANDIV_DIV4 (0x00000005U << RCC_APB1DIV1_APB1FDCANDIV_SHIFT) +#define RCC_APB1DIV1_APB1FDCANDIV_DIV8 (0x00000006U << RCC_APB1DIV1_APB1FDCANDIV_SHIFT) +#define RCC_APB1DIV1_APB1FDCANDIV_DIV16 (0x00000007U << RCC_APB1DIV1_APB1FDCANDIV_SHIFT) + +/* Bit[2:0] APB1I2CDIV */ +#define RCC_APB1DIV1_APB1I2CDIV_SHIFT (0) +#define RCC_APB1DIV1_APB1I2CDIV_MASK (0x07 << RCC_APB1DIV1_APB1I2CDIV_SHIFT) +#define RCC_APB1DIV1_APB1I2CDIV_DIV1 (0x00000000U << RCC_APB1DIV1_APB1I2CDIV_SHIFT) +#define RCC_APB1DIV1_APB1I2CDIV_DIV2 (0x00000004U << RCC_APB1DIV1_APB1I2CDIV_SHIFT) +#define RCC_APB1DIV1_APB1I2CDIV_DIV4 (0x00000005U << RCC_APB1DIV1_APB1I2CDIV_SHIFT) +#define RCC_APB1DIV1_APB1I2CDIV_DIV8 (0x00000006U << RCC_APB1DIV1_APB1I2CDIV_SHIFT) +#define RCC_APB1DIV1_APB1I2CDIV_DIV16 (0x00000007U << RCC_APB1DIV1_APB1I2CDIV_SHIFT) + +/* Bit definition for RCC_APB1SEL1 register *********************************/ + +/* Bit[30:28] I2C1KERSEL */ +#define RCC_APB1SEL1_I2C1KERSEL_SHIFT (28) +#define RCC_APB1SEL1_I2C1KERSEL_MASK (0x07 << RCC_APB1SEL1_I2C1KERSEL_SHIFT) +#define RCC_APB1SEL1_I2C1KERSEL_SYSDIV (0x00000000U << RCC_APB1SEL1_I2C1KERSEL_SHIFT) +#define RCC_APB1SEL1_I2C1KERSEL_PLL3C (0x00000001U << RCC_APB1SEL1_I2C1KERSEL_SHIFT) +#define RCC_APB1SEL1_I2C1KERSEL_HSI (0x00000002U << RCC_APB1SEL1_I2C1KERSEL_SHIFT) +#define RCC_APB1SEL1_I2C1KERSEL_MSI (0x00000003U << RCC_APB1SEL1_I2C1KERSEL_SHIFT) + +/* Bit[26:24] I2C2KERSEL */ +#define RCC_APB1SEL1_I2C2KERSEL_SHIFT (24) +#define RCC_APB1SEL1_I2C2KERSEL_MASK (0x07 << RCC_APB1SEL1_I2C2KERSEL_SHIFT) +#define RCC_APB1SEL1_I2C2KERSEL_SYSDIV (0x00000000U << RCC_APB1SEL1_I2C2KERSEL_SHIFT) +#define RCC_APB1SEL1_I2C2KERSEL_PLL3C (0x00000001U << RCC_APB1SEL1_I2C2KERSEL_SHIFT) +#define RCC_APB1SEL1_I2C2KERSEL_HSI (0x00000002U << RCC_APB1SEL1_I2C2KERSEL_SHIFT) +#define RCC_APB1SEL1_I2C2KERSEL_MSI (0x00000003U << RCC_APB1SEL1_I2C2KERSEL_SHIFT) + +/* Bit[22:20] I2C3KERSEL */ +#define RCC_APB1SEL1_I2C3KERSEL_SHIFT (20) +#define RCC_APB1SEL1_I2C3KERSEL_MASK (0x07 << RCC_APB1SEL1_I2C3KERSEL_SHIFT) +#define RCC_APB1SEL1_I2C3KERSEL_SYSDIV (0x00000000U << RCC_APB1SEL1_I2C3KERSEL_SHIFT) +#define RCC_APB1SEL1_I2C3KERSEL_PLL3C (0x00000001U << RCC_APB1SEL1_I2C3KERSEL_SHIFT) +#define RCC_APB1SEL1_I2C3KERSEL_HSI (0x00000002U << RCC_APB1SEL1_I2C3KERSEL_SHIFT) +#define RCC_APB1SEL1_I2C3KERSEL_MSI (0x00000003U << RCC_APB1SEL1_I2C3KERSEL_SHIFT) + +/* Bit[18:16] FDCAN1KERSEL */ +#define RCC_APB1SEL1_FDCAN1KERSEL_SHIFT (16) +#define RCC_APB1SEL1_FDCAN1KERSEL_MASK (0x07 << RCC_APB1SEL1_FDCAN1KERSEL_SHIFT) +#define RCC_APB1SEL1_FDCAN1KERSEL_SYSDIV (0x00000000U << RCC_APB1SEL1_FDCAN1KERSEL_SHIFT) +#define RCC_APB1SEL1_FDCAN1KERSEL_PLL1C (0x00000001U << RCC_APB1SEL1_FDCAN1KERSEL_SHIFT) +#define RCC_APB1SEL1_FDCAN1KERSEL_PLL2C (0x00000002U << RCC_APB1SEL1_FDCAN1KERSEL_SHIFT) +#define RCC_APB1SEL1_FDCAN1KERSEL_PLL3B (0x00000003U << RCC_APB1SEL1_FDCAN1KERSEL_SHIFT) +#define RCC_APB1SEL1_FDCAN1KERSEL_PERIPH (0x00000004U << RCC_APB1SEL1_FDCAN1KERSEL_SHIFT) + +/* Bit[10:8] FDCAN2KERSEL */ +#define RCC_APB1SEL1_FDCAN2KERSEL_SHIFT (8) +#define RCC_APB1SEL1_FDCAN2KERSEL_MASK (0x07 << RCC_APB1SEL1_FDCAN2KERSEL_SHIFT) +#define RCC_APB1SEL1_FDCAN2KERSEL_SYSDIV (0x00000000U << RCC_APB1SEL1_FDCAN2KERSEL_SHIFT) +#define RCC_APB1SEL1_FDCAN2KERSEL_PLL1C (0x00000001U << RCC_APB1SEL1_FDCAN2KERSEL_SHIFT) +#define RCC_APB1SEL1_FDCAN2KERSEL_PLL2C (0x00000002U << RCC_APB1SEL1_FDCAN2KERSEL_SHIFT) +#define RCC_APB1SEL1_FDCAN2KERSEL_PLL3B (0x00000003U << RCC_APB1SEL1_FDCAN2KERSEL_SHIFT) +#define RCC_APB1SEL1_FDCAN2KERSEL_PERIPH (0x00000004U << RCC_APB1SEL1_FDCAN2KERSEL_SHIFT) + +/* Bit[3:2] I2S4KERSEL */ +#define RCC_APB1SEL1_I2S4KERSEL_SHIFT (2) +#define RCC_APB1SEL1_I2S4KERSEL_MASK (0x03 << RCC_APB1SEL1_I2S4KERSEL_SHIFT) +#define RCC_APB1SEL1_I2S4KERSEL_SYSDIV (0x00000000U << RCC_APB1SEL1_I2S4KERSEL_SHIFT) +#define RCC_APB1SEL1_I2S4KERSEL_PLL3B (0x00000001U << RCC_APB1SEL1_I2S4KERSEL_SHIFT) +#define RCC_APB1SEL1_I2S4KERSEL_HSI (0x00000002U << RCC_APB1SEL1_I2S4KERSEL_SHIFT) +#define RCC_APB1SEL1_I2S4KERSEL_I2S4CKIN (0x00000003U << RCC_APB1SEL1_I2S4KERSEL_SHIFT) + +/* Bit[1:0] I2S3KERSEL */ +#define RCC_APB1SEL1_I2S3KERSEL_SHIFT (0) +#define RCC_APB1SEL1_I2S3KERSEL_MASK (0x03 << RCC_APB1SEL1_I2S3KERSEL_SHIFT) +#define RCC_APB1SEL1_I2S3KERSEL_SYSDIV (0x00000000U << RCC_APB1SEL1_I2S3KERSEL_SHIFT) +#define RCC_APB1SEL1_I2S3KERSEL_PLL3B (0x00000001U << RCC_APB1SEL1_I2S3KERSEL_SHIFT) +#define RCC_APB1SEL1_I2S3KERSEL_HSI (0x00000002U << RCC_APB1SEL1_I2S3KERSEL_SHIFT) +#define RCC_APB1SEL1_I2S3KERSEL_I2S4CKIN (0x00000003U << RCC_APB1SEL1_I2S3KERSEL_SHIFT) + +/* Bit definition for RCC_APB1SEL2 register *********************************/ + +/* Bit[30:28] FDCAN5KERSEL */ +#define RCC_APB1SEL2_FDCAN5KERSEL_SHIFT (28) +#define RCC_APB1SEL2_FDCAN5KERSEL_MASK (0x07 << RCC_APB1SEL2_FDCAN5KERSEL_SHIFT) +#define RCC_APB1SEL2_FDCAN5KERSEL_SYSDIV (0x00000000U << RCC_APB1SEL2_FDCAN5KERSEL_SHIFT) +#define RCC_APB1SEL2_FDCAN5KERSEL_PLL1C (0x00000001U << RCC_APB1SEL2_FDCAN5KERSEL_SHIFT) +#define RCC_APB1SEL2_FDCAN5KERSEL_PLL2C (0x00000002U << RCC_APB1SEL2_FDCAN5KERSEL_SHIFT) +#define RCC_APB1SEL2_FDCAN5KERSEL_PLL3B (0x00000003U << RCC_APB1SEL2_FDCAN5KERSEL_SHIFT) +#define RCC_APB1SEL2_FDCAN5KERSEL_PERIPH (0x00000004U << RCC_APB1SEL2_FDCAN5KERSEL_SHIFT) + +/* Bit[22:20] FDCAN6KERSEL */ +#define RCC_APB1SEL2_FDCAN6KERSEL_SHIFT (20) +#define RCC_APB1SEL2_FDCAN6KERSEL_MASK (0x07 << RCC_APB1SEL2_FDCAN6KERSEL_SHIFT) +#define RCC_APB1SEL2_FDCAN6KERSEL_SYSDIV (0x00000000U << RCC_APB1SEL2_FDCAN6KERSEL_SHIFT) +#define RCC_APB1SEL2_FDCAN6KERSEL_PLL1C (0x00000001U << RCC_APB1SEL2_FDCAN6KERSEL_SHIFT) +#define RCC_APB1SEL2_FDCAN6KERSEL_PLL2C (0x00000002U << RCC_APB1SEL2_FDCAN6KERSEL_SHIFT) +#define RCC_APB1SEL2_FDCAN6KERSEL_PLL3B (0x00000003U << RCC_APB1SEL2_FDCAN6KERSEL_SHIFT) +#define RCC_APB1SEL2_FDCAN6KERSEL_PERIPH (0x00000004U << RCC_APB1SEL2_FDCAN6KERSEL_SHIFT) + +/* Bit definition for RCC_APB1EN1 register **********************************/ + +#define RCC_APB1EN1_M7BTIM1EN (1U << 31) /* Bit[31] */ +#define RCC_APB1EN1_M4BTIM1EN (1U << 30) /* Bit[30] */ +#define RCC_APB1EN1_M7BTIM1LPEN (1U << 29) /* Bit[29] */ +#define RCC_APB1EN1_M4BTIM1LPEN (1U << 28) /* Bit[28] */ +#define RCC_APB1EN1_M7BTIM2EN (1U << 27) /* Bit[27] */ +#define RCC_APB1EN1_M4BTIM2EN (1U << 26) /* Bit[26] */ +#define RCC_APB1EN1_M7BTIM2LPEN (1U << 25) /* Bit[25] */ +#define RCC_APB1EN1_M4BTIM2LPEN (1U << 24) /* Bit[24] */ +#define RCC_APB1EN1_M7BTIM3EN (1U << 23) /* Bit[23] */ +#define RCC_APB1EN1_M4BTIM3EN (1U << 22) /* Bit[22] */ +#define RCC_APB1EN1_M7BTIM3LPEN (1U << 21) /* Bit[21] */ +#define RCC_APB1EN1_M4BTIM3LPEN (1U << 20) /* Bit[20] */ +#define RCC_APB1EN1_M7BTIM4EN (1U << 19) /* Bit[19] */ +#define RCC_APB1EN1_M4BTIM4EN (1U << 18) /* Bit[18] */ +#define RCC_APB1EN1_M7BTIM4LPEN (1U << 17) /* Bit[17] */ +#define RCC_APB1EN1_M4BTIM4LPEN (1U << 16) /* Bit[16] */ +#define RCC_APB1EN1_M7GTIMB1EN (1U << 15) /* Bit[15] */ +#define RCC_APB1EN1_M4GTIMB1EN (1U << 14) /* Bit[14] */ +#define RCC_APB1EN1_M7GTIMB1LPEN (1U << 13) /* Bit[13] */ +#define RCC_APB1EN1_M4GTIMB1LPEN (1U << 12) /* Bit[12] */ +#define RCC_APB1EN1_M7GTIMB2EN (1U << 11) /* Bit[11] */ +#define RCC_APB1EN1_M4GTIMB2EN (1U << 10) /* Bit[10] */ +#define RCC_APB1EN1_M7GTIMB2LPEN (1U << 9) /* Bit[9] */ +#define RCC_APB1EN1_M4GTIMB2LPEN (1U << 8) /* Bit[8] */ +#define RCC_APB1EN1_M7GTIMB3EN (1U << 7) /* Bit[7] */ +#define RCC_APB1EN1_M4GTIMB3EN (1U << 6) /* Bit[6] */ +#define RCC_APB1EN1_M7GTIMB3LPEN (1U << 5) /* Bit[5] */ +#define RCC_APB1EN1_M4GTIMB3LPEN (1U << 4) /* Bit[4] */ +#define RCC_APB1EN1_M7GTIMA4EN (1U << 3) /* Bit[3] */ +#define RCC_APB1EN1_M4GTIMA4EN (1U << 2) /* Bit[2] */ +#define RCC_APB1EN1_M7GTIMA4LPEN (1U << 1) /* Bit[1] */ +#define RCC_APB1EN1_M4GTIMA4LPEN (1U << 0) /* Bit[0] */ + +/* Bit definition for RCC_APB1EN2 register **********************************/ + +#define RCC_APB1EN2_M7GTIMA5EN (1U << 31) /* Bit[31] */ +#define RCC_APB1EN2_M4GTIMA5EN (1U << 30) /* Bit[30] */ +#define RCC_APB1EN2_M7GTIMA5LPEN (1U << 29) /* Bit[29] */ +#define RCC_APB1EN2_M4GTIMA5LPEN (1U << 28) /* Bit[28] */ +#define RCC_APB1EN2_M7GTIMA6EN (1U << 27) /* Bit[27] */ +#define RCC_APB1EN2_M4GTIMA6EN (1U << 26) /* Bit[26] */ +#define RCC_APB1EN2_M7GTIMA6LPEN (1U << 25) /* Bit[25] */ +#define RCC_APB1EN2_M4GTIMA6LPEN (1U << 24) /* Bit[24] */ +#define RCC_APB1EN2_M7GTIMA7EN (1U << 23) /* Bit[23] */ +#define RCC_APB1EN2_M4GTIMA7EN (1U << 22) /* Bit[22] */ +#define RCC_APB1EN2_M7GTIMA7LPEN (1U << 21) /* Bit[21] */ +#define RCC_APB1EN2_M4GTIMA7LPEN (1U << 20) /* Bit[20] */ +#define RCC_APB1EN2_M7SPI3EN (1U << 19) /* Bit[19] */ +#define RCC_APB1EN2_M4SPI3EN (1U << 18) /* Bit[18] */ +#define RCC_APB1EN2_M7SPI3LPEN (1U << 17) /* Bit[17] */ +#define RCC_APB1EN2_M4SPI3LPEN (1U << 16) /* Bit[16] */ +#define RCC_APB1EN2_M7DAC12EN (1U << 15) /* Bit[15] */ +#define RCC_APB1EN2_M4DAC12EN (1U << 14) /* Bit[14] */ +#define RCC_APB1EN2_M7DAC12LPEN (1U << 13) /* Bit[13] */ +#define RCC_APB1EN2_M4DAC12LPEN (1U << 12) /* Bit[12] */ +#define RCC_APB1EN2_M7WWDG2EN (1U << 7) /* Bit[7] */ +#define RCC_APB1EN2_M4WWDG2EN (1U << 6) /* Bit[6] */ +#define RCC_APB1EN2_M7WWDG2LPEN (1U << 5) /* Bit[5] */ +#define RCC_APB1EN2_M4WWDG2LPEN (1U << 4) /* Bit[4] */ + +/* Bit definition for RCC_APB1EN3 register **********************************/ + +#define RCC_APB1EN3_M7USART1EN (1U << 31) /* Bit[31] */ +#define RCC_APB1EN3_M4USART1EN (1U << 30) /* Bit[30] */ +#define RCC_APB1EN3_M7USART1LPEN (1U << 29) /* Bit[29] */ +#define RCC_APB1EN3_M4USART1LPEN (1U << 28) /* Bit[28] */ +#define RCC_APB1EN3_M7USART2EN (1U << 27) /* Bit[27] */ +#define RCC_APB1EN3_M4USART2EN (1U << 26) /* Bit[26] */ +#define RCC_APB1EN3_M7USART2LPEN (1U << 25) /* Bit[25] */ +#define RCC_APB1EN3_M4USART2LPEN (1U << 24) /* Bit[24] */ +#define RCC_APB1EN3_M7USART3EN (1U << 23) /* Bit[23] */ +#define RCC_APB1EN3_M4USART3EN (1U << 22) /* Bit[22] */ +#define RCC_APB1EN3_M7USART3LPEN (1U << 21) /* Bit[21] */ +#define RCC_APB1EN3_M4USART3LPEN (1U << 20) /* Bit[20] */ +#define RCC_APB1EN3_M7USART4EN (1U << 19) /* Bit[19] */ +#define RCC_APB1EN3_M4USART4EN (1U << 18) /* Bit[18] */ +#define RCC_APB1EN3_M7USART4LPEN (1U << 17) /* Bit[17] */ +#define RCC_APB1EN3_M4USART4LPEN (1U << 16) /* Bit[16] */ +#define RCC_APB1EN3_M7UART9EN (1U << 15) /* Bit[15] */ +#define RCC_APB1EN3_M4UART9EN (1U << 14) /* Bit[14] */ +#define RCC_APB1EN3_M7UART9LPEN (1U << 13) /* Bit[13] */ +#define RCC_APB1EN3_M4UART9LPEN (1U << 12) /* Bit[12] */ +#define RCC_APB1EN3_M7UART10EN (1U << 11) /* Bit[11] */ +#define RCC_APB1EN3_M4UART10EN (1U << 10) /* Bit[10] */ +#define RCC_APB1EN3_M7UART10LPEN (1U << 9) /* Bit[9] */ +#define RCC_APB1EN3_M4UART10LPEN (1U << 8) /* Bit[8] */ +#define RCC_APB1EN3_M7UART11EN (1U << 7) /* Bit[7] */ +#define RCC_APB1EN3_M4UART11EN (1U << 6) /* Bit[6] */ +#define RCC_APB1EN3_M7UART11LPEN (1U << 5) /* Bit[5] */ +#define RCC_APB1EN3_M4UART11LPEN (1U << 4) /* Bit[4] */ +#define RCC_APB1EN3_M7UART12EN (1U << 3) /* Bit[3] */ +#define RCC_APB1EN3_M4UART12EN (1U << 2) /* Bit[2] */ +#define RCC_APB1EN3_M7UART12LPEN (1U << 1) /* Bit[1] */ +#define RCC_APB1EN3_M4UART12LPEN (1U << 0) /* Bit[0] */ + +/* Bit definition for RCC_APB1EN4 register **********************************/ + +#define RCC_APB1EN4_M7I2S3EN (1U << 31) /* Bit[31] */ +#define RCC_APB1EN4_M4I2S3EN (1U << 30) /* Bit[30] */ +#define RCC_APB1EN4_M7I2S3LPEN (1U << 29) /* Bit[29] */ +#define RCC_APB1EN4_M4I2S3LPEN (1U << 28) /* Bit[28] */ +#define RCC_APB1EN4_M7I2S4EN (1U << 27) /* Bit[27] */ +#define RCC_APB1EN4_M4I2S4EN (1U << 26) /* Bit[26] */ +#define RCC_APB1EN4_M7I2S4LPEN (1U << 25) /* Bit[25] */ +#define RCC_APB1EN4_M4I2S4LPEN (1U << 24) /* Bit[24] */ +#define RCC_APB1EN4_M7I2C1EN (1U << 23) /* Bit[23] */ +#define RCC_APB1EN4_M4I2C1EN (1U << 22) /* Bit[22] */ +#define RCC_APB1EN4_M7I2C1LPEN (1U << 21) /* Bit[21] */ +#define RCC_APB1EN4_M4I2C1LPEN (1U << 20) /* Bit[20] */ +#define RCC_APB1EN4_M7I2C2EN (1U << 19) /* Bit[19] */ +#define RCC_APB1EN4_M4I2C2EN (1U << 18) /* Bit[18] */ +#define RCC_APB1EN4_M7I2C2LPEN (1U << 17) /* Bit[17] */ +#define RCC_APB1EN4_M4I2C2LPEN (1U << 16) /* Bit[16] */ +#define RCC_APB1EN4_M7I2C3EN (1U << 15) /* Bit[15] */ +#define RCC_APB1EN4_M4I2C3EN (1U << 14) /* Bit[14] */ +#define RCC_APB1EN4_M7I2C3LPEN (1U << 13) /* Bit[13] */ +#define RCC_APB1EN4_M4I2C3LPEN (1U << 12) /* Bit[12] */ + +/* Bit definition for RCC_APB1EN5 register **********************************/ + +#define RCC_APB1EN5_M7FDCAN1EN (1U << 31) /* Bit[31] */ +#define RCC_APB1EN5_M4FDCAN1EN (1U << 30) /* Bit[30] */ +#define RCC_APB1EN5_M7FDCAN1LPEN (1U << 29) /* Bit[29] */ +#define RCC_APB1EN5_M4FDCAN1LPEN (1U << 28) /* Bit[28] */ +#define RCC_APB1EN5_M7FDCAN2EN (1U << 27) /* Bit[27] */ +#define RCC_APB1EN5_M4FDCAN2EN (1U << 26) /* Bit[26] */ +#define RCC_APB1EN5_M7FDCAN2LPEN (1U << 25) /* Bit[25] */ +#define RCC_APB1EN5_M4FDCAN2LPEN (1U << 24) /* Bit[24] */ +#define RCC_APB1EN5_M7FDCAN5EN (1U << 23) /* Bit[23] */ +#define RCC_APB1EN5_M4FDCAN5EN (1U << 22) /* Bit[22] */ +#define RCC_APB1EN5_M7FDCAN5LPEN (1U << 21) /* Bit[21] */ +#define RCC_APB1EN5_M4FDCAN5LPEN (1U << 20) /* Bit[20] */ +#define RCC_APB1EN5_M7FDCAN6EN (1U << 19) /* Bit[19] */ +#define RCC_APB1EN5_M4FDCAN6EN (1U << 18) /* Bit[18] */ +#define RCC_APB1EN5_M7FDCAN6LPEN (1U << 17) /* Bit[17] */ +#define RCC_APB1EN5_M4FDCAN6LPEN (1U << 16) /* Bit[16] */ +#define RCC_APB1EN5_FDCAN1STPREQ (1U << 15) /* Bit[15] */ +#define RCC_APB1EN5_FDCAN1STPACK (1U << 14) /* Bit[14] */ +#define RCC_APB1EN5_FDCAN2STPREQ (1U << 11) /* Bit[11] */ +#define RCC_APB1EN5_FDCAN2STPACK (1U << 10) /* Bit[10] */ +#define RCC_APB1EN5_FDCAN5STPREQ (1U << 7) /* Bit[7] */ +#define RCC_APB1EN5_FDCAN5STPACK (1U << 6) /* Bit[6] */ +#define RCC_APB1EN5_FDCAN6STPREQ (1U << 3) /* Bit[3] */ +#define RCC_APB1EN5_FDCAN6STPACK (1U << 2) /* Bit[2] */ + +/* Bit definition for RCC_APB1RST1 register *********************************/ + +#define RCC_APB1RST1_BTIM1RST (1U << 28) /* Bit[28] */ +#define RCC_APB1RST1_BTIM2RST (1U << 24) /* Bit[24] */ +#define RCC_APB1RST1_BTIM3RST (1U << 20) /* Bit[20] */ +#define RCC_APB1RST1_BTIM4RST (1U << 16) /* Bit[16] */ +#define RCC_APB1RST1_GTIMB1RST (1U << 12) /* Bit[12] */ +#define RCC_APB1RST1_GTIMB2RST (1U << 8) /* Bit[8] */ +#define RCC_APB1RST1_GTIMB3RST (1U << 4) /* Bit[4] */ +#define RCC_APB1RST1_GTIMA4RST (1U << 0) /* Bit[0] */ + +/* Bit definition for RCC_APB1RST2 register *********************************/ + +#define RCC_APB1RST2_GTIMA5RST (1U << 28) /* Bit[28] */ +#define RCC_APB1RST2_GTIMA6RST (1U << 24) /* Bit[24] */ +#define RCC_APB1RST2_GTIMA7RST (1U << 20) /* Bit[20] */ +#define RCC_APB1RST2_SPI3RST (1U << 16) /* Bit[16] */ +#define RCC_APB1RST2_DAC12RST (1U << 12) /* Bit[12] */ +#define RCC_APB1RST2_WWDG2RST (1U << 4) /* Bit[4] */ + +/* Bit definition for RCC_APB1RST3 register *********************************/ + +#define RCC_APB1RST3_USART1RST (1U << 28) /* Bit[28] */ +#define RCC_APB1RST3_USART2RST (1U << 24) /* Bit[24] */ +#define RCC_APB1RST3_USART3RST (1U << 20) /* Bit[20] */ +#define RCC_APB1RST3_USART4RST (1U << 16) /* Bit[16] */ +#define RCC_APB1RST3_UART9RST (1U << 12) /* Bit[12] */ +#define RCC_APB1RST3_UART10RST (1U << 8) /* Bit[8] */ +#define RCC_APB1RST3_UART11RST (1U << 4) /* Bit[4] */ +#define RCC_APB1RST3_UART12RST (1U << 0) /* Bit[0] */ + +/* Bit definition for RCC_APB1RST4 register *********************************/ + +#define RCC_APB1RST4_I2S3RST (1U << 28) /* Bit[28] */ +#define RCC_APB1RST4_I2S4RST (1U << 24) /* Bit[24] */ +#define RCC_APB1RST4_I2C1RST (1U << 20) /* Bit[20] */ +#define RCC_APB1RST4_I2C2RST (1U << 16) /* Bit[16] */ +#define RCC_APB1RST4_I2C3RST (1U << 12) /* Bit[12] */ + +/* Bit definition for RCC_APB1RST5 register *********************************/ + +#define RCC_APB1RST5_FDCAN1RST (1U << 28) /* Bit[28] */ +#define RCC_APB1RST5_FDCAN2RST (1U << 24) /* Bit[24] */ +#define RCC_APB1RST5_FDCAN5RST (1U << 20) /* Bit[20] */ +#define RCC_APB1RST5_FDCAN6RST (1U << 16) /* Bit[16] */ +#define RCC_APB1RST5_CAHIRST (1U << 4) /* Bit[4] */ +#define RCC_APB1RST5_CAHDRST (1U << 0) /* Bit[0] */ + +/* Bit definition for RCC_AHB2DIV1 register *********************************/ + +/* Bit[31:28] ETH1SYSDIV */ +#define RCC_AHB2DIV1_ETH1SYSDIV_SHIFT (28) +#define RCC_AHB2DIV1_ETH1SYSDIV_MASK (0x0F << RCC_AHB2DIV1_ETH1SYSDIV_SHIFT) +#define RCC_AHB2DIV1_ETH1SYSDIV_DIV1 (0x00000000U << RCC_AHB2DIV1_ETH1SYSDIV_SHIFT) +#define RCC_AHB2DIV1_ETH1SYSDIV_DIV2 (0x00000001U << RCC_AHB2DIV1_ETH1SYSDIV_SHIFT) +#define RCC_AHB2DIV1_ETH1SYSDIV_DIV4 (0x00000002U << RCC_AHB2DIV1_ETH1SYSDIV_SHIFT) +#define RCC_AHB2DIV1_ETH1SYSDIV_DIV8 (0x00000004U << RCC_AHB2DIV1_ETH1SYSDIV_SHIFT) +#define RCC_AHB2DIV1_ETH1SYSDIV_DIV16 (0x00000007U << RCC_AHB2DIV1_ETH1SYSDIV_SHIFT) +#define RCC_AHB2DIV1_ETH1SYSDIV_DIV32 (0x00000008U << RCC_AHB2DIV1_ETH1SYSDIV_SHIFT) +#define RCC_AHB2DIV1_ETH1SYSDIV_DIV64 (0x00000009U << RCC_AHB2DIV1_ETH1SYSDIV_SHIFT) +#define RCC_AHB2DIV1_ETH1SYSDIV_DIV128 (0x0000000AU << RCC_AHB2DIV1_ETH1SYSDIV_SHIFT) +#define RCC_AHB2DIV1_ETH1SYSDIV_DIV256 (0x0000000BU << RCC_AHB2DIV1_ETH1SYSDIV_SHIFT) +#define RCC_AHB2DIV1_ETH1SYSDIV_DIV512 (0x0000000CU << RCC_AHB2DIV1_ETH1SYSDIV_SHIFT) + +/* Bit[27:24] USBHSEDIV */ +#define RCC_AHB2DIV1_USBHSEDIV_SHIFT (24) +#define RCC_AHB2DIV1_USBHSEDIV_MASK (0x0F << RCC_AHB2DIV1_USBHSEDIV_SHIFT) +#define RCC_AHB2DIV1_USBHSEDIV_DIV1 (0x00000000U << RCC_AHB2DIV1_USBHSEDIV_SHIFT) +#define RCC_AHB2DIV1_USBHSEDIV_DIV2 (0x00000001U << RCC_AHB2DIV1_USBHSEDIV_SHIFT) +#define RCC_AHB2DIV1_USBHSEDIV_DIV4 (0x00000002U << RCC_AHB2DIV1_USBHSEDIV_SHIFT) +#define RCC_AHB2DIV1_USBHSEDIV_DIV8 (0x00000004U << RCC_AHB2DIV1_USBHSEDIV_SHIFT) +#define RCC_AHB2DIV1_USBHSEDIV_DIV16 (0x00000007U << RCC_AHB2DIV1_USBHSEDIV_SHIFT) +#define RCC_AHB2DIV1_USBHSEDIV_DIV32 (0x00000008U << RCC_AHB2DIV1_USBHSEDIV_SHIFT) +#define RCC_AHB2DIV1_USBHSEDIV_DIV64 (0x00000009U << RCC_AHB2DIV1_USBHSEDIV_SHIFT) +#define RCC_AHB2DIV1_USBHSEDIV_DIV128 (0x0000000AU << RCC_AHB2DIV1_USBHSEDIV_SHIFT) +#define RCC_AHB2DIV1_USBHSEDIV_DIV256 (0x0000000BU << RCC_AHB2DIV1_USBHSEDIV_SHIFT) +#define RCC_AHB2DIV1_USBHSEDIV_DIV512 (0x0000000CU << RCC_AHB2DIV1_USBHSEDIV_SHIFT) + +/* Bit definition for RCC_AHB2SEL1 register *********************************/ + +/* Bit[21:20] ETH1PTPSEL */ +#define RCC_AHB2SEL1_ETH1PTPSEL_SHIFT (20) +#define RCC_AHB2SEL1_ETH1PTPSEL_MASK (0x03 << RCC_AHB2SEL1_ETH1PTPSEL_SHIFT) +#define RCC_AHB2SEL1_ETH1PTPSEL_SYSCLK (0x00000000U << RCC_AHB2SEL1_ETH1PTPSEL_SHIFT) +#define RCC_AHB2SEL1_ETH1PTPSEL_PERIPH (0x00000001U << RCC_AHB2SEL1_ETH1PTPSEL_SHIFT) +#define RCC_AHB2SEL1_ETH1PTPSEL_PLL2C (0x00000002U << RCC_AHB2SEL1_ETH1PTPSEL_SHIFT) +#define RCC_AHB2SEL1_ETH1PTPSEL_PLL3A (0x00000003U << RCC_AHB2SEL1_ETH1PTPSEL_SHIFT) + +/* Bit[18:16] ETH1GMIITXSEL */ +#define RCC_AHB2SEL1_ETH1GMIITXSEL_SHIFT (16) +#define RCC_AHB2SEL1_ETH1GMIITXSEL_MASK (0x07 << RCC_AHB2SEL1_ETH1GMIITXSEL_SHIFT) +#define RCC_AHB2SEL1_ETH1GMIITXSEL_PLL3A (0x00000000U << RCC_AHB2SEL1_ETH1GMIITXSEL_SHIFT) +#define RCC_AHB2SEL1_ETH1GMIITXSEL_PLL2B (0x00000001U << RCC_AHB2SEL1_ETH1GMIITXSEL_SHIFT) +#define RCC_AHB2SEL1_ETH1GMIITXSEL_PAD (0x00000002U << RCC_AHB2SEL1_ETH1GMIITXSEL_SHIFT) +#define RCC_AHB2SEL1_ETH1GMIITXSEL_PLL1C (0x00000003U << RCC_AHB2SEL1_ETH1GMIITXSEL_SHIFT) + +/* Bit definition for RCC_AHB2EN1 register **********************************/ + +#define RCC_AHB2EN1_M7USB1EN (1U << 23) /* Bit[23] */ +#define RCC_AHB2EN1_M4USB1EN (1U << 22) /* Bit[22] */ +#define RCC_AHB2EN1_M7USB1LPEN (1U << 21) /* Bit[21] */ +#define RCC_AHB2EN1_M4USB1LPEN (1U << 20) /* Bit[20] */ +#define RCC_AHB2EN1_M7ECCM2EN (1U << 15) /* Bit[15] */ +#define RCC_AHB2EN1_M4ECCM2EN (1U << 14) /* Bit[14] */ +#define RCC_AHB2EN1_M7ECCM2LPEN (1U << 13) /* Bit[13] */ +#define RCC_AHB2EN1_M4ECCM2LPEN (1U << 12) /* Bit[12] */ +#define RCC_AHB2EN1_M7CORDICEN (1U << 11) /* Bit[11] */ +#define RCC_AHB2EN1_M4CORDICEN (1U << 10) /* Bit[10] */ +#define RCC_AHB2EN1_M7CORDICLPEN (1U << 9) /* Bit[9] */ +#define RCC_AHB2EN1_M4CORDICLPEN (1U << 8) /* Bit[8] */ +#define RCC_AHB2EN1_M7SDPUEN (1U << 7) /* Bit[7] */ +#define RCC_AHB2EN1_M4SDPUEN (1U << 6) /* Bit[6] */ +#define RCC_AHB2EN1_M7SDPULPEN (1U << 5) /* Bit[5] */ +#define RCC_AHB2EN1_M4SDPULPEN (1U << 4) /* Bit[4] */ +#define RCC_AHB2EN1_M7FMACEN (1U << 3) /* Bit[3] */ +#define RCC_AHB2EN1_M4FMACEN (1U << 2) /* Bit[2] */ +#define RCC_AHB2EN1_M7FMACLPEN (1U << 1) /* Bit[1] */ +#define RCC_AHB2EN1_M4FMACLPEN (1U << 0) /* Bit[0] */ + +/* Bit definition for RCC_AHB2EN2 register **********************************/ + +#define RCC_AHB2EN2_M7DAC56EN (1U << 23) /* Bit[23] */ +#define RCC_AHB2EN2_M4DAC56EN (1U << 22) /* Bit[22] */ +#define RCC_AHB2EN2_M7DAC56LPEN (1U << 21) /* Bit[21] */ +#define RCC_AHB2EN2_M4DAC56LPEN (1U << 20) /* Bit[20] */ +#define RCC_AHB2EN2_M7DAC34EN (1U << 19) /* Bit[19] */ +#define RCC_AHB2EN2_M4DAC34EN (1U << 18) /* Bit[18] */ +#define RCC_AHB2EN2_M7DAC34LPEN (1U << 17) /* Bit[17] */ +#define RCC_AHB2EN2_M4DAC34LPEN (1U << 16) /* Bit[16] */ +#define RCC_AHB2EN2_M7ETH1TEN (1U << 11) /* Bit[11] */ +#define RCC_AHB2EN2_M4ETH1TEN (1U << 10) /* Bit[10] */ +#define RCC_AHB2EN2_M7ETH1TLPEN (1U << 9) /* Bit[9] */ +#define RCC_AHB2EN2_M4ETH1TLPEN (1U << 8) /* Bit[8] */ +#define RCC_AHB2EN2_M7ETH1REN (1U << 7) /* Bit[7] */ +#define RCC_AHB2EN2_M4ETH1REN (1U << 6) /* Bit[6] */ +#define RCC_AHB2EN2_M7ETH1RLPEN (1U << 5) /* Bit[5] */ +#define RCC_AHB2EN2_M4ETH1RLPEN (1U << 4) /* Bit[4] */ +#define RCC_AHB2EN2_M7ETH1MEN (1U << 3) /* Bit[3] */ +#define RCC_AHB2EN2_M4ETH1MEN (1U << 2) /* Bit[2] */ +#define RCC_AHB2EN2_M7ETH1MLPEN (1U << 1) /* Bit[1] */ +#define RCC_AHB2EN2_M4ETH1MLPEN (1U << 0) /* Bit[0] */ + +/* Bit definition for RCC_AHB2RST1 register *********************************/ + +#define RCC_AHB2RST1_DAC56RST (1U << 25) /* Bit[25] */ +#define RCC_AHB2RST1_DAC34RST (1U << 24) /* Bit[24] */ +#define RCC_AHB2RST1_USB1WRAPRST (1U << 22) /* Bit[22] */ +#define RCC_AHB2RST1_USB1PORRST (1U << 21) /* Bit[21] */ +#define RCC_AHB2RST1_USB1RST (1U << 20) /* Bit[20] */ +#define RCC_AHB2RST1_ECCM2RST (1U << 12) /* Bit[12] */ +#define RCC_AHB2RST1_CORDICRST (1U << 8) /* Bit[8] */ +#define RCC_AHB2RST1_SDPURST (1U << 4) /* Bit[4] */ +#define RCC_AHB2RST1_FMACRST (1U << 0) /* Bit[0] */ + +/* Bit definition for RCC_APB2DIV1 register *********************************/ + +/* Bit[31:28] APB2ATIMDIV */ +#define RCC_APB2DIV1_APB2ATIMDIV_SHIFT (28) +#define RCC_APB2DIV1_APB2ATIMDIV_MASK (0x0F << RCC_APB2DIV1_APB2ATIMDIV_SHIFT) +#define RCC_APB2DIV1_APB2ATIMDIV_DIV1 (0x00000000U << RCC_APB2DIV1_APB2ATIMDIV_SHIFT) +#define RCC_APB2DIV1_APB2ATIMDIV_DIV2 (0x00000004U << RCC_APB2DIV1_APB2ATIMDIV_SHIFT) +#define RCC_APB2DIV1_APB2ATIMDIV_DIV4 (0x00000005U << RCC_APB2DIV1_APB2ATIMDIV_SHIFT) +#define RCC_APB2DIV1_APB2ATIMDIV_DIV8 (0x00000006U << RCC_APB2DIV1_APB2ATIMDIV_SHIFT) +#define RCC_APB2DIV1_APB2ATIMDIV_DIV16 (0x00000007U << RCC_APB2DIV1_APB2ATIMDIV_SHIFT) + +/* Bit[26:24] APB2GTIMDIV */ +#define RCC_APB2DIV1_APB2GTIMDIV_SHIFT (24) +#define RCC_APB2DIV1_APB2GTIMDIV_MASK (0x07 << RCC_APB2DIV1_APB2GTIMDIV_SHIFT) +#define RCC_APB2DIV1_APB2GTIMDIV_DIV1 (0x00000000U << RCC_APB2DIV1_APB2GTIMDIV_SHIFT) +#define RCC_APB2DIV1_APB2GTIMDIV_DIV2 (0x00000004U << RCC_APB2DIV1_APB2GTIMDIV_SHIFT) +#define RCC_APB2DIV1_APB2GTIMDIV_DIV4 (0x00000005U << RCC_APB2DIV1_APB2GTIMDIV_SHIFT) +#define RCC_APB2DIV1_APB2GTIMDIV_DIV8 (0x00000006U << RCC_APB2DIV1_APB2GTIMDIV_SHIFT) +#define RCC_APB2DIV1_APB2GTIMDIV_DIV16 (0x00000007U << RCC_APB2DIV1_APB2GTIMDIV_SHIFT) + +/* Bit[18:16] APB2I2SDIV */ +#define RCC_APB2DIV1_APB2I2SDIV_SHIFT (16) +#define RCC_APB2DIV1_APB2I2SDIV_MASK (0x07 << RCC_APB2DIV1_APB2I2SDIV_SHIFT) +#define RCC_APB2DIV1_APB2I2SDIV_DIV1 (0x00000000U << RCC_APB2DIV1_APB2I2SDIV_SHIFT) +#define RCC_APB2DIV1_APB2I2SDIV_DIV2 (0x00000004U << RCC_APB2DIV1_APB2I2SDIV_SHIFT) +#define RCC_APB2DIV1_APB2I2SDIV_DIV4 (0x00000005U << RCC_APB2DIV1_APB2I2SDIV_SHIFT) +#define RCC_APB2DIV1_APB2I2SDIV_DIV8 (0x00000006U << RCC_APB2DIV1_APB2I2SDIV_SHIFT) +#define RCC_APB2DIV1_APB2I2SDIV_DIV16 (0x00000007U << RCC_APB2DIV1_APB2I2SDIV_SHIFT) + +/* Bit[14:12] APB2DSMUDIV */ +#define RCC_APB2DIV1_APB2DSMUDIV_SHIFT (12) +#define RCC_APB2DIV1_APB2DSMUDIV_MASK (0x07 << RCC_APB2DIV1_APB2DSMUDIV_SHIFT) +#define RCC_APB2DIV1_APB2DSMUDIV_DIV1 (0x00000000U << RCC_APB2DIV1_APB2DSMUDIV_SHIFT) +#define RCC_APB2DIV1_APB2DSMUDIV_DIV2 (0x00000004U << RCC_APB2DIV1_APB2DSMUDIV_SHIFT) +#define RCC_APB2DIV1_APB2DSMUDIV_DIV4 (0x00000005U << RCC_APB2DIV1_APB2DSMUDIV_SHIFT) +#define RCC_APB2DIV1_APB2DSMUDIV_DIV8 (0x00000006U << RCC_APB2DIV1_APB2DSMUDIV_SHIFT) +#define RCC_APB2DIV1_APB2DSMUDIV_DIV16 (0x00000007U << RCC_APB2DIV1_APB2DSMUDIV_SHIFT) + +/* Bit[10:8] APB2I2CDIV */ +#define RCC_APB2DIV1_APB2I2CDIV_SHIFT (8) +#define RCC_APB2DIV1_APB2I2CDIV_MASK (0x07 << RCC_APB2DIV1_APB2I2CDIV_SHIFT) +#define RCC_APB2DIV1_APB2I2CDIV_DIV1 (0x00000000U << RCC_APB2DIV1_APB2I2CDIV_SHIFT) +#define RCC_APB2DIV1_APB2I2CDIV_DIV2 (0x00000004U << RCC_APB2DIV1_APB2I2CDIV_SHIFT) +#define RCC_APB2DIV1_APB2I2CDIV_DIV4 (0x00000005U << RCC_APB2DIV1_APB2I2CDIV_SHIFT) +#define RCC_APB2DIV1_APB2I2CDIV_DIV8 (0x00000006U << RCC_APB2DIV1_APB2I2CDIV_SHIFT) +#define RCC_APB2DIV1_APB2I2CDIV_DIV16 (0x00000007U << RCC_APB2DIV1_APB2I2CDIV_SHIFT) + +/* Bit[6:4] APB2FDCANDIV */ +#define RCC_APB2DIV1_APB2FDCANDIV_SHIFT (4) +#define RCC_APB2DIV1_APB2FDCANDIV_MASK (0x07 << RCC_APB2DIV1_APB2FDCANDIV_SHIFT) +#define RCC_APB2DIV1_APB2FDCANDIV_DIV1 (0x00000000U << RCC_APB2DIV1_APB2FDCANDIV_SHIFT) +#define RCC_APB2DIV1_APB2FDCANDIV_DIV2 (0x00000004U << RCC_APB2DIV1_APB2FDCANDIV_SHIFT) +#define RCC_APB2DIV1_APB2FDCANDIV_DIV4 (0x00000005U << RCC_APB2DIV1_APB2FDCANDIV_SHIFT) +#define RCC_APB2DIV1_APB2FDCANDIV_DIV8 (0x00000006U << RCC_APB2DIV1_APB2FDCANDIV_SHIFT) +#define RCC_APB2DIV1_APB2FDCANDIV_DIV16 (0x00000007U << RCC_APB2DIV1_APB2FDCANDIV_SHIFT) + +/* Bit definition for RCC_APB2SEL1 register *********************************/ + +/* Bit[20:18] DSMUKERASEL */ +#define RCC_APB2SEL1_DSMUKERASEL_SHIFT (18) +#define RCC_APB2SEL1_DSMUKERASEL_MASK (0x07 << RCC_APB2SEL1_DSMUKERASEL_SHIFT) +#define RCC_APB2SEL1_DSMUKERASEL_SYSCLK (0x00000000U << RCC_APB2SEL1_DSMUKERASEL_SHIFT) +#define RCC_APB2SEL1_DSMUKERASEL_PLL1B (0x00000001U << RCC_APB2SEL1_DSMUKERASEL_SHIFT) +#define RCC_APB2SEL1_DSMUKERASEL_PLL2B (0x00000002U << RCC_APB2SEL1_DSMUKERASEL_SHIFT) +#define RCC_APB2SEL1_DSMUKERASEL_PLL3A (0x00000003U << RCC_APB2SEL1_DSMUKERASEL_SHIFT) +#define RCC_APB2SEL1_DSMUKERASEL_I2SCKIN (0x00000004U << RCC_APB2SEL1_DSMUKERASEL_SHIFT) +#define RCC_APB2SEL1_DSMUKERASEL_PERIPH (0x00000005U << RCC_APB2SEL1_DSMUKERASEL_SHIFT) + +/* Bit[14:12] I2C4KERSEL */ +#define RCC_APB2SEL1_I2C4KERSEL_SHIFT (12) +#define RCC_APB2SEL1_I2C4KERSEL_MASK (0x07 << RCC_APB2SEL1_I2C4KERSEL_SHIFT) +#define RCC_APB2SEL1_I2C4KERSEL_SYSCLK (0x00000000U << RCC_APB2SEL1_I2C4KERSEL_SHIFT) +#define RCC_APB2SEL1_I2C4KERSEL_PLL3C (0x00000001U << RCC_APB2SEL1_I2C4KERSEL_SHIFT) +#define RCC_APB2SEL1_I2C4KERSEL_HSI (0x00000002U << RCC_APB2SEL1_I2C4KERSEL_SHIFT) +#define RCC_APB2SEL1_I2C4KERSEL_MSI (0x00000003U << RCC_APB2SEL1_I2C4KERSEL_SHIFT) + +/* Bit[10:8] I2C5KERSEL */ +#define RCC_APB2SEL1_I2C5KERSEL_SHIFT (8) +#define RCC_APB2SEL1_I2C5KERSEL_MASK (0x07 << RCC_APB2SEL1_I2C5KERSEL_SHIFT) +#define RCC_APB2SEL1_I2C5KERSEL_SYSCLK (0x00000000U << RCC_APB2SEL1_I2C5KERSEL_SHIFT) +#define RCC_APB2SEL1_I2C5KERSEL_PLL3C (0x00000001U << RCC_APB2SEL1_I2C5KERSEL_SHIFT) +#define RCC_APB2SEL1_I2C5KERSEL_HSI (0x00000002U << RCC_APB2SEL1_I2C5KERSEL_SHIFT) +#define RCC_APB2SEL1_I2C5KERSEL_MSI (0x00000003U << RCC_APB2SEL1_I2C5KERSEL_SHIFT) + +/* Bit[6:4] I2C6KERSEL */ +#define RCC_APB2SEL1_I2C6KERSEL_SHIFT (4) +#define RCC_APB2SEL1_I2C6KERSEL_MASK (0x07 << RCC_APB2SEL1_I2C6KERSEL_SHIFT) +#define RCC_APB2SEL1_I2C6KERSEL_SYSCLK (0x00000000U << RCC_APB2SEL1_I2C6KERSEL_SHIFT) +#define RCC_APB2SEL1_I2C6KERSEL_PLL3C (0x00000001U << RCC_APB2SEL1_I2C6KERSEL_SHIFT) +#define RCC_APB2SEL1_I2C6KERSEL_HSI (0x00000002U << RCC_APB2SEL1_I2C6KERSEL_SHIFT) +#define RCC_APB2SEL1_I2C6KERSEL_MSI (0x00000003U << RCC_APB2SEL1_I2C6KERSEL_SHIFT) + +/* Bit[2:0] I2S2KERSEL */ +#define RCC_APB2SEL1_I2S2KERSEL_SHIFT (0) +#define RCC_APB2SEL1_I2S2KERSEL_MASK (0x03 << RCC_APB2SEL1_I2S2KERSEL_SHIFT) +#define RCC_APB2SEL1_I2S2KERSEL_SYSCLK (0x00000000U << RCC_APB2SEL1_I2S2KERSEL_SHIFT) +#define RCC_APB2SEL1_I2S2KERSEL_PLL3B (0x00000001U << RCC_APB2SEL1_I2S2KERSEL_SHIFT) +#define RCC_APB2SEL1_I2S2KERSEL_HSI (0x00000002U << RCC_APB2SEL1_I2S2KERSEL_SHIFT) +#define RCC_APB2SEL1_I2S2KERSEL_I2S2CKIN (0x00000003U << RCC_APB2SEL1_I2S2KERSEL_SHIFT) + +/* Bit definition for RCC_APB2SEL2 register *********************************/ + +/* Bit[28:26] FDCAN3KERSEL */ +#define RCC_APB2SEL2_FDCAN3KERSEL_SHIFT (26) +#define RCC_APB2SEL2_FDCAN3KERSEL_MASK (0x07 << RCC_APB2SEL2_FDCAN3KERSEL_SHIFT) +#define RCC_APB2SEL2_FDCAN3KERSEL_SYSCLK (0x00000000U << RCC_APB2SEL2_FDCAN3KERSEL_SHIFT) +#define RCC_APB2SEL2_FDCAN3KERSEL_PLL1C (0x00000001U << RCC_APB2SEL2_FDCAN3KERSEL_SHIFT) +#define RCC_APB2SEL2_FDCAN3KERSEL_PLL2C (0x00000002U << RCC_APB2SEL2_FDCAN3KERSEL_SHIFT) +#define RCC_APB2SEL2_FDCAN3KERSEL_PLL3B (0x00000003U << RCC_APB2SEL2_FDCAN3KERSEL_SHIFT) +#define RCC_APB2SEL2_FDCAN3KERSEL_PERIPH (0x00000004U << RCC_APB2SEL2_FDCAN3KERSEL_SHIFT) + +/* Bit[22:20] FDCAN4KERSEL */ +#define RCC_APB2SEL2_FDCAN4KERSEL_SHIFT (20) +#define RCC_APB2SEL2_FDCAN4KERSEL_MASK (0x07 << RCC_APB2SEL2_FDCAN4KERSEL_SHIFT) +#define RCC_APB2SEL2_FDCAN4KERSEL_SYSCLK (0x00000000U << RCC_APB2SEL2_FDCAN4KERSEL_SHIFT) +#define RCC_APB2SEL2_FDCAN4KERSEL_PLL1C (0x00000001U << RCC_APB2SEL2_FDCAN4KERSEL_SHIFT) +#define RCC_APB2SEL2_FDCAN4KERSEL_PLL2C (0x00000002U << RCC_APB2SEL2_FDCAN4KERSEL_SHIFT) +#define RCC_APB2SEL2_FDCAN4KERSEL_PLL3B (0x00000003U << RCC_APB2SEL2_FDCAN4KERSEL_SHIFT) +#define RCC_APB2SEL2_FDCAN4KERSEL_PERIPH (0x00000004U << RCC_APB2SEL2_FDCAN4KERSEL_SHIFT) + +/* Bit[14:12] FDCAN7KERSEL */ +#define RCC_APB2SEL2_FDCAN7KERSEL_SHIFT (12) +#define RCC_APB2SEL2_FDCAN7KERSEL_MASK (0x07 << RCC_APB2SEL2_FDCAN7KERSEL_SHIFT) +#define RCC_APB2SEL2_FDCAN7KERSEL_SYSCLK (0x00000000U << RCC_APB2SEL2_FDCAN7KERSEL_SHIFT) +#define RCC_APB2SEL2_FDCAN7KERSEL_PLL1C (0x00000001U << RCC_APB2SEL2_FDCAN7KERSEL_SHIFT) +#define RCC_APB2SEL2_FDCAN7KERSEL_PLL2C (0x00000002U << RCC_APB2SEL2_FDCAN7KERSEL_SHIFT) +#define RCC_APB2SEL2_FDCAN7KERSEL_PLL3B (0x00000003U << RCC_APB2SEL2_FDCAN7KERSEL_SHIFT) +#define RCC_APB2SEL2_FDCAN7KERSEL_PERIPH (0x00000004U << RCC_APB2SEL2_FDCAN7KERSEL_SHIFT) + +/* Bit[6:4] FDCAN8KERSEL */ +#define RCC_APB2SEL2_FDCAN8KERSEL_SHIFT (4) +#define RCC_APB2SEL2_FDCAN8KERSEL_MASK (0x07 << RCC_APB2SEL2_FDCAN8KERSEL_SHIFT) +#define RCC_APB2SEL2_FDCAN8KERSEL_SYSCLK (0x00000000U << RCC_APB2SEL2_FDCAN8KERSEL_SHIFT) +#define RCC_APB2SEL2_FDCAN8KERSEL_PLL1C (0x00000001U << RCC_APB2SEL2_FDCAN8KERSEL_SHIFT) +#define RCC_APB2SEL2_FDCAN8KERSEL_PLL2C (0x00000002U << RCC_APB2SEL2_FDCAN8KERSEL_SHIFT) +#define RCC_APB2SEL2_FDCAN8KERSEL_PLL3B (0x00000003U << RCC_APB2SEL2_FDCAN8KERSEL_SHIFT) +#define RCC_APB2SEL2_FDCAN8KERSEL_PERIPH (0x00000004U << RCC_APB2SEL2_FDCAN8KERSEL_SHIFT) + +/* Bit definition for RCC_APB2EN1 register **********************************/ + +#define RCC_APB2EN1_M7ATIM1EN (1U << 31) /* Bit[31] */ +#define RCC_APB2EN1_M4ATIM1EN (1U << 30) /* Bit[30] */ +#define RCC_APB2EN1_M7ATIM1LPEN (1U << 29) /* Bit[29] */ +#define RCC_APB2EN1_M4ATIM1LPEN (1U << 28) /* Bit[28] */ +#define RCC_APB2EN1_M7ATIM2EN (1U << 27) /* Bit[27] */ +#define RCC_APB2EN1_M4ATIM2EN (1U << 26) /* Bit[26] */ +#define RCC_APB2EN1_M7ATIM2LPEN (1U << 25) /* Bit[25] */ +#define RCC_APB2EN1_M4ATIM2LPEN (1U << 24) /* Bit[24] */ +#define RCC_APB2EN1_M7GTIMA1EN (1U << 23) /* Bit[23] */ +#define RCC_APB2EN1_M4GTIMA1EN (1U << 22) /* Bit[22] */ +#define RCC_APB2EN1_M7GTIMA1LPEN (1U << 21) /* Bit[21] */ +#define RCC_APB2EN1_M4GTIMA1LPEN (1U << 20) /* Bit[20] */ +#define RCC_APB2EN1_M7GTIMA2EN (1U << 19) /* Bit[19] */ +#define RCC_APB2EN1_M4GTIMA2EN (1U << 18) /* Bit[18] */ +#define RCC_APB2EN1_M7GTIMA2LPEN (1U << 17) /* Bit[17] */ +#define RCC_APB2EN1_M4GTIMA2LPEN (1U << 16) /* Bit[16] */ +#define RCC_APB2EN1_M7GTIMA3EN (1U << 15) /* Bit[15] */ +#define RCC_APB2EN1_M4GTIMA3EN (1U << 14) /* Bit[14] */ +#define RCC_APB2EN1_M7GTIMA3LPEN (1U << 13) /* Bit[13] */ +#define RCC_APB2EN1_M4GTIMA3LPEN (1U << 12) /* Bit[12] */ +#define RCC_APB2EN1_M7SHRTIM1EN (1U << 11) /* Bit[11] */ +#define RCC_APB2EN1_M4SHRTIM1EN (1U << 10) /* Bit[10] */ +#define RCC_APB2EN1_M7SHRTIM1LPEN (1U << 9) /* Bit[9] */ +#define RCC_APB2EN1_M4SHRTIM1LPEN (1U << 8) /* Bit[8] */ +#define RCC_APB2EN1_M7SHRTIM2EN (1U << 7) /* Bit[7] */ +#define RCC_APB2EN1_M4SHRTIM2EN (1U << 6) /* Bit[6] */ +#define RCC_APB2EN1_M7SHRTIM2LPEN (1U << 5) /* Bit[5] */ +#define RCC_APB2EN1_M4SHRTIM2LPEN (1U << 4) /* Bit[4] */ + +/* Bit definition for RCC_APB2EN2 register **********************************/ + +#define RCC_APB2EN2_M7I2S1EN (1U << 31) /* Bit[31] */ +#define RCC_APB2EN2_M4I2S1EN (1U << 30) /* Bit[30] */ +#define RCC_APB2EN2_M7I2S1LPEN (1U << 29) /* Bit[29] */ +#define RCC_APB2EN2_M4I2S1LPEN (1U << 28) /* Bit[28] */ +#define RCC_APB2EN2_M7I2S2EN (1U << 27) /* Bit[27] */ +#define RCC_APB2EN2_M4I2S2EN (1U << 26) /* Bit[26] */ +#define RCC_APB2EN2_M7I2S2LPEN (1U << 25) /* Bit[25] */ +#define RCC_APB2EN2_M4I2S2LPEN (1U << 24) /* Bit[24] */ +#define RCC_APB2EN2_M7SPI1EN (1U << 23) /* Bit[23] */ +#define RCC_APB2EN2_M4SPI1EN (1U << 22) /* Bit[22] */ +#define RCC_APB2EN2_M7SPI1LPEN (1U << 21) /* Bit[21] */ +#define RCC_APB2EN2_M4SPI1LPEN (1U << 20) /* Bit[20] */ +#define RCC_APB2EN2_M7SPI2EN (1U << 19) /* Bit[19] */ +#define RCC_APB2EN2_M4SPI2EN (1U << 18) /* Bit[18] */ +#define RCC_APB2EN2_M7SPI2LPEN (1U << 17) /* Bit[17] */ +#define RCC_APB2EN2_M4SPI2LPEN (1U << 16) /* Bit[16] */ +#define RCC_APB2EN2_M7DSMUEN (1U << 15) /* Bit[15] */ +#define RCC_APB2EN2_M4DSMUEN (1U << 14) /* Bit[14] */ +#define RCC_APB2EN2_M7DSMULPEN (1U << 13) /* Bit[13] */ +#define RCC_APB2EN2_M4DSMULPEN (1U << 12) /* Bit[12] */ +#define RCC_APB2EN2_M7I2C4EN (1U << 11) /* Bit[11] */ +#define RCC_APB2EN2_M4I2C4EN (1U << 10) /* Bit[10] */ +#define RCC_APB2EN2_M7I2C4LPEN (1U << 9) /* Bit[9] */ +#define RCC_APB2EN2_M4I2C4LPEN (1U << 8) /* Bit[8] */ +#define RCC_APB2EN2_M7I2C5EN (1U << 7) /* Bit[7] */ +#define RCC_APB2EN2_M4I2C5EN (1U << 6) /* Bit[6] */ +#define RCC_APB2EN2_M7I2C5LPEN (1U << 5) /* Bit[5] */ +#define RCC_APB2EN2_M4I2C5LPEN (1U << 4) /* Bit[4] */ +#define RCC_APB2EN2_M7I2C6EN (1U << 3) /* Bit[3] */ +#define RCC_APB2EN2_M4I2C6EN (1U << 2) /* Bit[2] */ +#define RCC_APB2EN2_M7I2C6LPEN (1U << 1) /* Bit[1] */ +#define RCC_APB2EN2_M4I2C6LPEN (1U << 0) /* Bit[0] */ + +/* Bit definition for RCC_APB2EN3 register **********************************/ + +#define RCC_APB2EN3_M7USART5EN (1U << 31) /* Bit[31] */ +#define RCC_APB2EN3_M4USART5EN (1U << 30) /* Bit[30] */ +#define RCC_APB2EN3_M7USART5LPEN (1U << 29) /* Bit[29] */ +#define RCC_APB2EN3_M4USART5LPEN (1U << 28) /* Bit[28] */ +#define RCC_APB2EN3_M7USART6EN (1U << 27) /* Bit[27] */ +#define RCC_APB2EN3_M4USART6EN (1U << 26) /* Bit[26] */ +#define RCC_APB2EN3_M7USART6LPEN (1U << 25) /* Bit[25] */ +#define RCC_APB2EN3_M4USART6LPEN (1U << 24) /* Bit[24] */ +#define RCC_APB2EN3_M7USART7EN (1U << 23) /* Bit[23] */ +#define RCC_APB2EN3_M4USART7EN (1U << 22) /* Bit[22] */ +#define RCC_APB2EN3_M7USART7LPEN (1U << 21) /* Bit[21] */ +#define RCC_APB2EN3_M4USART7LPEN (1U << 20) /* Bit[20] */ +#define RCC_APB2EN3_M7USART8EN (1U << 19) /* Bit[19] */ +#define RCC_APB2EN3_M4USART8EN (1U << 18) /* Bit[18] */ +#define RCC_APB2EN3_M7USART8LPEN (1U << 17) /* Bit[17] */ +#define RCC_APB2EN3_M4USART8LPEN (1U << 16) /* Bit[16] */ +#define RCC_APB2EN3_M7UART13EN (1U << 15) /* Bit[15] */ +#define RCC_APB2EN3_M4UART13EN (1U << 14) /* Bit[14] */ +#define RCC_APB2EN3_M7UART13LPEN (1U << 13) /* Bit[13] */ +#define RCC_APB2EN3_M4UART13LPEN (1U << 12) /* Bit[12] */ +#define RCC_APB2EN3_M7UART14EN (1U << 11) /* Bit[11] */ +#define RCC_APB2EN3_M4UART14EN (1U << 10) /* Bit[10] */ +#define RCC_APB2EN3_M7UART14LPEN (1U << 9) /* Bit[9] */ +#define RCC_APB2EN3_M4UART14LPEN (1U << 8) /* Bit[8] */ +#define RCC_APB2EN3_M7UART15EN (1U << 7) /* Bit[7] */ +#define RCC_APB2EN3_M4UART15EN (1U << 6) /* Bit[6] */ +#define RCC_APB2EN3_M7UART15LPEN (1U << 5) /* Bit[5] */ +#define RCC_APB2EN3_M4UART15LPEN (1U << 4) /* Bit[4] */ + +/* Bit definition for RCC_APB2EN4 register **********************************/ + +#define RCC_APB2EN4_M7FDCAN3EN (1U << 31) /* Bit[31] */ +#define RCC_APB2EN4_M4FDCAN3EN (1U << 30) /* Bit[30] */ +#define RCC_APB2EN4_M7FDCAN3LPEN (1U << 29) /* Bit[29] */ +#define RCC_APB2EN4_M4FDCAN3LPEN (1U << 28) /* Bit[28] */ +#define RCC_APB2EN4_M7FDCAN4EN (1U << 27) /* Bit[27] */ +#define RCC_APB2EN4_M4FDCAN4EN (1U << 26) /* Bit[26] */ +#define RCC_APB2EN4_M7FDCAN4LPEN (1U << 25) /* Bit[25] */ +#define RCC_APB2EN4_M4FDCAN4LPEN (1U << 24) /* Bit[24] */ +#define RCC_APB2EN4_M7FDCAN7EN (1U << 23) /* Bit[23] */ +#define RCC_APB2EN4_M4FDCAN7EN (1U << 22) /* Bit[22] */ +#define RCC_APB2EN4_M7FDCAN7LPEN (1U << 21) /* Bit[21] */ +#define RCC_APB2EN4_M4FDCAN7LPEN (1U << 20) /* Bit[20] */ +#define RCC_APB2EN4_M7FDCAN8EN (1U << 19) /* Bit[19] */ +#define RCC_APB2EN4_M4FDCAN8EN (1U << 18) /* Bit[18] */ +#define RCC_APB2EN4_M7FDCAN8LPEN (1U << 17) /* Bit[17] */ +#define RCC_APB2EN4_M4FDCAN8LPEN (1U << 16) /* Bit[16] */ +#define RCC_APB2EN4_FDCAN3STPREQ (1U << 15) /* Bit[15] */ +#define RCC_APB2EN4_FDCAN3STPACK (1U << 14) /* Bit[14] */ +#define RCC_APB2EN4_FDCAN4STPREQ (1U << 11) /* Bit[11] */ +#define RCC_APB2EN4_FDCAN4STPACK (1U << 10) /* Bit[10] */ +#define RCC_APB2EN4_FDCAN7STPREQ (1U << 7) /* Bit[7] */ +#define RCC_APB2EN4_FDCAN7STPACK (1U << 6) /* Bit[6] */ +#define RCC_APB2EN4_FDCAN8STPREQ (1U << 3) /* Bit[3] */ +#define RCC_APB2EN4_FDCAN8STPACK (1U << 2) /* Bit[2] */ + +/* Bit definition for RCC_APB2RST1 register *********************************/ + +#define RCC_APB2RST1_ATIM1RST (1U << 28) /* Bit[28] */ +#define RCC_APB2RST1_ATIM2RST (1U << 24) /* Bit[24] */ +#define RCC_APB2RST1_GTIMA1RST (1U << 20) /* Bit[20] */ +#define RCC_APB2RST1_GTIMA2RST (1U << 16) /* Bit[16] */ +#define RCC_APB2RST1_GTIMA3RST (1U << 12) /* Bit[12] */ +#define RCC_APB2RST1_SHRTIM1RST (1U << 8) /* Bit[8] */ +#define RCC_APB2RST1_SHRTIM2RST (1U << 4) /* Bit[4] */ + +/* Bit definition for RCC_APB2RST2 register *********************************/ + +#define RCC_APB2RST2_I2S1RST (1U << 28) /* Bit[28] */ +#define RCC_APB2RST2_I2S2RST (1U << 24) /* Bit[24] */ +#define RCC_APB2RST2_SPI1RST (1U << 20) /* Bit[20] */ +#define RCC_APB2RST2_SPI2RST (1U << 16) /* Bit[16] */ +#define RCC_APB2RST2_DSMURST (1U << 12) /* Bit[12] */ +#define RCC_APB2RST2_I2C4RST (1U << 8) /* Bit[8] */ +#define RCC_APB2RST2_I2C5RST (1U << 4) /* Bit[4] */ +#define RCC_APB2RST2_I2C6RST (1U << 0) /* Bit[0] */ + +/* Bit definition for RCC_APB2RST3 register *********************************/ + +#define RCC_APB2RST3_USART5RST (1U << 28) /* Bit[28] */ +#define RCC_APB2RST3_USART6RST (1U << 24) /* Bit[24] */ +#define RCC_APB2RST3_USART7RST (1U << 20) /* Bit[20] */ +#define RCC_APB2RST3_USART8RST (1U << 16) /* Bit[16] */ +#define RCC_APB2RST3_UART13RST (1U << 12) /* Bit[12] */ +#define RCC_APB2RST3_UART14RST (1U << 8) /* Bit[8] */ +#define RCC_APB2RST3_UART15RST (1U << 4) /* Bit[4] */ + +/* Bit definition for RCC_APB2RST4 register *********************************/ + +#define RCC_APB2RST4_FDCAN3RST (1U << 28) /* Bit[28] */ +#define RCC_APB2RST4_FDCAN4RST (1U << 24) /* Bit[24] */ +#define RCC_APB2RST4_FDCAN7RST (1U << 20) /* Bit[20] */ +#define RCC_APB2RST4_FDCAN8RST (1U << 16) /* Bit[16] */ + +/* Bit definition for RCC_AHB5EN1 register **********************************/ + +#define RCC_AHB5EN1_M7GPIOAEN (1U << 31) /* Bit[31] */ +#define RCC_AHB5EN1_M4GPIOAEN (1U << 30) /* Bit[30] */ +#define RCC_AHB5EN1_M7GPIOALPEN (1U << 29) /* Bit[29] */ +#define RCC_AHB5EN1_M4GPIOALPEN (1U << 28) /* Bit[28] */ +#define RCC_AHB5EN1_M7GPIOBEN (1U << 27) /* Bit[27] */ +#define RCC_AHB5EN1_M4GPIOBEN (1U << 26) /* Bit[26] */ +#define RCC_AHB5EN1_M7GPIOBLPEN (1U << 25) /* Bit[25] */ +#define RCC_AHB5EN1_M4GPIOBLPEN (1U << 24) /* Bit[24] */ +#define RCC_AHB5EN1_M7GPIOCEN (1U << 23) /* Bit[23] */ +#define RCC_AHB5EN1_M4GPIOCEN (1U << 22) /* Bit[22] */ +#define RCC_AHB5EN1_M7GPIOCLPEN (1U << 21) /* Bit[21] */ +#define RCC_AHB5EN1_M4GPIOCLPEN (1U << 20) /* Bit[20] */ +#define RCC_AHB5EN1_M7GPIODEN (1U << 19) /* Bit[19] */ +#define RCC_AHB5EN1_M4GPIODEN (1U << 18) /* Bit[18] */ +#define RCC_AHB5EN1_M7GPIODLPEN (1U << 17) /* Bit[17] */ +#define RCC_AHB5EN1_M4GPIODLPEN (1U << 16) /* Bit[16] */ +#define RCC_AHB5EN1_M7GPIOEEN (1U << 15) /* Bit[15] */ +#define RCC_AHB5EN1_M4GPIOEEN (1U << 14) /* Bit[14] */ +#define RCC_AHB5EN1_M7GPIOELPEN (1U << 13) /* Bit[13] */ +#define RCC_AHB5EN1_M4GPIOELPEN (1U << 12) /* Bit[12] */ +#define RCC_AHB5EN1_M7GPIOFEN (1U << 11) /* Bit[11] */ +#define RCC_AHB5EN1_M4GPIOFEN (1U << 10) /* Bit[10] */ +#define RCC_AHB5EN1_M7GPIOFLPEN (1U << 9) /* Bit[9] */ +#define RCC_AHB5EN1_M4GPIOFLPEN (1U << 8) /* Bit[8] */ +#define RCC_AHB5EN1_M7GPIOGEN (1U << 7) /* Bit[7] */ +#define RCC_AHB5EN1_M4GPIOGEN (1U << 6) /* Bit[6] */ +#define RCC_AHB5EN1_M7GPIOGLPEN (1U << 5) /* Bit[5] */ +#define RCC_AHB5EN1_M4GPIOGLPEN (1U << 4) /* Bit[4] */ +#define RCC_AHB5EN1_M7GPIOHEN (1U << 3) /* Bit[3] */ +#define RCC_AHB5EN1_M4GPIOHEN (1U << 2) /* Bit[2] */ +#define RCC_AHB5EN1_M7GPIOHLPEN (1U << 1) /* Bit[1] */ +#define RCC_AHB5EN1_M4GPIOHLPEN (1U << 0) /* Bit[0] */ + +/* Bit definition for RCC_AHB5EN2 register **********************************/ + +#define RCC_AHB5EN2_M7GPIOIEN (1U << 31) /* Bit[31] */ +#define RCC_AHB5EN2_M4GPIOIEN (1U << 30) /* Bit[30] */ +#define RCC_AHB5EN2_M7GPIOILPEN (1U << 29) /* Bit[29] */ +#define RCC_AHB5EN2_M4GPIOILPEN (1U << 28) /* Bit[28] */ +#define RCC_AHB5EN2_M7GPIOJEN (1U << 27) /* Bit[27] */ +#define RCC_AHB5EN2_M4GPIOJEN (1U << 26) /* Bit[26] */ +#define RCC_AHB5EN2_M7GPIOJLPEN (1U << 25) /* Bit[25] */ +#define RCC_AHB5EN2_M4GPIOJLPEN (1U << 24) /* Bit[24] */ +#define RCC_AHB5EN2_M7GPIOKEN (1U << 23) /* Bit[23] */ +#define RCC_AHB5EN2_M4GPIOKEN (1U << 22) /* Bit[22] */ +#define RCC_AHB5EN2_M7GPIOKLPEN (1U << 21) /* Bit[21] */ +#define RCC_AHB5EN2_M4GPIOKLPEN (1U << 20) /* Bit[20] */ +#define RCC_AHB5EN2_M7ECCM3EN (1U << 19) /* Bit[19] */ +#define RCC_AHB5EN2_M4ECCM3EN (1U << 18) /* Bit[18] */ +#define RCC_AHB5EN2_M7ECCM3LPEN (1U << 17) /* Bit[17] */ +#define RCC_AHB5EN2_M4ECCM3LPEN (1U << 16) /* Bit[16] */ +#define RCC_AHB5EN2_PWREN (1U << 15) /* Bit[15] */ +#define RCC_AHB5EN2_M7CRCEN (1U << 11) /* Bit[11] */ +#define RCC_AHB5EN2_M4CRCEN (1U << 10) /* Bit[10] */ +#define RCC_AHB5EN2_M7CRCLPEN (1U << 9) /* Bit[9] */ +#define RCC_AHB5EN2_M4CRCLPEN (1U << 8) /* Bit[8] */ +#define RCC_AHB5EN2_M7SEMA4EN (1U << 7) /* Bit[7] */ +#define RCC_AHB5EN2_M4SEMA4EN (1U << 6) /* Bit[6] */ +#define RCC_AHB5EN2_M7SEMA4LPEN (1U << 5) /* Bit[5] */ +#define RCC_AHB5EN2_M4SEMA4LPEN (1U << 4) /* Bit[4] */ +#define RCC_AHB5EN2_M7AFIOEN (1U << 3) /* Bit[3] */ +#define RCC_AHB5EN2_M4AFIOEN (1U << 2) /* Bit[2] */ +#define RCC_AHB5EN2_M7AFIOLPEN (1U << 1) /* Bit[1] */ +#define RCC_AHB5EN2_M4AFIOLPEN (1U << 0) /* Bit[0] */ + +/* Bit definition for RCC_AHB5RST1 register *********************************/ + +#define RCC_AHB5RST1_GPIOARST (1U << 28) /* Bit[28] */ +#define RCC_AHB5RST1_GPIOBRST (1U << 24) /* Bit[24] */ +#define RCC_AHB5RST1_GPIOCRST (1U << 20) /* Bit[20] */ +#define RCC_AHB5RST1_GPIODRST (1U << 16) /* Bit[16] */ +#define RCC_AHB5RST1_GPIOERST (1U << 12) /* Bit[12] */ +#define RCC_AHB5RST1_GPIOFRST (1U << 8) /* Bit[8] */ +#define RCC_AHB5RST1_GPIOGRST (1U << 4) /* Bit[4] */ +#define RCC_AHB5RST1_GPIOHRST (1U << 0) /* Bit[0] */ + +/* Bit definition for RCC_AHB5RST2 register *********************************/ + +#define RCC_AHB5RST2_GPIOIRST (1U << 28) /* Bit[28] */ +#define RCC_AHB5RST2_GPIOJRST (1U << 24) /* Bit[24] */ +#define RCC_AHB5RST2_GPIOKRST (1U << 20) /* Bit[20] */ +#define RCC_AHB5RST2_ECCM3RST (1U << 16) /* Bit[16] */ +#define RCC_AHB5RST2_PWRRST (1U << 12) /* Bit[12] */ +#define RCC_AHB5RST2_CRCRST (1U << 8) /* Bit[8] */ +#define RCC_AHB5RST2_SEMA4RST (1U << 4) /* Bit[4] */ +#define RCC_AHB5RST2_AFIORST (1U << 0) /* Bit[0] */ + +/* Bit definition for RCC_APB5DIV1 register *********************************/ + +/* Bit[30:28] APB5ATIMDIV */ +#define RCC_APB5DIV1_APB5ATIMDIV_SHIFT (28) +#define RCC_APB5DIV1_APB5ATIMDIV_MASK (0x07 << RCC_APB5DIV1_APB5ATIMDIV_SHIFT) +#define RCC_APB5DIV1_APB5ATIMDIV_DIV1 (0x00000000U << RCC_APB5DIV1_APB5ATIMDIV_SHIFT) +#define RCC_APB5DIV1_APB5ATIMDIV_DIV2 (0x00000004U << RCC_APB5DIV1_APB5ATIMDIV_SHIFT) +#define RCC_APB5DIV1_APB5ATIMDIV_DIV4 (0x00000005U << RCC_APB5DIV1_APB5ATIMDIV_SHIFT) +#define RCC_APB5DIV1_APB5ATIMDIV_DIV8 (0x00000006U << RCC_APB5DIV1_APB5ATIMDIV_SHIFT) +#define RCC_APB5DIV1_APB5ATIMDIV_DIV16 (0x00000007U << RCC_APB5DIV1_APB5ATIMDIV_SHIFT) + +/* Bit[26:24] APB5I2CDIV */ +#define RCC_APB5DIV1_APB5I2CDIV_SHIFT (24) +#define RCC_APB5DIV1_APB5I2CDIV_MASK (0x07 << RCC_APB5DIV1_APB5I2CDIV_SHIFT) +#define RCC_APB5DIV1_APB5I2CDIV_DIV1 (0x00000000U << RCC_APB5DIV1_APB5I2CDIV_SHIFT) +#define RCC_APB5DIV1_APB5I2CDIV_DIV2 (0x00000004U << RCC_APB5DIV1_APB5I2CDIV_SHIFT) +#define RCC_APB5DIV1_APB5I2CDIV_DIV4 (0x00000005U << RCC_APB5DIV1_APB5I2CDIV_SHIFT) +#define RCC_APB5DIV1_APB5I2CDIV_DIV8 (0x00000006U << RCC_APB5DIV1_APB5I2CDIV_SHIFT) +#define RCC_APB5DIV1_APB5I2CDIV_DIV16 (0x00000007U << RCC_APB5DIV1_APB5I2CDIV_SHIFT) + +/* Bit[22:20] APB5EXTIDIV */ +#define RCC_APB5DIV1_APB5EXTIDIV_SHIFT (20) +#define RCC_APB5DIV1_APB5EXTIDIV_MASK (0x07 << RCC_APB5DIV1_APB5EXTIDIV_SHIFT) +#define RCC_APB5DIV1_APB5EXTIDIV_DIV1 (0x00000000U << RCC_APB5DIV1_APB5EXTIDIV_SHIFT) +#define RCC_APB5DIV1_APB5EXTIDIV_DIV2 (0x00000004U << RCC_APB5DIV1_APB5EXTIDIV_SHIFT) +#define RCC_APB5DIV1_APB5EXTIDIV_DIV4 (0x00000005U << RCC_APB5DIV1_APB5EXTIDIV_SHIFT) +#define RCC_APB5DIV1_APB5EXTIDIV_DIV8 (0x00000006U << RCC_APB5DIV1_APB5EXTIDIV_SHIFT) +#define RCC_APB5DIV1_APB5EXTIDIV_DIV16 (0x00000007U << RCC_APB5DIV1_APB5EXTIDIV_SHIFT) + +/* Bit definition for RCC_APB5SEL1 register *********************************/ + +/* Bit[30:28] I2C7KERSEL */ +#define RCC_APB5SEL1_I2C7KERSEL_SHIFT (28) +#define RCC_APB5SEL1_I2C7KERSEL_MASK (0x07 << RCC_APB5SEL1_I2C7KERSEL_SHIFT) +#define RCC_APB5SEL1_I2C7KERSEL_SYSCLK (0x00000000U << RCC_APB5SEL1_I2C7KERSEL_SHIFT) +#define RCC_APB5SEL1_I2C7KERSEL_PLL3C (0x00000001U << RCC_APB5SEL1_I2C7KERSEL_SHIFT) +#define RCC_APB5SEL1_I2C7KERSEL_HSI (0x00000002U << RCC_APB5SEL1_I2C7KERSEL_SHIFT) +#define RCC_APB5SEL1_I2C7KERSEL_MSI (0x00000003U << RCC_APB5SEL1_I2C7KERSEL_SHIFT) + +/* Bit[26:24] I2C8KERSEL */ +#define RCC_APB5SEL1_I2C8KERSEL_SHIFT (24) +#define RCC_APB5SEL1_I2C8KERSEL_MASK (0x07 << RCC_APB5SEL1_I2C8KERSEL_SHIFT) +#define RCC_APB5SEL1_I2C8KERSEL_SYSCLK (0x00000000U << RCC_APB5SEL1_I2C8KERSEL_SHIFT) +#define RCC_APB5SEL1_I2C8KERSEL_PLL3C (0x00000001U << RCC_APB5SEL1_I2C8KERSEL_SHIFT) +#define RCC_APB5SEL1_I2C8KERSEL_HSI (0x00000002U << RCC_APB5SEL1_I2C8KERSEL_SHIFT) +#define RCC_APB5SEL1_I2C8KERSEL_MSI (0x00000003U << RCC_APB5SEL1_I2C8KERSEL_SHIFT) + +/* Bit[22:20] I2C9KERSEL */ +#define RCC_APB5SEL1_I2C9KERSEL_SHIFT (20) +#define RCC_APB5SEL1_I2C9KERSEL_MASK (0x07 << RCC_APB5SEL1_I2C9KERSEL_SHIFT) +#define RCC_APB5SEL1_I2C9KERSEL_SYSCLK (0x00000000U << RCC_APB5SEL1_I2C9KERSEL_SHIFT) +#define RCC_APB5SEL1_I2C9KERSEL_PLL3C (0x00000001U << RCC_APB5SEL1_I2C9KERSEL_SHIFT) +#define RCC_APB5SEL1_I2C9KERSEL_HSI (0x00000002U << RCC_APB5SEL1_I2C9KERSEL_SHIFT) +#define RCC_APB5SEL1_I2C9KERSEL_MSI (0x00000003U << RCC_APB5SEL1_I2C9KERSEL_SHIFT) + +/* Bit[18:16] I2C10KERSEL */ +#define RCC_APB5SEL1_I2C10KERSEL_SHIFT (16) +#define RCC_APB5SEL1_I2C10KERSEL_MASK (0x07 << RCC_APB5SEL1_I2C10KERSEL_SHIFT) +#define RCC_APB5SEL1_I2C10KERSEL_SYSCLK (0x00000000U << RCC_APB5SEL1_I2C10KERSEL_SHIFT) +#define RCC_APB5SEL1_I2C10KERSEL_PLL3C (0x00000001U << RCC_APB5SEL1_I2C10KERSEL_SHIFT) +#define RCC_APB5SEL1_I2C10KERSEL_HSI (0x00000002U << RCC_APB5SEL1_I2C10KERSEL_SHIFT) +#define RCC_APB5SEL1_I2C10KERSEL_MSI (0x00000003U << RCC_APB5SEL1_I2C10KERSEL_SHIFT) + +/* Bit definition for RCC_APB5EN1 register **********************************/ + +#define RCC_APB5EN1_M7ATIM3EN (1U << 31) /* Bit[31] */ +#define RCC_APB5EN1_M4ATIM3EN (1U << 30) /* Bit[30] */ +#define RCC_APB5EN1_M7ATIM3LPEN (1U << 29) /* Bit[29] */ +#define RCC_APB5EN1_M4ATIM3LPEN (1U << 28) /* Bit[28] */ +#define RCC_APB5EN1_M7ATIM4EN (1U << 27) /* Bit[27] */ +#define RCC_APB5EN1_M4ATIM4EN (1U << 26) /* Bit[26] */ +#define RCC_APB5EN1_M7ATIM4LPEN (1U << 25) /* Bit[25] */ +#define RCC_APB5EN1_M4ATIM4LPEN (1U << 24) /* Bit[24] */ +#define RCC_APB5EN1_M7AFECEN (1U << 23) /* Bit[23] */ +#define RCC_APB5EN1_M4AFECEN (1U << 22) /* Bit[22] */ +#define RCC_APB5EN1_M7AFECLPEN (1U << 21) /* Bit[21] */ +#define RCC_APB5EN1_M4AFECLPEN (1U << 20) /* Bit[20] */ +#define RCC_APB5EN1_M7SPI4EN (1U << 15) /* Bit[15] */ +#define RCC_APB5EN1_M4SPI4EN (1U << 14) /* Bit[14] */ +#define RCC_APB5EN1_M7SPI4LPEN (1U << 13) /* Bit[13] */ +#define RCC_APB5EN1_M4SPI4LPEN (1U << 12) /* Bit[12] */ +#define RCC_APB5EN1_M7SPI5EN (1U << 11) /* Bit[11] */ +#define RCC_APB5EN1_M4SPI5EN (1U << 10) /* Bit[10] */ +#define RCC_APB5EN1_M7SPI5LPEN (1U << 9) /* Bit[9] */ +#define RCC_APB5EN1_M4SPI5LPEN (1U << 8) /* Bit[8] */ +#define RCC_APB5EN1_M7SPI6EN (1U << 7) /* Bit[7] */ +#define RCC_APB5EN1_M4SPI6EN (1U << 6) /* Bit[6] */ +#define RCC_APB5EN1_M7SPI6LPEN (1U << 5) /* Bit[5] */ +#define RCC_APB5EN1_M4SPI6LPEN (1U << 4) /* Bit[4] */ +#define RCC_APB5EN1_M7SPI7EN (1U << 3) /* Bit[3] */ +#define RCC_APB5EN1_M4SPI7EN (1U << 2) /* Bit[2] */ +#define RCC_APB5EN1_M7SPI7LPEN (1U << 1) /* Bit[1] */ +#define RCC_APB5EN1_M4SPI7LPEN (1U << 0) /* Bit[0] */ + +/* Bit definition for RCC_APB5EN2 register **********************************/ + +#define RCC_APB5EN2_M7I2C7EN (1U << 31) /* Bit[31] */ +#define RCC_APB5EN2_M4I2C7EN (1U << 30) /* Bit[30] */ +#define RCC_APB5EN2_M7I2C7LPEN (1U << 29) /* Bit[29] */ +#define RCC_APB5EN2_M4I2C7LPEN (1U << 28) /* Bit[28] */ +#define RCC_APB5EN2_M7I2C8EN (1U << 27) /* Bit[27] */ +#define RCC_APB5EN2_M4I2C8EN (1U << 26) /* Bit[26] */ +#define RCC_APB5EN2_M7I2C8LPEN (1U << 25) /* Bit[25] */ +#define RCC_APB5EN2_M4I2C8LPEN (1U << 24) /* Bit[24] */ +#define RCC_APB5EN2_M7I2C9EN (1U << 23) /* Bit[23] */ +#define RCC_APB5EN2_M4I2C9EN (1U << 22) /* Bit[22] */ +#define RCC_APB5EN2_M7I2C9LPEN (1U << 21) /* Bit[21] */ +#define RCC_APB5EN2_M4I2C9LPEN (1U << 20) /* Bit[20] */ +#define RCC_APB5EN2_M7I2C10EN (1U << 19) /* Bit[19] */ +#define RCC_APB5EN2_M4I2C10EN (1U << 18) /* Bit[18] */ +#define RCC_APB5EN2_M7I2C10LPEN (1U << 17) /* Bit[17] */ +#define RCC_APB5EN2_M4I2C10LPEN (1U << 16) /* Bit[16] */ +#define RCC_APB5EN2_EXTIEN (1U << 15) /* Bit[15] */ +#define RCC_APB5EN2_M7RTCPCLKEN (1U << 11) /* Bit[11] */ +#define RCC_APB5EN2_M4RTCPCLKEN (1U << 10) /* Bit[10] */ +#define RCC_APB5EN2_M7RTCPCLKLPEN (1U << 9) /* Bit[9] */ +#define RCC_APB5EN2_M4RTCPCLKLPEN (1U << 8) /* Bit[8] */ +#define RCC_APB5EN2_IWDG1PCLKEN (1U << 7) /* Bit[7] */ +#define RCC_APB5EN2_IWDG1PCLKLPEN (1U << 5) /* Bit[5] */ +#define RCC_APB5EN2_IWDG2PCLKEN (1U << 3) /* Bit[3] */ +#define RCC_APB5EN2_IWDG2PCLKLPEN (1U << 1) /* Bit[1] */ + +/* Bit definition for RCC_APB5RST1 register *********************************/ + +#define RCC_APB5RST1_ATIM3RST (1U << 28) /* Bit[28] */ +#define RCC_APB5RST1_ATIM4RST (1U << 24) /* Bit[24] */ +#define RCC_APB5RST1_SPI4RST (1U << 12) /* Bit[12] */ +#define RCC_APB5RST1_SPI5RST (1U << 8) /* Bit[8] */ +#define RCC_APB5RST1_SPI6RST (1U << 4) /* Bit[4] */ +#define RCC_APB5RST1_SPI7RST (1U << 0) /* Bit[0] */ + +/* Bit definition for RCC_APB5RST2 register *********************************/ + +#define RCC_APB5RST2_I2C7RST (1U << 28) /* Bit[28] */ +#define RCC_APB5RST2_I2C8RST (1U << 24) /* Bit[24] */ +#define RCC_APB5RST2_I2C9RST (1U << 20) /* Bit[20] */ +#define RCC_APB5RST2_I2C10RST (1U << 16) /* Bit[16] */ + +/* Bit definition for RCC_AHB9DIV1 register *********************************/ + +/* Bit[3:0] ESCSYSDIV */ +#define RCC_AHB9DIV1_ESCSYSDIV_SHIFT (0) +#define RCC_AHB9DIV1_ESCSYSDIV_MASK (0x0F << RCC_AHB9DIV1_ESCSYSDIV_SHIFT) +#define RCC_AHB9DIV1_ESCSYSDIV_DIV1 (0x00000000U << RCC_AHB9DIV1_ESCSYSDIV_SHIFT) +#define RCC_AHB9DIV1_ESCSYSDIV_DIV2 (0x00000001U << RCC_AHB9DIV1_ESCSYSDIV_SHIFT) +#define RCC_AHB9DIV1_ESCSYSDIV_DIV4 (0x00000002U << RCC_AHB9DIV1_ESCSYSDIV_SHIFT) +#define RCC_AHB9DIV1_ESCSYSDIV_DIV8 (0x00000004U << RCC_AHB9DIV1_ESCSYSDIV_SHIFT) +#define RCC_AHB9DIV1_ESCSYSDIV_DIV16 (0x00000007U << RCC_AHB9DIV1_ESCSYSDIV_SHIFT) +#define RCC_AHB9DIV1_ESCSYSDIV_DIV32 (0x00000008U << RCC_AHB9DIV1_ESCSYSDIV_SHIFT) +#define RCC_AHB9DIV1_ESCSYSDIV_DIV64 (0x00000009U << RCC_AHB9DIV1_ESCSYSDIV_SHIFT) +#define RCC_AHB9DIV1_ESCSYSDIV_DIV128 (0x0000000AU << RCC_AHB9DIV1_ESCSYSDIV_SHIFT) +#define RCC_AHB9DIV1_ESCSYSDIV_DIV256 (0x0000000BU << RCC_AHB9DIV1_ESCSYSDIV_SHIFT) +#define RCC_AHB9DIV1_ESCSYSDIV_DIV512 (0x0000000CU << RCC_AHB9DIV1_ESCSYSDIV_SHIFT) + +/* Bit definition for RCC_AHB9SEL1 register *********************************/ + +/* Bit[2:0] ESCKERSEL */ +#define RCC_AHB9SEL1_ESCKERSEL_SHIFT (0) +#define RCC_AHB9SEL1_ESCKERSEL_MASK (0x07 << RCC_AHB9SEL1_ESCKERSEL_SHIFT) +#define RCC_AHB9SEL1_ESCKERSEL_SYSCLK (0x00000000U << RCC_AHB9SEL1_ESCKERSEL_SHIFT) +#define RCC_AHB9SEL1_ESCKERSEL_PLL2B (0x00000001U << RCC_AHB9SEL1_ESCKERSEL_SHIFT) +#define RCC_AHB9SEL1_ESCKERSEL_PLL3A (0x00000002U << RCC_AHB9SEL1_ESCKERSEL_SHIFT) +#define RCC_AHB9SEL1_ESCKERSEL_PLL3C (0x00000003U << RCC_AHB9SEL1_ESCKERSEL_SHIFT) +#define RCC_AHB9SEL1_ESCKERSEL_PLL1B (0x00000004U << RCC_AHB9SEL1_ESCKERSEL_SHIFT) + +/* Bit definition for RCC_AHB9EN1 register **********************************/ + +#define RCC_AHB9EN1_M7ESCEN (1U << 3) /* Bit[3] */ +#define RCC_AHB9EN1_M4ESCEN (1U << 2) /* Bit[2] */ +#define RCC_AHB9EN1_M7ESCLPEN (1U << 1) /* Bit[1] */ +#define RCC_AHB9EN1_M4ESCLPEN (1U << 0) /* Bit[0] */ + +/* Bit definition for RCC_AHB9RST1 register *********************************/ + +#define RCC_AHB9RST1_ESCRST (1U << 0) /* Bit[0] */ + +/* Bit definition for RCC_RDDIV1 register ***********************************/ + +/* Bit[30:28] COMPDIV */ +#define RCC_RDDIV1_COMPDIV_SHIFT (28) +#define RCC_RDDIV1_COMPDIV_MASK (0x07 << RCC_RDDIV1_COMPDIV_SHIFT) +#define RCC_RDDIV1_COMPDIV_DIV1 (0x00000000U << RCC_RDDIV1_COMPDIV_SHIFT) +#define RCC_RDDIV1_COMPDIV_DIV2 (0x00000001U << RCC_RDDIV1_COMPDIV_SHIFT) +#define RCC_RDDIV1_COMPDIV_DIV4 (0x00000002U << RCC_RDDIV1_COMPDIV_SHIFT) +#define RCC_RDDIV1_COMPDIV_DIV8 (0x00000004U << RCC_RDDIV1_COMPDIV_SHIFT) +#define RCC_RDDIV1_COMPDIV_DIV16 (0x00000007U << RCC_RDDIV1_COMPDIV_SHIFT) + +/* Bit[26:24] LPUARTDIV */ +#define RCC_RDDIV1_LPUARTDIV_SHIFT (24) +#define RCC_RDDIV1_LPUARTDIV_MASK (0x07 << RCC_RDDIV1_LPUARTDIV_SHIFT) +#define RCC_RDDIV1_LPUARTDIV_DIV1 (0x00000000U << RCC_RDDIV1_LPUARTDIV_SHIFT) +#define RCC_RDDIV1_LPUARTDIV_DIV2 (0x00000001U << RCC_RDDIV1_LPUARTDIV_SHIFT) +#define RCC_RDDIV1_LPUARTDIV_DIV4 (0x00000002U << RCC_RDDIV1_LPUARTDIV_SHIFT) +#define RCC_RDDIV1_LPUARTDIV_DIV8 (0x00000004U << RCC_RDDIV1_LPUARTDIV_SHIFT) +#define RCC_RDDIV1_LPUARTDIV_DIV16 (0x00000007U << RCC_RDDIV1_LPUARTDIV_SHIFT) + +/* Bit definition for RCC_RDSEL1 register ***********************************/ + +/* Bit[31:28] LPTIM1SEL */ +#define RCC_RDSEL1_LPTIM1SEL_SHIFT (28) +#define RCC_RDSEL1_LPTIM1SEL_MASK (0x0F << RCC_RDSEL1_LPTIM1SEL_SHIFT) +#define RCC_RDSEL1_LPTIM1SEL_APB5 (0x00000000U << RCC_RDSEL1_LPTIM1SEL_SHIFT) +#define RCC_RDSEL1_LPTIM1SEL_LSI (0x00000001U << RCC_RDSEL1_LPTIM1SEL_SHIFT) +#define RCC_RDSEL1_LPTIM1SEL_LSE (0x00000002U << RCC_RDSEL1_LPTIM1SEL_SHIFT) +#define RCC_RDSEL1_LPTIM1SEL_HSE (0x00000003U << RCC_RDSEL1_LPTIM1SEL_SHIFT) +#define RCC_RDSEL1_LPTIM1SEL_HIS (0x00000004U << RCC_RDSEL1_LPTIM1SEL_SHIFT) +#define RCC_RDSEL1_LPTIM1SEL_MSI (0x00000005U << RCC_RDSEL1_LPTIM1SEL_SHIFT) +#define RCC_RDSEL1_LPTIM1SEL_COMP1 (0x00000008U << RCC_RDSEL1_LPTIM1SEL_SHIFT) +#define RCC_RDSEL1_LPTIM1SEL_COMP2 (0x00000009U << RCC_RDSEL1_LPTIM1SEL_SHIFT) +#define RCC_RDSEL1_LPTIM1SEL_COMP3 (0x0000000AU << RCC_RDSEL1_LPTIM1SEL_SHIFT) +#define RCC_RDSEL1_LPTIM1SEL_COMP4 (0x0000000BU << RCC_RDSEL1_LPTIM1SEL_SHIFT) + +/* Bit[27:24] LPTIM2SEL */ +#define RCC_RDSEL1_LPTIM2SEL_SHIFT (24) +#define RCC_RDSEL1_LPTIM2SEL_MASK (0x0F << RCC_RDSEL1_LPTIM2SEL_SHIFT) +#define RCC_RDSEL1_LPTIM2SEL_APB5 (0x00000000U << RCC_RDSEL1_LPTIM2SEL_SHIFT) +#define RCC_RDSEL1_LPTIM2SEL_LSI (0x00000001U << RCC_RDSEL1_LPTIM2SEL_SHIFT) +#define RCC_RDSEL1_LPTIM2SEL_LSE (0x00000002U << RCC_RDSEL1_LPTIM2SEL_SHIFT) +#define RCC_RDSEL1_LPTIM2SEL_HSE (0x00000003U << RCC_RDSEL1_LPTIM2SEL_SHIFT) +#define RCC_RDSEL1_LPTIM2SEL_HIS (0x00000004U << RCC_RDSEL1_LPTIM2SEL_SHIFT) +#define RCC_RDSEL1_LPTIM2SEL_MSI (0x00000005U << RCC_RDSEL1_LPTIM2SEL_SHIFT) +#define RCC_RDSEL1_LPTIM2SEL_COMP1 (0x00000008U << RCC_RDSEL1_LPTIM2SEL_SHIFT) +#define RCC_RDSEL1_LPTIM2SEL_COMP2 (0x00000009U << RCC_RDSEL1_LPTIM2SEL_SHIFT) +#define RCC_RDSEL1_LPTIM2SEL_COMP3 (0x0000000AU << RCC_RDSEL1_LPTIM2SEL_SHIFT) +#define RCC_RDSEL1_LPTIM2SEL_COMP4 (0x0000000BU << RCC_RDSEL1_LPTIM2SEL_SHIFT) + +/* Bit[23:20] LPTIM3SEL */ +#define RCC_RDSEL1_LPTIM3SEL_SHIFT (20) +#define RCC_RDSEL1_LPTIM3SEL_MASK (0x0F << RCC_RDSEL1_LPTIM3SEL_SHIFT) +#define RCC_RDSEL1_LPTIM3SEL_APB5 (0x00000000U << RCC_RDSEL1_LPTIM3SEL_SHIFT) +#define RCC_RDSEL1_LPTIM3SEL_LSI (0x00000001U << RCC_RDSEL1_LPTIM3SEL_SHIFT) +#define RCC_RDSEL1_LPTIM3SEL_LSE (0x00000002U << RCC_RDSEL1_LPTIM3SEL_SHIFT) +#define RCC_RDSEL1_LPTIM3SEL_HSE (0x00000003U << RCC_RDSEL1_LPTIM3SEL_SHIFT) +#define RCC_RDSEL1_LPTIM3SEL_HIS (0x00000004U << RCC_RDSEL1_LPTIM3SEL_SHIFT) +#define RCC_RDSEL1_LPTIM3SEL_MSI (0x00000005U << RCC_RDSEL1_LPTIM3SEL_SHIFT) +#define RCC_RDSEL1_LPTIM3SEL_COMP1 (0x00000008U << RCC_RDSEL1_LPTIM3SEL_SHIFT) +#define RCC_RDSEL1_LPTIM3SEL_COMP2 (0x00000009U << RCC_RDSEL1_LPTIM3SEL_SHIFT) +#define RCC_RDSEL1_LPTIM3SEL_COMP3 (0x0000000AU << RCC_RDSEL1_LPTIM3SEL_SHIFT) +#define RCC_RDSEL1_LPTIM3SEL_COMP4 (0x0000000BU << RCC_RDSEL1_LPTIM3SEL_SHIFT) + +/* Bit[19:16] LPTIM4SEL */ +#define RCC_RDSEL1_LPTIM4SEL_SHIFT (16) +#define RCC_RDSEL1_LPTIM4SEL_MASK (0x0F << RCC_RDSEL1_LPTIM4SEL_SHIFT) +#define RCC_RDSEL1_LPTIM4SEL_APB5 (0x00000000U << RCC_RDSEL1_LPTIM4SEL_SHIFT) +#define RCC_RDSEL1_LPTIM4SEL_LSI (0x00000001U << RCC_RDSEL1_LPTIM4SEL_SHIFT) +#define RCC_RDSEL1_LPTIM4SEL_LSE (0x00000002U << RCC_RDSEL1_LPTIM4SEL_SHIFT) +#define RCC_RDSEL1_LPTIM4SEL_HSE (0x00000003U << RCC_RDSEL1_LPTIM4SEL_SHIFT) +#define RCC_RDSEL1_LPTIM4SEL_HIS (0x00000004U << RCC_RDSEL1_LPTIM4SEL_SHIFT) +#define RCC_RDSEL1_LPTIM4SEL_MSI (0x00000005U << RCC_RDSEL1_LPTIM4SEL_SHIFT) +#define RCC_RDSEL1_LPTIM4SEL_COMP1 (0x00000008U << RCC_RDSEL1_LPTIM4SEL_SHIFT) +#define RCC_RDSEL1_LPTIM4SEL_COMP2 (0x00000009U << RCC_RDSEL1_LPTIM4SEL_SHIFT) +#define RCC_RDSEL1_LPTIM4SEL_COMP3 (0x0000000AU << RCC_RDSEL1_LPTIM4SEL_SHIFT) +#define RCC_RDSEL1_LPTIM4SEL_COMP4 (0x0000000BU << RCC_RDSEL1_LPTIM4SEL_SHIFT) + +/* Bit[15:12] LPTIM5SEL */ +#define RCC_RDSEL1_LPTIM5SEL_SHIFT (12) +#define RCC_RDSEL1_LPTIM5SEL_MASK (0x0F << RCC_RDSEL1_LPTIM5SEL_SHIFT) +#define RCC_RDSEL1_LPTIM5SEL_APB5 (0x00000000U << RCC_RDSEL1_LPTIM5SEL_SHIFT) +#define RCC_RDSEL1_LPTIM5SEL_LSI (0x00000001U << RCC_RDSEL1_LPTIM5SEL_SHIFT) +#define RCC_RDSEL1_LPTIM5SEL_LSE (0x00000002U << RCC_RDSEL1_LPTIM5SEL_SHIFT) +#define RCC_RDSEL1_LPTIM5SEL_HSE (0x00000003U << RCC_RDSEL1_LPTIM5SEL_SHIFT) +#define RCC_RDSEL1_LPTIM5SEL_HIS (0x00000004U << RCC_RDSEL1_LPTIM5SEL_SHIFT) +#define RCC_RDSEL1_LPTIM5SEL_MSI (0x00000005U << RCC_RDSEL1_LPTIM5SEL_SHIFT) +#define RCC_RDSEL1_LPTIM5SEL_COMP1 (0x00000008U << RCC_RDSEL1_LPTIM5SEL_SHIFT) +#define RCC_RDSEL1_LPTIM5SEL_COMP2 (0x00000009U << RCC_RDSEL1_LPTIM5SEL_SHIFT) +#define RCC_RDSEL1_LPTIM5SEL_COMP3 (0x0000000AU << RCC_RDSEL1_LPTIM5SEL_SHIFT) +#define RCC_RDSEL1_LPTIM5SEL_COMP4 (0x0000000BU << RCC_RDSEL1_LPTIM5SEL_SHIFT) + +/* Bit[10:8] LPUART1SEL */ +#define RCC_RDSEL1_LPUART1SEL_SHIFT (8) +#define RCC_RDSEL1_LPUART1SEL_MASK (0x07 << RCC_RDSEL1_LPUART1SEL_SHIFT) +#define RCC_RDSEL1_LPUART1SEL_SYSCLK (0x00000000U << RCC_RDSEL1_LPUART1SEL_SHIFT) +#define RCC_RDSEL1_LPUART1SEL_HSI (0x00000001U << RCC_RDSEL1_LPUART1SEL_SHIFT) +#define RCC_RDSEL1_LPUART1SEL_LSE (0x00000002U << RCC_RDSEL1_LPUART1SEL_SHIFT) +#define RCC_RDSEL1_LPUART1SEL_HSE (0x00000003U << RCC_RDSEL1_LPUART1SEL_SHIFT) +#define RCC_RDSEL1_LPUART1SEL_MSI (0x00000004U << RCC_RDSEL1_LPUART1SEL_SHIFT) + +/* Bit[6:4] LPUART2SEL */ +#define RCC_RDSEL1_LPUART2SEL_SHIFT (4) +#define RCC_RDSEL1_LPUART2SEL_MASK (0x07 << RCC_RDSEL1_LPUART2SEL_SHIFT) +#define RCC_RDSEL1_LPUART2SEL_SYSCLK (0x00000000U << RCC_RDSEL1_LPUART2SEL_SHIFT) +#define RCC_RDSEL1_LPUART2SEL_HSI (0x00000001U << RCC_RDSEL1_LPUART2SEL_SHIFT) +#define RCC_RDSEL1_LPUART2SEL_LSE (0x00000002U << RCC_RDSEL1_LPUART2SEL_SHIFT) +#define RCC_RDSEL1_LPUART2SEL_HSE (0x00000003U << RCC_RDSEL1_LPUART2SEL_SHIFT) +#define RCC_RDSEL1_LPUART2SEL_MSI (0x00000004U << RCC_RDSEL1_LPUART2SEL_SHIFT) + +/* Bit[0] COMPSEL */ +#define RCC_RDSEL1_COMPSEL (1U << 0) /* Bit[0] */ + +/* Bit definition for RCC_RDCTRL1 register **********************************/ + +#define RCC_RDCTRL1_LPTIM2FLTEN (1U << 29) +#define RCC_RDCTRL1_LPTIM2FLTSEL (1U << 28) +#define RCC_RDCTRL1_LPTIM2COMP4EN (1U << 27) +#define RCC_RDCTRL1_LPTIM2COMP3EN (1U << 26) +#define RCC_RDCTRL1_LPTIM2COMP2EN (1U << 25) +#define RCC_RDCTRL1_LPTIM2COMP1EN (1U << 24) +#define RCC_RDCTRL1_LPTIM2FLTDFC_SHIFT (16) +#define RCC_RDCTRL1_LPTIM2FLTDFC_MASK (0x1F << RCC_RDCTRL1_LPTIM2FLTDFC_SHIFT) +#define RCC_RDCTRL1_LPTIM1FLTEN (1U << 13) +#define RCC_RDCTRL1_LPTIM1FLTSEL (1U << 12) +#define RCC_RDCTRL1_LPTIM1COMP4EN (1U << 11) +#define RCC_RDCTRL1_LPTIM1COMP3EN (1U << 10) +#define RCC_RDCTRL1_LPTIM1COMP2EN (1U << 9) +#define RCC_RDCTRL1_LPTIM1COMP1EN (1U << 8) +#define RCC_RDCTRL1_LPTIM1FLTDFC_SHIFT (0) +#define RCC_RDCTRL1_LPTIM1FLTDFC_MASK (0x1F << RCC_RDCTRL1_LPTIM1FLTDFC_SHIFT) + +/* Bit definition for RCC_RDCTRL2 register **********************************/ + +#define RCC_RDCTRL2_LPTIM4FLTEN (1U << 29) +#define RCC_RDCTRL2_LPTIM4FLTSEL (1U << 28) +#define RCC_RDCTRL2_LPTIM4COMP4EN (1U << 27) +#define RCC_RDCTRL2_LPTIM4COMP3EN (1U << 26) +#define RCC_RDCTRL2_LPTIM4COMP2EN (1U << 25) +#define RCC_RDCTRL2_LPTIM4COMP1EN (1U << 24) +#define RCC_RDCTRL2_LPTIM4FLTDFC_SHIFT (16) +#define RCC_RDCTRL2_LPTIM4FLTDFC_MASK (0x1F << RCC_RDCTRL2_LPTIM4FLTDFC_SHIFT) +#define RCC_RDCTRL2_LPTIM3FLTEN (1U << 13) +#define RCC_RDCTRL2_LPTIM3FLTSEL (1U << 12) +#define RCC_RDCTRL2_LPTIM3COMP4EN (1U << 11) +#define RCC_RDCTRL2_LPTIM3COMP3EN (1U << 10) +#define RCC_RDCTRL2_LPTIM3COMP2EN (1U << 9) +#define RCC_RDCTRL2_LPTIM3COMP1EN (1U << 8) +#define RCC_RDCTRL2_LPTIM3FLTDFC_SHIFT (0) +#define RCC_RDCTRL2_LPTIM3FLTDFC_MASK (0x1F << RCC_RDCTRL2_LPTIM3FLTDFC_SHIFT) + +/* Bit definition for RCC_RDCTRL3 register **********************************/ + +#define RCC_RDCTRL3_LPTIM5FLTEN (1U << 13) +#define RCC_RDCTRL3_LPTIM5FLTSEL (1U << 12) +#define RCC_RDCTRL3_LPTIM5COMP4EN (1U << 11) +#define RCC_RDCTRL3_LPTIM5COMP3EN (1U << 10) +#define RCC_RDCTRL3_LPTIM5COMP2EN (1U << 9) +#define RCC_RDCTRL3_LPTIM5COMP1EN (1U << 8) +#define RCC_RDCTRL3_LPTIM5FLTDFC_SHIFT (0) +#define RCC_RDCTRL3_LPTIM5FLTDFC_MASK (0x1F << RCC_RDCTRL3_LPTIM5FLTDFC_SHIFT) + +/* Bit definition for RCC_RDEN1 register ************************************/ + +#define RCC_RDEN1_M7LPTIM1EN (1U << 31) +#define RCC_RDEN1_M4LPTIM1EN (1U << 30) +#define RCC_RDEN1_M7LPTIM1LPEN (1U << 29) +#define RCC_RDEN1_M4LPTIM1LPEN (1U << 28) +#define RCC_RDEN1_M7LPTIM2EN (1U << 27) +#define RCC_RDEN1_M4LPTIM2EN (1U << 26) +#define RCC_RDEN1_M7LPTIM2LPEN (1U << 25) +#define RCC_RDEN1_M4LPTIM2LPEN (1U << 24) +#define RCC_RDEN1_M7LPTIM3EN (1U << 23) +#define RCC_RDEN1_M4LPTIM3EN (1U << 22) +#define RCC_RDEN1_M7LPTIM3LPEN (1U << 21) +#define RCC_RDEN1_M4LPTIM3LPEN (1U << 20) +#define RCC_RDEN1_M7LPTIM4EN (1U << 19) +#define RCC_RDEN1_M4LPTIM4EN (1U << 18) +#define RCC_RDEN1_M7LPTIM4LPEN (1U << 17) +#define RCC_RDEN1_M4LPTIM4LPEN (1U << 16) +#define RCC_RDEN1_M7LPTIM5EN (1U << 15) +#define RCC_RDEN1_M4LPTIM5EN (1U << 14) +#define RCC_RDEN1_M7LPTIM5LPEN (1U << 13) +#define RCC_RDEN1_M4LPTIM5LPEN (1U << 12) +#define RCC_RDEN1_M7LPUART1EN (1U << 11) +#define RCC_RDEN1_M4LPUART1EN (1U << 10) +#define RCC_RDEN1_M7LPUART1LPEN (1U << 9) +#define RCC_RDEN1_M4LPUART1LPEN (1U << 8) +#define RCC_RDEN1_M7LPUART2EN (1U << 7) +#define RCC_RDEN1_M4LPUART2EN (1U << 6) +#define RCC_RDEN1_M7LPUART2LPEN (1U << 5) +#define RCC_RDEN1_M4LPUART2LPEN (1U << 4) + +/* Bit definition for RCC_RDEN2 register ************************************/ + +#define RCC_RDEN2_M7COMPEN (1U << 31) +#define RCC_RDEN2_M4COMPEN (1U << 30) +#define RCC_RDEN2_M7COMPLPEN (1U << 29) +#define RCC_RDEN2_M4COMPLPEN (1U << 28) + +/* Bit definition for RCC_RDRST1 register ***********************************/ + +#define RCC_RDRST1_LPTIM1RST (1U << 28) +#define RCC_RDRST1_LPTIM2RST (1U << 24) +#define RCC_RDRST1_LPTIM3RST (1U << 20) +#define RCC_RDRST1_LPTIM4RST (1U << 16) +#define RCC_RDRST1_LPTIM5RST (1U << 12) +#define RCC_RDRST1_LPUART1RST (1U << 8) +#define RCC_RDRST1_LPUART2RST (1U << 4) + +/* Bit definition for RCC_RDRST2 register ***********************************/ + +#define RCC_RDRST2_COMPRST (1U << 28) + +/* Bit definition for RCC_BDCTRL register ***********************************/ + +#define RCC_BDCTRL_AFELSERDF (1U << 31) +#define RCC_BDCTRL_AFELSIRDF (1U << 30) +#define RCC_BDCTRL_LSELDOEN (1U << 28) +#define RCC_BDCTRL_LSIOVREN (1U << 27) +#define RCC_BDCTRL_LSIPFACK (1U << 26) +#define RCC_BDCTRL_LSIPFF (1U << 25) +#define RCC_BDCTRL_LSICSSEN (1U << 24) +#define RCC_BDCTRL_LSERDCNTEN (1U << 22) +#define RCC_BDCTRL_RTCLSFSW (1U << 21) +#define RCC_BDCTRL_RTCHSFSW (1U << 20) +#define RCC_BDCTRL_LSISECRDF (1U << 19) +#define RCC_BDCTRL_RTCEN (1U << 18) + +/* RTCSEL[1:0] */ +#define RCC_BDCTRL_RTCSEL_SHIFT (16) +#define RCC_BDCTRL_RTCSEL_MASK (0x03 << RCC_BDCTRL_RTCSEL_SHIFT) +#define RCC_BDCTRL_RTCSEL_NONE (0x00 << RCC_BDCTRL_RTCSEL_SHIFT) +#define RCC_BDCTRL_RTCSEL_LSE (0x01 << RCC_BDCTRL_RTCSEL_SHIFT) +#define RCC_BDCTRL_RTCSEL_LSI (0x02 << RCC_BDCTRL_RTCSEL_SHIFT) +#define RCC_BDCTRL_RTCSEL_HSE_DIV (0x03 << RCC_BDCTRL_RTCSEL_SHIFT) + +#define RCC_BDCTRL_BORRSTEN (1U << 15) +#define RCC_BDCTRL_C1LPRSTEN (1U << 14) +#define RCC_BDCTRL_C2LPRSTEN (1U << 13) +#define RCC_BDCTRL_BDRST (1U << 12) +#define RCC_BDCTRL_BKPEMC_RSTEN (1U << 11) +#define RCC_BDCTRL_RETEMC_RSTEN (1U << 10) +#define RCC_BDCTRL_LSECSSF (1U << 9) +#define RCC_BDCTRL_LSECSSEN (1U << 8) +#define RCC_BDCTRL_LSERDEN (1U << 7) +#define RCC_BDCTRL_LSEBP (1U << 6) +#define RCC_BDCTRL_LSERDF (1U << 5) +#define RCC_BDCTRL_LSEEN (1U << 4) +#define RCC_BDCTRL_LSIRDEN (1U << 3) +#define RCC_BDCTRL_LSISECEN (1U << 2) +#define RCC_BDCTRL_LSIRDF (1U << 1) +#define RCC_BDCTRL_LSIEN (1U << 0) + +/* Bit definition for RCC_LSICSSDL register *********************************/ + +/* Bit[31:0] DELAY */ +#define RCC_LSICSSDL_DELAY_SHIFT (0) +#define RCC_LSICSSDL_DELAY_MASK (0xFFFFFFFFU << RCC_LSICSSDL_DELAY_SHIFT) + +/* Bit definition for RCC_CTRLSTS register **********************************/ + +#define RCC_CTRLSTS_RMRSTF (1U << 31) +#define RCC_CTRLSTS_C1LPRSTF (1U << 15) +#define RCC_CTRLSTS_C2LPRSTF (1U << 14) +#define RCC_CTRLSTS_RETEMCRSTF (1U << 13) +#define RCC_CTRLSTS_BKPEMCRSTF (1U << 12) +#define RCC_CTRLSTS_BORRSTF (1U << 11) +#define RCC_CTRLSTS_MMURSTF (1U << 9) +#define RCC_CTRLSTS_WWDG1RSTF (1U << 7) +#define RCC_CTRLSTS_WWDG2RSTF (1U << 6) +#define RCC_CTRLSTS_IWDG1RSTF (1U << 5) +#define RCC_CTRLSTS_IWDG2RSTF (1U << 4) +#define RCC_CTRLSTS_CM4SFTRSTF (1U << 3) +#define RCC_CTRLSTS_CM7SFTRSTF (1U << 2) +#define RCC_CTRLSTS_PORRSTF (1U << 1) +#define RCC_CTRLSTS_PINRSTF (1U << 0) + +/* Bit definition for RCC_CLKINT1 register **********************************/ + +#define RCC_CLKINT1_LSECSSIE (1U << 30) +#define RCC_CLKINT1_LSECSSIF (1U << 29) +#define RCC_CLKINT1_LSECSSIC (1U << 28) +#define RCC_CLKINT1_HSECSSIF (1U << 25) +#define RCC_CLKINT1_HSECSSIC (1U << 24) +#define RCC_CLKINT1_BORIE (1U << 22) +#define RCC_CLKINT1_BORIF (1U << 21) +#define RCC_CLKINT1_BORIC (1U << 20) +#define RCC_CLKINT1_PLL1RDIE (1U << 18) +#define RCC_CLKINT1_PLL1RDIF (1U << 17) +#define RCC_CLKINT1_PLL1RDIC (1U << 16) +#define RCC_CLKINT1_PLL2RDIE (1U << 14) +#define RCC_CLKINT1_PLL2RDIF (1U << 13) +#define RCC_CLKINT1_PLL2RDIC (1U << 12) +#define RCC_CLKINT1_PLL3RDIE (1U << 10) +#define RCC_CLKINT1_PLL3RDIF (1U << 9) +#define RCC_CLKINT1_PLL3RDIC (1U << 8) +#define RCC_CLKINT1_SHRPLLRDIE (1U << 6) +#define RCC_CLKINT1_SHRPLLRDIF (1U << 5) +#define RCC_CLKINT1_SHRPLLRDIC (1U << 4) + +/* Bit definition for RCC_CLKINT2 register **********************************/ + +#define RCC_CLKINT2_HSERDIE (1U << 30) +#define RCC_CLKINT2_HSERDIF (1U << 29) +#define RCC_CLKINT2_HSERDIC (1U << 28) +#define RCC_CLKINT2_HSIRDIE (1U << 26) +#define RCC_CLKINT2_HSIRDIF (1U << 25) +#define RCC_CLKINT2_HSIRDIC (1U << 24) +#define RCC_CLKINT2_MSIRDIE (1U << 22) +#define RCC_CLKINT2_MSIRDIF (1U << 21) +#define RCC_CLKINT2_MSIRDIC (1U << 20) +#define RCC_CLKINT2_LSERDIE (1U << 18) +#define RCC_CLKINT2_LSERDIF (1U << 17) +#define RCC_CLKINT2_LSERDIC (1U << 16) +#define RCC_CLKINT2_LSIRDIE (1U << 14) +#define RCC_CLKINT2_LSIRDIF (1U << 13) +#define RCC_CLKINT2_LSIRDIC (1U << 12) +#define RCC_CLKINT2_HSICALEIE (1U << 10) +#define RCC_CLKINT2_HSICALEIF (1U << 9) +#define RCC_CLKINT2_HSICALEIC (1U << 8) +#define RCC_CLKINT2_MSICALEIE (1U << 6) +#define RCC_CLKINT2_MSICALEIF (1U << 5) +#define RCC_CLKINT2_MSICALEIC (1U << 4) + +/* Bit definition for RCC_CLKINT3 register **********************************/ + +#define RCC_CLKINT3_PLL1LKFIEN (1U << 18) +#define RCC_CLKINT3_PLL1LKFIF (1U << 17) +#define RCC_CLKINT3_PLL1LKFIC (1U << 16) +#define RCC_CLKINT3_PLL2LKFIEN (1U << 14) +#define RCC_CLKINT3_PLL2LKFIF (1U << 13) +#define RCC_CLKINT3_PLL2LKFIC (1U << 12) +#define RCC_CLKINT3_PLL3LKFIEN (1U << 10) +#define RCC_CLKINT3_PLL3LKFIF (1U << 9) +#define RCC_CLKINT3_PLL3LKFIC (1U << 8) +#define RCC_CLKINT3_SHRPLLLKFIE (1U << 6) +#define RCC_CLKINT3_SHRPLLLKFIF (1U << 5) +#define RCC_CLKINT3_SHRPLLLKFIC (1U << 4) +#define RCC_CLKINT3_LSIFIE (1U << 2) +#define RCC_CLKINT3_LSIFIF (1U << 1) +#define RCC_CLKINT3_LSIFIC (1U << 0) + +/* Bit definition for RCC_CFG1 register *************************************/ + +#define RCC_CFG1_WWDG2RSTDLCNT_SHIFT (24) /* WWDG2 reset delay counter shift */ +#define RCC_CFG1_WWDG2RSTDLCNT_MASK (0x0F << RCC_CFG1_WWDG2RSTDLCNT_SHIFT) + +#define RCC_CFG1_WWDG1RSTDLCNT_SHIFT (20) /* WWDG1 reset delay counter shift */ +#define RCC_CFG1_WWDG1RSTDLCNT_MASK (0x0F << RCC_CFG1_WWDG1RSTDLCNT_SHIFT) + +#define RCC_CFG1_WWDG2RSTEN (1U << 19) /* WWDG2 reset enable */ +#define RCC_CFG1_WWDG1RSTEN (1U << 18) /* WWDG1 reset enable */ + +#define RCC_CFG1_M7TRACEDIV_SHIFT (12) /* M7 trace clock divider shift */ +#define RCC_CFG1_M7TRACEDIV_MASK (0x0F << RCC_CFG1_M7TRACEDIV_SHIFT) +#define RCC_CFG1_M7TRACEDIV1 (0U << RCC_CFG1_M7TRACEDIV_SHIFT) +#define RCC_CFG1_M7TRACEDIV2 (1U << RCC_CFG1_M7TRACEDIV_SHIFT) +#define RCC_CFG1_M7TRACEDIV4 (2U << RCC_CFG1_M7TRACEDIV_SHIFT) +#define RCC_CFG1_M7TRACEDIV8 (4U << RCC_CFG1_M7TRACEDIV_SHIFT) +/* Bit definition for RCC_HSECAL register ***********************************/ + +/* [31:18] Reserved */ + +/* [17] HSE Calibration Count Enable */ +#define RCC_CFG1_M7TRACEDIV16 (7U << RCC_CFG1_M7TRACEDIV_SHIFT) +#define RCC_CFG1_M7TRACEDIV32 (8U << RCC_CFG1_M7TRACEDIV_SHIFT) +#define RCC_CFG1_M7TRACEDIV64 (9U << RCC_CFG1_M7TRACEDIV_SHIFT) +#define RCC_CFG1_M7TRACEDIV128 (10U << RCC_CFG1_M7TRACEDIV_SHIFT) +#define RCC_CFG1_M7TRACEDIV256 (11U << RCC_CFG1_M7TRACEDIV_SHIFT) +#define RCC_CFG1_M7TRACEDIV512 (12U << RCC_CFG1_M7TRACEDIV_SHIFT) + +#define RCC_CFG1_M4TRACEDIV_SHIFT (8) /* M4 trace clock divider shift */ +#define RCC_CFG1_M4TRACEDIV_MASK (0x0F << RCC_CFG1_M4TRACEDIV_SHIFT) +#define RCC_CFG1_M4TRACEDIV1 (0U << RCC_CFG1_M4TRACEDIV_SHIFT) +#define RCC_CFG1_M4TRACEDIV2 (1U << RCC_CFG1_M4TRACEDIV_SHIFT) +#define RCC_CFG1_M4TRACEDIV4 (2U << RCC_CFG1_M4TRACEDIV_SHIFT) +#define RCC_CFG1_M4TRACEDIV8 (4U << RCC_CFG1_M4TRACEDIV_SHIFT) +#define RCC_CFG1_M4TRACEDIV16 (7U << RCC_CFG1_M4TRACEDIV_SHIFT) +#define RCC_CFG1_M4TRACEDIV32 (8U << RCC_CFG1_M4TRACEDIV_SHIFT) +#define RCC_CFG1_M4TRACEDIV64 (9U << RCC_CFG1_M4TRACEDIV_SHIFT) +#define RCC_CFG1_M4TRACEDIV128 (10U << RCC_CFG1_M4TRACEDIV_SHIFT) +#define RCC_CFG1_M4TRACEDIV256 (11U << RCC_CFG1_M4TRACEDIV_SHIFT) +#define RCC_CFG1_M4TRACEDIV512 (12U << RCC_CFG1_M4TRACEDIV_SHIFT) + +/* Bit definition for RCC_AXIDIV1 register **********************************/ + +#define RCC_AXIDIV1_SDMMC1AXIDIV_SHIFT (24) /* SDMMC1 AXI clock divider shift position */ +#define RCC_AXIDIV1_SDMMC1AXIDIV_MASK (0x0F << RCC_AXIDIV1_SDMMC1AXIDIV_SHIFT) +#define RCC_AXIDIV1_SDMMC1AXIDIV1 (0U << RCC_AXIDIV1_SDMMC1AXIDIV_SHIFT) +#define RCC_AXIDIV1_SDMMC1AXIDIV2 (1U << RCC_AXIDIV1_SDMMC1AXIDIV_SHIFT) +#define RCC_AXIDIV1_SDMMC1AXIDIV4 (2U << RCC_AXIDIV1_SDMMC1AXIDIV_SHIFT) +#define RCC_AXIDIV1_SDMMC1AXIDIV8 (4U << RCC_AXIDIV1_SDMMC1AXIDIV_SHIFT) +#define RCC_AXIDIV1_SDMMC1AXIDIV16 (7U << RCC_AXIDIV1_SDMMC1AXIDIV_SHIFT) +#define RCC_AXIDIV1_SDMMC1AXIDIV32 (8U << RCC_AXIDIV1_SDMMC1AXIDIV_SHIFT) +#define RCC_AXIDIV1_SDMMC1AXIDIV64 (9U << RCC_AXIDIV1_SDMMC1AXIDIV_SHIFT) +#define RCC_AXIDIV1_SDMMC1AXIDIV128 (10U << RCC_AXIDIV1_SDMMC1AXIDIV_SHIFT) +#define RCC_AXIDIV1_SDMMC1AXIDIV256 (11U << RCC_AXIDIV1_SDMMC1AXIDIV_SHIFT) +#define RCC_AXIDIV1_SDMMC1AXIDIV512 (12U << RCC_AXIDIV1_SDMMC1AXIDIV_SHIFT) + +#define RCC_AXIDIV1_DSIREFDIV_SHIFT (16) /* DSI reference clock divider shift position */ +#define RCC_AXIDIV1_DSIREFDIV_MASK (0x0F << RCC_AXIDIV1_DSIREFDIV_SHIFT) +#define RCC_AXIDIV1_DSIREFDIV1 (0U << RCC_AXIDIV1_DSIREFDIV_SHIFT) +#define RCC_AXIDIV1_DSIREFDIV2 (1U << RCC_AXIDIV1_DSIREFDIV_SHIFT) +#define RCC_AXIDIV1_DSIREFDIV4 (2U << RCC_AXIDIV1_DSIREFDIV_SHIFT) +#define RCC_AXIDIV1_DSIREFDIV8 (4U << RCC_AXIDIV1_DSIREFDIV_SHIFT) +#define RCC_AXIDIV1_DSIREFDIV16 (7U << RCC_AXIDIV1_DSIREFDIV_SHIFT) +#define RCC_AXIDIV1_DSIREFDIV32 (8U << RCC_AXIDIV1_DSIREFDIV_SHIFT) +#define RCC_AXIDIV1_DSIREFDIV64 (9U << RCC_AXIDIV1_DSIREFDIV_SHIFT) +#define RCC_AXIDIV1_DSIREFDIV128 (10U << RCC_AXIDIV1_DSIREFDIV_SHIFT) +#define RCC_AXIDIV1_DSIREFDIV256 (11U << RCC_AXIDIV1_DSIREFDIV_SHIFT) +#define RCC_AXIDIV1_DSIREFDIV512 (12U << RCC_AXIDIV1_DSIREFDIV_SHIFT) + +#define RCC_AXIDIV1_LCDAXIDIV_SHIFT (12) /* LCD AXI clock divider shift position */ +#define RCC_AXIDIV1_LCDAXIDIV_MASK (0x0F << RCC_AXIDIV1_LCDAXIDIV_SHIFT) +#define RCC_AXIDIV1_LCDAXIDIV1 (0U << RCC_AXIDIV1_LCDAXIDIV_SHIFT) +#define RCC_AXIDIV1_LCDAXIDIV2 (1U << RCC_AXIDIV1_LCDAXIDIV_SHIFT) +#define RCC_AXIDIV1_LCDAXIDIV4 (2U << RCC_AXIDIV1_LCDAXIDIV_SHIFT) +#define RCC_AXIDIV1_LCDAXIDIV8 (4U << RCC_AXIDIV1_LCDAXIDIV_SHIFT) +#define RCC_AXIDIV1_LCDAXIDIV16 (7U << RCC_AXIDIV1_LCDAXIDIV_SHIFT) +#define RCC_AXIDIV1_LCDAXIDIV32 (8U << RCC_AXIDIV1_LCDAXIDIV_SHIFT) +#define RCC_AXIDIV1_LCDAXIDIV64 (9U << RCC_AXIDIV1_LCDAXIDIV_SHIFT) +#define RCC_AXIDIV1_LCDAXIDIV128 (10U << RCC_AXIDIV1_LCDAXIDIV_SHIFT) +#define RCC_AXIDIV1_LCDAXIDIV256 (11U << RCC_AXIDIV1_LCDAXIDIV_SHIFT) +#define RCC_AXIDIV1_LCDAXIDIV512 (12U << RCC_AXIDIV1_LCDAXIDIV_SHIFT) + +#define RCC_AXIDIV1_DVPMAXIDIV_SHIFT (8) /* DVP AXI clock divider shift position */ +#define RCC_AXIDIV1_DVPMAXIDIV_MASK (0x0F << RCC_AXIDIV1_DVPMAXIDIV_SHIFT) +#define RCC_AXIDIV1_DVPMAXIDIV1 (0U << RCC_AXIDIV1_DVPMAXIDIV_SHIFT) +#define RCC_AXIDIV1_DVPMAXIDIV2 (1U << RCC_AXIDIV1_DVPMAXIDIV_SHIFT) +#define RCC_AXIDIV1_DVPMAXIDIV4 (2U << RCC_AXIDIV1_DVPMAXIDIV_SHIFT) +#define RCC_AXIDIV1_DVPMAXIDIV8 (4U << RCC_AXIDIV1_DVPMAXIDIV_SHIFT) +#define RCC_AXIDIV1_DVPMAXIDIV16 (7U << RCC_AXIDIV1_DVPMAXIDIV_SHIFT) +#define RCC_AXIDIV1_DVPMAXIDIV32 (8U << RCC_AXIDIV1_DVPMAXIDIV_SHIFT) +#define RCC_AXIDIV1_DVPMAXIDIV64 (9U << RCC_AXIDIV1_DVPMAXIDIV_SHIFT) +#define RCC_AXIDIV1_DVPMAXIDIV128 (10U << RCC_AXIDIV1_DVPMAXIDIV_SHIFT) +#define RCC_AXIDIV1_DVPMAXIDIV256 (11U << RCC_AXIDIV1_DVPMAXIDIV_SHIFT) +#define RCC_AXIDIV1_DVPMAXIDIV512 (12U << RCC_AXIDIV1_DVPMAXIDIV_SHIFT) + +/* Bit definition for RCC_AXIDIV2 register **********************************/ + +#define RCC_AXIDIV2_DSIAXIPPIDIV_SHIFT (24) /* DSI AXI PP clock divider position */ +#define RCC_AXIDIV2_DSIAXIPPIDIV_MASK (0x0F << RCC_AXIDIV2_DSIAXIPPIDIV_SHIFT) +#define RCC_AXIDIV2_DSIAXIPPIDIV1 (0U << RCC_AXIDIV2_DSIAXIPPIDIV_SHIFT) +#define RCC_AXIDIV2_DSIAXIPPIDIV2 (1U << RCC_AXIDIV2_DSIAXIPPIDIV_SHIFT) +#define RCC_AXIDIV2_DSIAXIPPIDIV4 (2U << RCC_AXIDIV2_DSIAXIPPIDIV_SHIFT) +#define RCC_AXIDIV2_DSIAXIPPIDIV8 (4U << RCC_AXIDIV2_DSIAXIPPIDIV_SHIFT) +#define RCC_AXIDIV2_DSIAXIPPIDIV16 (7U << RCC_AXIDIV2_DSIAXIPPIDIV_SHIFT) +#define RCC_AXIDIV2_DSIAXIPPIDIV32 (8U << RCC_AXIDIV2_DSIAXIPPIDIV_SHIFT) +#define RCC_AXIDIV2_DSIAXIPPIDIV64 (9U << RCC_AXIDIV2_DSIAXIPPIDIV_SHIFT) +#define RCC_AXIDIV2_DSIAXIPPIDIV128 (10U << RCC_AXIDIV2_DSIAXIPPIDIV_SHIFT) +#define RCC_AXIDIV2_DSIAXIPPIDIV256 (11U << RCC_AXIDIV2_DSIAXIPPIDIV_SHIFT) +#define RCC_AXIDIV2_DSIAXIPPIDIV512 (12U << RCC_AXIDIV2_DSIAXIPPIDIV_SHIFT) + +#define RCC_AXIDIV2_DSIREFULPSDIV_SHIFT (16) /* DSI reference ULPS clock divider position */ +#define RCC_AXIDIV2_DSIREFULPSDIV_MASK (0x0F << RCC_AXIDIV2_DSIREFULPSDIV_SHIFT) +#define RCC_AXIDIV2_DSIREFULPSDIV1 (0U << RCC_AXIDIV2_DSIREFULPSDIV_SHIFT) +#define RCC_AXIDIV2_DSIREFULPSDIV2 (1U << RCC_AXIDIV2_DSIREFULPSDIV_SHIFT) +#define RCC_AXIDIV2_DSIREFULPSDIV4 (2U << RCC_AXIDIV2_DSIREFULPSDIV_SHIFT) +#define RCC_AXIDIV2_DSIREFULPSDIV8 (4U << RCC_AXIDIV2_DSIREFULPSDIV_SHIFT) +#define RCC_AXIDIV2_DSIREFULPSDIV16 (7U << RCC_AXIDIV2_DSIREFULPSDIV_SHIFT) +#define RCC_AXIDIV2_DSIREFULPSDIV32 (8U << RCC_AXIDIV2_DSIREFULPSDIV_SHIFT) +#define RCC_AXIDIV2_DSIREFULPSDIV64 (9U << RCC_AXIDIV2_DSIREFULPSDIV_SHIFT) +#define RCC_AXIDIV2_DSIREFULPSDIV128 (10U << RCC_AXIDIV2_DSIREFULPSDIV_SHIFT) +#define RCC_AXIDIV2_DSIREFULPSDIV256 (11U << RCC_AXIDIV2_DSIREFULPSDIV_SHIFT) +#define RCC_AXIDIV2_DSIREFULPSDIV512 (12U << RCC_AXIDIV2_DSIREFULPSDIV_SHIFT) + +#define RCC_AXIDIV2_SDRAMMEMDIV_SHIFT (8) /* SDRAM memory clock divider position */ +#define RCC_AXIDIV2_SDRAMMEMDIV_MASK (0x0F << RCC_AXIDIV2_SDRAMMEMDIV_SHIFT) +#define RCC_AXIDIV2_SDRAMMEMDIV1 (0U << RCC_AXIDIV2_SDRAMMEMDIV_SHIFT) +#define RCC_AXIDIV2_SDRAMMEMDIV2 (1U << RCC_AXIDIV2_SDRAMMEMDIV_SHIFT) +#define RCC_AXIDIV2_SDRAMMEMDIV4 (2U << RCC_AXIDIV2_SDRAMMEMDIV_SHIFT) +#define RCC_AXIDIV2_SDRAMMEMDIV8 (4U << RCC_AXIDIV2_SDRAMMEMDIV_SHIFT) +#define RCC_AXIDIV2_SDRAMMEMDIV16 (7U << RCC_AXIDIV2_SDRAMMEMDIV_SHIFT) +#define RCC_AXIDIV2_SDRAMMEMDIV32 (8U << RCC_AXIDIV2_SDRAMMEMDIV_SHIFT) +#define RCC_AXIDIV2_SDRAMMEMDIV64 (9U << RCC_AXIDIV2_SDRAMMEMDIV_SHIFT) +#define RCC_AXIDIV2_SDRAMMEMDIV128 (10U << RCC_AXIDIV2_SDRAMMEMDIV_SHIFT) +#define RCC_AXIDIV2_SDRAMMEMDIV256 (11U << RCC_AXIDIV2_SDRAMMEMDIV_SHIFT) +#define RCC_AXIDIV2_SDRAMMEMDIV512 (12U << RCC_AXIDIV2_SDRAMMEMDIV_SHIFT) + +#define RCC_AXIDIV2_FEMCM1AXIDIV_SHIFT (4) /* FEMC M1 AXI clock divider position */ +#define RCC_AXIDIV2_FEMCM1AXIDIV_MASK (0x0F << RCC_AXIDIV2_FEMCM1AXIDIV_SHIFT) + +#define RCC_AXIDIV2_FEMCM0AXIDIV_SHIFT (0) /* FEMC M0 AXI clock divider position */ +#define RCC_AXIDIV2_FEMCM0AXIDIV_MASK (0x0F << RCC_AXIDIV2_FEMCM0AXIDIV_SHIFT) + +/* Bit definition for RCC_AXISEL1 register **********************************/ + +/* DSI ULPS Clock Source Selection */ +#define RCC_AXISEL1_DSIULPSSEL_SHIFT (26) +#define RCC_AXISEL1_DSIULPSSEL_MASK (0x03 << RCC_AXISEL1_DSIULPSSEL_SHIFT) +#define RCC_AXISEL1_DSIULPSSEL_DSIREF (0x00 << RCC_AXISEL1_DSIULPSSEL_SHIFT) +#define RCC_AXISEL1_DSIULPSSEL_PLL3C (0x01 << RCC_AXISEL1_DSIULPSSEL_SHIFT) + +/* DSI Kernel Clock Source Selection */ +#define RCC_AXISEL1_DSIKERSEL_SHIFT (24) +#define RCC_AXISEL1_DSIKERSEL_MASK (0x03 << RCC_AXISEL1_DSIKERSEL_SHIFT) +#define RCC_AXISEL1_DSIKERSEL_DSIREF (0x00 << RCC_AXISEL1_DSIKERSEL_SHIFT) +#define RCC_AXISEL1_DSIKERSEL_PLL3C (0x01 << RCC_AXISEL1_DSIKERSEL_SHIFT) + +/* SDMMC1 Kernel Clock Source Selection */ +#define RCC_AXISEL1_SDMMC1KERSEL_SHIFT (20) +#define RCC_AXISEL1_SDMMC1KERSEL_MASK (0x07 << RCC_AXISEL1_SDMMC1KERSEL_SHIFT) +#define RCC_AXISEL1_SDMMC1KERSEL_AXIDIV (0x00 << RCC_AXISEL1_SDMMC1KERSEL_SHIFT) +#define RCC_AXISEL1_SDMMC1KERSEL_PERIPH (0x01 << RCC_AXISEL1_SDMMC1KERSEL_SHIFT) +#define RCC_AXISEL1_SDMMC1KERSEL_PLL2A (0x02 << RCC_AXISEL1_SDMMC1KERSEL_SHIFT) +#define RCC_AXISEL1_SDMMC1KERSEL_PLL3A (0x03 << RCC_AXISEL1_SDMMC1KERSEL_SHIFT) +#define RCC_AXISEL1_SDMMC1KERSEL_PLL1B (0x04 << RCC_AXISEL1_SDMMC1KERSEL_SHIFT) + +/* DSI PPI TX Clock Source Selection */ +#define RCC_AXISEL1_DSIPPITXSEL_SHIFT (16) +#define RCC_AXISEL1_DSIPPITXSEL_MASK (0x03 << RCC_AXISEL1_DSIPPITXSEL_SHIFT) +#define RCC_AXISEL1_DSIPPITXSEL_DSIDIV (0x00 << RCC_AXISEL1_DSIPPITXSEL_SHIFT) +#define RCC_AXISEL1_DSIPPITXSEL_PLL2B (0x01 << RCC_AXISEL1_DSIPPITXSEL_SHIFT) +#define RCC_AXISEL1_DSIPPITXSEL_PERIPH (0x02 << RCC_AXISEL1_DSIPPITXSEL_SHIFT) +#define RCC_AXISEL1_DSIPPITXSEL_AXIDIV (0x03 << RCC_AXISEL1_DSIPPITXSEL_SHIFT) + +/* LCD Kernel Clock Source Selection */ +#define RCC_AXISEL1_LCDKERSEL_SHIFT (12) +#define RCC_AXISEL1_LCDKERSEL_MASK (0x03 << RCC_AXISEL1_LCDKERSEL_SHIFT) +#define RCC_AXISEL1_LCDKERSEL_AXIDIV (0x00 << RCC_AXISEL1_LCDKERSEL_SHIFT) +#define RCC_AXISEL1_LCDKERSEL_PERIPH (0x01 << RCC_AXISEL1_LCDKERSEL_SHIFT) +#define RCC_AXISEL1_LCDKERSEL_PLL2C (0x02 << RCC_AXISEL1_LCDKERSEL_SHIFT) +#define RCC_AXISEL1_LCDKERSEL_PLL3B (0x03 << RCC_AXISEL1_LCDKERSEL_SHIFT) + +/* DVP1 Memory Clock Source Selection */ +#define RCC_AXISEL1_DVP1MSEL_SHIFT (10) +#define RCC_AXISEL1_DVP1MSEL_MASK (0x03 << RCC_AXISEL1_DVP1MSEL_SHIFT) +#define RCC_AXISEL1_DVP1MSEL_AXIDIV (0x00 << RCC_AXISEL1_DVP1MSEL_SHIFT) +#define RCC_AXISEL1_DVP1MSEL_PERIPH (0x01 << RCC_AXISEL1_DVP1MSEL_SHIFT) +#define RCC_AXISEL1_DVP1MSEL_PLL2C (0x02 << RCC_AXISEL1_DVP1MSEL_SHIFT) +#define RCC_AXISEL1_DVP1MSEL_PLL3A (0x03 << RCC_AXISEL1_DVP1MSEL_SHIFT) + +/* DVP2 Memory Clock Source Selection */ +#define RCC_AXISEL1_DVP2MSEL_SHIFT (8) +#define RCC_AXISEL1_DVP2MSEL_MASK (0x03 << RCC_AXISEL1_DVP2MSEL_SHIFT) +#define RCC_AXISEL1_DVP2MSEL_AXIDIV (0x00 << RCC_AXISEL1_DVP2MSEL_SHIFT) +#define RCC_AXISEL1_DVP2MSEL_PERIPH (0x01 << RCC_AXISEL1_DVP2MSEL_SHIFT) +#define RCC_AXISEL1_DVP2MSEL_PLL2C (0x02 << RCC_AXISEL1_DVP2MSEL_SHIFT) +#define RCC_AXISEL1_DVP2MSEL_PLL3A (0x03 << RCC_AXISEL1_DVP2MSEL_SHIFT) + +/* XSPI1 SSI Clock Source Selection */ +#define RCC_AXISEL1_XSPI1SSISEL_SHIFT (4) +#define RCC_AXISEL1_XSPI1SSISEL_MASK (0x07 << RCC_AXISEL1_XSPI1SSISEL_SHIFT) +#define RCC_AXISEL1_XSPI1SSISEL_AXI (0x00 << RCC_AXISEL1_XSPI1SSISEL_SHIFT) +#define RCC_AXISEL1_XSPI1SSISEL_PLL3C (0x01 << RCC_AXISEL1_XSPI1SSISEL_SHIFT) +#define RCC_AXISEL1_XSPI1SSISEL_PLL1B (0x02 << RCC_AXISEL1_XSPI1SSISEL_SHIFT) +#define RCC_AXISEL1_XSPI1SSISEL_PLL2A (0x03 << RCC_AXISEL1_XSPI1SSISEL_SHIFT) +#define RCC_AXISEL1_XSPI1SSISEL_PLL2C (0x04 << RCC_AXISEL1_XSPI1SSISEL_SHIFT) + +/* XSPI2 SSI Clock Source Selection */ +#define RCC_AXISEL1_XSPI2SSISEL_SHIFT (0) +#define RCC_AXISEL1_XSPI2SSISEL_MASK (0x07 << RCC_AXISEL1_XSPI2SSISEL_SHIFT) +#define RCC_AXISEL1_XSPI2SSISEL_AXI (0x00 << RCC_AXISEL1_XSPI2SSISEL_SHIFT) +#define RCC_AXISEL1_XSPI2SSISEL_PLL3C (0x01 << RCC_AXISEL1_XSPI2SSISEL_SHIFT) +#define RCC_AXISEL1_XSPI2SSISEL_PLL1B (0x02 << RCC_AXISEL1_XSPI2SSISEL_SHIFT) +#define RCC_AXISEL1_XSPI2SSISEL_PLL2A (0x03 << RCC_AXISEL1_XSPI2SSISEL_SHIFT) +#define RCC_AXISEL1_XSPI2SSISEL_PLL2C (0x04 << RCC_AXISEL1_XSPI2SSISEL_SHIFT) + +/* Bit definition for RCC_AXISEL2 register **********************************/ + +/* Bit[10:8] SDRAMMEMSEL */ +#define RCC_AXISEL2_SDRAMMEMSEL_SHIFT (8) +#define RCC_AXISEL2_SDRAMMEMSEL_MASK (0x07 << RCC_AXISEL2_SDRAMMEMSEL_SHIFT) +#define RCC_AXISEL2_SDRAMMEMSEL_AXIDIV (0x00 << RCC_AXISEL2_SDRAMMEMSEL_SHIFT) +#define RCC_AXISEL2_SDRAMMEMSEL_PERIPH (0x01 << RCC_AXISEL2_SDRAMMEMSEL_SHIFT) +#define RCC_AXISEL2_SDRAMMEMSEL_PLL2A (0x02 << RCC_AXISEL2_SDRAMMEMSEL_SHIFT) +#define RCC_AXISEL2_SDRAMMEMSEL_PLL3A (0x03 << RCC_AXISEL2_SDRAMMEMSEL_SHIFT) +#define RCC_AXISEL2_SDRAMMEMSEL_PLL1B (0x04 << RCC_AXISEL2_SDRAMMEMSEL_SHIFT) + +/* Bit[6:4] FEMCM1SEL */ +#define RCC_AXISEL2_FEMCM1SEL_SHIFT (4) +#define RCC_AXISEL2_FEMCM1SEL_MASK (0x07 << RCC_AXISEL2_FEMCM1SEL_SHIFT) +#define RCC_AXISEL2_FEMCM1SEL_AXIDIV (0x00 << RCC_AXISEL2_FEMCM1SEL_SHIFT) +#define RCC_AXISEL2_FEMCM1SEL_PERIPH (0x01 << RCC_AXISEL2_FEMCM1SEL_SHIFT) +#define RCC_AXISEL2_FEMCM1SEL_PLL2C (0x02 << RCC_AXISEL2_FEMCM1SEL_SHIFT) +#define RCC_AXISEL2_FEMCM1SEL_PLL3B (0x03 << RCC_AXISEL2_FEMCM1SEL_SHIFT) +#define RCC_AXISEL2_FEMCM1SEL_PLL1B (0x04 << RCC_AXISEL2_FEMCM1SEL_SHIFT) + +/* Bit[2:0] FEMCM0SEL */ +#define RCC_AXISEL2_FEMCM0SEL_SHIFT (0) +#define RCC_AXISEL2_FEMCM0SEL_MASK (0x07 << RCC_AXISEL2_FEMCM0SEL_SHIFT) +#define RCC_AXISEL2_FEMCM0SEL_AXIDIV (0x00 << RCC_AXISEL2_FEMCM0SEL_SHIFT) +#define RCC_AXISEL2_FEMCM0SEL_PERIPH (0x01 << RCC_AXISEL2_FEMCM0SEL_SHIFT) +#define RCC_AXISEL2_FEMCM0SEL_PLL2C (0x02 << RCC_AXISEL2_FEMCM0SEL_SHIFT) +#define RCC_AXISEL2_FEMCM0SEL_PLL3B (0x03 << RCC_AXISEL2_FEMCM0SEL_SHIFT) +#define RCC_AXISEL2_FEMCM0SEL_PLL1B (0x04 << RCC_AXISEL2_FEMCM0SEL_SHIFT) + +/* Bit definition for RCC_AXIEN1 register ***********************************/ + +#define RCC_AXIEN1_M7JPEGDEN (1U << 31) +#define RCC_AXIEN1_M4JPEGDEN (1U << 30) +#define RCC_AXIEN1_M7JPEGDLPEN (1U << 29) +#define RCC_AXIEN1_M4JPEGDLPEN (1U << 28) +#define RCC_AXIEN1_M7JPEGEEN (1U << 23) +#define RCC_AXIEN1_M4JPEGEEN (1U << 22) +#define RCC_AXIEN1_M7JPEGELPEN (1U << 21) +#define RCC_AXIEN1_M4JPEGELPEN (1U << 20) +#define RCC_AXIEN1_M7DMAMUX2EN (1U << 19) +#define RCC_AXIEN1_M4DMAMUX2EN (1U << 18) +#define RCC_AXIEN1_M7DMAMUX2LPEN (1U << 17) +#define RCC_AXIEN1_M4DMAMUX2LPEN (1U << 16) +#define RCC_AXIEN1_M7MDMAEN (1U << 15) +#define RCC_AXIEN1_M4MDMAEN (1U << 14) +#define RCC_AXIEN1_M7MDMALPEN (1U << 13) +#define RCC_AXIEN1_M4MDMALPEN (1U << 12) +#define RCC_AXIEN1_M7SDMMC1EN (1U << 11) +#define RCC_AXIEN1_M4SDMMC1EN (1U << 10) +#define RCC_AXIEN1_M7SDMMC1LPEN (1U << 9) +#define RCC_AXIEN1_M4SDMMC1LPEN (1U << 8) +#define RCC_AXIEN1_M7ECCM1EN (1U << 7) +#define RCC_AXIEN1_M4ECCM1EN (1U << 6) +#define RCC_AXIEN1_M7ECCM1LPEN (1U << 5) +#define RCC_AXIEN1_M4ECCM1LPEN (1U << 4) +#define RCC_AXIEN1_M7OTPCEN (1U << 3) +#define RCC_AXIEN1_M4OTPCEN (1U << 2) +#define RCC_AXIEN1_M7OTPCLPEN (1U << 1) +#define RCC_AXIEN1_M4OTPCLPEN (1U << 0) + +/* Bit definition for RCC_AXIEN2 register ***********************************/ + +#define RCC_AXIEN2_M7DSIEN (1U << 31) +#define RCC_AXIEN2_M4DSIEN (1U << 30) +#define RCC_AXIEN2_M7DSILPEN (1U << 29) +#define RCC_AXIEN2_M4DSILPEN (1U << 28) +#define RCC_AXIEN2_M7LCDEN (1U << 27) +#define RCC_AXIEN2_M4LCDEN (1U << 26) +#define RCC_AXIEN2_M7LCDLPEN (1U << 25) +#define RCC_AXIEN2_M4LCDLPEN (1U << 24) +#define RCC_AXIEN2_M7LCDAPBEN (1U << 23) +#define RCC_AXIEN2_M4LCDAPBEN (1U << 22) +#define RCC_AXIEN2_M7LCDAPBLPEN (1U << 21) +#define RCC_AXIEN2_M4LCDAPBLPEN (1U << 20) +#define RCC_AXIEN2_M7DVP1EN (1U << 19) +#define RCC_AXIEN2_M4DVP1EN (1U << 18) +#define RCC_AXIEN2_M7DVP1LPEN (1U << 17) +#define RCC_AXIEN2_M4DVP1LPEN (1U << 16) +#define RCC_AXIEN2_M7DVP1APBEN (1U << 15) +#define RCC_AXIEN2_M4DVP1APBEN (1U << 14) +#define RCC_AXIEN2_M7DVP1APBLPEN (1U << 13) +#define RCC_AXIEN2_M4DVP1APBLPEN (1U << 12) +#define RCC_AXIEN2_M7DVP2EN (1U << 11) +#define RCC_AXIEN2_M4DVP2EN (1U << 10) +#define RCC_AXIEN2_M7DVP2LPEN (1U << 9) +#define RCC_AXIEN2_M4DVP2LPEN (1U << 8) +#define RCC_AXIEN2_M7DVP2APBEN (1U << 7) +#define RCC_AXIEN2_M4DVP2APBEN (1U << 6) +#define RCC_AXIEN2_M7DVP2APBLPEN (1U << 5) +#define RCC_AXIEN2_M4DVP2APBLPEN (1U << 4) +#define RCC_AXIEN2_M7WWDG1EN (1U << 3) +#define RCC_AXIEN2_M4WWDG1EN (1U << 2) +#define RCC_AXIEN2_M7WWDG1LPEN (1U << 1) +#define RCC_AXIEN2_M4WWDG1LPEN (1U << 0) + +/* Bit definition for RCC_AXIEN3 register ***********************************/ + +#define RCC_AXIEN3_M7TASRAM2EN (1U << 31) +#define RCC_AXIEN3_M4TASRAM2EN (1U << 30) +#define RCC_AXIEN3_M7TASRAM2LPEN (1U << 29) +#define RCC_AXIEN3_M4TASRAM2LPEN (1U << 28) +#define RCC_AXIEN3_M7TASRAM3EN (1U << 27) +#define RCC_AXIEN3_M4TASRAM3EN (1U << 26) +#define RCC_AXIEN3_M7TASRAM3LPEN (1U << 25) +#define RCC_AXIEN3_M4TASRAM3LPEN (1U << 24) +#define RCC_AXIEN3_M7TCMEN (1U << 23) +#define RCC_AXIEN3_M4TCMEN (1U << 22) +#define RCC_AXIEN3_M7TCMLPEN (1U << 21) +#define RCC_AXIEN3_M4TCMLPEN (1U << 20) +#define RCC_AXIEN3_M7TCMAXIEN (1U << 19) +#define RCC_AXIEN3_M4TCMAXIEN (1U << 18) +#define RCC_AXIEN3_M7TCMAXILPEN (1U << 17) +#define RCC_AXIEN3_M4TCMAXILPEN (1U << 16) +#define RCC_AXIEN3_M7TCMAPBEN (1U << 15) +#define RCC_AXIEN3_M4TCMAPBEN (1U << 14) +#define RCC_AXIEN3_M7TCMAPBLPEN (1U << 13) +#define RCC_AXIEN3_M4TCMAPBLPEN (1U << 12) +#define RCC_AXIEN3_M7ASRAM1EN (1U << 11) +#define RCC_AXIEN3_M4ASRAM1EN (1U << 10) +#define RCC_AXIEN3_M7ASRAM1LPEN (1U << 9) +#define RCC_AXIEN3_M4ASRAM1LPEN (1U << 8) +#define RCC_AXIEN3_M7AXIROMEN (1U << 7) +#define RCC_AXIEN3_M4AXIROMEN (1U << 6) +#define RCC_AXIEN3_M7AXIROMLPEN (1U << 5) +#define RCC_AXIEN3_M4AXIROMLPEN (1U << 4) +#define RCC_AXIEN3_M7GPUEN (1U << 3) +#define RCC_AXIEN3_M4GPUEN (1U << 2) +#define RCC_AXIEN3_M7GPULPEN (1U << 1) +#define RCC_AXIEN3_M4GPULPEN (1U << 0) + +/* Bit definition for RCC_AXIEN4 register ***********************************/ + +#define RCC_AXIEN4_M7XSPI1EN (1U << 31) +#define RCC_AXIEN4_M4XSPI1EN (1U << 30) +#define RCC_AXIEN4_M7XSPI1LPEN (1U << 29) +#define RCC_AXIEN4_M4XSPI1LPEN (1U << 28) +#define RCC_AXIEN4_M7XSPI2EN (1U << 27) +#define RCC_AXIEN4_M4XSPI2EN (1U << 26) +#define RCC_AXIEN4_M7XSPI2LPEN (1U << 25) +#define RCC_AXIEN4_M4XSPI2LPEN (1U << 24) +#define RCC_AXIEN4_M7FEMCEN (1U << 23) +#define RCC_AXIEN4_M4FEMCEN (1U << 22) +#define RCC_AXIEN4_M7FEMCLPEN (1U << 21) +#define RCC_AXIEN4_M4FEMCLPEN (1U << 20) +#define RCC_AXIEN4_M7SDRAMEN (1U << 19) +#define RCC_AXIEN4_M4SDRAMEN (1U << 18) +#define RCC_AXIEN4_M7SDRAMLPEN (1U << 17) +#define RCC_AXIEN4_M4SDRAMLPEN (1U << 16) +#define RCC_AXIEN4_M7DSIULPSEN (1U << 3) +#define RCC_AXIEN4_M4DSIULPSEN (1U << 2) +#define RCC_AXIEN4_M7DSIULPSLPEN (1U << 1) +#define RCC_AXIEN4_M4DSIULPSLPEN (1U << 0) + +/* Bit definition for RCC_AXIRST1 register **********************************/ + +#define RCC_AXIRST1_JPEGDRST (1U << 28) +#define RCC_AXIRST1_JPEGERST (1U << 20) +#define RCC_AXIRST1_DMAMUX2RST (1U << 16) +#define RCC_AXIRST1_MDMARST (1U << 12) +#define RCC_AXIRST1_SDMMC1RST (1U << 9) +#define RCC_AXIRST1_SDHOST1RST (1U << 8) +#define RCC_AXIRST1_ECCM1RST (1U << 4) +#define RCC_AXIRST1_OTPCRST (1U << 0) + +/* Bit definition for RCC_AXIRST2 register **********************************/ + +#define RCC_AXIRST2_DSICFGRST (1U << 29) +#define RCC_AXIRST2_DSIRST (1U << 28) +#define RCC_AXIRST2_LCDRST (1U << 24) +#define RCC_AXIRST2_DVP1RST (1U << 16) +#define RCC_AXIRST2_DVP2RST (1U << 8) +#define RCC_AXIRST2_WWDG1RST (1U << 0) + +/* Bit definition for RCC_AXIRST3 register **********************************/ + +#define RCC_AXIRST3_GPURST (1U << 0) + +/* Bit definition for RCC_AXIRST4 register **********************************/ + +#define RCC_AXIRST4_XSPI1RST (1U << 28) +#define RCC_AXIRST4_XSPI2RST (1U << 24) +#define RCC_AXIRST4_FEMCCFGRST (1U << 21) +#define RCC_AXIRST4_FEMCRST (1U << 20) +#define RCC_AXIRST4_SDRAMRST (1U << 16) + +/* Bit definition for RCC_CFG2 register *************************************/ + +/* Cache & MMU */ +#define RCC_CFG2_M4CAHIEN (1U << 30) +#define RCC_CFG2_M4CAHIPCLKEN (1U << 28) +#define RCC_CFG2_M4CAHDEN (1U << 26) +#define RCC_CFG2_M4CAHDPCLKEN (1U << 24) + +#define RCC_CFG2_M7MMUEN (1U << 23) +#define RCC_CFG2_M7MMULPEN (1U << 22) +#define RCC_CFG2_M4MMUEN (1U << 21) +#define RCC_CFG2_M4MMULPEN (1U << 20) + +/* BKP SRAM */ +#define RCC_CFG2_M7SRAMBKPEN (1U << 19) +#define RCC_CFG2_M4SRAMBKPEN (1U << 18) +#define RCC_CFG2_M7SRAMBKPLPEN (1U << 17) +#define RCC_CFG2_M4SRAMBKPLPEN (1U << 16) + +/* SRAM1~4 */ +#define RCC_CFG2_M7SRAM1EN (1U << 15) +#define RCC_CFG2_M4SRAM1EN (1U << 14) +#define RCC_CFG2_M7SRAM1LPEN (1U << 13) +#define RCC_CFG2_M4SRAM1LPEN (1U << 12) + +#define RCC_CFG2_M7SRAM2EN (1U << 11) +#define RCC_CFG2_M4SRAM2EN (1U << 10) +#define RCC_CFG2_M7SRAM2LPEN (1U << 9) +#define RCC_CFG2_M4SRAM2LPEN (1U << 8) + +#define RCC_CFG2_M7SRAM3EN (1U << 7) +#define RCC_CFG2_M4SRAM3EN (1U << 6) +#define RCC_CFG2_M7SRAM3LPEN (1U << 5) +#define RCC_CFG2_M4SRAM3LPEN (1U << 4) + +#define RCC_CFG2_M7SRAM4EN (1U << 3) +#define RCC_CFG2_M4SRAM4EN (1U << 2) +#define RCC_CFG2_M7SRAM4LPEN (1U << 1) +#define RCC_CFG2_M4SRAM4LPEN (1U << 0) + +/* Bit definition for RCC_CFG3 register *************************************/ + +/* MCO1 */ +#define RCC_CFG3_MCO1SEL_SHIFT (28) +#define RCC_CFG3_MCO1SEL_MASK (0x0F << RCC_CFG3_MCO1SEL_SHIFT) +#define RCC_CFG3_MCO1SEL_LSI (0x08 << RCC_CFG3_MCO1SEL_SHIFT) +#define RCC_CFG3_MCO1SEL_HSI (0x09 << RCC_CFG3_MCO1SEL_SHIFT) +#define RCC_CFG3_MCO1SEL_MSI (0x0A << RCC_CFG3_MCO1SEL_SHIFT) +#define RCC_CFG3_MCO1SEL_LSE (0x0B << RCC_CFG3_MCO1SEL_SHIFT) +#define RCC_CFG3_MCO1SEL_HSE (0x0C << RCC_CFG3_MCO1SEL_SHIFT) +#define RCC_CFG3_MCO1SEL_PLL3B (0x0D << RCC_CFG3_MCO1SEL_SHIFT) + +#define RCC_CFG3_MCO1DIV_SHIFT (24) +#define RCC_CFG3_MCO1DIV_MASK (0x0F << RCC_CFG3_MCO1DIV_SHIFT) +#define RCC_CFG3_MCO1DIV_DIV1 (0x00 << RCC_CFG3_MCO1DIV_SHIFT) +#define RCC_CFG3_MCO1DIV_DIV2 (0x01 << RCC_CFG3_MCO1DIV_SHIFT) +#define RCC_CFG3_MCO1DIV_DIV4 (0x02 << RCC_CFG3_MCO1DIV_SHIFT) +#define RCC_CFG3_MCO1DIV_DIV8 (0x04 << RCC_CFG3_MCO1DIV_SHIFT) +#define RCC_CFG3_MCO1DIV_DIV16 (0x07 << RCC_CFG3_MCO1DIV_SHIFT) +#define RCC_CFG3_MCO1DIV_DIV32 (0x08 << RCC_CFG3_MCO1DIV_SHIFT) +#define RCC_CFG3_MCO1DIV_DIV64 (0x09 << RCC_CFG3_MCO1DIV_SHIFT) +#define RCC_CFG3_MCO1DIV_DIV128 (0x0A << RCC_CFG3_MCO1DIV_SHIFT) + +/* MCO2 */ +#define RCC_CFG3_MCO2SEL_SHIFT (20) +#define RCC_CFG3_MCO2SEL_MASK (0x0F << RCC_CFG3_MCO2SEL_SHIFT) +#define RCC_CFG3_MCO2SEL_SYSCLK (0x08 << RCC_CFG3_MCO2SEL_SHIFT) +#define RCC_CFG3_MCO2SEL_PLL1A (0x09 << RCC_CFG3_MCO2SEL_SHIFT) +#define RCC_CFG3_MCO2SEL_PLL2A (0x0A << RCC_CFG3_MCO2SEL_SHIFT) +#define RCC_CFG3_MCO2SEL_PLL3A (0x0B << RCC_CFG3_MCO2SEL_SHIFT) +#define RCC_CFG3_MCO2SEL_SHRPLL (0x0C << RCC_CFG3_MCO2SEL_SHIFT) +#define RCC_CFG3_MCO2SEL_LSE (0x0D << RCC_CFG3_MCO2SEL_SHIFT) + +#define RCC_CFG3_MCO2DIV_SHIFT (16) +#define RCC_CFG3_MCO2DIV_MASK (0x0F << RCC_CFG3_MCO2DIV_SHIFT) +#define RCC_CFG3_MCO2DIV_DIV1 (0x00 << RCC_CFG3_MCO2DIV_SHIFT) +#define RCC_CFG3_MCO2DIV_DIV2 (0x01 << RCC_CFG3_MCO2DIV_SHIFT) +#define RCC_CFG3_MCO2DIV_DIV4 (0x02 << RCC_CFG3_MCO2DIV_SHIFT) +#define RCC_CFG3_MCO2DIV_DIV8 (0x04 << RCC_CFG3_MCO2DIV_SHIFT) +#define RCC_CFG3_MCO2DIV_DIV16 (0x07 << RCC_CFG3_MCO2DIV_SHIFT) +#define RCC_CFG3_MCO2DIV_DIV32 (0x08 << RCC_CFG3_MCO2DIV_SHIFT) +#define RCC_CFG3_MCO2DIV_DIV64 (0x09 << RCC_CFG3_MCO2DIV_SHIFT) +#define RCC_CFG3_MCO2DIV_DIV128 (0x0A << RCC_CFG3_MCO2DIV_SHIFT) + +/* I2S CKIN 选择 */ +#define RCC_CFG3_I2SSEL_SHIFT (14) +#define RCC_CFG3_I2SSEL_MASK (0x03 << RCC_CFG3_I2SSEL_SHIFT) +#define RCC_CFG3_I2SSEL_I2S1 (0x00 << RCC_CFG3_I2SSEL_SHIFT) +#define RCC_CFG3_I2SSEL_I2S2 (0x01 << RCC_CFG3_I2SSEL_SHIFT) +#define RCC_CFG3_I2SSEL_I2S3 (0x02 << RCC_CFG3_I2SSEL_SHIFT) +#define RCC_CFG3_I2SSEL_I2S4 (0x03 << RCC_CFG3_I2SSEL_SHIFT) + +/* 外设时钟选择 */ +#define RCC_CFG3_PERSW_SHIFT (12) +#define RCC_CFG3_PERSW_MASK (0x03 << RCC_CFG3_PERSW_SHIFT) +#define RCC_CFG3_PERSW_HSI (0x00 << RCC_CFG3_PERSW_SHIFT) +#define RCC_CFG3_PERSW_MSI (0x02 << RCC_CFG3_PERSW_SHIFT) +#define RCC_CFG3_PERSW_HSE (0x03 << RCC_CFG3_PERSW_SHIFT) + +/* M7/M4 SysTick 分频器 */ +#define RCC_CFG3_M7STCLKDIV_SHIFT (4) +#define RCC_CFG3_M7STCLKDIV_MASK (0x0F << RCC_CFG3_M7STCLKDIV_SHIFT) +#define RCC_CFG3_M7STCLKDIV_DIV1 (0x00 << RCC_CFG3_M7STCLKDIV_SHIFT) +#define RCC_CFG3_M7STCLKDIV_DIV2 (0x01 << RCC_CFG3_M7STCLKDIV_SHIFT) +#define RCC_CFG3_M7STCLKDIV_DIV4 (0x02 << RCC_CFG3_M7STCLKDIV_SHIFT) +#define RCC_CFG3_M7STCLKDIV_DIV8 (0x04 << RCC_CFG3_M7STCLKDIV_SHIFT) +#define RCC_CFG3_M7STCLKDIV_DIV16 (0x07 << RCC_CFG3_M7STCLKDIV_SHIFT) +#define RCC_CFG3_M7STCLKDIV_DIV32 (0x08 << RCC_CFG3_M7STCLKDIV_SHIFT) +#define RCC_CFG3_M7STCLKDIV_DIV64 (0x09 << RCC_CFG3_M7STCLKDIV_SHIFT) +#define RCC_CFG3_M7STCLKDIV_DIV128 (0x0A << RCC_CFG3_M7STCLKDIV_SHIFT) +#define RCC_CFG3_M7STCLKDIV_DIV256 (0x0B << RCC_CFG3_M7STCLKDIV_SHIFT) +#define RCC_CFG3_M7STCLKDIV_DIV512 (0x0C << RCC_CFG3_M7STCLKDIV_SHIFT) + +#define RCC_CFG3_M4STCLKDIV_SHIFT (0) +#define RCC_CFG3_M4STCLKDIV_MASK (0x0F << RCC_CFG3_M4STCLKDIV_SHIFT) +#define RCC_CFG3_M4STCLKDIV_DIV1 (0x00 << RCC_CFG3_M4STCLKDIV_SHIFT) +#define RCC_CFG3_M4STCLKDIV_DIV2 (0x01 << RCC_CFG3_M4STCLKDIV_SHIFT) +#define RCC_CFG3_M4STCLKDIV_DIV4 (0x02 << RCC_CFG3_M4STCLKDIV_SHIFT) +#define RCC_CFG3_M4STCLKDIV_DIV8 (0x04 << RCC_CFG3_M4STCLKDIV_SHIFT) +#define RCC_CFG3_M4STCLKDIV_DIV16 (0x07 << RCC_CFG3_M4STCLKDIV_SHIFT) +#define RCC_CFG3_M4STCLKDIV_DIV32 (0x08 << RCC_CFG3_M4STCLKDIV_SHIFT) +#define RCC_CFG3_M4STCLKDIV_DIV64 (0x09 << RCC_CFG3_M4STCLKDIV_SHIFT) +#define RCC_CFG3_M4STCLKDIV_DIV128 (0x0A << RCC_CFG3_M4STCLKDIV_SHIFT) +#define RCC_CFG3_M4STCLKDIV_DIV256 (0x0B << RCC_CFG3_M4STCLKDIV_SHIFT) +#define RCC_CFG3_M4STCLKDIV_DIV512 (0x0C << RCC_CFG3_M4STCLKDIV_SHIFT) + +/* Bit definition for RCC_CFG4 register *************************************/ + +/* 总线时钟使能位 */ +#define RCC_CFG4_AHB1CLKEN (1U << 31) +#define RCC_CFG4_AHB2CLKEN (1U << 30) +#define RCC_CFG4_AHB3CLKEN (1U << 29) +#define RCC_CFG4_AHB5CLKEN (1U << 27) +#define RCC_CFG4_AHB6CLKEN (1U << 26) +#define RCC_CFG4_AXICLKEN (1U << 23) +#define RCC_CFG4_APB1CLKEN (1U << 22) +#define RCC_CFG4_APB2CLKEN (1U << 21) +#define RCC_CFG4_APB5CLKEN (1U << 20) +#define RCC_CFG4_APB6CLKEN (1U << 19) +#define RCC_CFG4_AHB9CLKEN (1U << 18) + +/* AXI 总线矩阵 */ +#define RCC_CFG4_AXIMM7GCLKEN (1U << 17) +#define RCC_CFG4_AXIMM4GCLKEN (1U << 16) + +/* 时钟源使能位 */ +#define RCC_CFG4_HSICGEN (1U << 15) +#define RCC_CFG4_HSIKERCGEN (1U << 14) +#define RCC_CFG4_HSECGEN (1U << 13) +#define RCC_CFG4_HSEKERCGEN (1U << 12) +#define RCC_CFG4_MSICGEN (1U << 11) +#define RCC_CFG4_MSIKERCGEN (1U << 10) + +#define RCC_CFG4_RSVD (1U << 9) + +/* 子系统时钟 */ +#define RCC_CFG4_AXIMM7CLKEN (1U << 8) +#define RCC_CFG4_AXIGCLKEN (1U << 7) +#define RCC_CFG4_AXIMM4CLKEN (1U << 6) +#define RCC_CFG4_DCMUM7CLKEN (1U << 5) +#define RCC_CFG4_DCMUM4CLKEN (1U << 4) +#define RCC_CFG4_AHBM1CLKEN (1U << 3) +#define RCC_CFG4_AHBM2CLKEN (1U << 2) +#define RCC_CFG4_AHBM3CLKEN (1U << 1) +#define RCC_CFG4_DCMURST (1U << 0) + +/* Bit definition for RCC_CFG5 register *************************************/ + +/* RTC HSE 分频 */ +#define RCC_CFG5_RTCHSEDIV_SHIFT (24) +#define RCC_CFG5_RTCHSEDIV_MASK (0x3F << RCC_CFG5_RTCHSEDIV_SHIFT) +#define RCC_CFG5_RTCHSEDIV(n) ((n) << RCC_CFG5_RTCHSEDIV_SHIFT) + +/* SRAM5 */ +#define RCC_CFG5_M7SRAM5EN (1U << 23) +#define RCC_CFG5_M4SRAM5EN (1U << 22) +#define RCC_CFG5_M7SRAM5LPEN (1U << 21) +#define RCC_CFG5_M4SRAM5LPEN (1U << 20) + +/* DCD 时钟 */ +#define RCC_CFG5_DCDCLKEN (1U << 16) + +/* TRNG 配置 */ +#define RCC_CFG5_TRNGEN (1U << 13) +#define RCC_CFG5_TRNGSEL (1U << 12) + +#define RCC_CFG5_TRNGDIV_SHIFT (8) +#define RCC_CFG5_TRNGDIV_MASK (0x0F << RCC_CFG5_TRNGDIV_SHIFT) +#define RCC_CFG5_TRNGDIV_DIV1 (0x00 << RCC_CFG5_TRNGDIV_SHIFT) +#define RCC_CFG5_TRNGDIV_DIV2 (0x01 << RCC_CFG5_TRNGDIV_SHIFT) +#define RCC_CFG5_TRNGDIV_DIV4 (0x02 << RCC_CFG5_TRNGDIV_SHIFT) +#define RCC_CFG5_TRNGDIV_DIV8 (0x04 << RCC_CFG5_TRNGDIV_SHIFT) +#define RCC_CFG5_TRNGDIV_DIV16 (0x07 << RCC_CFG5_TRNGDIV_SHIFT) +#define RCC_CFG5_TRNGDIV_DIV32 (0x08 << RCC_CFG5_TRNGDIV_SHIFT) +#define RCC_CFG5_TRNGDIV_DIV64 (0x09 << RCC_CFG5_TRNGDIV_SHIFT) +#define RCC_CFG5_TRNGDIV_DIV128 (0x0A << RCC_CFG5_TRNGDIV_SHIFT) +#define RCC_CFG5_TRNGDIV_DIV256 (0x0B << RCC_CFG5_TRNGDIV_SHIFT) +#define RCC_CFG5_TRNGDIV_DIV512 (0x0C << RCC_CFG5_TRNGDIV_SHIFT) + +/* DSI HSE 分频 */ +#define RCC_CFG5_DSIHSEDIV_SHIFT (4) +#define RCC_CFG5_DSIHSEDIV_MASK (0x0F << RCC_CFG5_DSIHSEDIV_SHIFT) +#define RCC_CFG5_DSIHSEDIV1 (0x00 << RCC_CFG5_DSIHSEDIV_SHIFT) +#define RCC_CFG5_DSIHSEDIV2 (0x01 << RCC_CFG5_DSIHSEDIV_SHIFT) + +/* RTC HSI 分频 */ +#define RCC_CFG5_RTCHSIDIV_SHIFT (0) +#define RCC_CFG5_RTCHSIDIV_MASK (0x0F << RCC_CFG5_RTCHSIDIV_SHIFT) +#define RCC_CFG5_RTCHSIDIV_DIV1 (0x00 << RCC_CFG5_RTCHSIDIV_SHIFT) +#define RCC_CFG5_RTCHSIDIV_DIV2 (0x01 << RCC_CFG5_RTCHSIDIV_SHIFT) +#define RCC_CFG5_RTCHSIDIV_DIV4 (0x02 << RCC_CFG5_RTCHSIDIV_SHIFT) +#define RCC_CFG5_RTCHSIDIV_DIV8 (0x04 << RCC_CFG5_RTCHSIDIV_SHIFT) +#define RCC_CFG5_RTCHSIDIV_DIV16 (0x07 << RCC_CFG5_RTCHSIDIV_SHIFT) +#define RCC_CFG5_RTCHSIDIV_DIV32 (0x08 << RCC_CFG5_RTCHSIDIV_SHIFT) +#define RCC_CFG5_RTCHSIDIV_DIV64 (0x09 << RCC_CFG5_RTCHSIDIV_SHIFT) +#define RCC_CFG5_RTCHSIDIV_DIV128 (0x0A << RCC_CFG5_RTCHSIDIV_SHIFT) +#define RCC_CFG5_RTCHSIDIV_DIV256 (0x0B << RCC_CFG5_RTCHSIDIV_SHIFT) +#define RCC_CFG5_RTCHSIDIV_DIV512 (0x0C << RCC_CFG5_RTCHSIDIV_SHIFT) + +/* Bit definition for RCC_M4RSTREL register *********************************/ + +/* 0: CM4 in reset state;1: Release CM4 reset */ +#define RCC_M4RSTREL_EN (1U << 0) + +/* Bit definition for RCC_LSERDDL register **********************************/ + +/* 32-bit delay counter */ +#define RCC_LSERDDL_DELAY_SHIFT (0) +#define RCC_LSERDDL_DELAY_MASK (0xFFFFFFFFU << RCC_LSERDDL_DELAY_SHIFT) + +/* Bit definition for RCC_MSIRDDL register **********************************/ + +/* 32-bit delay counter */ +#define RCC_MSIRDDL_DELAY_SHIFT (0) +#define RCC_MSIRDDL_DELAY_MASK (0xFFFFFFFFU << RCC_MSIRDDL_DELAY_SHIFT) + +/* Bit definition for RCC_HSERDDL register **********************************/ + +/* 32-bit delay counter */ +#define RCC_HSERDDL_DELAY_SHIFT (0) +#define RCC_HSERDDL_DELAY_MASK (0xFFFFFFFFU << RCC_HSERDDL_DELAY_SHIFT) + +/* Bit definition for RCC_PLLSFTLK register *********************************/ + +/* [31:29] Reserved */ + +/* [28:25] SDRAM Delay Chain Select */ +#define RCC_PLLSFTLK_SDRAMDLSEL_SHIFT (25) +#define RCC_PLLSFTLK_SDRAMDLSEL_MASK (0x0F << RCC_PLLSFTLK_SDRAMDLSEL_SHIFT) + +#define RCC_PLLSFTLK_SDRAMDLSEL_0P2NS (0x0 << RCC_PLLSFTLK_SDRAMDLSEL_SHIFT) +#define RCC_PLLSFTLK_SDRAMDLSEL_0P4NS (0x1 << RCC_PLLSFTLK_SDRAMDLSEL_SHIFT) +#define RCC_PLLSFTLK_SDRAMDLSEL_0P6NS (0x2 << RCC_PLLSFTLK_SDRAMDLSEL_SHIFT) +#define RCC_PLLSFTLK_SDRAMDLSEL_0P8NS (0x3 << RCC_PLLSFTLK_SDRAMDLSEL_SHIFT) +#define RCC_PLLSFTLK_SDRAMDLSEL_1P0NS (0x4 << RCC_PLLSFTLK_SDRAMDLSEL_SHIFT) +#define RCC_PLLSFTLK_SDRAMDLSEL_1P2NS (0x5 << RCC_PLLSFTLK_SDRAMDLSEL_SHIFT) +#define RCC_PLLSFTLK_SDRAMDLSEL_1P4NS (0x6 << RCC_PLLSFTLK_SDRAMDLSEL_SHIFT) +#define RCC_PLLSFTLK_SDRAMDLSEL_1P6NS (0x7 << RCC_PLLSFTLK_SDRAMDLSEL_SHIFT) +#define RCC_PLLSFTLK_SDRAMDLSEL_1P8NS (0x8 << RCC_PLLSFTLK_SDRAMDLSEL_SHIFT) +#define RCC_PLLSFTLK_SDRAMDLSEL_2P0NS (0x9 << RCC_PLLSFTLK_SDRAMDLSEL_SHIFT) +#define RCC_PLLSFTLK_SDRAMDLSEL_2P2NS (0xA << RCC_PLLSFTLK_SDRAMDLSEL_SHIFT) +#define RCC_PLLSFTLK_SDRAMDLSEL_2P4NS (0xB << RCC_PLLSFTLK_SDRAMDLSEL_SHIFT) +#define RCC_PLLSFTLK_SDRAMDLSEL_2P6NS (0xC << RCC_PLLSFTLK_SDRAMDLSEL_SHIFT) +#define RCC_PLLSFTLK_SDRAMDLSEL_2P8NS (0xD << RCC_PLLSFTLK_SDRAMDLSEL_SHIFT) +#define RCC_PLLSFTLK_SDRAMDLSEL_3P0NS (0xE << RCC_PLLSFTLK_SDRAMDLSEL_SHIFT) +#define RCC_PLLSFTLK_SDRAMDLSEL_3P2NS (0xF << RCC_PLLSFTLK_SDRAMDLSEL_SHIFT) + +/* [24] SDRAM Delay Chain Enable */ +#define RCC_PLLSFTLK_SDRAMDLEN (1U << 24) +/* [23:6] Reserved */ + +/* [5] SHRTIM AFE Soft Reset */ +#define RCC_PLLSFTLK_SHRTIMAFERST (1U << 5) +/* [4] Reserved */ + +/* [3] SHRPLL Software Lock */ +#define RCC_PLLSFTLK_SHRPLLSFTLK (1U << 3) +/* [2] PLL3 Software Lock */ +#define RCC_PLLSFTLK_PLL3SFTLK (1U << 2) +/* [1] PLL2 Software Lock */ +#define RCC_PLLSFTLK_PLL2SFTLK (1U << 1) +/* [0] PLL1 Software Lock */ +#define RCC_PLLSFTLK_PLL1SFTLK (1U << 0) + +/* Bit definition for RCC_HSEOS register ************************************/ + +/* [31:24] HSE Max Positive Deviation Threshold */ +#define RCC_HSEOS_HSEMAXPDTHR_SHIFT (24) +#define RCC_HSEOS_HSEMAXPDTHR_MASK (0xFFUL << RCC_HSEOS_HSEMAXPDTHR_SHIFT) + +/* [23:16] HSE Min Negative Deviation Threshold */ +#define RCC_HSEOS_HSEMINNDTHR_SHIFT (16) +#define RCC_HSEOS_HSEMINNDTHR_MASK (0xFFUL << RCC_HSEOS_HSEMINNDTHR_SHIFT) + +/* [15:8] HSE Offset Threshold for 5% Detection */ +#define RCC_HSEOS_HSEOSTHR_SHIFT (8) +#define RCC_HSEOS_HSEOSTHR_MASK (0xFFUL << RCC_HSEOS_HSEOSTHR_SHIFT) + +/* Single Frequency */ +#define RCC_HSEOS_HSEOSTHR_4MHZ (0x20UL << RCC_HSEOS_HSEOSTHR_SHIFT) +#define RCC_HSEOS_HSEOSTHR_5MHZ (0x1AUL << RCC_HSEOS_HSEOSTHR_SHIFT) +#define RCC_HSEOS_HSEOSTHR_6MHZ (0x16UL << RCC_HSEOS_HSEOSTHR_SHIFT) +#define RCC_HSEOS_HSEOSTHR_7MHZ (0x12UL << RCC_HSEOS_HSEOSTHR_SHIFT) +#define RCC_HSEOS_HSEOSTHR_8MHZ (0x10UL << RCC_HSEOS_HSEOSTHR_SHIFT) +#define RCC_HSEOS_HSEOSTHR_9MHZ (0x0EUL << RCC_HSEOS_HSEOSTHR_SHIFT) +#define RCC_HSEOS_HSEOSTHR_10MHZ (0x0DUL << RCC_HSEOS_HSEOSTHR_SHIFT) +#define RCC_HSEOS_HSEOSTHR_11MHZ (0x0CUL << RCC_HSEOS_HSEOSTHR_SHIFT) +#define RCC_HSEOS_HSEOSTHR_12MHZ (0x0BUL << RCC_HSEOS_HSEOSTHR_SHIFT) +#define RCC_HSEOS_HSEOSTHR_13MHZ (0x0AUL << RCC_HSEOS_HSEOSTHR_SHIFT) + +/* Range Frequency */ +#define RCC_HSEOS_HSEOSTHR_14_15MHZ (0x09UL << RCC_HSEOS_HSEOSTHR_SHIFT) +#define RCC_HSEOS_HSEOSTHR_16_17MHZ (0x08UL << RCC_HSEOS_HSEOSTHR_SHIFT) +#define RCC_HSEOS_HSEOSTHR_18_19MHZ (0x07UL << RCC_HSEOS_HSEOSTHR_SHIFT) +#define RCC_HSEOS_HSEOSTHR_20_24MHZ (0x06UL << RCC_HSEOS_HSEOSTHR_SHIFT) +#define RCC_HSEOS_HSEOSTHR_25_30MHZ (0x05UL << RCC_HSEOS_HSEOSTHR_SHIFT) +#define RCC_HSEOS_HSEOSTHR_31_39MHZ (0x04UL << RCC_HSEOS_HSEOSTHR_SHIFT) +#define RCC_HSEOS_HSEOSTHR_40_50MHZ (0x03UL << RCC_HSEOS_HSEOSTHR_SHIFT) + +/* [7] Reserved */ + +/* [6] HSE Max Positive Deviation Flag (rc_w1) */ +#define RCC_HSEOS_HSEMAXPDF (1U << 6) +/* [5] HSE Min Negative Deviation Flag (rc_w1) */ +#define RCC_HSEOS_HSEMINNDF (1U << 5) +/* [4] HSE Offset Flag ≥5% (rc_w1) */ +#define RCC_HSEOS_HSEOSF (1U << 4) +/* [3] Reserved */ + +/* [2] HSE Max Positive Deviation Detect Enable */ +#define RCC_HSEOS_HSEMAXPDEN (1U << 2) +/* [1] HSE Min Negative Deviation Detect Enable */ +#define RCC_HSEOS_HSEMINNDEN (1U << 1) +/* [0] HSE Offset Detect Enable */ +#define RCC_HSEOS_HSEOSEN (1U << 0) + +/* Bit definition for RCC_HSECAL register ***********************************/ + +/* [31:18] Reserved */ + +/* [17] HSE Calibration Count Enable */ +#define RCC_HSECAL_HSECALCNTEN (1U << 17) + +/* [16] HSE Calibration Count Ready Flag (read-only) */ +#define RCC_HSECAL_HSECALCNTF (1U << 16) + +/* [15:0] HSE Calibration Count Value (read-only) */ +#define RCC_HSECAL_HSECALCNT_SHIFT (0) + +#define RCC_HSECAL_HSECALCNT_MASK (0xFFFFU << RCC_HSECAL_HSECALCNT_SHIFT) + +/* Bit definition for RCC_LSEOS register ************************************/ + +/* [31:26] Reserved */ + +/* [25] LSE Calibration Count Enable */ +#define RCC_LSEOS_LSECALCNTEN (1U << 25) +/* [24] LSE Calibration Count Ready Flag (read-only) */ +#define RCC_LSEOS_LSECALCNTF (1U << 24) + +/* [23:16] LSE Calibration Count Value (read-only) */ +#define RCC_LSEOS_LSECALCNT_SHIFT (16) +#define RCC_LSEOS_LSECALCNT_MASK (0xFFUL << RCC_LSEOS_LSECALCNT_SHIFT) + +/* [15:10] Reserved */ + +/* [9] LSE Offset Flag ≥10% (rc_w1) */ +#define RCC_LSEOS_LSEOSF (1U << 9) + +/* [8] LSE Offset Detect Enable */ +#define RCC_LSEOS_LSEOSEN (1U << 8) + +/* [7:0] LSE Offset Threshold for 10% Detection */ +#define RCC_LSEOS_LSEOSTHR_SHIFT (0) +#define RCC_LSEOS_LSEOSTHR_MASK (0xFFUL << RCC_LSEOS_LSEOSTHR_SHIFT) + +/* Bit definition for RCC_PLLFD register ************************************/ + +/* [31:12] Reserved */ + +/* [11] SHRPLL Clock Gate Status (read-only) */ +#define RCC_PLLFD_SHRPLLGF (1U << 11) + +/* [10] PLL3 Clock Gate Status (read-only) */ +#define RCC_PLLFD_PLL3GF (1U << 10) + +/* [9] PLL2 Clock Gate Status (read-only) */ +#define RCC_PLLFD_PLL2GF (1U << 9) + +/* [8] PLL1 Clock Gate Status (read-only) */ +#define RCC_PLLFD_PLL1GF (1U << 8) + +/* [7] SHRPLL Fail Flag (read-only) */ +#define RCC_PLLFD_SHRPLLFF (1U << 7) + +/* [6] PLL3 Fail Flag (read-only) */ +#define RCC_PLLFD_PLL3FF (1U << 6) + +/* [5] PLL2 Fail Flag (read-only) */ +#define RCC_PLLFD_PLL2FF (1U << 5) + +/* [4] PLL1 Fail Flag (read-only) */ +#define RCC_PLLFD_PLL1FF (1U << 4) + +/* [3] SHRPLL Fail Detect Enable */ +#define RCC_PLLFD_SHRPLLFEN (1U << 3) + +/* [2] PLL3 Fail Detect Enable */ +#define RCC_PLLFD_PLL3FEN (1U << 2) + +/* [1] PLL2 Fail Detect Enable */ +#define RCC_PLLFD_PLL2FEN (1U << 1) + +/* [0] PLL1 Fail Detect Enable */ +#define RCC_PLLFD_PLL1FEN (1U << 0) + +#endif /* __ARCH_ARM_SRC_N32H7_HARDWARE_N32H76X_RCC_H */ diff --git a/arch/arm/src/n32h7/hardware/n32h76x_uart.h b/arch/arm/src/n32h7/hardware/n32h76x_uart.h new file mode 100644 index 0000000000000..7b9eb6a328888 --- /dev/null +++ b/arch/arm/src/n32h7/hardware/n32h76x_uart.h @@ -0,0 +1,415 @@ +/**************************************************************************** + * arch/arm/src/n32h7/hardware/n32h76x_uart.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __ARCH_ARM_SRC_N32H7_HARDWARE_N32H76X_UART_H +#define __ARCH_ARM_SRC_N32H7_HARDWARE_N32H76X_UART_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include "chip.h" +#include "hardware/n32h7_memorymap.h" + +#if defined(CONFIG_N32H7_N32H76X) + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* Register Offsets *********************************************************/ + +#define N32_USART_CTRL1_OFFSET 0x0000 /* Control register 1 */ +#define N32_USART_CTRL2_OFFSET 0x0004 /* Control register 2 */ +#define N32_USART_CTRL3_OFFSET 0x0008 /* Control register 3 */ +#define N32_USART_STS_OFFSET 0x000C /* Status register */ +#define N32_USART_DAT_OFFSET 0x0010 /* Data register */ +#define N32_USART_BRCF_OFFSET 0x0014 /* Baud Rate Configuration register */ +#define N32_USART_GTP_OFFSET 0x0018 /* Guard Time and Prescaler register */ +#define N32_USART_FIFO_OFFSET 0x001C /* FIFO Configuration register */ +#define N32_USART_IFW_OFFSET 0x0020 /* Idle Frame Width register */ +#define N32_USART_RTO_OFFSET 0x0024 /* Receiver Timeout register */ + +/* Register Addresses *******************************************************/ + +#if N32H7_NUSART > 0 +# define N32_USART1_CTRL1 (N32_USART1_BASE + N32_USART_CTRL1_OFFSET) +# define N32_USART1_CTRL2 (N32_USART1_BASE + N32_USART_CTRL2_OFFSET) +# define N32_USART1_CTRL3 (N32_USART1_BASE + N32_USART_CTRL3_OFFSET) +# define N32_USART1_STS (N32_USART1_BASE + N32_USART_STS_OFFSET) +# define N32_USART1_DAT (N32_USART1_BASE + N32_USART_DAT_OFFSET) +# define N32_USART1_BRCF (N32_USART1_BASE + N32_USART_BRCF_OFFSET) +# define N32_USART1_GTP (N32_USART1_BASE + N32_USART_GTP_OFFSET) +# define N32_USART1_FIFO (N32_USART1_BASE + N32_USART_FIFO_OFFSET) +# define N32_USART1_IFW (N32_USART1_BASE + N32_USART_IFW_OFFSET) +# define N32_USART1_RTO (N32_USART1_BASE + N32_USART_RTO_OFFSET) +#endif + +#if N32H7_NUSART > 1 +# define N32_USART2_CTRL1 (N32_USART2_BASE + N32_USART_CTRL1_OFFSET) +# define N32_USART2_CTRL2 (N32_USART2_BASE + N32_USART_CTRL2_OFFSET) +# define N32_USART2_CTRL3 (N32_USART2_BASE + N32_USART_CTRL3_OFFSET) +# define N32_USART2_STS (N32_USART2_BASE + N32_USART_STS_OFFSET) +# define N32_USART2_DAT (N32_USART2_BASE + N32_USART_DAT_OFFSET) +# define N32_USART2_BRCF (N32_USART2_BASE + N32_USART_BRCF_OFFSET) +# define N32_USART2_GTP (N32_USART2_BASE + N32_USART_GTP_OFFSET) +# define N32_USART2_FIFO (N32_USART2_BASE + N32_USART_FIFO_OFFSET) +# define N32_USART2_IFW (N32_USART2_BASE + N32_USART_IFW_OFFSET) +# define N32_USART2_RTO (N32_USART2_BASE + N32_USART_RTO_OFFSET) +#endif + +#if N32H7_NUSART > 2 +# define N32_USART3_CTRL1 (N32_USART3_BASE + N32_USART_CTRL1_OFFSET) +# define N32_USART3_CTRL2 (N32_USART3_BASE + N32_USART_CTRL2_OFFSET) +# define N32_USART3_CTRL3 (N32_USART3_BASE + N32_USART_CTRL3_OFFSET) +# define N32_USART3_STS (N32_USART3_BASE + N32_USART_STS_OFFSET) +# define N32_USART3_DAT (N32_USART3_BASE + N32_USART_DAT_OFFSET) +# define N32_USART3_BRCF (N32_USART3_BASE + N32_USART_BRCF_OFFSET) +# define N32_USART3_GTP (N32_USART3_BASE + N32_USART_GTP_OFFSET) +# define N32_USART3_FIFO (N32_USART3_BASE + N32_USART_FIFO_OFFSET) +# define N32_USART3_IFW (N32_USART3_BASE + N32_USART_IFW_OFFSET) +# define N32_USART3_RTO (N32_USART3_BASE + N32_USART_RTO_OFFSET) +#endif + +#if N32H7_NUSART > 3 +# define N32_USART4_CTRL1 (N32_USART4_BASE + N32_USART_CTRL1_OFFSET) +# define N32_USART4_CTRL2 (N32_USART4_BASE + N32_USART_CTRL2_OFFSET) +# define N32_USART4_CTRL3 (N32_USART4_BASE + N32_USART_CTRL3_OFFSET) +# define N32_USART4_STS (N32_USART4_BASE + N32_USART_STS_OFFSET) +# define N32_USART4_DAT (N32_USART4_BASE + N32_USART_DAT_OFFSET) +# define N32_USART4_BRCF (N32_USART4_BASE + N32_USART_BRCF_OFFSET) +# define N32_USART4_GTP (N32_USART4_BASE + N32_USART_GTP_OFFSET) +# define N32_USART4_FIFO (N32_USART4_BASE + N32_USART_FIFO_OFFSET) +# define N32_USART4_IFW (N32_USART4_BASE + N32_USART_IFW_OFFSET) +# define N32_USART4_RTO (N32_USART4_BASE + N32_USART_RTO_OFFSET) +#endif + +#if N32H7_NUSART > 4 +# define N32_USART5_CTRL1 (N32_USART5_BASE + N32_USART_CTRL1_OFFSET) +# define N32_USART5_CTRL2 (N32_USART5_BASE + N32_USART_CTRL2_OFFSET) +# define N32_USART5_CTRL3 (N32_USART5_BASE + N32_USART_CTRL3_OFFSET) +# define N32_USART5_STS (N32_USART5_BASE + N32_USART_STS_OFFSET) +# define N32_USART5_DAT (N32_USART5_BASE + N32_USART_DAT_OFFSET) +# define N32_USART5_BRCF (N32_USART5_BASE + N32_USART_BRCF_OFFSET) +# define N32_USART5_GTP (N32_USART5_BASE + N32_USART_GTP_OFFSET) +# define N32_USART5_FIFO (N32_USART5_BASE + N32_USART_FIFO_OFFSET) +# define N32_USART5_IFW (N32_USART5_BASE + N32_USART_IFW_OFFSET) +# define N32_USART5_RTO (N32_USART5_BASE + N32_USART_RTO_OFFSET) +#endif + +#if N32H7_NUSART > 5 +# define N32_USART6_CTRL1 (N32_USART6_BASE + N32_USART_CTRL1_OFFSET) +# define N32_USART6_CTRL2 (N32_USART6_BASE + N32_USART_CTRL2_OFFSET) +# define N32_USART6_CTRL3 (N32_USART6_BASE + N32_USART_CTRL3_OFFSET) +# define N32_USART6_STS (N32_USART6_BASE + N32_USART_STS_OFFSET) +# define N32_USART6_DAT (N32_USART6_BASE + N32_USART_DAT_OFFSET) +# define N32_USART6_BRCF (N32_USART6_BASE + N32_USART_BRCF_OFFSET) +# define N32_USART6_GTP (N32_USART6_BASE + N32_USART_GTP_OFFSET) +# define N32_USART6_FIFO (N32_USART6_BASE + N32_USART_FIFO_OFFSET) +# define N32_USART6_IFW (N32_USART6_BASE + N32_USART_IFW_OFFSET) +# define N32_USART6_RTO (N32_USART6_BASE + N32_USART_RTO_OFFSET) +#endif + +#if N32H7_NUSART > 6 +# define N32_USART7_CTRL1 (N32_USART7_BASE + N32_USART_CTRL1_OFFSET) +# define N32_USART7_CTRL2 (N32_USART7_BASE + N32_USART_CTRL2_OFFSET) +# define N32_USART7_CTRL3 (N32_USART7_BASE + N32_USART_CTRL3_OFFSET) +# define N32_USART7_STS (N32_USART7_BASE + N32_USART_STS_OFFSET) +# define N32_USART7_DAT (N32_USART7_BASE + N32_USART_DAT_OFFSET) +# define N32_USART7_BRCF (N32_USART7_BASE + N32_USART_BRCF_OFFSET) +# define N32_USART7_GTP (N32_USART7_BASE + N32_USART_GTP_OFFSET) +# define N32_USART7_FIFO (N32_USART7_BASE + N32_USART_FIFO_OFFSET) +# define N32_USART7_IFW (N32_USART7_BASE + N32_USART_IFW_OFFSET) +# define N32_USART7_RTO (N32_USART7_BASE + N32_USART_RTO_OFFSET) +#endif + +#if N32H7_NUSART > 7 +# define N32_USART8_CTRL1 (N32_USART8_BASE + N32_USART_CTRL1_OFFSET) +# define N32_USART8_CTRL2 (N32_USART8_BASE + N32_USART_CTRL2_OFFSET) +# define N32_USART8_CTRL3 (N32_USART8_BASE + N32_USART_CTRL3_OFFSET) +# define N32_USART8_STS (N32_USART8_BASE + N32_USART_STS_OFFSET) +# define N32_USART8_DAT (N32_USART8_BASE + N32_USART_DAT_OFFSET) +# define N32_USART8_BRCF (N32_USART8_BASE + N32_USART_BRCF_OFFSET) +# define N32_USART8_GTP (N32_USART8_BASE + N32_USART_GTP_OFFSET) +# define N32_USART8_FIFO (N32_USART8_BASE + N32_USART_FIFO_OFFSET) +# define N32_USART8_IFW (N32_USART8_BASE + N32_USART_IFW_OFFSET) +# define N32_USART8_RTO (N32_USART8_BASE + N32_USART_RTO_OFFSET) +#endif + +/* UART Modules (e.g., UART9, UART10) */ + +#if N32H7_NUART > 0 +# define N32_UART9_CTRL1 (N32_UART9_BASE + N32_USART_CTRL1_OFFSET) +# define N32_UART9_CTRL2 (N32_UART9_BASE + N32_USART_CTRL2_OFFSET) +# define N32_UART9_CTRL3 (N32_UART9_BASE + N32_USART_CTRL3_OFFSET) +# define N32_UART9_STS (N32_UART9_BASE + N32_USART_STS_OFFSET) +# define N32_UART9_DAT (N32_UART9_BASE + N32_USART_DAT_OFFSET) +# define N32_UART9_BRCF (N32_UART9_BASE + N32_USART_BRCF_OFFSET) +# define N32_UART9_GTP (N32_UART9_BASE + N32_USART_GTP_OFFSET) +# define N32_UART9_FIFO (N32_UART9_BASE + N32_USART_FIFO_OFFSET) +# define N32_UART9_IFW (N32_UART9_BASE + N32_USART_IFW_OFFSET) +# define N32_UART9_RTO (N32_UART9_BASE + N32_USART_RTO_OFFSET) +#endif + +#if N32H7_NUART > 1 +# define N32_UART10_CTRL1 (N32_UART10_BASE + N32_USART_CTRL1_OFFSET) +# define N32_UART10_CTRL2 (N32_UART10_BASE + N32_USART_CTRL2_OFFSET) +# define N32_UART10_CTRL3 (N32_UART10_BASE + N32_USART_CTRL3_OFFSET) +# define N32_UART10_STS (N32_UART10_BASE + N32_USART_STS_OFFSET) +# define N32_UART10_DAT (N32_UART10_BASE + N32_USART_DAT_OFFSET) +# define N32_UART10_BRCF (N32_UART10_BASE + N32_USART_BRCF_OFFSET) +# define N32_UART10_GTP (N32_UART10_BASE + N32_USART_GTP_OFFSET) +# define N32_UART10_FIFO (N32_UART10_BASE + N32_USART_FIFO_OFFSET) +# define N32_UART10_IFW (N32_UART10_BASE + N32_USART_IFW_OFFSET) +# define N32_UART10_RTO (N32_UART10_BASE + N32_USART_RTO_OFFSET) +#endif + +#if N32H7_NUART > 2 +# define N32_UART11_CTRL1 (N32_UART11_BASE + N32_USART_CTRL1_OFFSET) +# define N32_UART11_CTRL2 (N32_UART11_BASE + N32_USART_CTRL2_OFFSET) +# define N32_UART11_CTRL3 (N32_UART11_BASE + N32_USART_CTRL3_OFFSET) +# define N32_UART11_STS (N32_UART11_BASE + N32_USART_STS_OFFSET) +# define N32_UART11_DAT (N32_UART11_BASE + N32_USART_DAT_OFFSET) +# define N32_UART11_BRCF (N32_UART11_BASE + N32_USART_BRCF_OFFSET) +# define N32_UART11_GTP (N32_UART11_BASE + N32_USART_GTP_OFFSET) +# define N32_UART11_FIFO (N32_UART11_BASE + N32_USART_FIFO_OFFSET) +# define N32_UART11_IFW (N32_UART11_BASE + N32_USART_IFW_OFFSET) +# define N32_UART11_RTO (N32_UART11_BASE + N32_USART_RTO_OFFSET) +#endif + +#if N32H7_NUART > 3 +# define N32_UART12_CTRL1 (N32_UART12_BASE + N32_USART_CTRL1_OFFSET) +# define N32_UART12_CTRL2 (N32_UART12_BASE + N32_USART_CTRL2_OFFSET) +# define N32_UART12_CTRL3 (N32_UART12_BASE + N32_USART_CTRL3_OFFSET) +# define N32_UART12_STS (N32_UART12_BASE + N32_USART_STS_OFFSET) +# define N32_UART12_DAT (N32_UART12_BASE + N32_USART_DAT_OFFSET) +# define N32_UART12_BRCF (N32_UART12_BASE + N32_USART_BRCF_OFFSET) +# define N32_UART12_GTP (N32_UART12_BASE + N32_USART_GTP_OFFSET) +# define N32_UART12_FIFO (N32_UART12_BASE + N32_USART_FIFO_OFFSET) +# define N32_UART12_IFW (N32_UART12_BASE + N32_USART_IFW_OFFSET) +# define N32_UART12_RTO (N32_UART12_BASE + N32_USART_RTO_OFFSET) +#endif + +#if N32H7_NUART > 4 +# define N32_UART13_CTRL1 (N32_UART13_BASE + N32_USART_CTRL1_OFFSET) +# define N32_UART13_CTRL2 (N32_UART13_BASE + N32_USART_CTRL2_OFFSET) +# define N32_UART13_CTRL3 (N32_UART13_BASE + N32_USART_CTRL3_OFFSET) +# define N32_UART13_STS (N32_UART13_BASE + N32_USART_STS_OFFSET) +# define N32_UART13_DAT (N32_UART13_BASE + N32_USART_DAT_OFFSET) +# define N32_UART13_BRCF (N32_UART13_BASE + N32_USART_BRCF_OFFSET) +# define N32_UART13_GTP (N32_UART13_BASE + N32_USART_GTP_OFFSET) +# define N32_UART13_FIFO (N32_UART13_BASE + N32_USART_FIFO_OFFSET) +# define N32_UART13_IFW (N32_UART13_BASE + N32_USART_IFW_OFFSET) +# define N32_UART13_RTO (N32_UART13_BASE + N32_USART_RTO_OFFSET) +#endif + +#if N32H7_NUART > 5 +# define N32_UART14_CTRL1 (N32_UART14_BASE + N32_USART_CTRL1_OFFSET) +# define N32_UART14_CTRL2 (N32_UART14_BASE + N32_USART_CTRL2_OFFSET) +# define N32_UART14_CTRL3 (N32_UART14_BASE + N32_USART_CTRL3_OFFSET) +# define N32_UART14_STS (N32_UART14_BASE + N32_USART_STS_OFFSET) +# define N32_UART14_DAT (N32_UART14_BASE + N32_USART_DAT_OFFSET) +# define N32_UART14_BRCF (N32_UART14_BASE + N32_USART_BRCF_OFFSET) +# define N32_UART14_GTP (N32_UART14_BASE + N32_USART_GTP_OFFSET) +# define N32_UART14_FIFO (N32_UART14_BASE + N32_USART_FIFO_OFFSET) +# define N32_UART14_IFW (N32_UART14_BASE + N32_USART_IFW_OFFSET) +# define N32_UART14_RTO (N32_UART14_BASE + N32_USART_RTO_OFFSET) +#endif + +#if N32H7_NUART > 6 +# define N32_UART15_CTRL1 (N32_UART15_BASE + N32_USART_CTRL1_OFFSET) +# define N32_UART15_CTRL2 (N32_UART15_BASE + N32_USART_CTRL2_OFFSET) +# define N32_UART15_CTRL3 (N32_UART15_BASE + N32_USART_CTRL3_OFFSET) +# define N32_UART15_STS (N32_UART15_BASE + N32_USART_STS_OFFSET) +# define N32_UART15_DAT (N32_UART15_BASE + N32_USART_DAT_OFFSET) +# define N32_UART15_BRCF (N32_UART15_BASE + N32_USART_BRCF_OFFSET) +# define N32_UART15_GTP (N32_UART15_BASE + N32_USART_GTP_OFFSET) +# define N32_UART15_FIFO (N32_UART15_BASE + N32_USART_FIFO_OFFSET) +# define N32_UART15_IFW (N32_UART15_BASE + N32_USART_IFW_OFFSET) +# define N32_UART15_RTO (N32_UART15_BASE + N32_USART_RTO_OFFSET) +#endif + +/* Register Bitfield Definitions ********************************************/ + +/* USART Control Register 1 (USART_CTRL1) */ +#define USART_CTRL1_UEN (1 << 0) /* Bit 0: USART enable */ +#define USART_CTRL1_RXEN (1 << 1) /* Bit 1: Receiver enable */ +#define USART_CTRL1_TXEN (1 << 2) /* Bit 2: Transmitter enable */ +#define USART_CTRL1_PSEL (1 << 3) /* Bit 3: Parity selection */ +#define USART_CTRL1_PCEN (1 << 4) /* Bit 4: Parity control enable */ +#define USART_CTRL1_WL (1 << 5) /* Bit 5: Word length */ +#define USART_CTRL1_RCVWU (1 << 6) /* Bit 6: Receiver wakeup control */ +#define USART_CTRL1_WUM (1 << 7) /* Bit 7: Wakeup mode */ +#define USART_CTRL1_IDLEIEN (1 << 8) /* Bit 8: IDLE interrupt enable */ +#define USART_CTRL1_RXDNEIEN (1 << 9) /* Bit 9: RXDNE interrupt enable */ +#define USART_CTRL1_TXDEIEN (1 << 10) /* Bit 10: TXDE interrupt enable */ +#define USART_CTRL1_TXCIEN (1 << 11) /* Bit 11: TXC interrupt enable */ +#define USART_CTRL1_PEIEN (1 << 12) /* Bit 12: PE interrupt enable */ +#define USART_CTRL1_SDBRK (1 << 13) /* Bit 13: Send break character */ +#define USART_CTRL1_DEM (1 << 14) /* Bit 14: Driver enable mode */ +#define USART_CTRL1_DEP (1 << 15) /* Bit 15: Driver enable polarity */ +#define USART_CTRL1_DEDT_SHIFT (16) /* Bits 16-20: Driver deassertion time */ +#define USART_CTRL1_DEDT_MASK (0x1F << USART_CTRL1_DEDT_SHIFT) +#define USART_CTRL1_DEDT(n) ((n) << USART_CTRL1_DEDT_SHIFT) + +#define USART_CTRL1_ALLINTS (USART_CTRL1_IDLEIEN|USART_CTRL1_RXDNEIEN| \ + USART_CTRL1_TXDEIEN|USART_CTRL1_TXCIEN| \ + USART_CTRL1_PEIEN) + +#define USART_CTRL1_DEAT_SHIFT (21) /* Bits 21-25: Driver assertion time */ +#define USART_CTRL1_DEAT_MASK (0x1F << USART_CTRL1_DEAT_SHIFT) +#define USART_CTRL1_DEAT(n) ((n) << USART_CTRL1_DEAT_SHIFT) + +#define USART_CTRL1_OSPM (1 << 26) /* Bit 26: Oversampling mode */ +#define USART_CTRL1_SWAP (1 << 27) /* Bit 27: TX/RX pins swap */ +#define USART_CTRL1_IFCEN (1 << 28) /* Bit 28: Idle frame controllable */ + +/* USART Control Register 2 (USART_CTRL2) */ +#define USART_CTRL2_ADDR_SHIFT (0) /* Bits 0-3: USART address */ +#define USART_CTRL2_ADDR_MASK (0xF << USART_CTRL2_ADDR_SHIFT) +#define USART_CTRL2_ADDR(n) ((n) << USART_CTRL2_ADDR_SHIFT) + +#define USART_CTRL2_STPB_SHIFT (5) /* Bits 5-6: STOP bits */ +#define USART_CTRL2_STPB_MASK (0x3 << USART_CTRL2_STPB_SHIFT) +#define USART_CTRL2_STPB(n) ((n) << USART_CTRL2_STPB_SHIFT) + +#define USART_CTRL2_CLKEN (1 << 8) /* Bit 8: Clock enable */ +#define USART_CTRL2_CLKPOL (1 << 9) /* Bit 9: Clock polarity */ +#define USART_CTRL2_CLKPHA (1 << 10) /* Bit 10: Clock phase */ +#define USART_CTRL2_LBCLK (1 << 11) /* Bit 11: Last bit clock pulse */ +#define USART_CTRL2_LINMEN (1 << 12) /* Bit 12: LIN mode enable */ +#define USART_CTRL2_LINBDIEN (1 << 13) /* Bit 13: LIN break detect intr */ +#define USART_CTRL2_LINBDL (1 << 14) /* Bit 14: LIN break detect len */ +#define USART_CTRL2_RTOEN (1 << 15) /* Bit 15: Receiver timeout en */ +#define USART_CTRL2_RTOCF (1 << 16) /* Bit 16: Receiver timeout clear */ +#define USART_CTRL2_RTOIEN (1 << 17) /* Bit 17: RTO interrupt enable */ +#define USART_CTRL2_PEFLOSE (1 << 18) /* Bit 18: PEF discard enable */ +#define USART_CTRL2_NEFLOSE (1 << 19) /* Bit 19: NEF discard enable */ +#define USART_CTRL2_FEFLOSE (1 << 20) /* Bit 20: FEF discard enable */ + +#define USART_CTRL2_ALLINTS (USART_CTRL2_RTOIEN) + +/* USART Control Register 3 (USART_CTRL3) */ +#define USART_CTRL3_CTSEN (1 << 0) /* Bit 0: CTS enable */ +#define USART_CTRL3_CTSIEN (1 << 1) /* Bit 1: CTS interrupt enable */ +#define USART_CTRL3_RTSEN (1 << 2) /* Bit 2: RTS enable */ +#define USART_CTRL3_HDMEN (1 << 3) /* Bit 3: Half-duplex mode en */ +#define USART_CTRL3_DMATXEN (1 << 4) /* Bit 4: DMA transmitter en */ +#define USART_CTRL3_DMARXEN (1 << 5) /* Bit 5: DMA receiver enable */ +#define USART_CTRL3_ERRIEN (1 << 6) /* Bit 6: Error interrupt en */ +#define USART_CTRL3_IRDAMEN (1 << 7) /* Bit 7: IrDA mode enable */ +#define USART_CTRL3_IRDALP (1 << 8) /* Bit 8: IrDA low-power mode */ +#define USART_CTRL3_SCMEN (1 << 9) /* Bit 9: Smartcard mode en */ +#define USART_CTRL3_SCNACK (1 << 10) /* Bit 10: Smartcard NACK en */ + +#define USART_CTRL3_ALLINTS (USART_CTRL3_CTSIEN|USART_CTRL3_ERRIEN) + +/* USART Status Register (USART_STS) */ +#define USART_STS_TXFF (1 << 0) /* Bit 0: TX FIFO full */ +#define USART_STS_RXFF (1 << 1) /* Bit 1: RX FIFO full */ +#define USART_STS_TXFE (1 << 2) /* Bit 2: TX FIFO empty */ +#define USART_STS_RXFE (1 << 3) /* Bit 3: RX FIFO empty */ +#define USART_STS_RXFT (1 << 4) /* Bit 4: RX FIFO threshold */ +#define USART_STS_TXFT (1 << 5) /* Bit 5: TX FIFO threshold */ +#define USART_STS_IDLEF (1 << 6) /* Bit 6: IDLE line detected */ +#define USART_STS_TXDE (1 << 7) /* Bit 7: TX data empty */ +#define USART_STS_TXC (1 << 8) /* Bit 8: Transmission complete */ +#define USART_STS_RXDNE (1 << 9) /* Bit 9: RX data not empty */ +#define USART_STS_CTSF (1 << 10) /* Bit 10: CTS flag */ +#define USART_STS_LINBDF (1 << 11) /* Bit 11: LIN break detect */ +#define USART_STS_PEF (1 << 12) /* Bit 12: Parity error */ +#define USART_STS_OREF (1 << 13) /* Bit 13: Overrun error */ +#define USART_STS_NEF (1 << 14) /* Bit 14: Noise error */ +#define USART_STS_FEF (1 << 15) /* Bit 15: Framing error */ +#define USART_STS_RTOF (1 << 16) /* Bit 16: Receiver timeout */ +#define USART_STS_PELOSEF (1 << 17) /* Bit 17: PE discard flag */ +#define USART_STS_NEELOSEF (1 << 18) /* Bit 18: NE discard flag */ +#define USART_STS_FEELOSEF (1 << 19) /* Bit 19: FE discard flag */ + +/* USART Data Register (USART_DAT) */ +#define USART_DAT_DATV_SHIFT (0) /* Bits 0-8: Data value */ +#define USART_DAT_DATV_MASK (0x1FF << USART_DAT_DATV_SHIFT) + +/* USART Baud Rate Register (USART_BRCF) */ +#define USART_BRCF_DIVDEC_SHIFT (0) /* Bits 0-3: Fractional divider */ +#define USART_BRCF_DIVDEC_MASK (0xF << USART_BRCF_DIVDEC_SHIFT) +#define USART_BRCF_DIVDEC(n) ((n) << USART_BRCF_DIVDEC_SHIFT) +#define USART_BRCF_DIVINT_SHIFT (4) /* Bits 4-15: Integer divider */ +#define USART_BRCF_DIVINT_MASK (0xFFF << USART_BRCF_DIVINT_SHIFT) +#define USART_BRCF_DIVINT(n) ((n) << USART_BRCF_DIVINT_SHIFT) + +/* USART Guard Time Register (USART_GTP) */ +#define USART_GTP_PSCV_SHIFT (0) /* Bits 0-7: Prescaler value */ +#define USART_GTP_PSCV_MASK (0xFF << USART_GTP_PSCV_SHIFT) +#define USART_GTP_PSCV(n) ((n) << USART_GTP_PSCV_SHIFT) +#define USART_GTP_GTV_SHIFT (8) /* Bits 8-15: Guard time value */ +#define USART_GTP_GTV_MASK (0xFF << USART_GTP_GTV_SHIFT) +#define USART_GTP_GTV(n) ((n) << USART_GTP_GTV_SHIFT) + +/* USART FIFO Register (USART_FIFO) */ +#define USART_FIFO_EN (1 << 0) /* Bit 0: FIFO enable */ +#define USART_FIFO_CLR (1 << 1) /* Bit 1: FIFO clear */ + +#define USART_FIFO_TXFTCFG_SHIFT (2) /* Bits 2-4: TX FIFO threshold */ +#define USART_FIFO_TXFTCFG_MASK (0x7 << USART_FIFO_TXFTCFG_SHIFT) +#define USART_FIFO_TXFT_1_8 (0x0 << USART_FIFO_TXFTCFG_SHIFT) /* 000: 1/8 full */ +#define USART_FIFO_TXFT_2_8 (0x1 << USART_FIFO_TXFTCFG_SHIFT) /* 001: 2/8 full */ +#define USART_FIFO_TXFT_4_8 (0x2 << USART_FIFO_TXFTCFG_SHIFT) /* 010: 4/8 full */ +#define USART_FIFO_TXFT_6_8 (0x3 << USART_FIFO_TXFTCFG_SHIFT) /* 011: 6/8 full */ +#define USART_FIFO_TXFT_7_8 (0x4 << USART_FIFO_TXFTCFG_SHIFT) /* 100: 7/8 full */ +#define USART_FIFO_TXFT_FULL (0x5 << USART_FIFO_TXFTCFG_SHIFT) /* 101: Full */ + +#define USART_FIFO_RXFTCFG_SHIFT (5) /* Bits 5-7: RX FIFO threshold */ +#define USART_FIFO_RXFTCFG_MASK (0x7 << USART_FIFO_RXFTCFG_SHIFT) +#define USART_FIFO_RXFT_1_8 (0x0 << USART_FIFO_RXFTCFG_SHIFT) /* 000: 1/8 full */ +#define USART_FIFO_RXFT_2_8 (0x1 << USART_FIFO_RXFTCFG_SHIFT) /* 001: 2/8 full */ +#define USART_FIFO_RXFT_4_8 (0x2 << USART_FIFO_RXFTCFG_SHIFT) /* 010: 4/8 full */ +#define USART_FIFO_RXFT_6_8 (0x3 << USART_FIFO_RXFTCFG_SHIFT) /* 011: 6/8 full */ +#define USART_FIFO_RXFT_7_8 (0x4 << USART_FIFO_RXFTCFG_SHIFT) /* 100: 7/8 full */ +#define USART_FIFO_RXFT_FULL (0x5 << USART_FIFO_RXFTCFG_SHIFT) /* 101: Full */ + +#define USART_FIFO_TXFFIEN (1 << 8) /* Bit 8: TX FIFO full intr en */ +#define USART_FIFO_RXFFIEN (1 << 9) /* Bit 9: RX FIFO full intr en */ +#define USART_FIFO_TXFEIEN (1 << 10) /* Bit 10: TX FIFO empty intr en */ +#define USART_FIFO_RXFEIEN (1 << 11) /* Bit 11: RX FIFO empty intr en */ +#define USART_FIFO_RXFTIEN (1 << 12) /* Bit 12: RX FIFO thres intr en */ +#define USART_FIFO_TXFTIEN (1 << 13) /* Bit 13: TX FIFO thres intr en */ + +#define USART_FIFO_RXCNT_SHIFT (14) /* Bits 14-17: RX FIFO count */ +#define USART_FIFO_RXCNT_MASK (0xF << USART_FIFO_RXCNT_SHIFT) +#define USART_FIFO_GET_RXCNT(n) ((n) >> USART_FIFO_RXCNT_SHIFT) + +#define USART_FIFO_TXCNT_SHIFT (18) /* Bits 18-21: TX FIFO count */ +#define USART_FIFO_TXCNT_MASK (0xF << USART_FIFO_TXCNT_SHIFT) +#define USART_FIFO_GET_TXCNT(n) ((n) >> USART_FIFO_TXCNT_SHIFT) + +/* USART Idle Frame Width Register (USART_IFW) */ +#define USART_IFW_WIDTH_SHIFT (0) /* Bits 0-15: Idle frame width */ +#define USART_IFW_WIDTH_MASK (0xFFFF << USART_IFW_WIDTH_SHIFT) + +/* USART Timeout Register (USART_RTO) */ +#define USART_RTO_TIME_SHIFT (0) /* Bits 0-27: Timeout value */ +#define USART_RTO_TIME_MASK (0xFFFFFFF << USART_RTO_TIME_SHIFT) + +#endif /* CONFIG_N32H7_N32H76X */ +#endif /* __ARCH_ARM_SRC_N32H7_HARDWARE_N32H76X_UART_H */ \ No newline at end of file diff --git a/arch/arm/src/n32h7/hardware/n32h7_afio.h b/arch/arm/src/n32h7/hardware/n32h7_afio.h new file mode 100644 index 0000000000000..aaa18538df355 --- /dev/null +++ b/arch/arm/src/n32h7/hardware/n32h7_afio.h @@ -0,0 +1,39 @@ +/**************************************************************************** + * arch/arm/src/n32h7/hardware/n32h7_afio.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __ARCH_ARM_SRC_N32H7_HARDWARE_N32_AFIO_H +#define __ARCH_ARM_SRC_N32H7_HARDWARE_N32_AFIO_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include "chip.h" + +#if defined(CONFIG_N32H7_N32H76X) +# include "hardware/n32h76x_afio.h" +#else +# error "Unsupported N32 H7 part" +#endif + +#endif /* __ARCH_ARM_SRC_N32H7_HARDWARE_N32_AFIO_H */ diff --git a/arch/arm/src/n32h7/hardware/n32h7_cordic.h b/arch/arm/src/n32h7/hardware/n32h7_cordic.h new file mode 100644 index 0000000000000..d8da28cae4b38 --- /dev/null +++ b/arch/arm/src/n32h7/hardware/n32h7_cordic.h @@ -0,0 +1,85 @@ +/**************************************************************************** + * arch/arm/src/n32h7/hardware/n32h7_cordic.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __ARCH_ARM_SRC_N32H7_HARDWARE_N32H7_CORDIC_H +#define __ARCH_ARM_SRC_N32H7_HARDWARE_N32H7_CORDIC_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include "chip.h" + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* Register Offsets *********************************************************/ + +#define N32_CORDIC_CTRLSTS_OFFSET 0x0000 /* Control/status register */ +#define N32_CORDIC_WDATA_OFFSET 0x0004 /* Write data register */ +#define N32_CORDIC_RDATA_OFFSET 0x0008 /* Read data register */ + +/* Register Addresses (assuming N32_CORDIC_BASE defined in chip.h) **********/ + +#define N32_CORDIC_CTRLSTS (N32_CORDIC_BASE + N32_CORDIC_CTRLSTS_OFFSET) +#define N32_CORDIC_WDATA (N32_CORDIC_BASE + N32_CORDIC_WDATA_OFFSET) +#define N32_CORDIC_RDATA (N32_CORDIC_BASE + N32_CORDIC_RDATA_OFFSET) + +/* CTRLSTS Bitfield Definitions *********************************************/ + +#define CORDIC_CTRLSTS_FUNC_SHIFT 0 +#define CORDIC_CTRLSTS_FUNC_MASK (0xf << CORDIC_CTRLSTS_FUNC_SHIFT) +# define CORDIC_CTRLSTS_FUNC_COS (0 << CORDIC_CTRLSTS_FUNC_SHIFT) +# define CORDIC_CTRLSTS_FUNC_SIN (1 << CORDIC_CTRLSTS_FUNC_SHIFT) +# define CORDIC_CTRLSTS_FUNC_PHASE (2 << CORDIC_CTRLSTS_FUNC_SHIFT) +# define CORDIC_CTRLSTS_FUNC_MODULUS (3 << CORDIC_CTRLSTS_FUNC_SHIFT) +# define CORDIC_CTRLSTS_FUNC_ARCTAN (4 << CORDIC_CTRLSTS_FUNC_SHIFT) +# define CORDIC_CTRLSTS_FUNC_HB_COS (5 << CORDIC_CTRLSTS_FUNC_SHIFT) +# define CORDIC_CTRLSTS_FUNC_HB_SIN (6 << CORDIC_CTRLSTS_FUNC_SHIFT) +# define CORDIC_CTRLSTS_FUNC_HB_ARCT (7 << CORDIC_CTRLSTS_FUNC_SHIFT) +# define CORDIC_CTRLSTS_FUNC_NATL (8 << CORDIC_CTRLSTS_FUNC_SHIFT) +# define CORDIC_CTRLSTS_FUNC_SQRT (9 << CORDIC_CTRLSTS_FUNC_SHIFT) + +#define CORDIC_CTRLSTS_PRECISION_SHIFT 4 +#define CORDIC_CTRLSTS_PRECISION_MASK (0xf << CORDIC_CTRLSTS_PRECISION_SHIFT) + +#define CORDIC_CTRLSTS_SCALE_SHIFT 8 +#define CORDIC_CTRLSTS_SCALE_MASK (0x7 << CORDIC_CTRLSTS_SCALE_SHIFT) + +#define CORDIC_CTRLSTS_INTEN (1 << 16) /* Interrupt enable */ +#define CORDIC_CTRLSTS_DMAREN (1 << 17) /* DMA read enable */ +#define CORDIC_CTRLSTS_DMAWEN (1 << 18) /* DMA write enable */ +#define CORDIC_CTRLSTS_NUMREAD (1 << 19) /* Number of results (1 = two, 0 = one) */ +#define CORDIC_CTRLSTS_NUMWRITE (1 << 20) /* Number of arguments (1 = two, 0 = one) */ +#define CORDIC_CTRLSTS_OUTSIZE (1 << 21) /* Output width: 0=32bit, 1=16bit */ +#define CORDIC_CTRLSTS_INSIZE (1 << 22) /* Input width: 0=32bit, 1=16bit */ +#define CORDIC_CTRLSTS_FLOATIN (1 << 23) /* Float input enable */ +#define CORDIC_CTRLSTS_FLOATOUT (1 << 24) /* Float output enable */ +#define CORDIC_CTRLSTS_PHASELIMIT (1 << 25) /* Phase limit enable */ +#define CORDIC_CTRLSTS_CODINLIMIT (1 << 26) /* Coordinate limit enable */ +#define CORDIC_CTRLSTS_INOVINTEN (1 << 27) /* Input overflow interrupt enable */ +#define CORDIC_CTRLSTS_INOVF (1 << 30) /* Input overflow flag (write 1 to clear) */ +#define CORDIC_CTRLSTS_RRF (1 << 31) /* Result ready flag */ + +#endif /* __ARCH_ARM_SRC_N32H7_HARDWARE_N32H7_CORDIC_H */ diff --git a/arch/arm/src/n32h7/hardware/n32h7_dma.h b/arch/arm/src/n32h7/hardware/n32h7_dma.h new file mode 100644 index 0000000000000..a0434524d24f8 --- /dev/null +++ b/arch/arm/src/n32h7/hardware/n32h7_dma.h @@ -0,0 +1,512 @@ +/**************************************************************************** + * arch/arm/src/n32h7/hardware/n32h7_dma.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __ARCH_ARM_SRC_N32H7_HARDWARE_N32H7_DMA_H +#define __ARCH_ARM_SRC_N32H7_HARDWARE_N32H7_DMA_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include "chip.h" + +#include "n32h7_memorymap.h" + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* 3 DMA controllers + 1 MDMA */ + +#define MDMA (0) +#define DMA1 (1) +#define DMA2 (2) +#define DMA3 (3) + +/* 8 DMA chanels for standard DMA */ + +#define DMA_CH0 (0) +#define DMA_CH1 (1) +#define DMA_CH2 (2) +#define DMA_CH3 (3) +#define DMA_CH4 (4) +#define DMA_CH5 (5) +#define DMA_CH6 (6) +#define DMA_CH7 (7) + +/* ========================================================================== + * Channel Register Offset(Each channel 0x58 bytes per channel) + * ========================================================================== + */ +#define N32_DMA_CH_OFFSET(n) (0x58U * (n)) + +#define N32_DMA_CH_SA_OFFSET 0x0000U /* Source Address */ +#define N32_DMA_CH_DA_OFFSET 0x0008U /* Destination Address */ +#define N32_DMA_CH_LLP_OFFSET 0x0010U /* Linked List Pointer */ +#define N32_DMA_CH_CTRL_OFFSET 0x0018U /* Control Register */ +#define N32_DMA_CH_CFG_OFFSET 0x0040U /* Configuration Register */ +#define N32_DMA_CH_SG_OFFSET 0x0048U /* Source Gather */ +#define N32_DMA_CH_DS_OFFSET 0x0050U /* Destination Scatter */ + +/* ========================================================================== + * Global Interrupt Register Offset + * ========================================================================== + */ +#define N32_DMA_RAWTCINTSTS_OFFSET 0x02C0U +#define N32_DMA_RAWBTCINTSTS_OFFSET 0x02C8U +#define N32_DMA_RAWSTCINTSTS_OFFSET 0x02D0U +#define N32_DMA_RAWDTCINTSTS_OFFSET 0x02D8U +#define N32_DMA_RAWERRINTSTS_OFFSET 0x02E0U + +#define N32_DMA_TCINTSTS_OFFSET 0x02E8U +#define N32_DMA_BTCINTSTS_OFFSET 0x02F0U +#define N32_DMA_STCINTSTS_OFFSET 0x02F8U +#define N32_DMA_DTCINTSTS_OFFSET 0x0300U +#define N32_DMA_ERRINTSTS_OFFSET 0x0308U + +#define N32_DMA_TCINTMSK_OFFSET 0x0310U +#define N32_DMA_BTCINTMSK_OFFSET 0x0318U +#define N32_DMA_STCINTMSK_OFFSET 0x0320U +#define N32_DMA_DTCINTMSK_OFFSET 0x0328U +#define N32_DMA_ERRINTMSK_OFFSET 0x0330U + +#define N32_DMA_TCINTCLR_OFFSET 0x0338U +#define N32_DMA_BTCINTCLR_OFFSET 0x0340U +#define N32_DMA_STCINTCLR_OFFSET 0x0348U +#define N32_DMA_DTCINTCLR_OFFSET 0x0350U +#define N32_DMA_ERRINTCLR_OFFSET 0x0358U + +#define N32_DMA_INTCBESTS_OFFSET 0x0360U + +/* ========================================================================== + * Software Handshake Register Offset + * ========================================================================== + */ +#define N32_DMA_SRCSWTREQ_OFFSET 0x0368U +#define N32_DMA_DSTSWTREQ_OFFSET 0x0370U +#define N32_DMA_SRCSGTREQ_OFFSET 0x0378U +#define N32_DMA_DSTSGTREQ_OFFSET 0x0380U +#define N32_DMA_SRCLTREQ_OFFSET 0x0388U +#define N32_DMA_DSTLTREQ_OFFSET 0x0390U + +/* ========================================================================== + * DMA Miscellaneous Register Offset + * ========================================================================== + */ +#define N32_DMA_CFG_OFFSET 0x0398U /* DMA Configuration Register */ +#define N32_DMA_CHEN_OFFSET 0x03A0U /* DMA Channel Enable Register */ +#define N32_DMA_ID_OFFSET 0x03A8U /* DMA ID Register */ +#define N32_DMA_TEST_OFFSET 0x03B0U /* DMA Test Register */ +#define N32_DMA_LPTIMEOUT_OFFSET 0x03B8U /* DMA Low Power Timeout Register */ +#define N32_DMA_COMPID_OFFSET 0x03F8U /* DMA Component ID Register */ + +/* ========================================================================== + * Channel Register Address Macro Definitions + * ========================================================================== + */ +#define N32_DMA1_CH_SA(n) (N32_DMA1_BASE + N32_DMA_CH_OFFSET(n) + N32_DMA_CH_SA_OFFSET) +#define N32_DMA1_CH_DA(n) (N32_DMA1_BASE + N32_DMA_CH_OFFSET(n) + N32_DMA_CH_DA_OFFSET) +#define N32_DMA1_CH_LLP(n) (N32_DMA1_BASE + N32_DMA_CH_OFFSET(n) + N32_DMA_CH_LLP_OFFSET) +#define N32_DMA1_CH_CTRL(n) (N32_DMA1_BASE + N32_DMA_CH_OFFSET(n) + N32_DMA_CH_CTRL_OFFSET) +#define N32_DMA1_CH_CFG(n) (N32_DMA1_BASE + N32_DMA_CH_OFFSET(n) + N32_DMA_CH_CFG_OFFSET) +#define N32_DMA1_CH_SG(n) (N32_DMA1_BASE + N32_DMA_CH_OFFSET(n) + N32_DMA_CH_SG_OFFSET) +#define N32_DMA1_CH_DS(n) (N32_DMA1_BASE + N32_DMA_CH_OFFSET(n) + N32_DMA_CH_DS_OFFSET) + +#define N32_DMA2_CH_SA(n) (N32_DMA2_BASE + N32_DMA_CH_OFFSET(n) + N32_DMA_CH_SA_OFFSET) +#define N32_DMA2_CH_DA(n) (N32_DMA2_BASE + N32_DMA_CH_OFFSET(n) + N32_DMA_CH_DA_OFFSET) +#define N32_DMA2_CH_LLP(n) (N32_DMA2_BASE + N32_DMA_CH_OFFSET(n) + N32_DMA_CH_LLP_OFFSET) +#define N32_DMA2_CH_CTRL(n) (N32_DMA2_BASE + N32_DMA_CH_OFFSET(n) + N32_DMA_CH_CTRL_OFFSET) +#define N32_DMA2_CH_CFG(n) (N32_DMA2_BASE + N32_DMA_CH_OFFSET(n) + N32_DMA_CH_CFG_OFFSET) +#define N32_DMA2_CH_SG(n) (N32_DMA2_BASE + N32_DMA_CH_OFFSET(n) + N32_DMA_CH_SG_OFFSET) +#define N32_DMA2_CH_DS(n) (N32_DMA2_BASE + N32_DMA_CH_OFFSET(n) + N32_DMA_CH_DS_OFFSET) + +#define N32_DMA3_CH_SA(n) (N32_DMA3_BASE + N32_DMA_CH_OFFSET(n) + N32_DMA_CH_SA_OFFSET) +#define N32_DMA3_CH_DA(n) (N32_DMA3_BASE + N32_DMA_CH_OFFSET(n) + N32_DMA_CH_DA_OFFSET) +#define N32_DMA3_CH_LLP(n) (N32_DMA3_BASE + N32_DMA_CH_OFFSET(n) + N32_DMA_CH_LLP_OFFSET) +#define N32_DMA3_CH_CTRL(n) (N32_DMA3_BASE + N32_DMA_CH_OFFSET(n) + N32_DMA_CH_CTRL_OFFSET) +#define N32_DMA3_CH_CFG(n) (N32_DMA3_BASE + N32_DMA_CH_OFFSET(n) + N32_DMA_CH_CFG_OFFSET) +#define N32_DMA3_CH_SG(n) (N32_DMA3_BASE + N32_DMA_CH_OFFSET(n) + N32_DMA_CH_SG_OFFSET) +#define N32_DMA3_CH_DS(n) (N32_DMA3_BASE + N32_DMA_CH_OFFSET(n) + N32_DMA_CH_DS_OFFSET) + +/* ========================================================================== + * Global Interrupt Register Offset + * ========================================================================== + */ +#define N32_DMA1_RAWTCINTSTS (N32_DMA1_BASE + N32_DMA_RAWTCINTSTS_OFFSET) +#define N32_DMA1_TCINTSTS (N32_DMA1_BASE + N32_DMA_TCINTSTS_OFFSET) +#define N32_DMA1_TCINTMSK (N32_DMA1_BASE + N32_DMA_TCINTMSK_OFFSET) +#define N32_DMA1_TCINTCLR (N32_DMA1_BASE + N32_DMA_TCINTCLR_OFFSET) + +#define N32_DMA2_RAWTCINTSTS (N32_DMA2_BASE + N32_DMA_RAWTCINTSTS_OFFSET) +#define N32_DMA2_TCINTSTS (N32_DMA2_BASE + N32_DMA_TCINTSTS_OFFSET) +#define N32_DMA2_TCINTMSK (N32_DMA2_BASE + N32_DMA_TCINTMSK_OFFSET) +#define N32_DMA2_TCINTCLR (N32_DMA2_BASE + N32_DMA_TCINTCLR_OFFSET) + +#define N32_DMA3_RAWTCINTSTS (N32_DMA3_BASE + N32_DMA_RAWTCINTSTS_OFFSET) +#define N32_DMA3_TCINTSTS (N32_DMA3_BASE + N32_DMA_TCINTSTS_OFFSET) +#define N32_DMA3_TCINTMSK (N32_DMA3_BASE + N32_DMA_TCINTMSK_OFFSET) +#define N32_DMA3_TCINTCLR (N32_DMA3_BASE + N32_DMA_TCINTCLR_OFFSET) + +#define N32_DMA1_RAWBTCINTSTS (N32_DMA1_BASE + N32_DMA_RAWBTCINTSTS_OFFSET) +#define N32_DMA1_BTCINTSTS (N32_DMA1_BASE + N32_DMA_BTCINTSTS_OFFSET) +#define N32_DMA1_BTCINTMSK (N32_DMA1_BASE + N32_DMA_BTCINTMSK_OFFSET) +#define N32_DMA1_BTCINTCLR (N32_DMA1_BASE + N32_DMA_BTCINTCLR_OFFSET) + +#define N32_DMA2_RAWBTCINTSTS (N32_DMA2_BASE + N32_DMA_RAWBTCINTSTS_OFFSET) +#define N32_DMA2_BTCINTSTS (N32_DMA2_BASE + N32_DMA_BTCINTSTS_OFFSET) +#define N32_DMA2_BTCINTMSK (N32_DMA2_BASE + N32_DMA_BTCINTMSK_OFFSET) +#define N32_DMA2_BTCINTCLR (N32_DMA2_BASE + N32_DMA_BTCINTCLR_OFFSET) + +#define N32_DMA3_RAWBTCINTSTS (N32_DMA3_BASE + N32_DMA_RAWBTCINTSTS_OFFSET) +#define N32_DMA3_BTCINTSTS (N32_DMA3_BASE + N32_DMA_BTCINTSTS_OFFSET) +#define N32_DMA3_BTCINTMSK (N32_DMA3_BASE + N32_DMA_BTCINTMSK_OFFSET) +#define N32_DMA3_BTCINTCLR (N32_DMA3_BASE + N32_DMA_BTCINTCLR_OFFSET) + +#define N32_DMA1_RAWSTCINTSTS (N32_DMA1_BASE + N32_DMA_RAWSTCINTSTS_OFFSET) +#define N32_DMA1_STCINTSTS (N32_DMA1_BASE + N32_DMA_STCINTSTS_OFFSET) +#define N32_DMA1_STCINTMSK (N32_DMA1_BASE + N32_DMA_STCINTMSK_OFFSET) +#define N32_DMA1_STCINTCLR (N32_DMA1_BASE + N32_DMA_STCINTCLR_OFFSET) + +#define N32_DMA2_RAWSTCINTSTS (N32_DMA2_BASE + N32_DMA_RAWSTCINTSTS_OFFSET) +#define N32_DMA2_STCINTSTS (N32_DMA2_BASE + N32_DMA_STCINTSTS_OFFSET) +#define N32_DMA2_STCINTMSK (N32_DMA2_BASE + N32_DMA_STCINTMSK_OFFSET) +#define N32_DMA2_STCINTCLR (N32_DMA2_BASE + N32_DMA_STCINTCLR_OFFSET) + +#define N32_DMA3_RAWSTCINTSTS (N32_DMA3_BASE + N32_DMA_RAWSTCINTSTS_OFFSET) +#define N32_DMA3_STCINTSTS (N32_DMA3_BASE + N32_DMA_STCINTSTS_OFFSET) +#define N32_DMA3_STCINTMSK (N32_DMA3_BASE + N32_DMA_STCINTMSK_OFFSET) +#define N32_DMA3_STCINTCLR (N32_DMA3_BASE + N32_DMA_STCINTCLR_OFFSET) + +#define N32_DMA1_RAWDTCINTSTS (N32_DMA1_BASE + N32_DMA_RAWDTCINTSTS_OFFSET) +#define N32_DMA1_DTCINTSTS (N32_DMA1_BASE + N32_DMA_DTCINTSTS_OFFSET) +#define N32_DMA1_DTCINTMSK (N32_DMA1_BASE + N32_DMA_DTCINTMSK_OFFSET) +#define N32_DMA1_DTCINTCLR (N32_DMA1_BASE + N32_DMA_DTCINTCLR_OFFSET) + +#define N32_DMA2_RAWDTCINTSTS (N32_DMA2_BASE + N32_DMA_RAWDTCINTSTS_OFFSET) +#define N32_DMA2_DTCINTSTS (N32_DMA2_BASE + N32_DMA_DTCINTSTS_OFFSET) +#define N32_DMA2_DTCINTMSK (N32_DMA2_BASE + N32_DMA_DTCINTMSK_OFFSET) +#define N32_DMA2_DTCINTCLR (N32_DMA2_BASE + N32_DMA_DTCINTCLR_OFFSET) + +#define N32_DMA3_RAWDTCINTSTS (N32_DMA3_BASE + N32_DMA_RAWDTCINTSTS_OFFSET) +#define N32_DMA3_DTCINTSTS (N32_DMA3_BASE + N32_DMA_DTCINTSTS_OFFSET) +#define N32_DMA3_DTCINTMSK (N32_DMA3_BASE + N32_DMA_DTCINTMSK_OFFSET) +#define N32_DMA3_DTCINTCLR (N32_DMA3_BASE + N32_DMA_DTCINTCLR_OFFSET) + +#define N32_DMA1_RAWERRINTSTS (N32_DMA1_BASE + N32_DMA_RAWERRINTSTS_OFFSET) +#define N32_DMA1_ERRINTSTS (N32_DMA1_BASE + N32_DMA_ERRINTSTS_OFFSET) +#define N32_DMA1_ERRINTMSK (N32_DMA1_BASE + N32_DMA_ERRINTMSK_OFFSET) +#define N32_DMA1_ERRINTCLR (N32_DMA1_BASE + N32_DMA_ERRINTCLR_OFFSET) + +#define N32_DMA2_RAWERRINTSTS (N32_DMA2_BASE + N32_DMA_RAWERRINTSTS_OFFSET) +#define N32_DMA2_ERRINTSTS (N32_DMA2_BASE + N32_DMA_ERRINTSTS_OFFSET) +#define N32_DMA2_ERRINTMSK (N32_DMA2_BASE + N32_DMA_ERRINTMSK_OFFSET) +#define N32_DMA2_ERRINTCLR (N32_DMA2_BASE + N32_DMA_ERRINTCLR_OFFSET) + +#define N32_DMA3_RAWERRINTSTS (N32_DMA3_BASE + N32_DMA_RAWERRINTSTS_OFFSET) +#define N32_DMA3_ERRINTSTS (N32_DMA3_BASE + N32_DMA_ERRINTSTS_OFFSET) +#define N32_DMA3_ERRINTMSK (N32_DMA3_BASE + N32_DMA_ERRINTMSK_OFFSET) +#define N32_DMA3_ERRINTCLR (N32_DMA3_BASE + N32_DMA_ERRINTCLR_OFFSET) + +#define N32_DMA1_INTCBESTS (N32_DMA1_BASE + N32_DMA_INTCBESTS_OFFSET) + +#define N32_DMA2_INTCBESTS (N32_DMA2_BASE + N32_DMA_INTCBESTS_OFFSET) + +#define N32_DMA3_INTCBESTS (N32_DMA3_BASE + N32_DMA_INTCBESTS_OFFSET) + +/* ========================================================================== + * Software Handshake Register Offset + * ========================================================================== + */ +#define N32_DMA1_SRCSWTREQ (N32_DMA1_BASE + N32_DMA_SRCSWTREQ_OFFSET) +#define N32_DMA1_DSTSWTREQ (N32_DMA1_BASE + N32_DMA_DSTSWTREQ_OFFSET) +#define N32_DMA1_SRCSGTREQ (N32_DMA1_BASE + N32_DMA_SRCSGTREQ_OFFSET) +#define N32_DMA1_DSTSGTREQ (N32_DMA1_BASE + N32_DMA_DSTSGTREQ_OFFSET) +#define N32_DMA1_SRCLTREQ (N32_DMA1_BASE + N32_DMA_SRCLTREQ_OFFSET) +#define N32_DMA1_DSTLTREQ (N32_DMA1_BASE + N32_DMA_DSTLTREQ_OFFSET) + +#define N32_DMA2_SRCSWTREQ (N32_DMA2_BASE + N32_DMA_SRCSWTREQ_OFFSET) +#define N32_DMA2_DSTSWTREQ (N32_DMA2_BASE + N32_DMA_DSTSWTREQ_OFFSET) +#define N32_DMA2_SRCSGTREQ (N32_DMA2_BASE + N32_DMA_SRCSGTREQ_OFFSET) +#define N32_DMA2_DSTSGTREQ (N32_DMA2_BASE + N32_DMA_DSTSGTREQ_OFFSET) +#define N32_DMA2_SRCLTREQ (N32_DMA2_BASE + N32_DMA_SRCLTREQ_OFFSET) +#define N32_DMA2_DSTLTREQ (N32_DMA2_BASE + N32_DMA_DSTLTREQ_OFFSET) + +#define N32_DMA3_SRCSWTREQ (N32_DMA3_BASE + N32_DMA_SRCSWTREQ_OFFSET) +#define N32_DMA3_DSTSWTREQ (N32_DMA3_BASE + N32_DMA_DSTSWTREQ_OFFSET) +#define N32_DMA3_SRCSGTREQ (N32_DMA3_BASE + N32_DMA_SRCSGTREQ_OFFSET) +#define N32_DMA3_DSTSGTREQ (N32_DMA3_BASE + N32_DMA_DSTSGTREQ_OFFSET) +#define N32_DMA3_SRCLTREQ (N32_DMA3_BASE + N32_DMA_SRCLTREQ_OFFSET) +#define N32_DMA3_DSTLTREQ (N32_DMA3_BASE + N32_DMA_DSTLTREQ_OFFSET) + +/* ========================================================================== + * DMA Miscellaneous Register Offset + * ========================================================================== + */ +#define N32_DMA1_CFG (N32_DMA1_BASE + N32_DMA_CFG_OFFSET) +#define N32_DMA1_CHEN (N32_DMA1_BASE + N32_DMA_CHEN_OFFSET) +#define N32_DMA1_ID (N32_DMA1_BASE + N32_DMA_ID_OFFSET) +#define N32_DMA1_TEST (N32_DMA1_BASE + N32_DMA_TEST_OFFSET) +#define N32_DMA1_LPTIMEOUT (N32_DMA1_BASE + N32_DMA_LPTIMEOUT_OFFSET) +#define N32_DMA1_COMPID (N32_DMA1_BASE + N32_DMA_COMPID_OFFSET) + +#define N32_DMA2_CFG (N32_DMA2_BASE + N32_DMA_CFG_OFFSET) +#define N32_DMA2_CHEN (N32_DMA2_BASE + N32_DMA_CHEN_OFFSET) +#define N32_DMA2_ID (N32_DMA2_BASE + N32_DMA_ID_OFFSET) +#define N32_DMA2_TEST (N32_DMA2_BASE + N32_DMA_TEST_OFFSET) +#define N32_DMA2_LPTIMEOUT (N32_DMA2_BASE + N32_DMA_LPTIMEOUT_OFFSET) +#define N32_DMA2_COMPID (N32_DMA2_BASE + N32_DMA_COMPID_OFFSET) + +#define N32_DMA3_CFG (N32_DMA3_BASE + N32_DMA_CFG_OFFSET) +#define N32_DMA3_CHEN (N32_DMA3_BASE + N32_DMA_CHEN_OFFSET) +#define N32_DMA3_ID (N32_DMA3_BASE + N32_DMA_ID_OFFSET) +#define N32_DMA3_TEST (N32_DMA3_BASE + N32_DMA_TEST_OFFSET) +#define N32_DMA3_LPTIMEOUT (N32_DMA3_BASE + N32_DMA_LPTIMEOUT_OFFSET) +#define N32_DMA3_COMPID (N32_DMA3_BASE + N32_DMA_COMPID_OFFSET) + +/* ========================================================================== + * Interrupt Bit Definitions (Channel Number n = 0~7) + * ========================================================================== + */ +#define DMA_INT_CH(n) (1U << (n)) +#define DMA_INT_CH_MASK 0xFFU + +/**************************************************************************** + * 64-bit CH_CTRL / DMA_CHnCTRL Bit Definitions + * Address:channel_base + 0x18 + * Reset Value:0x00000002_00304801 + ****************************************************************************/ + +/* ===== High 32 Bits (Bits 63:32) ===== */ +#define DMA_CHCTRL_DONE (1ULL << 44) /* 44: Done bit (status write-back) */ + +#define DMA_CHCTRL_BTS_SHIFT 32 /* 43:32: Block Transfer Size (12-bit) */ +#define DMA_CHCTRL_BTS_MASK (0xFFFULL << DMA_CHCTRL_BTS_SHIFT) +#define DMA_CHCTRL_BTS(n) ((n) << DMA_CHCTRL_BTS_SHIFT) + +/* ===== Low 32 Bits (Bits 31:0) ===== */ + +/* LLP Control Bits */ +#define DMA_CHCTRL_LLPSRCEN (1ULL << 28) /* 28: Source List Enable */ +#define DMA_CHCTRL_LLPDSTEN (1ULL << 27) /* 27: Destination List Enable */ + +/* AHB Master Port Select */ +#define DMA_CHCTRL_SMS_SHIFT 25 /* 26:25: Source Master Port */ +#define DMA_CHCTRL_SMS_MASK (0x3ULL << DMA_CHCTRL_SMS_SHIFT) +#define DMA_CHCTRL_SMS(n) ((n) << DMA_CHCTRL_SMS_SHIFT) + +#define DMA_CHCTRL_DMS_SHIFT 23 /* 24:23: Destination Master Port */ +#define DMA_CHCTRL_DMS_MASK (0x3ULL << DMA_CHCTRL_DMS_SHIFT) +#define DMA_CHCTRL_DMS(n) ((n) << DMA_CHCTRL_DMS_SHIFT) + +/* Transfer Type & Flow Control */ +#define DMA_CHCTRL_TTFC_SHIFT 20 /* 22:20: Transfer Type & Flow Control */ +#define DMA_CHCTRL_TTFC_MASK (0x7ULL << DMA_CHCTRL_TTFC_SHIFT) +#define DMA_CHCTRL_TTFC(n) ((n) << DMA_CHCTRL_TTFC_SHIFT) + +/* Function Enable Bits */ +#define DMA_CHCTRL_DSTSCAEN (1ULL << 18) /* 18: Destination Scatter Enable */ +#define DMA_CHCTRL_SRCGATEN (1ULL << 17) /* 17: Source Gather Enable */ + +/* Burst Length */ +#define DMA_CHCTRL_SRCMSIZE_SHIFT 14 /* 16:14: Source Burst Length (Encoded Value) */ +#define DMA_CHCTRL_SRCMSIZE_MASK (0x7ULL << DMA_CHCTRL_SRCMSIZE_SHIFT) +#define DMA_CHCTRL_SRCMSIZE(n) ((n) << DMA_CHCTRL_SRCMSIZE_SHIFT) + +#define DMA_CHCTRL_DSTMSIZE_SHIFT 11 /* 13:11: Destination Burst Length (Encoded Value) */ +#define DMA_CHCTRL_DSTMSIZE_MASK (0x7ULL << DMA_CHCTRL_DSTMSIZE_SHIFT) +#define DMA_CHCTRL_DSTMSIZE(n) ((n) << DMA_CHCTRL_DSTMSIZE_SHIFT) + +/* Address Increment Direction */ +#define DMA_CHCTRL_SINC_SHIFT 9 /* 10:9: Source Address Control */ +#define DMA_CHCTRL_SINC_MASK (0x3ULL << DMA_CHCTRL_SINC_SHIFT) +#define DMA_CHCTRL_SINC(n) ((n) << DMA_CHCTRL_SINC_SHIFT) + +#define DMA_CHCTRL_DINC_SHIFT 7 /* 8:7: Destination Address Control */ +#define DMA_CHCTRL_DINC_MASK (0x3ULL << DMA_CHCTRL_DINC_SHIFT) +#define DMA_CHCTRL_DINC(n) ((n) << DMA_CHCTRL_DINC_SHIFT) + +/* Transfer Width */ +#define DMA_CHCTRL_STW_SHIFT 4 /* 6:4: Source Width */ +#define DMA_CHCTRL_STW_MASK (0x7ULL << DMA_CHCTRL_STW_SHIFT) +#define DMA_CHCTRL_STW(n) ((n) << DMA_CHCTRL_STW_SHIFT) + +#define DMA_CHCTRL_DTW_SHIFT 1 /* 3:1: Destination Width */ +#define DMA_CHCTRL_DTW_MASK (0x7ULL << DMA_CHCTRL_DTW_SHIFT) +#define DMA_CHCTRL_DTW(n) ((n) << DMA_CHCTRL_DTW_SHIFT) + +/* Global Interrupt Enable Bit */ +#define DMA_CHCTRL_INTEN (1ULL << 0) /* 0: Interrupt Enable */ + +/* TTFC Enumeration */ +#define DMA_TTFC_MEM_TO_MEM_DMA (0ULL) +#define DMA_TTFC_MEM_TO_PER_DMA (1ULL) +#define DMA_TTFC_PER_TO_MEM_DMA (2ULL) +#define DMA_TTFC_PER_TO_PER_DMA (3ULL) +#define DMA_TTFC_PER_TO_MEM_PER (4ULL) +#define DMA_TTFC_PER_TO_PER_SRC (5ULL) +#define DMA_TTFC_MEM_TO_PER_PER (6ULL) +#define DMA_TTFC_PER_TO_PER_DST (7ULL) + +/* Address Control Enumeration */ +#define DMA_ADDR_INC (0ULL) +#define DMA_ADDR_DEC (1ULL) +#define DMA_ADDR_NOCHANGE (2ULL) + +/* Width Enumeration */ +#define DMA_WIDTH_8BITS (0ULL) +#define DMA_WIDTH_16BITS (1ULL) +#define DMA_WIDTH_32BITS (2ULL) +#define DMA_WIDTH_64BITS (3ULL) +#define DMA_WIDTH_128BITS (4ULL) +#define DMA_WIDTH_256BITS (5ULL) + +/* Burst Length Enumeration */ +#define DMA_BURST_1 (0ULL) +#define DMA_BURST_4 (1ULL) +#define DMA_BURST_8 (2ULL) +#define DMA_BURST_16 (3ULL) +#define DMA_BURST_32 (4ULL) +#define DMA_BURST_64 (5ULL) +#define DMA_BURST_128 (6ULL) +#define DMA_BURST_256 (7ULL) + +/* AHB Master Port Enumeration */ +#define DMA_MS_1 (0ULL) +#define DMA_MS_2 (1ULL) + +/**************************************************************************** + * 64-bit DMA_CHnCFG Register Bit Fields + * Address Offset: 0x40 + 0x58*n (n=0..7) + * Reset Value:0x0000000400000E00 + ****************************************************************************/ + +/* High 32 Bits (bits 63:32) ************************************************/ +#define DMA_CHCFG_DONE (1ULL << 44) /* 44: Block Completion Flag (Write Back) */ +#define DMA_CHCFG_BTS_SHIFT 32 /* 43:32: Block Transfer Size */ +#define DMA_CHCFG_BTS_MASK (0xFFFULL << DMA_CHCFG_BTS_SHIFT) +#define DMA_CHCFG_BTS(n) ((n) << DMA_CHCFG_BTS_SHIFT) + +#define DMA_CHCFG_DSTPER_SHIFT 43 /* 45:43: Destination Peripheral Interface Number */ +#define DMA_CHCFG_DSTPER_MASK (0x7ULL << DMA_CHCFG_DSTPER_SHIFT) +#define DMA_CHCFG_DSTPER(n) ((n) << DMA_CHCFG_DSTPER_SHIFT) + +#define DMA_CHCFG_SRCPER_SHIFT 39 /* 41:39: Source Peripheral Interface Number */ +#define DMA_CHCFG_SRCPER_MASK (0x7ULL << DMA_CHCFG_SRCPER_SHIFT) +#define DMA_CHCFG_SRCPER(n) ((n) << DMA_CHCFG_SRCPER_SHIFT) + +#define DMA_CHCFG_PROTCTL_SHIFT 34 /* 36:34: AHB Protection Control Register */ +#define DMA_CHCFG_PROTCTL_MASK (0x7ULL << DMA_CHCFG_PROTCTL_SHIFT) +#define DMA_CHCFG_PROTCTL(n) ((n) << DMA_CHCFG_PROTCTL_SHIFT) + +#define DMA_CHCFG_FIFOMS (1ULL << 33) /* 33: FIFO Mode Select */ +#define DMA_CHCFG_FCM (1ULL << 32) /* 32: Flow Control Mode */ + +/* Low 32 Bits (bits 31:0) **************************************************/ +#define DMA_CHCFG_ADR (1ULL << 31) /* 31: Auto Destination Reload */ +#define DMA_CHCFG_ASR (1ULL << 30) /* 30: Auto Source Reload */ + +#define DMA_CHCFG_MAMBABL_SHIFT 20 /* 29:20: AMBA Burst Length (Encoded Value) */ +#define DMA_CHCFG_MAMBABL_MASK (0x3FFULL << DMA_CHCFG_MAMBABL_SHIFT) +#define DMA_CHCFG_MAMBABL(n) ((n) << DMA_CHCFG_MAMBABL_SHIFT) + +#define DMA_CHCFG_SRCHSPO_SHIFT 19 /* 19: Source Handshake Polarity */ +#define DMA_CHCFG_SRCHSPO (1ULL << 19) + +#define DMA_CHCFG_DSTHSPO_SHIFT 18 /* 18: Destination Handshake Polarity */ +#define DMA_CHCFG_DSTHSPO (1ULL << 18) + +#define DMA_CHCFG_LOCKB (1ULL << 17) /* 17: Bus Lock Level */ +#define DMA_CHCFG_LOCKCH (1ULL << 16) /* 16: Channel Lock Level */ + +#define DMA_CHCFG_LOCKBL_SHIFT 14 /* 15:14: Bus Lock Level */ +#define DMA_CHCFG_LOCKBL_MASK (0x3ULL << DMA_CHCFG_LOCKBL_SHIFT) +#define DMA_CHCFG_LOCKBL(n) ((n) << DMA_CHCFG_LOCKBL_SHIFT) + +#define DMA_CHCFG_LOCKCHL_SHIFT 12 /* 13:12: Channel Lock Level */ +#define DMA_CHCFG_LOCKCHL_MASK (0x3ULL << DMA_CHCFG_LOCKCHL_SHIFT) +#define DMA_CHCFG_LOCKCHL(n) ((n) << DMA_CHCFG_LOCKCHL_SHIFT) + +#define DMA_CHCFG_HSSELSRC (1ULL << 11) /* 11: Source Handshake Select */ +#define DMA_CHCFG_HSSELDST (1ULL << 10) /* 10: Destination Handshake Select */ + +#define DMA_CHCFG_FIFOEMPTY (1ULL << 9) /* 9: FIFO Empty Flag (Read Only) */ +#define DMA_CHCFG_CHSUSP (1ULL << 8) /* 8: Channel Suspend */ + +#define DMA_CHCFG_CHPRIOR_SHIFT 5 /* 7:5: Channel Priority */ +#define DMA_CHCFG_CHPRIOR_MASK (0x7ULL << DMA_CHCFG_CHPRIOR_SHIFT) +#define DMA_CHCFG_CHPRIOR(n) ((n) << DMA_CHCFG_CHPRIOR_SHIFT) + +/* 4:0 Reserved */ + +/* ========================================================================== + * CH_SG Register Bit Fields + * ========================================================================== + */ +#define DMA_SG_SGC_SHIFT 20 +#define DMA_SG_SGC_MASK (0xFFFULL << DMA_SG_SGC_SHIFT) +#define DMA_SG_SGI_SHIFT 0 +#define DMA_SG_SGI_MASK (0xFFFFFULL << DMA_SG_SGI_SHIFT) + +/* CH_SG Register Bit Fields */ +#define DMA_SG_SGC(n) ((n) << DMA_SG_SGC_SHIFT) +#define DMA_SG_SGI(n) ((n) << DMA_SG_SGI_SHIFT) + +/* ========================================================================== + * CH_DS Register Bit Fields + * ========================================================================== + */ +#define DMA_DS_DSC_SHIFT 20 +#define DMA_DS_DSC_MASK (0xFFFULL << DMA_DS_DSC_SHIFT) +#define DMA_DS_DSI_SHIFT 0 +#define DMA_DS_DSI_MASK (0xFFFFFULL << DMA_DS_DSI_SHIFT) + +/* CH_DS Register Bit Fields */ +#define DMA_DS_DSC(n) ((n) << DMA_DS_DSC_SHIFT) +#define DMA_DS_DSI(n) ((n) << DMA_DS_DSI_SHIFT) + +/* ========================================================================== + * DMA Miscellaneous Registers Bit Fields + * ========================================================================== + */ + +/* DMA Configuration Register (DMA_CFG) */ +#define DMA_CFG_EN (1U << 0) /* Bit 0: DMA Enable bit */ + +/* DMA Channel Enable Register (DMA_CHEN) */ +#define DMA_CHEN_CH(n) (1U << (n)) /* Bit n: Channel n Enable */ +#define DMA_CHEN_CHWEN(n) (1U << ((n) + 8)) /* Bit n+8: Channel n Enable bit write enable */ + +/* DMA ID Register (DMA_ID) */ +#define DMA_ID_VALUE (0xFFFFFFFFU) /* Bits 31:0: Hardcoded DMA peripheral ID */ + +/* DMA Test Register (DMA_TEST) */ +#define DMA_TEST_TMS (1U << 0) /* Bit 0: Test Mode Select */ + +/* DMA Low Power Timeout Register (DMA_LPTIMEOUT) */ +#define DMA_LPTIMEOUT_VALUE (0xFFU) /* Bits 7:0: Timeout value of low power counter register */ + +/* DMA Component ID Register (DMA_COMPID) */ +#define DMA_COMPID_VERSION (0xFFFFFFFFU << 32) /* Bits 63:32: DMA Component Version */ +#define DMA_COMPID_TYPE (0xFFFFFFFFU) /* Bits 31:0: DMA Component Type */ + +#endif /* __ARCH_ARM_SRC_N32H7_HARDWARE_N32H7_DMA_H */ diff --git a/arch/arm/src/n32h7/hardware/n32h7_dmamux.h b/arch/arm/src/n32h7/hardware/n32h7_dmamux.h new file mode 100644 index 0000000000000..393d3f1b23c9a --- /dev/null +++ b/arch/arm/src/n32h7/hardware/n32h7_dmamux.h @@ -0,0 +1,140 @@ +/**************************************************************************** + * arch/arm/src/n32h7/hardware/n32h7_dmamux.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + + #ifndef __ARCH_ARM_SRC_N32H7_HARDWARE_N32H7_DMAMUX_H + #define __ARCH_ARM_SRC_N32H7_HARDWARE_N32H7_DMAMUX_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include "chip.h" + +#include "n32h7_memorymap.h" + +#if defined(CONFIG_N32H7_N32H76X) +# include "hardware/n32h76x_dmamux.h" +#else +# error "Unsupported N32 H7 part" +#endif + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +#define DMAMUX1 0 +#define DMAMUX2 1 + +/* Register Offsets *********************************************************/ + +#define N32_DMAMUX_CXCR_OFFSET(x) (0x0000U + 0x04U * (x)) +#define N32_DMAMUX_STS_OFFSET 0x0080U +#define N32_DMAMUX_CLR_OFFSET 0x0084U +#define N32_DMAMUX_RGXCR_OFFSET(x) (0x0100U + 0x04U * (x)) +#define N32_DMAMUX_RGSTS_OFFSET 0x0180U +#define N32_DMAMUX_RGCLR_OFFSET 0x0184U + +/* DMAMUX1 Register Addresses ***********************************************/ + +#define N32_DMAMUX1_CxCR(x) (N32_DMAMUX1_BASE + N32_DMAMUX_CXCR_OFFSET(x)) +#define N32_DMAMUX1_STS (N32_DMAMUX1_BASE + N32_DMAMUX_STS_OFFSET) +#define N32_DMAMUX1_CLR (N32_DMAMUX1_BASE + N32_DMAMUX_CLR_OFFSET) +#define N32_DMAMUX1_RGxCR(x) (N32_DMAMUX1_BASE + N32_DMAMUX_RGXCR_OFFSET(x)) +#define N32_DMAMUX1_RGSTS (N32_DMAMUX1_BASE + N32_DMAMUX_RGSTS_OFFSET) +#define N32_DMAMUX1_RGCLR (N32_DMAMUX1_BASE + N32_DMAMUX_RGCLR_OFFSET) + +/* DMAMUX2 Register Addresses ***********************************************/ + +#define N32_DMAMUX2_CxCR(x) (N32_DMAMUX2_BASE + N32_DMAMUX_CXCR_OFFSET(x)) +#define N32_DMAMUX2_STS (N32_DMAMUX2_BASE + N32_DMAMUX_STS_OFFSET) +#define N32_DMAMUX2_CLR (N32_DMAMUX2_BASE + N32_DMAMUX_CLR_OFFSET) +#define N32_DMAMUX2_RGxCR(x) (N32_DMAMUX2_BASE + N32_DMAMUX_RGXCR_OFFSET(x)) +#define N32_DMAMUX2_RGSTS (N32_DMAMUX2_BASE + N32_DMAMUX_RGSTS_OFFSET) +#define N32_DMAMUX2_RGCLR (N32_DMAMUX2_BASE + N32_DMAMUX_RGCLR_OFFSET) + +/* Register Bit Definitions *************************************************/ + +/* DMAMUX_CXCR bit definitions */ +#define DMAMUX_CXCR_REQID_SHIFT 0U +#define DMAMUX_CXCR_REQID_MASK (0x7FU << DMAMUX_CXCR_REQID_SHIFT) + +#define DMAMUX_CXCR_EGE (1U << 9) /* Event generation enable */ +#define DMAMUX_CXCR_SOIE (1U << 8) /* Sync overrun int enable */ + +#define DMAMUX_CXCR_SYEN (1U << 16) /* Sync enable */ +#define DMAMUX_CXCR_SYPOL_SHIFT 17U +#define DMAMUX_CXCR_SYPOL_MASK (0x3U << DMAMUX_CXCR_SYPOL_SHIFT) +#define DMAMUX_CXCR_SYPOL_NONE (0x0U << DMAMUX_CXCR_SYPOL_SHIFT) +#define DMAMUX_CXCR_SYPOL_RISING (0x1U << DMAMUX_CXCR_SYPOL_SHIFT) +#define DMAMUX_CXCR_SYPOL_FALLING (0x2U << DMAMUX_CXCR_SYPOL_SHIFT) +#define DMAMUX_CXCR_SYPOL_BOTH (0x3U << DMAMUX_CXCR_SYPOL_SHIFT) + +#define DMAMUX_CXCR_NUMREQ_SHIFT 19U +#define DMAMUX_CXCR_NUMREQ_MASK (0x1FU << DMAMUX_CXCR_NUMREQ_SHIFT) + +#define DMAMUX_CXCR_SYID_SHIFT 24U +#define DMAMUX_CXCR_SYID_MASK (0xFU << DMAMUX_CXCR_SYID_SHIFT) + +/* DMAMUX_STS bit definitions */ +#define DMAMUX_STS_SOF(x) (1U << (x)) + +/* DMAMUX_CLR bit definitions */ +#define DMAMUX_CLR_CSOF(x) (1U << (x)) + +/* DMAMUX_RGXCR bit definitions */ +#define DMAMUX_RGXCR_SIGID_SHIFT 0U +#define DMAMUX_RGXCR_SIGID_MASK (0x3FU << DMAMUX_RGXCR_SIGID_SHIFT) + +#define DMAMUX_RGXCR_TOVIEN (1U << 8) /* Trigger overrun int enable */ + +#define DMAMUX_RGXCR_GEN (1U << 16) /* Request generator enable */ +#define DMAMUX_RGXCR_GPOL_SHIFT 17U +#define DMAMUX_RGXCR_GPOL_MASK (0x3U << DMAMUX_RGXCR_GPOL_SHIFT) +#define DMAMUX_RGXCR_GPOL_NONE (0x0U << DMAMUX_RGXCR_GPOL_SHIFT) +#define DMAMUX_RGXCR_GPOL_RISING (0x1U << DMAMUX_RGXCR_GPOL_SHIFT) +#define DMAMUX_RGXCR_GPOL_FALLING (0x2U << DMAMUX_RGXCR_GPOL_SHIFT) +#define DMAMUX_RGXCR_GPOL_BOTH (0x3U << DMAMUX_RGXCR_GPOL_SHIFT) + +#define DMAMUX_RGXCR_GNUMREQ_SHIFT 19U +#define DMAMUX_RGXCR_GNUMREQ_MASK (0x1FU << DMAMUX_RGXCR_GNUMREQ_SHIFT) + +/* DMAMUX_RGSTS bit definitions */ +#define DMAMUX_RGSTS_OF(x) (1U << (x)) + +/* DMAMUX_RGCLR bit definitions */ +#define DMAMUX_RGCLR_COF(x) (1U << (x)) + +/**************************************************************************** + * DMA channel mapping + * + * XXXXX.DDD.CCCCCCCC + * C - DMAMUX request + * D - DMA controller + * X - free bits + ****************************************************************************/ + +#define DMAMAP_MAP(d,c) ((d) << 8 | (c-1)) +#define DMAMAP_CONTROLLER(m) ((m) >> 8 & 0x07) +#define DMAMAP_REQUEST(m) ((m) >> 0 & 0xff) + +#endif /* __ARCH_ARM_SRC_N32H7_HARDWARE_N32H7_DMAMUX_H */ diff --git a/arch/arm/src/n32h7/hardware/n32h7_exti.h b/arch/arm/src/n32h7/hardware/n32h7_exti.h new file mode 100644 index 0000000000000..5e075b76e7ba9 --- /dev/null +++ b/arch/arm/src/n32h7/hardware/n32h7_exti.h @@ -0,0 +1,211 @@ +/**************************************************************************** + * arch/arm/src/n32h7/hardware/n32h7_exti.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __ARCH_ARM_SRC_N32H7_HARDWARE_N32_EXTI_H +#define __ARCH_ARM_SRC_N32H7_HARDWARE_N32_EXTI_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include "chip.h" +#include "hardware/n32h7_memorymap.h" + +#if defined(CONFIG_N32H7_N32H76X) + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* Register Offsets *********************************************************/ + +/* Register Index Calculation (Each register manages 32 EXTI lines) */ +#define N32_EXTI_INDEX(n) ((n) >> 5) /* Calculate register index (0-1) */ +#define N32_EXTI_SHIFT(n) ((n) & 0x1f) /* Calculate bit shift (0-31) */ +#define N32_EXTI_MASK(n) (1 << N32_EXTI_SHIFT(n)) /* Generate bit mask */ + +/* Dynamic Offset Calculation (For RT/FT/SWIE register groups) */ +#define N32_EXTI_RT_CFG_OFFSET(n) (0x0000 + (N32_EXTI_INDEX(n) * 4)) +#define N32_EXTI_FT_CFG_OFFSET(n) (0x0020 + (N32_EXTI_INDEX(n) * 4)) +#define N32_EXTI_SWIE_OFFSET(n) (0x0040 + (N32_EXTI_INDEX(n) * 4)) +#define N32_EXTI_M7IMASK_OFFSET(n) (0x0060 + (N32_EXTI_INDEX(n) * 4)) +#define N32_EXTI_M4IMASK_OFFSET(n) (0x0080 + (N32_EXTI_INDEX(n) * 4)) +#define N32_EXTI_M7EMASK_OFFSET(n) (0x00A0 + (N32_EXTI_INDEX(n) * 4)) +#define N32_EXTI_M4EMASK_OFFSET(n) (0x00C0 + (N32_EXTI_INDEX(n) * 4)) +#define N32_EXTI_M7PEND_OFFSET(n) (0x00E0 + (N32_EXTI_INDEX(n) * 4)) +#define N32_EXTI_M4PEND_OFFSET(n) (0x0100 + (N32_EXTI_INDEX(n) * 4)) +#define N32_EXTI_M7IMASK_DRC_OFFSET(n) (0x0120 + (N32_EXTI_INDEX(n) * 4)) +#define N32_EXTI_M4IMASK_DRC_OFFSET(n) (0x0140 + (N32_EXTI_INDEX(n) * 4)) +#define N32_EXTI_M7EMASK_DRC_OFFSET(n) (0x0160 + (N32_EXTI_INDEX(n) * 4)) +#define N32_EXTI_M4EMASK_DRC_OFFSET(n) (0x0180 + (N32_EXTI_INDEX(n) * 4)) + +/* Static Offset Definitions */ +#define N32_EXTI_RT_CFG0_OFFSET 0x0000 /* Rising Trigger Config 0 (0-31) */ +#define N32_EXTI_RT_CFG1_OFFSET 0x0004 /* Rising Trigger Config 1 (32-51) */ +#define N32_EXTI_FT_CFG0_OFFSET 0x0020 /* Falling Trigger Config 0 (0-31) */ +#define N32_EXTI_FT_CFG1_OFFSET 0x0024 /* Falling Trigger Config 1 (32-51) */ +#define N32_EXTI_SWIE0_OFFSET 0x0040 /* SW Interrupt Enable 0 (0-31) */ +#define N32_EXTI_SWIE1_OFFSET 0x0044 /* SW Interrupt Enable 1 (32-51) */ +#define N32_EXTI_M7IMASK0_OFFSET 0x0060 /* CM7 Interrupt Mask 0 (0-31) */ +#define N32_EXTI_M7IMASK1_OFFSET 0x0064 /* CM7 Interrupt Mask 1 (32-51) */ +#define N32_EXTI_M4IMASK0_OFFSET 0x0080 /* CM4 Interrupt Mask 0 (0-31) */ +#define N32_EXTI_M4IMASK1_OFFSET 0x0084 /* CM4 Interrupt Mask 1 (32-51) */ +#define N32_EXTI_M7EMASK0_OFFSET 0x00A0 /* CM7 Event Mask 0 (0-31) */ +#define N32_EXTI_M7EMASK1_OFFSET 0x00A4 /* CM7 Event Mask 1 (32-51) */ +#define N32_EXTI_M4EMASK0_OFFSET 0x00C0 /* CM4 Event Mask 0 (0-31) */ +#define N32_EXTI_M4EMASK1_OFFSET 0x00C4 /* CM4 Event Mask 1 (32-51) */ +#define N32_EXTI_M7PEND0_OFFSET 0x00E0 /* CM7 Pending 0 (0-31) */ +#define N32_EXTI_M7PEND1_OFFSET 0x00E4 /* CM7 Pending 1 (32-51) */ +#define N32_EXTI_M4PEND0_OFFSET 0x0100 /* CM4 Pending 0 (0-31) */ +#define N32_EXTI_M4PEND1_OFFSET 0x0104 /* CM4 Pending 1 (32-51) */ +#define N32_EXTI_M7IMASK0_DRC_OFFSET 0x0120 /* CM7 Direct Event Int Mask 0 (0-31) */ +#define N32_EXTI_M7IMASK1_DRC_OFFSET 0x0124 /* CM7 Direct Event Int Mask 1 (32-58) */ +#define N32_EXTI_M4IMASK0_DRC_OFFSET 0x0140 /* CM4 Direct Event Int Mask 0 (0-31) */ +#define N32_EXTI_M4IMASK1_DRC_OFFSET 0x0144 /* CM4 Direct Event Int Mask 1 (32-58) */ +#define N32_EXTI_M7EMASK0_DRC_OFFSET 0x0160 /* CM7 Direct Event Mask 0 (0-31) */ +#define N32_EXTI_M7EMASK1_DRC_OFFSET 0x0164 /* CM7 Direct Event Mask 1 (32-58) */ +#define N32_EXTI_M4EMASK0_DRC_OFFSET 0x0180 /* CM4 Direct Event Mask 0 (0-31) */ +#define N32_EXTI_M4EMASK1_DRC_OFFSET 0x0184 /* CM4 Direct Event Mask 1 (32-58) */ +#define N32_EXTI_TSSEL_OFFSET 0x01C0 /* Timestamp Select */ + +/* Register Addresses *******************************************************/ + +/* Dynamic Address Calculation (For RT/FT/SWIE register groups) */ +#define N32H7_EXTI_RT_CFG(n) (N32_EXTI_WKUP_BASE + N32_EXTI_RT_CFG_OFFSET(n)) +#define N32H7_EXTI_FT_CFG(n) (N32_EXTI_WKUP_BASE + N32_EXTI_FT_CFG_OFFSET(n)) +#define N32H7_EXTI_SWIE(n) (N32_EXTI_WKUP_BASE + N32_EXTI_SWIE_OFFSET(n)) +#define N32H7_EXTI_M7IMASK(n) (N32_EXTI_WKUP_BASE + N32_EXTI_M7IMASK_OFFSET(n)) +#define N32H7_EXTI_M4IMASK(n) (N32_EXTI_WKUP_BASE + N32_EXTI_M4IMASK_OFFSET(n)) +#define N32H7_EXTI_M7EMASK(n) (N32_EXTI_WKUP_BASE + N32_EXTI_M7EMASK_OFFSET(n)) +#define N32H7_EXTI_M4EMASK(n) (N32_EXTI_WKUP_BASE + N32_EXTI_M4EMASK_OFFSET(n)) +#define N32H7_EXTI_M7PEND(n) (N32_EXTI_WKUP_BASE + N32_EXTI_M7PEND_OFFSET(n)) +#define N32H7_EXTI_M4PEND(n) (N32_EXTI_WKUP_BASE + N32_EXTI_M4PEND_OFFSET(n)) +#define N32H7_EXTI_M7IMASK_DRC(n) (N32_EXTI_WKUP_BASE + N32_EXTI_M7IMASK_DRC_OFFSET(n)) +#define N32H7_EXTI_M4IMASK_DRC(n) (N32_EXTI_WKUP_BASE + N32_EXTI_M4IMASK_DRC_OFFSET(n)) +#define N32H7_EXTI_M7EMASK_DRC(n) (N32_EXTI_WKUP_BASE + N32_EXTI_M7EMASK_DRC_OFFSET(n)) +#define N32H7_EXTI_M4EMASK_DRC(n) (N32_EXTI_WKUP_BASE + N32_EXTI_M4EMASK_DRC_OFFSET(n)) + +/* Static Address Definitions */ +#define N32_EXTI_RT_CFG0 (N32_EXTI_WKUP_BASE + N32_EXTI_RT_CFG0_OFFSET) +#define N32_EXTI_RT_CFG1 (N32_EXTI_WKUP_BASE + N32_EXTI_RT_CFG1_OFFSET) +#define N32_EXTI_FT_CFG0 (N32_EXTI_WKUP_BASE + N32_EXTI_FT_CFG0_OFFSET) +#define N32_EXTI_FT_CFG1 (N32_EXTI_WKUP_BASE + N32_EXTI_FT_CFG1_OFFSET) +#define N32_EXTI_SWIE0 (N32_EXTI_WKUP_BASE + N32_EXTI_SWIE0_OFFSET) +#define N32_EXTI_SWIE1 (N32_EXTI_WKUP_BASE + N32_EXTI_SWIE1_OFFSET) +#define N32_EXTI_M7IMASK0 (N32_EXTI_WKUP_BASE + N32_EXTI_M7IMASK0_OFFSET) +#define N32_EXTI_M7IMASK1 (N32_EXTI_WKUP_BASE + N32_EXTI_M7IMASK1_OFFSET) +#define N32_EXTI_M4IMASK0 (N32_EXTI_WKUP_BASE + N32_EXTI_M4IMASK0_OFFSET) +#define N32_EXTI_M4IMASK1 (N32_EXTI_WKUP_BASE + N32_EXTI_M4IMASK1_OFFSET) +#define N32_EXTI_M7EMASK0 (N32_EXTI_WKUP_BASE + N32_EXTI_M7EMASK0_OFFSET) +#define N32_EXTI_M7EMASK1 (N32_EXTI_WKUP_BASE + N32_EXTI_M7EMASK1_OFFSET) +#define N32_EXTI_M4EMASK0 (N32_EXTI_WKUP_BASE + N32_EXTI_M4EMASK0_OFFSET) +#define N32_EXTI_M4EMASK1 (N32_EXTI_WKUP_BASE + N32_EXTI_M4EMASK1_OFFSET) +#define N32_EXTI_M7PEND0 (N32_EXTI_WKUP_BASE + N32_EXTI_M7PEND0_OFFSET) +#define N32_EXTI_M7PEND1 (N32_EXTI_WKUP_BASE + N32_EXTI_M7PEND1_OFFSET) +#define N32_EXTI_M4PEND0 (N32_EXTI_WKUP_BASE + N32_EXTI_M4PEND0_OFFSET) +#define N32_EXTI_M4PEND1 (N32_EXTI_WKUP_BASE + N32_EXTI_M4PEND1_OFFSET) +#define N32_EXTI_M7IMASK0_DRC (N32_EXTI_WKUP_BASE + N32_EXTI_M7IMASK0_DRC_OFFSET) +#define N32_EXTI_M7IMASK1_DRC (N32_EXTI_WKUP_BASE + N32_EXTI_M7IMASK1_DRC_OFFSET) +#define N32_EXTI_M4IMASK0_DRC (N32_EXTI_WKUP_BASE + N32_EXTI_M4IMASK0_DRC_OFFSET) +#define N32_EXTI_M4IMASK1_DRC (N32_EXTI_WKUP_BASE + N32_EXTI_M4IMASK1_DRC_OFFSET) +#define N32_EXTI_M7EMASK0_DRC (N32_EXTI_WKUP_BASE + N32_EXTI_M7EMASK0_DRC_OFFSET) +#define N32_EXTI_M7EMASK1_DRC (N32_EXTI_WKUP_BASE + N32_EXTI_M7EMASK1_DRC_OFFSET) +#define N32_EXTI_M4EMASK0_DRC (N32_EXTI_WKUP_BASE + N32_EXTI_M4EMASK0_DRC_OFFSET) +#define N32_EXTI_M4EMASK1_DRC (N32_EXTI_WKUP_BASE + N32_EXTI_M4EMASK1_DRC_OFFSET) +#define N32_EXTI_TSSEL (N32_EXTI_WKUP_BASE + N32_EXTI_TSSEL_OFFSET) + +/* Register Bitfield Definitions ********************************************/ + +#define EXTI_EVENT(n) N32_EXTI_MASK(n) + +/* EXTI_RT_CFGx / EXTI_FT_CFGx */ +#define EXTI_CFG_ENABLE 1 +#define EXTI_CFG_DISABLE 0 + +/* EXTI_SWIEx */ +#define EXTI_SWIE_TRIGGER 1 + +/* Mask Registers (MxIMASK, MxEMASK, etc.) */ +#define EXTI_MASK_UNMASKED 1 +#define EXTI_MASK_MASKED 0 + +/* Pending Registers (MxPEND) */ +#define EXTI_PEND_ACTIVE 1 +#define EXTI_PEND_INACTIVE 0 + +/* EXTI_TSSEL */ +#define EXTI_TSSEL_SHIFT (8) +#define EXTI_TSSEL_MASK (0xF << EXTI_TSSEL_SHIFT) +#define EXTI_TSSEL_LINE(n) (((n) & 0xF) << EXTI_TSSEL_SHIFT) + +/* EXTI event input mapping *************************************************/ + +#define EXTI_EVENT_EXTI(n) (1 << (n))/* Base EXTI line (0-15) */ + +/* Peripheral Specific Event Lines (16-31) */ +#define EXTI_EVENT_PVDAVD 16 /* PVD and AVD event */ +#define EXTI_EVENT_RTC_ALARM 17 /* RTC alarm event */ +#define EXTI_EVENT_RTC_MULTI 18 /* RTC intrusion/LSECSS/LSECSS overflow/LSICSS */ +#define EXTI_EVENT_RTC_WAKEUP 19 /* RTC wakeup timer event */ +#define EXTI_EVENT_COMP1 20 /* Comparator1 output */ +#define EXTI_EVENT_COMP2 21 /* Comparator2 output */ +#define EXTI_EVENT_COMP3 22 /* Comparator3 output */ +#define EXTI_EVENT_SDMMC1_WAKEUP 24 /* SDMMC1 wakeup event */ +#define EXTI_EVENT_SDMMC2_WAKEUP 25 /* SDMMC2 wakeup event */ +#define EXTI_EVENT_LPUART1_WAKEUP 49 /* LPUART1 wakeup event */ +#define EXTI_EVENT_DCMUA_INT 51 /* DCMUA interrupt event */ +#define EXTI_EVENT_LPUART2_WAKEUP 52 /* LPUART2 wakeup event */ +#define EXTI_EVENT_DCMUB_INT 54 /* DCMUB interrupt event */ +#define EXTI_EVENT_CM7_AHBS_ABORT 55 /* CM7 AHBS_ABORT event */ +#define EXTI_EVENT_CM7_AHBSRDY_ERROR 56 /* CM7 AHBSRDY_ERROR event */ +#define EXTI_EVENT_USB1_HS_WAKEUP 62 /* USB1_HS wakeup event */ +#define EXTI_EVENT_USB2_HS_WAKEUP 63 /* USB2_HS wakeup event */ +#define EXTI_EVENT_CM7_CACHE_READ_CER 64 /* CM7 cache read correctable error event */ +#define EXTI_EVENT_CM7_CACHE_READ_FER 65 /* CM7 cache read fatal error event */ +#define EXTI_EVENT_LPTIM1_WAKEUP 66 /* LPTIM1 wakeup event */ +#define EXTI_EVENT_LPTIM2_WAKEUP 67 /* LPTIM2 wakeup event */ +#define EXTI_EVENT_LPTIM3_WAKEUP 68 /* LPTIM3 wakeup event */ +#define EXTI_EVENT_LPTIM4_WAKEUP 69 /* LPTIM4 wakeup event */ +#define EXTI_EVENT_WKUP1 70 /* Wakeup pin 1 event */ +#define EXTI_EVENT_WKUP2 71 /* Wakeup pin 2 event */ +#define EXTI_EVENT_WKUP3 72 /* Wakeup pin 3 event */ +#define EXTI_EVENT_WKUP4 73 /* Wakeup pin 4 event */ +#define EXTI_EVENT_WKUP5 74 /* Wakeup pin 5 event */ +#define EXTI_EVENT_WKUP6 75 /* Wakeup pin 6 event */ +#define EXTI_EVENT_RCC_INT 76 /* RCC interrupt event */ +#define EXTI_EVENT_SEMA1_INT 77 /* SEMA1 interrupt event */ +#define EXTI_EVENT_SEMA2_INT 78 /* SEMA2 interrupt event */ +#define EXTI_EVENT_CM4_SEV_INT 79 /* Cortex-M4 SEV interrupt event */ +#define EXTI_EVENT_CM7_SEV_INT 80 /* Cortex-M7 SEV interrupt event */ +#define EXTI_EVENT_WWDG1_RESET 81 /* WWDG1 reset */ +#define EXTI_EVENT_WWDG2_RESET 82 /* WWDG2 reset */ +#define EXTI_EVENT_ETH1_WAKEUP 83 /* ETHERNET1 wakeup(LPI+PMT) */ +#define EXTI_EVENT_ETH2_WAKEUP 84 /* ETHERNET2 wakeup(LPI+PMT) */ +#define EXTI_EVENT_HSECSS_INT 85 /* HSECSS interrupt event */ +#define EXTI_EVENT_LPTIMER5_WAKEUP 86 /* LPTIMER5 wakeup event */ +#define EXTI_EVENT_DSI_ERROR 87 /* DSI error event */ +#define EXTI_EVENT_BKP_EMC 88 /* BKP EMC event */ +#define EXTI_EVENT_VDDD_EMC 89 /* VDDD EMC event */ + +#endif /* CONFIG_ARCH_CHIP_N32H7 */ +#endif /* __ARCH_ARM_SRC_N32H7_HARDWARE_N32_EXTI_H */ diff --git a/arch/arm/src/n32h7/hardware/n32h7_gpio.h b/arch/arm/src/n32h7/hardware/n32h7_gpio.h new file mode 100644 index 0000000000000..81badc5bbef19 --- /dev/null +++ b/arch/arm/src/n32h7/hardware/n32h7_gpio.h @@ -0,0 +1,39 @@ +/**************************************************************************** + * arch/arm/src/n32h7/hardware/n32h7_gpio.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __ARCH_ARM_SRC_N32H7_HARDWARE_N32_GPIO_H +#define __ARCH_ARM_SRC_N32H7_HARDWARE_N32_GPIO_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include "chip.h" + +#if defined(CONFIG_N32H7_N32H76X) +# include "hardware/n32h76x_gpio.h" +#else +# error "Unsupported N32 H7 part" +#endif + +#endif /* __ARCH_ARM_SRC_N32H7_HARDWARE_N32_GPIO_H */ diff --git a/arch/arm/src/n32h7/hardware/n32h7_memorymap.h b/arch/arm/src/n32h7/hardware/n32h7_memorymap.h new file mode 100644 index 0000000000000..930ce3594679e --- /dev/null +++ b/arch/arm/src/n32h7/hardware/n32h7_memorymap.h @@ -0,0 +1,39 @@ +/**************************************************************************** + * arch/arm/src/n32h7/hardware/n32h7_memorymap.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __ARCH_ARM_SRC_N32H7_HARDWARE_N32H7_MEMORYMAP_H +#define __ARCH_ARM_SRC_N32H7_HARDWARE_N32H7_MEMORYMAP_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include "chip.h" + +#if defined(CONFIG_N32H7_N32H76X) +# include "hardware/n32h76x_memorymap.h" +#else +# error "Unsupported N32H7 memory map" +#endif + +#endif /* __ARCH_ARM_SRC_N32H7_HARDWARE_N32H7_MEMORYMAP_H */ diff --git a/arch/arm/src/n32h7/hardware/n32h7_pinmap.h b/arch/arm/src/n32h7/hardware/n32h7_pinmap.h new file mode 100644 index 0000000000000..55740996d6b8c --- /dev/null +++ b/arch/arm/src/n32h7/hardware/n32h7_pinmap.h @@ -0,0 +1,39 @@ +/**************************************************************************** + * arch/arm/src/n32h7/hardware/n32h7_pinmap.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __ARCH_ARM_SRC_N32H7_HARDWARE_N32H7_PINMAP_H +#define __ARCH_ARM_SRC_N32H7_HARDWARE_N32H7_PINMAP_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include "chip.h" + +#if defined(CONFIG_N32H7_N32H76X) +# include "hardware/n32h76x_pinmap.h" +#else +# error "Unsupported N32H7 Pin map" +#endif + +#endif /* __ARCH_ARM_SRC_N32H7_HARDWARE_N32H7_PINMAP_H */ diff --git a/arch/arm/src/n32h7/hardware/n32h7_pwr.h b/arch/arm/src/n32h7/hardware/n32h7_pwr.h new file mode 100644 index 0000000000000..2ef0da86b9fa6 --- /dev/null +++ b/arch/arm/src/n32h7/hardware/n32h7_pwr.h @@ -0,0 +1,39 @@ +/**************************************************************************** + * arch/arm/src/n32h7/hardware/n32h7_pwr.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __ARCH_ARM_SRC_N32H7_HARDWARE_N32H7_PWR_H +#define __ARCH_ARM_SRC_N32H7_HARDWARE_N32H7_PWR_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include "chip.h" + +#if defined(CONFIG_N32H7_N32H76X) +# include "hardware/n32h76x_pwr.h" +#else +# error "Unsupported N32 H7 part" +#endif + +#endif /* __ARCH_ARM_SRC_STM32H7_HARDWARE_STM32_PWR_H */ diff --git a/arch/arm/src/n32h7/hardware/n32h7_rcc.h b/arch/arm/src/n32h7/hardware/n32h7_rcc.h new file mode 100644 index 0000000000000..4ab9e5a1df7c8 --- /dev/null +++ b/arch/arm/src/n32h7/hardware/n32h7_rcc.h @@ -0,0 +1,39 @@ +/**************************************************************************** + * arch/arm/src/n32h7/hardware/n32h7_rcc.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __ARCH_ARM_SRC_N32H7_HARDWARE_N32H7_RCC_H +#define __ARCH_ARM_SRC_N32H7_HARDWARE_N32H7_RCC_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include "chip.h" + +#if defined(CONFIG_N32H7_N32H76X) +# include "hardware/n32h76x_rcc.h" +#else +# error "Unsupported STM32 H7 part" +#endif + +#endif /* __ARCH_ARM_SRC_STM32H7_HARDWARE_STM32_RCC_H */ diff --git a/arch/arm/src/n32h7/hardware/n32h7_sdmmc.h b/arch/arm/src/n32h7/hardware/n32h7_sdmmc.h new file mode 100644 index 0000000000000..5842ac5101921 --- /dev/null +++ b/arch/arm/src/n32h7/hardware/n32h7_sdmmc.h @@ -0,0 +1,511 @@ +/**************************************************************************** + * arch/arm/src/n32h7/hardware/n32h7_sdmmc.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __ARCH_ARM_SRC_N32H7_HARDWARE_N32H7_SDMMC_H +#define __ARCH_ARM_SRC_N32H7_HARDWARE_N32H7_SDMMC_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* SDMMC Configuration Register Offsets (CFG) *******************************/ + +#define N32_SDMMC_CFG1_OFFSET 0x00 /* SDMMC Configuration 1 */ +#define N32_SDMMC_CFG2_OFFSET 0x04 /* SDMMC Configuration 2 (Capabilities) */ +#define N32_SDMMC_CFG3_OFFSET 0x08 /* SDMMC Configuration 3 */ +#define N32_SDMMC_PV0CTRL_OFFSET 0x0C /* Preset Value 0 Control */ +#define N32_SDMMC_PV1CTRL_OFFSET 0x10 /* Preset Value 1 Control */ +#define N32_SDMMC_PV2CTRL_OFFSET 0x14 /* Preset Value 2 Control */ +#define N32_SDMMC_PV3CTRL_OFFSET 0x18 /* Preset Value 3 Control */ +#define N32_SDMMC_DLYCTRL_OFFSET 0x20 /* TX/RX Delay Control */ + +/* SDHOST Register Offsets **************************************************/ + +#define N32_SDHOST_DSADD_OFFSET 0x00 /* SDMA System Address / Parameter 2 */ +#define N32_SDHOST_BLKCFG_OFFSET 0x04 /* Block Count & Size Configuration */ +#define N32_SDHOST_CMDARG1_OFFSET 0x08 /* Command Argument 1 */ +#define N32_SDHOST_TMODE_OFFSET 0x0C /* Transfer Mode */ +#define N32_SDHOST_CMDRSP0_OFFSET 0x10 /* Command Response 0 (31:0) */ +#define N32_SDHOST_CMDRSP1_OFFSET 0x14 /* Command Response 1 (63:32) */ +#define N32_SDHOST_CMDRSP2_OFFSET 0x18 /* Command Response 2 (95:64) */ +#define N32_SDHOST_CMDRSP3_OFFSET 0x1C /* Command Response 3 (127:96) */ +#define N32_SDHOST_BUFDAT_OFFSET 0x20 /* Buffer Data Port (FIFO) */ +#define N32_SDHOST_PRESTS_OFFSET 0x24 /* Present State */ +#define N32_SDHOST_CTRL1_OFFSET 0x28 /* Control 1 */ +#define N32_SDHOST_CTRL2_OFFSET 0x2C /* Control 2 */ +#define N32_SDHOST_INTSTS_OFFSET 0x30 /* Interrupt Status */ +#define N32_SDHOST_IE_OFFSET 0x34 /* Interrupt Enable */ +#define N32_SDHOST_ISE_OFFSET 0x38 /* Interrupt Signal Enable */ +#define N32_SDHOST_CTRLSTS_OFFSET 0x3C /* Control Status */ +#define N32_SDHOST_CAP0STS_OFFSET 0x40 /* Capabilities 0 */ +#define N32_SDHOST_CAP1STS_OFFSET 0x44 /* Capabilities 1 */ +#define N32_SDHOST_STSFE_OFFSET 0x50 /* Status Force Event */ +#define N32_SDHOST_ADMAESTS_OFFSET 0x54 /* ADMA Error Status */ +#define N32_SDHOST_ASADD0_OFFSET 0x58 /* ADMA System Address 0 (low 32-bit) */ +#define N32_SDHOST_ASADD1_OFFSET 0x5C /* ADMA System Address 1 (high 32-bit) */ +#define N32_SDHOST_PV0STS_OFFSET 0x60 /* Preset Value 0 Status */ +#define N32_SDHOST_PV1STS_OFFSET 0x64 /* Preset Value 1 Status */ +#define N32_SDHOST_PV2STS_OFFSET 0x68 /* Preset Value 2 Status */ +#define N32_SDHOST_PV3STS_OFFSET 0x6C /* Preset Value 3 Status */ +#define N32_SDHOST_BOOTCTRL_OFFSET 0x70 /* Boot Timeout Control */ + +/* SDMMC CFG1 Register Bit Definitions **************************************/ + +#define N32_SDMMC_CFG1_WSGM (1 << 0) /* Bit 0: Wakeup Signal Generation Mode */ +#define N32_SDMMC_CFG1_TCNT_SHIFT (1) /* Bits 1-6: Tuning Count */ +#define N32_SDMMC_CFG1_TCNT_MASK (0x3F << N32_SDMMC_CFG1_TCNT_SHIFT) +#define N32_SDMMC_CFG1_TCNT(n) ((n) << N32_SDMMC_CFG1_TCNT_SHIFT) +#define N32_SDMMC_CFG1_TCLKU (1 << 13) /* Bit 13: Timeout Clock Unit (0=KHz, 1=MHz) */ +#define N32_SDMMC_CFG1_BCLKF_SHIFT (14) /* Bits 14-21: Base Clock Frequency (MHz) */ +#define N32_SDMMC_CFG1_BCLKF_MASK (0xFF << N32_SDMMC_CFG1_BCLKF_SHIFT) +#define N32_SDMMC_CFG1_BCLKF(n) ((n) << N32_SDMMC_CFG1_BCLKF_SHIFT) +#define N32_SDMMC_CFG1_MBL_SHIFT (22) /* Bits 22-23: Max Block Length */ +#define N32_SDMMC_CFG1_MBL_MASK (3 << N32_SDMMC_CFG1_MBL_SHIFT) +#define N32_SDMMC_CFG1_MBL_512 (0 << N32_SDMMC_CFG1_MBL_SHIFT) /* 512 bytes */ +#define N32_SDMMC_CFG1_MBL_1024 (1 << N32_SDMMC_CFG1_MBL_SHIFT) /* 1024 bytes */ +#define N32_SDMMC_CFG1_MBL_2048 (2 << N32_SDMMC_CFG1_MBL_SHIFT) /* 2048 bytes */ + +/* SDMMC CFG2 Register Bit Definitions (Capabilities) ***********************/ + +#define N32_SDMMC_CFG2_EMBUS (1 << 0) /* Bit 0: 8-bit Support for Embedded Device */ +#define N32_SDMMC_CFG2_ADMA2 (1 << 1) /* Bit 1: ADMA2 Support */ +#define N32_SDMMC_CFG2_HS (1 << 2) /* Bit 2: High Speed Support */ +#define N32_SDMMC_CFG2_SDMA (1 << 3) /* Bit 3: SDMA Support */ +#define N32_SDMMC_CFG2_SRS (1 << 4) /* Bit 4: Suspend/Resume Support */ +#define N32_SDMMC_CFG2_VS33 (1 << 5) /* Bit 5: 3.3V Support */ +#define N32_SDMMC_CFG2_ASYNCIINT (1 << 9) /* Bit 9: Asynchronous Interrupt Support */ +#define N32_SDMMC_CFG2_STYP_SHIFT (10) /* Bits 10-11: Slot Type */ +#define N32_SDMMC_CFG2_STYP_MASK (3 << N32_SDMMC_CFG2_STYP_SHIFT) +#define N32_SDMMC_CFG2_STYP_REMOVABLE (0 << N32_SDMMC_CFG2_STYP_SHIFT) /* Removable card slot */ +#define N32_SDMMC_CFG2_STYP_EMBEDDED (1 << N32_SDMMC_CFG2_STYP_SHIFT) /* Embedded slot */ +#define N32_SDMMC_CFG2_SDR50 (1 << 12) /* Bit 12: SDR50 Support */ +#define N32_SDMMC_CFG2_SDR104 (1 << 13) /* Bit 13: SDR104 Support */ + +/* SDMMC CFG3 Register Bit Definitions **************************************/ + +#define N32_SDMMC_CFG3_UTFSDR50 (1 << 4) /* Bit 4: Use Tuning for SDR50 */ + +/* SDMMC Preset Value Control Registers Bit Definitions *********************/ + +/* PV0CTRL: Default Speed and Initialization */ +#define N32_SDMMC_PV0CTRL_CLKFS_INIT_SHIFT (0) /* Bits 0-9: Init clock */ +#define N32_SDMMC_PV0CTRL_CLKFS_INIT_MASK (0x3FF << N32_SDMMC_PV0CTRL_CLKFS_INIT_SHIFT) +#define N32_SDMMC_PV0CTRL_CLKFS_INIT(n) ((n) << N32_SDMMC_PV0CTRL_CLKFS_INIT_SHIFT) +#define N32_SDMMC_PV0CTRL_CLKFS_DS_SHIFT (13) /* Bits 13-22: Default speed clock */ +#define N32_SDMMC_PV0CTRL_CLKFS_DS_MASK (0x3FF << N32_SDMMC_PV0CTRL_CLKFS_DS_SHIFT) +#define N32_SDMMC_PV0CTRL_CLKFS_DS(n) ((n) << N32_SDMMC_PV0CTRL_CLKFS_DS_SHIFT) + +/* PV1CTRL: SDR12 and High Speed */ +#define N32_SDMMC_PV1CTRL_CLKFS_HS_SHIFT (0) /* Bits 0-9: HS clock */ +#define N32_SDMMC_PV1CTRL_CLKFS_HS_MASK (0x3FF << N32_SDMMC_PV1CTRL_CLKFS_HS_SHIFT) +#define N32_SDMMC_PV1CTRL_CLKFS_HS(n) ((n) << N32_SDMMC_PV1CTRL_CLKFS_HS_SHIFT) +#define N32_SDMMC_PV1CTRL_CLKFS_SDR12_SHIFT (13) /* Bits 13-22: SDR12 clock */ +#define N32_SDMMC_PV1CTRL_CLKFS_SDR12_MASK (0x3FF << N32_SDMMC_PV1CTRL_CLKFS_SDR12_SHIFT) +#define N32_SDMMC_PV1CTRL_CLKFS_SDR12(n) ((n) << N32_SDMMC_PV1CTRL_CLKFS_SDR12_SHIFT) + +/* PV2CTRL: SDR50 and SDR25 */ +#define N32_SDMMC_PV2CTRL_CLKFS_SDR25_SHIFT (0) /* Bits 0-9: SDR25 clock */ +#define N32_SDMMC_PV2CTRL_CLKFS_SDR25_MASK (0x3FF << N32_SDMMC_PV2CTRL_CLKFS_SDR25_SHIFT) +#define N32_SDMMC_PV2CTRL_CLKFS_SDR25(n) ((n) << N32_SDMMC_PV2CTRL_CLKFS_SDR25_SHIFT) +#define N32_SDMMC_PV2CTRL_CLKFS_SDR50_SHIFT (13) /* Bits 13-22: SDR50 clock */ +#define N32_SDMMC_PV2CTRL_CLKFS_SDR50_MASK (0x3FF << N32_SDMMC_PV2CTRL_CLKFS_SDR50_SHIFT) +#define N32_SDMMC_PV2CTRL_CLKFS_SDR50(n) ((n) << N32_SDMMC_PV2CTRL_CLKFS_SDR50_SHIFT) + +/* PV3CTRL: DDR50 and SDR104 */ +#define N32_SDMMC_PV3CTRL_CLKFS_DDR50_SHIFT (0) /* Bits 0-9: DDR50 clock */ +#define N32_SDMMC_PV3CTRL_CLKFS_DDR50_MASK (0x3FF << N32_SDMMC_PV3CTRL_CLKFS_DDR50_SHIFT) +#define N32_SDMMC_PV3CTRL_CLKFS_DDR50(n) ((n) << N32_SDMMC_PV3CTRL_CLKFS_DDR50_SHIFT) +#define N32_SDMMC_PV3CTRL_CLKFS_SDR104_SHIFT (13) /* Bits 13-22: SDR104 clock */ +#define N32_SDMMC_PV3CTRL_CLKFS_SDR104_MASK (0x3FF << N32_SDMMC_PV3CTRL_CLKFS_SDR104_SHIFT) +#define N32_SDMMC_PV3CTRL_CLKFS_SDR104(n) ((n) << N32_SDMMC_PV3CTRL_CLKFS_SDR104_SHIFT) + +/* SDMMC DLYCTRL Register Bit Definitions ***********************************/ + +#define N32_SDMMC_DLYCTRL_ITDS_SHIFT (0) /* Bits 0-4: Input Tap Delay Select */ +#define N32_SDMMC_DLYCTRL_ITDS_MASK (0x1F << N32_SDMMC_DLYCTRL_ITDS_SHIFT) +#define N32_SDMMC_DLYCTRL_ITDS(n) ((n) << N32_SDMMC_DLYCTRL_ITDS_SHIFT) +#define N32_SDMMC_DLYCTRL_ITDE (1 << 5) /* Bit 5: Input Tap Delay Enable */ +#define N32_SDMMC_DLYCTRL_ITCW (1 << 6) /* Bit 6: Input Tap Change Window */ +#define N32_SDMMC_DLYCTRL_OTDS_SHIFT (7) /* Bits 7-10: Output Tap Delay Select */ +#define N32_SDMMC_DLYCTRL_OTDS_MASK (0xF << N32_SDMMC_DLYCTRL_OTDS_SHIFT) +#define N32_SDMMC_DLYCTRL_OTDS(n) ((n) << N32_SDMMC_DLYCTRL_OTDS_SHIFT) +#define N32_SDMMC_DLYCTRL_OTDE (1 << 11) /* Bit 11: Output Tap Delay Enable */ + +/* SDHOST DSADD Register Bit Definitions ************************************/ + +#define N32_SDHOST_DSADD_ADD_SHIFT (0) /* Bits 0-31: Address or CMD23 parameter */ +#define N32_SDHOST_DSADD_ADD_MASK (0xFFFFFFFFUL << N32_SDHOST_DSADD_ADD_SHIFT) + +/* SDHOST BLKCFG Register Bit Definitions ***********************************/ + +#define N32_SDHOST_BLKCFG_SIZE_SHIFT (0) /* Bits 0-11: Block Size */ +#define N32_SDHOST_BLKCFG_SIZE_MASK (0xFFF << N32_SDHOST_BLKCFG_SIZE_SHIFT) +#define N32_SDHOST_BLKCFG_SIZE(n) ((n) << N32_SDHOST_BLKCFG_SIZE_SHIFT) +#define N32_SDHOST_BLKCFG_HDBS_SHIFT (12) /* Bits 12-14: SDMA Buffer Size */ +#define N32_SDHOST_BLKCFG_HDBS_MASK (7 << N32_SDHOST_BLKCFG_HDBS_SHIFT) +#define N32_SDHOST_BLKCFG_HDBS_4KB (0 << N32_SDHOST_BLKCFG_HDBS_SHIFT) +#define N32_SDHOST_BLKCFG_HDBS_8KB (1 << N32_SDHOST_BLKCFG_HDBS_SHIFT) +#define N32_SDHOST_BLKCFG_HDBS_16KB (2 << N32_SDHOST_BLKCFG_HDBS_SHIFT) +#define N32_SDHOST_BLKCFG_HDBS_32KB (3 << N32_SDHOST_BLKCFG_HDBS_SHIFT) +#define N32_SDHOST_BLKCFG_HDBS_64KB (4 << N32_SDHOST_BLKCFG_HDBS_SHIFT) +#define N32_SDHOST_BLKCFG_HDBS_128KB (5 << N32_SDHOST_BLKCFG_HDBS_SHIFT) +#define N32_SDHOST_BLKCFG_HDBS_256KB (6 << N32_SDHOST_BLKCFG_HDBS_SHIFT) +#define N32_SDHOST_BLKCFG_HDBS_512KB (7 << N32_SDHOST_BLKCFG_HDBS_SHIFT) +#define N32_SDHOST_BLKCFG_CNT_SHIFT (16) /* Bits 16-31: Block Count */ +#define N32_SDHOST_BLKCFG_CNT_MASK (0xFFFF << N32_SDHOST_BLKCFG_CNT_SHIFT) +#define N32_SDHOST_BLKCFG_CNT(n) ((n) << N32_SDHOST_BLKCFG_CNT_SHIFT) + +/* SDHOST CMDARG1 Register Bit Definitions **********************************/ + +#define N32_SDHOST_CMDARG1_ARG1_SHIFT (0) /* Bits 0-31: Command Argument */ +#define N32_SDHOST_CMDARG1_ARG1_MASK (0xFFFFFFFFUL << N32_SDHOST_CMDARG1_ARG1_SHIFT) + +/* SDHOST TMODE Register Bit Definitions ************************************/ + +#define N32_SDHOST_TMODE_DMAE (1 << 0) /* Bit 0: DMA Enable */ +#define N32_SDHOST_TMODE_BCNTE (1 << 1) /* Bit 1: Block Count Enable */ +#define N32_SDHOST_TMODE_ACMDE_SHIFT (2) /* Bits 2-3: Auto CMD Enable */ +#define N32_SDHOST_TMODE_ACMDE_MASK (3 << N32_SDHOST_TMODE_ACMDE_SHIFT) +#define N32_SDHOST_TMODE_ACMDE_DISABLE (0 << N32_SDHOST_TMODE_ACMDE_SHIFT) +#define N32_SDHOST_TMODE_ACMDE_CMD12 (1 << N32_SDHOST_TMODE_ACMDE_SHIFT) +#define N32_SDHOST_TMODE_ACMDE_CMD23 (2 << N32_SDHOST_TMODE_ACMDE_SHIFT) +#define N32_SDHOST_TMODE_DATDIR (1 << 4) /* Bit 4: Data Direction (0=Write, 1=Read) */ +#define N32_SDHOST_TMODE_BLKSEL (1 << 5) /* Bit 5: Multi/Single Block Select (1=Multi) */ +#define N32_SDHOST_TMODE_RTYPES_SHIFT (16) /* Bits 16-17: Response Type */ +#define N32_SDHOST_TMODE_RTYPES_MASK (3 << N32_SDHOST_TMODE_RTYPES_SHIFT) +#define N32_SDHOST_TMODE_RTYPES_NONE (0 << N32_SDHOST_TMODE_RTYPES_SHIFT) /* No response */ +#define N32_SDHOST_TMODE_RTYPES_136 (1 << N32_SDHOST_TMODE_RTYPES_SHIFT) /* Response length 136 bits */ +#define N32_SDHOST_TMODE_RTYPES_48 (2 << N32_SDHOST_TMODE_RTYPES_SHIFT) /* Response length 48 bits */ +#define N32_SDHOST_TMODE_RTYPES_48_BUSY (3 << N32_SDHOST_TMODE_RTYPES_SHIFT) /* 48 bits with busy */ +#define N32_SDHOST_TMODE_CRCCK (1 << 19) /* Bit 19: Command CRC Check Enable */ +#define N32_SDHOST_TMODE_CMDXCK (1 << 20) /* Bit 20: Command Index Check Enable */ +#define N32_SDHOST_TMODE_DPSEL (1 << 21) /* Bit 21: Data Present Select */ +#define N32_SDHOST_TMODE_TYPE_SHIFT (22) /* Bits 22-23: Command Type */ +#define N32_SDHOST_TMODE_TYPE_MASK (3 << N32_SDHOST_TMODE_TYPE_SHIFT) +#define N32_SDHOST_TMODE_TYPE_NORMAL (0 << N32_SDHOST_TMODE_TYPE_SHIFT) /* Normal */ +#define N32_SDHOST_TMODE_TYPE_SUSPEND (1 << N32_SDHOST_TMODE_TYPE_SHIFT) /* Suspend */ +#define N32_SDHOST_TMODE_TYPE_RESUME (2 << N32_SDHOST_TMODE_TYPE_SHIFT) /* Resume */ +#define N32_SDHOST_TMODE_TYPE_ABORT (3 << N32_SDHOST_TMODE_TYPE_SHIFT) /* Abort */ +#define N32_SDHOST_TMODE_CMDINDEX_SHIFT (24) /* Bits 24-29: Command Index */ +#define N32_SDHOST_TMODE_CMDINDEX_MASK (0x3F << N32_SDHOST_TMODE_CMDINDEX_SHIFT) +#define N32_SDHOST_TMODE_CMDINDEX(n) ((n) << N32_SDHOST_TMODE_CMDINDEX_SHIFT) + +/* SDHOST Response Registers ************************************************/ + +#define N32_SDHOST_CMDRSP0_RESP0_SHIFT (0) +#define N32_SDHOST_CMDRSP0_RESP0_MASK (0xFFFFFFFFUL << N32_SDHOST_CMDRSP0_RESP0_SHIFT) +#define N32_SDHOST_CMDRSP1_RESP1_SHIFT (0) +#define N32_SDHOST_CMDRSP1_RESP1_MASK (0xFFFFFFFFUL << N32_SDHOST_CMDRSP1_RESP1_SHIFT) +#define N32_SDHOST_CMDRSP2_RESP2_SHIFT (0) +#define N32_SDHOST_CMDRSP2_RESP2_MASK (0xFFFFFFFFUL << N32_SDHOST_CMDRSP2_RESP2_SHIFT) +#define N32_SDHOST_CMDRSP3_RESP3_SHIFT (0) +#define N32_SDHOST_CMDRSP3_RESP3_MASK (0xFFFFFFFFUL << N32_SDHOST_CMDRSP3_RESP3_SHIFT) + +/* SDHOST BUFDAT Register Bit Definitions ***********************************/ + +#define N32_SDHOST_BUFDAT_DAT_SHIFT (0) +#define N32_SDHOST_BUFDAT_DAT_MASK (0xFFFFFFFFUL << N32_SDHOST_BUFDAT_DAT_SHIFT) + +/* SDHOST PRESTS Register Bit Definitions ***********************************/ + +#define N32_SDHOST_PRESTS_CMDINHC (1 << 0) /* Bit 0: Command Inhibit (CMD) */ +#define N32_SDHOST_PRESTS_CMDINHD (1 << 1) /* Bit 1: Command Inhibit (DAT) */ +#define N32_SDHOST_PRESTS_DLACT (1 << 2) /* Bit 2: DAT Line Active */ +#define N32_SDHOST_PRESTS_RETUNREQ (1 << 3) /* Bit 3: Re-Tuning Request */ +#define N32_SDHOST_PRESTS_WTRANACT (1 << 8) /* Bit 8: Write Transfer Active */ +#define N32_SDHOST_PRESTS_RTRANACT (1 << 9) /* Bit 9: Read Transfer Active */ +#define N32_SDHOST_PRESTS_BUFW (1 << 10) /* Bit 10: Buffer Write Enable */ +#define N32_SDHOST_PRESTS_BUFR (1 << 11) /* Bit 11: Buffer Read Enable */ +#define N32_SDHOST_PRESTS_CINS (1 << 16) /* Bit 16: Card Inserted */ +#define N32_SDHOST_PRESTS_CSTSL (1 << 17) /* Bit 17: Card State Stable */ +#define N32_SDHOST_PRESTS_SDCDL (1 << 18) /* Bit 18: Card Detect Pin Level */ +#define N32_SDHOST_PRESTS_SDWPL (1 << 19) /* Bit 19: Write Protect Switch Pin Level */ +#define N32_SDHOST_PRESTS_DATLH0_SHIFT (20) /* Bits 20-23: DAT[3:0] Line Signal Level */ +#define N32_SDHOST_PRESTS_DATLH0_MASK (0xF << N32_SDHOST_PRESTS_DATLH0_SHIFT) +#define N32_SDHOST_PRESTS_CMDL (1 << 24) /* Bit 24: CMD Line Signal Level */ +#define N32_SDHOST_PRESTS_DATLH1_SHIFT (25) /* Bits 25-28: DAT[7:4] Line Signal Level */ +#define N32_SDHOST_PRESTS_DATLH1_MASK (0xF << N32_SDHOST_PRESTS_DATLH1_SHIFT) + +/* SDHOST CTRL1 Register Bit Definitions ************************************/ + +#define N32_SDHOST_CTRL1_LEDCTRL (1 << 0) /* Bit 0: LED Control */ +#define N32_SDHOST_CTRL1_DTWIDTH (1 << 1) /* Bit 1: Data Transfer Width (0=1-bit, 1=4-bit) */ +#define N32_SDHOST_CTRL1_HSEN (1 << 2) /* Bit 2: High Speed Enable */ +#define N32_SDHOST_CTRL1_DMASEL_SHIFT (3) /* Bits 3-4: DMA Select */ +#define N32_SDHOST_CTRL1_DMASEL_MASK (3 << N32_SDHOST_CTRL1_DMASEL_SHIFT) +#define N32_SDHOST_CTRL1_DMASEL_SDMA (0 << N32_SDHOST_CTRL1_DMASEL_SHIFT) +#define N32_SDHOST_CTRL1_DMASEL_ADMA2 (2 << N32_SDHOST_CTRL1_DMASEL_SHIFT) +#define N32_SDHOST_CTRL1_EDTWIDTH (1 << 5) /* Bit 5: Extended Data Transfer Width (8-bit) */ +#define N32_SDHOST_CTRL1_CDTL (1 << 6) /* Bit 6: Card Detect Test Level */ +#define N32_SDHOST_CTRL1_CDSD (1 << 7) /* Bit 7: Card Detect Signal Detection */ +#define N32_SDHOST_CTRL1_SDPWR (1 << 8) /* Bit 8: SD Bus Power */ +#define N32_SDHOST_CTRL1_SDBVSEL_SHIFT (9) /* Bits 9-11: SD Bus Voltage Select */ +#define N32_SDHOST_CTRL1_SDBVSEL_MASK (7 << N32_SDHOST_CTRL1_SDBVSEL_SHIFT) +#define N32_SDHOST_CTRL1_SDBVSEL_3V3 (7 << N32_SDHOST_CTRL1_SDBVSEL_SHIFT) +#define N32_SDHOST_CTRL1_HWRST (1 << 12) /* Bit 12: Hardware Reset (eMMC) */ +#define N32_SDHOST_CTRL1_SABGREQ (1 << 16) /* Bit 16: Stop At Block Gap Request */ +#define N32_SDHOST_CTRL1_CONTREQ (1 << 17) /* Bit 17: Continue Request */ +#define N32_SDHOST_CTRL1_RWAITCTRL (1 << 18) /* Bit 18: Read Wait Control */ +#define N32_SDHOST_CTRL1_INTATBG (1 << 19) /* Bit 19: Interrupt At Block Gap */ +#define N32_SDHOST_CTRL1_SPIMODE (1 << 20) /* Bit 20: SPI Mode Enable */ +#define N32_SDHOST_CTRL1_BOOTEN (1 << 21) /* Bit 21: Boot Enable */ +#define N32_SDHOST_CTRL1_BOOTINALT (1 << 22) /* Bit 22: Boot in Alternative Mode */ +#define N32_SDHOST_CTRL1_BOOTACKC (1 << 23) /* Bit 23: Boot Ack Check */ +#define N32_SDHOST_CTRL1_INTWKU (1 << 24) /* Bit 24: Card Interrupt Wakeup Enable */ +#define N32_SDHOST_CTRL1_INSTWKU (1 << 25) /* Bit 25: Insertion Wakeup Enable */ +#define N32_SDHOST_CTRL1_RMVWKU (1 << 26) /* Bit 26: Removal Wakeup Enable */ + +/* SDHOST CTRL2 Register Bit Definitions ************************************/ + +#define N32_SDHOST_CTRL2_INCLKE (1 << 0) /* Bit 0: Internal Clock Enable */ +#define N32_SDHOST_CTRL2_INCLKSTS (1 << 1) /* Bit 1: Internal Clock Stable */ +#define N32_SDHOST_CTRL2_SDCLKE (1 << 2) /* Bit 2: SD Clock Enable */ +#define N32_SDHOST_CTRL2_SDCLKSEL70_SHIFT (8) /* Bits 8-15: SDCLK Frequency Select [7:0] */ +#define N32_SDHOST_CTRL2_SDCLKSEL70_MASK (0xFF << N32_SDHOST_CTRL2_SDCLKSEL70_SHIFT) +#define N32_SDHOST_CTRL2_SDCLKSEL98_SHIFT (6) /* Bits 6-7: SDCLK Frequency Select [9:8] */ +#define N32_SDHOST_CTRL2_SDCLKSEL98_MASK (0x3 << N32_SDHOST_CTRL2_SDCLKSEL98_SHIFT) +#define N32_SDHOST_CTRL2_SDCLKSEL(n) (((n & 0xFF) << N32_SDHOST_CTRL2_SDCLKSEL70_SHIFT) | (((n >> 8) & 0x3) << N32_SDHOST_CTRL2_SDCLKSEL98_SHIFT)) +#define N32_SDHOST_CTRL2_DTCNT_SHIFT (16) /* Bits 16-19: Data Timeout Counter Value */ +#define N32_SDHOST_CTRL2_DTCNT_MASK (0xF << N32_SDHOST_CTRL2_DTCNT_SHIFT) +#define N32_SDHOST_CTRL2_DTCNT(n) ((n) << N32_SDHOST_CTRL2_DTCNT_SHIFT) +#define N32_SDHOST_CTRL2_SWRSTALL (1 << 24) /* Bit 24: Software Reset All */ +#define N32_SDHOST_CTRL2_SWRSTCMD (1 << 25) /* Bit 25: Software Reset CMD Line */ +#define N32_SDHOST_CTRL2_SWRSTDAT (1 << 26) /* Bit 26: Software Reset DAT Line */ + +/* SDHOST INTSTS Register Bit Definitions (Interrupt Status) ****************/ + +#define N32_SDHOST_INTSTS_CMDC (1 << 0) /* Bit 0: Command Complete */ +#define N32_SDHOST_INTSTS_TC (1 << 1) /* Bit 1: Transfer Complete */ +#define N32_SDHOST_INTSTS_BLKGAPE (1 << 2) /* Bit 2: Block Gap Event */ +#define N32_SDHOST_INTSTS_DMAINT (1 << 3) /* Bit 3: DMA Interrupt (SDMA) */ +#define N32_SDHOST_INTSTS_BUFWRDY (1 << 4) /* Bit 4: Buffer Write Ready */ +#define N32_SDHOST_INTSTS_BUFRRDY (1 << 5) /* Bit 5: Buffer Read Ready */ +#define N32_SDHOST_INTSTS_CINS (1 << 6) /* Bit 6: Card Insertion */ +#define N32_SDHOST_INTSTS_CRMV (1 << 7) /* Bit 7: Card Removal */ +#define N32_SDHOST_INTSTS_CINT (1 << 8) /* Bit 8: Card Interrupt */ +#define N32_SDHOST_INTSTS_RETUNE (1 << 12) /* Bit 12: Re-Tuning Event */ +#define N32_SDHOST_INTSTS_BOOTACKR (1 << 13) /* Bit 13: Boot Ack Received */ +#define N32_SDHOST_INTSTS_BOOTTER (1 << 14) /* Bit 14: Boot Terminate Interrupt */ +#define N32_SDHOST_INTSTS_ALLERR (1 << 15) /* Bit 15: Error Interrupt (OR of all errors) */ +#define N32_SDHOST_INTSTS_CTERR (1 << 16) /* Bit 16: Command Timeout Error */ +#define N32_SDHOST_INTSTS_CCRCERR (1 << 17) /* Bit 17: Command CRC Error */ +#define N32_SDHOST_INTSTS_CENDBERR (1 << 18) /* Bit 18: Command End Bit Error */ +#define N32_SDHOST_INTSTS_CINXERR (1 << 19) /* Bit 19: Command Index Error */ +#define N32_SDHOST_INTSTS_DTERR (1 << 20) /* Bit 20: Data Timeout Error */ +#define N32_SDHOST_INTSTS_DCRERR (1 << 21) /* Bit 21: Data CRC Error */ +#define N32_SDHOST_INTSTS_DENDERR (1 << 22) /* Bit 22: Data End Bit Error */ +#define N32_SDHOST_INTSTS_ACMDERR (1 << 24) /* Bit 24: Auto CMD Error */ +#define N32_SDHOST_INTSTS_ADMAERR (1 << 25) /* Bit 25: ADMA Error */ +#define N32_SDHOST_INTSTS_TRGRERR (1 << 28) /* Bit 28: Target Response Error (DMA) */ + +/* SDHOST IE Register Bit Definitions (Interrupt Enable) ********************/ + +#define N32_SDHOST_IE_CMDCE (1 << 0) /* Bit 0: Command Complete Enable */ +#define N32_SDHOST_IE_TCE (1 << 1) /* Bit 1: Transfer Complete Enable */ +#define N32_SDHOST_IE_BLKGAPEE (1 << 2) /* Bit 2: Block Gap Event Enable */ +#define N32_SDHOST_IE_DMAINTE (1 << 3) /* Bit 3: DMA Interrupt Enable */ +#define N32_SDHOST_IE_BUFWRDYE (1 << 4) /* Bit 4: Buffer Write Ready Enable */ +#define N32_SDHOST_IE_BUFRRDYE (1 << 5) /* Bit 5: Buffer Read Ready Enable */ +#define N32_SDHOST_IE_CINSE (1 << 6) /* Bit 6: Card Insertion Enable */ +#define N32_SDHOST_IE_CRMVE (1 << 7) /* Bit 7: Card Removal Enable */ +#define N32_SDHOST_IE_CINTE (1 << 8) /* Bit 8: Card Interrupt Enable */ +#define N32_SDHOST_IE_RTUNSE (1 << 12) /* Bit 12: Re-Tuning Event Enable */ +#define N32_SDHOST_IE_BOOTACKRE (1 << 13) /* Bit 13: Boot Ack Received Enable */ +#define N32_SDHOST_IE_BOOTTIE (1 << 14) /* Bit 14: Boot Terminate Enable */ +#define N32_SDHOST_IE_CTEE (1 << 16) /* Bit 16: Command Timeout Error Enable */ +#define N32_SDHOST_IE_CCRCEE (1 << 17) /* Bit 17: Command CRC Error Enable */ +#define N32_SDHOST_IE_CENDBEE (1 << 18) /* Bit 18: Command End Bit Error Enable */ +#define N32_SDHOST_IE_CINXEE (1 << 19) /* Bit 19: Command Index Error Enable */ +#define N32_SDHOST_IE_DTEE (1 << 20) /* Bit 20: Data Timeout Error Enable */ +#define N32_SDHOST_IE_DCRCEE (1 << 21) /* Bit 21: Data CRC Error Enable */ +#define N32_SDHOST_IE_DENDEE (1 << 22) /* Bit 22: Data End Bit Error Enable */ +#define N32_SDHOST_IE_ACMDE (1 << 24) /* Bit 24: Auto CMD Error Enable */ +#define N32_SDHOST_IE_ADMAEE (1 << 25) /* Bit 25: ADMA Error Enable */ +#define N32_SDHOST_IE_TRGREE (1 << 28) /* Bit 28: Target Response Error Enable */ + +/* SDHOST ISE Register Bit Definitions (Interrupt Signal Enable) ************/ + +#define N32_SDHOST_ISE_CMDCS (1 << 0) /* Bit 0: Command Complete Signal Enable */ +#define N32_SDHOST_ISE_TCSE (1 << 1) /* Bit 1: Transfer Complete Signal Enable */ +#define N32_SDHOST_ISE_BLKGAPESE (1 << 2) /* Bit 2: Block Gap Event Signal Enable */ +#define N32_SDHOST_ISE_DMAINTSE (1 << 3) /* Bit 3: DMA Interrupt Signal Enable */ +#define N32_SDHOST_ISE_BUFWRDYSE (1 << 4) /* Bit 4: Buffer Write Ready Signal Enable */ +#define N32_SDHOST_ISE_BUFRRDYSE (1 << 5) /* Bit 5: Buffer Read Ready Signal Enable */ +#define N32_SDHOST_ISE_CINSSE (1 << 6) /* Bit 6: Card Insertion Signal Enable */ +#define N32_SDHOST_ISE_CRMVSE (1 << 7) /* Bit 7: Card Removal Signal Enable */ +#define N32_SDHOST_ISE_CINTSE (1 << 8) /* Bit 8: Card Interrupt Signal Enable */ +#define N32_SDHOST_ISE_RTUNSE (1 << 12) /* Bit 12: Re-Tuning Event Signal Enable */ +#define N32_SDHOST_ISE_BOOTACKRSE (1 << 13) /* Bit 13: Boot Ack Received Signal Enable */ +#define N32_SDHOST_ISE_BOOTTISE (1 << 14) /* Bit 14: Boot Terminate Signal Enable */ +#define N32_SDHOST_ISE_CTESE (1 << 16) /* Bit 16: Command Timeout Error Signal Enable */ +#define N32_SDHOST_ISE_CCRCESE (1 << 17) /* Bit 17: Command CRC Error Signal Enable */ +#define N32_SDHOST_ISE_CENDBESE (1 << 18) /* Bit 18: Command End Bit Error Signal Enable */ +#define N32_SDHOST_ISE_CINXESE (1 << 19) /* Bit 19: Command Index Error Signal Enable */ +#define N32_SDHOST_ISE_DTESE (1 << 20) /* Bit 20: Data Timeout Error Signal Enable */ +#define N32_SDHOST_ISE_DCRCESE (1 << 21) /* Bit 21: Data CRC Error Signal Enable */ +#define N32_SDHOST_ISE_DENDESE (1 << 22) /* Bit 22: Data End Bit Error Signal Enable */ +#define N32_SDHOST_ISE_ACMDESE (1 << 24) /* Bit 24: Auto CMD Error Signal Enable */ +#define N32_SDHOST_ISE_ADMAESE (1 << 25) /* Bit 25: ADMA Error Signal Enable */ +#define N32_SDHOST_ISE_TRGRESE (1 << 28) /* Bit 28: Target Response Error Signal Enable */ + +/* SDHOST CTRLSTS Register Bit Definitions **********************************/ + +#define N32_SDHOST_CTRLSTS_ACMD12NE (1 << 0) /* Bit 0: Auto CMD12 Not Executed */ +#define N32_SDHOST_CTRLSTS_ACMDTE (1 << 1) /* Bit 1: Auto CMD Timeout Error */ +#define N32_SDHOST_CTRLSTS_ACMDCRCE (1 << 2) /* Bit 2: Auto CMD CRC Error */ +#define N32_SDHOST_CTRLSTS_ACMDEBE (1 << 3) /* Bit 3: Auto CMD End Bit Error */ +#define N32_SDHOST_CTRLSTS_ACMDINXE (1 << 4) /* Bit 4: Auto CMD Index Error */ +#define N32_SDHOST_CTRLSTS_ACMD12E (1 << 7) /* Bit 7: Auto CMD12 Not Issued */ +#define N32_SDHOST_CTRLSTS_UHSMOD_SHIFT (16) /* Bits 16-18: UHS Mode Select */ +#define N32_SDHOST_CTRLSTS_UHSMOD_MASK (7 << N32_SDHOST_CTRLSTS_UHSMOD_SHIFT) +#define N32_SDHOST_CTRLSTS_UHSMOD_SDR12 (0 << N32_SDHOST_CTRLSTS_UHSMOD_SHIFT) +#define N32_SDHOST_CTRLSTS_UHSMOD_SDR25 (1 << N32_SDHOST_CTRLSTS_UHSMOD_SHIFT) +#define N32_SDHOST_CTRLSTS_UHSMOD_SDR50 (2 << N32_SDHOST_CTRLSTS_UHSMOD_SHIFT) +#define N32_SDHOST_CTRLSTS_UHSMOD_SDR104 (3 << N32_SDHOST_CTRLSTS_UHSMOD_SHIFT) +#define N32_SDHOST_CTRLSTS_UHSMOD_DDR50 (4 << N32_SDHOST_CTRLSTS_UHSMOD_SHIFT) +#define N32_SDHOST_CTRLSTS_V18SE (1 << 19) /* Bit 19: 1.8V Signaling Enable */ +#define N32_SDHOST_CTRLSTS_ETUN (1 << 22) /* Bit 22: Execute Tuning */ +#define N32_SDHOST_CTRLSTS_SCS (1 << 23) /* Bit 23: Sampling Clock Select */ +#define N32_SDHOST_CTRLSTS_ASYNCIE (1 << 30) /* Bit 30: Asynchronous Interrupt Enable */ +#define N32_SDHOST_CTRLSTS_PREVE (1 << 31) /* Bit 31: Preset Value Enable */ + +/* SDHOST CAP0STS Register Bit Definitions (Capabilities 0) *****************/ + +#define N32_SDHOST_CAP0STS_TCLKU (1 << 7) /* Bit 7: Timeout Clock Unit (0=KHz, 1=MHz) */ +#define N32_SDHOST_CAP0STS_BCLKF_SHIFT (8) /* Bits 8-15: Base Clock Frequency (MHz) */ +#define N32_SDHOST_CAP0STS_BCLKF_MASK (0xFF << N32_SDHOST_CAP0STS_BCLKF_SHIFT) +#define N32_SDHOST_CAP0STS_MBL_SHIFT (16) /* Bits 16-17: Max Block Length */ +#define N32_SDHOST_CAP0STS_MBL_MASK (3 << N32_SDHOST_CAP0STS_MBL_SHIFT) +#define N32_SDHOST_CAP0STS_MBL_512 (0 << N32_SDHOST_CAP0STS_MBL_SHIFT) +#define N32_SDHOST_CAP0STS_MBL_1024 (1 << N32_SDHOST_CAP0STS_MBL_SHIFT) +#define N32_SDHOST_CAP0STS_MBL_2048 (2 << N32_SDHOST_CAP0STS_MBL_SHIFT) +#define N32_SDHOST_CAP0STS_EMBUS (1 << 18) /* Bit 18: 8-bit Support for Embedded Device */ +#define N32_SDHOST_CAP0STS_ADMA2 (1 << 19) /* Bit 19: ADMA2 Support */ +#define N32_SDHOST_CAP0STS_HS (1 << 21) /* Bit 21: High Speed Support */ +#define N32_SDHOST_CAP0STS_SDMA (1 << 22) /* Bit 22: SDMA Support */ +#define N32_SDHOST_CAP0STS_SRS (1 << 23) /* Bit 23: Suspend/Resume Support */ +#define N32_SDHOST_CAP0STS_VS33 (1 << 24) /* Bit 24: 3.3V Support */ +#define N32_SDHOST_CAP0STS_ASYNCIINT (1 << 29) /* Bit 29: Asynchronous Interrupt Support */ +#define N32_SDHOST_CAP0STS_STYP_SHIFT (30) /* Bits 30-31: Slot Type */ +#define N32_SDHOST_CAP0STS_STYP_MASK (3 << N32_SDHOST_CAP0STS_STYP_SHIFT) +#define N32_SDHOST_CAP0STS_STYP_REMOVABLE (0 << N32_SDHOST_CAP0STS_STYP_SHIFT) +#define N32_SDHOST_CAP0STS_STYP_EMBEDDED (1 << N32_SDHOST_CAP0STS_STYP_SHIFT) + +/* SDHOST CAP1STS Register Bit Definitions (Capabilities 1) *****************/ + +#define N32_SDHOST_CAP1STS_SDR50 (1 << 0) /* Bit 0: SDR50 Support */ +#define N32_SDHOST_CAP1STS_SDR104 (1 << 1) /* Bit 1: SDR104 Support */ +#define N32_SDHOST_CAP1STS_DDR50 (1 << 2) /* Bit 2: DDR50 Support */ +#define N32_SDHOST_CAP1STS_UTFSDR50 (1 << 13) /* Bit 13: Use Tuning for SDR50 */ +#define N32_SDHOST_CAP1STS_SPIMOD (1 << 24) /* Bit 24: SPI Mode Support */ +#define N32_SDHOST_CAP1STS_SPIBMOD (1 << 25) /* Bit 25: SPI Block Mode Support */ + +/* SDHOST STSFE Register Bit Definitions (Force Event) **********************/ + +#define N32_SDHOST_STSFE_ACMD12NE (1 << 0) /* Bit 0: Force Auto CMD12 Not Executed */ +#define N32_SDHOST_STSFE_ACMDTE (1 << 1) /* Bit 1: Force Auto CMD Timeout Error */ +#define N32_SDHOST_STSFE_ACMDCRCE (1 << 2) /* Bit 2: Force Auto CMD CRC Error */ +#define N32_SDHOST_STSFE_ACMDEBE (1 << 3) /* Bit 3: Force Auto CMD End Bit Error */ +#define N32_SDHOST_STSFE_ACMDINXE (1 << 4) /* Bit 4: Force Auto CMD Index Error */ +#define N32_SDHOST_STSFE_ACMD12E (1 << 7) /* Bit 7: Force Auto CMD12 Not Issued */ +#define N32_SDHOST_STSFE_CTE (1 << 16) /* Bit 16: Force Command Timeout Error */ +#define N32_SDHOST_STSFE_CCRCE (1 << 17) /* Bit 17: Force Command CRC Error */ +#define N32_SDHOST_STSFE_CEBE (1 << 18) /* Bit 18: Force Command End Bit Error */ +#define N32_SDHOST_STSFE_CINXE (1 << 19) /* Bit 19: Force Command Index Error */ +#define N32_SDHOST_STSFE_DTE (1 << 20) /* Bit 20: Force Data Timeout Error */ +#define N32_SDHOST_STSFE_DCRCE (1 << 21) /* Bit 21: Force Data CRC Error */ +#define N32_SDHOST_STSFE_DEBE (1 << 22) /* Bit 22: Force Data End Bit Error */ +#define N32_SDHOST_STSFE_ACMDE (1 << 24) /* Bit 24: Force Auto CMD Error */ +#define N32_SDHOST_STSFE_ADMAE (1 << 25) /* Bit 25: Force ADMA Error */ +#define N32_SDHOST_STSFE_TRGRE (1 << 28) /* Bit 28: Force Target Response Error */ + +/* SDHOST ADMAESTS Register Bit Definitions *********************************/ + +#define N32_SDHOST_ADMAESTS_ADMAE_SHIFT (0) /* Bits 0-1: ADMA Error State */ +#define N32_SDHOST_ADMAESTS_ADMAE_MASK (3 << N32_SDHOST_ADMAESTS_ADMAE_SHIFT) +#define N32_SDHOST_ADMAESTS_ST_STOP (0 << N32_SDHOST_ADMAESTS_ADMAE_SHIFT) /* Stop DMA */ +#define N32_SDHOST_ADMAESTS_ST_FDS (1 << N32_SDHOST_ADMAESTS_ADMAE_SHIFT) /* Fetch Descriptor */ +#define N32_SDHOST_ADMAESTS_ST_TFR (3 << N32_SDHOST_ADMAESTS_ADMAE_SHIFT) /* Transfer Data */ +#define N32_SDHOST_ADMAESTS_ADMALME (1 << 2) /* Bit 2: ADMA Length Mismatch Error */ + +/* SDHOST ASADD0/1 Register Bit Definitions *********************************/ + +#define N32_SDHOST_ASADD0_ADD_SHIFT (0) /* Bits 0-31: Low 32-bit address */ +#define N32_SDHOST_ASADD0_ADD_MASK (0xFFFFFFFFUL << N32_SDHOST_ASADD0_ADD_SHIFT) +#define N32_SDHOST_ASADD1_ADD_SHIFT (0) /* Bits 0-31: High 32-bit address */ +#define N32_SDHOST_ASADD1_ADD_MASK (0xFFFFFFFFUL << N32_SDHOST_ASADD1_ADD_SHIFT) + +/* SDHOST Preset Value Status Registers (same format as control) ************/ + +#define N32_SDHOST_PV0STS_CLKFS_INIT_SHIFT (0) +#define N32_SDHOST_PV0STS_CLKFS_INIT_MASK (0x3FF << N32_SDHOST_PV0STS_CLKFS_INIT_SHIFT) +#define N32_SDHOST_PV0STS_CLKFS_DS_SHIFT (16) +#define N32_SDHOST_PV0STS_CLKFS_DS_MASK (0x3FF << N32_SDHOST_PV0STS_CLKFS_DS_SHIFT) + +#define N32_SDHOST_PV1STS_CLKFS_HS_SHIFT (0) +#define N32_SDHOST_PV1STS_CLKFS_HS_MASK (0x3FF << N32_SDHOST_PV1STS_CLKFS_HS_SHIFT) +#define N32_SDHOST_PV1STS_CLKFS_SDR12_SHIFT (16) +#define N32_SDHOST_PV1STS_CLKFS_SDR12_MASK (0x3FF << N32_SDHOST_PV1STS_CLKFS_SDR12_SHIFT) + +#define N32_SDHOST_PV2STS_CLKFS_SDR25_SHIFT (0) +#define N32_SDHOST_PV2STS_CLKFS_SDR25_MASK (0x3FF << N32_SDHOST_PV2STS_CLKFS_SDR25_SHIFT) +#define N32_SDHOST_PV2STS_CLKFS_SDR50_SHIFT (16) +#define N32_SDHOST_PV2STS_CLKFS_SDR50_MASK (0x3FF << N32_SDHOST_PV2STS_CLKFS_SDR50_SHIFT) + +#define N32_SDHOST_PV3STS_CLKFS_DDR50_SHIFT (0) +#define N32_SDHOST_PV3STS_CLKFS_DDR50_MASK (0x3FF << N32_SDHOST_PV3STS_CLKFS_DDR50_SHIFT) +#define N32_SDHOST_PV3STS_CLKFS_SDR104_SHIFT (16) +#define N32_SDHOST_PV3STS_CLKFS_SDR104_MASK (0x3FF << N32_SDHOST_PV3STS_CLKFS_SDR104_SHIFT) + +/* SDHOST BOOTCTRL Register Bit Definitions *********************************/ + +#define N32_SDHOST_BOOTCTRL_CNT_SHIFT (0) /* Bits 0-31: Boot Data Timeout Counter Value */ +#define N32_SDHOST_BOOTCTRL_CNT_MASK (0xFFFFFFFFUL << N32_SDHOST_BOOTCTRL_CNT_SHIFT) +#define N32_SDHOST_BOOTCTRL_CNT(n) ((n) << N32_SDHOST_BOOTCTRL_CNT_SHIFT) + +/* ADMA2 Descriptor Structure (32-bit addressing) ***************************/ + +#define N32_ADMA_ACT_SHIFT (4) /* Bits 4-5: Action */ +#define N32_ADMA_ACT_MASK (3 << N32_ADMA_ACT_SHIFT) +#define N32_ADMA_ACT_NOP (0 << N32_ADMA_ACT_SHIFT) /* No operation */ +#define N32_ADMA_ACT_RSV (1 << N32_ADMA_ACT_SHIFT) /* Reserved */ +#define N32_ADMA_ACT_TRAN (2 << N32_ADMA_ACT_SHIFT) /* Transfer data */ +#define N32_ADMA_ACT_LINK (3 << N32_ADMA_ACT_SHIFT) /* Link to another table */ +#define N32_ADMA_ENTRY_INT (1 << 2) /* Bit 2: Generate DMA Interrupt */ +#define N32_ADMA_ENTRY_END (1 << 1) /* Bit 1: End of descriptor list */ +#define N32_ADMA_ENTRY_VALID (1 << 0) /* Bit 0: Descriptor valid */ + +struct n32_sdmmc_adma_desc_s +{ + uint16_t attr; /* Attributes (ACT, INT, END, VALID) */ + uint16_t len; /* Transfer length */ + uint32_t *addr; /* 32-bit system address */ +}; + +#endif /* __ARCH_ARM_SRC_N32H7_HARDWARE_N32H7_SDMMC_H */ diff --git a/arch/arm/src/n32h7/hardware/n32h7_tim.h b/arch/arm/src/n32h7/hardware/n32h7_tim.h new file mode 100644 index 0000000000000..2de09b91b19b6 --- /dev/null +++ b/arch/arm/src/n32h7/hardware/n32h7_tim.h @@ -0,0 +1,1697 @@ +/**************************************************************************** + * arch/arm/src/n32h7/hardware/n32h7_tim.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __ARCH_ARM_SRC_N32H7_HARDWARE_N32_TIM_H +#define __ARCH_ARM_SRC_N32H7_HARDWARE_N32_TIM_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include "chip.h" + +/* The N32H7 timer family includes: + * - 4x Advanced Timers (ATIM1-4) + * - 7x General-purpose Timers A (GTIMA1-7) + * - 3x General-purpose Timers B (GTIMB1-3) + * - 4x Basic Timers (BTIM1-4) + */ + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* ========================================================================== + * ADVANCED TIMERS (ATIM1-4) + * ========================================================================== + */ + +/* Register Offsets - ATIM (common for all ATIM1-4) *************************/ + +#define N32_ATIM_CTRL1_OFFSET 0x0000 /* Control register 1 */ +#define N32_ATIM_CTRL2_OFFSET 0x0004 /* Control register 2 */ +#define N32_ATIM_STS_OFFSET 0x0008 /* Status register */ +#define N32_ATIM_ETGEN_OFFSET 0x000c /* Event generation register */ +#define N32_ATIM_SMCTRL_OFFSET 0x0010 /* Slave mode control register */ +#define N32_ATIM_DINTEN_OFFSET 0x0014 /* DMA/Interrupt enable register */ +#define N32_ATIM_CCMOD1_OFFSET 0x0018 /* Capture/compare mode register 1 */ +#define N32_ATIM_CCMOD2_OFFSET 0x001c /* Capture/compare mode register 2 */ +#define N32_ATIM_CCMOD3_OFFSET 0x0020 /* Capture/compare mode register 3 */ +#define N32_ATIM_CCEN_OFFSET 0x0024 /* Capture/compare enable register */ +#define N32_ATIM_CCDAT1_OFFSET 0x0028 /* Capture/compare register 1 */ +#define N32_ATIM_CCDAT2_OFFSET 0x002c /* Capture/compare register 2 */ +#define N32_ATIM_CCDAT3_OFFSET 0x0030 /* Capture/compare register 3 */ +#define N32_ATIM_CCDAT4_OFFSET 0x0034 /* Capture/compare register 4 */ +#define N32_ATIM_CCDAT5_OFFSET 0x0038 /* Capture/compare register 5 */ +#define N32_ATIM_CCDAT6_OFFSET 0x003c /* Capture/compare register 6 */ +#define N32_ATIM_PSC_OFFSET 0x0040 /* Prescaler */ +#define N32_ATIM_AR_OFFSET 0x0044 /* Auto-reload register */ +#define N32_ATIM_CNT_OFFSET 0x0048 /* Counter */ +#define N32_ATIM_REPCNT_OFFSET 0x004c /* Repetition counter register */ +#define N32_ATIM_BKDT_OFFSET 0x0050 /* Break and dead-time register */ +#define N32_ATIM_CCDAT7_OFFSET 0x0054 /* Capture/compare register 7 */ +#define N32_ATIM_CCDAT8_OFFSET 0x0058 /* Capture/compare register 8 */ +#define N32_ATIM_CCDAT9_OFFSET 0x005c /* Capture/compare register 9 */ +#define N32_ATIM_BKFR_OFFSET 0x0060 /* Break 1 filter register */ +#define N32_ATIM_INSEL_OFFSET 0x0078 /* Input selection register */ +#define N32_ATIM_AF1_OFFSET 0x007c /* Alternate function register 1 */ +#define N32_ATIM_AF2_OFFSET 0x0080 /* Alternate function register 2 */ +#define N32_ATIM_BKFR2_OFFSET 0x0084 /* Break 2 filter register */ +#define N32_ATIM_DCTRL_OFFSET 0x0094 /* DMA control register */ +#define N32_ATIM_DADDR_OFFSET 0x0098 /* DMA address for burst mode */ + +/* Register Addresses - ATIM1 ***********************************************/ + +#define N32_ATIM1_CTRL1 (N32_ATIMER1_BASE + N32_ATIM_CTRL1_OFFSET) +#define N32_ATIM1_CTRL2 (N32_ATIMER1_BASE + N32_ATIM_CTRL2_OFFSET) +#define N32_ATIM1_STS (N32_ATIMER1_BASE + N32_ATIM_STS_OFFSET) +#define N32_ATIM1_ETGEN (N32_ATIMER1_BASE + N32_ATIM_ETGEN_OFFSET) +#define N32_ATIM1_SMCTRL (N32_ATIMER1_BASE + N32_ATIM_SMCTRL_OFFSET) +#define N32_ATIM1_DINTEN (N32_ATIMER1_BASE + N32_ATIM_DINTEN_OFFSET) +#define N32_ATIM1_CCMOD1 (N32_ATIMER1_BASE + N32_ATIM_CCMOD1_OFFSET) +#define N32_ATIM1_CCMOD2 (N32_ATIMER1_BASE + N32_ATIM_CCMOD2_OFFSET) +#define N32_ATIM1_CCMOD3 (N32_ATIMER1_BASE + N32_ATIM_CCMOD3_OFFSET) +#define N32_ATIM1_CCEN (N32_ATIMER1_BASE + N32_ATIM_CCEN_OFFSET) +#define N32_ATIM1_CCDAT1 (N32_ATIMER1_BASE + N32_ATIM_CCDAT1_OFFSET) +#define N32_ATIM1_CCDAT2 (N32_ATIMER1_BASE + N32_ATIM_CCDAT2_OFFSET) +#define N32_ATIM1_CCDAT3 (N32_ATIMER1_BASE + N32_ATIM_CCDAT3_OFFSET) +#define N32_ATIM1_CCDAT4 (N32_ATIMER1_BASE + N32_ATIM_CCDAT4_OFFSET) +#define N32_ATIM1_CCDAT5 (N32_ATIMER1_BASE + N32_ATIM_CCDAT5_OFFSET) +#define N32_ATIM1_CCDAT6 (N32_ATIMER1_BASE + N32_ATIM_CCDAT6_OFFSET) +#define N32_ATIM1_PSC (N32_ATIMER1_BASE + N32_ATIM_PSC_OFFSET) +#define N32_ATIM1_AR (N32_ATIMER1_BASE + N32_ATIM_AR_OFFSET) +#define N32_ATIM1_CNT (N32_ATIMER1_BASE + N32_ATIM_CNT_OFFSET) +#define N32_ATIM1_REPCNT (N32_ATIMER1_BASE + N32_ATIM_REPCNT_OFFSET) +#define N32_ATIM1_BKDT (N32_ATIMER1_BASE + N32_ATIM_BKDT_OFFSET) +#define N32_ATIM1_CCDAT7 (N32_ATIMER1_BASE + N32_ATIM_CCDAT7_OFFSET) +#define N32_ATIM1_CCDAT8 (N32_ATIMER1_BASE + N32_ATIM_CCDAT8_OFFSET) +#define N32_ATIM1_CCDAT9 (N32_ATIMER1_BASE + N32_ATIM_CCDAT9_OFFSET) +#define N32_ATIM1_BKFR (N32_ATIMER1_BASE + N32_ATIM_BKFR_OFFSET) +#define N32_ATIM1_INSEL (N32_ATIMER1_BASE + N32_ATIM_INSEL_OFFSET) +#define N32_ATIM1_AF1 (N32_ATIMER1_BASE + N32_ATIM_AF1_OFFSET) +#define N32_ATIM1_AF2 (N32_ATIMER1_BASE + N32_ATIM_AF2_OFFSET) +#define N32_ATIM1_BKFR2 (N32_ATIMER1_BASE + N32_ATIM_BKFR2_OFFSET) +#define N32_ATIM1_DCTRL (N32_ATIMER1_BASE + N32_ATIM_DCTRL_OFFSET) +#define N32_ATIM1_DADDR (N32_ATIMER1_BASE + N32_ATIM_DADDR_OFFSET) + +/* Register Addresses - ATIM2 ***********************************************/ + +#define N32_ATIM2_CTRL1 (N32_ATIMER2_BASE + N32_ATIM_CTRL1_OFFSET) +#define N32_ATIM2_CTRL2 (N32_ATIMER2_BASE + N32_ATIM_CTRL2_OFFSET) +#define N32_ATIM2_STS (N32_ATIMER2_BASE + N32_ATIM_STS_OFFSET) +#define N32_ATIM2_ETGEN (N32_ATIMER2_BASE + N32_ATIM_ETGEN_OFFSET) +#define N32_ATIM2_SMCTRL (N32_ATIMER2_BASE + N32_ATIM_SMCTRL_OFFSET) +#define N32_ATIM2_DINTEN (N32_ATIMER2_BASE + N32_ATIM_DINTEN_OFFSET) +#define N32_ATIM2_CCMOD1 (N32_ATIMER2_BASE + N32_ATIM_CCMOD1_OFFSET) +#define N32_ATIM2_CCMOD2 (N32_ATIMER2_BASE + N32_ATIM_CCMOD2_OFFSET) +#define N32_ATIM2_CCMOD3 (N32_ATIMER2_BASE + N32_ATIM_CCMOD3_OFFSET) +#define N32_ATIM2_CCEN (N32_ATIMER2_BASE + N32_ATIM_CCEN_OFFSET) +#define N32_ATIM2_CCDAT1 (N32_ATIMER2_BASE + N32_ATIM_CCDAT1_OFFSET) +#define N32_ATIM2_CCDAT2 (N32_ATIMER2_BASE + N32_ATIM_CCDAT2_OFFSET) +#define N32_ATIM2_CCDAT3 (N32_ATIMER2_BASE + N32_ATIM_CCDAT3_OFFSET) +#define N32_ATIM2_CCDAT4 (N32_ATIMER2_BASE + N32_ATIM_CCDAT4_OFFSET) +#define N32_ATIM2_CCDAT5 (N32_ATIMER2_BASE + N32_ATIM_CCDAT5_OFFSET) +#define N32_ATIM2_CCDAT6 (N32_ATIMER2_BASE + N32_ATIM_CCDAT6_OFFSET) +#define N32_ATIM2_PSC (N32_ATIMER2_BASE + N32_ATIM_PSC_OFFSET) +#define N32_ATIM2_AR (N32_ATIMER2_BASE + N32_ATIM_AR_OFFSET) +#define N32_ATIM2_CNT (N32_ATIMER2_BASE + N32_ATIM_CNT_OFFSET) +#define N32_ATIM2_REPCNT (N32_ATIMER2_BASE + N32_ATIM_REPCNT_OFFSET) +#define N32_ATIM2_BKDT (N32_ATIMER2_BASE + N32_ATIM_BKDT_OFFSET) +#define N32_ATIM2_CCDAT7 (N32_ATIMER2_BASE + N32_ATIM_CCDAT7_OFFSET) +#define N32_ATIM2_CCDAT8 (N32_ATIMER2_BASE + N32_ATIM_CCDAT8_OFFSET) +#define N32_ATIM2_CCDAT9 (N32_ATIMER2_BASE + N32_ATIM_CCDAT9_OFFSET) +#define N32_ATIM2_BKFR (N32_ATIMER2_BASE + N32_ATIM_BKFR_OFFSET) +#define N32_ATIM2_INSEL (N32_ATIMER2_BASE + N32_ATIM_INSEL_OFFSET) +#define N32_ATIM2_AF1 (N32_ATIMER2_BASE + N32_ATIM_AF1_OFFSET) +#define N32_ATIM2_AF2 (N32_ATIMER2_BASE + N32_ATIM_AF2_OFFSET) +#define N32_ATIM2_BKFR2 (N32_ATIMER2_BASE + N32_ATIM_BKFR2_OFFSET) +#define N32_ATIM2_DCTRL (N32_ATIMER2_BASE + N32_ATIM_DCTRL_OFFSET) +#define N32_ATIM2_DADDR (N32_ATIMER2_BASE + N32_ATIM_DADDR_OFFSET) + +/* Register Addresses - ATIM3 ***********************************************/ + +#define N32_ATIM3_CTRL1 (N32_ATIMER3_BASE + N32_ATIM_CTRL1_OFFSET) +#define N32_ATIM3_CTRL2 (N32_ATIMER3_BASE + N32_ATIM_CTRL2_OFFSET) +#define N32_ATIM3_STS (N32_ATIMER3_BASE + N32_ATIM_STS_OFFSET) +#define N32_ATIM3_ETGEN (N32_ATIMER3_BASE + N32_ATIM_ETGEN_OFFSET) +#define N32_ATIM3_SMCTRL (N32_ATIMER3_BASE + N32_ATIM_SMCTRL_OFFSET) +#define N32_ATIM3_DINTEN (N32_ATIMER3_BASE + N32_ATIM_DINTEN_OFFSET) +#define N32_ATIM3_CCMOD1 (N32_ATIMER3_BASE + N32_ATIM_CCMOD1_OFFSET) +#define N32_ATIM3_CCMOD2 (N32_ATIMER3_BASE + N32_ATIM_CCMOD2_OFFSET) +#define N32_ATIM3_CCMOD3 (N32_ATIMER3_BASE + N32_ATIM_CCMOD3_OFFSET) +#define N32_ATIM3_CCEN (N32_ATIMER3_BASE + N32_ATIM_CCEN_OFFSET) +#define N32_ATIM3_CCDAT1 (N32_ATIMER3_BASE + N32_ATIM_CCDAT1_OFFSET) +#define N32_ATIM3_CCDAT2 (N32_ATIMER3_BASE + N32_ATIM_CCDAT2_OFFSET) +#define N32_ATIM3_CCDAT3 (N32_ATIMER3_BASE + N32_ATIM_CCDAT3_OFFSET) +#define N32_ATIM3_CCDAT4 (N32_ATIMER3_BASE + N32_ATIM_CCDAT4_OFFSET) +#define N32_ATIM3_CCDAT5 (N32_ATIMER3_BASE + N32_ATIM_CCDAT5_OFFSET) +#define N32_ATIM3_CCDAT6 (N32_ATIMER3_BASE + N32_ATIM_CCDAT6_OFFSET) +#define N32_ATIM3_PSC (N32_ATIMER3_BASE + N32_ATIM_PSC_OFFSET) +#define N32_ATIM3_AR (N32_ATIMER3_BASE + N32_ATIM_AR_OFFSET) +#define N32_ATIM3_CNT (N32_ATIMER3_BASE + N32_ATIM_CNT_OFFSET) +#define N32_ATIM3_REPCNT (N32_ATIMER3_BASE + N32_ATIM_REPCNT_OFFSET) +#define N32_ATIM3_BKDT (N32_ATIMER3_BASE + N32_ATIM_BKDT_OFFSET) +#define N32_ATIM3_CCDAT7 (N32_ATIMER3_BASE + N32_ATIM_CCDAT7_OFFSET) +#define N32_ATIM3_CCDAT8 (N32_ATIMER3_BASE + N32_ATIM_CCDAT8_OFFSET) +#define N32_ATIM3_CCDAT9 (N32_ATIMER3_BASE + N32_ATIM_CCDAT9_OFFSET) +#define N32_ATIM3_BKFR (N32_ATIMER3_BASE + N32_ATIM_BKFR_OFFSET) +#define N32_ATIM3_INSEL (N32_ATIMER3_BASE + N32_ATIM_INSEL_OFFSET) +#define N32_ATIM3_AF1 (N32_ATIMER3_BASE + N32_ATIM_AF1_OFFSET) +#define N32_ATIM3_AF2 (N32_ATIMER3_BASE + N32_ATIM_AF2_OFFSET) +#define N32_ATIM3_BKFR2 (N32_ATIMER3_BASE + N32_ATIM_BKFR2_OFFSET) +#define N32_ATIM3_DCTRL (N32_ATIMER3_BASE + N32_ATIM_DCTRL_OFFSET) +#define N32_ATIM3_DADDR (N32_ATIMER3_BASE + N32_ATIM_DADDR_OFFSET) + +/* Register Addresses - ATIM4 ***********************************************/ + +#define N32_ATIM4_CTRL1 (N32_ATIMER4_BASE + N32_ATIM_CTRL1_OFFSET) +#define N32_ATIM4_CTRL2 (N32_ATIMER4_BASE + N32_ATIM_CTRL2_OFFSET) +#define N32_ATIM4_STS (N32_ATIMER4_BASE + N32_ATIM_STS_OFFSET) +#define N32_ATIM4_ETGEN (N32_ATIMER4_BASE + N32_ATIM_ETGEN_OFFSET) +#define N32_ATIM4_SMCTRL (N32_ATIMER4_BASE + N32_ATIM_SMCTRL_OFFSET) +#define N32_ATIM4_DINTEN (N32_ATIMER4_BASE + N32_ATIM_DINTEN_OFFSET) +#define N32_ATIM4_CCMOD1 (N32_ATIMER4_BASE + N32_ATIM_CCMOD1_OFFSET) +#define N32_ATIM4_CCMOD2 (N32_ATIMER4_BASE + N32_ATIM_CCMOD2_OFFSET) +#define N32_ATIM4_CCMOD3 (N32_ATIMER4_BASE + N32_ATIM_CCMOD3_OFFSET) +#define N32_ATIM4_CCEN (N32_ATIMER4_BASE + N32_ATIM_CCEN_OFFSET) +#define N32_ATIM4_CCDAT1 (N32_ATIMER4_BASE + N32_ATIM_CCDAT1_OFFSET) +#define N32_ATIM4_CCDAT2 (N32_ATIMER4_BASE + N32_ATIM_CCDAT2_OFFSET) +#define N32_ATIM4_CCDAT3 (N32_ATIMER4_BASE + N32_ATIM_CCDAT3_OFFSET) +#define N32_ATIM4_CCDAT4 (N32_ATIMER4_BASE + N32_ATIM_CCDAT4_OFFSET) +#define N32_ATIM4_CCDAT5 (N32_ATIMER4_BASE + N32_ATIM_CCDAT5_OFFSET) +#define N32_ATIM4_CCDAT6 (N32_ATIMER4_BASE + N32_ATIM_CCDAT6_OFFSET) +#define N32_ATIM4_PSC (N32_ATIMER4_BASE + N32_ATIM_PSC_OFFSET) +#define N32_ATIM4_AR (N32_ATIMER4_BASE + N32_ATIM_AR_OFFSET) +#define N32_ATIM4_CNT (N32_ATIMER4_BASE + N32_ATIM_CNT_OFFSET) +#define N32_ATIM4_REPCNT (N32_ATIMER4_BASE + N32_ATIM_REPCNT_OFFSET) +#define N32_ATIM4_BKDT (N32_ATIMER4_BASE + N32_ATIM_BKDT_OFFSET) +#define N32_ATIM4_CCDAT7 (N32_ATIMER4_BASE + N32_ATIM_CCDAT7_OFFSET) +#define N32_ATIM4_CCDAT8 (N32_ATIMER4_BASE + N32_ATIM_CCDAT8_OFFSET) +#define N32_ATIM4_CCDAT9 (N32_ATIMER4_BASE + N32_ATIM_CCDAT9_OFFSET) +#define N32_ATIM4_BKFR (N32_ATIMER4_BASE + N32_ATIM_BKFR_OFFSET) +#define N32_ATIM4_INSEL (N32_ATIMER4_BASE + N32_ATIM_INSEL_OFFSET) +#define N32_ATIM4_AF1 (N32_ATIMER4_BASE + N32_ATIM_AF1_OFFSET) +#define N32_ATIM4_AF2 (N32_ATIMER4_BASE + N32_ATIM_AF2_OFFSET) +#define N32_ATIM4_BKFR2 (N32_ATIMER4_BASE + N32_ATIM_BKFR2_OFFSET) +#define N32_ATIM4_DCTRL (N32_ATIMER4_BASE + N32_ATIM_DCTRL_OFFSET) +#define N32_ATIM4_DADDR (N32_ATIMER4_BASE + N32_ATIM_DADDR_OFFSET) + +/* Bitfield Definitions - ATIM **********************************************/ + +/* Control register 1 (N32_ATIM_CTRL1) */ + +#define N32_ATIM_CTRL1_CNTEN (1 << 0) /* Counter enable */ +#define N32_ATIM_CTRL1_DIR (1 << 1) /* Direction */ +#define N32_ATIM_CTRL1_CAMSEL_SHIFT (2) /* Center-aligned mode selection */ +#define N32_ATIM_CTRL1_CAMSEL_MASK (3 << N32_ATIM_CTRL1_CAMSEL_SHIFT) +# define N32_ATIM_CTRL1_EDGE (0 << N32_ATIM_CTRL1_CAMSEL_SHIFT) /* Edge-aligned */ +# define N32_ATIM_CTRL1_CENTER1 (1 << N32_ATIM_CTRL1_CAMSEL_SHIFT) /* Center-aligned 1 */ +# define N32_ATIM_CTRL1_CENTER2 (2 << N32_ATIM_CTRL1_CAMSEL_SHIFT) /* Center-aligned 2 */ +# define N32_ATIM_CTRL1_CENTER3 (3 << N32_ATIM_CTRL1_CAMSEL_SHIFT) /* Center-aligned 3 */ +#define N32_ATIM_CTRL1_UPRS (1 << 4) /* Update request source */ +#define N32_ATIM_CTRL1_UPDIS (1 << 5) /* Update disable */ +#define N32_ATIM_CTRL1_CLKD_SHIFT (6) /* Clock division */ +#define N32_ATIM_CTRL1_CLKD_MASK (3 << N32_ATIM_CTRL1_CLKD_SHIFT) +# define N32_ATIM_CTRL1_TCKINT (0 << N32_ATIM_CTRL1_CLKD_SHIFT) /* tDTS = tCK_INT */ +# define N32_ATIM_CTRL1_2TCKINT (1 << N32_ATIM_CTRL1_CLKD_SHIFT) /* tDTS = 2tCK_INT */ +# define N32_ATIM_CTRL1_4TCKINT (2 << N32_ATIM_CTRL1_CLKD_SHIFT) /* tDTS = 4tCK_INT */ +#define N32_ATIM_CTRL1_ONEPM (1 << 8) /* One pulse mode */ +#define N32_ATIM_CTRL1_ARPEN (1 << 9) /* Auto-reload preload enable */ +#define N32_ATIM_CTRL1_LBKPEN (1 << 10) /* LockUp as BRK enable */ +#define N32_ATIM_CTRL1_PBKPEN (1 << 11) /* PVD as BRK enable */ +#define N32_ATIM_CTRL1_SMPARERREN (1 << 12) /* SRAM parity error as BRK enable */ +#define N32_ATIM_CTRL1_CLRSEL (1 << 13) /* OcxRef clear selection */ +#define N32_ATIM_CTRL1_SMECCERREN (1 << 15) /* SRAM ECC error as BRK enable */ +#define N32_ATIM_CTRL1_CMODE_SHIFT (20) /* Center-aligned mode for TRGO */ +#define N32_ATIM_CTRL1_CMODE_MASK (3 << N32_ATIM_CTRL1_CMODE_SHIFT) +# define N32_ATIM_CTRL1_CMODE_UP (0 << N32_ATIM_CTRL1_CMODE_SHIFT) /* Up-count trigger */ +# define N32_ATIM_CTRL1_CMODE_DOWN (1 << N32_ATIM_CTRL1_CMODE_SHIFT) /* Down-count trigger */ +# define N32_ATIM_CTRL1_CMODE_UPDOWN (2 << N32_ATIM_CTRL1_CMODE_SHIFT) /* Both edges trigger */ +#define N32_ATIM_CTRL1_ASYMMETRIC (1 << 23) /* Asymmetric mode enable */ + +/* Control register 2 (N32_ATIM_CTRL2) */ + +#define N32_ATIM_CTRL2_O11 (1 << 0) /* Output idle state 1 (OC1) */ +#define N32_ATIM_CTRL2_O11N (1 << 1) /* Output idle state 1N (OC1N) */ +#define N32_ATIM_CTRL2_O12 (1 << 2) /* Output idle state 2 (OC2) */ +#define N32_ATIM_CTRL2_O12N (1 << 3) /* Output idle state 2N (OC2N) */ +#define N32_ATIM_CTRL2_O13 (1 << 4) /* Output idle state 3 (OC3) */ +#define N32_ATIM_CTRL2_O13N (1 << 5) /* Output idle state 3N (OC3N) */ +#define N32_ATIM_CTRL2_O14 (1 << 6) /* Output idle state 4 (OC4) */ +#define N32_ATIM_CTRL2_O14N (1 << 7) /* Output idle state 4N (OC4N) */ +#define N32_ATIM_CTRL2_O15 (1 << 8) /* Output idle state 5 (OC5) */ +#define N32_ATIM_CTRL2_O16 (1 << 10) /* Output idle state 6 (OC6) */ +#define N32_ATIM_CTRL2_MMSEL_SHIFT (12) /* Master mode selection (TRGO) */ +#define N32_ATIM_CTRL2_MMSEL_MASK (15 << N32_ATIM_CTRL2_MMSEL_SHIFT) +# define N32_ATIM_CTRL2_MMSEL_RESET (0 << N32_ATIM_CTRL2_MMSEL_SHIFT) /* Reset */ +# define N32_ATIM_CTRL2_MMSEL_ENABLE (1 << N32_ATIM_CTRL2_MMSEL_SHIFT) /* Enable */ +# define N32_ATIM_CTRL2_MMSEL_UPDATE (2 << N32_ATIM_CTRL2_MMSEL_SHIFT) /* Update */ +# define N32_ATIM_CTRL2_MMSEL_COMPP (3 << N32_ATIM_CTRL2_MMSEL_SHIFT) /* Compare pulse */ +# define N32_ATIM_CTRL2_MMSEL_OC1REF (4 << N32_ATIM_CTRL2_MMSEL_SHIFT) /* OC1REF */ +# define N32_ATIM_CTRL2_MMSEL_OC2REF (5 << N32_ATIM_CTRL2_MMSEL_SHIFT) /* OC2REF */ +# define N32_ATIM_CTRL2_MMSEL_OC3REF (6 << N32_ATIM_CTRL2_MMSEL_SHIFT) /* OC3REF */ +# define N32_ATIM_CTRL2_MMSEL_OC4REF (7 << N32_ATIM_CTRL2_MMSEL_SHIFT) /* OC4REF */ +# define N32_ATIM_CTRL2_MMSEL_OC5REF (8 << N32_ATIM_CTRL2_MMSEL_SHIFT) /* OC5REF */ +# define N32_ATIM_CTRL2_MMSEL_OC6REF (9 << N32_ATIM_CTRL2_MMSEL_SHIFT) /* OC6REF */ +# define N32_ATIM_CTRL2_MMSEL_OC4REFEDGE (10 << N32_ATIM_CTRL2_MMSEL_SHIFT) /* OC4REF edge */ +# define N32_ATIM_CTRL2_MMSEL_OC6REFEDGE (11 << N32_ATIM_CTRL2_MMSEL_SHIFT) /* OC6REF edge */ +#define N32_ATIM_CTRL2_CCUSEL (1 << 16) /* Capture/compare control update sel */ +#define N32_ATIM_CTRL2_CCDSEL (1 << 17) /* Capture/compare DMA selection */ +#define N32_ATIM_CTRL2_CCPCTL (1 << 18) /* Capture/compare preloaded control */ +#define N32_ATIM_CTRL2_TI1SEL (1 << 19) /* TI1 selection */ +#define N32_ATIM_CTRL2_TRIG4 (1 << 20) /* Trigger ADC on channel 4 compare */ +#define N32_ATIM_CTRL2_TRIG7 (1 << 21) /* Trigger ADC on channel 7 compare */ +#define N32_ATIM_CTRL2_TRIG8 (1 << 22) /* Trigger ADC on channel 8 compare */ +#define N32_ATIM_CTRL2_TRIG9 (1 << 23) /* Trigger ADC on channel 9 compare */ +#define N32_ATIM_CTRL2_MMSEL2_SHIFT (24) /* Master mode selection 2 (TRGO2) */ +#define N32_ATIM_CTRL2_MMSEL2_MASK (15 << N32_ATIM_CTRL2_MMSEL2_SHIFT) +# define N32_ATIM_CTRL2_MMSEL2_RESET (0 << N32_ATIM_CTRL2_MMSEL2_SHIFT) /* Reset */ +# define N32_ATIM_CTRL2_MMSEL2_ENABLE (1 << N32_ATIM_CTRL2_MMSEL2_SHIFT) /* Enable */ +# define N32_ATIM_CTRL2_MMSEL2_UPDATE (2 << N32_ATIM_CTRL2_MMSEL2_SHIFT) /* Update */ +# define N32_ATIM_CTRL2_MMSEL2_COMPP (3 << N32_ATIM_CTRL2_MMSEL2_SHIFT) /* Compare pulse */ +# define N32_ATIM_CTRL2_MMSEL2_OC1REF (4 << N32_ATIM_CTRL2_MMSEL2_SHIFT) /* OC1REF */ +# define N32_ATIM_CTRL2_MMSEL2_OC2REF (5 << N32_ATIM_CTRL2_MMSEL2_SHIFT) /* OC2REF */ +# define N32_ATIM_CTRL2_MMSEL2_OC3REF (6 << N32_ATIM_CTRL2_MMSEL2_SHIFT) /* OC3REF */ +# define N32_ATIM_CTRL2_MMSEL2_OC4REF (7 << N32_ATIM_CTRL2_MMSEL2_SHIFT) /* OC4REF */ +# define N32_ATIM_CTRL2_MMSEL2_OC5REF (8 << N32_ATIM_CTRL2_MMSEL2_SHIFT) /* OC5REF */ +# define N32_ATIM_CTRL2_MMSEL2_OC6REF (9 << N32_ATIM_CTRL2_MMSEL2_SHIFT) /* OC6REF */ + +/* Status register (N32_ATIM_STS) */ + +#define N32_ATIM_STS_CC1ITF (1 << 0) /* CC1 interrupt flag */ +#define N32_ATIM_STS_CC2ITF (1 << 1) /* CC2 interrupt flag */ +#define N32_ATIM_STS_CC3ITF (1 << 2) /* CC3 interrupt flag */ +#define N32_ATIM_STS_CC4ITF (1 << 3) /* CC4 interrupt flag */ +#define N32_ATIM_STS_CC5ITF (1 << 4) /* CC5 interrupt flag */ +#define N32_ATIM_STS_CC6ITF (1 << 5) /* CC6 interrupt flag */ +#define N32_ATIM_STS_CC1OCF (1 << 8) /* CC1 overcapture flag */ +#define N32_ATIM_STS_CC2OCF (1 << 9) /* CC2 overcapture flag */ +#define N32_ATIM_STS_CC3OCF (1 << 10) /* CC3 overcapture flag */ +#define N32_ATIM_STS_CC4OCF (1 << 11) /* CC4 overcapture flag */ +#define N32_ATIM_STS_UDITF (1 << 16) /* Update interrupt flag */ +#define N32_ATIM_STS_COMITF (1 << 17) /* COM interrupt flag */ +#define N32_ATIM_STS_TITF (1 << 18) /* Trigger interrupt flag */ +#define N32_ATIM_STS_BITF (1 << 19) /* Break1 interrupt flag */ +#define N32_ATIM_STS_BITF2 (1 << 20) /* Break2 interrupt flag */ +#define N32_ATIM_STS_SBITF (1 << 21) /* System break interrupt flag */ +#define N32_ATIM_STS_CC7ITF (1 << 24) /* CC7 interrupt flag */ +#define N32_ATIM_STS_CC8ITF (1 << 25) /* CC8 interrupt flag */ +#define N32_ATIM_STS_CC9ITF (1 << 26) /* CC9 interrupt flag */ + +/* Event generation register (N32_ATIM_ETGEN) */ + +#define N32_ATIM_ETGEN_CC1GN (1 << 0) /* CC1 generation */ +#define N32_ATIM_ETGEN_CC2GN (1 << 1) /* CC2 generation */ +#define N32_ATIM_ETGEN_CC3GN (1 << 2) /* CC3 generation */ +#define N32_ATIM_ETGEN_CC4GN (1 << 3) /* CC4 generation */ +#define N32_ATIM_ETGEN_UDGN (1 << 8) /* Update generation */ +#define N32_ATIM_ETGEN_CCUDGN (1 << 9) /* CC control update generation */ +#define N32_ATIM_ETGEN_TGN (1 << 10) /* Trigger generation */ +#define N32_ATIM_ETGEN_BGN (1 << 11) /* Break1 generation */ +#define N32_ATIM_ETGEN_BGN2 (1 << 12) /* Break2 generation */ + +/* Slave mode control register (N32_ATIM_SMCTRL) */ + +#define N32_ATIM_SMCTRL_TSEL_SHIFT (0) /* Trigger selection */ +#define N32_ATIM_SMCTRL_TSEL_MASK (7 << N32_ATIM_SMCTRL_TSEL_SHIFT) +# define N32_ATIM_SMCTRL_ITR (0 << N32_ATIM_SMCTRL_TSEL_SHIFT) /* Internal trigger */ +# define N32_ATIM_SMCTRL_TI1FED (4 << N32_ATIM_SMCTRL_TSEL_SHIFT) /* TI1 edge detector */ +# define N32_ATIM_SMCTRL_TI1FP1 (5 << N32_ATIM_SMCTRL_TSEL_SHIFT) /* Filtered TI1 */ +# define N32_ATIM_SMCTRL_TI2FP2 (6 << N32_ATIM_SMCTRL_TSEL_SHIFT) /* Filtered TI2 */ +# define N32_ATIM_SMCTRL_ETRF (7 << N32_ATIM_SMCTRL_TSEL_SHIFT) /* ETRF */ +#define N32_ATIM_SMCTRL_SMSEL_SHIFT (4) /* Slave mode selection */ +#define N32_ATIM_SMCTRL_SMSEL_MASK (15 << N32_ATIM_SMCTRL_SMSEL_SHIFT) +# define N32_ATIM_SMCTRL_DISAB (0 << N32_ATIM_SMCTRL_SMSEL_SHIFT) +# define N32_ATIM_SMCTRL_ENCMD1 (1 << N32_ATIM_SMCTRL_SMSEL_SHIFT) +# define N32_ATIM_SMCTRL_ENCMD2 (2 << N32_ATIM_SMCTRL_SMSEL_SHIFT) +# define N32_ATIM_SMCTRL_ENCMD3 (3 << N32_ATIM_SMCTRL_SMSEL_SHIFT) +# define N32_ATIM_SMCTRL_RESET (4 << N32_ATIM_SMCTRL_SMSEL_SHIFT) +# define N32_ATIM_SMCTRL_GATED (5 << N32_ATIM_SMCTRL_SMSEL_SHIFT) +# define N32_ATIM_SMCTRL_TRIGGER (6 << N32_ATIM_SMCTRL_SMSEL_SHIFT) +# define N32_ATIM_SMCTRL_EXTCLK1 (7 << N32_ATIM_SMCTRL_SMSEL_SHIFT) +# define N32_ATIM_SMCTRL_ENCMD4 (9 << N32_ATIM_SMCTRL_SMSEL_SHIFT) +# define N32_ATIM_SMCTRL_ENCMD5 (10 << N32_ATIM_SMCTRL_SMSEL_SHIFT) +#define N32_ATIM_SMCTRL_EXTPS_SHIFT (8) /* External trigger prescaler */ +#define N32_ATIM_SMCTRL_EXTPS_MASK (3 << N32_ATIM_SMCTRL_EXTPS_SHIFT) +# define N32_ATIM_SMCTRL_PSCOFF (0 << N32_ATIM_SMCTRL_EXTPS_SHIFT) +# define N32_ATIM_SMCTRL_ETRPd2 (1 << N32_ATIM_SMCTRL_EXTPS_SHIFT) +# define N32_ATIM_SMCTRL_ETRPd4 (2 << N32_ATIM_SMCTRL_EXTPS_SHIFT) +# define N32_ATIM_SMCTRL_ETRPd8 (3 << N32_ATIM_SMCTRL_EXTPS_SHIFT) +#define N32_ATIM_SMCTRL_EXCEN (1 << 10) /* External clock enable */ +#define N32_ATIM_SMCTRL_EXTP (1 << 11) /* External trigger polarity */ +#define N32_ATIM_SMCTRL_EXTF_SHIFT (12) /* External trigger filter */ +#define N32_ATIM_SMCTRL_EXTF_MASK (15 << N32_ATIM_SMCTRL_EXTF_SHIFT) +#define N32_ATIM_SMCTRL_MSMD (1 << 16) /* Master/slave mode */ +#define N32_ATIM_SMCTRL_OCRECFLRP (1 << 19) /* tim_ocref_clr polarity */ +#define N32_ATIM_SMCTRL_OCRECFLRF_SHIFT (20) /* tim_ocref_clr filter */ +#define N32_ATIM_SMCTRL_OCRECFLRF_MASK (15 << N32_ATIM_SMCTRL_OCRECFLRF_SHIFT) + +/* Common filter encoding (used by EXTF and OCRECFLRF) */ + +#define N32_ATIM_FILTER_NOFILT (0) /* No filter */ +#define N32_ATIM_FILTER_FCKINT2 (1) /* fCK_INT, N=2 */ +#define N32_ATIM_FILTER_FCKINT4 (2) /* fCK_INT, N=4 */ +#define N32_ATIM_FILTER_FCKINT8 (3) /* fCK_INT, N=8 */ +#define N32_ATIM_FILTER_FDTSd2_6 (4) /* fDTS/2, N=6 */ +#define N32_ATIM_FILTER_FDTSd2_8 (5) /* fDTS/2, N=8 */ +#define N32_ATIM_FILTER_FDTSd4_6 (6) /* fDTS/4, N=6 */ +#define N32_ATIM_FILTER_FDTSd4_8 (7) /* fDTS/4, N=8 */ +#define N32_ATIM_FILTER_FDTSd8_6 (8) /* fDTS/8, N=6 */ +#define N32_ATIM_FILTER_FDTSd8_8 (9) /* fDTS/8, N=8 */ +#define N32_ATIM_FILTER_FDTSd16_5 (10) /* fDTS/16, N=5 */ +#define N32_ATIM_FILTER_FDTSd16_6 (11) /* fDTS/16, N=6 */ +#define N32_ATIM_FILTER_FDTSd16_8 (12) /* fDTS/16, N=8 */ +#define N32_ATIM_FILTER_FDTSd32_5 (13) /* fDTS/32, N=5 */ +#define N32_ATIM_FILTER_FDTSd32_F6 (14) /* fDTS/32, N=6 */ +#define N32_ATIM_FILTER_FDTSd32_8 (15) /* fDTS/32, N=8 */ + +/* DMA/Interrupt enable register (N32_ATIM_DINTEN) */ + +#define N32_ATIM_DINTEN_CC1IEN (1 << 0) /* CC1 interrupt enable */ +#define N32_ATIM_DINTEN_CC2IEN (1 << 1) /* CC2 interrupt enable */ +#define N32_ATIM_DINTEN_CC3IEN (1 << 2) /* CC3 interrupt enable */ +#define N32_ATIM_DINTEN_CC4IEN (1 << 3) /* CC4 interrupt enable */ +#define N32_ATIM_DINTEN_CC5IEN (1 << 4) /* CC5 interrupt enable */ +#define N32_ATIM_DINTEN_CC6IEN (1 << 5) /* CC6 interrupt enable */ +#define N32_ATIM_DINTEN_CC7IEN (1 << 6) /* CC7 interrupt enable */ +#define N32_ATIM_DINTEN_CC8IEN (1 << 7) /* CC8 interrupt enable */ +#define N32_ATIM_DINTEN_CC1DEN (1 << 8) /* CC1 DMA request enable */ +#define N32_ATIM_DINTEN_CC2DEN (1 << 9) /* CC2 DMA request enable */ +#define N32_ATIM_DINTEN_CC3DEN (1 << 10) /* CC3 DMA request enable */ +#define N32_ATIM_DINTEN_CC4DEN (1 << 11) /* CC4 DMA request enable */ +#define N32_ATIM_DINTEN_UIEN (1 << 16) /* Update interrupt enable */ +#define N32_ATIM_DINTEN_TIEN (1 << 17) /* Trigger interrupt enable */ +#define N32_ATIM_DINTEN_BIEN (1 << 18) /* Break interrupt enable */ +#define N32_ATIM_DINTEN_UDEN (1 << 19) /* Update DMA request enable */ +#define N32_ATIM_DINTEN_COMDEN (1 << 20) /* COM DMA request enable */ +#define N32_ATIM_DINTEN_TDEN (1 << 21) /* Trigger DMA request enable */ +#define N32_ATIM_DINTEN_COMIEN (1 << 22) /* COM interrupt enable */ +#define N32_ATIM_DINTEN_CC9IEN (1 << 23) /* CC9 interrupt enable */ + +/* Capture/compare mode register 1 - Output compare (N32_ATIM_CCMOD1) */ + +#define N32_ATIM_CCMOD1_CC1SEL_SHIFT (0) /* CC1 selection */ +#define N32_ATIM_CCMOD1_CC1SEL_MASK (3 << N32_ATIM_CCMOD1_CC1SEL_SHIFT) +# define N32_ATIM_CCMOD1_CC1OUT (0 << N32_ATIM_CCMOD1_CC1SEL_SHIFT) /* Output */ +# define N32_ATIM_CCMOD1_CC1IN_TI1 (1 << N32_ATIM_CCMOD1_CC1SEL_SHIFT) /* Input TI1 */ +# define N32_ATIM_CCMOD1_CC1IN_TI2 (2 << N32_ATIM_CCMOD1_CC1SEL_SHIFT) /* Input TI2 */ +# define N32_ATIM_CCMOD1_CC1IN_TRC (3 << N32_ATIM_CCMOD1_CC1SEL_SHIFT) /* Input TRC */ +#define N32_ATIM_CCMOD1_OC1PEN (1 << 2) /* OC1 preload enable */ +#define N32_ATIM_CCMOD1_OC1FEN (1 << 3) /* OC1 fast enable */ +#define N32_ATIM_CCMOD1_OC1CEN (1 << 4) /* OC1 clear enable */ +#define N32_ATIM_CCMOD1_OC1MD_SHIFT (5) /* OC1 mode */ +#define N32_ATIM_CCMOD1_OC1MD_MASK (7 << N32_ATIM_CCMOD1_OC1MD_SHIFT) +# define N32_ATIM_CCMOD1_OCMODE_FRZN (0 << N32_ATIM_CCMOD1_OC1MD_SHIFT) /* Frozen */ +# define N32_ATIM_CCMOD1_OCMODE_ACTIVE (1 << N32_ATIM_CCMOD1_OC1MD_SHIFT) /* Active */ +# define N32_ATIM_CCMOD1_OCMODE_INACTIVE (2 << N32_ATIM_CCMOD1_OC1MD_SHIFT) /* Inactive */ +# define N32_ATIM_CCMOD1_OCMODE_TOGGLE (3 << N32_ATIM_CCMOD1_OC1MD_SHIFT) /* Toggle */ +# define N32_ATIM_CCMOD1_OCMODE_FORCELO (4 << N32_ATIM_CCMOD1_OC1MD_SHIFT) /* Force low */ +# define N32_ATIM_CCMOD1_OCMODE_FORCEHI (5 << N32_ATIM_CCMOD1_OC1MD_SHIFT) /* Force high */ +# define N32_ATIM_CCMOD1_OCMODE_PWM1 (6 << N32_ATIM_CCMOD1_OC1MD_SHIFT) /* PWM mode 1 */ +# define N32_ATIM_CCMOD1_OCMODE_PWM2 (7 << N32_ATIM_CCMOD1_OC1MD_SHIFT) /* PWM mode 2 */ +#define N32_ATIM_CCMOD1_CC2SEL_SHIFT (8) /* CC2 selection */ +#define N32_ATIM_CCMOD1_CC2SEL_MASK (3 << N32_ATIM_CCMOD1_CC2SEL_SHIFT) +# define N32_ATIM_CCMOD1_CC2OUT (0 << N32_ATIM_CCMOD1_CC2SEL_SHIFT) +# define N32_ATIM_CCMOD1_CC2IN_TI2 (1 << N32_ATIM_CCMOD1_CC2SEL_SHIFT) +# define N32_ATIM_CCMOD1_CC2IN_TI1 (2 << N32_ATIM_CCMOD1_CC2SEL_SHIFT) +# define N32_ATIM_CCMOD1_CC2IN_TRC (3 << N32_ATIM_CCMOD1_CC2SEL_SHIFT) +#define N32_ATIM_CCMOD1_OC2PEN (1 << 10) /* OC2 preload enable */ +#define N32_ATIM_CCMOD1_OC2FEN (1 << 11) /* OC2 fast enable */ +#define N32_ATIM_CCMOD1_OC2CEN (1 << 12) /* OC2 clear enable */ +#define N32_ATIM_CCMOD1_OC2MD_SHIFT (13) /* OC2 mode */ +#define N32_ATIM_CCMOD1_OC2MD_MASK (7 << N32_ATIM_CCMOD1_OC2MD_SHIFT) + +/* Capture/compare mode register 1 - Input capture (N32_ATIM_CCMOD1) */ + +#define N32_ATIM_CCMOD1_IC1PSC_SHIFT (2) /* IC1 prescaler */ +#define N32_ATIM_CCMOD1_IC1PSC_MASK (3 << N32_ATIM_CCMOD1_IC1PSC_SHIFT) +# define N32_ATIM_CCMOD1_ICPSC_NONE (0 << N32_ATIM_CCMOD1_IC1PSC_SHIFT) /* No prescaler */ +# define N32_ATIM_CCMOD1_ICPSC_2 (1 << N32_ATIM_CCMOD1_IC1PSC_SHIFT) /* Every 2 events */ +# define N32_ATIM_CCMOD1_ICPSC_4 (2 << N32_ATIM_CCMOD1_IC1PSC_SHIFT) /* Every 4 events */ +# define N32_ATIM_CCMOD1_ICPSC_8 (3 << N32_ATIM_CCMOD1_IC1PSC_SHIFT) /* Every 8 events */ +#define N32_ATIM_CCMOD1_IC1F_SHIFT (4) /* IC1 filter */ +#define N32_ATIM_CCMOD1_IC1F_MASK (15 << N32_ATIM_CCMOD1_IC1F_SHIFT) +# define N32_ATIM_CCMOD1_IC1F_DTS (0 << N32_ATIM_CCMOD1_IC1F_SHIFT) /* Direct time selection */ +# define N32_ATIM_CCMOD1_IC1F_INT_2 (1 << N32_ATIM_CCMOD1_IC1F_SHIFT) /* Internal clock, Sample every 2 events */ +# define N32_ATIM_CCMOD1_IC1F_INT_4 (2 << N32_ATIM_CCMOD1_IC1F_SHIFT) /* Internal clock, Sample every 4 events */ +# define N32_ATIM_CCMOD1_IC1F_INT_8 (3 << N32_ATIM_CCMOD1_IC1F_SHIFT) /* Internal clock, Sample every 8 events */ +# define N32_ATIM_CCMOD1_IC1F_DTS_2_N6 (4 << N32_ATIM_CCMOD1_IC1F_SHIFT) /* Direct time div2, Sample every 6 events */ +# define N32_ATIM_CCMOD1_IC1F_DTS_2_N8 (5 << N32_ATIM_CCMOD1_IC1F_SHIFT) /* Direct time div2, Sample every 8 events */ +# define N32_ATIM_CCMOD1_IC1F_DTS_4_N6 (6 << N32_ATIM_CCMOD1_IC1F_SHIFT) /* Direct time div4, Sample every 6 events */ +# define N32_ATIM_CCMOD1_IC1F_DTS_4_N8 (7 << N32_ATIM_CCMOD1_IC1F_SHIFT) /* Direct time div4, Sample every 8 events */ +# define N32_ATIM_CCMOD1_IC1F_DTS_8_N6 (8 << N32_ATIM_CCMOD1_IC1F_SHIFT) /* Direct time div8, Sample every 6 events */ +# define N32_ATIM_CCMOD1_IC1F_DTS_8_N8 (9 << N32_ATIM_CCMOD1_IC1F_SHIFT) /* Direct time div8, Sample every 8 events */ +# define N32_ATIM_CCMOD1_IC1F_DTS_16_N5 (10 << N32_ATIM_CCMOD1_IC1F_SHIFT) /* Direct time div16, Sample every 5 events */ +# define N32_ATIM_CCMOD1_IC1F_DTS_16_N6 (11 << N32_ATIM_CCMOD1_IC1F_SHIFT) /* Direct time div16, Sample every 6 events */ +# define N32_ATIM_CCMOD1_IC1F_DTS_16_N8 (12 << N32_ATIM_CCMOD1_IC1F_SHIFT) /* Direct time div16, Sample every 8 events */ +# define N32_ATIM_CCMOD1_IC1F_DTS_32_N5 (13 << N32_ATIM_CCMOD1_IC1F_SHIFT) /* Direct time div32, Sample every 5 events */ +# define N32_ATIM_CCMOD1_IC1F_DTS_32_N6 (14 << N32_ATIM_CCMOD1_IC1F_SHIFT) /* Direct time div32, Sample every 6 events */ +# define N32_ATIM_CCMOD1_IC1F_DTS_32_N8 (15 << N32_ATIM_CCMOD1_IC1F_SHIFT) /* Direct time div32, Sample every 8 events */ +#define N32_ATIM_CCMOD1_IC2PSC_SHIFT (10) /* IC2 prescaler */ +#define N32_ATIM_CCMOD1_IC2PSC_MASK (3 << N32_ATIM_CCMOD1_IC2PSC_SHIFT) +#define N32_ATIM_CCMOD1_IC2F_SHIFT (12) /* IC2 filter */ +#define N32_ATIM_CCMOD1_IC2F_MASK (15 << N32_ATIM_CCMOD1_IC2F_SHIFT) + +/* Capture/compare mode register 2 - Output compare (N32_ATIM_CCMOD2) */ + +#define N32_ATIM_CCMOD2_CC3SEL_SHIFT (0) /* CC3 selection */ +#define N32_ATIM_CCMOD2_CC3SEL_MASK (3 << N32_ATIM_CCMOD2_CC3SEL_SHIFT) +# define N32_ATIM_CCMOD2_CC3OUT (0 << N32_ATIM_CCMOD2_CC3SEL_SHIFT) /* Output */ +# define N32_ATIM_CCMOD2_CC3IN_TI3 (1 << N32_ATIM_CCMOD2_CC3SEL_SHIFT) /* Input TI3 */ +# define N32_ATIM_CCMOD2_CC3IN_TI4 (2 << N32_ATIM_CCMOD2_CC3SEL_SHIFT) /* Input TI4 */ +# define N32_ATIM_CCMOD2_CC3IN_TRC (3 << N32_ATIM_CCMOD2_CC3SEL_SHIFT) /* Input TRC */ +#define N32_ATIM_CCMOD2_OC3PEN (1 << 2) /* OC3 preload enable */ +#define N32_ATIM_CCMOD2_OC3FEN (1 << 3) /* OC3 fast enable */ +#define N32_ATIM_CCMOD2_OC3CEN (1 << 4) /* OC3 clear enable */ +#define N32_ATIM_CCMOD2_OC3MD_SHIFT (5) /* OC3 mode */ +#define N32_ATIM_CCMOD2_OC3MD_MASK (7 << N32_ATIM_CCMOD2_OC3MD_SHIFT) +#define N32_ATIM_CCMOD2_CC4SEL_SHIFT (8) /* CC4 selection */ +#define N32_ATIM_CCMOD2_CC4SEL_MASK (3 << N32_ATIM_CCMOD2_CC4SEL_SHIFT) +# define N32_ATIM_CCMOD2_CC4OUT (0 << N32_ATIM_CCMOD2_CC4SEL_SHIFT) /* Output */ +# define N32_ATIM_CCMOD2_CC4IN_TI4 (1 << N32_ATIM_CCMOD2_CC4SEL_SHIFT) /* Input TI4 */ +# define N32_ATIM_CCMOD2_CC4IN_TI3 (2 << N32_ATIM_CCMOD2_CC4SEL_SHIFT) /* Input TI3 */ +# define N32_ATIM_CCMOD2_CC4IN_TRC (3 << N32_ATIM_CCMOD2_CC4SEL_SHIFT) /* Input TRC */ +#define N32_ATIM_CCMOD2_OC4PEN (1 << 10) /* OC4 preload enable */ +#define N32_ATIM_CCMOD2_OC4FEN (1 << 11) /* OC4 fast enable */ +#define N32_ATIM_CCMOD2_OC4CEN (1 << 12) /* OC4 clear enable */ +#define N32_ATIM_CCMOD2_OC4MD_SHIFT (13) /* OC4 mode */ +#define N32_ATIM_CCMOD2_OC4MD_MASK (7 << N32_ATIM_CCMOD2_OC4MD_SHIFT) + +/* Capture/compare mode register 2 - Input capture (N32_ATIM_CCMOD2) */ + +#define N32_ATIM_CCMOD2_IC3PSC_SHIFT (2) /* IC3 prescaler */ +#define N32_ATIM_CCMOD2_IC3PSC_MASK (3 << N32_ATIM_CCMOD2_IC3PSC_SHIFT) +#define N32_ATIM_CCMOD2_IC3F_SHIFT (4) /* IC3 filter */ +#define N32_ATIM_CCMOD2_IC3F_MASK (15 << N32_ATIM_CCMOD2_IC3F_SHIFT) +#define N32_ATIM_CCMOD2_IC4PSC_SHIFT (10) /* IC4 prescaler */ +#define N32_ATIM_CCMOD2_IC4PSC_MASK (3 << N32_ATIM_CCMOD2_IC4PSC_SHIFT) +#define N32_ATIM_CCMOD2_IC4F_SHIFT (12) /* IC4 filter */ +#define N32_ATIM_CCMOD2_IC4F_MASK (15 << N32_ATIM_CCMOD2_IC4F_SHIFT) + +/* Capture/compare mode register 3 (N32_ATIM_CCMOD3) */ + +#define N32_ATIM_CCMOD3_OC5PEN (1 << 2) /* OC5 preload enable */ +#define N32_ATIM_CCMOD3_OC5FEN (1 << 3) /* OC5 fast enable */ +#define N32_ATIM_CCMOD3_OC5CEN (1 << 4) /* OC5 clear enable */ +#define N32_ATIM_CCMOD3_OC5MD_SHIFT (5) /* OC5 mode */ +#define N32_ATIM_CCMOD3_OC5MD_MASK (7 << N32_ATIM_CCMOD3_OC5MD_SHIFT) +#define N32_ATIM_CCMOD3_OC6PEN (1 << 10) /* OC6 preload enable */ +#define N32_ATIM_CCMOD3_OC6FEN (1 << 11) /* OC6 fast enable */ +#define N32_ATIM_CCMOD3_OC6CEN (1 << 12) /* OC6 clear enable */ +#define N32_ATIM_CCMOD3_OC6MD_SHIFT (13) /* OC6 mode */ +#define N32_ATIM_CCMOD3_OC6MD_MASK (7 << N32_ATIM_CCMOD3_OC6MD_SHIFT) +#define N32_ATIM_CCMOD3_OC7PEN (1 << 16) /* OC7 preload enable */ +#define N32_ATIM_CCMOD3_OC8PEN (1 << 20) /* OC8 preload enable */ +#define N32_ATIM_CCMOD3_OC9PEN (1 << 24) /* OC9 preload enable */ + +/* Capture/compare enable register (N32_ATIM_CCEN) */ + +#define N32_ATIM_CCEN_CC1NEN (1 << 0) /* CC1 complementary output enable */ +#define N32_ATIM_CCEN_CC1NP (1 << 1) /* CC1 complementary output polarity */ +#define N32_ATIM_CCEN_CC1EN (1 << 2) /* CC1 output enable */ +#define N32_ATIM_CCEN_CC1P (1 << 3) /* CC1 output polarity */ +#define N32_ATIM_CCEN_CC2NEN (1 << 4) /* CC2 complementary output enable */ +#define N32_ATIM_CCEN_CC2NP (1 << 5) /* CC2 complementary output polarity */ +#define N32_ATIM_CCEN_CC2EN (1 << 6) /* CC2 output enable */ +#define N32_ATIM_CCEN_CC2P (1 << 7) /* CC2 output polarity */ +#define N32_ATIM_CCEN_CC3NEN (1 << 8) /* CC3 complementary output enable */ +#define N32_ATIM_CCEN_CC3NP (1 << 9) /* CC3 complementary output polarity */ +#define N32_ATIM_CCEN_CC3EN (1 << 10) /* CC3 output enable */ +#define N32_ATIM_CCEN_CC3P (1 << 11) /* CC3 output polarity */ +#define N32_ATIM_CCEN_CC4NEN (1 << 12) /* CC4 complementary output enable */ +#define N32_ATIM_CCEN_CC4NP (1 << 13) /* CC4 complementary output polarity */ +#define N32_ATIM_CCEN_CC4EN (1 << 14) /* CC4 output enable */ +#define N32_ATIM_CCEN_CC4P (1 << 15) /* CC4 output polarity */ +#define N32_ATIM_CCEN_CC5EN (1 << 18) /* CC5 output enable */ +#define N32_ATIM_CCEN_CC5P (1 << 19) /* CC5 output polarity */ +#define N32_ATIM_CCEN_CC6EN (1 << 22) /* CC6 output enable */ +#define N32_ATIM_CCEN_CC6P (1 << 23) /* CC6 output polarity */ + +/* Capture/compare registers (N32_ATIM_CCDAT1-9) */ + +#define N32_ATIM_CCDAT_MASK (0xffff) /* CCx value mask */ +#define N32_ATIM_CCDAT_DOWN_SHIFT (16) /* Down-count value shift */ + +/* Prescaler, Auto-reload, Counter */ + +#define N32_ATIM_PSC_MASK (0xffff) /* Prescaler value mask */ +#define N32_ATIM_AR_MASK (0xffff) /* Auto-reload value mask */ +#define N32_ATIM_CNT_MASK (0xffff) /* Counter value mask */ + +/* Repetition counter */ + +#define N32_ATIM_REPCNT_MASK (0xff) /* Repetition counter value mask */ + +/* Break and dead-time register (N32_ATIM_BKDT) */ + +#define N32_ATIM_BKDT_DTGN_SHIFT (0) /* Dead-time generator setup */ +#define N32_ATIM_BKDT_DTGN_MASK (0xff << N32_ATIM_BKDT_DTGN_SHIFT) +#define N32_ATIM_BKDT_MOEN (1 << 8) /* Main output enable */ +#define N32_ATIM_BKDT_AOEN (1 << 9) /* Automatic output enable */ +#define N32_ATIM_BKDT_BKP (1 << 10) /* Break1 polarity */ +#define N32_ATIM_BKDT_BKEN (1 << 11) /* Break1 enable */ +#define N32_ATIM_BKDT_OSSI (1 << 12) /* Off-state selection for Idle mode */ +#define N32_ATIM_BKDT_OSSR (1 << 13) /* Off-state selection for Run mode */ +#define N32_ATIM_BKDT_LCKCFG_SHIFT (14) /* Lock configuration */ +#define N32_ATIM_BKDT_LCKCFG_MASK (3 << N32_ATIM_BKDT_LCKCFG_SHIFT) +# define N32_ATIM_BKDT_LOCKOFF (0 << N32_ATIM_BKDT_LCKCFG_SHIFT) /* No lock */ +# define N32_ATIM_BKDT_LOCK1 (1 << N32_ATIM_BKDT_LCKCFG_SHIFT) /* Lock level 1 */ +# define N32_ATIM_BKDT_LOCK2 (2 << N32_ATIM_BKDT_LCKCFG_SHIFT) /* Lock level 2 */ +# define N32_ATIM_BKDT_LOCK3 (3 << N32_ATIM_BKDT_LCKCFG_SHIFT) /* Lock level 3 */ +#define N32_ATIM_BKDT_BK2P (1 << 16) /* Break2 polarity */ +#define N32_ATIM_BKDT_BK2EN (1 << 17) /* Break2 enable */ +#define N32_ATIM_BKDT_BRKDSRM (1 << 18) /* Break1 disarm */ +#define N32_ATIM_BKDT_BRK2DSRM (1 << 19) /* Break2 disarm */ +#define N32_ATIM_BKDT_BRKBID (1 << 20) /* Break1 bidirectional enable */ +#define N32_ATIM_BKDT_BRK2BID (1 << 21) /* Break2 bidirectional enable */ + +/* Break filter register (N32_ATIM_BKFR) */ + +#define N32_ATIM_BKFR_SLIDFPSC_MASK (0xffff) /* Sampling clock prescaler */ +#define N32_ATIM_BKFR_FILTEN (1 << 16) /* Filter enable */ +#define N32_ATIM_BKFR_WSIZE_SHIFT (17) /* Window size */ +#define N32_ATIM_BKFR_WSIZE_MASK (63 << N32_ATIM_BKFR_WSIZE_SHIFT) +#define N32_ATIM_BKFR_THRESH_SHIFT (24) /* Threshold */ +#define N32_ATIM_BKFR_THRESH_MASK (63 << N32_ATIM_BKFR_THRESH_SHIFT) + +/* Input selection register (N32_ATIM_INSEL) */ + +#define N32_ATIM_INSEL_TI1S_SHIFT (0) /* TI1 input selection */ +#define N32_ATIM_INSEL_TI1S_MASK (15 << N32_ATIM_INSEL_TI1S_SHIFT) +#define N32_ATIM_INSEL_TI2S_SHIFT (4) /* TI2 input selection */ +#define N32_ATIM_INSEL_TI2S_MASK (15 << N32_ATIM_INSEL_TI2S_SHIFT) +#define N32_ATIM_INSEL_TI3S_SHIFT (8) /* TI3 input selection */ +#define N32_ATIM_INSEL_TI3S_MASK (15 << N32_ATIM_INSEL_TI3S_SHIFT) +#define N32_ATIM_INSEL_TI4S_SHIFT (12) /* TI4 input selection */ +#define N32_ATIM_INSEL_TI4S_MASK (15 << N32_ATIM_INSEL_TI4S_SHIFT) +#define N32_ATIM_INSEL_ETRS_SHIFT (16) /* ETR input selection */ +#define N32_ATIM_INSEL_ETRS_MASK (15 << N32_ATIM_INSEL_ETRS_SHIFT) +#define N32_ATIM_INSEL_ITRS_SHIFT (20) /* ITR input selection */ +#define N32_ATIM_INSEL_ITRS_MASK (15 << N32_ATIM_INSEL_ITRS_SHIFT) +#define N32_ATIM_INSEL_CLRS_SHIFT (24) /* OcxRef clear input selection */ +#define N32_ATIM_INSEL_CLRS_MASK (15 << N32_ATIM_INSEL_CLRS_SHIFT) + +/* Alternate function registers (N32_ATIM_AF1, N32_ATIM_AF2) */ + +#define N32_ATIM_AF1_IOMBRKEN (1 << 0) /* TIMx_BKIN break input enable */ +#define N32_ATIM_AF1_COMP1BRKEN (1 << 1) /* COMP1 break input enable */ +#define N32_ATIM_AF1_COMP2BRKEN (1 << 2) /* COMP2 break input enable */ +#define N32_ATIM_AF1_COMP3BRKEN (1 << 3) /* COMP3 break input enable */ +#define N32_ATIM_AF1_COMP4BRKEN (1 << 4) /* COMP4 break input enable */ +#define N32_ATIM_AF1_IOMBRKP (1 << 9) /* TIMx_BKIN polarity selection */ +#define N32_ATIM_AF1_COMP1BRKP (1 << 10) /* COMP1 break polarity */ +#define N32_ATIM_AF1_COMP2BRKP (1 << 11) /* COMP2 break polarity */ +#define N32_ATIM_AF1_COMP3BRKP (1 << 12) /* COMP3 break polarity */ +#define N32_ATIM_AF1_COMP4BRKP (1 << 13) /* COMP4 break polarity */ + +#define N32_ATIM_AF2_IOMBRK2EN (1 << 0) /* TIMx_BKIN2 break input enable */ +#define N32_ATIM_AF2_COMP1BRK2EN (1 << 1) /* COMP1 break2 enable */ +#define N32_ATIM_AF2_COMP2BRK2EN (1 << 2) /* COMP2 break2 enable */ +#define N32_ATIM_AF2_COMP3BRK2EN (1 << 3) /* COMP3 break2 enable */ +#define N32_ATIM_AF2_COMP4BRK2EN (1 << 4) /* COMP4 break2 enable */ +#define N32_ATIM_AF2_IOMBRK2P (1 << 9) /* TIMx_BKIN2 polarity selection */ +#define N32_ATIM_AF2_COMP1BRK2P (1 << 10) /* COMP1 break2 polarity */ +#define N32_ATIM_AF2_COMP2BRK2P (1 << 11) /* COMP2 break2 polarity */ +#define N32_ATIM_AF2_COMP3BRK2P (1 << 12) /* COMP3 break2 polarity */ +#define N32_ATIM_AF2_COMP4BRK2P (1 << 13) /* COMP4 break2 polarity */ +#define N32_ATIM_AF2_DSMU0BRK2EN (1 << 24) /* DSMU0 break2 enable */ +#define N32_ATIM_AF2_DSMU1BRK2EN (1 << 25) /* DSMU1 break2 enable */ +#define N32_ATIM_AF2_DSMU2BRK2EN (1 << 26) /* DSMU2 break2 enable */ +#define N32_ATIM_AF2_DSMU3BRK2EN (1 << 27) /* DSMU3 break2 enable */ + +/* Break 2 filter (N32_ATIM_BKFR2) */ + +#define N32_ATIM_BKFR2_SLIDFPSC_MASK (0xffff) /* Sampling clock prescaler */ +#define N32_ATIM_BKFR2_FILTEN (1 << 16) /* Filter enable */ +#define N32_ATIM_BKFR2_WSIZE_SHIFT (17) /* Window size */ +#define N32_ATIM_BKFR2_WSIZE_MASK (63 << N32_ATIM_BKFR2_WSIZE_SHIFT) +#define N32_ATIM_BKFR2_THRESH_SHIFT (24) /* Threshold */ +#define N32_ATIM_BKFR2_THRESH_MASK (63 << N32_ATIM_BKFR2_THRESH_SHIFT) + +/* DMA control (N32_ATIM_DCTRL) */ + +#define N32_ATIM_DCTRL_DBLEN_SHIFT (0) /* DMA burst length */ +#define N32_ATIM_DCTRL_DBLEN_MASK (63 << N32_ATIM_DCTRL_DBLEN_SHIFT) +# define N32_ATIM_DCTRL_DBLEN(n) (((n)-1) << N32_ATIM_DCTRL_DBLEN_SHIFT) +#define N32_ATIM_DCTRL_DBADDR_SHIFT (8) /* DMA base address */ +#define N32_ATIM_DCTRL_DBADDR_MASK (63 << N32_ATIM_DCTRL_DBADDR_SHIFT) + +#define N32_ATIM_DADDR_BURST_MASK (0xffffffff) /* DMA burst data */ + +/* ========================================================================== + * GENERAL-PURPOSE TIMERS A (GTIMA1-7) + * ========================================================================== + */ + +/* Register Offsets - GTIMA (common for all GTIMA1-7) ***********************/ + +#define N32_GTIMA_CTRL1_OFFSET 0x0000 /* Control register 1 */ +#define N32_GTIMA_CTRL2_OFFSET 0x0004 /* Control register 2 */ +#define N32_GTIMA_STS_OFFSET 0x0008 /* Status register */ +#define N32_GTIMA_ETGEN_OFFSET 0x000c /* Event generation register */ +#define N32_GTIMA_SMCTRL_OFFSET 0x0010 /* Slave mode control register */ +#define N32_GTIMA_DINTEN_OFFSET 0x0014 /* DMA/Interrupt enable register */ +#define N32_GTIMA_CCMOD1_OFFSET 0x0018 /* Capture/compare mode register 1 */ +#define N32_GTIMA_CCMOD2_OFFSET 0x001c /* Capture/compare mode register 2 */ +#define N32_GTIMA_CCEN_OFFSET 0x0024 /* Capture/compare enable register */ +#define N32_GTIMA_CCDAT1_OFFSET 0x0028 /* Capture/compare register 1 */ +#define N32_GTIMA_CCDAT2_OFFSET 0x002c /* Capture/compare register 2 */ +#define N32_GTIMA_CCDAT3_OFFSET 0x0030 /* Capture/compare register 3 */ +#define N32_GTIMA_CCDAT4_OFFSET 0x0034 /* Capture/compare register 4 */ +#define N32_GTIMA_PSC_OFFSET 0x0040 /* Prescaler */ +#define N32_GTIMA_AR_OFFSET 0x0044 /* Auto-reload register */ +#define N32_GTIMA_CNT_OFFSET 0x0048 /* Counter */ +#define N32_GTIMA_C1FILT_OFFSET 0x0064 /* Channel 1 filter register */ +#define N32_GTIMA_C2FILT_OFFSET 0x0068 /* Channel 2 filter register */ +#define N32_GTIMA_C3FILT_OFFSET 0x006c /* Channel 3 filter register */ +#define N32_GTIMA_C4FILT_OFFSET 0x0070 /* Channel 4 filter register */ +#define N32_GTIMA_FILTO_OFFSET 0x0074 /* Filter output register */ +#define N32_GTIMA_INSEL_OFFSET 0x0078 /* Input selection register */ +#define N32_GTIMA_DCTRL_OFFSET 0x0094 /* DMA control register */ +#define N32_GTIMA_DADDR_OFFSET 0x0098 /* DMA address for burst mode */ + +/* Register Addresses - GTIMA1 **********************************************/ + +#define N32_GTIMA1_CTRL1 (N32_GTIMERA1_BASE + N32_GTIMA_CTRL1_OFFSET) +#define N32_GTIMA1_CTRL2 (N32_GTIMERA1_BASE + N32_GTIMA_CTRL2_OFFSET) +#define N32_GTIMA1_STS (N32_GTIMERA1_BASE + N32_GTIMA_STS_OFFSET) +#define N32_GTIMA1_ETGEN (N32_GTIMERA1_BASE + N32_GTIMA_ETGEN_OFFSET) +#define N32_GTIMA1_SMCTRL (N32_GTIMERA1_BASE + N32_GTIMA_SMCTRL_OFFSET) +#define N32_GTIMA1_DINTEN (N32_GTIMERA1_BASE + N32_GTIMA_DINTEN_OFFSET) +#define N32_GTIMA1_CCMOD1 (N32_GTIMERA1_BASE + N32_GTIMA_CCMOD1_OFFSET) +#define N32_GTIMA1_CCMOD2 (N32_GTIMERA1_BASE + N32_GTIMA_CCMOD2_OFFSET) +#define N32_GTIMA1_CCEN (N32_GTIMERA1_BASE + N32_GTIMA_CCEN_OFFSET) +#define N32_GTIMA1_CCDAT1 (N32_GTIMERA1_BASE + N32_GTIMA_CCDAT1_OFFSET) +#define N32_GTIMA1_CCDAT2 (N32_GTIMERA1_BASE + N32_GTIMA_CCDAT2_OFFSET) +#define N32_GTIMA1_CCDAT3 (N32_GTIMERA1_BASE + N32_GTIMA_CCDAT3_OFFSET) +#define N32_GTIMA1_CCDAT4 (N32_GTIMERA1_BASE + N32_GTIMA_CCDAT4_OFFSET) +#define N32_GTIMA1_PSC (N32_GTIMERA1_BASE + N32_GTIMA_PSC_OFFSET) +#define N32_GTIMA1_AR (N32_GTIMERA1_BASE + N32_GTIMA_AR_OFFSET) +#define N32_GTIMA1_CNT (N32_GTIMERA1_BASE + N32_GTIMA_CNT_OFFSET) +#define N32_GTIMA1_C1FILT (N32_GTIMERA1_BASE + N32_GTIMA_C1FILT_OFFSET) +#define N32_GTIMA1_C2FILT (N32_GTIMERA1_BASE + N32_GTIMA_C2FILT_OFFSET) +#define N32_GTIMA1_C3FILT (N32_GTIMERA1_BASE + N32_GTIMA_C3FILT_OFFSET) +#define N32_GTIMA1_C4FILT (N32_GTIMERA1_BASE + N32_GTIMA_C4FILT_OFFSET) +#define N32_GTIMA1_FILTO (N32_GTIMERA1_BASE + N32_GTIMA_FILTO_OFFSET) +#define N32_GTIMA1_INSEL (N32_GTIMERA1_BASE + N32_GTIMA_INSEL_OFFSET) +#define N32_GTIMA1_DCTRL (N32_GTIMERA1_BASE + N32_GTIMA_DCTRL_OFFSET) +#define N32_GTIMA1_DADDR (N32_GTIMERA1_BASE + N32_GTIMA_DADDR_OFFSET) + +/* Register Addresses - GTIMA2 **********************************************/ + +#define N32_GTIMA2_CTRL1 (N32_GTIMERA2_BASE + N32_GTIMA_CTRL1_OFFSET) +#define N32_GTIMA2_CTRL2 (N32_GTIMERA2_BASE + N32_GTIMA_CTRL2_OFFSET) +#define N32_GTIMA2_STS (N32_GTIMERA2_BASE + N32_GTIMA_STS_OFFSET) +#define N32_GTIMA2_ETGEN (N32_GTIMERA2_BASE + N32_GTIMA_ETGEN_OFFSET) +#define N32_GTIMA2_SMCTRL (N32_GTIMERA2_BASE + N32_GTIMA_SMCTRL_OFFSET) +#define N32_GTIMA2_DINTEN (N32_GTIMERA2_BASE + N32_GTIMA_DINTEN_OFFSET) +#define N32_GTIMA2_CCMOD1 (N32_GTIMERA2_BASE + N32_GTIMA_CCMOD1_OFFSET) +#define N32_GTIMA2_CCMOD2 (N32_GTIMERA2_BASE + N32_GTIMA_CCMOD2_OFFSET) +#define N32_GTIMA2_CCEN (N32_GTIMERA2_BASE + N32_GTIMA_CCEN_OFFSET) +#define N32_GTIMA2_CCDAT1 (N32_GTIMERA2_BASE + N32_GTIMA_CCDAT1_OFFSET) +#define N32_GTIMA2_CCDAT2 (N32_GTIMERA2_BASE + N32_GTIMA_CCDAT2_OFFSET) +#define N32_GTIMA2_CCDAT3 (N32_GTIMERA2_BASE + N32_GTIMA_CCDAT3_OFFSET) +#define N32_GTIMA2_CCDAT4 (N32_GTIMERA2_BASE + N32_GTIMA_CCDAT4_OFFSET) +#define N32_GTIMA2_PSC (N32_GTIMERA2_BASE + N32_GTIMA_PSC_OFFSET) +#define N32_GTIMA2_AR (N32_GTIMERA2_BASE + N32_GTIMA_AR_OFFSET) +#define N32_GTIMA2_CNT (N32_GTIMERA2_BASE + N32_GTIMA_CNT_OFFSET) +#define N32_GTIMA2_C1FILT (N32_GTIMERA2_BASE + N32_GTIMA_C1FILT_OFFSET) +#define N32_GTIMA2_C2FILT (N32_GTIMERA2_BASE + N32_GTIMA_C2FILT_OFFSET) +#define N32_GTIMA2_C3FILT (N32_GTIMERA2_BASE + N32_GTIMA_C3FILT_OFFSET) +#define N32_GTIMA2_C4FILT (N32_GTIMERA2_BASE + N32_GTIMA_C4FILT_OFFSET) +#define N32_GTIMA2_FILTO (N32_GTIMERA2_BASE + N32_GTIMA_FILTO_OFFSET) +#define N32_GTIMA2_INSEL (N32_GTIMERA2_BASE + N32_GTIMA_INSEL_OFFSET) +#define N32_GTIMA2_DCTRL (N32_GTIMERA2_BASE + N32_GTIMA_DCTRL_OFFSET) +#define N32_GTIMA2_DADDR (N32_GTIMERA2_BASE + N32_GTIMA_DADDR_OFFSET) + +/* Register Addresses - GTIMA3 **********************************************/ + +#define N32_GTIMA3_CTRL1 (N32_GTIMERA3_BASE + N32_GTIMA_CTRL1_OFFSET) +#define N32_GTIMA3_CTRL2 (N32_GTIMERA3_BASE + N32_GTIMA_CTRL2_OFFSET) +#define N32_GTIMA3_STS (N32_GTIMERA3_BASE + N32_GTIMA_STS_OFFSET) +#define N32_GTIMA3_ETGEN (N32_GTIMERA3_BASE + N32_GTIMA_ETGEN_OFFSET) +#define N32_GTIMA3_SMCTRL (N32_GTIMERA3_BASE + N32_GTIMA_SMCTRL_OFFSET) +#define N32_GTIMA3_DINTEN (N32_GTIMERA3_BASE + N32_GTIMA_DINTEN_OFFSET) +#define N32_GTIMA3_CCMOD1 (N32_GTIMERA3_BASE + N32_GTIMA_CCMOD1_OFFSET) +#define N32_GTIMA3_CCMOD2 (N32_GTIMERA3_BASE + N32_GTIMA_CCMOD2_OFFSET) +#define N32_GTIMA3_CCEN (N32_GTIMERA3_BASE + N32_GTIMA_CCEN_OFFSET) +#define N32_GTIMA3_CCDAT1 (N32_GTIMERA3_BASE + N32_GTIMA_CCDAT1_OFFSET) +#define N32_GTIMA3_CCDAT2 (N32_GTIMERA3_BASE + N32_GTIMA_CCDAT2_OFFSET) +#define N32_GTIMA3_CCDAT3 (N32_GTIMERA3_BASE + N32_GTIMA_CCDAT3_OFFSET) +#define N32_GTIMA3_CCDAT4 (N32_GTIMERA3_BASE + N32_GTIMA_CCDAT4_OFFSET) +#define N32_GTIMA3_PSC (N32_GTIMERA3_BASE + N32_GTIMA_PSC_OFFSET) +#define N32_GTIMA3_AR (N32_GTIMERA3_BASE + N32_GTIMA_AR_OFFSET) +#define N32_GTIMA3_CNT (N32_GTIMERA3_BASE + N32_GTIMA_CNT_OFFSET) +#define N32_GTIMA3_C1FILT (N32_GTIMERA3_BASE + N32_GTIMA_C1FILT_OFFSET) +#define N32_GTIMA3_C2FILT (N32_GTIMERA3_BASE + N32_GTIMA_C2FILT_OFFSET) +#define N32_GTIMA3_C3FILT (N32_GTIMERA3_BASE + N32_GTIMA_C3FILT_OFFSET) +#define N32_GTIMA3_C4FILT (N32_GTIMERA3_BASE + N32_GTIMA_C4FILT_OFFSET) +#define N32_GTIMA3_FILTO (N32_GTIMERA3_BASE + N32_GTIMA_FILTO_OFFSET) +#define N32_GTIMA3_INSEL (N32_GTIMERA3_BASE + N32_GTIMA_INSEL_OFFSET) +#define N32_GTIMA3_DCTRL (N32_GTIMERA3_BASE + N32_GTIMA_DCTRL_OFFSET) +#define N32_GTIMA3_DADDR (N32_GTIMERA3_BASE + N32_GTIMA_DADDR_OFFSET) + +/* Register Addresses - GTIMA4 **********************************************/ + +#define N32_GTIMA4_CTRL1 (N32_GTIMERA4_BASE + N32_GTIMA_CTRL1_OFFSET) +#define N32_GTIMA4_CTRL2 (N32_GTIMERA4_BASE + N32_GTIMA_CTRL2_OFFSET) +#define N32_GTIMA4_STS (N32_GTIMERA4_BASE + N32_GTIMA_STS_OFFSET) +#define N32_GTIMA4_ETGEN (N32_GTIMERA4_BASE + N32_GTIMA_ETGEN_OFFSET) +#define N32_GTIMA4_SMCTRL (N32_GTIMERA4_BASE + N32_GTIMA_SMCTRL_OFFSET) +#define N32_GTIMA4_DINTEN (N32_GTIMERA4_BASE + N32_GTIMA_DINTEN_OFFSET) +#define N32_GTIMA4_CCMOD1 (N32_GTIMERA4_BASE + N32_GTIMA_CCMOD1_OFFSET) +#define N32_GTIMA4_CCMOD2 (N32_GTIMERA4_BASE + N32_GTIMA_CCMOD2_OFFSET) +#define N32_GTIMA4_CCEN (N32_GTIMERA4_BASE + N32_GTIMA_CCEN_OFFSET) +#define N32_GTIMA4_CCDAT1 (N32_GTIMERA4_BASE + N32_GTIMA_CCDAT1_OFFSET) +#define N32_GTIMA4_CCDAT2 (N32_GTIMERA4_BASE + N32_GTIMA_CCDAT2_OFFSET) +#define N32_GTIMA4_CCDAT3 (N32_GTIMERA4_BASE + N32_GTIMA_CCDAT3_OFFSET) +#define N32_GTIMA4_CCDAT4 (N32_GTIMERA4_BASE + N32_GTIMA_CCDAT4_OFFSET) +#define N32_GTIMA4_PSC (N32_GTIMERA4_BASE + N32_GTIMA_PSC_OFFSET) +#define N32_GTIMA4_AR (N32_GTIMERA4_BASE + N32_GTIMA_AR_OFFSET) +#define N32_GTIMA4_CNT (N32_GTIMERA4_BASE + N32_GTIMA_CNT_OFFSET) +#define N32_GTIMA4_C1FILT (N32_GTIMERA4_BASE + N32_GTIMA_C1FILT_OFFSET) +#define N32_GTIMA4_C2FILT (N32_GTIMERA4_BASE + N32_GTIMA_C2FILT_OFFSET) +#define N32_GTIMA4_C3FILT (N32_GTIMERA4_BASE + N32_GTIMA_C3FILT_OFFSET) +#define N32_GTIMA4_C4FILT (N32_GTIMERA4_BASE + N32_GTIMA_C4FILT_OFFSET) +#define N32_GTIMA4_FILTO (N32_GTIMERA4_BASE + N32_GTIMA_FILTO_OFFSET) +#define N32_GTIMA4_INSEL (N32_GTIMERA4_BASE + N32_GTIMA_INSEL_OFFSET) +#define N32_GTIMA4_DCTRL (N32_GTIMERA4_BASE + N32_GTIMA_DCTRL_OFFSET) +#define N32_GTIMA4_DADDR (N32_GTIMERA4_BASE + N32_GTIMA_DADDR_OFFSET) + +/* Register Addresses - GTIMA5 **********************************************/ + +#define N32_GTIMA5_CTRL1 (N32_GTIMERA5_BASE + N32_GTIMA_CTRL1_OFFSET) +#define N32_GTIMA5_CTRL2 (N32_GTIMERA5_BASE + N32_GTIMA_CTRL2_OFFSET) +#define N32_GTIMA5_STS (N32_GTIMERA5_BASE + N32_GTIMA_STS_OFFSET) +#define N32_GTIMA5_ETGEN (N32_GTIMERA5_BASE + N32_GTIMA_ETGEN_OFFSET) +#define N32_GTIMA5_SMCTRL (N32_GTIMERA5_BASE + N32_GTIMA_SMCTRL_OFFSET) +#define N32_GTIMA5_DINTEN (N32_GTIMERA5_BASE + N32_GTIMA_DINTEN_OFFSET) +#define N32_GTIMA5_CCMOD1 (N32_GTIMERA5_BASE + N32_GTIMA_CCMOD1_OFFSET) +#define N32_GTIMA5_CCMOD2 (N32_GTIMERA5_BASE + N32_GTIMA_CCMOD2_OFFSET) +#define N32_GTIMA5_CCEN (N32_GTIMERA5_BASE + N32_GTIMA_CCEN_OFFSET) +#define N32_GTIMA5_CCDAT1 (N32_GTIMERA5_BASE + N32_GTIMA_CCDAT1_OFFSET) +#define N32_GTIMA5_CCDAT2 (N32_GTIMERA5_BASE + N32_GTIMA_CCDAT2_OFFSET) +#define N32_GTIMA5_CCDAT3 (N32_GTIMERA5_BASE + N32_GTIMA_CCDAT3_OFFSET) +#define N32_GTIMA5_CCDAT4 (N32_GTIMERA5_BASE + N32_GTIMA_CCDAT4_OFFSET) +#define N32_GTIMA5_PSC (N32_GTIMERA5_BASE + N32_GTIMA_PSC_OFFSET) +#define N32_GTIMA5_AR (N32_GTIMERA5_BASE + N32_GTIMA_AR_OFFSET) +#define N32_GTIMA5_CNT (N32_GTIMERA5_BASE + N32_GTIMA_CNT_OFFSET) +#define N32_GTIMA5_C1FILT (N32_GTIMERA5_BASE + N32_GTIMA_C1FILT_OFFSET) +#define N32_GTIMA5_C2FILT (N32_GTIMERA5_BASE + N32_GTIMA_C2FILT_OFFSET) +#define N32_GTIMA5_C3FILT (N32_GTIMERA5_BASE + N32_GTIMA_C3FILT_OFFSET) +#define N32_GTIMA5_C4FILT (N32_GTIMERA5_BASE + N32_GTIMA_C4FILT_OFFSET) +#define N32_GTIMA5_FILTO (N32_GTIMERA5_BASE + N32_GTIMA_FILTO_OFFSET) +#define N32_GTIMA5_INSEL (N32_GTIMERA5_BASE + N32_GTIMA_INSEL_OFFSET) +#define N32_GTIMA5_DCTRL (N32_GTIMERA5_BASE + N32_GTIMA_DCTRL_OFFSET) +#define N32_GTIMA5_DADDR (N32_GTIMERA5_BASE + N32_GTIMA_DADDR_OFFSET) + +/* Register Addresses - GTIMA6 **********************************************/ + +#define N32_GTIMA6_CTRL1 (N32_GTIMERA6_BASE + N32_GTIMA_CTRL1_OFFSET) +#define N32_GTIMA6_CTRL2 (N32_GTIMERA6_BASE + N32_GTIMA_CTRL2_OFFSET) +#define N32_GTIMA6_STS (N32_GTIMERA6_BASE + N32_GTIMA_STS_OFFSET) +#define N32_GTIMA6_ETGEN (N32_GTIMERA6_BASE + N32_GTIMA_ETGEN_OFFSET) +#define N32_GTIMA6_SMCTRL (N32_GTIMERA6_BASE + N32_GTIMA_SMCTRL_OFFSET) +#define N32_GTIMA6_DINTEN (N32_GTIMERA6_BASE + N32_GTIMA_DINTEN_OFFSET) +#define N32_GTIMA6_CCMOD1 (N32_GTIMERA6_BASE + N32_GTIMA_CCMOD1_OFFSET) +#define N32_GTIMA6_CCMOD2 (N32_GTIMERA6_BASE + N32_GTIMA_CCMOD2_OFFSET) +#define N32_GTIMA6_CCEN (N32_GTIMERA6_BASE + N32_GTIMA_CCEN_OFFSET) +#define N32_GTIMA6_CCDAT1 (N32_GTIMERA6_BASE + N32_GTIMA_CCDAT1_OFFSET) +#define N32_GTIMA6_CCDAT2 (N32_GTIMERA6_BASE + N32_GTIMA_CCDAT2_OFFSET) +#define N32_GTIMA6_CCDAT3 (N32_GTIMERA6_BASE + N32_GTIMA_CCDAT3_OFFSET) +#define N32_GTIMA6_CCDAT4 (N32_GTIMERA6_BASE + N32_GTIMA_CCDAT4_OFFSET) +#define N32_GTIMA6_PSC (N32_GTIMERA6_BASE + N32_GTIMA_PSC_OFFSET) +#define N32_GTIMA6_AR (N32_GTIMERA6_BASE + N32_GTIMA_AR_OFFSET) +#define N32_GTIMA6_CNT (N32_GTIMERA6_BASE + N32_GTIMA_CNT_OFFSET) +#define N32_GTIMA6_C1FILT (N32_GTIMERA6_BASE + N32_GTIMA_C1FILT_OFFSET) +#define N32_GTIMA6_C2FILT (N32_GTIMERA6_BASE + N32_GTIMA_C2FILT_OFFSET) +#define N32_GTIMA6_C3FILT (N32_GTIMERA6_BASE + N32_GTIMA_C3FILT_OFFSET) +#define N32_GTIMA6_C4FILT (N32_GTIMERA6_BASE + N32_GTIMA_C4FILT_OFFSET) +#define N32_GTIMA6_FILTO (N32_GTIMERA6_BASE + N32_GTIMA_FILTO_OFFSET) +#define N32_GTIMA6_INSEL (N32_GTIMERA6_BASE + N32_GTIMA_INSEL_OFFSET) +#define N32_GTIMA6_DCTRL (N32_GTIMERA6_BASE + N32_GTIMA_DCTRL_OFFSET) +#define N32_GTIMA6_DADDR (N32_GTIMERA6_BASE + N32_GTIMA_DADDR_OFFSET) + +/* Register Addresses - GTIMA7 **********************************************/ + +#define N32_GTIMA7_CTRL1 (N32_GTIMERA7_BASE + N32_GTIMA_CTRL1_OFFSET) +#define N32_GTIMA7_CTRL2 (N32_GTIMERA7_BASE + N32_GTIMA_CTRL2_OFFSET) +#define N32_GTIMA7_STS (N32_GTIMERA7_BASE + N32_GTIMA_STS_OFFSET) +#define N32_GTIMA7_ETGEN (N32_GTIMERA7_BASE + N32_GTIMA_ETGEN_OFFSET) +#define N32_GTIMA7_SMCTRL (N32_GTIMERA7_BASE + N32_GTIMA_SMCTRL_OFFSET) +#define N32_GTIMA7_DINTEN (N32_GTIMERA7_BASE + N32_GTIMA_DINTEN_OFFSET) +#define N32_GTIMA7_CCMOD1 (N32_GTIMERA7_BASE + N32_GTIMA_CCMOD1_OFFSET) +#define N32_GTIMA7_CCMOD2 (N32_GTIMERA7_BASE + N32_GTIMA_CCMOD2_OFFSET) +#define N32_GTIMA7_CCEN (N32_GTIMERA7_BASE + N32_GTIMA_CCEN_OFFSET) +#define N32_GTIMA7_CCDAT1 (N32_GTIMERA7_BASE + N32_GTIMA_CCDAT1_OFFSET) +#define N32_GTIMA7_CCDAT2 (N32_GTIMERA7_BASE + N32_GTIMA_CCDAT2_OFFSET) +#define N32_GTIMA7_CCDAT3 (N32_GTIMERA7_BASE + N32_GTIMA_CCDAT3_OFFSET) +#define N32_GTIMA7_CCDAT4 (N32_GTIMERA7_BASE + N32_GTIMA_CCDAT4_OFFSET) +#define N32_GTIMA7_PSC (N32_GTIMERA7_BASE + N32_GTIMA_PSC_OFFSET) +#define N32_GTIMA7_AR (N32_GTIMERA7_BASE + N32_GTIMA_AR_OFFSET) +#define N32_GTIMA7_CNT (N32_GTIMERA7_BASE + N32_GTIMA_CNT_OFFSET) +#define N32_GTIMA7_C1FILT (N32_GTIMERA7_BASE + N32_GTIMA_C1FILT_OFFSET) +#define N32_GTIMA7_C2FILT (N32_GTIMERA7_BASE + N32_GTIMA_C2FILT_OFFSET) +#define N32_GTIMA7_C3FILT (N32_GTIMERA7_BASE + N32_GTIMA_C3FILT_OFFSET) +#define N32_GTIMA7_C4FILT (N32_GTIMERA7_BASE + N32_GTIMA_C4FILT_OFFSET) +#define N32_GTIMA7_FILTO (N32_GTIMERA7_BASE + N32_GTIMA_FILTO_OFFSET) +#define N32_GTIMA7_INSEL (N32_GTIMERA7_BASE + N32_GTIMA_INSEL_OFFSET) +#define N32_GTIMA7_DCTRL (N32_GTIMERA7_BASE + N32_GTIMA_DCTRL_OFFSET) +#define N32_GTIMA7_DADDR (N32_GTIMERA7_BASE + N32_GTIMA_DADDR_OFFSET) + +/* Bitfield Definitions - GTIMA *********************************************/ + +/* Control register 1 (N32_GTIMA_CTRL1) */ + +#define N32_GTIMA_CTRL1_CNTEN (1 << 0) /* Counter enable */ +#define N32_GTIMA_CTRL1_DIR (1 << 1) /* Direction */ +#define N32_GTIMA_CTRL1_CAMSEL_SHIFT (2) /* Center-aligned mode selection */ +#define N32_GTIMA_CTRL1_CAMSEL_MASK (3 << N32_GTIMA_CTRL1_CAMSEL_SHIFT) +# define N32_GTIMA_CTRL1_EDGE (0 << N32_GTIMA_CTRL1_CAMSEL_SHIFT) +# define N32_GTIMA_CTRL1_CENTER1 (1 << N32_GTIMA_CTRL1_CAMSEL_SHIFT) +# define N32_GTIMA_CTRL1_CENTER2 (2 << N32_GTIMA_CTRL1_CAMSEL_SHIFT) +# define N32_GTIMA_CTRL1_CENTER3 (3 << N32_GTIMA_CTRL1_CAMSEL_SHIFT) +#define N32_GTIMA_CTRL1_UPRS (1 << 4) /* Update request source */ +#define N32_GTIMA_CTRL1_UPDIS (1 << 5) /* Update disable */ +#define N32_GTIMA_CTRL1_CLKD_SHIFT (6) /* Clock division */ +#define N32_GTIMA_CTRL1_CLKD_MASK (3 << N32_GTIMA_CTRL1_CLKD_SHIFT) +# define N32_GTIMA_CTRL1_TCKINT (0 << N32_GTIMA_CTRL1_CLKD_SHIFT) +# define N32_GTIMA_CTRL1_2TCKINT (1 << N32_GTIMA_CTRL1_CLKD_SHIFT) +# define N32_GTIMA_CTRL1_4TCKINT (2 << N32_GTIMA_CTRL1_CLKD_SHIFT) +#define N32_GTIMA_CTRL1_ONEPM (1 << 8) /* One pulse mode */ +#define N32_GTIMA_CTRL1_ARPEN (1 << 9) /* Auto-reload preload enable */ +#define N32_GTIMA_CTRL1_CLRSEL (1 << 13) /* OcxRef clear selection */ + +/* GTIMA1-specific channel source selection */ +#define N32_GTIMA_CTRL1_C1SEL (1 << 16) /* GTIMA1: LSE for CH1 */ +#define N32_GTIMA_CTRL1_C2SEL (1 << 17) /* GTIMA1: LSE for CH2 */ +#define N32_GTIMA_CTRL1_C3SEL (1 << 18) /* GTIMA1: LSI for CH3 */ +#define N32_GTIMA_CTRL1_C4SEL (1 << 19) /* GTIMA1: HSE/128 for CH4 */ + +/* Control register 2 (N32_GTIMA_CTRL2) */ + +#define N32_GTIMA_CTRL2_MMSEL_SHIFT (4) /* Master mode selection (TRGO) */ +#define N32_GTIMA_CTRL2_MMSEL_MASK (7 << N32_GTIMA_CTRL2_MMSEL_SHIFT) +# define N32_GTIMA_CTRL2_MMSEL_RESET (0 << N32_GTIMA_CTRL2_MMSEL_SHIFT) +# define N32_GTIMA_CTRL2_MMSEL_ENABLE (1 << N32_GTIMA_CTRL2_MMSEL_SHIFT) +# define N32_GTIMA_CTRL2_MMSEL_UPDATE (2 << N32_GTIMA_CTRL2_MMSEL_SHIFT) +# define N32_GTIMA_CTRL2_MMSEL_COMPP (3 << N32_GTIMA_CTRL2_MMSEL_SHIFT) +# define N32_GTIMA_CTRL2_MMSEL_OC1REF (4 << N32_GTIMA_CTRL2_MMSEL_SHIFT) +# define N32_GTIMA_CTRL2_MMSEL_OC2REF (5 << N32_GTIMA_CTRL2_MMSEL_SHIFT) +# define N32_GTIMA_CTRL2_MMSEL_OC3REF (6 << N32_GTIMA_CTRL2_MMSEL_SHIFT) +# define N32_GTIMA_CTRL2_MMSEL_OC4REF (7 << N32_GTIMA_CTRL2_MMSEL_SHIFT) + +/* Status register (N32_GTIMA_STS) */ + +#define N32_GTIMA_STS_CC1ITF (1 << 0) /* CC1 interrupt flag */ +#define N32_GTIMA_STS_CC2ITF (1 << 1) /* CC2 interrupt flag */ +#define N32_GTIMA_STS_CC3ITF (1 << 2) /* CC3 interrupt flag */ +#define N32_GTIMA_STS_CC4ITF (1 << 3) /* CC4 interrupt flag */ +#define N32_GTIMA_STS_CC1OCF (1 << 8) /* CC1 overcapture flag */ +#define N32_GTIMA_STS_CC2OCF (1 << 9) /* CC2 overcapture flag */ +#define N32_GTIMA_STS_CC3OCF (1 << 10) /* CC3 overcapture flag */ +#define N32_GTIMA_STS_CC4OCF (1 << 11) /* CC4 overcapture flag */ +#define N32_GTIMA_STS_UDITF (1 << 16) /* Update interrupt flag */ +#define N32_GTIMA_STS_TITF (1 << 18) /* Trigger interrupt flag */ + +/* Event generation register (N32_GTIMA_ETGEN) */ + +#define N32_GTIMA_ETGEN_CC1GN (1 << 0) /* CC1 generation */ +#define N32_GTIMA_ETGEN_CC2GN (1 << 1) /* CC2 generation */ +#define N32_GTIMA_ETGEN_CC3GN (1 << 2) /* CC3 generation */ +#define N32_GTIMA_ETGEN_CC4GN (1 << 3) /* CC4 generation */ +#define N32_GTIMA_ETGEN_UDGN (1 << 8) /* Update generation */ +#define N32_GTIMA_ETGEN_TGN (1 << 10) /* Trigger generation */ + +/* Slave mode control (N32_GTIMA_SMCTRL) */ + +#define N32_GTIMA_SMCTRL_TSEL_SHIFT (0) /* Trigger selection */ +#define N32_GTIMA_SMCTRL_TSEL_MASK (7 << N32_GTIMA_SMCTRL_TSEL_SHIFT) +# define N32_GTIMA_SMCTRL_ITR (0 << N32_GTIMA_SMCTRL_TSEL_SHIFT) +# define N32_GTIMA_SMCTRL_TI1FED (4 << N32_GTIMA_SMCTRL_TSEL_SHIFT) +# define N32_GTIMA_SMCTRL_TI1FP1 (5 << N32_GTIMA_SMCTRL_TSEL_SHIFT) +# define N32_GTIMA_SMCTRL_TI2FP2 (6 << N32_GTIMA_SMCTRL_TSEL_SHIFT) +# define N32_GTIMA_SMCTRL_ETRF (7 << N32_GTIMA_SMCTRL_TSEL_SHIFT) +#define N32_GTIMA_SMCTRL_SMSEL_SHIFT (4) /* Slave mode selection */ +#define N32_GTIMA_SMCTRL_SMSEL_MASK (15 << N32_GTIMA_SMCTRL_SMSEL_SHIFT) +# define N32_GTIMA_SMCTRL_DISAB (0 << N32_GTIMA_SMCTRL_SMSEL_SHIFT) +# define N32_GTIMA_SMCTRL_ENCMD1 (1 << N32_GTIMA_SMCTRL_SMSEL_SHIFT) +# define N32_GTIMA_SMCTRL_ENCMD2 (2 << N32_GTIMA_SMCTRL_SMSEL_SHIFT) +# define N32_GTIMA_SMCTRL_ENCMD3 (3 << N32_GTIMA_SMCTRL_SMSEL_SHIFT) +# define N32_GTIMA_SMCTRL_RESET (4 << N32_GTIMA_SMCTRL_SMSEL_SHIFT) +# define N32_GTIMA_SMCTRL_GATED (5 << N32_GTIMA_SMCTRL_SMSEL_SHIFT) +# define N32_GTIMA_SMCTRL_TRIGGER (6 << N32_GTIMA_SMCTRL_SMSEL_SHIFT) +# define N32_GTIMA_SMCTRL_EXTCLK1 (7 << N32_GTIMA_SMCTRL_SMSEL_SHIFT) +#define N32_GTIMA_SMCTRL_EXTPS_SHIFT (8) /* External trigger prescaler */ +#define N32_GTIMA_SMCTRL_EXTPS_MASK (3 << N32_GTIMA_SMCTRL_EXTPS_SHIFT) +# define N32_GTIMA_SMCTRL_PSCOFF (0 << N32_GTIMA_SMCTRL_EXTPS_SHIFT) +# define N32_GTIMA_SMCTRL_ETRPd2 (1 << N32_GTIMA_SMCTRL_EXTPS_SHIFT) +# define N32_GTIMA_SMCTRL_ETRPd4 (2 << N32_GTIMA_SMCTRL_EXTPS_SHIFT) +# define N32_GTIMA_SMCTRL_ETRPd8 (3 << N32_GTIMA_SMCTRL_EXTPS_SHIFT) +#define N32_GTIMA_SMCTRL_EXCEN (1 << 10) /* External clock enable */ +#define N32_GTIMA_SMCTRL_EXTP (1 << 11) /* External trigger polarity */ +#define N32_GTIMA_SMCTRL_EXTF_SHIFT (12) /* External trigger filter */ +#define N32_GTIMA_SMCTRL_EXTF_MASK (15 << N32_GTIMA_SMCTRL_EXTF_SHIFT) +#define N32_GTIMA_SMCTRL_MSMD (1 << 16) /* Master/slave mode */ +#define N32_GTIMA_SMCTRL_OCRECFLRP (1 << 19) /* tim_ocref_clr polarity */ +#define N32_GTIMA_SMCTRL_OCRECFLRF_SHIFT (20) /* tim_ocref_clr filter */ +#define N32_GTIMA_SMCTRL_OCRECFLRF_MASK (15 << N32_GTIMA_SMCTRL_OCRECFLRF_SHIFT) + +/* DMA/Interrupt enable (N32_GTIMA_DINTEN) */ + +#define N32_GTIMA_DINTEN_CC1IEN (1 << 0) /* CC1 interrupt enable */ +#define N32_GTIMA_DINTEN_CC2IEN (1 << 1) /* CC2 interrupt enable */ +#define N32_GTIMA_DINTEN_CC3IEN (1 << 2) /* CC3 interrupt enable */ +#define N32_GTIMA_DINTEN_CC4IEN (1 << 3) /* CC4 interrupt enable */ +#define N32_GTIMA_DINTEN_CC1DEN (1 << 8) /* CC1 DMA request enable */ +#define N32_GTIMA_DINTEN_CC2DEN (1 << 9) /* CC2 DMA request enable */ +#define N32_GTIMA_DINTEN_CC3DEN (1 << 10) /* CC3 DMA request enable */ +#define N32_GTIMA_DINTEN_CC4DEN (1 << 11) /* CC4 DMA request enable */ +#define N32_GTIMA_DINTEN_UIEN (1 << 16) /* Update interrupt enable */ +#define N32_GTIMA_DINTEN_TIEN (1 << 17) /* Trigger interrupt enable */ +#define N32_GTIMA_DINTEN_UDEN (1 << 19) /* Update DMA request enable */ +#define N32_GTIMA_DINTEN_TDEN (1 << 21) /* Trigger DMA request enable */ + +/* CCMOD1 - Output compare (N32_GTIMA_CCMOD1) */ + +#define N32_GTIMA_CCMOD1_CC1SEL_SHIFT (0) /* CC1 selection */ +#define N32_GTIMA_CCMOD1_CC1SEL_MASK (3 << N32_GTIMA_CCMOD1_CC1SEL_SHIFT) +# define N32_GTIMA_CCMOD1_CC1OUT (0 << N32_GTIMA_CCMOD1_CC1SEL_SHIFT) +# define N32_GTIMA_CCMOD1_CC1IN_TI1 (1 << N32_GTIMA_CCMOD1_CC1SEL_SHIFT) +# define N32_GTIMA_CCMOD1_CC1IN_TI2 (2 << N32_GTIMA_CCMOD1_CC1SEL_SHIFT) +# define N32_GTIMA_CCMOD1_CC1IN_TRC (3 << N32_GTIMA_CCMOD1_CC1SEL_SHIFT) +#define N32_GTIMA_CCMOD1_OC1PEN (1 << 2) /* OC1 preload enable */ +#define N32_GTIMA_CCMOD1_OC1FEN (1 << 3) /* OC1 fast enable */ +#define N32_GTIMA_CCMOD1_OC1CEN (1 << 4) /* OC1 clear enable */ +#define N32_GTIMA_CCMOD1_OC1MD_SHIFT (5) /* OC1 mode */ +#define N32_GTIMA_CCMOD1_OC1MD_MASK (7 << N32_GTIMA_CCMOD1_OC1MD_SHIFT) +#define N32_GTIMA_CCMOD1_CC2SEL_SHIFT (8) /* CC2 selection */ +#define N32_GTIMA_CCMOD1_CC2SEL_MASK (3 << N32_GTIMA_CCMOD1_CC2SEL_SHIFT) +# define N32_GTIMA_CCMOD1_CC2OUT (0 << N32_GTIMA_CCMOD1_CC2SEL_SHIFT) +# define N32_GTIMA_CCMOD1_CC2IN_TI2 (1 << N32_GTIMA_CCMOD1_CC2SEL_SHIFT) +# define N32_GTIMA_CCMOD1_CC2IN_TI1 (2 << N32_GTIMA_CCMOD1_CC2SEL_SHIFT) +# define N32_GTIMA_CCMOD1_CC2IN_TRC (3 << N32_GTIMA_CCMOD1_CC2SEL_SHIFT) +#define N32_GTIMA_CCMOD1_OC2PEN (1 << 10) /* OC2 preload enable */ +#define N32_GTIMA_CCMOD1_OC2FEN (1 << 11) /* OC2 fast enable */ +#define N32_GTIMA_CCMOD1_OC2CEN (1 << 12) /* OC2 clear enable */ +#define N32_GTIMA_CCMOD1_OC2MD_SHIFT (13) /* OC2 mode */ +#define N32_GTIMA_CCMOD1_OC2MD_MASK (7 << N32_GTIMA_CCMOD1_OC2MD_SHIFT) + +/* CCMOD1 - Input capture (N32_GTIMA_CCMOD1) */ + +#define N32_GTIMA_CCMOD1_IC1PSC_SHIFT (2) /* IC1 prescaler */ +#define N32_GTIMA_CCMOD1_IC1PSC_MASK (3 << N32_GTIMA_CCMOD1_IC1PSC_SHIFT) +#define N32_GTIMA_CCMOD1_IC1F_SHIFT (4) /* IC1 filter */ +#define N32_GTIMA_CCMOD1_IC1F_MASK (15 << N32_GTIMA_CCMOD1_IC1F_SHIFT) +#define N32_GTIMA_CCMOD1_IC2PSC_SHIFT (10) /* IC2 prescaler */ +#define N32_GTIMA_CCMOD1_IC2PSC_MASK (3 << N32_GTIMA_CCMOD1_IC2PSC_SHIFT) +#define N32_GTIMA_CCMOD1_IC2F_SHIFT (12) /* IC2 filter */ +#define N32_GTIMA_CCMOD1_IC2F_MASK (15 << N32_GTIMA_CCMOD1_IC2F_SHIFT) + +/* CCMOD2 - Output compare (N32_GTIMA_CCMOD2) */ + +#define N32_GTIMA_CCMOD2_CC3SEL_SHIFT (0) /* CC3 selection */ +#define N32_GTIMA_CCMOD2_CC3SEL_MASK (3 << N32_GTIMA_CCMOD2_CC3SEL_SHIFT) +# define N32_GTIMA_CCMOD2_CC3OUT (0 << N32_GTIMA_CCMOD2_CC3SEL_SHIFT) +# define N32_GTIMA_CCMOD2_CC3IN_TI3 (1 << N32_GTIMA_CCMOD2_CC3SEL_SHIFT) +# define N32_GTIMA_CCMOD2_CC3IN_TI4 (2 << N32_GTIMA_CCMOD2_CC3SEL_SHIFT) +# define N32_GTIMA_CCMOD2_CC3IN_TRC (3 << N32_GTIMA_CCMOD2_CC3SEL_SHIFT) +#define N32_GTIMA_CCMOD2_OC3PEN (1 << 2) /* OC3 preload enable */ +#define N32_GTIMA_CCMOD2_OC3FEN (1 << 3) /* OC3 fast enable */ +#define N32_GTIMA_CCMOD2_OC3CEN (1 << 4) /* OC3 clear enable */ +#define N32_GTIMA_CCMOD2_OC3MD_SHIFT (5) /* OC3 mode */ +#define N32_GTIMA_CCMOD2_OC3MD_MASK (7 << N32_GTIMA_CCMOD2_OC3MD_SHIFT) +#define N32_GTIMA_CCMOD2_CC4SEL_SHIFT (8) /* CC4 selection */ +#define N32_GTIMA_CCMOD2_CC4SEL_MASK (3 << N32_GTIMA_CCMOD2_CC4SEL_SHIFT) +# define N32_GTIMA_CCMOD2_CC4OUT (0 << N32_GTIMA_CCMOD2_CC4SEL_SHIFT) +# define N32_GTIMA_CCMOD2_CC4IN_TI4 (1 << N32_GTIMA_CCMOD2_CC4SEL_SHIFT) +# define N32_GTIMA_CCMOD2_CC4IN_TI3 (2 << N32_GTIMA_CCMOD2_CC4SEL_SHIFT) +# define N32_GTIMA_CCMOD2_CC4IN_TRC (3 << N32_GTIMA_CCMOD2_CC4SEL_SHIFT) +#define N32_GTIMA_CCMOD2_OC4PEN (1 << 10) /* OC4 preload enable */ +#define N32_GTIMA_CCMOD2_OC4FEN (1 << 11) /* OC4 fast enable */ +#define N32_GTIMA_CCMOD2_OC4CEN (1 << 12) /* OC4 clear enable */ +#define N32_GTIMA_CCMOD2_OC4MD_SHIFT (13) /* OC4 mode */ +#define N32_GTIMA_CCMOD2_OC4MD_MASK (7 << N32_GTIMA_CCMOD2_OC4MD_SHIFT) + +/* CCMOD2 - Input capture (N32_GTIMA_CCMOD2) */ + +#define N32_GTIMA_CCMOD2_IC3PSC_SHIFT (2) /* IC3 prescaler */ +#define N32_GTIMA_CCMOD2_IC3PSC_MASK (3 << N32_GTIMA_CCMOD2_IC3PSC_SHIFT) +#define N32_GTIMA_CCMOD2_IC3F_SHIFT (4) /* IC3 filter */ +#define N32_GTIMA_CCMOD2_IC3F_MASK (15 << N32_GTIMA_CCMOD2_IC3F_SHIFT) +#define N32_GTIMA_CCMOD2_IC4PSC_SHIFT (10) /* IC4 prescaler */ +#define N32_GTIMA_CCMOD2_IC4PSC_MASK (3 << N32_GTIMA_CCMOD2_IC4PSC_SHIFT) +#define N32_GTIMA_CCMOD2_IC4F_SHIFT (12) /* IC4 filter */ +#define N32_GTIMA_CCMOD2_IC4F_MASK (15 << N32_GTIMA_CCMOD2_IC4F_SHIFT) + +/* CCEN (N32_GTIMA_CCEN) - No complementary outputs */ + +#define N32_GTIMA_CCEN_CC1EN (1 << 0) /* CC1 output enable */ +#define N32_GTIMA_CCEN_CC1P (1 << 1) /* CC1 output polarity */ +#define N32_GTIMA_CCEN_CC2EN (1 << 2) /* CC2 output enable */ +#define N32_GTIMA_CCEN_CC2P (1 << 3) /* CC2 output polarity */ +#define N32_GTIMA_CCEN_CC3EN (1 << 4) /* CC3 output enable */ +#define N32_GTIMA_CCEN_CC3P (1 << 5) /* CC3 output polarity */ +#define N32_GTIMA_CCEN_CC4EN (1 << 6) /* CC4 output enable */ +#define N32_GTIMA_CCEN_CC4P (1 << 7) /* CC4 output polarity */ + +/* CCDAT registers, PSC, AR, CNT */ + +#define N32_GTIMA_CCDAT_MASK (0xffff) /* CCx value mask */ +#define N32_GTIMA_PSC_MASK (0xffff) /* Prescaler value mask */ +#define N32_GTIMA_AR_MASK (0xffff) /* Auto-reload value mask */ +#define N32_GTIMA_CNT_MASK (0xffff) /* Counter value mask */ + +/* Filter registers (C1FILT..C4FILT) */ + +#define N32_GTIMA_CXFILT_SLIDFPSC_MASK (0xffff) /* Sampling clock prescaler */ +#define N32_GTIMA_CXFILT_FILTEN (1 << 16) /* Filter enable */ +#define N32_GTIMA_CXFILT_WSIZE_SHIFT (17) /* Window size */ +#define N32_GTIMA_CXFILT_WSIZE_MASK (63 << N32_GTIMA_CXFILT_WSIZE_SHIFT) +#define N32_GTIMA_CXFILT_THRESH_SHIFT (24) /* Threshold */ +#define N32_GTIMA_CXFILT_THRESH_MASK (63 << N32_GTIMA_CXFILT_THRESH_SHIFT) + +/* FILTO register */ + +#define N32_GTIMA_FILTO_C1FILTO (1 << 0) /* Channel 1 filter output */ +#define N32_GTIMA_FILTO_C2FILTO (1 << 1) /* Channel 2 filter output */ +#define N32_GTIMA_FILTO_C3FILTO (1 << 2) /* Channel 3 filter output */ +#define N32_GTIMA_FILTO_C4FILTO (1 << 3) /* Channel 4 filter output */ + +/* INSEL (same as ATIM) */ + +#define N32_GTIMA_INSEL_TI1S_SHIFT (0) /* TI1 input selection */ +#define N32_GTIMA_INSEL_TI1S_MASK (15 << N32_GTIMA_INSEL_TI1S_SHIFT) +#define N32_GTIMA_INSEL_TI2S_SHIFT (4) /* TI2 input selection */ +#define N32_GTIMA_INSEL_TI2S_MASK (15 << N32_GTIMA_INSEL_TI2S_SHIFT) +#define N32_GTIMA_INSEL_TI3S_SHIFT (8) /* TI3 input selection */ +#define N32_GTIMA_INSEL_TI3S_MASK (15 << N32_GTIMA_INSEL_TI3S_SHIFT) +#define N32_GTIMA_INSEL_TI4S_SHIFT (12) /* TI4 input selection */ +#define N32_GTIMA_INSEL_TI4S_MASK (15 << N32_GTIMA_INSEL_TI4S_SHIFT) +#define N32_GTIMA_INSEL_ETRS_SHIFT (16) /* ETR input selection */ +#define N32_GTIMA_INSEL_ETRS_MASK (15 << N32_GTIMA_INSEL_ETRS_SHIFT) +#define N32_GTIMA_INSEL_ITRS_SHIFT (20) /* ITR input selection */ +#define N32_GTIMA_INSEL_ITRS_MASK (15 << N32_GTIMA_INSEL_ITRS_SHIFT) +#define N32_GTIMA_INSEL_CLRS_SHIFT (24) /* OcxRef clear input selection */ +#define N32_GTIMA_INSEL_CLRS_MASK (15 << N32_GTIMA_INSEL_CLRS_SHIFT) + +/* DCTRL/DADDR */ + +#define N32_GTIMA_DCTRL_DBLEN_SHIFT (0) /* DMA burst length */ +#define N32_GTIMA_DCTRL_DBLEN_MASK (63 << N32_GTIMA_DCTRL_DBLEN_SHIFT) +# define N32_GTIMA_DCTRL_DBLEN(n) (((n)-1) << N32_GTIMA_DCTRL_DBLEN_SHIFT) +#define N32_GTIMA_DCTRL_DBADDR_SHIFT (8) /* DMA base address */ +#define N32_GTIMA_DCTRL_DBADDR_MASK (63 << N32_GTIMA_DCTRL_DBADDR_SHIFT) +#define N32_GTIMA_DADDR_BURST_MASK (0xffffffff) + +/* ========================================================================== + * GENERAL-PURPOSE TIMERS B (GTIMB1-3) + * ========================================================================== + */ + +/* Register Offsets - GTIMB (common for all GTIMB1-3) ***********************/ + +#define N32_GTIMB_CTRL1_OFFSET 0x0000 /* Control register 1 */ +#define N32_GTIMB_CTRL2_OFFSET 0x0004 /* Control register 2 */ +#define N32_GTIMB_STS_OFFSET 0x0008 /* Status register */ +#define N32_GTIMB_ETGEN_OFFSET 0x000c /* Event generation register */ +#define N32_GTIMB_SMCTRL_OFFSET 0x0010 /* Slave mode control register */ +#define N32_GTIMB_DINTEN_OFFSET 0x0014 /* DMA/Interrupt enable register */ +#define N32_GTIMB_CCMOD1_OFFSET 0x0018 /* Capture/compare mode register 1 */ +#define N32_GTIMB_CCMOD2_OFFSET 0x001c /* Capture/compare mode register 2 */ +#define N32_GTIMB_CCMOD3_OFFSET 0x0020 /* Capture/compare mode register 3 */ +#define N32_GTIMB_CCEN_OFFSET 0x0024 /* Capture/compare enable register */ +#define N32_GTIMB_CCDAT1_OFFSET 0x0028 /* Capture/compare register 1 */ +#define N32_GTIMB_CCDAT2_OFFSET 0x002c /* Capture/compare register 2 */ +#define N32_GTIMB_CCDAT3_OFFSET 0x0030 /* Capture/compare register 3 */ +#define N32_GTIMB_CCDAT4_OFFSET 0x0034 /* Capture/compare register 4 */ +#define N32_GTIMB_CCDAT5_OFFSET 0x0038 /* Capture/compare register 5 */ +#define N32_GTIMB_PSC_OFFSET 0x0040 /* Prescaler */ +#define N32_GTIMB_AR_OFFSET 0x0044 /* Auto-reload register */ +#define N32_GTIMB_CNT_OFFSET 0x0048 /* Counter */ +#define N32_GTIMB_REPCNT_OFFSET 0x004c /* Repetition counter register */ +#define N32_GTIMB_BKDT_OFFSET 0x0050 /* Break and dead-time register */ +#define N32_GTIMB_BKFR_OFFSET 0x0060 /* Break 1 filter register */ +#define N32_GTIMB_C1FILT_OFFSET 0x0064 /* Channel 1 filter register */ +#define N32_GTIMB_C2FILT_OFFSET 0x0068 /* Channel 2 filter register */ +#define N32_GTIMB_C3FILT_OFFSET 0x006c /* Channel 3 filter register */ +#define N32_GTIMB_C4FILT_OFFSET 0x0070 /* Channel 4 filter register */ +#define N32_GTIMB_FILTO_OFFSET 0x0074 /* Filter output register */ +#define N32_GTIMB_INSEL_OFFSET 0x0078 /* Input selection register */ +#define N32_GTIMB_AF1_OFFSET 0x007c /* Alternate function register 1 */ +#define N32_GTIMB_DCTRL_OFFSET 0x0094 /* DMA control register */ +#define N32_GTIMB_DADDR_OFFSET 0x0098 /* DMA address for burst mode */ + +/* Register Addresses - GTIMB1 **********************************************/ + +#define N32_GTIMB1_CTRL1 (N32_GTIMERB1_BASE + N32_GTIMB_CTRL1_OFFSET) +#define N32_GTIMB1_CTRL2 (N32_GTIMERB1_BASE + N32_GTIMB_CTRL2_OFFSET) +#define N32_GTIMB1_STS (N32_GTIMERB1_BASE + N32_GTIMB_STS_OFFSET) +#define N32_GTIMB1_ETGEN (N32_GTIMERB1_BASE + N32_GTIMB_ETGEN_OFFSET) +#define N32_GTIMB1_SMCTRL (N32_GTIMERB1_BASE + N32_GTIMB_SMCTRL_OFFSET) +#define N32_GTIMB1_DINTEN (N32_GTIMERB1_BASE + N32_GTIMB_DINTEN_OFFSET) +#define N32_GTIMB1_CCMOD1 (N32_GTIMERB1_BASE + N32_GTIMB_CCMOD1_OFFSET) +#define N32_GTIMB1_CCMOD2 (N32_GTIMERB1_BASE + N32_GTIMB_CCMOD2_OFFSET) +#define N32_GTIMB1_CCMOD3 (N32_GTIMERB1_BASE + N32_GTIMB_CCMOD3_OFFSET) +#define N32_GTIMB1_CCEN (N32_GTIMERB1_BASE + N32_GTIMB_CCEN_OFFSET) +#define N32_GTIMB1_CCDAT1 (N32_GTIMERB1_BASE + N32_GTIMB_CCDAT1_OFFSET) +#define N32_GTIMB1_CCDAT2 (N32_GTIMERB1_BASE + N32_GTIMB_CCDAT2_OFFSET) +#define N32_GTIMB1_CCDAT3 (N32_GTIMERB1_BASE + N32_GTIMB_CCDAT3_OFFSET) +#define N32_GTIMB1_CCDAT4 (N32_GTIMERB1_BASE + N32_GTIMB_CCDAT4_OFFSET) +#define N32_GTIMB1_CCDAT5 (N32_GTIMERB1_BASE + N32_GTIMB_CCDAT5_OFFSET) +#define N32_GTIMB1_PSC (N32_GTIMERB1_BASE + N32_GTIMB_PSC_OFFSET) +#define N32_GTIMB1_AR (N32_GTIMERB1_BASE + N32_GTIMB_AR_OFFSET) +#define N32_GTIMB1_CNT (N32_GTIMERB1_BASE + N32_GTIMB_CNT_OFFSET) +#define N32_GTIMB1_REPCNT (N32_GTIMERB1_BASE + N32_GTIMB_REPCNT_OFFSET) +#define N32_GTIMB1_BKDT (N32_GTIMERB1_BASE + N32_GTIMB_BKDT_OFFSET) +#define N32_GTIMB1_BKFR (N32_GTIMERB1_BASE + N32_GTIMB_BKFR_OFFSET) +#define N32_GTIMB1_C1FILT (N32_GTIMERB1_BASE + N32_GTIMB_C1FILT_OFFSET) +#define N32_GTIMB1_C2FILT (N32_GTIMERB1_BASE + N32_GTIMB_C2FILT_OFFSET) +#define N32_GTIMB1_C3FILT (N32_GTIMERB1_BASE + N32_GTIMB_C3FILT_OFFSET) +#define N32_GTIMB1_C4FILT (N32_GTIMERB1_BASE + N32_GTIMB_C4FILT_OFFSET) +#define N32_GTIMB1_FILTO (N32_GTIMERB1_BASE + N32_GTIMB_FILTO_OFFSET) +#define N32_GTIMB1_INSEL (N32_GTIMERB1_BASE + N32_GTIMB_INSEL_OFFSET) +#define N32_GTIMB1_AF1 (N32_GTIMERB1_BASE + N32_GTIMB_AF1_OFFSET) +#define N32_GTIMB1_DCTRL (N32_GTIMERB1_BASE + N32_GTIMB_DCTRL_OFFSET) +#define N32_GTIMB1_DADDR (N32_GTIMERB1_BASE + N32_GTIMB_DADDR_OFFSET) + +/* Register Addresses - GTIMB2 **********************************************/ + +#define N32_GTIMB2_CTRL1 (N32_GTIMERB2_BASE + N32_GTIMB_CTRL1_OFFSET) +#define N32_GTIMB2_CTRL2 (N32_GTIMERB2_BASE + N32_GTIMB_CTRL2_OFFSET) +#define N32_GTIMB2_STS (N32_GTIMERB2_BASE + N32_GTIMB_STS_OFFSET) +#define N32_GTIMB2_ETGEN (N32_GTIMERB2_BASE + N32_GTIMB_ETGEN_OFFSET) +#define N32_GTIMB2_SMCTRL (N32_GTIMERB2_BASE + N32_GTIMB_SMCTRL_OFFSET) +#define N32_GTIMB2_DINTEN (N32_GTIMERB2_BASE + N32_GTIMB_DINTEN_OFFSET) +#define N32_GTIMB2_CCMOD1 (N32_GTIMERB2_BASE + N32_GTIMB_CCMOD1_OFFSET) +#define N32_GTIMB2_CCMOD2 (N32_GTIMERB2_BASE + N32_GTIMB_CCMOD2_OFFSET) +#define N32_GTIMB2_CCMOD3 (N32_GTIMERB2_BASE + N32_GTIMB_CCMOD3_OFFSET) +#define N32_GTIMB2_CCEN (N32_GTIMERB2_BASE + N32_GTIMB_CCEN_OFFSET) +#define N32_GTIMB2_CCDAT1 (N32_GTIMERB2_BASE + N32_GTIMB_CCDAT1_OFFSET) +#define N32_GTIMB2_CCDAT2 (N32_GTIMERB2_BASE + N32_GTIMB_CCDAT2_OFFSET) +#define N32_GTIMB2_CCDAT3 (N32_GTIMERB2_BASE + N32_GTIMB_CCDAT3_OFFSET) +#define N32_GTIMB2_CCDAT4 (N32_GTIMERB2_BASE + N32_GTIMB_CCDAT4_OFFSET) +#define N32_GTIMB2_CCDAT5 (N32_GTIMERB2_BASE + N32_GTIMB_CCDAT5_OFFSET) +#define N32_GTIMB2_PSC (N32_GTIMERB2_BASE + N32_GTIMB_PSC_OFFSET) +#define N32_GTIMB2_AR (N32_GTIMERB2_BASE + N32_GTIMB_AR_OFFSET) +#define N32_GTIMB2_CNT (N32_GTIMERB2_BASE + N32_GTIMB_CNT_OFFSET) +#define N32_GTIMB2_REPCNT (N32_GTIMERB2_BASE + N32_GTIMB_REPCNT_OFFSET) +#define N32_GTIMB2_BKDT (N32_GTIMERB2_BASE + N32_GTIMB_BKDT_OFFSET) +#define N32_GTIMB2_BKFR (N32_GTIMERB2_BASE + N32_GTIMB_BKFR_OFFSET) +#define N32_GTIMB2_C1FILT (N32_GTIMERB2_BASE + N32_GTIMB_C1FILT_OFFSET) +#define N32_GTIMB2_C2FILT (N32_GTIMERB2_BASE + N32_GTIMB_C2FILT_OFFSET) +#define N32_GTIMB2_C3FILT (N32_GTIMERB2_BASE + N32_GTIMB_C3FILT_OFFSET) +#define N32_GTIMB2_C4FILT (N32_GTIMERB2_BASE + N32_GTIMB_C4FILT_OFFSET) +#define N32_GTIMB2_FILTO (N32_GTIMERB2_BASE + N32_GTIMB_FILTO_OFFSET) +#define N32_GTIMB2_INSEL (N32_GTIMERB2_BASE + N32_GTIMB_INSEL_OFFSET) +#define N32_GTIMB2_AF1 (N32_GTIMERB2_BASE + N32_GTIMB_AF1_OFFSET) +#define N32_GTIMB2_DCTRL (N32_GTIMERB2_BASE + N32_GTIMB_DCTRL_OFFSET) +#define N32_GTIMB2_DADDR (N32_GTIMERB2_BASE + N32_GTIMB_DADDR_OFFSET) + +/* Register Addresses - GTIMB3 **********************************************/ + +#define N32_GTIMB3_CTRL1 (N32_GTIMERB3_BASE + N32_GTIMB_CTRL1_OFFSET) +#define N32_GTIMB3_CTRL2 (N32_GTIMERB3_BASE + N32_GTIMB_CTRL2_OFFSET) +#define N32_GTIMB3_STS (N32_GTIMERB3_BASE + N32_GTIMB_STS_OFFSET) +#define N32_GTIMB3_ETGEN (N32_GTIMERB3_BASE + N32_GTIMB_ETGEN_OFFSET) +#define N32_GTIMB3_SMCTRL (N32_GTIMERB3_BASE + N32_GTIMB_SMCTRL_OFFSET) +#define N32_GTIMB3_DINTEN (N32_GTIMERB3_BASE + N32_GTIMB_DINTEN_OFFSET) +#define N32_GTIMB3_CCMOD1 (N32_GTIMERB3_BASE + N32_GTIMB_CCMOD1_OFFSET) +#define N32_GTIMB3_CCMOD2 (N32_GTIMERB3_BASE + N32_GTIMB_CCMOD2_OFFSET) +#define N32_GTIMB3_CCMOD3 (N32_GTIMERB3_BASE + N32_GTIMB_CCMOD3_OFFSET) +#define N32_GTIMB3_CCEN (N32_GTIMERB3_BASE + N32_GTIMB_CCEN_OFFSET) +#define N32_GTIMB3_CCDAT1 (N32_GTIMERB3_BASE + N32_GTIMB_CCDAT1_OFFSET) +#define N32_GTIMB3_CCDAT2 (N32_GTIMERB3_BASE + N32_GTIMB_CCDAT2_OFFSET) +#define N32_GTIMB3_CCDAT3 (N32_GTIMERB3_BASE + N32_GTIMB_CCDAT3_OFFSET) +#define N32_GTIMB3_CCDAT4 (N32_GTIMERB3_BASE + N32_GTIMB_CCDAT4_OFFSET) +#define N32_GTIMB3_CCDAT5 (N32_GTIMERB3_BASE + N32_GTIMB_CCDAT5_OFFSET) +#define N32_GTIMB3_PSC (N32_GTIMERB3_BASE + N32_GTIMB_PSC_OFFSET) +#define N32_GTIMB3_AR (N32_GTIMERB3_BASE + N32_GTIMB_AR_OFFSET) +#define N32_GTIMB3_CNT (N32_GTIMERB3_BASE + N32_GTIMB_CNT_OFFSET) +#define N32_GTIMB3_REPCNT (N32_GTIMERB3_BASE + N32_GTIMB_REPCNT_OFFSET) +#define N32_GTIMB3_BKDT (N32_GTIMERB3_BASE + N32_GTIMB_BKDT_OFFSET) +#define N32_GTIMB3_BKFR (N32_GTIMERB3_BASE + N32_GTIMB_BKFR_OFFSET) +#define N32_GTIMB3_C1FILT (N32_GTIMERB3_BASE + N32_GTIMB_C1FILT_OFFSET) +#define N32_GTIMB3_C2FILT (N32_GTIMERB3_BASE + N32_GTIMB_C2FILT_OFFSET) +#define N32_GTIMB3_C3FILT (N32_GTIMERB3_BASE + N32_GTIMB_C3FILT_OFFSET) +#define N32_GTIMB3_C4FILT (N32_GTIMERB3_BASE + N32_GTIMB_C4FILT_OFFSET) +#define N32_GTIMB3_FILTO (N32_GTIMERB3_BASE + N32_GTIMB_FILTO_OFFSET) +#define N32_GTIMB3_INSEL (N32_GTIMERB3_BASE + N32_GTIMB_INSEL_OFFSET) +#define N32_GTIMB3_AF1 (N32_GTIMERB3_BASE + N32_GTIMB_AF1_OFFSET) +#define N32_GTIMB3_DCTRL (N32_GTIMERB3_BASE + N32_GTIMB_DCTRL_OFFSET) +#define N32_GTIMB3_DADDR (N32_GTIMERB3_BASE + N32_GTIMB_DADDR_OFFSET) + +/* Bitfield Definitions - GTIMB *********************************************/ + +/* Control register 1 (N32_GTIMB_CTRL1) */ + +#define N32_GTIMB_CTRL1_CNTEN (1 << 0) /* Counter enable */ +#define N32_GTIMB_CTRL1_DIR (1 << 1) /* Direction */ +#define N32_GTIMB_CTRL1_CAMSEL_SHIFT (2) /* Center-aligned mode selection */ +#define N32_GTIMB_CTRL1_CAMSEL_MASK (3 << N32_GTIMB_CTRL1_CAMSEL_SHIFT) +# define N32_GTIMB_CTRL1_EDGE (0 << N32_GTIMB_CTRL1_CAMSEL_SHIFT) +# define N32_GTIMB_CTRL1_CENTER1 (1 << N32_GTIMB_CTRL1_CAMSEL_SHIFT) +# define N32_GTIMB_CTRL1_CENTER2 (2 << N32_GTIMB_CTRL1_CAMSEL_SHIFT) +# define N32_GTIMB_CTRL1_CENTER3 (3 << N32_GTIMB_CTRL1_CAMSEL_SHIFT) +#define N32_GTIMB_CTRL1_UPRS (1 << 4) /* Update request source */ +#define N32_GTIMB_CTRL1_UPDIS (1 << 5) /* Update disable */ +#define N32_GTIMB_CTRL1_CLKD_SHIFT (6) /* Clock division */ +#define N32_GTIMB_CTRL1_CLKD_MASK (3 << N32_GTIMB_CTRL1_CLKD_SHIFT) +# define N32_GTIMB_CTRL1_TCKINT (0 << N32_GTIMB_CTRL1_CLKD_SHIFT) +# define N32_GTIMB_CTRL1_2TCKINT (1 << N32_GTIMB_CTRL1_CLKD_SHIFT) +# define N32_GTIMB_CTRL1_4TCKINT (2 << N32_GTIMB_CTRL1_CLKD_SHIFT) +#define N32_GTIMB_CTRL1_ONEPM (1 << 8) /* One pulse mode */ +#define N32_GTIMB_CTRL1_ARPEN (1 << 9) /* Auto-reload preload enable */ +#define N32_GTIMB_CTRL1_LBKPEN (1 << 10) /* LockUp as BRK enable */ +#define N32_GTIMB_CTRL1_PBKPEN (1 << 11) /* PVD as BRK enable */ +#define N32_GTIMB_CTRL1_SRAMPARRERREN (1 << 12) /* SRAM parity error as BRK enable */ +#define N32_GTIMB_CTRL1_CLRSEL (1 << 13) /* OcxRef clear selection */ +#define N32_GTIMB_CTRL1_SRAMECERREN (1 << 15) /* SRAM ECC error as BRK enable */ +#define N32_GTIMB_CTRL1_ASYMMETRIC (1 << 23) /* Asymmetric mode enable */ +#define N32_GTIMB_CTRL1_UDITFREMAP (1 << 24) /* UDITF status bit remapping */ + +/* Control register 2 (N32_GTIMB_CTRL2) */ + +#define N32_GTIMB_CTRL2_O11 (1 << 0) /* Output idle state 1 (OC1) */ +#define N32_GTIMB_CTRL2_O11N (1 << 1) /* Output idle state 1N (OC1N) */ +#define N32_GTIMB_CTRL2_O12 (1 << 2) /* Output idle state 2 (OC2) */ +#define N32_GTIMB_CTRL2_O13 (1 << 4) /* Output idle state 3 (OC3) */ +#define N32_GTIMB_CTRL2_O14 (1 << 6) /* Output idle state 4 (OC4) */ +#define N32_GTIMB_CTRL2_O15 (1 << 8) /* Output idle state 5 (OC5) */ +#define N32_GTIMB_CTRL2_MMSEL_SHIFT (12) /* Master mode selection (TRGO) */ +#define N32_GTIMB_CTRL2_MMSEL_MASK (15 << N32_GTIMB_CTRL2_MMSEL_SHIFT) +# define N32_GTIMB_CTRL2_MMSEL_RESET (0 << N32_GTIMB_CTRL2_MMSEL_SHIFT) +# define N32_GTIMB_CTRL2_MMSEL_ENABLE (1 << N32_GTIMB_CTRL2_MMSEL_SHIFT) +# define N32_GTIMB_CTRL2_MMSEL_UPDATE (2 << N32_GTIMB_CTRL2_MMSEL_SHIFT) +# define N32_GTIMB_CTRL2_MMSEL_COMPP (3 << N32_GTIMB_CTRL2_MMSEL_SHIFT) +# define N32_GTIMB_CTRL2_MMSEL_OC1REF (4 << N32_GTIMB_CTRL2_MMSEL_SHIFT) +# define N32_GTIMB_CTRL2_MMSEL_OC2REF (5 << N32_GTIMB_CTRL2_MMSEL_SHIFT) +# define N32_GTIMB_CTRL2_MMSEL_OC3REF (6 << N32_GTIMB_CTRL2_MMSEL_SHIFT) +# define N32_GTIMB_CTRL2_MMSEL_OC4REF (7 << N32_GTIMB_CTRL2_MMSEL_SHIFT) +#define N32_GTIMB_CTRL2_CCUSEL (1 << 16) /* CC control update selection */ +#define N32_GTIMB_CTRL2_CCDSEL (1 << 17) /* CC DMA selection */ +#define N32_GTIMB_CTRL2_CCPCTL (1 << 18) /* CC preloaded control */ +#define N32_GTIMB_CTRL2_TIISEL (1 << 19) /* TI1 selection (XOR mode) */ + +/* Status register (N32_GTIMB_STS) */ + +#define N32_GTIMB_STS_CC1ITF (1 << 0) /* CC1 interrupt flag */ +#define N32_GTIMB_STS_CC2ITF (1 << 1) /* CC2 interrupt flag */ +#define N32_GTIMB_STS_CC3ITF (1 << 2) /* CC3 interrupt flag */ +#define N32_GTIMB_STS_CC4ITF (1 << 3) /* CC4 interrupt flag */ +#define N32_GTIMB_STS_CC5ITF (1 << 4) /* CC5 interrupt flag */ +#define N32_GTIMB_STS_CC1OCF (1 << 8) /* CC1 overcapture flag */ +#define N32_GTIMB_STS_CC2OCF (1 << 9) /* CC2 overcapture flag */ +#define N32_GTIMB_STS_CC3OCF (1 << 10) /* CC3 overcapture flag */ +#define N32_GTIMB_STS_CC4OCF (1 << 11) /* CC4 overcapture flag */ +#define N32_GTIMB_STS_UDITF (1 << 16) /* Update interrupt flag */ +#define N32_GTIMB_STS_TITF (1 << 18) /* Trigger interrupt flag */ +#define N32_GTIMB_STS_BITF (1 << 19) /* Break1 interrupt flag */ +#define N32_GTIMB_STS_SBITF (1 << 21) /* System break interrupt flag */ + +/* Event generation (N32_GTIMB_ETGEN) */ + +#define N32_GTIMB_ETGEN_CC1GN (1 << 0) /* CC1 generation */ +#define N32_GTIMB_ETGEN_CC2GN (1 << 1) /* CC2 generation */ +#define N32_GTIMB_ETGEN_CC3GN (1 << 2) /* CC3 generation */ +#define N32_GTIMB_ETGEN_CC4GN (1 << 3) /* CC4 generation */ +#define N32_GTIMB_ETGEN_UDGN (1 << 8) /* Update generation */ +#define N32_GTIMB_ETGEN_CCUDGN (1 << 9) /* CC control update generation */ +#define N32_GTIMB_ETGEN_TGN (1 << 10) /* Trigger generation */ +#define N32_GTIMB_ETGEN_BGN (1 << 11) /* Break1 generation */ + +/* SMCTRL (same as ATIM/GTIMA) */ + +#define N32_GTIMB_SMCTRL_TSEL_SHIFT (0) /* Trigger selection */ +#define N32_GTIMB_SMCTRL_TSEL_MASK (7 << N32_GTIMB_SMCTRL_TSEL_SHIFT) +#define N32_GTIMB_SMCTRL_SMSEL_SHIFT (4) /* Slave mode selection */ +#define N32_GTIMB_SMCTRL_SMSEL_MASK (15 << N32_GTIMB_SMCTRL_SMSEL_SHIFT) +#define N32_GTIMB_SMCTRL_EXTPS_SHIFT (8) /* External trigger prescaler */ +#define N32_GTIMB_SMCTRL_EXTPS_MASK (3 << N32_GTIMB_SMCTRL_EXTPS_SHIFT) +#define N32_GTIMB_SMCTRL_EXCEN (1 << 10) /* External clock enable */ +#define N32_GTIMB_SMCTRL_EXTP (1 << 11) /* External trigger polarity */ +#define N32_GTIMB_SMCTRL_EXTF_SHIFT (12) /* External trigger filter */ +#define N32_GTIMB_SMCTRL_EXTF_MASK (15 << N32_GTIMB_SMCTRL_EXTF_SHIFT) +#define N32_GTIMB_SMCTRL_MSMD (1 << 16) /* Master/slave mode */ +#define N32_GTIMB_SMCTRL_OCRECFLRP (1 << 19) /* tim_ocref_clr polarity */ +#define N32_GTIMB_SMCTRL_OCRECFLRF_SHIFT (20) /* tim_ocref_clr filter */ +#define N32_GTIMB_SMCTRL_OCRECFLRF_MASK (15 << N32_GTIMB_SMCTRL_OCRECFLRF_SHIFT) + +/* DINTEN (N32_GTIMB_DINTEN) */ + +#define N32_GTIMB_DINTEN_CC1IEN (1 << 0) /* CC1 interrupt enable */ +#define N32_GTIMB_DINTEN_CC2IEN (1 << 1) /* CC2 interrupt enable */ +#define N32_GTIMB_DINTEN_CC3IEN (1 << 2) /* CC3 interrupt enable */ +#define N32_GTIMB_DINTEN_CC4IEN (1 << 3) /* CC4 interrupt enable */ +#define N32_GTIMB_DINTEN_CC1DEN (1 << 8) /* CC1 DMA request enable */ +#define N32_GTIMB_DINTEN_CC2DEN (1 << 9) /* CC2 DMA request enable */ +#define N32_GTIMB_DINTEN_CC3DEN (1 << 10) /* CC3 DMA request enable */ +#define N32_GTIMB_DINTEN_CC4DEN (1 << 11) /* CC4 DMA request enable */ +#define N32_GTIMB_DINTEN_UIEN (1 << 16) /* Update interrupt enable */ +#define N32_GTIMB_DINTEN_TIEN (1 << 17) /* Trigger interrupt enable */ +#define N32_GTIMB_DINTEN_BIEN (1 << 18) /* Break interrupt enable */ +#define N32_GTIMB_DINTEN_UDEN (1 << 19) /* Update DMA request enable */ +#define N32_GTIMB_DINTEN_COMDEN (1 << 20) /* COM DMA request enable */ +#define N32_GTIMB_DINTEN_TDEN (1 << 21) /* Trigger DMA request enable */ +#define N32_GTIMB_DINTEN_COMIEN (1 << 22) /* COM interrupt enable */ + +/* CCMOD1 - Output compare (N32_GTIMB_CCMOD1) - 4-bit OC mode */ + +#define N32_GTIMB_CCMOD1_CC1SEL_SHIFT (0) /* CC1 selection */ +#define N32_GTIMB_CCMOD1_CC1SEL_MASK (3 << N32_GTIMB_CCMOD1_CC1SEL_SHIFT) +# define N32_GTIMB_CCMOD1_CC1OUT (0 << N32_GTIMB_CCMOD1_CC1SEL_SHIFT) +# define N32_GTIMB_CCMOD1_CC1IN_TI1 (1 << N32_GTIMB_CCMOD1_CC1SEL_SHIFT) +# define N32_GTIMB_CCMOD1_CC1IN_TI2 (2 << N32_GTIMB_CCMOD1_CC1SEL_SHIFT) +# define N32_GTIMB_CCMOD1_CC1IN_TRC (3 << N32_GTIMB_CCMOD1_CC1SEL_SHIFT) +#define N32_GTIMB_CCMOD1_OC1PEN (1 << 2) /* OC1 preload enable */ +#define N32_GTIMB_CCMOD1_OC1FEN (1 << 3) /* OC1 fast enable */ +#define N32_GTIMB_CCMOD1_OC1CEN (1 << 4) /* OC1 clear enable */ +#define N32_GTIMB_CCMOD1_OC1MD_SHIFT (5) /* OC1 mode (bits 0-2) */ +#define N32_GTIMB_CCMOD1_OC1MD_MASK (7 << N32_GTIMB_CCMOD1_OC1MD_SHIFT) +#define N32_GTIMB_CCMOD1_OC1MD3 (1 << 17) /* OC1 mode bit 3 */ +#define N32_GTIMB_CCMOD1_CC2SEL_SHIFT (8) /* CC2 selection */ +#define N32_GTIMB_CCMOD1_CC2SEL_MASK (3 << N32_GTIMB_CCMOD1_CC2SEL_SHIFT) +# define N32_GTIMB_CCMOD1_CC2OUT (0 << N32_GTIMB_CCMOD1_CC2SEL_SHIFT) +# define N32_GTIMB_CCMOD1_CC2IN_TI2 (1 << N32_GTIMB_CCMOD1_CC2SEL_SHIFT) +# define N32_GTIMB_CCMOD1_CC2IN_TI1 (2 << N32_GTIMB_CCMOD1_CC2SEL_SHIFT) +# define N32_GTIMB_CCMOD1_CC2IN_TRC (3 << N32_GTIMB_CCMOD1_CC2SEL_SHIFT) +#define N32_GTIMB_CCMOD1_OC2PEN (1 << 10) /* OC2 preload enable */ +#define N32_GTIMB_CCMOD1_OC2FEN (1 << 11) /* OC2 fast enable */ +#define N32_GTIMB_CCMOD1_OC2CEN (1 << 12) /* OC2 clear enable */ +#define N32_GTIMB_CCMOD1_OC2MD_SHIFT (13) /* OC2 mode (bits 0-2) */ +#define N32_GTIMB_CCMOD1_OC2MD_MASK (7 << N32_GTIMB_CCMOD1_OC2MD_SHIFT) +#define N32_GTIMB_CCMOD1_OC2MD3 (1 << 18) /* OC2 mode bit 3 */ + +/* 4-bit OC mode values (OCxMD3 + OCxMD[2:0]) */ +#define N32_GTIMB_OCMODE_FRZN (0) /* Frozen */ +#define N32_GTIMB_OCMODE_ACTIVE (1) /* Active */ +#define N32_GTIMB_OCMODE_INACTIVE (2) /* Inactive */ +#define N32_GTIMB_OCMODE_TOGGLE (3) /* Toggle */ +#define N32_GTIMB_OCMODE_FORCELO (4) /* Force low */ +#define N32_GTIMB_OCMODE_FORCEHI (5) /* Force high */ +#define N32_GTIMB_OCMODE_PWM1 (6) /* PWM mode 1 */ +#define N32_GTIMB_OCMODE_PWM2 (7) /* PWM mode 2 */ +#define N32_GTIMB_OCMODE_RETRIG1 (8) /* Retriggerable OPM 1 */ +#define N32_GTIMB_OCMODE_RETRIG2 (9) /* Retriggerable OPM 2 */ +#define N32_GTIMB_OCMODE_COMBINED1 (14) /* Combined PWM 1 */ +#define N32_GTIMB_OCMODE_COMBINED2 (15) /* Combined PWM 2 */ + +/* CCMOD1 - Input capture (N32_GTIMB_CCMOD1) */ + +#define N32_GTIMB_CCMOD1_IC1PSC_SHIFT (2) /* IC1 prescaler */ +#define N32_GTIMB_CCMOD1_IC1PSC_MASK (3 << N32_GTIMB_CCMOD1_IC1PSC_SHIFT) +#define N32_GTIMB_CCMOD1_IC1F_SHIFT (4) /* IC1 filter */ +#define N32_GTIMB_CCMOD1_IC1F_MASK (15 << N32_GTIMB_CCMOD1_IC1F_SHIFT) +#define N32_GTIMB_CCMOD1_IC2PSC_SHIFT (10) /* IC2 prescaler */ +#define N32_GTIMB_CCMOD1_IC2PSC_MASK (3 << N32_GTIMB_CCMOD1_IC2PSC_SHIFT) +#define N32_GTIMB_CCMOD1_IC2F_SHIFT (12) /* IC2 filter */ +#define N32_GTIMB_CCMOD1_IC2F_MASK (15 << N32_GTIMB_CCMOD1_IC2F_SHIFT) + +/* CCMOD2 - Output compare (N32_GTIMB_CCMOD2) */ + +#define N32_GTIMB_CCMOD2_CC3SEL_SHIFT (0) /* CC3 selection */ +#define N32_GTIMB_CCMOD2_CC3SEL_MASK (3 << N32_GTIMB_CCMOD2_CC3SEL_SHIFT) +# define N32_GTIMB_CCMOD2_CC3OUT (0 << N32_GTIMB_CCMOD2_CC3SEL_SHIFT) +# define N32_GTIMB_CCMOD2_CC3IN_TI3 (1 << N32_GTIMB_CCMOD2_CC3SEL_SHIFT) +# define N32_GTIMB_CCMOD2_CC3IN_TI4 (2 << N32_GTIMB_CCMOD2_CC3SEL_SHIFT) +# define N32_GTIMB_CCMOD2_CC3IN_TRC (3 << N32_GTIMB_CCMOD2_CC3SEL_SHIFT) +#define N32_GTIMB_CCMOD2_OC3PEN (1 << 2) /* OC3 preload enable */ +#define N32_GTIMB_CCMOD2_OC3FEN (1 << 3) /* OC3 fast enable */ +#define N32_GTIMB_CCMOD2_OC3CEN (1 << 4) /* OC3 clear enable */ +#define N32_GTIMB_CCMOD2_OC3MD_SHIFT (5) /* OC3 mode (bits 0-2) */ +#define N32_GTIMB_CCMOD2_OC3MD_MASK (7 << N32_GTIMB_CCMOD2_OC3MD_SHIFT) +#define N32_GTIMB_CCMOD2_OC3MD3 (1 << 17) /* OC3 mode bit 3 */ +#define N32_GTIMB_CCMOD2_CC4SEL_SHIFT (8) /* CC4 selection */ +#define N32_GTIMB_CCMOD2_CC4SEL_MASK (3 << N32_GTIMB_CCMOD2_CC4SEL_SHIFT) +# define N32_GTIMB_CCMOD2_CC4OUT (0 << N32_GTIMB_CCMOD2_CC4SEL_SHIFT) +# define N32_GTIMB_CCMOD2_CC4IN_TI4 (1 << N32_GTIMB_CCMOD2_CC4SEL_SHIFT) +# define N32_GTIMB_CCMOD2_CC4IN_TI3 (2 << N32_GTIMB_CCMOD2_CC4SEL_SHIFT) +# define N32_GTIMB_CCMOD2_CC4IN_TRC (3 << N32_GTIMB_CCMOD2_CC4SEL_SHIFT) +#define N32_GTIMB_CCMOD2_OC4PEN (1 << 10) /* OC4 preload enable */ +#define N32_GTIMB_CCMOD2_OC4FEN (1 << 11) /* OC4 fast enable */ +#define N32_GTIMB_CCMOD2_OC4CEN (1 << 12) /* OC4 clear enable */ +#define N32_GTIMB_CCMOD2_OC4MD_SHIFT (13) /* OC4 mode (bits 0-2) */ +#define N32_GTIMB_CCMOD2_OC4MD_MASK (7 << N32_GTIMB_CCMOD2_OC4MD_SHIFT) +#define N32_GTIMB_CCMOD2_OC4MD3 (1 << 18) /* OC4 mode bit 3 */ + +/* CCMOD2 - Input capture (N32_GTIMB_CCMOD2) */ + +#define N32_GTIMB_CCMOD2_IC3PSC_SHIFT (2) /* IC3 prescaler */ +#define N32_GTIMB_CCMOD2_IC3PSC_MASK (3 << N32_GTIMB_CCMOD2_IC3PSC_SHIFT) +#define N32_GTIMB_CCMOD2_IC3F_SHIFT (4) /* IC3 filter */ +#define N32_GTIMB_CCMOD2_IC3F_MASK (15 << N32_GTIMB_CCMOD2_IC3F_SHIFT) +#define N32_GTIMB_CCMOD2_IC4PSC_SHIFT (10) /* IC4 prescaler */ +#define N32_GTIMB_CCMOD2_IC4PSC_MASK (3 << N32_GTIMB_CCMOD2_IC4PSC_SHIFT) +#define N32_GTIMB_CCMOD2_IC4F_SHIFT (12) /* IC4 filter */ +#define N32_GTIMB_CCMOD2_IC4F_MASK (15 << N32_GTIMB_CCMOD2_IC4F_SHIFT) + +/* CCMOD3 (N32_GTIMB_CCMOD3) - CC5 only */ + +#define N32_GTIMB_CCMOD3_OC5PEN (1 << 2) /* OC5 preload enable */ +#define N32_GTIMB_CCMOD3_OC5FEN (1 << 3) /* OC5 fast enable */ +#define N32_GTIMB_CCMOD3_OC5CEN (1 << 4) /* OC5 clear enable */ +#define N32_GTIMB_CCMOD3_OC5MD_SHIFT (5) /* OC5 mode */ +#define N32_GTIMB_CCMOD3_OC5MD_MASK (7 << N32_GTIMB_CCMOD3_OC5MD_SHIFT) + +/* CCEN (N32_GTIMB_CCEN) - With complementary outputs */ + +#define N32_GTIMB_CCEN_CC1NEN (1 << 0) /* CC1 complementary output enable */ +#define N32_GTIMB_CCEN_CC1NP (1 << 1) /* CC1 complementary output polarity */ +#define N32_GTIMB_CCEN_CC1EN (1 << 2) /* CC1 output enable */ +#define N32_GTIMB_CCEN_CC1P (1 << 3) /* CC1 output polarity */ +#define N32_GTIMB_CCEN_CC2EN (1 << 6) /* CC2 output enable */ +#define N32_GTIMB_CCEN_CC2P (1 << 7) /* CC2 output polarity */ +#define N32_GTIMB_CCEN_CC3EN (1 << 10) /* CC3 output enable */ +#define N32_GTIMB_CCEN_CC3P (1 << 11) /* CC3 output polarity */ +#define N32_GTIMB_CCEN_CC4EN (1 << 14) /* CC4 output enable */ +#define N32_GTIMB_CCEN_CC4P (1 << 15) /* CC4 output polarity */ +#define N32_GTIMB_CCEN_CC5EN (1 << 18) /* CC5 output enable */ +#define N32_GTIMB_CCEN_CC5P (1 << 19) /* CC5 output polarity */ + +/* CCDAT (with down-count value in high 16 bits) */ + +#define N32_GTIMB_CCDAT_MASK (0xffff) /* CCx value mask */ +#define N32_GTIMB_CCDAT_DOWN_SHIFT (16) /* Down-count value shift */ + +/* PSC, AR, CNT */ + +#define N32_GTIMB_PSC_MASK (0xffff) /* Prescaler value mask */ +#define N32_GTIMB_AR_MASK (0xffff) /* Auto-reload value mask */ +#define N32_GTIMB_CNT_MASK (0xffff) /* Counter value mask */ +#define N32_GTIMB_CNT_UDITFCPY (1 << 31) /* UDITF copy */ + +/* REPCNT */ + +#define N32_GTIMB_REPCNT_MASK (0xff) /* Repetition counter value mask */ + +/* BKDT (N32_GTIMB_BKDT) - Break1 only (no Break2) */ + +#define N32_GTIMB_BKDT_DTGN_SHIFT (0) /* Dead-time generator setup */ +#define N32_GTIMB_BKDT_DTGN_MASK (0xff << N32_GTIMB_BKDT_DTGN_SHIFT) +#define N32_GTIMB_BKDT_MOEN (1 << 8) /* Main output enable */ +#define N32_GTIMB_BKDT_AOEN (1 << 9) /* Automatic output enable */ +#define N32_GTIMB_BKDT_BKP (1 << 10) /* Break1 polarity */ +#define N32_GTIMB_BKDT_BKEN (1 << 11) /* Break1 enable */ +#define N32_GTIMB_BKDT_OSSI (1 << 12) /* Off-state selection for Idle mode */ +#define N32_GTIMB_BKDT_OSSR (1 << 13) /* Off-state selection for Run mode */ +#define N32_GTIMB_BKDT_LCKCFG_SHIFT (14) /* Lock configuration */ +#define N32_GTIMB_BKDT_LCKCFG_MASK (3 << N32_GTIMB_BKDT_LCKCFG_SHIFT) +# define N32_GTIMB_BKDT_LOCKOFF (0 << N32_GTIMB_BKDT_LCKCFG_SHIFT) +# define N32_GTIMB_BKDT_LOCK1 (1 << N32_GTIMB_BKDT_LCKCFG_SHIFT) +# define N32_GTIMB_BKDT_LOCK2 (2 << N32_GTIMB_BKDT_LCKCFG_SHIFT) +# define N32_GTIMB_BKDT_LOCK3 (3 << N32_GTIMB_BKDT_LCKCFG_SHIFT) +#define N32_GTIMB_BKDT_BRKDSRM (1 << 18) /* Break1 disarm */ +#define N32_GTIMB_BKDT_BRKBID (1 << 20) /* Break1 bidirectional enable */ + +/* BKFR (same as ATIM) */ + +#define N32_GTIMB_BKFR_SLIDFPSC_MASK (0xffff) /* Sampling clock prescaler */ +#define N32_GTIMB_BKFR_FILTEN (1 << 16) /* Filter enable */ +#define N32_GTIMB_BKFR_WSIZE_SHIFT (17) /* Window size */ +#define N32_GTIMB_BKFR_WSIZE_MASK (63 << N32_GTIMB_BKFR_WSIZE_SHIFT) +#define N32_GTIMB_BKFR_THRESH_SHIFT (24) /* Threshold */ +#define N32_GTIMB_BKFR_THRESH_MASK (63 << N32_GTIMB_BKFR_THRESH_SHIFT) + +/* Filter registers (C1FILT..C4FILT) */ + +#define N32_GTIMB_CXFILT_SLIDFPSC_MASK (0xffff) /* Sampling clock prescaler */ +#define N32_GTIMB_CXFILT_FILTEN (1 << 16) /* Filter enable */ +#define N32_GTIMB_CXFILT_WSIZE_SHIFT (17) /* Window size */ +#define N32_GTIMB_CXFILT_WSIZE_MASK (63 << N32_GTIMB_CXFILT_WSIZE_SHIFT) +#define N32_GTIMB_CXFILT_THRESH_SHIFT (24) /* Threshold */ +#define N32_GTIMB_CXFILT_THRESH_MASK (63 << N32_GTIMB_CXFILT_THRESH_SHIFT) + +/* FILTO */ + +#define N32_GTIMB_FILTO_C1FILTO (1 << 0) /* Channel 1 filter output */ +#define N32_GTIMB_FILTO_C2FILTO (1 << 1) /* Channel 2 filter output */ +#define N32_GTIMB_FILTO_C3FILTO (1 << 2) /* Channel 3 filter output */ +#define N32_GTIMB_FILTO_C4FILTO (1 << 3) /* Channel 4 filter output */ + +/* INSEL (same as ATIM/GTIMA) */ + +#define N32_GTIMB_INSEL_TI1S_SHIFT (0) /* TI1 input selection */ +#define N32_GTIMB_INSEL_TI1S_MASK (15 << N32_GTIMB_INSEL_TI1S_SHIFT) +#define N32_GTIMB_INSEL_TI2S_SHIFT (4) /* TI2 input selection */ +#define N32_GTIMB_INSEL_TI2S_MASK (15 << N32_GTIMB_INSEL_TI2S_SHIFT) +#define N32_GTIMB_INSEL_TI3S_SHIFT (8) /* TI3 input selection */ +#define N32_GTIMB_INSEL_TI3S_MASK (15 << N32_GTIMB_INSEL_TI3S_SHIFT) +#define N32_GTIMB_INSEL_TI4S_SHIFT (12) /* TI4 input selection */ +#define N32_GTIMB_INSEL_TI4S_MASK (15 << N32_GTIMB_INSEL_TI4S_SHIFT) +#define N32_GTIMB_INSEL_ETRS_SHIFT (16) /* ETR input selection */ +#define N32_GTIMB_INSEL_ETRS_MASK (15 << N32_GTIMB_INSEL_ETRS_SHIFT) +#define N32_GTIMB_INSEL_ITRS_SHIFT (20) /* ITR input selection */ +#define N32_GTIMB_INSEL_ITRS_MASK (15 << N32_GTIMB_INSEL_ITRS_SHIFT) +#define N32_GTIMB_INSEL_CLRS_SHIFT (24) /* OcxRef clear input selection */ +#define N32_GTIMB_INSEL_CLRS_MASK (15 << N32_GTIMB_INSEL_CLRS_SHIFT) + +/* AF1 (N32_GTIMB_AF1) - Break input sources */ + +#define N32_GTIMB_AF1_IOMBRKEN (1 << 0) /* TIMx_BKIN break input enable */ +#define N32_GTIMB_AF1_COMP1BRKEN (1 << 1) /* COMP1 break input enable */ +#define N32_GTIMB_AF1_COMP2BRKEN (1 << 2) /* COMP2 break input enable */ +#define N32_GTIMB_AF1_COMP3BRKEN (1 << 3) /* COMP3 break input enable */ +#define N32_GTIMB_AF1_COMP4BRKEN (1 << 4) /* COMP4 break input enable */ +#define N32_GTIMB_AF1_DSMU0BRKEN (1 << 24) /* DSMU0 break enable */ +#define N32_GTIMB_AF1_DSMU1BRKEN (1 << 25) /* DSMU1 break enable */ +#define N32_GTIMB_AF1_DSMU2BRKEN (1 << 26) /* DSMU2 break enable */ +#define N32_GTIMB_AF1_DSMU3BRKEN (1 << 27) /* DSMU3 break enable */ +#define N32_GTIMB_AF1_IOMBRKP (1 << 9) /* TIMx_BKIN polarity selection */ +#define N32_GTIMB_AF1_COMP1BRKP (1 << 10) /* COMP1 break polarity */ +#define N32_GTIMB_AF1_COMP2BRKP (1 << 11) /* COMP2 break polarity */ +#define N32_GTIMB_AF1_COMP3BRKP (1 << 12) /* COMP3 break polarity */ +#define N32_GTIMB_AF1_COMP4BRKP (1 << 13) /* COMP4 break polarity */ + +/* DCTRL/DADDR */ + +#define N32_GTIMB_DCTRL_DBLEN_SHIFT (0) /* DMA burst length */ +#define N32_GTIMB_DCTRL_DBLEN_MASK (63 << N32_GTIMB_DCTRL_DBLEN_SHIFT) +# define N32_GTIMB_DCTRL_DBLEN(n) (((n)-1) << N32_GTIMB_DCTRL_DBLEN_SHIFT) +#define N32_GTIMB_DCTRL_DBADDR_SHIFT (8) /* DMA base address */ +#define N32_GTIMB_DCTRL_DBADDR_MASK (63 << N32_GTIMB_DCTRL_DBADDR_SHIFT) +#define N32_GTIMB_DADDR_BURST_MASK (0xffffffff) + +/* ========================================================================== + * BASIC TIMERS (BTIM1-4) + * ========================================================================== + */ + +/* Register Offsets - BTIM (common for all BTIM1-4) *************************/ + +#define N32_BTIM_CTRL1_OFFSET 0x0000 /* Control register 1 */ +#define N32_BTIM_CTRL2_OFFSET 0x0004 /* Control register 2 */ +#define N32_BTIM_STS_OFFSET 0x0008 /* Status register */ +#define N32_BTIM_ETGEN_OFFSET 0x000c /* Event generation register */ +#define N32_BTIM_DINTEN_OFFSET 0x0014 /* DMA/Interrupt enable register */ +#define N32_BTIM_PSC_OFFSET 0x0040 /* Prescaler */ +#define N32_BTIM_AR_OFFSET 0x0044 /* Auto-reload register (32-bit) */ +#define N32_BTIM_CNT_OFFSET 0x0048 /* Counter (32-bit) */ + +/* Register Addresses - BTIM1 ***********************************************/ + +#define N32_BTIM1_CTRL1 (N32_BTIMER1_BASE + N32_BTIM_CTRL1_OFFSET) +#define N32_BTIM1_CTRL2 (N32_BTIMER1_BASE + N32_BTIM_CTRL2_OFFSET) +#define N32_BTIM1_STS (N32_BTIMER1_BASE + N32_BTIM_STS_OFFSET) +#define N32_BTIM1_ETGEN (N32_BTIMER1_BASE + N32_BTIM_ETGEN_OFFSET) +#define N32_BTIM1_DINTEN (N32_BTIMER1_BASE + N32_BTIM_DINTEN_OFFSET) +#define N32_BTIM1_PSC (N32_BTIMER1_BASE + N32_BTIM_PSC_OFFSET) +#define N32_BTIM1_AR (N32_BTIMER1_BASE + N32_BTIM_AR_OFFSET) +#define N32_BTIM1_CNT (N32_BTIMER1_BASE + N32_BTIM_CNT_OFFSET) + +/* Register Addresses - BTIM2 ***********************************************/ + +#define N32_BTIM2_CTRL1 (N32_BTIMER2_BASE + N32_BTIM_CTRL1_OFFSET) +#define N32_BTIM2_CTRL2 (N32_BTIMER2_BASE + N32_BTIM_CTRL2_OFFSET) +#define N32_BTIM2_STS (N32_BTIMER2_BASE + N32_BTIM_STS_OFFSET) +#define N32_BTIM2_ETGEN (N32_BTIMER2_BASE + N32_BTIM_ETGEN_OFFSET) +#define N32_BTIM2_DINTEN (N32_BTIMER2_BASE + N32_BTIM_DINTEN_OFFSET) +#define N32_BTIM2_PSC (N32_BTIMER2_BASE + N32_BTIM_PSC_OFFSET) +#define N32_BTIM2_AR (N32_BTIMER2_BASE + N32_BTIM_AR_OFFSET) +#define N32_BTIM2_CNT (N32_BTIMER2_BASE + N32_BTIM_CNT_OFFSET) + +/* Register Addresses - BTIM3 ***********************************************/ + +#define N32_BTIM3_CTRL1 (N32_BTIMER3_BASE + N32_BTIM_CTRL1_OFFSET) +#define N32_BTIM3_CTRL2 (N32_BTIMER3_BASE + N32_BTIM_CTRL2_OFFSET) +#define N32_BTIM3_STS (N32_BTIMER3_BASE + N32_BTIM_STS_OFFSET) +#define N32_BTIM3_ETGEN (N32_BTIMER3_BASE + N32_BTIM_ETGEN_OFFSET) +#define N32_BTIM3_DINTEN (N32_BTIMER3_BASE + N32_BTIM_DINTEN_OFFSET) +#define N32_BTIM3_PSC (N32_BTIMER3_BASE + N32_BTIM_PSC_OFFSET) +#define N32_BTIM3_AR (N32_BTIMER3_BASE + N32_BTIM_AR_OFFSET) +#define N32_BTIM3_CNT (N32_BTIMER3_BASE + N32_BTIM_CNT_OFFSET) + +/* Register Addresses - BTIM4 ***********************************************/ + +#define N32_BTIM4_CTRL1 (N32_BTIMER4_BASE + N32_BTIM_CTRL1_OFFSET) +#define N32_BTIM4_CTRL2 (N32_BTIMER4_BASE + N32_BTIM_CTRL2_OFFSET) +#define N32_BTIM4_STS (N32_BTIMER4_BASE + N32_BTIM_STS_OFFSET) +#define N32_BTIM4_ETGEN (N32_BTIMER4_BASE + N32_BTIM_ETGEN_OFFSET) +#define N32_BTIM4_DINTEN (N32_BTIMER4_BASE + N32_BTIM_DINTEN_OFFSET) +#define N32_BTIM4_PSC (N32_BTIMER4_BASE + N32_BTIM_PSC_OFFSET) +#define N32_BTIM4_AR (N32_BTIMER4_BASE + N32_BTIM_AR_OFFSET) +#define N32_BTIM4_CNT (N32_BTIMER4_BASE + N32_BTIM_CNT_OFFSET) + +/* Bitfield Definitions - BTIM **********************************************/ + +/* Control register 1 (N32_BTIM_CTRL1) */ + +#define N32_BTIM_CTRL1_CNTEN (1 << 0) /* Counter enable */ +#define N32_BTIM_CTRL1_UPRS (1 << 4) /* Update request source */ +#define N32_BTIM_CTRL1_UPDIS (1 << 5) /* Update disable */ +#define N32_BTIM_CTRL1_ONEPM (1 << 8) /* One pulse mode */ +#define N32_BTIM_CTRL1_ARPEN (1 << 9) /* Auto-reload preload enable */ + +/* Control register 2 (N32_BTIM_CTRL2) */ + +#define N32_BTIM_CTRL2_MMSEL_SHIFT (12) /* Master mode selection (TRGO) */ +#define N32_BTIM_CTRL2_MMSEL_MASK (15 << N32_BTIM_CTRL2_MMSEL_SHIFT) +# define N32_BTIM_CTRL2_MMSEL_RESET (0 << N32_BTIM_CTRL2_MMSEL_SHIFT) /* Reset */ +# define N32_BTIM_CTRL2_MMSEL_ENABLE (1 << N32_BTIM_CTRL2_MMSEL_SHIFT) /* Enable */ +# define N32_BTIM_CTRL2_MMSEL_UPDATE (2 << N32_BTIM_CTRL2_MMSEL_SHIFT) /* Update */ + +/* Status register (N32_BTIM_STS) */ + +#define N32_BTIM_STS_UDITF (1 << 16) /* Update interrupt flag */ + +/* Event generation register (N32_BTIM_ETGEN) */ + +#define N32_BTIM_ETGEN_UDGN (1 << 8) /* Update generation */ + +/* DMA/Interrupt enable register (N32_BTIM_DINTEN) */ + +#define N32_BTIM_DINTEN_UIEN (1 << 16) /* Update interrupt enable */ +#define N32_BTIM_DINTEN_UDEN (1 << 19) /* Update DMA request enable */ + +/* Prescaler (N32_BTIM_PSC) */ + +#define N32_BTIM_PSC_MASK (0xffff) /* Prescaler value mask */ + +/* Auto-reload register (N32_BTIM_AR) - 32-bit */ + +#define N32_BTIM_AR_MASK (0xffffffff) /* Auto-reload value mask */ + +/* Counter (N32_BTIM_CNT) - 32-bit */ + +#define N32_BTIM_CNT_MASK (0xffffffff) /* Counter value mask */ + +#endif /* __ARCH_ARM_SRC_N32H7_HARDWARE_N32_TIM_H */ diff --git a/arch/arm/src/n32h7/hardware/n32h7_uart.h b/arch/arm/src/n32h7/hardware/n32h7_uart.h new file mode 100644 index 0000000000000..d07933e75d05f --- /dev/null +++ b/arch/arm/src/n32h7/hardware/n32h7_uart.h @@ -0,0 +1,39 @@ +/**************************************************************************** + * arch/arm/src/n32h7/hardware/n32h7_uart.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __ARCH_ARM_SRC_N32H7_HARDWARE_N32H7_UART_H +#define __ARCH_ARM_SRC_N32H7_HARDWARE_N32H7_UART_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include "chip.h" + +#if defined(CONFIG_N32H7_N32H76X) +# include "hardware/n32h76x_uart.h" +#else +# error "Unsupported N32H7 memory map" +#endif + +#endif /* __ARCH_ARM_SRC_N32H7_HARDWARE_N32H7_UART_H */ diff --git a/arch/arm/src/n32h7/hardware/n32h7_usbhs.h b/arch/arm/src/n32h7/hardware/n32h7_usbhs.h new file mode 100644 index 0000000000000..9c9eb71d04aa6 --- /dev/null +++ b/arch/arm/src/n32h7/hardware/n32h7_usbhs.h @@ -0,0 +1,946 @@ +/**************************************************************************** + * arch/arm/src/n32h7/hardware/n32h7_usbhs.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __ARCH_ARM_SRC_N32H7_HARDWARE_N32H7_USBHS_H +#define __ARCH_ARM_SRC_N32H7_HARDWARE_N32H7_USBHS_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include "chip.h" +#include "hardware/n32h7_memorymap.h" + +/* ========================================================================== + * Register Offsets + * ========================================================================== + */ + +/* Core global registers */ +#define N32_USBHS_GCTRLSTS_OFF 0x0000UL +#define N32_USBHS_GAHBCFG_OFF 0x0008UL +#define N32_USBHS_GCFG_OFF 0x000CUL +#define N32_USBHS_GRSTCTRL_OFF 0x0010UL +#define N32_USBHS_GINTSTS_OFF 0x0014UL +#define N32_USBHS_GINTEN_OFF 0x0018UL +#define N32_USBHS_GRXSTS_OFF 0x001CUL +#define N32_USBHS_GRXSTSP_OFF 0x0020UL +#define N32_USBHS_GRXFSIZ_OFF 0x0024UL +#define N32_USBHS_GNPTXFSIZ_OFF 0x0028UL +#define N32_USBHS_GNPTXFSTS_OFF 0x002CUL +#define N32_USBHS_CID_OFF 0x003CUL +#define N32_USBHS_GPD_OFF 0x0058UL +#define N32_USBHS_HPTXFSIZ_OFF 0x0100UL +#define N32_USBHS_DINEPPTXFSIZ_OFF 0x0104UL /* x = 1..8, offset = 0x0104 + (x1)4 */ + +/* Host mode registers */ +#define N32_USBHS_HCFG_OFF 0x0400UL +#define N32_USBHS_HFRI_OFF 0x0404UL +#define N32_USBHS_HFNUM_OFF 0x0408UL +#define N32_USBHS_HPTXFQSTS_OFF 0x0410UL +#define N32_USBHS_HACHINT_OFF 0x0414UL +#define N32_USBHS_HACHINTEN_OFF 0x0418UL +#define N32_USBHS_HPCS_OFF 0x0440UL + +/* Host channel registers (each 0x20) */ +#define N32_USBHS_HCH_OFF(n) (0x0500UL + ((n) << 5)) +#define N32_USBHS_HCHCTRL_OFF(n) (N32_USBHS_HCH_OFF(n) + 0x0000UL) +#define N32_USBHS_HCSCTRL_OFF(n) (N32_USBHS_HCH_OFF(n) + 0x0004UL) +#define N32_USBHS_HCHINTSTS_OFF(n) (N32_USBHS_HCH_OFF(n) + 0x0008UL) +#define N32_USBHS_HCHINTEN_OFF(n) (N32_USBHS_HCH_OFF(n) + 0x000CUL) +#define N32_USBHS_HCHTXSIZ_OFF(n) (N32_USBHS_HCH_OFF(n) + 0x0010UL) +#define N32_USBHS_HCHDMADD_OFF(n) (N32_USBHS_HCH_OFF(n) + 0x0014UL) + +/* Device mode registers */ +#define N32_USBHS_DCFG_OFF 0x0800UL +#define N32_USBHS_DCTRL_OFF 0x0804UL +#define N32_USBHS_DSTS_OFF 0x0808UL +#define N32_USBHS_DINEPINTEN_OFF 0x0810UL +#define N32_USBHS_DOUTEPINTEN_OFF 0x0814UL +#define N32_USBHS_DAEPINTSTS_OFF 0x0818UL +#define N32_USBHS_DAEPINTEN_OFF 0x081CUL +#define N32_USBHS_DTHRCTRL_OFF 0x0830UL +#define N32_USBHS_DINEPFEINTEN_OFF 0x0834UL +#define N32_USBHS_DEEPINTSTS_OFF 0x0838UL +#define N32_USBHS_DEEPINTEN_OFF 0x083CUL +#define N32_USBHS_DINEPXINTEN_OFF 0x0840UL /* x = 0..8, offset = 0x0840 + x4 */ +#define N32_USBHS_DOUTEPXINTEN_OFF 0x0880UL /* x = 0..8, offset = 0x0880 + x4 */ + +/* Device IN endpoint registers (each 0x20) */ +#define N32_USBHS_DINEP_OFF(n) (0x0900UL + ((n) << 5)) +#define N32_USBHS_DINEPCTRL_OFF(n) (N32_USBHS_DINEP_OFF(n) + 0x0000UL) +#define N32_USBHS_DINEPINTSTS_OFF(n) (N32_USBHS_DINEP_OFF(n) + 0x0008UL) +#define N32_USBHS_DINEPTXSIZ_OFF(n) (N32_USBHS_DINEP_OFF(n) + 0x0010UL) +#define N32_USBHS_DINEPDMADD_OFF(n) (N32_USBHS_DINEP_OFF(n) + 0x0014UL) +#define N32_USBHS_DINEPTXFSTS_OFF(n) (N32_USBHS_DINEP_OFF(n) + 0x0018UL) + +/* Device OUT endpoint registers (each 0x20) */ +#define N32_USBHS_DOUTEP_OFF(n) (0x0B00UL + ((n) << 5)) +#define N32_USBHS_DOUTEPCTRL_OFF(n) (N32_USBHS_DOUTEP_OFF(n) + 0x0000UL) +#define N32_USBHS_DOUTEPINTSTS_OFF(n) (N32_USBHS_DOUTEP_OFF(n) + 0x0008UL) +#define N32_USBHS_DOUTEPTXSIZ_OFF(n) (N32_USBHS_DOUTEP_OFF(n) + 0x0010UL) +#define N32_USBHS_DOUTEPDMADD_OFF(n) (N32_USBHS_DOUTEP_OFF(n) + 0x0014UL) + +/* Power control registers */ +#define N32_USBHS_PWRCTRL_OFF 0x0E00UL +#define N32_USBHS_PWRCTRL1_OFF 0x0E04UL + +/* Wrapper registers (separate base) */ +#define N32_USBHS_WRPCTRL_OFF 0x0000UL +#define N32_USBHS_WRPCFG_OFF 0x0004UL + +/* ========================================================================== + * Register Addresses + * ========================================================================== + */ +#define N32_USBHS1_GCTRLSTS (N32_USBCTRL1_BASE + N32_USBHS_GCTRLSTS_OFF) +#define N32_USBHS1_GAHBCFG (N32_USBCTRL1_BASE + N32_USBHS_GAHBCFG_OFF) +#define N32_USBHS1_GCFG (N32_USBCTRL1_BASE + N32_USBHS_GCFG_OFF) +#define N32_USBHS1_GRSTCTRL (N32_USBCTRL1_BASE + N32_USBHS_GRSTCTRL_OFF) +#define N32_USBHS1_GINTSTS (N32_USBCTRL1_BASE + N32_USBHS_GINTSTS_OFF) +#define N32_USBHS1_GINTEN (N32_USBCTRL1_BASE + N32_USBHS_GINTEN_OFF) +#define N32_USBHS1_GRXSTS (N32_USBCTRL1_BASE + N32_USBHS_GRXSTS_OFF) +#define N32_USBHS1_GRXSTSP (N32_USBCTRL1_BASE + N32_USBHS_GRXSTSP_OFF) +#define N32_USBHS1_GRXFSIZ (N32_USBCTRL1_BASE + N32_USBHS_GRXFSIZ_OFF) +#define N32_USBHS1_GNPTXFSIZ (N32_USBCTRL1_BASE + N32_USBHS_GNPTXFSIZ_OFF) +#define N32_USBHS1_GNPTXFSTS (N32_USBCTRL1_BASE + N32_USBHS_GNPTXFSTS_OFF) +#define N32_USBHS1_CID (N32_USBCTRL1_BASE + N32_USBHS_CID_OFF) +#define N32_USBHS1_GPD (N32_USBCTRL1_BASE + N32_USBHS_GPD_OFF) +#define N32_USBHS1_HPTXFSIZ (N32_USBCTRL1_BASE + N32_USBHS_HPTXFSIZ_OFF) + +#define N32_USBHS1_DINEPPTXFSIZ(n) (N32_USBCTRL1_BASE + N32_USBHS_DINEPPTXFSIZ_OFF + (((n)-1) << 2)) + +#define N32_USBHS2_GCTRLSTS (N32_USBCTRL2_BASE + N32_USBHS_GCTRLSTS_OFF) +#define N32_USBHS2_GAHBCFG (N32_USBCTRL2_BASE + N32_USBHS_GAHBCFG_OFF) +#define N32_USBHS2_GCFG (N32_USBCTRL2_BASE + N32_USBHS_GCFG_OFF) +#define N32_USBHS2_GRSTCTRL (N32_USBCTRL2_BASE + N32_USBHS_GRSTCTRL_OFF) +#define N32_USBHS2_GINTSTS (N32_USBCTRL2_BASE + N32_USBHS_GINTSTS_OFF) +#define N32_USBHS2_GINTEN (N32_USBCTRL2_BASE + N32_USBHS_GINTEN_OFF) +#define N32_USBHS2_GRXSTS (N32_USBCTRL2_BASE + N32_USBHS_GRXSTS_OFF) +#define N32_USBHS2_GRXSTSP (N32_USBCTRL2_BASE + N32_USBHS_GRXSTSP_OFF) +#define N32_USBHS2_GRXFSIZ (N32_USBCTRL2_BASE + N32_USBHS_GRXFSIZ_OFF) +#define N32_USBHS2_GNPTXFSIZ (N32_USBCTRL2_BASE + N32_USBHS_GNPTXFSIZ_OFF) +#define N32_USBHS2_GNPTXFSTS (N32_USBCTRL2_BASE + N32_USBHS_GNPTXFSTS_OFF) +#define N32_USBHS2_CID (N32_USBCTRL2_BASE + N32_USBHS_CID_OFF) +#define N32_USBHS2_GPD (N32_USBCTRL2_BASE + N32_USBHS_GPD_OFF) +#define N32_USBHS2_HPTXFSIZ (N32_USBCTRL2_BASE + N32_USBHS_HPTXFSIZ_OFF) + +#define N32_USBHS2_DINEPPTXFSIZ(n) (N32_USBCTRL2_BASE + N32_USBHS_DINEPPTXFSIZ_OFF + (((n)-1) << 2)) + +/* Host mode */ +#define N32_USBHS1_HCFG (N32_USBCTRL1_BASE + N32_USBHS_HCFG_OFF) +#define N32_USBHS1_HFRI (N32_USBCTRL1_BASE + N32_USBHS_HFRI_OFF) +#define N32_USBHS1_HFNUM (N32_USBCTRL1_BASE + N32_USBHS_HFNUM_OFF) +#define N32_USBHS1_HPTXFQSTS (N32_USBCTRL1_BASE + N32_USBHS_HPTXFQSTS_OFF) +#define N32_USBHS1_HACHINT (N32_USBCTRL1_BASE + N32_USBHS_HACHINT_OFF) +#define N32_USBHS1_HACHINTEN (N32_USBCTRL1_BASE + N32_USBHS_HACHINTEN_OFF) +#define N32_USBHS1_HPCS (N32_USBCTRL1_BASE + N32_USBHS_HPCS_OFF) + +#define N32_USBHS1_HCHCTRL(n) (N32_USBCTRL1_BASE + N32_USBHS_HCHCTRL_OFF(n)) +#define N32_USBHS1_HCSCTRL(n) (N32_USBCTRL1_BASE + N32_USBHS_HCSCTRL_OFF(n)) +#define N32_USBHS1_HCHINTSTS(n) (N32_USBCTRL1_BASE + N32_USBHS_HCHINTSTS_OFF(n)) +#define N32_USBHS1_HCHINTEN(n) (N32_USBCTRL1_BASE + N32_USBHS_HCHINTEN_OFF(n)) +#define N32_USBHS1_HCHTXSIZ(n) (N32_USBCTRL1_BASE + N32_USBHS_HCHTXSIZ_OFF(n)) +#define N32_USBHS1_HCHDMADD(n) (N32_USBCTRL1_BASE + N32_USBHS_HCHDMADD_OFF(n)) + +#define N32_USBHS2_HCFG (N32_USBCTRL2_BASE + N32_USBHS_HCFG_OFF) +#define N32_USBHS2_HFRI (N32_USBCTRL2_BASE + N32_USBHS_HFRI_OFF) +#define N32_USBHS2_HFNUM (N32_USBCTRL2_BASE + N32_USBHS_HFNUM_OFF) +#define N32_USBHS2_HPTXFQSTS (N32_USBCTRL2_BASE + N32_USBHS_HPTXFQSTS_OFF) +#define N32_USBHS2_HACHINT (N32_USBCTRL2_BASE + N32_USBHS_HACHINT_OFF) +#define N32_USBHS2_HACHINTEN (N32_USBCTRL2_BASE + N32_USBHS_HACHINTEN_OFF) +#define N32_USBHS2_HPCS (N32_USBCTRL2_BASE + N32_USBHS_HPCS_OFF) + +#define N32_USBHS2_HCHCTRL(n) (N32_USBCTRL2_BASE + N32_USBHS_HCHCTRL_OFF(n)) +#define N32_USBHS2_HCSCTRL(n) (N32_USBCTRL2_BASE + N32_USBHS_HCSCTRL_OFF(n)) +#define N32_USBHS2_HCHINTSTS(n) (N32_USBCTRL2_BASE + N32_USBHS_HCHINTSTS_OFF(n)) +#define N32_USBHS2_HCHINTEN(n) (N32_USBCTRL2_BASE + N32_USBHS_HCHINTEN_OFF(n)) +#define N32_USBHS2_HCHTXSIZ(n) (N32_USBCTRL2_BASE + N32_USBHS_HCHTXSIZ_OFF(n)) +#define N32_USBHS2_HCHDMADD(n) (N32_USBCTRL2_BASE + N32_USBHS_HCHDMADD_OFF(n)) + +/* Device mode */ +#define N32_USBHS1_DCFG (N32_USBCTRL1_BASE + N32_USBHS_DCFG_OFF) +#define N32_USBHS1_DCTRL (N32_USBCTRL1_BASE + N32_USBHS_DCTRL_OFF) +#define N32_USBHS1_DSTS (N32_USBCTRL1_BASE + N32_USBHS_DSTS_OFF) +#define N32_USBHS1_DINEPINTEN (N32_USBCTRL1_BASE + N32_USBHS_DINEPINTEN_OFF) +#define N32_USBHS1_DOUTEPINTEN (N32_USBCTRL1_BASE + N32_USBHS_DOUTEPINTEN_OFF) +#define N32_USBHS1_DAEPINTSTS (N32_USBCTRL1_BASE + N32_USBHS_DAEPINTSTS_OFF) +#define N32_USBHS1_DAEPINTEN (N32_USBCTRL1_BASE + N32_USBHS_DAEPINTEN_OFF) +#define N32_USBHS1_DTHRCTRL (N32_USBCTRL1_BASE + N32_USBHS_DTHRCTRL_OFF) +#define N32_USBHS1_DINEPFEINTEN (0x40040000N32_USBCTRL1_BASE + N32_USBHS_DINEPFEINTEN_OFF) +#define N32_USBHS1_DEEPINTSTS (N32_USBCTRL1_BASE + N32_USBHS_DEEPINTSTS_OFF) +#define N32_USBHS1_DEEPINTEN (N32_USBCTRL1_BASE + N32_USBHS_DEEPINTEN_OFF) + +#define N32_USBHS1_DINEPXINTEN(n) (N32_USBCTRL1_BASE + N32_USBHS_DINEPXINTEN_OFF + ((n) << 2)) +#define N32_USBHS1_DOUTEPXINTEN(n) (N32_USBCTRL1_BASE + N32_USBHS_DOUTEPXINTEN_OFF + ((n) << 2)) + +#define N32_USBHS1_DINEPCTRL(n) (N32_USBCTRL1_BASE + N32_USBHS_DINEPCTRL_OFF(n)) +#define N32_USBHS1_DINEPINTSTS(n) (N32_USBCTRL1_BASE + N32_USBHS_DINEPINTSTS_OFF(n)) +#define N32_USBHS1_DINEPTXSIZ(n) (N32_USBCTRL1_BASE + N32_USBHS_DINEPTXSIZ_OFF(n)) +#define N32_USBHS1_DINEPDMADD(n) (N32_USBCTRL1_BASE + N32_USBHS_DINEPDMADD_OFF(n)) +#define N32_USBHS1_DINEPTXFSTS(n) (N32_USBCTRL1_BASE + N32_USBHS_DINEPTXFSTS_OFF(n)) + +#define N32_USBHS1_DOUTEPCTRL(n) (N32_USBCTRL1_BASE + N32_USBHS_DOUTEPCTRL_OFF(n)) +#define N32_USBHS1_DOUTEPINTSTS(n) (N32_USBCTRL1_BASE + N32_USBHS_DOUTEPINTSTS_OFF(n)) +#define N32_USBHS1_DOUTEPTXSIZ(n) (N32_USBCTRL1_BASE + N32_USBHS_DOUTEPTXSIZ_OFF(n)) +#define N32_USBHS1_DOUTEPDMADD(n) (N32_USBCTRL1_BASE + N32_USBHS_DOUTEPDMADD_OFF(n)) + +#define N32_USBHS2_DCFG (N32_USBCTRL2_BASE + N32_USBHS_DCFG_OFF) +#define N32_USBHS2_DCTRL (N32_USBCTRL2_BASE + N32_USBHS_DCTRL_OFF) +#define N32_USBHS2_DSTS (N32_USBCTRL2_BASE + N32_USBHS_DSTS_OFF) +#define N32_USBHS2_DINEPINTEN (N32_USBCTRL2_BASE + N32_USBHS_DINEPINTEN_OFF) +#define N32_USBHS2_DOUTEPINTEN (N32_USBCTRL2_BASE + N32_USBHS_DOUTEPINTEN_OFF) +#define N32_USBHS2_DAEPINTSTS (N32_USBCTRL2_BASE + N32_USBHS_DAEPINTSTS_OFF) +#define N32_USBHS2_DAEPINTEN (N32_USBCTRL2_BASE + N32_USBHS_DAEPINTEN_OFF) +#define N32_USBHS2_DTHRCTRL (N32_USBCTRL2_BASE + N32_USBHS_DTHRCTRL_OFF) +#define N32_USBHS2_DINEPFEINTEN (N32_USBCTRL2_BASE + N32_USBHS_DINEPFEINTEN_OFF) +#define N32_USBHS2_DEEPINTSTS (N32_USBCTRL2_BASE + N32_USBHS_DEEPINTSTS_OFF) +#define N32_USBHS2_DEEPINTEN (N32_USBCTRL2_BASE + N32_USBHS_DEEPINTEN_OFF) + +#define N32_USBHS2_DINEPXINTEN(n) (N32_USBCTRL2_BASE + N32_USBHS_DINEPXINTEN_OFF + ((n) << 2)) +#define N32_USBHS2_DOUTEPXINTEN(n) (N32_USBCTRL2_BASE + N32_USBHS_DOUTEPXINTEN_OFF + ((n) << 2)) + +#define N32_USBHS2_DINEPCTRL(n) (N32_USBCTRL2_BASE + N32_USBHS_DINEPCTRL_OFF(n)) +#define N32_USBHS2_DINEPINTSTS(n) (N32_USBCTRL2_BASE + N32_USBHS_DINEPINTSTS_OFF(n)) +#define N32_USBHS2_DINEPTXSIZ(n) (N32_USBCTRL2_BASE + N32_USBHS_DINEPTXSIZ_OFF(n)) +#define N32_USBHS2_DINEPDMADD(n) (N32_USBCTRL2_BASE + N32_USBHS_DINEPDMADD_OFF(n)) +#define N32_USBHS2_DINEPTXFSTS(n) (N32_USBCTRL2_BASE + N32_USBHS_DINEPTXFSTS_OFF(n)) + +#define N32_USBHS2_DOUTEPCTRL(n) (N32_USBCTRL2_BASE + N32_USBHS_DOUTEPCTRL_OFF(n)) +#define N32_USBHS2_DOUTEPINTSTS(n) (N32_USBCTRL2_BASE + N32_USBHS_DOUTEPINTSTS_OFF(n)) +#define N32_USBHS2_DOUTEPTXSIZ(n) (N32_USBCTRL2_BASE + N32_USBHS_DOUTEPTXSIZ_OFF(n)) +#define N32_USBHS2_DOUTEPDMADD(n) (N32_USBCTRL2_BASE + N32_USBHS_DOUTEPDMADD_OFF(n)) + +/* Power control */ +#define N32_USBHS1_PWRCTRL (N32_USBCTRL1_BASE + N32_USBHS_PWRCTRL_OFF) +#define N32_USBHS1_PWRCTRL1 (N32_USBCTRL1_BASE + N32_USBHS_PWRCTRL1_OFF) + +#define N32_USBHS2_PWRCTRL (N32_USBCTRL2_BASE + N32_USBHS_PWRCTRL_OFF) +#define N32_USBHS2_PWRCTRL1 (N32_USBCTRL2_BASE + N32_USBHS_PWRCTRL1_OFF) + +/* Wrapper (separate base) */ +#define N32_USBHS1_WRPCTRL (N32_USBCTRL1_WRAPPER_BASE + N32_USBHS_WRPCTRL_OFF) +#define N32_USBHS1_WRPCFG (N32_USBCTRL1_WRAPPER_BASE + N32_USBHS_WRPCFG_OFF) + +#define N32_USBHS2_WRPCTRL (N32_USBCTRL2_WRAPPER_BASE + N32_USBHS_WRPCTRL_OFF) +#define N32_USBHS2_WRPCFG (N32_USBCTRL2_WRAPPER_BASE + N32_USBHS_WRPCFG_OFF) + +/* ========================================================================== + * Bitfield Definitions (no _POS macros, only _SHIFT and _MASK where needed) + * ========================================================================== + */ + +/* GCTRLSTS (0x000) *********************************************************/ +#define N32_USBHS_GCTRLSTS_VBVALOVEN (1UL << 2) /* VBUS valid override enable */ +#define N32_USBHS_GCTRLSTS_VBVALOVAL (1UL << 3) /* VBUS valid override value */ +#define N32_USBHS_GCTRLSTS_IDSTS (1UL << 16) /* Connector ID status */ +#define N32_USBHS_GCTRLSTS_DETIM (1UL << 17) /* Long/short debounce time */ +#define N32_USBHS_GCTRLSTS_CMODE (1UL << 21) /* Current mode (0:Device, 1:Host) */ + +/* GAHBCFG (0x008) **********************************************************/ +#define N32_USBHS_GAHBCFG_GINTEN (1UL << 0) /* Global interrupt mask */ +#define N32_USBHS_GAHBCFG_BURSTTYP_SHIFT 1 +#define N32_USBHS_GAHBCFG_BURSTTYP_MASK (0xFUL << N32_USBHS_GAHBCFG_BURSTTYP_SHIFT) +# define N32_USBHS_GAHBCFG_BURSTTYP_SINGLE (0UL << N32_USBHS_GAHBCFG_BURSTTYP_SHIFT) +# define N32_USBHS_GAHBCFG_BURSTTYP_INCR (1UL << N32_USBHS_GAHBCFG_BURSTTYP_SHIFT) +# define N32_USBHS_GAHBCFG_BURSTTYP_INCR4 (3UL << N32_USBHS_GAHBCFG_BURSTTYP_SHIFT) +# define N32_USBHS_GAHBCFG_BURSTTYP_INCR8 (5UL << N32_USBHS_GAHBCFG_BURSTTYP_SHIFT) +# define N32_USBHS_GAHBCFG_BURSTTYP_INCR16 (7UL << N32_USBHS_GAHBCFG_BURSTTYP_SHIFT) +#define N32_USBHS_GAHBCFG_DMAEN (1UL << 5) /* DMA enable */ +#define N32_USBHS_GAHBCFG_NPTXFETH (1UL << 7) /* Non-periodic TxFIFO empty level */ +#define N32_USBHS_GAHBCFG_PTXFETH (1UL << 8) /* Periodic TxFIFO empty level */ + +/* GCFG (0x00C) *************************************************************/ +#define N32_USBHS_GCFG_TOCAL_SHIFT 0 +#define N32_USBHS_GCFG_TOCAL_MASK (7UL << N32_USBHS_GCFG_TOCAL_SHIFT) /* FS timeout calibration */ +#define N32_USBHS_GCFG_PHYIF (1UL << 3) /* PHY interface (0:8bit, 1:16bit) */ +#define N32_USBHS_GCFG_PHYSEL (1UL << 6) /* PHY select (0:USB2.0 HS, 1:USB1.1 FS) */ +#define N32_USBHS_GCFG_TRDTIM_SHIFT 10 +#define N32_USBHS_GCFG_TRDTIM_MASK (0xFUL << N32_USBHS_GCFG_TRDTIM_SHIFT) /* USB turnaround time */ +#define N32_USBHS_GCFG_FHMODE (1UL << 29) /* Force host mode */ +#define N32_USBHS_GCFG_FDMODE (1UL << 30) /* Force device mode */ + +/* GRSTCTRL (0x010) *********************************************************/ +#define N32_USBHS_GRSTCTRL_CSRST (1UL << 0) /* Core soft reset */ +#define N32_USBHS_GRSTCTRL_PFSSRST (1UL << 1) /* PIU FS-specific controller reset */ +#define N32_USBHS_GRSTCTRL_HFCRST (1UL << 2) /* Host frame counter reset */ +#define N32_USBHS_GRSTCTRL_RXFFLSH (1UL << 4) /* RxFIFO flush */ +#define N32_USBHS_GRSTCTRL_TXFFLSH (1UL << 5) /* TxFIFO flush */ +#define N32_USBHS_GRSTCTRL_TXFNUM_SHIFT 6 +#define N32_USBHS_GRSTCTRL_TXFNUM_MASK (0x1FUL << N32_USBHS_GRSTCTRL_TXFNUM_SHIFT) /* TxFIFO number */ +#define N32_USBHS_GRSTCTRL_SRSTDNE (1UL << 29) /* Software reset done */ +#define N32_USBHS_GRSTCTRL_DMAREQ (1UL << 30) /* DMA request signal */ +#define N32_USBHS_GRSTCTRL_AHBIDLE (1UL << 31) /* AHB master idle */ + +/* GINTSTS (0x014) **********************************************************/ +#define N32_USBHS_GINTSTS_CMODE (1UL << 0) /* Current mode (0:Device, 1:Host) */ +#define N32_USBHS_GINTSTS_MODMISIF (1UL << 1) /* Mode mismatch interrupt */ +#define N32_USBHS_GINTSTS_SOFIF (1UL << 3) /* Start of frame */ +#define N32_USBHS_GINTSTS_RXFNEIF (1UL << 4) /* RxFIFO non-empty */ +#define N32_USBHS_GINTSTS_NPTXFEIF (1UL << 5) /* Non-periodic TxFIFO empty */ +#define N32_USBHS_GINTSTS_GINNPNAKEIF (1UL << 6) /* Global IN non-periodic NAK effective */ +#define N32_USBHS_GINTSTS_GOUTNAKEIF (1UL << 7) /* Global OUT NAK effective */ +#define N32_USBHS_GINTSTS_ESUSPIF (1UL << 10) /* Early suspend */ +#define N32_USBHS_GINTSTS_USBSUSPIF (1UL << 11) /* USB suspend */ +#define N32_USBHS_GINTSTS_USBRSTIF (1UL << 12) /* USB reset */ +#define N32_USBHS_GINTSTS_ENUMDIF (1UL << 13) /* Enumeration done */ +#define N32_USBHS_GINTSTS_ISOUTPDIF (1UL << 14) /* Isochronous OUT packet dropped */ +#define N32_USBHS_GINTSTS_EOPFIF (1UL << 15) /* End of periodic frame */ +#define N32_USBHS_GINTSTS_INEPIF (1UL << 18) /* IN endpoint interrupt */ +#define N32_USBHS_GINTSTS_OUTEPIF (1UL << 19) /* OUT endpoint interrupt */ +#define N32_USBHS_GINTSTS_ISOINCIF (1UL << 20) /* Incomplete isochronous IN transfer */ +#define N32_USBHS_GINTSTS_PTNCIF_ISOUTNCIF (1UL << 21) /* Incomplete periodic / isochronous OUT */ +#define N32_USBHS_GINTSTS_FETSUSPIF (1UL << 22) /* Data fetch suspended */ +#define N32_USBHS_GINTSTS_RSTDIF (1UL << 23) /* Reset detected */ +#define N32_USBHS_GINTSTS_HPIF (1UL << 24) /* Host port interrupt */ +#define N32_USBHS_GINTSTS_HCHIF (1UL << 25) /* Host channels interrupt */ +#define N32_USBHS_GINTSTS_PTXFEIF (1UL << 26) /* Periodic TxFIFO empty */ +#define N32_USBHS_GINTSTS_IDSTSCIF (1UL << 28) /* ID pin status change */ +#define N32_USBHS_GINTSTS_DISCIF (1UL << 29) /* Disconnect detected */ +#define N32_USBHS_GINTSTS_WKUPIF (1UL << 31) /* Resume/remote wakeup detected */ + +/* GINTEN (0x018) ***********************************************************/ +#define N32_USBHS_GINTEN_MODMISIEN (1UL << 1) /* Mode mismatch interrupt enable */ +#define N32_USBHS_GINTEN_USBHSIEN (1UL << 2) /* USBHS interrupt enable */ +#define N32_USBHS_GINTEN_SOFIEN (1UL << 3) /* SOF interrupt enable */ +#define N32_USBHS_GINTEN_RXFNEIEN (1UL << 4) /* RxFIFO non-empty interrupt enable */ +#define N32_USBHS_GINTEN_NPTXFEIEN (1UL << 5) /* Non-periodic TxFIFO empty interrupt enable */ +#define N32_USBHS_GINTEN_GINNPNAKEIEN (1UL << 6) /* Global IN non-periodic NAK effective interrupt enable */ +#define N32_USBHS_GINTEN_GOUTNAKEIEN (1UL << 7) /* Global OUT NAK effective interrupt enable */ +#define N32_USBHS_GINTEN_ESUSPIEN (1UL << 10) /* Early suspend interrupt enable */ +#define N32_USBHS_GINTEN_USBSUSPIEN (1UL << 11) /* USB suspend interrupt enable */ +#define N32_USBHS_GINTEN_USBRSTIEN (1UL << 12) /* USB reset interrupt enable */ +#define N32_USBHS_GINTEN_ENUMDIEN (1UL << 13) /* Enumeration done interrupt enable */ +#define N32_USBHS_GINTEN_ISOUTPDIEN (1UL << 14) /* Isochronous OUT packet dropped interrupt enable */ +#define N32_USBHS_GINTEN_EOPFIEN (1UL << 15) /* End of periodic frame interrupt enable */ +#define N32_USBHS_GINTEN_INEPIEN (1UL << 18) /* IN endpoint interrupt enable */ +#define N32_USBHS_GINTEN_OUTEPIEN (1UL << 19) /* OUT endpoint interrupt enable */ +#define N32_USBHS_GINTEN_ISOINCIEN (1UL << 20) /* Incomplete isochronous IN interrupt enable */ +#define N32_USBHS_GINTEN_PTNCIEN_ISOUTNCIEN (1UL << 21) /* Incomplete periodic / isochronous OUT interrupt enable */ +#define N32_USBHS_GINTEN_FETSUSPIEN (1UL << 22) /* Data fetch suspended interrupt enable */ +#define N32_USBHS_GINTEN_RSTDIEN (1UL << 23) /* Reset detected interrupt enable */ +#define N32_USBHS_GINTEN_HPIEN (1UL << 24) /* Host port interrupt enable */ +#define N32_USBHS_GINTEN_HCHIEN (1UL << 25) /* Host channels interrupt enable */ +#define N32_USBHS_GINTEN_PTXFEIEN (1UL << 26) /* Periodic TxFIFO empty interrupt enable */ +#define N32_USBHS_GINTEN_IDSTSCIEN (1UL << 28) /* ID pin status change interrupt enable */ +#define N32_USBHS_GINTEN_DISCIEN (1UL << 29) /* Disconnect interrupt enable */ +#define N32_USBHS_GINTEN_VBUSVIF (1UL << 30) /* VBUS valid interrupt enable */ +#define N32_USBHS_GINTEN_WKUPIEN (1UL << 31) /* Resume/remote wakeup interrupt enable */ + +/* GRXSTS / GRXSTSP (0x01C / 0x020) *****************************************/ +#define N32_USBHS_GRXSTS_CHEPNUM_SHIFT 0 +#define N32_USBHS_GRXSTS_CHEPNUM_MASK (0xFUL << N32_USBHS_GRXSTS_CHEPNUM_SHIFT) /* Channel/endpoint number */ +#define N32_USBHS_GRXSTS_BCNT_SHIFT 4 +#define N32_USBHS_GRXSTS_BCNT_MASK (0x7FFUL << N32_USBHS_GRXSTS_BCNT_SHIFT) /* Byte count */ +#define N32_USBHS_GRXSTS_DPID_SHIFT 15 +#define N32_USBHS_GRXSTS_DPID_MASK (3UL << N32_USBHS_GRXSTS_DPID_SHIFT) /* Data PID */ +# define N32_USBHS_GRXSTS_DPID_0 (0UL << N32_USBHS_GRXSTS_DPID_SHIFT) /* Data0 */ +# define N32_USBHS_GRXSTS_DPID_2 (1UL << N32_USBHS_GRXSTS_DPID_SHIFT) /* Data2 */ +# define N32_USBHS_GRXSTS_DPID_1 (2UL << N32_USBHS_GRXSTS_DPID_SHIFT) /* Data1 */ +# define N32_USBHS_GRXSTS_DPID_M (3UL << N32_USBHS_GRXSTS_DPID_SHIFT) /* MData */ +#define N32_USBHS_GRXSTS_PKTSTS_SHIFT 17 +#define N32_USBHS_GRXSTS_PKTSTS_MASK (0xFUL << N32_USBHS_GRXSTS_PKTSTS_SHIFT) /* Packet status */ + +/* Host mode */ +# define N32_USBHS_GRXSTS_IN_RCVD (2UL << N32_USBHS_GRXSTS_PKTSTS_SHIFT) /* Received IN packet */ +# define N32_USBHS_GRXSTS_IN_CPLT (3UL << N32_USBHS_GRXSTS_PKTSTS_SHIFT) /* Completed IN packet (Trigger interrupt) */ +# define N32_USBHS_GRXSTS_DATA_TOGERR (5UL << N32_USBHS_GRXSTS_PKTSTS_SHIFT) /* Data toggle error (Trigger interrupt) */ +# define N32_USBHS_GRXSTS_CHAN_TERMIN (7UL << N32_USBHS_GRXSTS_PKTSTS_SHIFT) /* Channel terminated (Trigger interrupt) */ + +/* Device mode */ +# define N32_USBHS_GRXSTS_OUT_NAK (1UL << N32_USBHS_GRXSTS_PKTSTS_SHIFT) /* Global OUT NAK (Trigger interrupt) */ +# define N32_USBHS_GRXSTS_OUT_RCVD (2UL << N32_USBHS_GRXSTS_PKTSTS_SHIFT) /* Received OUT packet */ +# define N32_USBHS_GRXSTS_OUT_CPLT (3UL << N32_USBHS_GRXSTS_PKTSTS_SHIFT) /* Completed OUT packet (Trigger interrupt) */ +# define N32_USBHS_GRXSTS_SETUP_DNE (4UL << N32_USBHS_GRXSTS_PKTSTS_SHIFT) /* Setup done (Trigger interrupt) */ +# define N32_USBHS_GRXSTS_SETUP_RCVD (6UL << N32_USBHS_GRXSTS_PKTSTS_SHIFT) /* Received setup packet (Trigger interrupt) */ +#define N32_USBHS_GRXSTS_FUNM_SHIFT 21 +#define N32_USBHS_GRXSTS_FUNM_MASK (0xFUL << N32_USBHS_GRXSTS_FUNM_SHIFT) /* Frame number (device) */ + +/* GRXFSIZ (0x024) **********************************************************/ +#define N32_USBHS_GRXFSIZ_RXFDEP_MASK (0x7FFUL) /* Rx FIFO depth (words) */ + +/* GNPTXFSIZ (0x028) ********************************************************/ + +/* Host mode */ +#define N32_USBHS_GNPTXFSIZ_NPTXFSADD_SHIFT 0 +#define N32_USBHS_GNPTXFSIZ_NPTXFSADD_MASK (0x7FFUL << N32_USBHS_GNPTXFSIZ_NPTXFSADD_SHIFT) +#define N32_USBHS_GNPTXFSIZ_NPTXFDEP_SHIFT 16 +#define N32_USBHS_GNPTXFSIZ_NPTXFDEP_MASK (0x7FFUL << N32_USBHS_GNPTXFSIZ_NPTXFDEP_SHIFT) + +/* Device mode (EP0) */ +#define N32_USBHS_GNPTXFSIZ_IEP0TXFRSADD_SHIFT 0 +#define N32_USBHS_GNPTXFSIZ_IEP0TXFRSADD_MASK (0x7FFUL << N32_USBHS_GNPTXFSIZ_IEP0TXFRSADD_SHIFT) +#define N32_USBHS_GNPTXFSIZ_IEP0TXFDEP_SHIFT 16 +#define N32_USBHS_GNPTXFSIZ_IEP0TXFDEP_MASK (0x7FFUL << N32_USBHS_GNPTXFSIZ_IEP0TXFDEP_SHIFT) + +/* GNPTXFSTS (0x02C) ********************************************************/ +#define N32_USBHS_GNPTXFSTS_NPTXFSAV_SHIFT 0 +#define N32_USBHS_GNPTXFSTS_NPTXFSAV_MASK (0xFFFFUL << N32_USBHS_GNPTXFSTS_NPTXFSAV_SHIFT) +#define N32_USBHS_GNPTXFSTS_NPTXRQSAV_SHIFT 16 +#define N32_USBHS_GNPTXFSTS_NPTXRQSAV_MASK (0xFFUL << N32_USBHS_GNPTXFSTS_NPTXRQSAV_SHIFT) +#define N32_USBHS_GNPTXFSTS_NPTXRQTOP_SHIFT 24 +#define N32_USBHS_GNPTXFSTS_NPTXRQTOP_MASK (0x7FUL << N32_USBHS_GNPTXFSTS_NPTXRQTOP_SHIFT) +# define N32_USBHS_GNPTXFSTS_NPTXRQTOP_END (1UL << 24) /* Terminate */ +# define N32_USBHS_GNPTXFSTS_NPTXRQTOP_TOKEN_SHIFT 25 +# define N32_USBHS_GNPTXFSTS_NPTXRQTOP_TOKEN_MASK (3UL << N32_USBHS_GNPTXFSTS_NPTXRQTOP_TOKEN_SHIFT) +# define N32_USBHS_GNPTXFSTS_NPTXRQTOP_TOKEN_INOUT (0UL << N32_USBHS_GNPTXFSTS_NPTXRQTOP_TOKEN_SHIFT) /* IN/OUT token */ +# define N32_USBHS_GNPTXFSTS_NPTXRQTOP_TOKEN_0LEN (1UL << N32_USBHS_GNPTXFSTS_NPTXRQTOP_TOKEN_SHIFT) /* 0-length packet token */ +# define N32_USBHS_GNPTXFSTS_NPTXRQTOP_TOKEN_DISCH (3UL << N32_USBHS_GNPTXFSTS_NPTXRQTOP_TOKEN_SHIFT) /* Disable channel command */ +# define N32_USBHS_GNPTXFSTS_NPTXRQTOP_CHNUM_SHIFT 27 +# define N32_USBHS_GNPTXFSTS_NPTXRQTOP_CHNUM_MASK (0xFUL << N32_USBHS_GNPTXFSTS_NPTXRQTOP_CHNUM_SHIFT) + +/* CID (0x03C) **************************************************************/ +#define N32_USBHS_CID_MASK (0xFFFFFFFFUL) /* User ID */ + +/* GPD (0x058) **************************************************************/ +#define N32_USBHS_GPD_LINSTSCHNGSTS (1UL << 7) /* Line status change status */ +#define N32_USBHS_GPD_LINSTSCHNGINTEN (1UL << 8) /* Line status change interrupt enable */ +#define N32_USBHS_GPD_RESTDETSTS (1UL << 9) /* Reset detected status */ +#define N32_USBHS_GPD_RESTDETINTEN (1UL << 10) /* Reset detected interrupt enable */ +#define N32_USBHS_GPD_DISCONNDETSTS (1UL << 11) /* Disconnect detected status */ +#define N32_USBHS_GPD_DISCONNDETINTEN (1UL << 12) /* Disconnect detected interrupt enable */ +#define N32_USBHS_GPD_CONNDETSTS (1UL << 13) /* Connect detected status */ +#define N32_USBHS_GPD_CONNDETINTEN (1UL << 14) /* Connect detected interrupt enable */ +#define N32_USBHS_GPD_STSCHNGINTSTS (1UL << 17) /* Status change interrupt status */ +#define N32_USBHS_GPD_STSCHNGINTEN (1UL << 18) /* Status change interrupt enable */ +#define N32_USBHS_GPD_LINSTS_SHIFT 19 +#define N32_USBHS_GPD_LINSTS_MASK (3UL << N32_USBHS_GPD_LINSTS_SHIFT) /* Line status */ +# define N32_USBHS_GPD_LINSTS_DM0DP0 (0UL << N32_USBHS_GPD_LINSTS_SHIFT) /* DM=0, DP=0 */ +# define N32_USBHS_GPD_LINSTS_DM0DP1 (1UL << N32_USBHS_GPD_LINSTS_SHIFT) /* DM=0, DP=1 */ +# define N32_USBHS_GPD_LINSTS_DM1DP0 (2UL << N32_USBHS_GPD_LINSTS_SHIFT) /* DM=1, DP=0 */ +#define N32_USBHS_GPD_IDDIG (1UL << 21) /* IDDIG signal state (0:Host, 1:Device) */ + +/* HPTXFSIZ (0x100) *********************************************************/ +#define N32_USBHS_HPTXFSIZ_HPTXFSADD_SHIFT 0 +#define N32_USBHS_HPTXFSIZ_HPTXFSADD_MASK (0xFFFFUL << N32_USBHS_HPTXFSIZ_HPTXFSADD_SHIFT) +#define N32_USBHS_HPTXFSIZ_HPTXFDEP_SHIFT 16 +#define N32_USBHS_HPTXFSIZ_HPTXFDEP_MASK (0xFFFFUL << N32_USBHS_HPTXFSIZ_HPTXFDEP_SHIFT) + +/* DINEPPTXFSIZ[1..8] (0x104 + (x1)4) ***************************************/ +#define N32_USBHS_DINEPPTXFSIZ_INEPTXSADD_SHIFT 0 +#define N32_USBHS_DINEPPTXFSIZ_INEPTXSADD_MASK (0xFFFFUL << N32_USBHS_DINEPPTXFSIZ_INEPTXSADD_SHIFT) +#define N32_USBHS_DINEPPTXFSIZ_INEPTXFDEP_SHIFT 16 +#define N32_USBHS_DINEPPTXFSIZ_INEPTXFDEP_MASK (0xFFFFUL << N32_USBHS_DINEPPTXFSIZ_INEPTXFDEP_SHIFT) + +/* ========================================================================== + * Host Mode Registers + * ========================================================================== + */ + +/* HCFG (0x400) *************************************************************/ +#define N32_USBHS_HCFG_SPSEL (1UL << 2) /* USB speed select (0:HS/FS/LS, 1:FS/LS only) */ + +/* HFRI (0x404) *************************************************************/ +#define N32_USBHS_HFRI_FRI_SHIFT 0 +#define N32_USBHS_HFRI_FRI_MASK (0xFFFFUL << N32_USBHS_HFRI_FRI_SHIFT) /* Frame interval */ +#define N32_USBHS_HFRI_DRLDEN (1UL << 16) /* Dynamic reload enable */ + +/* HFNUM (0x408) ************************************************************/ +#define N32_USBHS_HFNUM_FRNUM_SHIFT 0 +#define N32_USBHS_HFNUM_FRNUM_MASK (0xFFFFUL << N32_USBHS_HFNUM_FRNUM_SHIFT) /* Frame number */ +#define N32_USBHS_HFNUM_FRT_SHIFT 16 +#define N32_USBHS_HFNUM_FRT_MASK (0xFFFFUL << N32_USBHS_HFNUM_FRT_SHIFT) /* Frame time remaining */ + +/* HPTXFQSTS (0x410) ********************************************************/ +#define N32_USBHS_HPTXFQSTS_PTXFSAVL_SHIFT 0 +#define N32_USBHS_HPTXFQSTS_PTXFSAVL_MASK (0xFFFFUL << N32_USBHS_HPTXFQSTS_PTXFSAVL_SHIFT) +#define N32_USBHS_HPTXFQSTS_PTXRQSAVL_SHIFT 16 +#define N32_USBHS_HPTXFQSTS_PTXRQSAVL_MASK (0x7FUL << N32_USBHS_HPTXFQSTS_PTXRQSAVL_SHIFT) +#define N32_USBHS_HPTXFQSTS_PTXRQTOP_SHIFT 23 +#define N32_USBHS_HPTXFQSTS_PTXRQTOP_MASK (0xFFUL << N32_USBHS_HPTXFQSTS_PTXRQTOP_SHIFT) +# define N32_USBHS_HPTXFQSTS_PTXRQTOP_END (1UL << 23) /* Terminate */ +# define N32_USBHS_HPTXFQSTS_PTXRQTOP_PEND (1UL << 24) /* Pending */ +# define N32_USBHS_HPTXFQSTS_PTXRQTOP_TOKEN_SHIFT 25 +# define N32_USBHS_HPTXFQSTS_PTXRQTOP_TOKEN_MASK (3UL << N32_USBHS_HPTXFQSTS_PTXRQTOP_TOKEN_SHIFT) +# define N32_USBHS_HPTXFQSTS_PTXRQTOP_TOKEN_INOUT (0UL << N32_USBHS_HPTXFQSTS_PTXRQTOP_TOKEN_SHIFT) /* IN/OUT token */ +# define N32_USBHS_HPTXFQSTS_PTXRQTOP_TOKEN_0LEN (1UL << N32_USBHS_HPTXFQSTS_PTXRQTOP_TOKEN_SHIFT) /* 0-length packet token */ +# define N32_USBHS_HPTXFQSTS_PTXRQTOP_TOKEN_CSPLIT (2UL << N32_USBHS_HPTXFQSTS_PTXRQTOP_TOKEN_SHIFT) /* CSPLIT */ +# define N32_USBHS_HPTXFQSTS_PTXRQTOP_TOKEN_DISCH (3UL << N32_USBHS_HPTXFQSTS_PTXRQTOP_TOKEN_SHIFT) /* Disable channel command */ +# define N32_USBHS_HPTXFQSTS_PTXRQTOP_CHNUM_SHIFT 27 +# define N32_USBHS_HPTXFQSTS_PTXRQTOP_CHNUM_MASK (0xFUL << N32_USBHS_HPTXFQSTS_PTXRQTOP_CHNUM_SHIFT) +# define N32_USBHS_HPTXFQSTS_PTXRQTOP_OEFRM (1UL << 31) /* Odd/even frame */ + +/* HACHINT (0x414) **********************************************************/ +#define N32_USBHS_HACHINT_MASK (0xFFFFUL) /* Channel interrupt bits */ + +/* HACHINTEN (0x418) ********************************************************/ +#define N32_USBHS_HACHINTEN_MASK (0xFFFFUL) /* Channel interrupt enable bits */ + +/* HPCS (0x440) *************************************************************/ +#define N32_USBHS_HPCS_PCSTS (1UL << 0) /* Port connect status */ +#define N32_USBHS_HPCS_PCDET (1UL << 1) /* Port connect detected */ +#define N32_USBHS_HPCS_PEN (1UL << 2) /* Port enable */ +#define N32_USBHS_HPCS_PENC (1UL << 3) /* Port enable/disable change */ +#define N32_USBHS_HPCS_POCA (1UL << 4) /* Port overcurrent active */ +#define N32_USBHS_HPCS_POCC (1UL << 5) /* Port overcurrent change */ +#define N32_USBHS_HPCS_PRES (1UL << 6) /* Port resume */ +#define N32_USBHS_HPCS_PSUSP (1UL << 7) /* Port suspend */ +#define N32_USBHS_HPCS_PRST (1UL << 8) /* Port reset */ +#define N32_USBHS_HPCS_PLSTS_SHIFT 10 +#define N32_USBHS_HPCS_PLSTS_MASK (3UL << N32_USBHS_HPCS_PLSTS_SHIFT) /* Port line status */ +#define N32_USBHS_HPCS_PPWR (1UL << 12) /* Port power */ +#define N32_USBHS_HPCS_PTCTRL_SHIFT 13 +#define N32_USBHS_HPCS_PTCTRL_MASK (0xFUL << N32_USBHS_HPCS_PTCTRL_SHIFT) /* Port test control */ +# define N32_USBHS_HPCS_PTCTRL_TEST_NO (0UL << N32_USBHS_HPCS_PTCTRL_SHIFT) /* No test */ +# define N32_USBHS_HPCS_PTCTRL_TEST_J (1UL << N32_USBHS_HPCS_PTCTRL_SHIFT) /* Test_J mode */ +# define N32_USBHS_HPCS_PTCTRL_TEST_K (2UL << N32_USBHS_HPCS_PTCTRL_SHIFT) /* Test_K mode */ +# define N32_USBHS_HPCS_PTCTRL_TEST_SN (3UL << N32_USBHS_HPCS_PTCTRL_SHIFT) /* Test_SE0_NAK mode */ +# define N32_USBHS_HPCS_PTCTRL_TEST_PK (4UL << N32_USBHS_HPCS_PTCTRL_SHIFT) /* Test_Packet mode */ +# define N32_USBHS_HPCS_PTCTRL_TEST_FE (5UL << N32_USBHS_HPCS_PTCTRL_SHIFT) /* Test forced enable */ +#define N32_USBHS_HPCS_PSPD_SHIFT 17 +#define N32_USBHS_HPCS_PSPD_MASK (3UL << N32_USBHS_HPCS_PSPD_SHIFT) /* Port speed */ +# define N32_USBHS_HPCS_PSPD_HS (0UL << N32_USBHS_HPCS_PSPD_SHIFT) /* High-speed */ +# define N32_USBHS_HPCS_PSPD_FS (1UL << N32_USBHS_HPCS_PSPD_SHIFT) /* Full-speed */ +# define N32_USBHS_HPCS_PSPD_LS (2UL << N32_USBHS_HPCS_PSPD_SHIFT) /* Low-speed */ + +/* HCHCTRL (0x500 + n0x20) **************************************************/ +#define N32_USBHS_HCHCTRL_MPS_SHIFT 0 +#define N32_USBHS_HCHCTRL_MPS_MASK (0x7FFUL << N32_USBHS_HCHCTRL_MPS_SHIFT) /* Max packet size */ +#define N32_USBHS_HCHCTRL_EPNUM_SHIFT 11 +#define N32_USBHS_HCHCTRL_EPNUM_MASK (0xFUL << N32_USBHS_HCHCTRL_EPNUM_SHIFT) /* Endpoint number */ +#define N32_USBHS_HCHCTRL_EPDIR (1UL << 15) /* Endpoint direction (0:OUT, 1:IN) */ +#define N32_USBHS_HCHCTRL_LSPDDEV (1UL << 17) /* Low-speed device */ +#define N32_USBHS_HCHCTRL_EPTYPE_SHIFT 18 +#define N32_USBHS_HCHCTRL_EPTYPE_MASK (3UL << N32_USBHS_HCHCTRL_EPTYPE_SHIFT) /* Endpoint type */ +# define N32_USBHS_HCHCTRL_EPTYPE_CTRL (0UL << N32_USBHS_HCHCTRL_EPTYPE_SHIFT) +# define N32_USBHS_HCHCTRL_EPTYPE_ISOC (1UL << N32_USBHS_HCHCTRL_EPTYPE_SHIFT) +# define N32_USBHS_HCHCTRL_EPTYPE_BULK (2UL << N32_USBHS_HCHCTRL_EPTYPE_SHIFT) +# define N32_USBHS_HCHCTRL_EPTYPE_INTR (3UL << N32_USBHS_HCHCTRL_EPTYPE_SHIFT) +#define N32_USBHS_HCHCTRL_DEVADDR_SHIFT 22 +#define N32_USBHS_HCHCTRL_DEVADDR_MASK (0x7FUL << N32_USBHS_HCHCTRL_DEVADDR_SHIFT) /* Device address */ +#define N32_USBHS_HCHCTRL_ODDFRM (1UL << 29) /* Odd frame */ +#define N32_USBHS_HCHCTRL_CHDIS (1UL << 30) /* Channel disable */ +#define N32_USBHS_HCHCTRL_CHEN (1UL << 31) /* Channel enable */ + +/* HCSCTRL (0x504 + n0x20) **************************************************/ +#define N32_USBHS_HCSCTRL_PRTADD_SHIFT 0 +#define N32_USBHS_HCSCTRL_PRTADD_MASK (0x7FUL << N32_USBHS_HCSCTRL_PRTADD_SHIFT) /* Port address */ +#define N32_USBHS_HCSCTRL_HUBADD_SHIFT 7 +#define N32_USBHS_HCSCTRL_HUBADD_MASK (0x7FUL << N32_USBHS_HCSCTRL_HUBADD_SHIFT) /* Hub address */ +#define N32_USBHS_HCSCTRL_TRANPOS_SHIFT 14 +#define N32_USBHS_HCSCTRL_TRANPOS_MASK (3UL << N32_USBHS_HCSCTRL_TRANPOS_SHIFT) /* Transaction position */ +# define N32_USBHS_HCSCTRL_TRANPOS_MID (0UL << N32_USBHS_HCSCTRL_TRANPOS_SHIFT) /* Middle */ +# define N32_USBHS_HCSCTRL_TRANPOS_END (1UL << N32_USBHS_HCSCTRL_TRANPOS_SHIFT) /* Last */ +# define N32_USBHS_HCSCTRL_TRANPOS_ALL (2UL << N32_USBHS_HCSCTRL_TRANPOS_SHIFT) /* All */ +# define N32_USBHS_HCSCTRL_TRANPOS_BGN (3UL << N32_USBHS_HCSCTRL_TRANPOS_SHIFT) /* First */ +#define N32_USBHS_HCSCTRL_COMPSPLF (1UL << 16) /* Complete split */ +#define N32_USBHS_HCSCTRL_SPLEN (1UL << 31) /* Split enable */ + +/* HCHINTSTS (0x508 + n0x20) ************************************************/ +#define N32_USBHS_HCHINTSTS_TXCFIF (1UL << 0) /* Transfer completed */ +#define N32_USBHS_HCHINTSTS_CHHTDIF (1UL << 1) /* Channel halted */ +#define N32_USBHS_HCHINTSTS_AHBERRIF (1UL << 2) /* AHB error */ +#define N32_USBHS_HCHINTSTS_STALLIF (1UL << 3) /* STALL response received */ +#define N32_USBHS_HCHINTSTS_NAKIF (1UL << 4) /* NAK response received */ +#define N32_USBHS_HCHINTSTS_ACKIF (1UL << 5) /* ACK response received/transmitted */ +#define N32_USBHS_HCHINTSTS_NYETIF (1UL << 6) /* NYET response received */ +#define N32_USBHS_HCHINTSTS_TXERRIF (1UL << 7) /* Transaction error */ +#define N32_USBHS_HCHINTSTS_BBERRIF (1UL << 8) /* Babble error */ +#define N32_USBHS_HCHINTSTS_FOVRIF (1UL << 9) /* Frame overrun */ +#define N32_USBHS_HCHINTSTS_DTERRIF (1UL << 10) /* Data toggle error */ + +/* HCHINTEN (0x50C + n0x20) *************************************************/ +#define N32_USBHS_HCHINTEN_TXCIEN (1UL << 0) /* Transfer completed interrupt enable */ +#define N32_USBHS_HCHINTEN_CHHTDIEN (1UL << 1) /* Channel halted interrupt enable */ +#define N32_USBHS_HCHINTEN_AHBERRIEN (1UL << 2) /* AHB error interrupt enable */ +#define N32_USBHS_HCHINTEN_STALLIEN (1UL << 3) /* STALL response interrupt enable */ +#define N32_USBHS_HCHINTEN_NAKIEN (1UL << 4) /* NAK response interrupt enable */ +#define N32_USBHS_HCHINTEN_ACKIEN (1UL << 5) /* ACK response interrupt enable */ +#define N32_USBHS_HCHINTEN_NYETIEN (1UL << 6) /* NYET response interrupt enable */ +#define N32_USBHS_HCHINTEN_TXERRIEN (1UL << 7) /* Transaction error interrupt enable */ +#define N32_USBHS_HCHINTEN_BBERRIEN (1UL << 8) /* Babble error interrupt enable */ +#define N32_USBHS_HCHINTEN_FOVRIEN (1UL << 9) /* Frame overrun interrupt enable */ +#define N32_USBHS_HCHINTEN_DTERRIEN (1UL << 10) /* Data toggle error interrupt enable */ + +/* HCHTXSIZ (0x510 + n0x20) *************************************************/ +#define N32_USBHS_HCHTXSIZ_TXSIZ_SHIFT 0 +#define N32_USBHS_HCHTXSIZ_TXSIZ_MASK (0x7FFFFUL << N32_USBHS_HCHTXSIZ_TXSIZ_SHIFT) /* Transfer size */ +#define N32_USBHS_HCHTXSIZ_PKCNT_SHIFT 19 +#define N32_USBHS_HCHTXSIZ_PKCNT_MASK (0x3FFUL << N32_USBHS_HCHTXSIZ_PKCNT_SHIFT) /* Packet count */ +#define N32_USBHS_HCHTXSIZ_PID_SHIFT 29 +#define N32_USBHS_HCHTXSIZ_PID_MASK (3UL << N32_USBHS_HCHTXSIZ_PID_SHIFT) /* Data PID */ +# define N32_USBHS_HCHTXSIZ_PID_0 (0UL << N32_USBHS_HCHTXSIZ_PID_SHIFT) /* Data0 */ +# define N32_USBHS_HCHTXSIZ_PID_2 (1UL << N32_USBHS_HCHTXSIZ_PID_SHIFT) /* Data2 */ +# define N32_USBHS_HCHTXSIZ_PID_1 (2UL << N32_USBHS_HCHTXSIZ_PID_SHIFT) /* Data1 */ +# define N32_USBHS_HCHTXSIZ_PID_M_S (3UL << N32_USBHS_HCHTXSIZ_PID_SHIFT) /* MData/Setup */ +#define N32_USBHS_HCHTXSIZ_DPING (1UL << 31) /* PING token request */ + +/* HCHDMADD (0x514 + n0x20) *************************************************/ +#define N32_USBHS_HCHDMADD_MASK (0xFFFFFFFFUL) /* DMA address */ + +/* ========================================================================== + * Device Mode Registers + * ========================================================================== + */ + +/* DCFG (0x800) *************************************************************/ +#define N32_USBHS_DCFG_DEVSPD_SHIFT 0 +#define N32_USBHS_DCFG_DEVSPD_MASK (3UL << N32_USBHS_DCFG_DEVSPD_SHIFT) /* Device speed (00:High speed, 01:Full speed) */ +#define N32_USBHS_DCFG_NZLSOUTHSK (1UL << 2) /* Non-zero-length status OUT handshake */ +#define N32_USBHS_DCFG_DEVARR_SHIFT 4 +#define N32_USBHS_DCFG_DEVARR_MASK (0x7FUL << N32_USBHS_DCFG_DEVARR_SHIFT) /* Device address */ +#define N32_USBHS_DCFG_PFRITVL_SHIFT 11 +#define N32_USBHS_DCFG_PFRITVL_MASK (3UL << N32_USBHS_DCFG_PFRITVL_SHIFT) /* Periodic frame interval */ +# define N32_USBHS_DCFG_PFRITVL_80 (0UL << N32_USBHS_DCFG_PFRITVL_SHIFT) /* 80% frame interval */ +# define N32_USBHS_DCFG_PFRITVL_85 (1UL << N32_USBHS_DCFG_PFRITVL_SHIFT) /* 85% frame interval */ +# define N32_USBHS_DCFG_PFRITVL_90 (2UL << N32_USBHS_DCFG_PFRITVL_SHIFT) /* 90% frame interval */ +# define N32_USBHS_DCFG_PFRITVL_95 (3UL << N32_USBHS_DCFG_PFRITVL_SHIFT) /* 95% frame interval */ +#define N32_USBHS_DCFG_XCVDRLY (1UL << 14) /* Transceiver delay */ +#define N32_USBHS_DCFG_EERRAIEN (1UL << 15) /* Erratic error interrupt enable */ +#define N32_USBHS_DCFG_PSITVL_SHIFT 24 +#define N32_USBHS_DCFG_PSITVL_MASK (3UL << N32_USBHS_DCFG_PSITVL_SHIFT) /* Periodic schedule interval */ +# define N32_USBHS_DCFG_PSITVL_25 (0UL << N32_USBHS_DCFG_PSITVL_SHIFT) /* 25% frame interval */ +# define N32_USBHS_DCFG_PSITVL_50 (1UL << N32_USBHS_DCFG_PSITVL_SHIFT) /* 50% frame interval */ +# define N32_USBHS_DCFG_PSITVL_75 (2UL << N32_USBHS_DCFG_PSITVL_SHIFT) /* 75% frame interval */ + +/* DCTRL (0x804) ************************************************************/ +#define N32_USBHS_DCTRL_RMWKUP (1UL << 0) /* Remote wakeup signaling */ +#define N32_USBHS_DCTRL_SFTDIS (1UL << 1) /* Soft disconnect */ +#define N32_USBHS_DCTRL_GINAKSTS (1UL << 2) /* Global IN NAK status */ +#define N32_USBHS_DCTRL_GONAKSTS (1UL << 3) /* Global OUT NAK status */ +#define N32_USBHS_DCTRL_TSCTRL_SHIFT 4 +#define N32_USBHS_DCTRL_TSCTRL_MASK (7UL << N32_USBHS_DCTRL_TSCTRL_SHIFT) /* Test control */ +# define N32_USBHS_DCTRL_TSCTRL_TEST_NO (0UL << N32_USBHS_DCTRL_TSCTRL_SHIFT) /* No test */ +# define N32_USBHS_DCTRL_TSCTRL_TEST_J (1UL << N32_USBHS_DCTRL_TSCTRL_SHIFT) /* Test_J mode */ +# define N32_USBHS_DCTRL_TSCTRL_TEST_K (2UL << N32_USBHS_DCTRL_TSCTRL_SHIFT) /* Test_K mode */ +# define N32_USBHS_DCTRL_TSCTRL_TEST_SN (3UL << N32_USBHS_DCTRL_TSCTRL_SHIFT) /* Test_SE0_NAK mode */ +# define N32_USBHS_DCTRL_TSCTRL_TEST_PK (4UL << N32_USBHS_DCTRL_TSCTRL_SHIFT) /* Test_Packet mode */ +# define N32_USBHS_DCTRL_TSCTRL_TEST_FE (5UL << N32_USBHS_DCTRL_TSCTRL_SHIFT) /* Test forced enable */ +#define N32_USBHS_DCTRL_SGINAK (1UL << 7) /* Set global IN NAK */ +#define N32_USBHS_DCTRL_CGNPINAK (1UL << 8) /* Clear global IN NAK */ +#define N32_USBHS_DCTRL_SGONAK (1UL << 9) /* Set global OUT NAK */ +#define N32_USBHS_DCTRL_CGONAK (1UL << 10) /* Clear global OUT NAK */ +#define N32_USBHS_DCTRL_POPDNE (1UL << 11) /* Power-on programming done */ +#define N32_USBHS_DCTRL_NAKOBBLE (1UL << 16) /* NAK on babble error */ + +/* DSTS (0x808) *************************************************************/ +#define N32_USBHS_DSTS_SUSPF (1UL << 0) /* Suspend status */ +#define N32_USBHS_DSTS_ENUMSPD_SHIFT 1 +#define N32_USBHS_DSTS_ENUMSPD_MASK (3UL << N32_USBHS_DSTS_ENUMSPD_SHIFT) /* Enumerated speed (00:High speed, 01:Full speed, 10:Low speed, 11:Low speed) */ +#define N32_USBHS_DSTS_ERERRF (1UL << 3) /* Erratic error */ +#define N32_USBHS_DSTS_SOFFN_SHIFT 8 +#define N32_USBHS_DSTS_SOFFN_MASK (0x3FFFUL << N32_USBHS_DSTS_SOFFN_SHIFT) /* SOF frame number */ +#define N32_USBHS_DSTS_DEVLINSTS_SHIFT 22 +#define N32_USBHS_DSTS_DEVLINSTS_MASK (3UL << N32_USBHS_DSTS_DEVLINSTS_SHIFT) /* Device line status */ +# define N32_USBHS_DSTS_DEVLINSTS_DM0DP0 (0UL << N32_USBHS_DSTS_DEVLINSTS_SHIFT) /* DM=0, DP=0 */ +# define N32_USBHS_DSTS_DEVLINSTS_DM0DP1 (1UL << N32_USBHS_DSTS_DEVLINSTS_SHIFT) /* DM=0, DP=1 */ +# define N32_USBHS_DSTS_DEVLINSTS_DM1DP0 (2UL << N32_USBHS_DSTS_DEVLINSTS_SHIFT) /* DM=1, DP=0 */ + +/* DINEPINTEN (0x810) *******************************************************/ +#define N32_USBHS_DINEPINTEN_TXCIEN (1UL << 0) /* Transfer completed interrupt enable */ +#define N32_USBHS_DINEPINTEN_EPDIEN (1UL << 1) /* Endpoint disabled interrupt enable */ +#define N32_USBHS_DINEPINTEN_AHBERRIEN (1UL << 2) /* AHB error interrupt enable */ +#define N32_USBHS_DINEPINTEN_TOIEN (1UL << 3) /* Timeout interrupt enable */ +#define N32_USBHS_DINEPINTEN_TXFERINTKIEN (1UL << 4) /* IN token when TxFIFO empty */ +#define N32_USBHS_DINEPINTEN_INTREPMISIEN (1UL << 5) /* IN token with EP mismatch */ +#define N32_USBHS_DINEPINTEN_INEPNAKEIEN (1UL << 6) /* IN endpoint NAK effective */ +#define N32_USBHS_DINEPINTEN_TXFUDIEN (1UL << 8) /* Tx FIFO underrun interrupt enable */ +#define N32_USBHS_DINEPINTEN_NAKIEN (1UL << 13) /* NAK interrupt enable */ + +/* DOUTEPINTEN (0x814) ******************************************************/ +#define N32_USBHS_DOUTEPINTEN_TXCIEN (1UL << 0) /* Transfer completed interrupt enable */ +#define N32_USBHS_DOUTEPINTEN_EPDIEN (1UL << 1) /* Endpoint disabled interrupt enable */ +#define N32_USBHS_DOUTEPINTEN_AHBERRIEN (1UL << 2) /* AHB error interrupt enable */ +#define N32_USBHS_DOUTEPINTEN_STUPDNEIEN (1UL << 3) /* SETUP phase done interrupt enable */ +#define N32_USBHS_DOUTEPINTEN_EPDISROTIEN (1UL << 4) /* OUT token when EP disabled */ +#define N32_USBHS_DOUTEPINTEN_B2BSTUPIEN (1UL << 6) /* Back-to-back SETUP packets */ +#define N32_USBHS_DOUTEPINTEN_OPERRIEN (1UL << 8) /* OUT packet error interrupt enable */ +#define N32_USBHS_DOUTEPINTEN_BERRIEN (1UL << 12) /* Babble error interrupt enable */ +#define N32_USBHS_DOUTEPINTEN_NAKIEN (1UL << 13) /* NAK interrupt enable */ +#define N32_USBHS_DOUTEPINTEN_NYETIEN (1UL << 14) /* NYET interrupt enable */ + +/* DAEPINTSTS (0x818) *******************************************************/ +#define N32_USBHS_DAEPINTSTS_INEPINT_SHIFT 0 +#define N32_USBHS_DAEPINTSTS_INEPINT_MASK (0x1FFUL << N32_USBHS_DAEPINTSTS_INEPINT_SHIFT) /* IN EP bits 0..8 */ +#define N32_USBHS_DAEPINTSTS_OUTEPINT_SHIFT 16 +#define N32_USBHS_DAEPINTSTS_OUTEPINT_MASK (0x1FFUL << N32_USBHS_DAEPINTSTS_OUTEPINT_SHIFT) /* OUT EP bits 0..8 */ + +/* DAEPINTEN (0x81C) ********************************************************/ +#define N32_USBHS_DAEPINTEN_INEPIEN_SHIFT 0 +#define N32_USBHS_DAEPINTEN_INEPIEN_MASK (0x1FFUL << N32_USBHS_DAEPINTEN_INEPIEN_SHIFT) +#define N32_USBHS_DAEPINTEN_OUTEPIEN_SHIFT 16 +#define N32_USBHS_DAEPINTEN_OUTEPIEN_MASK (0x1FFUL << N32_USBHS_DAEPINTEN_OUTEPIEN_SHIFT) + +/* DTHRCTRL (0x830) *********************************************************/ +#define N32_USBHS_DTHRCTRL_NISOINEPTHREN (1UL << 0) /* Non-isochronous IN EP threshold enable */ +#define N32_USBHS_DTHRCTRL_ISOINEPTHREN (1UL << 1) /* Isochronous IN EP threshold enable */ +#define N32_USBHS_DTHRCTRL_TXTHRLEN_SHIFT 2 +#define N32_USBHS_DTHRCTRL_TXTHRLEN_MASK (0x1FFUL << N32_USBHS_DTHRCTRL_TXTHRLEN_SHIFT) /* Tx threshold length */ +#define N32_USBHS_DTHRCTRL_RXTHREN (1UL << 16) /* Receive threshold enable */ +#define N32_USBHS_DTHRCTRL_RXTHRLEN_SHIFT 17 +#define N32_USBHS_DTHRCTRL_RXTHRLEN_MASK (0x1FFUL << N32_USBHS_DTHRCTRL_RXTHRLEN_SHIFT) /* Rx threshold length */ +#define N32_USBHS_DTHRCTRL_ARPEN (1UL << 27) /* Arbiter register enable */ + +/* DINEPFEINTEN (0x834) *****************************************************/ +#define N32_USBHS_DINEPFEINTEN_INEPTXFEIEN_MASK (0xFFFFUL) /* IN EP Tx FIFO empty interrupt enable */ + +/* DEEPINTSTS (0x838) *******************************************************/ +#define N32_USBHS_DEEPINTSTS_INEPINT_SHIFT 0 +#define N32_USBHS_DEEPINTSTS_INEPINT_MASK (0xFFUL << N32_USBHS_DEEPINTSTS_INEPINT_SHIFT) /* IN EP 0..7 */ +#define N32_USBHS_DEEPINTSTS_OUTEPINT_SHIFT 16 +#define N32_USBHS_DEEPINTSTS_OUTEPINT_MASK (0xFFUL << N32_USBHS_DEEPINTSTS_OUTEPINT_SHIFT) /* OUT EP 0..7 */ + +/* DEEPINTEN (0x83C) ********************************************************/ +#define N32_USBHS_DEEPINTEN_INEPIEN_SHIFT 0 +#define N32_USBHS_DEEPINTEN_INEPIEN_MASK (0xFFUL << N32_USBHS_DEEPINTEN_INEPIEN_SHIFT) +#define N32_USBHS_DEEPINTEN_OUTEPIEN_SHIFT 16 +#define N32_USBHS_DEEPINTEN_OUTEPIEN_MASK (0xFFUL << N32_USBHS_DEEPINTEN_OUTEPIEN_SHIFT) + +/* DINEPXINTEN (0x840 + x4) (x=0..8) ****************************************/ +#define N32_USBHS_DINEPXINTEN_TXCIEN (1UL << 0) /* Transfer completed interrupt enable */ +#define N32_USBHS_DINEPXINTEN_EPDISIEN (1UL << 1) /* Endpoint disabled interrupt enable */ +#define N32_USBHS_DINEPXINTEN_AHBERRIEN (1UL << 2) /* AHB error interrupt enable */ +#define N32_USBHS_DINEPXINTEN_TOIEN (1UL << 3) /* Timeout interrupt enable */ +#define N32_USBHS_DINEPXINTEN_TXFERINTKIEN (1UL << 4) /* IN token when TxFIFO empty */ +#define N32_USBHS_DINEPXINTEN_INTREPMISIEN (1UL << 5) /* EP mismatch interrupt enable */ +#define N32_USBHS_DINEPXINTEN_INEPNAKEIEN (1UL << 6) /* IN EP NAK effective interrupt enable */ +#define N32_USBHS_DINEPXINTEN_TXFUDIEN (1UL << 8) /* Tx FIFO underrun interrupt enable */ +#define N32_USBHS_DINEPXINTEN_NAKIEN (1UL << 13) /* NAK interrupt enable */ + +/* DOUTEPXINTEN (0x880 + x4) (x=0..8) ***************************************/ +#define N32_USBHS_DOUTEPXINTEN_TXCIEN (1UL << 0) /* Transfer completed interrupt enable */ +#define N32_USBHS_DOUTEPXINTEN_EPDIEN (1UL << 1) /* Endpoint disabled interrupt enable */ +#define N32_USBHS_DOUTEPXINTEN_AHBERRIEN (1UL << 2) /* AHB error interrupt enable */ +#define N32_USBHS_DOUTEPXINTEN_STUPDNEIEN (1UL << 3) /* SETUP phase done interrupt enable */ +#define N32_USBHS_DOUTEPXINTEN_EPDISROTIEN (1UL << 4) /* OUT token when EP disabled */ +#define N32_USBHS_DOUTEPXINTEN_B2BSTUPIEN (1UL << 6) /* Back-to-back SETUP packets */ +#define N32_USBHS_DOUTEPXINTEN_OPERRIEN (1UL << 8) /* OUT packet error interrupt enable */ +#define N32_USBHS_DOUTEPXINTEN_BERRIEN (1UL << 12) /* Babble error interrupt enable */ +#define N32_USBHS_DOUTEPXINTEN_NAKIEN (1UL << 13) /* NAK interrupt enable */ +#define N32_USBHS_DOUTEPXINTEN_NYETIEN (1UL << 14) /* NYET interrupt enable */ + +/* ========================================================================== + * Device IN Endpoint Registers (0x900 + ep*0x20) + * ========================================================================== + */ + +/* DINEPCTRL (EP0) **********************************************************/ +#define N32_USBHS_DINEP0CTRL_MPLEN_SHIFT 0 +#define N32_USBHS_DINEP0CTRL_MPLEN_MASK (3UL << N32_USBHS_DINEP0CTRL_MPLEN_SHIFT) /* Max packet size */ +# define N32_USBHS_DINEP0CTRL_MPLEN_64 (0UL << N32_USBHS_DINEP0CTRL_MPLEN_SHIFT) /* 64 bytes */ +# define N32_USBHS_DINEP0CTRL_MPLEN_32 (1UL << N32_USBHS_DINEP0CTRL_MPLEN_SHIFT) /* 32 bytes */ +# define N32_USBHS_DINEP0CTRL_MPLEN_16 (2UL << N32_USBHS_DINEP0CTRL_MPLEN_SHIFT) /* 16 bytes */ +# define N32_USBHS_DINEP0CTRL_MPLEN_8 (3UL << N32_USBHS_DINEP0CTRL_MPLEN_SHIFT) /* 8 bytes */ +#define N32_USBHS_DINEP0CTRL_EPACT (1UL << 15) /* USB active endpoint */ +#define N32_USBHS_DINEP0CTRL_NAKSTS (1UL << 17) /* NAK status */ +#define N32_USBHS_DINEP0CTRL_EPTYPE_MASK (3UL << 18) /* Endpoint type (must be 00:CTRL) */ +#define N32_USBHS_DINEP0CTRL_STALL (1UL << 21) /* STALL handshake */ +#define N32_USBHS_DINEP0CTRL_TXFNUM_SHIFT 22 +#define N32_USBHS_DINEP0CTRL_TXFNUM_MASK (0xFUL << N32_USBHS_DINEP0CTRL_TXFNUM_SHIFT) /* Tx FIFO number */ +#define N32_USBHS_DINEP0CTRL_CNAK (1UL << 26) /* Clear NAK */ +#define N32_USBHS_DINEP0CTRL_SNAK (1UL << 27) /* Set NAK */ +#define N32_USBHS_DINEP0CTRL_EPDIS (1UL << 30) /* Endpoint disable */ +#define N32_USBHS_DINEP0CTRL_EPEN (1UL << 31) /* Endpoint enable */ + +/* DINEPCTRL (EP1..8) *******************************************************/ +#define N32_USBHS_DINEPCTRL_MPLEN_SHIFT 0 +#define N32_USBHS_DINEPCTRL_MPLEN_MASK (0x7FFUL << N32_USBHS_DINEPCTRL_MPLEN_SHIFT) /* Max packet size */ +#define N32_USBHS_DINEPCTRL_EPACT (1UL << 15) /* USB active endpoint */ +#define N32_USBHS_DINEPCTRL_EPDPID_EPEOFRM (1UL << 16) /* Data PID / Even/odd frame */ +#define N32_USBHS_DINEPCTRL_NAKSTS (1UL << 17) /* NAK status */ +#define N32_USBHS_DINEPCTRL_EPTYPE_SHIFT 18 +#define N32_USBHS_DINEPCTRL_EPTYPE_MASK (3UL << N32_USBHS_DINEPCTRL_EPTYPE_SHIFT) /* Endpoint type */ +# define N32_USBHS_DINEPCTRL_EPTYPE_CTRL (0UL << N32_USBHS_DINEPCTRL_EPTYPE_SHIFT) /* CTRL */ +# define N32_USBHS_DINEPCTRL_EPTYPE_ISOC (1UL << N32_USBHS_DINEPCTRL_EPTYPE_SHIFT) /* ISOC */ +# define N32_USBHS_DINEPCTRL_EPTYPE_BULK (2UL << N32_USBHS_DINEPCTRL_EPTYPE_SHIFT) /* BULK */ +# define N32_USBHS_DINEPCTRL_EPTYPE_INTR (3UL << N32_USBHS_DINEPCTRL_EPTYPE_SHIFT) /* INTR */ +#define N32_USBHS_DINEPCTRL_STALL (1UL << 21) /* STALL handshake */ +#define N32_USBHS_DINEPCTRL_TXFNUM_SHIFT 22 +#define N32_USBHS_DINEPCTRL_TXFNUM_MASK (0xFUL << N32_USBHS_DINEPCTRL_TXFNUM_SHIFT) /* Tx FIFO number */ +#define N32_USBHS_DINEPCTRL_CNAK (1UL << 26) /* Clear NAK */ +#define N32_USBHS_DINEPCTRL_SNAK (1UL << 27) /* Set NAK */ +#define N32_USBHS_DINEPCTRL_SD0PID_SEVNFRM (1UL << 28) /* Set DATA0 / Even frame */ +#define N32_USBHS_DINEPCTRL_SD1PID_SODDFRM (1UL << 29) /* Set DATA1 / Odd frame */ +#define N32_USBHS_DINEPCTRL_EPDIS (1UL << 30) /* Endpoint disable */ +#define N32_USBHS_DINEPCTRL_EPEN (1UL << 31) /* Endpoint enable */ + +/* DINEPINTSTS (0x908 + ep0x20) *********************************************/ +#define N32_USBHS_DINEPINTSTS_TXCIF (1UL << 0) /* Transfer completed interrupt */ +#define N32_USBHS_DINEPINTSTS_EPDISIF (1UL << 1) /* Endpoint disabled interrupt */ +#define N32_USBHS_DINEPINTSTS_AHBERRIF (1UL << 2) /* AHB error interrupt */ +#define N32_USBHS_DINEPINTSTS_TOUTIF (1UL << 3) /* Timeout condition */ +#define N32_USBHS_DINEPINTSTS_TXFERINTIF (1UL << 4) /* IN token when TxFIFO empty */ +#define N32_USBHS_DINEPINTSTS_INEPMISIF (1UL << 5) /* IN endpoint mismatch */ +#define N32_USBHS_DINEPINTSTS_INEPNAKEIF (1UL << 6) /* IN endpoint NAK effective */ +#define N32_USBHS_DINEPINTSTS_TXFEIF (1UL << 7) /* Transmit FIFO empty */ +#define N32_USBHS_DINEPINTSTS_TXFUDRIF (1UL << 8) /* Tx FIFO underrun */ +#define N32_USBHS_DINEPINTSTS_PKDRPSTS (1UL << 11) /* Packet dropped status */ +#define N32_USBHS_DINEPINTSTS_BBERRIF (1UL << 12) /* Babble error */ +#define N32_USBHS_DINEPINTSTS_NAKIF (1UL << 13) /* NAK interrupt */ +#define N32_USBHS_DINEPINTSTS_NYETIF (1UL << 14) /* NYET interrupt */ + +/* DINEPTXSIZ (0x910 + ep0x20) EP0 vs others ********************************/ + +/* EP0 */ +#define N32_USBHS_DINEP0TXSIZ_TLEN_SHIFT 0 +#define N32_USBHS_DINEP0TXSIZ_TLEN_MASK (0x7FUL << N32_USBHS_DINEP0TXSIZ_TLEN_SHIFT) /* Transfer size */ +#define N32_USBHS_DINEP0TXSIZ_PKTCNT_SHIFT 19 +#define N32_USBHS_DINEP0TXSIZ_PKTCNT_MASK (3UL << N32_USBHS_DINEP0TXSIZ_PKTCNT_SHIFT) /* Packet count */ + +/* EP1..8 */ +#define N32_USBHS_DINEPTXSIZ_TLEN_SHIFT 0 +#define N32_USBHS_DINEPTXSIZ_TLEN_MASK (0x7FFFFUL << N32_USBHS_DINEPTXSIZ_TLEN_SHIFT) +#define N32_USBHS_DINEPTXSIZ_PKTCNT_SHIFT 19 +#define N32_USBHS_DINEPTXSIZ_PKTCNT_MASK (0x3FFUL << N32_USBHS_DINEPTXSIZ_PKTCNT_SHIFT) +#define N32_USBHS_DINEPTXSIZ_MCNT_SHIFT 29 +#define N32_USBHS_DINEPTXSIZ_MCNT_MASK (3UL << N32_USBHS_DINEPTXSIZ_MCNT_SHIFT) /* Multi count */ + +/* DINEPDMADD (0x914 + ep0x20) **********************************************/ +#define N32_USBHS_DINEPDMADD_MASK (0xFFFFFFFFUL) /* DMA address */ + +/* DINEPTXFSTS (0x918 + ep0x20) *********************************************/ +#define N32_USBHS_DINEPTXFSTS_TXFSPCAVL_SHIFT 0 +#define N32_USBHS_DINEPTXFSTS_TXFSPCAVL_MASK (0xFFFFUL << N32_USBHS_DINEPTXFSTS_TXFSPCAVL_SHIFT) + +/* ========================================================================== + * Device OUT Endpoint Registers (0xB00 + ep*0x20) + * ========================================================================== + */ + +/* DOUTEPCTRL (EP0) *********************************************************/ +#define N32_USBHS_DOUTEP0CTRL_MPLEN_SHIFT 0 +#define N32_USBHS_DOUTEP0CTRL_MPLEN_MASK (3UL << N32_USBHS_DOUTEP0CTRL_MPLEN_SHIFT) /* Max packet size */ +# define N32_USBHS_DOUTEP0CTRL_MPLEN_64 (0UL << N32_USBHS_DOUTEP0CTRL_MPLEN_SHIFT) /* 64 bytes */ +# define N32_USBHS_DOUTEP0CTRL_MPLEN_32 (1UL << N32_USBHS_DOUTEP0CTRL_MPLEN_SHIFT) /* 32 bytes */ +# define N32_USBHS_DOUTEP0CTRL_MPLEN_16 (2UL << N32_USBHS_DOUTEP0CTRL_MPLEN_SHIFT) /* 16 bytes */ +# define N32_USBHS_DOUTEP0CTRL_MPLEN_8 (3UL << N32_USBHS_DOUTEP0CTRL_MPLEN_SHIFT) /* 8 bytes */ +#define N32_USBHS_DOUTEP0CTRL_EPACT (1UL << 15) /* USB active endpoint */ +#define N32_USBHS_DOUTEP0CTRL_NAKSTS (1UL << 17) /* NAK status */ +#define N32_USBHS_DOUTEP0CTRL_EPTYPE_MASK (3UL << 18) /* Endpoint type (must be 00:CTRL) */ +#define N32_USBHS_DOUTEP0CTRL_STALL (1UL << 21) /* STALL handshake */ +#define N32_USBHS_DOUTEP0CTRL_CNAK (1UL << 26) /* Clear NAK */ +#define N32_USBHS_DOUTEP0CTRL_SNAK (1UL << 27) /* Set NAK */ +#define N32_USBHS_DOUTEP0CTRL_EPDIS (1UL << 30) /* Endpoint disable */ +#define N32_USBHS_DOUTEP0CTRL_EPEN (1UL << 31) /* Endpoint enable */ + +/* DOUTEPCTRL (EP1..8) ******************************************************/ +#define N32_USBHS_DOUTEPCTRL_MPLEN_SHIFT 0 +#define N32_USBHS_DOUTEPCTRL_MPLEN_MASK (0x7FFUL << N32_USBHS_DOUTEPCTRL_MPLEN_SHIFT) /* Max packet size */ +#define N32_USBHS_DOUTEPCTRL_EPACT (1UL << 15) /* USB active endpoint */ +#define N32_USBHS_DOUTEPCTRL_EPDPID_EPEOFRM (1UL << 16) /* Data PID / Even/odd frame */ +#define N32_USBHS_DOUTEPCTRL_NAKSTS (1UL << 17) /* NAK status */ +#define N32_USBHS_DOUTEPCTRL_EPTYPE_SHIFT 18 +#define N32_USBHS_DOUTEPCTRL_EPTYPE_MASK (3UL << N32_USBHS_DOUTEPCTRL_EPTYPE_SHIFT) /* Endpoint type */ +# define N32_USBHS_DOUTEPCTRL_EPTYPE_CTRL (0UL << N32_USBHS_DOUTEPCTRL_EPTYPE_SHIFT) /* CTRL */ +# define N32_USBHS_DOUTEPCTRL_EPTYPE_ISOC (1UL << N32_USBHS_DOUTEPCTRL_EPTYPE_SHIFT) /* ISOOC */ +# define N32_USBHS_DOUTEPCTRL_EPTYPE_BULK (2UL << N32_USBHS_DOUTEPCTRL_EPTYPE_SHIFT) /* BULK */ +# define N32_USBHS_DOUTEPCTRL_EPTYPE_INTR (3UL << N32_USBHS_DOUTEPCTRL_EPTYPE_SHIFT) /* INTR */ +#define N32_USBHS_DOUTEPCTRL_STALL (1UL << 21) /* STALL handshake */ +#define N32_USBHS_DOUTEPCTRL_CNAK (1UL << 26) /* Clear NAK */ +#define N32_USBHS_DOUTEPCTRL_SNAK (1UL << 27) /* Set NAK */ +#define N32_USBHS_DOUTEPCTRL_SD0PID_SEVNFRM (1UL << 28) /* Set DATA0 / Even frame */ +#define N32_USBHS_DOUTEPCTRL_SD1PID_SODDFRM (1UL << 29) /* Set DATA1 / Odd frame */ +#define N32_USBHS_DOUTEPCTRL_EPDIS (1UL << 30) /* Endpoint disable */ +#define N32_USBHS_DOUTEPCTRL_EPEN (1UL << 31) /* Endpoint enable */ + +/* DOUTEPINTSTS (0xB08 + ep0x20) ********************************************/ +#define N32_USBHS_DOUTEPINTSTS_TXCIF (1UL << 0) /* Transfer completed interrupt */ +#define N32_USBHS_DOUTEPINTSTS_EPDISIF (1UL << 1) /* Endpoint disabled interrupt */ +#define N32_USBHS_DOUTEPINTSTS_AHBERRIF (1UL << 2) /* AHB error interrupt */ +#define N32_USBHS_DOUTEPINTSTS_STUPPDNEIF (1UL << 3) /* SETUP phase done */ +#define N32_USBHS_DOUTEPINTSTS_OUTTRXEPDISIF (1UL << 4) /* OUT token when EP disabled */ +#define N32_USBHS_DOUTEPINTSTS_STSPRXIF (1UL << 5) /* Status phase received */ +#define N32_USBHS_DOUTEPINTSTS_B2BSTUPRIF (1UL << 6) /* Back-to-back SETUP packets */ +#define N32_USBHS_DOUTEPINTSTS_OUTPCKERRIF (1UL << 8) /* OUT packet error */ +#define N32_USBHS_DOUTEPINTSTS_PKDRPSTS (1UL << 11) /* Packet dropped status */ +#define N32_USBHS_DOUTEPINTSTS_BBERRIF (1UL << 12) /* Babble error */ +#define N32_USBHS_DOUTEPINTSTS_NAKIF (1UL << 13) /* NAK interrupt */ +#define N32_USBHS_DOUTEPINTSTS_NYETIF (1UL << 14) /* NYET interrupt */ +#define N32_USBHS_DOUTEPINTSTS_STUPPRXIF (1UL << 15) /* SETUP packet received (DMA mode) */ + +/* DOUTEPTXSIZ (0xB10 + ep0x20) EP0 vs others *******************************/ + +/* EP0 */ +#define N32_USBHS_DOUTEP0TXSIZ_TLEN_SHIFT 0 +#define N32_USBHS_DOUTEP0TXSIZ_TLEN_MASK (0x7FUL << N32_USBHS_DOUTEP0TXSIZ_TLEN_SHIFT) /* Transfer size */ +#define N32_USBHS_DOUTEP0TXSIZ_PKTCNT_SHIFT 19 +#define N32_USBHS_DOUTEP0TXSIZ_PKTCNT_MASK (1UL << N32_USBHS_DOUTEP0TXSIZ_PKTCNT_SHIFT) /* Packet count */ +#define N32_USBHS_DOUTEP0TXSIZ_STUPPCNT_SHIFT 29 +#define N32_USBHS_DOUTEP0TXSIZ_STUPPCNT_MASK (3UL << N32_USBHS_DOUTEP0TXSIZ_STUPPCNT_SHIFT) /* SETUP packet count */ + +/* EP1..8 */ +#define N32_USBHS_DOUTEPTXSIZ_TLEN_SHIFT 0 +#define N32_USBHS_DOUTEPTXSIZ_TLEN_MASK (0x7FFFFUL << N32_USBHS_DOUTEPTXSIZ_TLEN_SHIFT) +#define N32_USBHS_DOUTEPTXSIZ_PKTCNT_SHIFT 19 +#define N32_USBHS_DOUTEPTXSIZ_PKTCNT_MASK (0x3FFUL << N32_USBHS_DOUTEPTXSIZ_PKTCNT_SHIFT) +#define N32_USBHS_DOUTEPTXSIZ_STUPPCNT_RXDPID_SHIFT 29 +#define N32_USBHS_DOUTEPTXSIZ_STUPPCNT_RXDPID_MASK (3UL << N32_USBHS_DOUTEPTXSIZ_STUPPCNT_RXDPID_SHIFT) /* SETUP count / RX Data PID */ +# define N32_USBHS_DOUTEPTXSIZ_RXDPID_0 (0UL << N32_USBHS_DOUTEPTXSIZ_STUPPCNT_RXDPID_SHIFT) /* Data0 */ +# define N32_USBHS_DOUTEPTXSIZ_RXDPID_2 (1UL << N32_USBHS_DOUTEPTXSIZ_STUPPCNT_RXDPID_SHIFT) /* Data2 */ +# define N32_USBHS_DOUTEPTXSIZ_RXDPID_1 (2UL << N32_USBHS_DOUTEPTXSIZ_STUPPCNT_RXDPID_SHIFT) /* Data1 */ +# define N32_USBHS_DOUTEPTXSIZ_RXDPID_M (3UL << N32_USBHS_DOUTEPTXSIZ_STUPPCNT_RXDPID_SHIFT) /* MData */ + +/* DOUTEPDMADD (0xB14 + ep0x20) *********************************************/ +#define N32_USBHS_DOUTEPDMADD_MASK (0xFFFFFFFFUL) /* DMA address */ + +/* ========================================================================== + * Power Control Registers + * ========================================================================== + */ + +/* PWRCTRL (0xE00) **********************************************************/ +#define N32_USBHS_PWRCTRL_PHYSTP (1UL << 0) /* Stop PHY clock */ +#define N32_USBHS_PWRCTRL_GATEHCLK (1UL << 1) /* Gate HCLK */ +#define N32_USBHS_PWRCTRL_PDMRST (1UL << 3) /* Reset power-down module */ +#define N32_USBHS_PWRCTRL_PHYSLEEP (1UL << 6) /* PHY sleep */ +#define N32_USBHS_PWRCTRL_DSLEEP (1UL << 7) /* Deep sleep */ + +/* PWRCTRL1 (0xE04) *********************************************************/ +#define N32_USBHS_PWRCTRL1_GATEN (1UL << 0) /* Enable activity clock gating */ +#define N32_USBHS_PWRCTRL1_CNT_SHIFT 1 +#define N32_USBHS_PWRCTRL1_CNT_MASK (3UL << N32_USBHS_PWRCTRL1_CNT_SHIFT) /* Gating clock count */ +# define N32_USBHS_PWRCTRL1_CNT_64 (0UL << N32_USBHS_PWRCTRL1_CNT_SHIFT) /* 64 clocks */ +# define N32_USBHS_PWRCTRL1_CNT_128 (1UL << N32_USBHS_PWRCTRL1_CNT_SHIFT) /* 128 clocks */ +#define N32_USBHS_PWRCTRL1_RAMCLKEN (1UL << 3) /* RAM clock gating enable */ + +/* ========================================================================== + * Wrapper Registers (separate base) + * ========================================================================== + */ + +/* WRPCTRL (0x000) **********************************************************/ +#define N32_USBHS_WRPCTRL_PINDETEN (1UL << 16) /* Pin detection enable */ +#define N32_USBHS_WRPCTRL_VBRMDETEN (1UL << 17) /* VBUS removal detect enable */ +#define N32_USBHS_WRPCTRL_HDISCEN (1UL << 18) /* Host disconnect detect enable */ +#define N32_USBHS_WRPCTRL_IDDETEN (1UL << 19) /* ID detect enable */ +#define N32_USBHS_WRPCTRL_SUSPWKEN (1UL << 20) /* Suspend wake-up enable */ +#define N32_USBHS_WRPCTRL_LSCHGEN (1UL << 21) /* Line status change detection enable */ + +/* WRPCFG (0x004) ***********************************************************/ +#define N32_USBHS_WRPCFG_PHYCLKSEL_SHIFT 0 +#define N32_USBHS_WRPCFG_PHYCLKSEL_MASK (7UL << N32_USBHS_WRPCFG_PHYCLKSEL_SHIFT) /* PHY clock select */ +# define N32_USBHS_WRPCFG_PHYCLKSEL_10 (0UL << N32_USBHS_WRPCFG_PHYCLKSEL_SHIFT) /* 10MHz */ +# define N32_USBHS_WRPCFG_PHYCLKSEL_12 (1UL << N32_USBHS_WRPCFG_PHYCLKSEL_SHIFT) /* 12MHz */ +# define N32_USBHS_WRPCFG_PHYCLKSEL_25 (2UL << N32_USBHS_WRPCFG_PHYCLKSEL_SHIFT) /* 25MHz */ +# define N32_USBHS_WRPCFG_PHYCLKSEL_30 (3UL << N32_USBHS_WRPCFG_PHYCLKSEL_SHIFT) /* 30MHz */ +# define N32_USBHS_WRPCFG_PHYCLKSEL_19_2 (4UL << N32_USBHS_WRPCFG_PHYCLKSEL_SHIFT) /* 19.2MHz */ +# define N32_USBHS_WRPCFG_PHYCLKSEL_24 (5UL << N32_USBHS_WRPCFG_PHYCLKSEL_SHIFT) /* 24MHz */ +# define N32_USBHS_WRPCFG_PHYCLKSEL_27 (6UL << N32_USBHS_WRPCFG_PHYCLKSEL_SHIFT) /* 27MHz */ +# define N32_USBHS_WRPCFG_PHYCLKSEL_40 (7UL << N32_USBHS_WRPCFG_PHYCLKSEL_SHIFT) /* 40MHz */ +#define N32_USBHS_WRPCFG_PLLEN (1UL << 3) /* PLL enable */ +#define N32_USBHS_WRPCFG_IDEN (1UL << 9) /* ID pin enable */ +#define N32_USBHS_WRPCFG_LSEN (1UL << 10) /* Low-swing enable */ +#define N32_USBHS_WRPCFG_SOFDEN (1UL << 11) /* SOF detection enable */ +#define N32_USBHS_WRPCFG_IDSIG (1UL << 12) /* Internal ID signal (when IDEN=0) */ + +#endif /* __ARCH_ARM_SRC_N32H7_HARDWARE_N32H7_USBHS_H */ diff --git a/arch/arm/src/n32h7/hardware/n32h7xx_dbgmcu.h b/arch/arm/src/n32h7/hardware/n32h7xx_dbgmcu.h new file mode 100644 index 0000000000000..586d274cc3519 --- /dev/null +++ b/arch/arm/src/n32h7/hardware/n32h7xx_dbgmcu.h @@ -0,0 +1,243 @@ +/**************************************************************************** + * arch/arm/src/n32h7/hardware/n32h7xx_dbgmcu.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __ARCH_ARM_SRC_N32H7_HARDWARE_N32H7XX_DBGMCU_H +#define __ARCH_ARM_SRC_N32H7_HARDWARE_N32H7XX_DBGMCU_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include "chip.h" + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* Register Offsets *********************************************************/ + +#define N32_DBG_ID_OFFSET 0x00 /* ID register */ +#define N32_DBG_CTRL_OFFSET 0x04 /* Control register */ +#define N32_DBG_M7APB1FZ_OFFSET 0x08 /* M7 APB1 freeze register */ +#define N32_DBG_M4APB1FZ_OFFSET 0x0c /* M4 APB1 freeze register */ +#define N32_DBG_M7APB2FZ_OFFSET 0x10 /* M7 APB2 freeze register */ +#define N32_DBG_M4APB2FZ_OFFSET 0x14 /* M4 APB2 freeze register */ +#define N32_DBG_M7APB5FZ_OFFSET 0x18 /* M7 APB5 freeze register */ +#define N32_DBG_M4APB5FZ_OFFSET 0x1c /* M4 APB5 freeze register */ +#define N32_DBG_M7APB6FZ_OFFSET 0x20 /* M7 APB6 freeze register */ +#define N32_DBG_M4APB6FZ_OFFSET 0x24 /* M4 APB6 freeze register */ + +/* Register Addresses *******************************************************/ + +#define N32_DBG_ID (N32_DEBUGMCU_BASE + N32_DBG_ID_OFFSET) +#define N32_DBG_CTRL (N32_DEBUGMCU_BASE + N32_DBG_CTRL_OFFSET) +#define N32_DBG_M7APB1FZ (N32_DEBUGMCU_BASE + N32_DBG_M7APB1FZ_OFFSET) +#define N32_DBG_M4APB1FZ (N32_DEBUGMCU_BASE + N32_DBG_M4APB1FZ_OFFSET) +#define N32_DBG_M7APB2FZ (N32_DEBUGMCU_BASE + N32_DBG_M7APB2FZ_OFFSET) +#define N32_DBG_M4APB2FZ (N32_DEBUGMCU_BASE + N32_DBG_M4APB2FZ_OFFSET) +#define N32_DBG_M7APB5FZ (N32_DEBUGMCU_BASE + N32_DBG_M7APB5FZ_OFFSET) +#define N32_DBG_M4APB5FZ (N32_DEBUGMCU_BASE + N32_DBG_M4APB5FZ_OFFSET) +#define N32_DBG_M7APB6FZ (N32_DEBUGMCU_BASE + N32_DBG_M7APB6FZ_OFFSET) +#define N32_DBG_M4APB6FZ (N32_DEBUGMCU_BASE + N32_DBG_M4APB6FZ_OFFSET) + +/* Register Bitfield Definitions ********************************************/ + +/* ID register (N32_DBG_ID) */ + +#define DBG_ID_REV_NUM_H_SHIFT (28) /* Bits 31-28: MCU revision number high */ +#define DBG_ID_REV_NUM_H_MASK (0xf << DBG_ID_REV_NUM_H_SHIFT) +#define DBG_ID_REV_NUM_L_SHIFT (24) /* Bits 27-24: MCU revision number low */ +#define DBG_ID_REV_NUM_L_MASK (0xf << DBG_ID_REV_NUM_L_SHIFT) +#define DBG_ID_DEV_NUM_H_SHIFT (20) /* Bits 23-20: Device number high */ +#define DBG_ID_DEV_NUM_H_MASK (0xf << DBG_ID_DEV_NUM_H_SHIFT) +#define DBG_ID_DEV_NUM_M_SHIFT (16) /* Bits 19-16: Device number middle */ +#define DBG_ID_DEV_NUM_M_MASK (0xf << DBG_ID_DEV_NUM_M_SHIFT) +#define DBG_ID_DEV_NUM_L_SHIFT (12) /* Bits 15-12: Device number low */ +#define DBG_ID_DEV_NUM_L_MASK (0xf << DBG_ID_DEV_NUM_L_SHIFT) + +/* Device number values (DEV_NUM_H + DEV_NUM_M + DEV_NUM_L) */ +#define DBG_ID_DEV_NUM_N32H760 0x760 +#define DBG_ID_DEV_NUM_N32H762 0x762 +#define DBG_ID_DEV_NUM_N32H765 0x765 +#define DBG_ID_DEV_NUM_N32H785 0x785 +#define DBG_ID_DEV_NUM_N32H787 0x787 +#define DBG_ID_DEV_NUM_N32H788 0x788 + +#define DBG_ID_PINS_SHIFT (8) /* Bits 11-8: Pin count */ +#define DBG_ID_PINS_MASK (0xf << DBG_ID_PINS_SHIFT) +#define DBG_ID_PINS_100 0x2 +#define DBG_ID_PINS_144 0x4 +#define DBG_ID_PINS_169 0x6 +#define DBG_ID_PINS_176 0x8 +#define DBG_ID_PINS_208 0xa +#define DBG_ID_PINS_240 0xc + +#define DBG_ID_FLASH_SHIFT (6) /* Bits 7-6: Flash size */ +#define DBG_ID_FLASH_MASK (0x3 << DBG_ID_FLASH_SHIFT) +#define DBG_ID_FLASH_2MB (0x1 << DBG_ID_FLASH_SHIFT) +#define DBG_ID_FLASH_4MB (0x2 << DBG_ID_FLASH_SHIFT) + +#define DBG_ID_ENC_SHIFT (4) /* Bits 5-4: Package type */ +#define DBG_ID_ENC_MASK (0x3 << DBG_ID_ENC_SHIFT) +#define DBG_ID_ENC_BGA (0x1 << DBG_ID_ENC_SHIFT) +#define DBG_ID_ENC_LQFP (0x2 << DBG_ID_ENC_SHIFT) + +/* Control register (N32_DBG_CTRL) */ + +#define DBG_CTRL_M4SLEEP (1 << 0) /* Bit 0: Debug sleep mode for CM4 */ +#define DBG_CTRL_M4STOP (1 << 1) /* Bit 1: Debug stop mode for CM4 */ +#define DBG_CTRL_M4STBY (1 << 2) /* Bit 2: Debug standby mode for CM4 */ +#define DBG_CTRL_M7SLEEP (1 << 3) /* Bit 3: Debug sleep mode for CM7 */ +#define DBG_CTRL_M7STOP (1 << 4) /* Bit 4: Debug stop mode for CM7 */ +#define DBG_CTRL_M7STBY (1 << 5) /* Bit 5: Debug standby mode for CM7 */ +#define DBG_CTRL_TRGOEN (1 << 6) /* Bit 6: External trigger output enable */ +#define DBG_CTRL_TRACE_MODE_SHIFT (7) /* Bits 9-7: Trace mode */ +#define DBG_CTRL_TRACE_MODE_MASK (0x7 << DBG_CTRL_TRACE_MODE_SHIFT) +#define DBG_CTRL_TRACE_IOEN (1 << 7) /* Bit 7: Trace I/O enable */ +#define DBG_CTRL_TRACE_MODE_ASYNC (0 << 8) /* Bits 9-8: Asynchronous mode */ +#define DBG_CTRL_TRACE_MODE_SYNC1 (1 << 8) /* Bits 9-8: Sync mode, 1-bit data */ +#define DBG_CTRL_TRACE_MODE_SYNC2 (2 << 8) /* Bits 9-8: Sync mode, 2-bit data */ +#define DBG_CTRL_TRACE_MODE_SYNC4 (3 << 8) /* Bits 9-8: Sync mode, 4-bit data */ +#define DBG_CTRL_TRACE_CFG (1 << 10) /* Bit 10: Trace source selection (0=CM7, 1=CM4) */ + +/* M7 APB1 freeze register (N32_DBG_M7APB1FZ) - also used for M4 APB1 */ + +#define DBG_M7APB1FZ_BTIM1_STOP (1 << 0) /* Bit 0: BTIM1 stopped when halted */ +#define DBG_M7APB1FZ_BTIM2_STOP (1 << 1) /* Bit 1: BTIM2 stopped when halted */ +#define DBG_M7APB1FZ_BTIM3_STOP (1 << 2) /* Bit 2: BTIM3 stopped when halted */ +#define DBG_M7APB1FZ_BTIM4_STOP (1 << 3) /* Bit 3: BTIM4 stopped when halted */ +#define DBG_M7APB1FZ_GTIMA4_STOP (1 << 4) /* Bit 4: GTIMA4 stopped when halted */ +#define DBG_M7APB1FZ_GTIMA5_STOP (1 << 5) /* Bit 5: GTIMA5 stopped when halted */ +#define DBG_M7APB1FZ_GTIMA6_STOP (1 << 6) /* Bit 6: GTIMA6 stopped when halted */ +#define DBG_M7APB1FZ_GTIMA7_STOP (1 << 7) /* Bit 7: GTIMA7 stopped when halted */ +#define DBG_M7APB1FZ_GTIMB1_STOP (1 << 8) /* Bit 8: GTIMB1 stopped when halted */ +#define DBG_M7APB1FZ_GTIMB2_STOP (1 << 9) /* Bit 9: GTIMB2 stopped when halted */ +#define DBG_M7APB1FZ_GTIMB3_STOP (1 << 10) /* Bit 10: GTIMB3 stopped when halted */ +#define DBG_M7APB1FZ_I2C1_STOP (1 << 11) /* Bit 11: I2C1 SMBus timeout stopped */ +#define DBG_M7APB1FZ_I2C2_STOP (1 << 12) /* Bit 12: I2C2 SMBus timeout stopped */ +#define DBG_M7APB1FZ_I2C3_STOP (1 << 13) /* Bit 13: I2C3 SMBus timeout stopped */ +#define DBG_M7APB1FZ_WWDG2_STOP (1 << 14) /* Bit 14: WWDG2 stopped when halted */ +#define DBG_M7APB1FZ_CANFD1_STOP (1 << 15) /* Bit 15: FDCAN1 stopped when halted */ +#define DBG_M7APB1FZ_CANFD2_STOP (1 << 16) /* Bit 16: FDCAN2 stopped when halted */ +#define DBG_M7APB1FZ_CANFD5_STOP (1 << 17) /* Bit 17: FDCAN5 stopped when halted */ +#define DBG_M7APB1FZ_CANFD6_STOP (1 << 18) /* Bit 18: FDCAN6 stopped when halted */ + +/* M4 APB1 freeze register (N32_DBG_M4APB1FZ) */ + +#define DBG_M4APB1FZ_BTIM1_STOP DBG_M7APB1FZ_BTIM1_STOP +#define DBG_M4APB1FZ_BTIM2_STOP DBG_M7APB1FZ_BTIM2_STOP +#define DBG_M4APB1FZ_BTIM3_STOP DBG_M7APB1FZ_BTIM3_STOP +#define DBG_M4APB1FZ_BTIM4_STOP DBG_M7APB1FZ_BTIM4_STOP +#define DBG_M4APB1FZ_GTIMA4_STOP DBG_M7APB1FZ_GTIMA4_STOP +#define DBG_M4APB1FZ_GTIMA5_STOP DBG_M7APB1FZ_GTIMA5_STOP +#define DBG_M4APB1FZ_GTIMA6_STOP DBG_M7APB1FZ_GTIMA6_STOP +#define DBG_M4APB1FZ_GTIMA7_STOP DBG_M7APB1FZ_GTIMA7_STOP +#define DBG_M4APB1FZ_GTIMB1_STOP DBG_M7APB1FZ_GTIMB1_STOP +#define DBG_M4APB1FZ_GTIMB2_STOP DBG_M7APB1FZ_GTIMB2_STOP +#define DBG_M4APB1FZ_GTIMB3_STOP DBG_M7APB1FZ_GTIMB3_STOP +#define DBG_M4APB1FZ_I2C1_STOP DBG_M7APB1FZ_I2C1_STOP +#define DBG_M4APB1FZ_I2C2_STOP DBG_M7APB1FZ_I2C2_STOP +#define DBG_M4APB1FZ_I2C3_STOP DBG_M7APB1FZ_I2C3_STOP +#define DBG_M4APB1FZ_WWDG2_STOP DBG_M7APB1FZ_WWDG2_STOP +#define DBG_M4APB1FZ_CANFD1_STOP DBG_M7APB1FZ_CANFD1_STOP +#define DBG_M4APB1FZ_CANFD2_STOP DBG_M7APB1FZ_CANFD2_STOP +#define DBG_M4APB1FZ_CANFD5_STOP DBG_M7APB1FZ_CANFD5_STOP +#define DBG_M4APB1FZ_CANFD6_STOP DBG_M7APB1FZ_CANFD6_STOP + +/* M7 APB2 freeze register (N32_DBG_M7APB2FZ) */ + +#define DBG_M7APB2FZ_SHRTIM1_STOP (1 << 0) /* Bit 0: SHRTIM1 stopped when halted */ +#define DBG_M7APB2FZ_SHRTIM2_STOP (1 << 1) /* Bit 1: SHRTIM2 stopped when halted */ +#define DBG_M7APB2FZ_GTIMA1_STOP (1 << 2) /* Bit 2: GTIMA1 stopped when halted */ +#define DBG_M7APB2FZ_GTIMA2_STOP (1 << 3) /* Bit 3: GTIMA2 stopped when halted */ +#define DBG_M7APB2FZ_GTIMA3_STOP (1 << 4) /* Bit 4: GTIMA3 stopped when halted */ +#define DBG_M7APB2FZ_ATIM1_STOP (1 << 5) /* Bit 5: ATIM1 stopped when halted */ +#define DBG_M7APB2FZ_ATIM2_STOP (1 << 6) /* Bit 6: ATIM2 stopped when halted */ +#define DBG_M7APB2FZ_I2C4_STOP (1 << 7) /* Bit 7: I2C4 SMBus timeout stopped */ +#define DBG_M7APB2FZ_I2C5_STOP (1 << 8) /* Bit 8: I2C5 SMBus timeout stopped */ +#define DBG_M7APB2FZ_I2C6_STOP (1 << 9) /* Bit 9: I2C6 SMBus timeout stopped */ +#define DBG_M7APB2FZ_CANFD3_STOP (1 << 10) /* Bit 10: FDCAN3 stopped when halted */ +#define DBG_M7APB2FZ_CANFD4_STOP (1 << 11) /* Bit 11: FDCAN4 stopped when halted */ +#define DBG_M7APB2FZ_CANFD7_STOP (1 << 12) /* Bit 12: FDCAN7 stopped when halted */ +#define DBG_M7APB2FZ_CANFD8_STOP (1 << 13) /* Bit 13: FDCAN8 stopped when halted */ + +/* M4 APB2 freeze register (N32_DBG_M4APB2FZ) */ + +#define DBG_M4APB2FZ_SHRTIM1_STOP DBG_M7APB2FZ_SHRTIM1_STOP +#define DBG_M4APB2FZ_SHRTIM2_STOP DBG_M7APB2FZ_SHRTIM2_STOP +#define DBG_M4APB2FZ_GTIMA1_STOP DBG_M7APB2FZ_GTIMA1_STOP +#define DBG_M4APB2FZ_GTIMA2_STOP DBG_M7APB2FZ_GTIMA2_STOP +#define DBG_M4APB2FZ_GTIMA3_STOP DBG_M7APB2FZ_GTIMA3_STOP +#define DBG_M4APB2FZ_ATIM1_STOP DBG_M7APB2FZ_ATIM1_STOP +#define DBG_M4APB2FZ_ATIM2_STOP DBG_M7APB2FZ_ATIM2_STOP +#define DBG_M4APB2FZ_I2C4_STOP DBG_M7APB2FZ_I2C4_STOP +#define DBG_M4APB2FZ_I2C5_STOP DBG_M7APB2FZ_I2C5_STOP +#define DBG_M4APB2FZ_I2C6_STOP DBG_M7APB2FZ_I2C6_STOP +#define DBG_M4APB2FZ_CANFD3_STOP DBG_M7APB2FZ_CANFD3_STOP +#define DBG_M4APB2FZ_CANFD4_STOP DBG_M7APB2FZ_CANFD4_STOP +#define DBG_M4APB2FZ_CANFD7_STOP DBG_M7APB2FZ_CANFD7_STOP +#define DBG_M4APB2FZ_CANFD8_STOP DBG_M7APB2FZ_CANFD8_STOP + +/* M7 APB5 freeze register (N32_DBG_M7APB5FZ) - ATIM3/ATIM4 and LPTIM */ + +#define DBG_M7APB5FZ_ATIM3_STOP (1 << 0) /* Bit 0: ATIM3 stopped when halted */ +#define DBG_M7APB5FZ_ATIM4_STOP (1 << 1) /* Bit 1: ATIM4 stopped when halted */ +#define DBG_M7APB5FZ_I2C7_STOP (1 << 2) /* Bit 2: I2C7 SMBus timeout stopped */ +#define DBG_M7APB5FZ_I2C8_STOP (1 << 3) /* Bit 3: I2C8 SMBus timeout stopped */ +#define DBG_M7APB5FZ_I2C9_STOP (1 << 4) /* Bit 4: I2C9 SMBus timeout stopped */ +#define DBG_M7APB5FZ_I2C10_STOP (1 << 5) /* Bit 5: I2C10 SMBus timeout stopped */ +#define DBG_M7APB5FZ_IWDG1_STOP (1 << 6) /* Bit 6: IWDG1 stopped when halted */ +#define DBG_M7APB5FZ_IWDG2_STOP (1 << 7) /* Bit 7: IWDG2 stopped when halted */ +#define DBG_M7APB5FZ_LPTIM1_STOP (1 << 8) /* Bit 8: LPTIM1 stopped when halted */ +#define DBG_M7APB5FZ_LPTIM2_STOP (1 << 9) /* Bit 9: LPTIM2 stopped when halted */ +#define DBG_M7APB5FZ_LPTIM3_STOP (1 << 10) /* Bit 10: LPTIM3 stopped when halted */ +#define DBG_M7APB5FZ_LPTIM4_STOP (1 << 11) /* Bit 11: LPTIM4 stopped when halted */ +#define DBG_M7APB5FZ_LPTIM5_STOP (1 << 12) /* Bit 12: LPTIM5 stopped when halted */ +#define DBG_M7APB5FZ_RTC_STOP (1 << 13) /* Bit 13: RTC stopped when halted */ + +/* M4 APB5 freeze register (N32_DBG_M4APB5FZ) */ + +#define DBG_M4APB5FZ_ATIM3_STOP DBG_M7APB5FZ_ATIM3_STOP +#define DBG_M4APB5FZ_ATIM4_STOP DBG_M7APB5FZ_ATIM4_STOP +#define DBG_M4APB5FZ_I2C7_STOP DBG_M7APB5FZ_I2C7_STOP +#define DBG_M4APB5FZ_I2C8_STOP DBG_M7APB5FZ_I2C8_STOP +#define DBG_M4APB5FZ_I2C9_STOP DBG_M7APB5FZ_I2C9_STOP +#define DBG_M4APB5FZ_I2C10_STOP DBG_M7APB5FZ_I2C10_STOP +#define DBG_M4APB5FZ_IWDG1_STOP DBG_M7APB5FZ_IWDG1_STOP +#define DBG_M4APB5FZ_IWDG2_STOP DBG_M7APB5FZ_IWDG2_STOP +#define DBG_M4APB5FZ_LPTIM1_STOP DBG_M7APB5FZ_LPTIM1_STOP +#define DBG_M4APB5FZ_LPTIM2_STOP DBG_M7APB5FZ_LPTIM2_STOP +#define DBG_M4APB5FZ_LPTIM3_STOP DBG_M7APB5FZ_LPTIM3_STOP +#define DBG_M4APB5FZ_LPTIM4_STOP DBG_M7APB5FZ_LPTIM4_STOP +#define DBG_M4APB5FZ_LPTIM5_STOP DBG_M7APB5FZ_LPTIM5_STOP +#define DBG_M4APB5FZ_RTC_STOP DBG_M7APB5FZ_RTC_STOP + +/* M7 APB6 freeze register (N32_DBG_M7APB6FZ) */ + +#define DBG_M7APB6FZ_WWDG1_STOP (1 << 0) /* Bit 0: WWDG1 stopped when halted */ + +/* M4 APB6 freeze register (N32_DBG_M4APB6FZ) */ + +#define DBG_M4APB6FZ_WWDG1_STOP (1 << 0) /* Bit 0: WWDG1 stopped when halted */ + +#endif /* __ARCH_ARM_SRC_N32H7_HARDWARE_N32H7XX_DBGMCU_H */ diff --git a/arch/arm/src/n32h7/n32_allocateheap.c b/arch/arm/src/n32h7/n32_allocateheap.c new file mode 100644 index 0000000000000..391c66a1155d3 --- /dev/null +++ b/arch/arm/src/n32h7/n32_allocateheap.c @@ -0,0 +1,182 @@ +/**************************************************************************** + * arch/arm/src/n32h7/n32_allocateheap.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "arm_internal.h" +#include "mpu.h" +#include "hardware/n32h7_memorymap.h" + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +extern const uint8_t _axiram_heap_start[]; +extern const uint8_t _ahbram_heap_start[]; + +/* Adjust memory region definitions */ +#define N32_DTCM_SIZE (128U * 1024U) /* DTCM 128KB */ +#define N32_AHBSRAM_SIZE (352U * 1024U) /* AHBSRAM 352KB */ +#define N32_AXISRAM_SIZE (128U * 1024U) /* AXI SRAM 128KB */ +#define N32_BSRAM_SIZE ( 4U * 1024U) /* BSRAM 4KB */ + +/* Adjust main heap start address to DTCM */ +#define MAIN_HEAP_START DTCM_HEAP_START +#define DTCM_HEAP_START g_idle_topstack +#define AHB_HEAP_START (uint32_t)_ahbram_heap_start +#define AXI_HEAP_START (uint32_t)_axiram_heap_start +#define BSRAM_HEAP_START N32_BSRAM_BASE + +/* Adjust main heap end address to DTCM */ +#define MAIN_HEAP_END DTCM_HEAP_END +#define DTCM_HEAP_END (N32_DTCM_SIZE + N32_DTCRAM_BASE) +#define AHB_HEAP_END (N32_AHBSRAM_SIZE + N32_AHBSRAM_BASE) +#define AXI_HEAP_END (N32_AXISRAM_SIZE + N32_AXISRAM_BASE) +#define BSRAM_HEAP_END (N32_BSRAM_SIZE + N32_BSRAM_BASE) + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +#ifdef CONFIG_HEAP_COLORATION +static inline void up_heap_color(void *start, size_t size) +{ + memset(start, HEAP_COLOR, size); +} +#else +# define up_heap_color(start,size) +#endif + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +void up_allocate_heap(void **heap_start, size_t *heap_size) +{ +#if defined(CONFIG_BUILD_PROTECTED) && defined(CONFIG_MM_KERNEL_HEAP) + + /* Adjust protected mode heap to SRAM1 */ + + uintptr_t ubase = (uintptr_t)USERSPACE->us_bssend + + CONFIG_MM_KERNEL_HEAPSIZE; + size_t usize = MAIN_HEAP_START + N32_SRAM1_SIZE - ubase; + int log2; + + DEBUGASSERT(ubase < (DTCM_HEAP_START + N32_DTCM_SIZE)); + + /* MPU alignment processing */ + + log2 = (int)mpu_log2regionfloor(usize); + DEBUGASSERT(((DTCM_HEAP_START + N32_DTCM_SIZE) & ((1 << log2) - 1)) == 0); + + usize = (1 << log2); + ubase = (DTCM_HEAP_START + N32_DTCM_SIZE) - usize; + + *heap_start = (void *)ubase; + *heap_size = usize; + + /* Initialize kernel memory manager */ + + kmm_initialize(*heap_start, *heap_size); + + /* Debug message output */ + + minfo("Protected mode heap: %uKB at %p\n", *heap_size / 1024, *heap_start); +#else + + /* Adjust main heap to DTCM */ + + *heap_start = (void *)MAIN_HEAP_START; + *heap_size = MAIN_HEAP_END - MAIN_HEAP_START; + + board_autoled_on(LED_HEAPALLOCATE); + kmm_initialize(*heap_start, *heap_size); + minfo("Main heap: %uKB DTCM at %p\n", *heap_size / 1024, *heap_start); +#endif + + /* Debug heap color */ + + up_heap_color(*heap_start, *heap_size); +} + +#if CONFIG_MM_REGIONS > 1 +void arm_addregion(void) +{ + unsigned mm_regions = 1; + + /* Add AXI SRAM region */ + + if (mm_regions < CONFIG_MM_REGIONS) + { + kumm_addregion((void *)AXI_HEAP_START, AXI_HEAP_END - AXI_HEAP_START); + minfo("Added AXI SRAM: %luKB at %p\n" + , (AXI_HEAP_END - AXI_HEAP_START) / 1024U + , (uint32_t *)AXI_HEAP_START); + mm_regions++; + } + + /* Add AHBSRAM region */ + + if (mm_regions < CONFIG_MM_REGIONS) + { + kumm_addregion((void *)AHB_HEAP_START, AHB_HEAP_END - AHB_HEAP_START); + minfo("Added AHBSRAM: %luKB at %p\n" + , (AHB_HEAP_END - AHB_HEAP_START) / 1024U + , (uint32_t *)AHB_HEAP_START); + mm_regions++; + } + + /* Add backup SRAM region */ + +#if defined(N32_BSRAM_BASE) && !defined(CONFIG_N32H7_BSRAMEXCLUDE) + if (mm_regions < CONFIG_MM_REGIONS) + { + kumm_addregion((void *)BSRAM_HEAP_START + , BSRAM_HEAP_END - BSRAM_HEAP_START); + minfo("Added BSRAM: %luKB at %p\n" + , (BSRAM_HEAP_END - BSRAM_HEAP_START) / 1024U + , (uint32_t *)BSRAM_HEAP_START); + mm_regions++; + } +#endif + + /* Add external memory support region */ +#if defined(CONFIG_N32H7_FMC) + /* Add FMC initialization code here */ +#endif +} +#endif diff --git a/arch/arm/src/n32h7/n32_capture.c b/arch/arm/src/n32h7/n32_capture.c new file mode 100644 index 0000000000000..fcea96880f9fe --- /dev/null +++ b/arch/arm/src/n32h7/n32_capture.c @@ -0,0 +1,1447 @@ +/**************************************************************************** + * arch/arm/src/n32h7/n32_capture.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include + +#include "chip.h" +#include "arm_internal.h" +#include "n32_rcc.h" +#include "n32_gpio.h" +#include "n32_capture.h" +#include "hardware/n32h7_rcc.h" +#include "hardware/n32h76x_pinmap.h" + +#ifdef CONFIG_N32H7_CAPTURE + +/**************************************************************************** + * Private Types + ****************************************************************************/ + +/* Timer device private structure */ + +struct n32_cap_priv_s +{ + const struct n32_cap_ops_s *ops; + uint32_t base; /* timer base address */ + int irq; /* main capture/compare IRQ */ + int irq_of; /* update IRQ (0 if combined) */ + uint32_t input_clock; /* timer input clock (before prescaler) */ +}; + +/**************************************************************************** + * Private Function Prototypes + ****************************************************************************/ + +static inline uint16_t n32_getreg16(const struct n32_cap_priv_s *priv, + uint8_t offset); +static inline void n32_putreg16(const struct n32_cap_priv_s *priv, + uint8_t offset, uint16_t value); +static inline void n32_modifyreg16(const struct n32_cap_priv_s *priv, + uint8_t offset, uint16_t clearbits, + uint16_t setbits); +static inline uint32_t n32_getreg32(const struct n32_cap_priv_s *priv, + uint8_t offset); +static inline void n32_putreg32(const struct n32_cap_priv_s *priv, + uint8_t offset, uint32_t value); + +static uint32_t n32_cap_gpio(const struct n32_cap_priv_s *priv, int channel); +static int n32_cap_set_rcc(const struct n32_cap_priv_s *priv, bool on); + +static int n32_cap_setsmc(struct n32_cap_dev_s *dev, n32_cap_smc_cfg_t cfg); +static int n32_cap_setclock(struct n32_cap_dev_s *dev, uint32_t freq, + uint32_t max); +static int n32_cap_setchannel(struct n32_cap_dev_s *dev, uint8_t channel, + n32_cap_ch_cfg_t cfg); +static uint32_t n32_cap_getcapture(struct n32_cap_dev_s *dev, + uint8_t channel); +static uint32_t n32_cap_getedges(struct n32_cap_dev_s *dev, uint8_t channel); +static int n32_cap_setisr(struct n32_cap_dev_s *dev, xcpt_t handler, + void *arg); +static void n32_cap_enableint(struct n32_cap_dev_s *dev, n32_cap_flags_t src, + bool on); +static void n32_cap_ackflags(struct n32_cap_dev_s *dev, int flags); +static n32_cap_flags_t n32_cap_getflags(struct n32_cap_dev_s *dev); + +static const struct n32_cap_priv_s * n32_cap_get_priv(int timer); + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +static const struct n32_cap_ops_s n32_cap_ops = +{ + .setsmc = n32_cap_setsmc, + .setclock = n32_cap_setclock, + .setchannel = n32_cap_setchannel, + .getcapture = n32_cap_getcapture, + .getedges = n32_cap_getedges, + .setisr = n32_cap_setisr, + .enableint = n32_cap_enableint, + .ackflags = n32_cap_ackflags, + .getflags = n32_cap_getflags, +}; + +/* Timer private structures */ + +#ifdef CONFIG_N32H7_ATIM1_CAP +const struct n32_cap_priv_s n32_atim1_priv = +{ + .ops = &n32_cap_ops, + .base = N32_ATIMER1_BASE, + .irq = N32_IRQ_ATIM1_CC, + .irq_of = N32_IRQ_ATIM1_UP, + .input_clock = N32_AHB_FREQUENCY, +}; +#endif + +#ifdef CONFIG_N32H7_ATIM2_CAP +const struct n32_cap_priv_s n32_atim2_priv = +{ + .ops = &n32_cap_ops, + .base = N32_ATIMER2_BASE, + .irq = N32_IRQ_ATIM2_CC, + .irq_of = N32_IRQ_ATIM2_UP, + .input_clock = N32_AHB_FREQUENCY, +}; +#endif + +#ifdef CONFIG_N32H7_ATIM3_CAP +const struct n32_cap_priv_s n32_atim3_priv = +{ + .ops = &n32_cap_ops, + .base = N32_ATIMER3_BASE, + .irq = N32_IRQ_ATIM3_CC, + .irq_of = N32_IRQ_ATIM3_UP, + .input_clock = N32_AHB_FREQUENCY, +}; +#endif + +#ifdef CONFIG_N32H7_ATIM4_CAP +const struct n32_cap_priv_s n32_atim4_priv = +{ + .ops = &n32_cap_ops, + .base = N32_ATIMER4_BASE, + .irq = N32_IRQ_ATIM4_CC, + .irq_of = N32_IRQ_ATIM4_UP, + .input_clock = N32_AHB_FREQUENCY, +}; +#endif + +#ifdef CONFIG_N32H7_GTIMA1_CAP +const struct n32_cap_priv_s n32_gtima1_priv = +{ + .ops = &n32_cap_ops, + .base = N32_GTIMERA1_BASE, + .irq = N32_IRQ_GTIMA1, + .irq_of = 0, + .input_clock = N32_AHB_FREQUENCY, +}; +#endif + +#ifdef CONFIG_N32H7_GTIMA2_CAP +const struct n32_cap_priv_s n32_gtima2_priv = +{ + .ops = &n32_cap_ops, + .base = N32_GTIMERA2_BASE, + .irq = N32_IRQ_GTIMA2, + .irq_of = 0, + .input_clock = N32_AHB_FREQUENCY, +}; +#endif + +#ifdef CONFIG_N32H7_GTIMA3_CAP +const struct n32_cap_priv_s n32_gtima3_priv = +{ + .ops = &n32_cap_ops, + .base = N32_GTIMERA3_BASE, + .irq = N32_IRQ_GTIMA3, + .irq_of = 0, + .input_clock = N32_AHB_FREQUENCY, +}; +#endif + +#ifdef CONFIG_N32H7_GTIMA4_CAP +const struct n32_cap_priv_s n32_gtima4_priv = +{ + .ops = &n32_cap_ops, + .base = N32_GTIMERA4_BASE, + .irq = N32_IRQ_GTIMA4, + .irq_of = 0, + .input_clock = N32_AHB_FREQUENCY, +}; +#endif + +#ifdef CONFIG_N32H7_GTIMA5_CAP +const struct n32_cap_priv_s n32_gtima5_priv = +{ + .ops = &n32_cap_ops, + .base = N32_GTIMERA5_BASE, + .irq = N32_IRQ_GTIMA5, + .irq_of = 0, + .input_clock = N32_AHB_FREQUENCY, +}; +#endif + +#ifdef CONFIG_N32H7_GTIMA6_CAP +const struct n32_cap_priv_s n32_gtima6_priv = +{ + .ops = &n32_cap_ops, + .base = N32_GTIMERA6_BASE, + .irq = N32_IRQ_GTIMA6, + .irq_of = 0, + .input_clock = N32_AHB_FREQUENCY, +}; +#endif + +#ifdef CONFIG_N32H7_GTIMA7_CAP +const struct n32_cap_priv_s n32_gtima7_priv = +{ + .ops = &n32_cap_ops, + .base = N32_GTIMERA7_BASE, + .irq = N32_IRQ_GTIMA7, + .irq_of = 0, + .input_clock = N32_AHB_FREQUENCY, +}; +#endif + +#ifdef CONFIG_N32H7_GTIMB1_CAP +const struct n32_cap_priv_s n32_gtimb1_priv = +{ + .ops = &n32_cap_ops, + .base = N32_GTIMERB1_BASE, + .irq = N32_IRQ_GTIMB1, + .irq_of = 0, + .input_clock = N32_AHB_FREQUENCY, +}; +#endif + +#ifdef CONFIG_N32H7_GTIMB2_CAP +const struct n32_cap_priv_s n32_gtimb2_priv = +{ + .ops = &n32_cap_ops, + .base = N32_GTIMERB2_BASE, + .irq = N32_IRQ_GTIMB2, + .irq_of = 0, + .input_clock = N32_AHB_FREQUENCY, +}; +#endif + +#ifdef CONFIG_N32H7_GTIMB3_CAP +const struct n32_cap_priv_s n32_gtimb3_priv = +{ + .ops = &n32_cap_ops, + .base = N32_GTIMERB3_BASE, + .irq = N32_IRQ_GTIMB3, + .irq_of = 0, + .input_clock = N32_AHB_FREQUENCY, +}; +#endif + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +static inline uint16_t n32_getreg16(const struct n32_cap_priv_s *priv, + uint8_t offset) +{ + return getreg16(priv->base + offset); +} + +static inline void n32_putreg16(const struct n32_cap_priv_s *priv, + uint8_t offset, uint16_t value) +{ + putreg16(value, priv->base + offset); +} + +static inline void n32_modifyreg16(const struct n32_cap_priv_s *priv, + uint8_t offset, uint16_t clearbits, + uint16_t setbits) +{ + modifyreg16(priv->base + offset, clearbits, setbits); +} + +static inline void n32_modifyreg32(const struct n32_cap_priv_s *priv, + uint8_t offset, uint32_t clearbits, + uint32_t setbits) +{ + modifyreg32(priv->base + offset, clearbits, setbits); +} + +static inline uint32_t n32_getreg32(const struct n32_cap_priv_s *priv, + uint8_t offset) +{ + return getreg32(priv->base + offset); +} + +static inline void n32_putreg32(const struct n32_cap_priv_s *priv, + uint8_t offset, uint32_t value) +{ + putreg32(value, priv->base + offset); +} + +/**************************************************************************** + * Name: n32_cap_gpio + * + * Description: + * Return the GPIO configuration for a given timer channel. + * channel = -1: return first available channel + ****************************************************************************/ + +static uint32_t n32_cap_gpio(const struct n32_cap_priv_s *priv, int channel) +{ + if (channel < 0) + { + /* Try counter channel first (ETR) then channels 1..4 */ + + uint32_t gpio = n32_cap_gpio(priv, N32_CAP_CHANNEL_COUNTER); + + if (gpio) + { + return gpio; + } + + for (int ch = 1; ch <= 4; ch++) + { + gpio = n32_cap_gpio(priv, ch); + if (gpio) + { + return gpio; + } + } + + return 0; + } + + switch (priv->base) + { + #ifdef CONFIG_N32H7_ATIM1_CAP + case N32_ATIMER1_BASE: + switch (channel) + { + #ifdef GPIO_ATIM1_ETR + case N32_CAP_CHANNEL_COUNTER: + return GPIO_ATIM1_ETR; + #endif + #ifdef GPIO_ATIM1_CH1IN + case 1: + return GPIO_ATIM1_CH1IN; + #endif + #ifdef GPIO_ATIM1_CH2IN + case 2: + return GPIO_ATIM1_CH2IN; + #endif + #ifdef GPIO_ATIM1_CH3IN + case 3: + return GPIO_ATIM1_CH3IN; + #endif + #ifdef GPIO_ATIM1_CH4IN + case 4: + return GPIO_ATIM1_CH4IN; + #endif + default: + break; + } + break; + #endif + #ifdef CONFIG_N32H7_ATIM2_CAP + case N32_ATIMER2_BASE: + switch (channel) + { + #ifdef GPIO_ATIM2_ETR + case N32_CAP_CHANNEL_COUNTER: + return GPIO_ATIM2_ETR; + #endif + #ifdef GPIO_ATIM2_CH1IN + case 1: + return GPIO_ATIM2_CH1IN; + #endif + #ifdef GPIO_ATIM2_CH2IN + case 2: + return GPIO_ATIM2_CH2IN; + #endif + #ifdef GPIO_ATIM2_CH3IN + case 3: + return GPIO_ATIM2_CH3IN; + #endif + #ifdef GPIO_ATIM2_CH4IN + case 4: + return GPIO_ATIM2_CH4IN; + #endif + default: + break; + } + break; + #endif + #ifdef CONFIG_N32H7_ATIM3_CAP + case N32_ATIMER3_BASE: + switch (channel) + { + #ifdef GPIO_ATIM3_ETR + case N32_CAP_CHANNEL_COUNTER: + return GPIO_ATIM3_ETR; + #endif + #ifdef GPIO_ATIM3_CH1IN + case 1: + return GPIO_ATIM3_CH1IN; + #endif + #ifdef GPIO_ATIM3_CH2IN + case 2: + return GPIO_ATIM3_CH2IN; + #endif + #ifdef GPIO_ATIM3_CH3IN + case 3: + return GPIO_ATIM3_CH3IN; + #endif + #ifdef GPIO_ATIM3_CH4IN + case 4: + return GPIO_ATIM3_CH4IN; + #endif + default: + break; + } + break; + #endif + #ifdef CONFIG_N32H7_ATIM4_CAP + case N32_ATIMER4_BASE: + switch (channel) + { + #ifdef GPIO_ATIM4_ETR + case N32_CAP_CHANNEL_COUNTER: + return GPIO_ATIM4_ETR; + #endif + #ifdef GPIO_ATIM4_CH1IN + case 1: + return GPIO_ATIM4_CH1IN; + #endif + #ifdef GPIO_ATIM4_CH2IN + case 2: + return GPIO_ATIM4_CH2IN; + #endif + #ifdef GPIO_ATIM4_CH3IN + case 3: + return GPIO_ATIM4_CH3IN; + #endif + #ifdef GPIO_ATIM4_CH4IN + case 4: + return GPIO_ATIM4_CH4IN; + #endif + default: + break; + } + break; + #endif + #ifdef CONFIG_N32H7_GTIMA1_CAP + case N32_GTIMERA1_BASE: + switch (channel) + { + #ifdef GPIO_GTIMA1_ETR + case N32_CAP_CHANNEL_COUNTER: + return GPIO_GTIMA1_ETR; + #endif + #ifdef GPIO_GTIMA1_CH1IN + case 1: + return GPIO_GTIMA1_CH1IN; + #endif + #ifdef GPIO_GTIMA1_CH2IN + case 2: + return GPIO_GTIMA1_CH2IN; + #endif + #ifdef GPIO_GTIMA1_CH3IN + case 3: + return GPIO_GTIMA1_CH3IN; + #endif + #ifdef GPIO_GTIMA1_CH4IN + case 4: + return GPIO_GTIMA1_CH4IN; + #endif + default: + break; + } + break; + #endif + #ifdef CONFIG_N32H7_GTIMA2_CAP + case N32_GTIMERA2_BASE: + switch (channel) + { + #ifdef GPIO_GTIMA2_ETR + case N32_CAP_CHANNEL_COUNTER: + return GPIO_GTIMA2_ETR; + #endif + #ifdef GPIO_GTIMA2_CH1IN + case 1: + return GPIO_GTIMA2_CH1IN; + #endif + #ifdef GPIO_GTIMA2_CH2IN + case 2: + return GPIO_GTIMA2_CH2IN; + #endif + #ifdef GPIO_GTIMA2_CH3IN + case 3: + return GPIO_GTIMA2_CH3IN; + #endif + #ifdef GPIO_GTIMA2_CH4IN + case 4: + return GPIO_GTIMA2_CH4IN; + #endif + default: + break; + } + break; + #endif + #ifdef CONFIG_N32H7_GTIMA3_CAP + case N32_GTIMERA3_BASE: + switch (channel) + { + #ifdef GPIO_GTIMA3_ETR + case N32_CAP_CHANNEL_COUNTER: + return GPIO_GTIMA3_ETR; + #endif + #ifdef GPIO_GTIMA3_CH1IN + case 1: + return GPIO_GTIMA3_CH1IN; + #endif + #ifdef GPIO_GTIMA3_CH2IN + case 2: + return GPIO_GTIMA3_CH2IN; + #endif + #ifdef GPIO_GTIMA3_CH3IN + case 3: + return GPIO_GTIMA3_CH3IN; + #endif + #ifdef GPIO_GTIMA3_CH4IN + case 4: + return GPIO_GTIMA3_CH4IN; + #endif + default: + break; + } + break; + #endif + #ifdef CONFIG_N32H7_GTIMA4_CAP + case N32_GTIMERA4_BASE: + switch (channel) + { + #ifdef GPIO_GTIMA4_ETR + case N32_CAP_CHANNEL_COUNTER: + return GPIO_GTIMA4_ETR; + #endif + #ifdef GPIO_GTIMA4_CH1IN + case 1: + return GPIO_GTIMA4_CH1IN; + #endif + #ifdef GPIO_GTIMA4_CH2IN + case 2: + return GPIO_GTIMA4_CH2IN; + #endif + #ifdef GPIO_GTIMA4_CH3IN + case 3: + return GPIO_GTIMA4_CH3IN; + #endif + #ifdef GPIO_GTIMA4_CH4IN + case 4: + return GPIO_GTIMA4_CH4IN; + #endif + default: + break; + } + break; + #endif + #ifdef CONFIG_N32H7_GTIMA5_CAP + case N32_GTIMERA5_BASE: + switch (channel) + { + #ifdef GPIO_GTIMA5_ETR + case N32_CAP_CHANNEL_COUNTER: + return GPIO_GTIMA5_ETR; + #endif + #ifdef GPIO_GTIMA5_CH1IN + case 1: + return GPIO_GTIMA5_CH1IN; + #endif + #ifdef GPIO_GTIMA5_CH2IN + case 2: + return GPIO_GTIMA5_CH2IN; + #endif + #ifdef GPIO_GTIMA5_CH3IN + case 3: + return GPIO_GTIMA5_CH3IN; + #endif + #ifdef GPIO_GTIMA5_CH4IN + case 4: + return GPIO_GTIMA5_CH4IN; + #endif + default: + break; + } + break; + #endif + #ifdef CONFIG_N32H7_GTIMA6_CAP + case N32_GTIMERA6_BASE: + switch (channel) + { + #ifdef GPIO_GTIMA6_ETR + case N32_CAP_CHANNEL_COUNTER: + return GPIO_GTIMA6_ETR; + #endif + #ifdef GPIO_GTIMA6_CH1IN + case 1: + return GPIO_GTIMA6_CH1IN; + #endif + #ifdef GPIO_GTIMA6_CH2IN + case 2: + return GPIO_GTIMA6_CH2IN; + #endif + #ifdef GPIO_GTIMA6_CH3IN + case 3: + return GPIO_GTIMA6_CH3IN; + #endif + #ifdef GPIO_GTIMA6_CH4IN + case 4: + return GPIO_GTIMA6_CH4IN; + #endif + default: + break; + } + break; + #endif + #ifdef CONFIG_N32H7_GTIMA7_CAP + case N32_GTIMERA7_BASE: + switch (channel) + { + #ifdef GPIO_GTIMA7_ETR + case N32_CAP_CHANNEL_COUNTER: + return GPIO_GTIMA7_ETR; + #endif + #ifdef GPIO_GTIMA7_CH1IN + case 1: + return GPIO_GTIMA7_CH1IN; + #endif + #ifdef GPIO_GTIMA7_CH2IN + case 2: + return GPIO_GTIMA7_CH2IN; + #endif + #ifdef GPIO_GTIMA7_CH3IN + case 3: + return GPIO_GTIMA7_CH3IN; + #endif + #ifdef GPIO_GTIMA7_CH4IN + case 4: + return GPIO_GTIMA7_CH4IN; + #endif + default: + break; + } + break; + #endif + #ifdef CONFIG_N32H7_GTIMB1_CAP + case N32_GTIMERB1_BASE: + switch (channel) + { + #ifdef GPIO_GTIMB1_ETR + case N32_CAP_CHANNEL_COUNTER: + return GPIO_GTIMB1_ETR; + #endif + #ifdef GPIO_GTIMB1_CH1PIN + case 1: + return GPIO_GTIMB1_CH1PIN; + #endif + #ifdef GPIO_GTIMB1_CH2IN + case 2: + return GPIO_GTIMB1_CH2IN; + #endif + #ifdef GPIO_GTIMB1_CH3IN + case 3: + return GPIO_GTIMB1_CH3IN; + #endif + #ifdef GPIO_GTIMB1_CH4IN + case 4: + return GPIO_GTIMB1_CH4IN; + #endif + default: + break; + } + break; + #endif + #ifdef CONFIG_N32H7_GTIMB2_CAP + case N32_GTIMERB2_BASE: + switch (channel) + { + #ifdef GPIO_GTIMB2_ETR + case N32_CAP_CHANNEL_COUNTER: + return GPIO_GTIMB2_ETR; + #endif + #ifdef GPIO_GTIMB2_CH1PIN + case 1: + return GPIO_GTIMB2_CH1PIN; + #endif + #ifdef GPIO_GTIMB2_CH2IN + case 2: + return GPIO_GTIMB2_CH2IN; + #endif + #ifdef GPIO_GTIMB2_CH3IN + case 3: + return GPIO_GTIMB2_CH3IN; + #endif + #ifdef GPIO_GTIMB2_CH4IN + case 4: + return GPIO_GTIMB2_CH4IN; + #endif + default: + break; + } + break; + #endif + #ifdef CONFIG_N32H7_GTIMB3_CAP + case N32_GTIMERB3_BASE: + switch (channel) + { + #ifdef GPIO_GTIMB3_ETR + case N32_CAP_CHANNEL_COUNTER: + return GPIO_GTIMB3_ETR; + #endif + #ifdef GPIO_GTIMB3_CH1PIN + case 1: + return GPIO_GTIMB3_CH1PIN; + #endif + #ifdef GPIO_GTIMB3_CH2IN + case 2: + return GPIO_GTIMB3_CH2IN; + #endif + #ifdef GPIO_GTIMB3_CH3IN + case 3: + return GPIO_GTIMB3_CH3IN; + #endif + #ifdef GPIO_GTIMB3_CH4IN + case 4: + return GPIO_GTIMB3_CH4IN; + #endif + default: + break; + } + break; + #endif + default: + break; + } + + return 0; +} + +/**************************************************************************** + * Name: n32_cap_set_rcc + ****************************************************************************/ + +static int n32_cap_set_rcc(const struct n32_cap_priv_s *priv, bool on) +{ + uint32_t reg = 0; + uint32_t bit = 0; + + switch (priv->base) + { + #ifdef CONFIG_N32H7_ATIM1_CAP + case N32_ATIMER1_BASE: + reg = N32_RCC_APB2EN1; + bit = RCC_APB2EN1_M7ATIM1EN; + break; + #endif + #ifdef CONFIG_N32H7_ATIM2_CAP + case N32_ATIMER2_BASE: + reg = N32_RCC_APB2EN1; + bit = RCC_APB2EN1_M7ATIM2EN; + break; + #endif + #ifdef CONFIG_N32H7_ATIM3_CAP + case N32_ATIMER3_BASE: + reg = N32_RCC_APB5EN1; + bit = RCC_APB5EN1_M7ATIM3EN; + break; + #endif + #ifdef CONFIG_N32H7_ATIM4_CAP + case N32_ATIMER4_BASE: + reg = N32_RCC_APB5EN1; + bit = RCC_APB5EN1_M7ATIM4EN; + break; + #endif + #ifdef CONFIG_N32H7_GTIMA1_CAP + case N32_GTIMERA1_BASE: + reg = N32_RCC_APB2EN1; + bit = RCC_APB2EN1_M7GTIMA1EN; + break; + #endif + #ifdef CONFIG_N32H7_GTIMA2_CAP + case N32_GTIMERA2_BASE: + reg = N32_RCC_APB2EN1; + bit = RCC_APB2EN1_M7GTIMA2EN; + break; + #endif + #ifdef CONFIG_N32H7_GTIMA3_CAP + case N32_GTIMERA3_BASE: + reg = N32_RCC_APB2EN1; + bit = RCC_APB2EN1_M7GTIMA3EN; + break; + #endif + #ifdef CONFIG_N32H7_GTIMA4_CAP + case N32_GTIMERA4_BASE: + reg = N32_RCC_APB1EN1; + bit = RCC_APB1EN1_M7GTIMA4EN; + break; + #endif + #ifdef CONFIG_N32H7_GTIMA5_CAP + case N32_GTIMERA5_BASE: + reg = N32_RCC_APB1EN2; + bit = RCC_APB1EN2_M7GTIMA5EN; + break; + #endif + #ifdef CONFIG_N32H7_GTIMA6_CAP + case N32_GTIMERA6_BASE: + reg = N32_RCC_APB1EN2; + bit = RCC_APB1EN2_M7GTIMA6EN; + break; + #endif + #ifdef CONFIG_N32H7_GTIMA7_CAP + case N32_GTIMERA7_BASE: + reg = N32_RCC_APB1EN2; + bit = RCC_APB1EN2_M7GTIMA7EN; + break; + #endif + #ifdef CONFIG_N32H7_GTIMB1_CAP + case N32_GTIMERB1_BASE: + reg = N32_RCC_APB1EN1; + bit = RCC_APB1EN1_M7GTIMB1EN; + break; + #endif + #ifdef CONFIG_N32H7_GTIMB2_CAP + case N32_GTIMERB2_BASE: + reg = N32_RCC_APB1EN1; + bit = RCC_APB1EN1_M7GTIMB2EN; + break; + #endif + #ifdef CONFIG_N32H7_GTIMB3_CAP + case N32_GTIMERB3_BASE: + reg = N32_RCC_APB1EN1; + bit = RCC_APB1EN1_M7GTIMB3EN; + break; + #endif + default: + return -EINVAL; + } + + if (on) + { + modifyreg32(reg, 0, bit); + } + else + { + modifyreg32(reg, bit, 0); + } + + return OK; +} + +/**************************************************************************** + * Name: n32_cap_setsmc + ****************************************************************************/ + +static int n32_cap_setsmc(struct n32_cap_dev_s *dev, n32_cap_smc_cfg_t cfg) +{ + const struct n32_cap_priv_s *priv = (const struct n32_cap_priv_s *)dev; + uint32_t regval = 0; + uint32_t mask = 0; + + switch (cfg & N32_ATIM_SMCTRL_SMSEL_MASK) + { + case N32_ATIM_SMCTRL_DISAB: + regval |= N32_ATIM_SMCTRL_DISAB; + break; + case N32_ATIM_SMCTRL_ENCMD1: + regval |= N32_ATIM_SMCTRL_ENCMD1; + break; + case N32_ATIM_SMCTRL_ENCMD2: + regval |= N32_ATIM_SMCTRL_ENCMD2; + break; + case N32_ATIM_SMCTRL_ENCMD3: + regval |= N32_ATIM_SMCTRL_ENCMD3; + break; + case N32_ATIM_SMCTRL_RESET: + regval |= N32_ATIM_SMCTRL_RESET; + break; + case N32_ATIM_SMCTRL_GATED: + regval |= N32_ATIM_SMCTRL_GATED; + break; + case N32_ATIM_SMCTRL_TRIGGER: + regval |= N32_ATIM_SMCTRL_TRIGGER; + break; + case N32_ATIM_SMCTRL_EXTCLK1: + regval |= N32_ATIM_SMCTRL_EXTCLK1; + break; + default: + break; + } + + switch (cfg & N32_ATIM_SMCTRL_TSEL_MASK) + { + case N32_ATIM_SMCTRL_ITR: + regval |= N32_ATIM_SMCTRL_ITR; + break; + case N32_ATIM_SMCTRL_TI1FED: + regval |= N32_ATIM_SMCTRL_TI1FED; + break; + case N32_ATIM_SMCTRL_TI1FP1: + regval |= N32_ATIM_SMCTRL_TI1FP1; + break; + case N32_ATIM_SMCTRL_TI2FP2: + regval |= N32_ATIM_SMCTRL_TI2FP2; + break; + case N32_ATIM_SMCTRL_ETRF: + regval |= N32_ATIM_SMCTRL_ETRF; + break; + default: + break; + } + + if (cfg & N32_ATIM_SMCTRL_MSMD) + { + regval |= N32_ATIM_SMCTRL_MSMD; + } + + mask = (uint32_t)(N32_ATIM_SMCTRL_SMSEL_MASK | N32_ATIM_SMCTRL_TSEL_MASK + | N32_ATIM_SMCTRL_MSMD); + n32_modifyreg32(priv, N32_ATIM_SMCTRL_OFFSET, mask, regval); + return OK; +} + +/**************************************************************************** + * Name: n32_cap_setclock + * + * Description: + * Set timer prescaler and auto-reload. 'freq' is the desired counting + * frequency (after prescaler), 'max' is the auto-reload value. + * Returns the actual prescaler value. + ****************************************************************************/ + +static int n32_cap_setclock(struct n32_cap_dev_s *dev, uint32_t freq, + uint32_t max) +{ + const struct n32_cap_priv_s *priv = (const struct n32_cap_priv_s *)dev; + uint32_t freqin = priv->input_clock; + int prescaler; + + if (freq == 0) + { + /* Zero frequency means no prescaling, count at input clock */ + + prescaler = 0; + } + else + { + prescaler = freqin / freq; + if (prescaler > 0) + { + prescaler--; + } + + if (prescaler > 0xffff) + { + prescaler = 0xffff; + } + } + + n32_putreg32(priv, N32_ATIM_AR_OFFSET, max); + n32_putreg16(priv, N32_ATIM_PSC_OFFSET, prescaler); + n32_putreg16(priv, N32_ATIM_ETGEN_OFFSET, N32_ATIM_ETGEN_UDGN); + n32_modifyreg16(priv, N32_ATIM_CTRL1_OFFSET, 0, N32_ATIM_CTRL1_CNTEN); + return prescaler; +} + +/**************************************************************************** + * Name: n32_cap_setchannel + ****************************************************************************/ + +static int n32_cap_setchannel(struct n32_cap_dev_s *dev, uint8_t channel, + n32_cap_ch_cfg_t cfg) +{ + const struct n32_cap_priv_s *priv = (const struct n32_cap_priv_s *)dev; + uint32_t gpio; + uint16_t mask; + uint16_t regval; + uint16_t ccer_en_bit; + + gpio = n32_cap_gpio(priv, channel); + if (!gpio) + { + return -EINVAL; + } + + channel--; + + switch (cfg & N32_CAP_EDGE_MASK) + { + case N32_CAP_EDGE_DISABLED: + regval = 0; + ccer_en_bit = 0; + break; + case N32_CAP_EDGE_RISING: + ccer_en_bit = N32_ATIM_CCEN_CC1EN; + regval = 0; + break; + case N32_CAP_EDGE_FALLING: + ccer_en_bit = N32_ATIM_CCEN_CC1EN; + regval = N32_ATIM_CCEN_CC1P; + break; + case N32_CAP_EDGE_BOTH: + ccer_en_bit = N32_ATIM_CCEN_CC1EN; + regval = N32_ATIM_CCEN_CC1P | N32_ATIM_CCEN_CC1NP; + break; + default: + return -EINVAL; + } + + mask = (N32_ATIM_CCEN_CC1EN | N32_ATIM_CCEN_CC1P | N32_ATIM_CCEN_CC1NP); + mask <<= (channel * 4); + regval <<= (channel * 4); + ccer_en_bit <<= (channel * 4); + + n32_modifyreg16(priv, N32_ATIM_CCEN_OFFSET, mask, regval); + + regval = cfg; + mask = (N32_ATIM_CCMOD1_IC1F_MASK | + N32_ATIM_CCMOD1_IC1PSC_MASK | + N32_ATIM_CCMOD1_CC1SEL_MASK); + regval &= mask; + if (channel & 1) + { + regval <<= 8; + mask <<= 8; + } + + if (channel < 2) + { + n32_modifyreg16(priv, N32_ATIM_CCMOD1_OFFSET, mask, regval); + } + else + { + n32_modifyreg16(priv, N32_ATIM_CCMOD2_OFFSET, mask, regval); + } + + if ((cfg & N32_CAP_EDGE_MASK) == N32_CAP_EDGE_DISABLED) + { + n32_unconfiggpio(gpio); + } + else + { + n32_configgpio(gpio); + } + + n32_modifyreg16(priv, N32_ATIM_CCEN_OFFSET, 0, ccer_en_bit); + return OK; +} + +/**************************************************************************** + * Name: n32_cap_getcapture + ****************************************************************************/ + +static uint32_t n32_cap_getcapture(struct n32_cap_dev_s *dev, + uint8_t channel) +{ + const struct n32_cap_priv_s *priv = (const struct n32_cap_priv_s *)dev; + uint8_t offset; + + switch (channel) + { + case N32_CAP_CHANNEL_COUNTER: + offset = N32_ATIM_CNT_OFFSET; + break; + case 1: + offset = N32_ATIM_CCDAT1_OFFSET; + break; + case 2: + offset = N32_ATIM_CCDAT2_OFFSET; + break; + case 3: + offset = N32_ATIM_CCDAT3_OFFSET; + break; + case 4: + offset = N32_ATIM_CCDAT4_OFFSET; + break; + default: + return 0; + } + + /* All N32 timers here are 16-bit */ + + return n32_getreg16(priv, offset); +} + +/**************************************************************************** + * Name: n32_cap_getedges + ****************************************************************************/ + +static uint32_t n32_cap_getedges(struct n32_cap_dev_s *dev, uint8_t channel) +{ + const struct n32_cap_priv_s *priv = (const struct n32_cap_priv_s *)dev; + uint16_t ccer; + uint8_t shift; + + DEBUGASSERT(dev != NULL && channel >= 1 && channel <= 4); + + shift = (channel - 1) * 4; + ccer = n32_getreg16(priv, N32_ATIM_CCEN_OFFSET); + ccer = (ccer >> shift) & (N32_ATIM_CCEN_CC1P | N32_ATIM_CCEN_CC1NP); + + switch (ccer) + { + case 0: /* Rising edge */ + return (uint32_t)N32_CAP_EDGE_RISING; + case N32_ATIM_CCEN_CC1P: /* Falling edge */ + return (uint32_t)N32_CAP_EDGE_FALLING; + case (N32_ATIM_CCEN_CC1P | N32_ATIM_CCEN_CC1NP): /* Both edges */ + return (uint32_t)N32_CAP_EDGE_BOTH; + default: + return (uint32_t)N32_CAP_EDGE_DISABLED; + } +} + +/**************************************************************************** + * Name: n32_cap_setisr + ****************************************************************************/ + +static int n32_cap_setisr(struct n32_cap_dev_s *dev, xcpt_t handler, + void *arg) +{ + const struct n32_cap_priv_s *priv = (const struct n32_cap_priv_s *)dev; + + if (!handler) + { + up_disable_irq(priv->irq); + irq_detach(priv->irq); + if (priv->irq_of) + { + up_disable_irq(priv->irq_of); + irq_detach(priv->irq_of); + } + + return OK; + } + + irq_attach(priv->irq, handler, arg); + up_enable_irq(priv->irq); + if (priv->irq_of) + { + irq_attach(priv->irq_of, handler, arg); + up_enable_irq(priv->irq_of); + } + + return OK; +} + +/**************************************************************************** + * Name: n32_cap_enableint + ****************************************************************************/ + +static void n32_cap_enableint(struct n32_cap_dev_s *dev, n32_cap_flags_t src, + bool on) +{ + const struct n32_cap_priv_s *priv = (const struct n32_cap_priv_s *)dev; + uint32_t mask = 0; + + if (src & N32_CAP_FLAG_IRQ_COUNTER) + { + mask |= N32_ATIM_DINTEN_UIEN; + } + + if (src & N32_CAP_FLAG_IRQ_CH_1) + { + mask |= N32_ATIM_DINTEN_CC1IEN; + } + + if (src & N32_CAP_FLAG_IRQ_CH_2) + { + mask |= N32_ATIM_DINTEN_CC2IEN; + } + + if (src & N32_CAP_FLAG_IRQ_CH_3) + { + mask |= N32_ATIM_DINTEN_CC3IEN; + } + + if (src & N32_CAP_FLAG_IRQ_CH_4) + { + mask |= N32_ATIM_DINTEN_CC4IEN; + } + + if (on) + { + n32_modifyreg32(priv, N32_ATIM_DINTEN_OFFSET, 0, mask); + } + else + { + n32_modifyreg32(priv, N32_ATIM_DINTEN_OFFSET, mask, 0); + } +} + +/**************************************************************************** + * Name: n32_cap_ackflags + ****************************************************************************/ + +static void n32_cap_ackflags(struct n32_cap_dev_s *dev, int flags) +{ + const struct n32_cap_priv_s *priv = (const struct n32_cap_priv_s *)dev; + uint32_t mask = 0; + + /* Clear by writing 0 to the corresponding bits */ + + if (flags & N32_CAP_FLAG_IRQ_COUNTER) + { + mask |= N32_ATIM_STS_UDITF; + } + + if (flags & N32_CAP_FLAG_IRQ_CH_1) + { + mask |= N32_ATIM_STS_CC1ITF; + } + + if (flags & N32_CAP_FLAG_IRQ_CH_2) + { + mask |= N32_ATIM_STS_CC2ITF; + } + + if (flags & N32_CAP_FLAG_IRQ_CH_3) + { + mask |= N32_ATIM_STS_CC3ITF; + } + + if (flags & N32_CAP_FLAG_IRQ_CH_4) + { + mask |= N32_ATIM_STS_CC4ITF; + } + + if (flags & N32_CAP_FLAG_OF_CH_1) + { + mask |= N32_ATIM_STS_CC1OCF; + } + + if (flags & N32_CAP_FLAG_OF_CH_2) + { + mask |= N32_ATIM_STS_CC2OCF; + } + + if (flags & N32_CAP_FLAG_OF_CH_3) + { + mask |= N32_ATIM_STS_CC3OCF; + } + + if (flags & N32_CAP_FLAG_OF_CH_4) + { + mask |= N32_ATIM_STS_CC4OCF; + } + + n32_putreg32(priv, N32_ATIM_STS_OFFSET, ~mask); +} + +/**************************************************************************** + * Name: n32_cap_getflags + ****************************************************************************/ + +static n32_cap_flags_t n32_cap_getflags(struct n32_cap_dev_s *dev) +{ + const struct n32_cap_priv_s *priv = (const struct n32_cap_priv_s *)dev; + uint32_t regval = n32_getreg32(priv, N32_ATIM_STS_OFFSET); + n32_cap_flags_t flags = 0; + + if (regval & N32_ATIM_STS_UDITF) + { + flags |= N32_CAP_FLAG_IRQ_COUNTER; + } + + if (regval & N32_ATIM_STS_CC1ITF) + { + flags |= N32_CAP_FLAG_IRQ_CH_1; + } + + if (regval & N32_ATIM_STS_CC2ITF) + { + flags |= N32_CAP_FLAG_IRQ_CH_2; + } + + if (regval & N32_ATIM_STS_CC3ITF) + { + flags |= N32_CAP_FLAG_IRQ_CH_3; + } + + if (regval & N32_ATIM_STS_CC4ITF) + { + flags |= N32_CAP_FLAG_IRQ_CH_4; + } + + if (regval & N32_ATIM_STS_CC1OCF) + { + flags |= N32_CAP_FLAG_OF_CH_1; + } + + if (regval & N32_ATIM_STS_CC2OCF) + { + flags |= N32_CAP_FLAG_OF_CH_2; + } + + if (regval & N32_ATIM_STS_CC3OCF) + { + flags |= N32_CAP_FLAG_OF_CH_3; + } + + if (regval & N32_ATIM_STS_CC4OCF) + { + flags |= N32_CAP_FLAG_OF_CH_4; + } + + return flags; +} + +/**************************************************************************** + * Name: n32_cap_get_priv (generated) + ****************************************************************************/ + +static inline const struct n32_cap_priv_s * n32_cap_get_priv(int timer) +{ + switch (timer) + { + #ifdef CONFIG_N32H7_ATIM1_CAP + case 1: + return &n32_atim1_priv; + #endif + #ifdef CONFIG_N32H7_ATIM2_CAP + case 2: + return &n32_atim2_priv; + #endif + #ifdef CONFIG_N32H7_GTIMA1_CAP + case 3: + return &n32_gtima1_priv; + #endif + #ifdef CONFIG_N32H7_GTIMA2_CAP + case 4: + return &n32_gtima2_priv; + #endif + #ifdef CONFIG_N32H7_GTIMA3_CAP + case 5: + return &n32_gtima3_priv; + #endif + #ifdef CONFIG_N32H7_ATIM3_CAP + case 6: + return &n32_atim3_priv; + #endif + #ifdef CONFIG_N32H7_ATIM4_CAP + case 7: + return &n32_atim4_priv; + #endif + #ifdef CONFIG_N32H7_GTIMA4_CAP + case 8: + return &n32_gtima4_priv; + #endif + #ifdef CONFIG_N32H7_GTIMA5_CAP + case 9: + return &n32_gtima5_priv; + #endif + #ifdef CONFIG_N32H7_GTIMA6_CAP + case 10: + return &n32_gtima6_priv; + #endif + #ifdef CONFIG_N32H7_GTIMA7_CAP + case 11: + return &n32_gtima7_priv; + #endif + #ifdef CONFIG_N32H7_GTIMB1_CAP + case 12: + return &n32_gtimb1_priv; + #endif + #ifdef CONFIG_N32H7_GTIMB2_CAP + case 13: + return &n32_gtimb2_priv; + #endif + #ifdef CONFIG_N32H7_GTIMB3_CAP + case 14: + return &n32_gtimb3_priv; + #endif + default: + return NULL; + } +} + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +struct n32_cap_dev_s *n32_cap_init(int timer) +{ + const struct n32_cap_priv_s *priv = n32_cap_get_priv(timer); + uint32_t gpio; + + if (priv) + { + n32_cap_set_rcc(priv, true); + gpio = n32_cap_gpio(priv, -1); + if (gpio) + { + n32_configgpio(gpio); + } + + n32_modifyreg16(priv, N32_ATIM_CTRL1_OFFSET, N32_ATIM_CTRL1_CNTEN, 0); + } + + return (struct n32_cap_dev_s *)priv; +} + +int n32_cap_deinit(struct n32_cap_dev_s *dev) +{ + const struct n32_cap_priv_s *priv = (const struct n32_cap_priv_s *)dev; + uint32_t gpio; + + if (!priv) + { + return -EINVAL; + } + + n32_modifyreg16(priv, N32_ATIM_CTRL1_OFFSET, N32_ATIM_CTRL1_CNTEN, 0); + gpio = n32_cap_gpio(priv, -1); + if (gpio) + { + n32_unconfiggpio(gpio); + } + + n32_cap_set_rcc(priv, false); + return OK; +} + +#endif /* CONFIG_N32H7_CAPTURE */ diff --git a/arch/arm/src/n32h7/n32_capture.h b/arch/arm/src/n32h7/n32_capture.h new file mode 100644 index 0000000000000..e40260ae3a78c --- /dev/null +++ b/arch/arm/src/n32h7/n32_capture.h @@ -0,0 +1,108 @@ +/**************************************************************************** + * arch/arm/src/n32h7/n32_capture.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __ARCH_ARM_SRC_N32H7_N32_CAPTURE_H +#define __ARCH_ARM_SRC_N32H7_N32_CAPTURE_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include "chip.h" +#include +#include "hardware/n32h7_tim.h" + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +#define N32_CAP_SETSMC(d,cfg) ((d)->ops->setsmc(d,cfg)) +#define N32_CAP_SETCLOCK(d,clk,max) ((d)->ops->setclock(d,clk,max)) +#define N32_CAP_SETCHANNEL(d,ch,cfg) ((d)->ops->setchannel(d,ch,cfg)) +#define N32_CAP_GETCAPTURE(d,ch) ((d)->ops->getcapture(d,ch)) +#define N32_CAP_GETEDGES(d,ch) ((d)->ops->getedges(d,ch)) +#define N32_CAP_SETISR(d,hnd,arg) ((d)->ops->setisr(d,hnd,arg)) +#define N32_CAP_ENABLEINT(d,s,on) ((d)->ops->enableint(d,s,on)) +#define N32_CAP_ACKFLAGS(d,f) ((d)->ops->ackflags(d,f)) +#define N32_CAP_GETFLAGS(d) ((d)->ops->getflags(d)) + +#define N32_CAP_EDGE_MASK (3 << 8) +#define N32_CAP_EDGE_DISABLED (0 << 8) +#define N32_CAP_EDGE_RISING (1 << 8) +#define N32_CAP_EDGE_FALLING (2 << 8) +#define N32_CAP_EDGE_BOTH (3 << 8) + +/* Flags */ +#define N32_CAP_FLAG_IRQ_COUNTER (N32_ATIM_STS_UDITF) +#define N32_CAP_FLAG_IRQ_CH_1 (N32_ATIM_STS_CC1ITF) +#define N32_CAP_FLAG_IRQ_CH_2 (N32_ATIM_STS_CC2ITF) +#define N32_CAP_FLAG_IRQ_CH_3 (N32_ATIM_STS_CC3ITF) +#define N32_CAP_FLAG_IRQ_CH_4 (N32_ATIM_STS_CC4ITF) +#define N32_CAP_FLAG_OF_CH_1 (N32_ATIM_STS_CC1OCF) +#define N32_CAP_FLAG_OF_CH_2 (N32_ATIM_STS_CC2OCF) +#define N32_CAP_FLAG_OF_CH_3 (N32_ATIM_STS_CC3OCF) +#define N32_CAP_FLAG_OF_CH_4 (N32_ATIM_STS_CC4OCF) + +#define N32_CAP_FLAG_IRQ_CH(ch) (N32_ATIM_STS_CC1ITF << ((ch)-1)) +#define N32_CAP_FLAG_OF_CH(ch) (N32_ATIM_STS_CC1OCF << ((ch)-1)) +#define N32_CAP_CHANNEL_COUNTER 0 + +/**************************************************************************** + * Public Types + ****************************************************************************/ + +typedef uint16_t n32_cap_ch_cfg_t; +typedef uint32_t n32_cap_smc_cfg_t; +typedef uint32_t n32_cap_flags_t; + +struct n32_cap_dev_s +{ + const struct n32_cap_ops_s *ops; +}; + +struct n32_cap_ops_s +{ + int (*setsmc)(struct n32_cap_dev_s *dev, n32_cap_smc_cfg_t cfg); + int (*setclock)(struct n32_cap_dev_s *dev, uint32_t freq, uint32_t max); + int (*setchannel)(struct n32_cap_dev_s *dev, uint8_t channel, + n32_cap_ch_cfg_t cfg); + uint32_t (*getcapture)(struct n32_cap_dev_s *dev, uint8_t channel); + uint32_t (*getedges)(struct n32_cap_dev_s *dev, uint8_t channel); + int (*setisr)(struct n32_cap_dev_s *dev, xcpt_t handler, void *arg); + void (*enableint)(struct n32_cap_dev_s *dev, n32_cap_flags_t src, bool on); + void (*ackflags)(struct n32_cap_dev_s *dev, int flags); + n32_cap_flags_t (*getflags)(struct n32_cap_dev_s *dev); +}; + +/**************************************************************************** + * Public Function Prototypes + ****************************************************************************/ + +struct n32_cap_dev_s *n32_cap_init(int timer); +int n32_cap_deinit(struct n32_cap_dev_s *dev); + +#ifdef CONFIG_CAPTURE +struct cap_lowerhalf_s *n32_cap_initialize(int timer); +#endif + +#endif /* __ARCH_ARM_SRC_N32H7_N32_CAPTURE_H */ diff --git a/arch/arm/src/n32h7/n32_capture_lowerhalf.c b/arch/arm/src/n32h7/n32_capture_lowerhalf.c new file mode 100644 index 0000000000000..f53c4ec0ed51d --- /dev/null +++ b/arch/arm/src/n32h7/n32_capture_lowerhalf.c @@ -0,0 +1,589 @@ +/**************************************************************************** + * arch/arm/src/n32h7/n32_capture_lowerhalf.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include "n32_capture.h" + +#ifdef CONFIG_CAPTURE + +/**************************************************************************** + * Private Types + ****************************************************************************/ + +struct n32_lowerhalf_s +{ + const struct cap_ops_s *ops; + struct n32_cap_dev_s *cap; + bool started; + uint8_t resolution; + uint8_t channel; + uint32_t clock; + uint8_t duty; + uint32_t freq; + uint32_t edges; + uint32_t overflow; + uint32_t tmp_duty; + +#ifdef CONFIG_CAPTURE_NOTIFY + capture_notify_t cb; /* Edge notification callback */ + void *priv; /* Private data of the callback */ +#endif +}; + +/**************************************************************************** + * Private Function Prototypes + ****************************************************************************/ + +static int n32_cap_handler(int irq, void *context, void *arg); +static int n32_start(struct cap_lowerhalf_s *lower); +static int n32_stop(struct cap_lowerhalf_s *lower); +static int n32_getduty(struct cap_lowerhalf_s *lower, uint8_t *duty); +static int n32_getfreq(struct cap_lowerhalf_s *lower, uint32_t *freq); +static int n32_getedges(struct cap_lowerhalf_s *lower, uint32_t *edges); +static int n32_ioctl(struct cap_lowerhalf_s *lower, int cmd, + unsigned long arg); +#ifdef CONFIG_CAPTURE_NOTIFY +static int n32_bind(struct cap_lowerhalf_s *lower, enum cap_type_e type, + capture_notify_t cb, void *priv); +static int n32_unbind(struct cap_lowerhalf_s *lower); +#endif + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +static const struct cap_ops_s g_cap_ops = +{ + .start = n32_start, + .stop = n32_stop, + .getduty = n32_getduty, + .getfreq = n32_getfreq, + .getedges = n32_getedges, + .ioctl = n32_ioctl, +#ifdef CONFIG_CAPTURE_NOTIFY + .bind = n32_bind, + .unbind = n32_unbind, +#endif +}; + +#ifdef CONFIG_N32H7_ATIM1_CAP +static struct n32_lowerhalf_s g_cap1_lowerhalf = +{ + .ops = &g_cap_ops, + .resolution = 16, + .channel = CONFIG_N32H7_ATIM1_CHANNEL, + .clock = CONFIG_N32H7_ATIM1_CLOCK, +}; +#endif + +#ifdef CONFIG_N32H7_ATIM2_CAP +static struct n32_lowerhalf_s g_cap2_lowerhalf = +{ + .ops = &g_cap_ops, + .resolution = 16, + .channel = CONFIG_N32H7_ATIM2_CHANNEL, + .clock = CONFIG_N32H7_ATIM2_CLOCK, +}; +#endif + +#ifdef CONFIG_N32H7_GTIMA1_CAP +static struct n32_lowerhalf_s g_cap3_lowerhalf = +{ + .ops = &g_cap_ops, + .resolution = 16, + .channel = CONFIG_N32H7_GTIMA1_CHANNEL, + .clock = CONFIG_N32H7_GTIMA1_CLOCK, +}; +#endif + +#ifdef CONFIG_N32H7_GTIMA2_CAP +static struct n32_lowerhalf_s g_cap4_lowerhalf = +{ + .ops = &g_cap_ops, + .resolution = 16, + .channel = CONFIG_N32H7_GTIMA2_CHANNEL, + .clock = CONFIG_N32H7_GTIMA2_CLOCK, +}; +#endif + +#ifdef CONFIG_N32H7_GTIMA3_CAP +static struct n32_lowerhalf_s g_cap5_lowerhalf = +{ + .ops = &g_cap_ops, + .resolution = 16, + .channel = CONFIG_N32H7_GTIMA3_CHANNEL, + .clock = CONFIG_N32H7_GTIMA3_CLOCK, +}; +#endif + +#ifdef CONFIG_N32H7_ATIM3_CAP +static struct n32_lowerhalf_s g_cap6_lowerhalf = +{ + .ops = &g_cap_ops, + .resolution = 16, + .channel = CONFIG_N32H7_ATIM3_CHANNEL, + .clock = CONFIG_N32H7_ATIM3_CLOCK, +}; +#endif + +#ifdef CONFIG_N32H7_ATIM4_CAP +static struct n32_lowerhalf_s g_cap7_lowerhalf = +{ + .ops = &g_cap_ops, + .resolution = 16, + .channel = CONFIG_N32H7_ATIM4_CHANNEL, + .clock = CONFIG_N32H7_ATIM4_CLOCK, +}; +#endif + +#ifdef CONFIG_N32H7_GTIMA4_CAP +static struct n32_lowerhalf_s g_cap8_lowerhalf = +{ + .ops = &g_cap_ops, + .resolution = 16, + .channel = CONFIG_N32H7_GTIMA4_CHANNEL, + .clock = CONFIG_N32H7_GTIMA4_CLOCK, +}; +#endif + +#ifdef CONFIG_N32H7_GTIMA5_CAP +static struct n32_lowerhalf_s g_cap9_lowerhalf = +{ + .ops = &g_cap_ops, + .resolution = 16, + .channel = CONFIG_N32H7_GTIMA5_CHANNEL, + .clock = CONFIG_N32H7_GTIMA5_CLOCK, +}; +#endif + +#ifdef CONFIG_N32H7_GTIMA6_CAP +static struct n32_lowerhalf_s g_cap10_lowerhalf = +{ + .ops = &g_cap_ops, + .resolution = 16, + .channel = CONFIG_N32H7_GTIMA6_CHANNEL, + .clock = CONFIG_N32H7_GTIMA6_CLOCK, +}; +#endif + +#ifdef CONFIG_N32H7_GTIMA7_CAP +static struct n32_lowerhalf_s g_cap11_lowerhalf = +{ + .ops = &g_cap_ops, + .resolution = 16, + .channel = CONFIG_N32H7_GTIMA7_CHANNEL, + .clock = CONFIG_N32H7_GTIMA7_CLOCK, +}; +#endif + +#ifdef CONFIG_N32H7_GTIMB1_CAP +static struct n32_lowerhalf_s g_cap12_lowerhalf = +{ + .ops = &g_cap_ops, + .resolution = 16, + .channel = CONFIG_N32H7_GTIMB1_CHANNEL, + .clock = CONFIG_N32H7_GTIMB1_CLOCK, +}; +#endif + +#ifdef CONFIG_N32H7_GTIMB2_CAP +static struct n32_lowerhalf_s g_cap13_lowerhalf = +{ + .ops = &g_cap_ops, + .resolution = 16, + .channel = CONFIG_N32H7_GTIMB2_CHANNEL, + .clock = CONFIG_N32H7_GTIMB2_CLOCK, +}; +#endif + +#ifdef CONFIG_N32H7_GTIMB3_CAP +static struct n32_lowerhalf_s g_cap14_lowerhalf = +{ + .ops = &g_cap_ops, + .resolution = 16, + .channel = CONFIG_N32H7_GTIMB3_CHANNEL, + .clock = CONFIG_N32H7_GTIMB3_CLOCK, +}; +#endif + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +static int n32_cap_handler(int irq, void *context, void *arg) +{ + struct n32_lowerhalf_s *lower = (struct n32_lowerhalf_s *)arg; + uint8_t ch = 0x3 & lower->channel; + uint32_t period = 0; + int flags = 0; + + flags = (int)N32_CAP_GETFLAGS(lower->cap); + N32_CAP_ACKFLAGS(lower->cap, flags); + + if (flags & (N32_CAP_FLAG_IRQ_CH_1 << (ch - 1))) + { + period = N32_CAP_GETCAPTURE(lower->cap, ch) + + lower->overflow * (1 << lower->resolution) + 1; + if (period != 0) + { + lower->duty = (100 * lower->tmp_duty) / period; + lower->freq = lower->clock / period; + lower->edges++; + lower->overflow = 0; + lower->tmp_duty = 0; +#ifdef CONFIG_CAPTURE_NOTIFY + if (lower->cb != NULL) + { + lower->cb((struct cap_lowerhalf_s *)lower, lower->priv); + } +#endif + } + } + else if (flags & (N32_CAP_FLAG_IRQ_CH_2 << (2 - ch))) + { + lower->tmp_duty = N32_CAP_GETCAPTURE(lower->cap, 0x3 & (~ch)) + + lower->overflow * (1 << lower->resolution) + 1; + } + else if (flags & N32_CAP_FLAG_IRQ_COUNTER) + { + lower->overflow++; + } + + return OK; +} + +static int n32_start(struct cap_lowerhalf_s *lower) +{ + struct n32_lowerhalf_s *priv = (struct n32_lowerhalf_s *)lower; + int flags = 0; + uint32_t maxtimeout = (1 << priv->resolution) - 1; + + if (priv->started) + { + return -EBUSY; + } + + switch (priv->channel) + { + case 1: + N32_CAP_SETSMC(priv->cap, (n32_cap_smc_cfg_t)(N32_ATIM_SMCTRL_RESET | + N32_ATIM_SMCTRL_TI1FP1 | + N32_ATIM_SMCTRL_MSMD)); + N32_CAP_SETCLOCK(priv->cap, priv->clock, maxtimeout); + N32_CAP_SETCHANNEL(priv->cap, 1, (n32_cap_ch_cfg_t) + (N32_CAP_EDGE_RISING | N32_ATIM_CCMOD1_CC1IN_TI1)); + N32_CAP_SETCHANNEL(priv->cap, 2, (n32_cap_ch_cfg_t) + (N32_CAP_EDGE_FALLING | N32_ATIM_CCMOD1_CC1IN_TI2)); + flags = (int)N32_CAP_GETFLAGS(priv->cap); + N32_CAP_ACKFLAGS(priv->cap, flags); + N32_CAP_SETISR(priv->cap, n32_cap_handler, priv); + N32_CAP_ENABLEINT(priv->cap, (n32_cap_flags_t) + (N32_CAP_FLAG_IRQ_CH_1 | N32_CAP_FLAG_IRQ_CH_2 | + N32_CAP_FLAG_IRQ_COUNTER), true); + priv->started = true; + break; + case 2: + N32_CAP_SETSMC(priv->cap, (n32_cap_smc_cfg_t)(N32_ATIM_SMCTRL_RESET | + N32_ATIM_SMCTRL_TI2FP2 | + N32_ATIM_SMCTRL_MSMD)); + N32_CAP_SETCLOCK(priv->cap, priv->clock, maxtimeout); + N32_CAP_SETCHANNEL(priv->cap, 2, (n32_cap_ch_cfg_t) + (N32_CAP_EDGE_RISING | N32_ATIM_CCMOD1_CC1IN_TI1)); + N32_CAP_SETCHANNEL(priv->cap, 1, (n32_cap_ch_cfg_t) + (N32_CAP_EDGE_FALLING | N32_ATIM_CCMOD1_CC1IN_TI2)); + flags = (int)N32_CAP_GETFLAGS(priv->cap); + N32_CAP_ACKFLAGS(priv->cap, flags); + N32_CAP_SETISR(priv->cap, n32_cap_handler, priv); + N32_CAP_ENABLEINT(priv->cap, (n32_cap_flags_t) + (N32_CAP_FLAG_IRQ_CH_2 | N32_CAP_FLAG_IRQ_CH_1 | + N32_CAP_FLAG_IRQ_COUNTER), true); + priv->started = true; + break; + default: + return -EINVAL; + } + + /* The actual frequency is priv->clock (as set by SETCLOCK) */ + + return OK; +} + +static int n32_stop(struct cap_lowerhalf_s *lower) +{ + struct n32_lowerhalf_s *priv = (struct n32_lowerhalf_s *)lower; + int flags = 0; + + if (!priv->started) + { + return -ENODEV; + } + + N32_CAP_SETSMC(priv->cap, 0); + N32_CAP_SETCLOCK(priv->cap, 0, 0); + N32_CAP_SETCHANNEL(priv->cap, 1, N32_CAP_EDGE_DISABLED); + N32_CAP_SETCHANNEL(priv->cap, 2, N32_CAP_EDGE_DISABLED); + N32_CAP_ENABLEINT(priv->cap, N32_CAP_FLAG_IRQ_CH_1 | + N32_CAP_FLAG_IRQ_CH_2 | + N32_CAP_FLAG_IRQ_COUNTER, false); + + flags = (int)N32_CAP_GETFLAGS(priv->cap); + N32_CAP_ACKFLAGS(priv->cap, flags); + N32_CAP_SETISR(priv->cap, NULL, NULL); + priv->started = false; + priv->duty = 0; + priv->freq = 0; + priv->edges = 0; + priv->overflow = 0; + priv->tmp_duty = 0; + + return OK; +} + +static int n32_getduty(struct cap_lowerhalf_s *lower, uint8_t *duty) +{ + struct n32_lowerhalf_s *priv = (struct n32_lowerhalf_s *)lower; + irqstate_t flags = enter_critical_section(); + + *duty = priv->duty; + + leave_critical_section(flags); + return OK; +} + +static int n32_getfreq(struct cap_lowerhalf_s *lower, uint32_t *freq) +{ + struct n32_lowerhalf_s *priv = (struct n32_lowerhalf_s *)lower; + irqstate_t flags = enter_critical_section(); + + *freq = priv->freq; + + leave_critical_section(flags); + return OK; +} + +static int n32_getedges(struct cap_lowerhalf_s *lower, uint32_t *edges) +{ + struct n32_lowerhalf_s *priv = (struct n32_lowerhalf_s *)lower; + irqstate_t flags = enter_critical_section(); + + *edges = priv->edges; + + leave_critical_section(flags); + return OK; +} + +static int n32_ioctl(struct cap_lowerhalf_s *lower, int cmd, + unsigned long arg) +{ + struct n32_lowerhalf_s *priv = (struct n32_lowerhalf_s *)lower; + irqstate_t flags = enter_critical_section(); + + switch (cmd) + { + case CAPIOC_CLR_CNT: + priv->edges = 0; + priv->overflow = 0; + break; + case CAPIOC_PULSES: + { + int *count = (int *)((uintptr_t)arg); + + DEBUGASSERT(count != NULL); + *count = (int)priv->edges; + } + + break; + default: + return -EINVAL; + } + + leave_critical_section(flags); + return OK; +} + +#ifdef CONFIG_CAPTURE_NOTIFY +static int n32_bind(struct cap_lowerhalf_s *lower, enum cap_type_e type, + capture_notify_t cb, void *priv) +{ + struct n32_lowerhalf_s *priv = (struct n32_lowerhalf_s *)lower; + irqstate_t flags; + + /* Only the rising edge of channel 0 is reported: it is the edge that + * completes the measurement of a period. + */ + + if (type != CAP_TYPE_RISING) + { + return -ENOSYS; + } + + flags = enter_critical_section(); + priv->cb = cb; + priv->priv = priv; + leave_critical_section(flags); + + return OK; +} + +static int n32_unbind(struct cap_lowerhalf_s *lower) +{ + struct n32_lowerhalf_s *priv = (struct n32_lowerhalf_s *)lower; + irqstate_t flags; + + flags = enter_critical_section(); + priv->cb = NULL; + priv->priv = NULL; + leave_critical_section(flags); + + return OK; +} +#endif /* CONFIG_CAPTURE_NOTIFY */ + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: n32_cap_initialize + * + * Description: + * Initialize one timer for use with the upper_level capture driver. + * + * Input Parameters: + * timer - A number identifying the timer use. The number of valid timer + * IDs varies with the N32 MCU and MCU family but is somewhere in + * the range of {1,..,5 8,...,14}. + * + * Returned Value: + * On success, a pointer to the N32 lower half capture driver returned. + * NULL is returned on any failure. + * + ****************************************************************************/ + +struct cap_lowerhalf_s *n32_cap_initialize(int timer) +{ + struct n32_lowerhalf_s *lower = NULL; + + switch (timer) + { + #ifdef CONFIG_N32H7_ATIM1_CAP + case 1: + lower = &g_cap1_lowerhalf; + break; + #endif + #ifdef CONFIG_N32H7_ATIM2_CAP + case 2: + lower = &g_cap2_lowerhalf; + break; + #endif + #ifdef CONFIG_N32H7_GTIMA1_CAP + case 3: + lower = &g_cap3_lowerhalf; + break; + #endif + #ifdef CONFIG_N32H7_GTIMA2_CAP + case 4: + lower = &g_cap4_lowerhalf; + break; + #endif + #ifdef CONFIG_N32H7_GTIMA3_CAP + case 5: + lower = &g_cap5_lowerhalf; + break; + #endif + #ifdef CONFIG_N32H7_ATIM3_CAP + case 6: + lower = &g_cap6_lowerhalf; + break; + #endif + #ifdef CONFIG_N32H7_ATIM4_CAP + case 7: + lower = &g_cap7_lowerhalf; + break; + #endif + #ifdef CONFIG_N32H7_GTIMA4_CAP + case 8: + lower = &g_cap8_lowerhalf; + break; + #endif + #ifdef CONFIG_N32H7_GTIMA5_CAP + case 9: + lower = &g_cap9_lowerhalf; + break; + #endif + #ifdef CONFIG_N32H7_GTIMA6_CAP + case 10: + lower = &g_cap10_lowerhalf; + break; + #endif + #ifdef CONFIG_N32H7_GTIMA7_CAP + case 11: + lower = &g_cap11_lowerhalf; + break; + #endif + #ifdef CONFIG_N32H7_GTIMB1_CAP + case 12: + lower = &g_cap12_lowerhalf; + break; + #endif + #ifdef CONFIG_N32H7_GTIMB2_CAP + case 13: + lower = &g_cap13_lowerhalf; + break; + #endif + #ifdef CONFIG_N32H7_GTIMB3_CAP + case 14: + lower = &g_cap14_lowerhalf; + break; + #endif + default: + { + lower = NULL; + goto errout; + } + } + + /* Initialize the elements of lower half state structure */ + + lower->started = false; + lower->cap = n32_cap_init(timer); + + if (lower->cap == NULL) + { + lower = NULL; + } + +errout: + return (struct cap_lowerhalf_s *)lower; +} +#endif /* CONFIG_CAPTURE */ diff --git a/arch/arm/src/n32h7/n32_cordic.c b/arch/arm/src/n32h7/n32_cordic.c new file mode 100644 index 0000000000000..d0e3b320a6417 --- /dev/null +++ b/arch/arm/src/n32h7/n32_cordic.c @@ -0,0 +1,315 @@ +/**************************************************************************** + * arch/arm/src/n32h7/n32_cordic.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include +#include +#include +#include + +#include "arm_internal.h" +#include "chip.h" +#include "hardware/n32h7_cordic.h" +#include "n32_cordic.h" + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* Fixed precision (iterations = PRECISION * 4) */ +#define N32_CORDIC_PRECISION (6) + +/* Use 32-bit Q1.31 format for input/output */ +#define N32_CORDIC_INSIZE (0) /* 32-bit */ +#define N32_CORDIC_OUTSIZE (0) /* 32-bit */ +#define N32_CORDIC_FLOATIN (0) /* Fixed point */ +#define N32_CORDIC_FLOATOUT (0) /* Fixed point */ +#define N32_CORDIC_PHASELIMIT (0) /* Disable phase limit */ +#define N32_CORDIC_CODINLIMIT (0) /* Disable coordinate limit */ + +/**************************************************************************** + * Private Types + ****************************************************************************/ + +struct n32_cordic_s +{ + const struct cordic_ops_s *ops; /* Lower half operations */ + uint32_t base; /* Base address of the CORDIC */ + bool inuse; /* True: driver is in-use */ +}; + +/**************************************************************************** + * Private Function Prototypes + ****************************************************************************/ + +static uint32_t cordic_getreg(struct n32_cordic_s *priv, int offset); +static void cordic_putreg(struct n32_cordic_s *priv, int offset, + uint32_t value); +static int cordic_calc(struct cordic_lowerhalf_s *lower, + struct cordic_calc_s *calc); + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +static const struct cordic_ops_s g_n32_cordic_ops = +{ + .calc = cordic_calc, +}; + +static struct n32_cordic_s g_n32_cordic_dev = +{ + .ops = &g_n32_cordic_ops, + .base = N32_CORDIC_BASE, + .inuse = false, +}; + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: cordic_getreg + ****************************************************************************/ + +static uint32_t cordic_getreg(struct n32_cordic_s *priv, int offset) +{ + return getreg32(priv->base + offset); +} + +/**************************************************************************** + * Name: cordic_putreg + ****************************************************************************/ + +static void cordic_putreg(struct n32_cordic_s *priv, int offset, + uint32_t value) +{ + putreg32(value, priv->base + offset); +} + +/**************************************************************************** + * Name: cordic_calc + ****************************************************************************/ + +static int cordic_calc(struct cordic_lowerhalf_s *lower, + struct cordic_calc_s *calc) +{ + struct n32_cordic_s *priv = (struct n32_cordic_s *)lower; + int ret = OK; + uint32_t ctrl = 0; + bool arg2_inc = false; + uint8_t scale = 0; + + DEBUGASSERT(lower && calc); + + /* Select function and determine number of arguments and scale factor */ + + switch (calc->func) + { + case CORDIC_CALC_FUNC_COS: + ctrl |= CORDIC_CTRLSTS_FUNC_COS; + arg2_inc = true; + scale = 0; + break; + + case CORDIC_CALC_FUNC_SIN: + ctrl |= CORDIC_CTRLSTS_FUNC_SIN; + arg2_inc = true; + scale = 0; + break; + + case CORDIC_CALC_FUNC_PHASE: + ctrl |= CORDIC_CTRLSTS_FUNC_PHASE; + arg2_inc = true; + scale = 0; + break; + + case CORDIC_CALC_FUNC_MOD: + ctrl |= CORDIC_CTRLSTS_FUNC_MODULUS; + arg2_inc = true; + scale = 0; + break; + + case CORDIC_CALC_FUNC_ARCTAN: + ctrl |= CORDIC_CTRLSTS_FUNC_ARCTAN; + arg2_inc = true; + scale = 0; + break; + + case CORDIC_CALC_FUNC_HCOS: + ctrl |= CORDIC_CTRLSTS_FUNC_HB_COS; + arg2_inc = false; + scale = 1; + break; + + case CORDIC_CALC_FUNC_HSIN: + ctrl |= CORDIC_CTRLSTS_FUNC_HB_SIN; + arg2_inc = false; + scale = 1; + break; + + case CORDIC_CALC_FUNC_HARCTAN: + ctrl |= CORDIC_CTRLSTS_FUNC_HB_ARCT; + arg2_inc = false; + scale = 1; + break; + + case CORDIC_CALC_FUNC_LN: + ctrl |= CORDIC_CTRLSTS_FUNC_NATL; + arg2_inc = false; + scale = 1; + break; + + case CORDIC_CALC_FUNC_SQRT: + ctrl |= CORDIC_CTRLSTS_FUNC_SQRT; + arg2_inc = false; + scale = 1; + break; + + default: + ret = -EINVAL; + goto errout; + } + + /* Set precision (iteration count = PRECISION * 4) */ + + ctrl |= ((N32_CORDIC_PRECISION << CORDIC_CTRLSTS_PRECISION_SHIFT) & + CORDIC_CTRLSTS_PRECISION_MASK); + + /* Set scale factor */ + + ctrl |= ((scale << CORDIC_CTRLSTS_SCALE_SHIFT) & + CORDIC_CTRLSTS_SCALE_MASK); + + /* Input/output width: fixed 32-bit */ + + if (N32_CORDIC_INSIZE) + { + ctrl |= CORDIC_CTRLSTS_INSIZE; + } + + if (N32_CORDIC_OUTSIZE) + { + ctrl |= CORDIC_CTRLSTS_OUTSIZE; + } + + /* Floating point disabled (Q31) */ + + if (N32_CORDIC_FLOATIN) + { + ctrl |= CORDIC_CTRLSTS_FLOATIN; + } + + if (N32_CORDIC_FLOATOUT) + { + ctrl |= CORDIC_CTRLSTS_FLOATOUT; + } + + /* Limit controls disabled */ + + if (N32_CORDIC_PHASELIMIT) + { + ctrl |= CORDIC_CTRLSTS_PHASELIMIT; + } + + if (N32_CORDIC_CODINLIMIT) + { + ctrl |= CORDIC_CTRLSTS_CODINLIMIT; + } + + /* Number of arguments */ + + if (arg2_inc) + { + ctrl |= CORDIC_CTRLSTS_NUMWRITE; + } + + /* Number of results */ + + if (calc->res2_incl) + { + ctrl |= CORDIC_CTRLSTS_NUMREAD; + } + + /* Disable interrupts and DMA */ + + /* (INTEN, DMAREN, DMAWEN remain 0) */ + + /* Write control register */ + + cordic_putreg(priv, N32_CORDIC_CTRLSTS_OFFSET, ctrl); + + /* Write arguments */ + + cordic_putreg(priv, N32_CORDIC_WDATA_OFFSET, calc->arg1); + if (arg2_inc) + { + cordic_putreg(priv, N32_CORDIC_WDATA_OFFSET, calc->arg2); + } + + /* Read results. Hardware inserts wait states if RRF is not set. */ + + calc->res1 = cordic_getreg(priv, N32_CORDIC_RDATA_OFFSET); + if (calc->res2_incl) + { + calc->res2 = cordic_getreg(priv, N32_CORDIC_RDATA_OFFSET); + } + else + { + calc->res2 = 0; + } + +errout: + return ret; +} + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: n32_cordicinitialize + ****************************************************************************/ + +struct cordic_lowerhalf_s *n32_cordicinitialize(void) +{ + struct cordic_lowerhalf_s *lower = NULL; + + if (g_n32_cordic_dev.inuse) + { + _err("N32 CORDIC already in use\n"); + set_errno(EBUSY); + goto errout; + } + + lower = (struct cordic_lowerhalf_s *)&g_n32_cordic_dev; + g_n32_cordic_dev.inuse = true; + +errout: + return lower; +} diff --git a/arch/arm/src/n32h7/n32_cordic.h b/arch/arm/src/n32h7/n32_cordic.h new file mode 100644 index 0000000000000..cf8444c393cf1 --- /dev/null +++ b/arch/arm/src/n32h7/n32_cordic.h @@ -0,0 +1,52 @@ +/**************************************************************************** + * arch/arm/src/n32h7/n32_cordic.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __ARCH_ARM_SRC_N32_N32_CORDIC_H +#define __ARCH_ARM_SRC_N32_N32_CORDIC_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include "hardware/n32h7_cordic.h" + +/**************************************************************************** + * Public Function Prototypes + ****************************************************************************/ + +/**************************************************************************** + * Name: n32_cordicinitialize + * + * Description: + * Initialize the N32H7 CORDIC peripheral. This function must be called + * from board-specific logic. + * + * Returned Value: + * On success, a pointer to the lower half CORDIC driver is returned. + * NULL is returned on any failure. + * + ****************************************************************************/ + +struct cordic_lowerhalf_s *n32_cordicinitialize(void); + +#endif /* __ARCH_ARM_SRC_N32H7_N32_CORDIC_H */ diff --git a/arch/arm/src/n32h7/n32_dbgmcu.h b/arch/arm/src/n32h7/n32_dbgmcu.h new file mode 100644 index 0000000000000..1fc29b9e74eac --- /dev/null +++ b/arch/arm/src/n32h7/n32_dbgmcu.h @@ -0,0 +1,34 @@ +/**************************************************************************** + * arch/arm/src/n32h7/n32_dbgmcu.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __ARCH_ARM_SRC_N32H7_N32_DBGMCU_H +#define __ARCH_ARM_SRC_N32H7_N32_DBGMCU_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include "hardware/n32h7xx_dbgmcu.h" + +#endif /* __ARCH_ARM_SRC_N32H7_N32_DBGMCU_H */ diff --git a/arch/arm/src/n32h7/n32_dma.c b/arch/arm/src/n32h7/n32_dma.c new file mode 100644 index 0000000000000..e68d48a629de3 --- /dev/null +++ b/arch/arm/src/n32h7/n32_dma.c @@ -0,0 +1,1999 @@ +/**************************************************************************** + * arch/arm/src/n32h7/n32_dma.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "arm_internal.h" +#include "sched/sched.h" + +#include "n32_dma.h" +#include "hardware/n32h7_dma.h" +#include "hardware/n32h7_dmamux.h" + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +#define DMAMUX_NUM 2 +#define DMA_CONTROLLERS 4 + +#ifdef CONFIG_N32H7_MDMA +# define MDMA_NCHAN 16 +#else +# define MDMA_NCHAN 0 +#endif +#ifdef CONFIG_N32H7_DMA1 +# define DMA1_NCHAN 8 +#else +# define DMA1_NCHAN 0 +#endif +#ifdef CONFIG_N32H7_DMA2 +# define DMA2_NCHAN 8 +#else +# define DMA2_NCHAN 0 +#endif +#ifdef CONFIG_N32H7_DMA3 +# define DMA3_NCHAN 8 +#else +# define DMA3_NCHAN 0 +#endif + +#define MDMA_FIRST (0) +#define MDMA_LAST (MDMA_FIRST+MDMA_NCHAN) +#define DMA1_FIRST (MDMA_LAST) +#define DMA1_LAST (DMA1_FIRST+DMA1_NCHAN) +#define DMA2_FIRST (DMA1_LAST) +#define DMA2_LAST (DMA2_FIRST+DMA2_NCHAN) +#define DMA3_FIRST (DMA2_LAST) +#define DMA3_LAST (DMA3_FIRST+DMA3_NCHAN) + +/* All available DMA channels (chanels from standard DMA and + * channels from DMA3 and MDMA) + */ + +#define DMA_NCHANNELS (DMA1_NCHAN+DMA2_NCHAN+MDMA_NCHAN+DMA3_NCHAN) + +/* Default DMA, MDMA and DMA3 priorities */ + +#ifndef CONFIG_DMA_PRI +# define CONFIG_DMA_PRI NVIC_SYSH_PRIORITY_DEFAULT +#endif + +#ifndef CONFIG_MDMA_PRI +# define CONFIG_MDMA_PRI NVIC_SYSH_PRIORITY_DEFAULT +#endif + +/**************************************************************************** + * Private Types + ****************************************************************************/ + +/* This structure described one DMAMUX device */ + +struct n32_dmamux_s +{ + uint8_t id; /* DMAMUX id */ + uint8_t nchan; /* DMAMUX channels */ + uint32_t base; /* DMAMUX base address */ +}; + +typedef struct n32_dmamux_s *DMA_MUX; + +/* This structure describes one DMA controller */ + +struct n32_dma_s +{ + uint8_t first; /* Offset in n32_dmach_s array */ + uint8_t nchan; /* Number of channels */ + uint8_t dmamux_offset; /* DMAMUX channel offset */ + uint32_t base; /* Base address */ + DMA_MUX dmamux; /* DMAMUX associated with controller */ +}; + +/* This structure describes one DMA channel (DMA123 or MDMA) */ + +struct n32_dmach_s +{ + bool used; /* Channel in use */ + uint8_t ctrl:3; /* DMA controller */ + uint8_t chan:5; /* DMA chanel/channel channel id */ + uint8_t irq; /* DMA chanel IRQ number */ + uint32_t base; /* DMA register channel base address */ + dma_callback_t callback; /* Callback invoked when the DMA completes */ + void *arg; /* Argument passed to callback function */ +}; + +typedef struct n32_dmach_s *DMA_CHANNEL; + +/* DMA operations */ + +struct n32_dma_ops_s +{ + /* Start the DMA transfer */ + + void (*dma_disable)(DMA_CHANNEL dmachan); + + /* DMA interrupt */ + + int (*dma_interrupt)(int irq, void *context, void *arg); + + /* Setup the DMA */ + + void (*dma_setup)(DMA_HANDLE handle, n32_dmacfg_t *cfg); + + /* Start the DMA */ + + void (*dma_start)(DMA_HANDLE handle, dma_callback_t callback, + void *arg); + + /* Read remaining DMA bytes */ + + size_t (*dma_residual)(DMA_HANDLE handle); + + /* Check the DMA configuration */ + + bool (*dma_capable)(n32_dmacfg_t *cfg); + + /* Dump the DMA registers */ + + void (*dma_dump)(DMA_HANDLE handle, const char *msg); +}; + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +#ifdef CONFIG_N32H7_MDMA +static void n32_mdma_disable(DMA_CHANNEL dmachan); +static int n32_mdma_interrupt(int irq, void *context, void *arg); +static void n32_mdma_setup(DMA_HANDLE handle, n32_dmacfg_t *cfg); +static void n32_mdma_start(DMA_HANDLE handle, dma_callback_t callback, + void *arg); +static size_t n32_mdma_residual(DMA_HANDLE handle); +#ifdef CONFIG_N32H7_DMACAPABLE +static bool n32_mdma_capable(n32_dmacfg_t *cfg); +#endif +#ifdef CONFIG_DEBUG_DMA_INFO +static void n32_mdma_dump(DMA_HANDLE handle, const char *msg); +#endif +#endif + +#if defined(CONFIG_N32H7_DMA1) || defined(CONFIG_N32H7_DMA2) || defined(CONFIG_N32H7_DMA3) +static void n32_sdma_disable(DMA_CHANNEL dmachan); +static int n32_sdma_interrupt(int irq, void *context, void *arg); +static void n32_sdma_setup(DMA_HANDLE handle, n32_dmacfg_t *cfg); +static void n32_sdma_start(DMA_HANDLE handle, dma_callback_t callback, + void *arg); +static size_t n32_sdma_residual(DMA_HANDLE handle); +#ifdef CONFIG_N32H7_DMACAPABLE +static bool n32_sdma_capable(n32_dmacfg_t *cfg); +#endif +#ifdef CONFIG_DEBUG_DMA_INFO +static void n32_sdma_dump(DMA_HANDLE handle, const char *msg); +#endif +#endif + +static uint32_t dmachan_getbase(DMA_CHANNEL dmachan); +static uint32_t dmabase_getreg(DMA_CHANNEL dmachan, uint32_t offset); +static void dmabase_putreg(DMA_CHANNEL dmachan, uint32_t offset, + uint32_t value); +static uint32_t dmachan_getreg(DMA_CHANNEL dmachan, uint32_t offset); +static void dmachan_putreg(DMA_CHANNEL dmachan, uint32_t offset, + uint32_t value); +static void dmamux_putreg(DMA_MUX dmamux, uint32_t offset, uint32_t value); +#ifdef CONFIG_DEBUG_DMA_INFO +static uint32_t dmamux_getreg(DMA_MUX dmamux, uint32_t offset); +static void n32_dmamux_dump(DMA_MUX dmamux, uint8_t chan); +#endif +static DMA_CHANNEL n32_dma_channel_get(uint8_t channel, + uint8_t controller); +static void n32_gdma_limits_get(uint8_t controller, uint8_t *first, + uint8_t *last); + +static inline void dmachan_modifyreg32(DMA_CHANNEL dmachan, + uint32_t offset, uint32_t clrbits, + uint32_t setbits) +{ + modifyreg32(dmachan->base + offset, clrbits, setbits); +} + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +/* Operations specific to DMA controller */ + +struct n32_dma_ops_s g_dma_ops[DMA_CONTROLLERS] = +{ +#ifdef CONFIG_N32H7_MDMA + /* 0 - MDMA */ + + { + .dma_disable = n32_mdma_disable, + .dma_interrupt = n32_mdma_interrupt, + .dma_setup = n32_mdma_setup, + .dma_start = n32_mdma_start, + .dma_residual = n32_mdma_residual, +#ifdef CONFIG_N32H7_DMACAPABLE + .dma_capable = n32_mdma_capable, +#endif +#ifdef CONFIG_DEBUG_DMA_INFO + .dma_dump = n32_mdma_dump, +#endif + }, +#else + { + NULL + }, +#endif + +#ifdef CONFIG_N32H7_DMA1 + /* 1 - DMA1 */ + + { + .dma_disable = n32_sdma_disable, + .dma_interrupt = n32_sdma_interrupt, + .dma_setup = n32_sdma_setup, + .dma_start = n32_sdma_start, + .dma_residual = n32_sdma_residual, +#ifdef CONFIG_N32H7_DMACAPABLE + .dma_capable = n32_sdma_capable, +#endif +#ifdef CONFIG_DEBUG_DMA_INFO + .dma_dump = n32_sdma_dump, +#endif + }, +#else + { + NULL + }, +#endif + +#ifdef CONFIG_N32H7_DMA2 + /* 2 - DMA2 */ + + { + .dma_disable = n32_sdma_disable, + .dma_interrupt = n32_sdma_interrupt, + .dma_setup = n32_sdma_setup, + .dma_start = n32_sdma_start, + .dma_residual = n32_sdma_residual, +#ifdef CONFIG_N32H7_DMACAPABLE + .dma_capable = n32_sdma_capable, +#endif +#ifdef CONFIG_DEBUG_DMA_INFO + .dma_dump = n32_sdma_dump, +#endif + }, +#else + { + NULL + }, +#endif + +#ifdef CONFIG_N32H7_DMA3 + /* 3 - DMA3 */ + + { + .dma_disable = n32_sdma_disable, + .dma_interrupt = n32_sdma_interrupt, + .dma_setup = n32_sdma_setup, + .dma_start = n32_sdma_start, + .dma_residual = n32_sdma_residual, +#ifdef CONFIG_N32H7_DMACAPABLE + .dma_capable = n32_sdma_capable, +#endif +#ifdef CONFIG_DEBUG_DMA_INFO + .dma_dump = n32_sdma_dump, +#endif + }, +#else + { + NULL + }, +#endif +}; + +/* This array describes the state of DMAMUX controller */ + +struct n32_dmamux_s g_dmamux[DMAMUX_NUM] = +{ + { + .id = 1, + .nchan = 24, /* 0-7 - DMA1, 8-15 - DMA2, 16-23 - DMA3 */ + .base = N32_DMAMUX1_BASE + }, + + { + .id = 2, + .nchan = 16, /* 0-15 - MDMA */ + .base = N32_DMAMUX2_BASE + } +}; + +/* This array describes the state of each controller */ + +struct n32_dma_s g_dma[DMA_NCHANNELS] = +{ + /* 0 - MDMA */ + + { + .base = N32_MDMA_BASE, + .first = MDMA_FIRST, + .nchan = MDMA_NCHAN, + .dmamux = &g_dmamux[DMAMUX2], /* DMAMUX2 channels 0-15 */ + .dmamux_offset = 0 + }, + + /* 1 - DMA1 */ + + { + .base = N32_DMA1_BASE, + .first = DMA1_FIRST, + .nchan = DMA1_NCHAN, + .dmamux = &g_dmamux[DMAMUX1], /* DMAMUX1 channels 0-7 */ + .dmamux_offset = 0 + }, + + /* 2 - DMA2 */ + + { + .base = N32_DMA2_BASE, + .first = DMA2_FIRST, + .nchan = DMA2_NCHAN, + .dmamux = &g_dmamux[DMAMUX1], /* DMAMUX1 channels 8-15 */ + .dmamux_offset = 8 + }, + + /* 3 - DMA3 */ + + { + .base = N32_DMA3_BASE, + .first = DMA3_FIRST, + .nchan = DMA3_NCHAN, + .dmamux = &g_dmamux[DMAMUX1], /* DMAMUX1 channels 16-23 */ + .dmamux_offset = 16 + } +}; + +/* This array describes the state of each DMA channel. + * Note that we keep here standard DMA chanels, BDMA channels and MDMA + * channels. + */ + +static struct n32_dmach_s g_dmach[DMA_NCHANNELS] = +{ +#ifdef CONFIG_N32H7_MDMA + /* MDMA */ + + { + .ctrl = MDMA, + .chan = 0, + .irq = N32_IRQ_MDMA_CHANNEL0, + .base = N32_MDMA_BASE + N32_MDMA_OFFSET(0), + }, + + { + .ctrl = MDMA, + .chan = 1, + .irq = N32_IRQ_MDMA, + .base = N32_MDMA_BASE + N32_MDMA_OFFSET(1), + }, + + { + .ctrl = MDMA, + .chan = 2, + .irq = N32_IRQ_MDMA, + .base = N32_MDMA_BASE + N32_MDMA_OFFSET(2), + }, + + { + .ctrl = MDMA, + .chan = 3, + .irq = N32_IRQ_MDMA, + .base = N32_MDMA_BASE + N32_MDMA_OFFSET(3), + }, + + { + .ctrl = MDMA, + .chan = 4, + .irq = N32_IRQ_MDMA, + .base = N32_MDMA_BASE + N32_MDMA_OFFSET(4), + }, + + { + .ctrl = MDMA, + .chan = 5, + .irq = N32_IRQ_MDMA, + .base = N32_MDMA_BASE + N32_MDMA_OFFSET(5), + }, + + { + .ctrl = MDMA, + .chan = 6, + .irq = N32_IRQ_MDMA, + .base = N32_MDMA_BASE + N32_MDMA_OFFSET(6), + }, + + { + .ctrl = MDMA, + .chan = 7, + .irq = N32_IRQ_MDMA, + .base = N32_MDMA_BASE + N32_MDMA_OFFSET(7), + }, + + { + .ctrl = MDMA, + .chan = 8, + .irq = N32_IRQ_MDMA, + .base = N32_MDMA_BASE + N32_MDMA_OFFSET(8), + }, + + { + .ctrl = MDMA, + .chan = 9, + .irq = N32_IRQ_MDMA, + .base = N32_MDMA_BASE + N32_MDMA_OFFSET(9), + }, + + { + .ctrl = MDMA, + .chan = 10, + .irq = N32_IRQ_MDMA, + .base = N32_MDMA_BASE + N32_MDMA_OFFSET(10), + }, + + { + .ctrl = MDMA, + .chan = 11, + .irq = N32_IRQ_MDMA, + .base = N32_MDMA_BASE + N32_MDMA_OFFSET(11), + }, + + { + .ctrl = MDMA, + .chan = 12, + .irq = N32_IRQ_MDMA, + .base = N32_MDMA_BASE + N32_MDMA_OFFSET(12), + }, + + { + .ctrl = MDMA, + .chan = 13, + .irq = N32_IRQ_MDMA, + .base = N32_MDMA_BASE + N32_MDMA_OFFSET(13), + }, + + { + .ctrl = MDMA, + .chan = 14, + .irq = N32_IRQ_MDMA, + .base = N32_MDMA_BASE + N32_MDMA_OFFSET(15), + }, + + { + .ctrl = MDMA, + .chan = 15, + .irq = N32_IRQ_MDMA, + .base = N32_MDMA_BASE + N32_MDMA_OFFSET(15), + }, +#endif + +#ifdef CONFIG_N32H7_DMA1 + /* DMA1 */ + + { + .ctrl = DMA1, + .chan = 0, + .irq = N32_IRQ_DMA1_CHANNEL0, + .base = N32_DMA1_BASE + N32_DMA_CH_OFFSET(0), + }, + + { + .ctrl = DMA1, + .chan = 1, + .irq = N32_IRQ_DMA1_CHANNEL1, + .base = N32_DMA1_BASE + N32_DMA_CH_OFFSET(1), + }, + + { + .ctrl = DMA1, + .chan = 2, + .irq = N32_IRQ_DMA1_CHANNEL2, + .base = N32_DMA1_BASE + N32_DMA_CH_OFFSET(2), + }, + + { + .ctrl = DMA1, + .chan = 3, + .irq = N32_IRQ_DMA1_CHANNEL3, + .base = N32_DMA1_BASE + N32_DMA_CH_OFFSET(3), + }, + + { + .ctrl = DMA1, + .chan = 4, + .irq = N32_IRQ_DMA1_CHANNEL4, + .base = N32_DMA1_BASE + N32_DMA_CH_OFFSET(4), + }, + + { + .ctrl = DMA1, + .chan = 5, + .irq = N32_IRQ_DMA1_CHANNEL5, + .base = N32_DMA1_BASE + N32_DMA_CH_OFFSET(5), + }, + + { + .ctrl = DMA1, + .chan = 6, + .irq = N32_IRQ_DMA1_CHANNEL6, + .base = N32_DMA1_BASE + N32_DMA_CH_OFFSET(6), + }, + + { + .ctrl = DMA1, + .chan = 7, + .irq = N32_IRQ_DMA1_CHANNEL7, + .base = N32_DMA1_BASE + N32_DMA_CH_OFFSET(7), + }, +#endif + +#ifdef CONFIG_N32H7_DMA2 + /* DMA2 */ + + { + .ctrl = DMA2, + .chan = 0, + .irq = N32_IRQ_DMA2_CHANNEL0, + .base = N32_DMA2_BASE + N32_DMA_CH_OFFSET(0), + }, + + { + .ctrl = DMA2, + .chan = 1, + .irq = N32_IRQ_DMA2_CHANNEL1, + .base = N32_DMA2_BASE + N32_DMA_CH_OFFSET(1), + }, + + { + .ctrl = DMA2, + .chan = 2, + .irq = N32_IRQ_DMA2_CHANNEL2, + .base = N32_DMA2_BASE + N32_DMA_CH_OFFSET(2), + }, + + { + .ctrl = DMA2, + .chan = 3, + .irq = N32_IRQ_DMA2_CHANNEL3, + .base = N32_DMA2_BASE + N32_DMA_CH_OFFSET(3), + }, + + { + .ctrl = DMA2, + .chan = 4, + .irq = N32_IRQ_DMA2_CHANNEL4, + .base = N32_DMA2_BASE + N32_DMA_CH_OFFSET(4), + }, + + { + .ctrl = DMA2, + .chan = 5, + .irq = N32_IRQ_DMA2_CHANNEL5, + .base = N32_DMA2_BASE + N32_DMA_CH_OFFSET(5), + }, + + { + .ctrl = DMA2, + .chan = 6, + .irq = N32_IRQ_DMA2_CHANNEL6, + .base = N32_DMA2_BASE + N32_DMA_CH_OFFSET(6), + }, + + { + .ctrl = DMA2, + .chan = 7, + .irq = N32_IRQ_DMA2_CHANNEL7, + .base = N32_DMA2_BASE + N32_DMA_CH_OFFSET(7), + }, +#endif + +#ifdef CONFIG_N32H7_DMA3 + /* DMA3 */ + + { + .ctrl = DMA3, + .chan = 0, + .irq = N32_IRQ_DMA3_CHANNEL0, + .base = N32_DMA3_BASE + N32_DMA_CH_OFFSET(0), + }, + + { + .ctrl = DMA3, + .chan = 1, + .irq = N32_IRQ_DMA3_CHANNEL1, + .base = N32_DMA3_BASE + N32_DMA_CH_OFFSET(1), + }, + + { + .ctrl = DMA3, + .chan = 2, + .irq = N32_IRQ_DMA3_CHANNEL2, + .base = N32_DMA3_BASE + N32_DMA_CH_OFFSET(2), + }, + + { + .ctrl = DMA3, + .chan = 3, + .irq = N32_IRQ_DMA3_CHANNEL3, + .base = N32_DMA3_BASE + N32_DMA_CH_OFFSET(3), + }, + + { + .ctrl = DMA3, + .chan = 4, + .irq = N32_IRQ_DMA3_CHANNEL4, + .base = N32_DMA3_BASE + N32_DMA_CH_OFFSET(4), + }, + + { + .ctrl = DMA3, + .chan = 5, + .irq = N32_IRQ_DMA3_CHANNEL5, + .base = N32_DMA3_BASE + N32_DMA_CH_OFFSET(5), + }, + + { + .ctrl = DMA3, + .chan = 6, + .irq = N32_IRQ_DMA3_CHANNEL6, + .base = N32_DMA3_BASE + N32_DMA_CH_OFFSET(6), + }, + + { + .ctrl = DMA3, + .chan = 7, + .irq = N32_IRQ_DMA3_CHANNEL7, + .base = N32_DMA3_BASE + N32_DMA_CH_OFFSET(7), + }, +#endif +}; + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * DMA register access functions + ****************************************************************************/ + +/**************************************************************************** + * Name: dmachan_getbase + * + * Description: + * Get base DMA address for dmachan + * + ****************************************************************************/ + +static uint32_t dmachan_getbase(DMA_CHANNEL dmachan) +{ + uint8_t controller = dmachan->ctrl; + + return g_dma[controller].base; +} + +/**************************************************************************** + * Name: dmabase_getreg + * + * Description: + * Get non-channel register from DMA controller + * + ****************************************************************************/ + +static uint32_t dmabase_getreg(DMA_CHANNEL dmachan, uint32_t offset) +{ + uint32_t dmabase = dmachan_getbase(dmachan); + + return getreg32(dmabase + offset); +} + +/**************************************************************************** + * Name: dmabase_putreg + * + * Description: + * Write to non-channel register in DMA controller + * + ****************************************************************************/ + +static void dmabase_putreg(DMA_CHANNEL dmachan, uint32_t offset, + uint32_t value) +{ + uint32_t dmabase = dmachan_getbase(dmachan); + + putreg32(value, dmabase + offset); +} + +/**************************************************************************** + * Name: dmachan_getreg + * + * Description: + * Get channel register. + * + ****************************************************************************/ + +static uint32_t dmachan_getreg(DMA_CHANNEL dmachan, uint32_t offset) +{ + return getreg32(dmachan->base + offset); +} + +/**************************************************************************** + * Name: dmachan_putreg + * + * Description: + * Write to channel register. + * + ****************************************************************************/ + +static void dmachan_putreg(DMA_CHANNEL dmachan, uint32_t offset, + uint32_t value) +{ + putreg32(value, dmachan->base + offset); +} + +/**************************************************************************** + * Name: dmamux_getreg + * + * Description: + * Write to DMAMUX + * + ****************************************************************************/ + +static void dmamux_putreg(DMA_MUX dmamux, uint32_t offset, uint32_t value) +{ + putreg32(value, dmamux->base + offset); +} + +/**************************************************************************** + * Name: dmamux_getreg + * + * Description: + * Get DMAMUX register. + * + ****************************************************************************/ + +#ifdef CONFIG_DEBUG_DMA_INFO +static uint32_t dmamux_getreg(DMA_MUX dmamux, uint32_t offset) +{ + return getreg32(dmamux->base + offset); +} +#endif + +/**************************************************************************** + * Name: n32_dma_channel_get + * + * Description: + * Get the g_dmach table entry associated with a given DMA controller + * and channel number. + * + ****************************************************************************/ + +static DMA_CHANNEL n32_dma_channel_get(uint8_t channel, uint8_t controller) +{ + uint8_t first = 0; + uint8_t nchan = 0; + + /* Get limits for g_dma array */ + + n32_gdma_limits_get(controller, &first, &nchan); + + DEBUGASSERT(channel <= nchan); + + return &g_dmach[first + channel]; +} + +/**************************************************************************** + * Name: n32_gdma_limits_get + * + * Description: + * Get g_dma array limits for a given DMA controller. + * + ****************************************************************************/ + +static void n32_gdma_limits_get(uint8_t controller, uint8_t *first, + uint8_t *nchan) +{ + DEBUGASSERT(first != NULL); + DEBUGASSERT(nchan != NULL); + + DEBUGASSERT(controller >= MDMA && controller <= DMA3); + + *first = g_dma[controller].first; + *nchan = g_dma[controller].nchan; +} + +/**************************************************************************** + * Master DMA functions + ****************************************************************************/ + +#ifdef CONFIG_N32H7_MDMA + +/**************************************************************************** + * Name: n32_mdma_disable + * + * Description: + * Disable the master DMA + * + ****************************************************************************/ + +static void n32_mdma_disable(DMA_CHANNEL dmachan) +{ + uint8_t controller = dmachan->ctrl; + + DEBUGASSERT(controller == MDMA); + +#warning n32_mdma_disable +} + +/**************************************************************************** + * Name: n32_mdma_interrupt + * + * Description: + * Master DMA interrupt handler + * + ****************************************************************************/ + +static int n32_mdma_interrupt(int irq, void *context, void *arg) +{ +#warning n32_mdma_interrupt +} + +/**************************************************************************** + * Name: n32_mdma_setup + * + * Description: + * Configure master DMA before using + * + ****************************************************************************/ + +static void n32_mdma_setup(DMA_HANDLE handle, n32_dmacfg_t *cfg) +{ + DMA_CHANNEL dmachan = (DMA_CHANNEL)handle; + uint8_t controller = dmachan->ctrl; + + DEBUGASSERT(controller == MDMA); + +#warning n32_mdma_setup not implemented +} + +/**************************************************************************** + * Name: n32_mdma_start + * + * Description: + * Start the master DMA transfer + ****************************************************************************/ + +static void n32_mdma_start(DMA_HANDLE handle, dma_callback_t callback, + void *arg) +{ + DMA_CHANNEL dmachan = (DMA_CHANNEL)handle; + uint8_t controller = dmachan->ctrl; + + DEBUGASSERT(controller == MDMA); + +#warning n32_mdma_start not implemented +} + +/**************************************************************************** + * Name: n32_mdma_residual + ****************************************************************************/ + +static size_t n32_mdma_residual(DMA_HANDLE handle) +{ + DMA_CHANNEL dmachan = (DMA_CHANNEL)handle; + uint8_t controller = dmachan->ctrl; + uint32_t residual = 0; + + DEBUGASSERT(controller == MDMA); + + /* REVISIT */ + + /* Fetch the count of blocks remaining to be transferred */ + + residual = dmachan_getreg(dmachan, N32_MDMACH_CBNDTR_OFFSET); + + return (size_t)(residual & MDMA_CBNDTR_BNDT_MASK); +} + +/**************************************************************************** + * Name: n32_mdma_capable + ****************************************************************************/ + +#ifdef CONFIG_N32H7_DMACAPABLE +static bool n32_mdma_capable(n32_dmacfg_t *cfg) +{ + uint32_t transfer_size; + uint32_t mend; + uint32_t ccr = cfg->cfg1; + uint32_t ctcr = cfg->cfg2; + + dmainfo("0x%08" PRIx32 "/%" PRIu32 " 0x%08" PRIx32 " 0x%08" PRIx32 "\n", + cfg->maddr, cfg->ndata, ccr, ctcr); + +#warning n32_mdma_capable not implemented + + return true; +} +#endif + +/**************************************************************************** + * Name: n32_mdma_dump + ****************************************************************************/ + +#ifdef CONFIG_DEBUG_DMA_INFO +static void n32_mdma_dump(DMA_HANDLE handle, const char *msg) +{ + DMA_CHANNEL dmachan = (DMA_CHANNEL)handle; + uint8_t controller = dmachan->ctrl; + + DEBUGASSERT(controller == MDMA); + + dmainfo(" CISR: %08" PRIx32 "\n", + dmachan_getreg(dmachan, N32_MDMACH_CISR_OFFSET)); + dmainfo(" CESR: %08" PRIx32 "\n", + dmachan_getreg(dmachan, N32_MDMACH_CESR_OFFSET)); + dmainfo(" CCR: %08" PRIx32 "\n", + dmachan_getreg(dmachan, N32_MDMACH_CCR_OFFSET)); + dmainfo(" CTCR: %08" PRIx32 "\n", + dmachan_getreg(dmachan, N32_MDMACH_CTCR_OFFSET)); + dmainfo(" CBNDTR: %08" PRIx32 "\n", + dmachan_getreg(dmachan, N32_MDMACH_CBNDTR_OFFSET)); + dmainfo(" CSAR: %08" PRIx32 "\n", + dmachan_getreg(dmachan, N32_MDMACH_CSAR_OFFSET)); + dmainfo(" CDAR: %08" PRIx32 "\n", + dmachan_getreg(dmachan, N32_MDMACH_CDAR_OFFSET)); + dmainfo(" CBRUR: %08" PRIx32 "\n", + dmachan_getreg(dmachan, N32_MDMACH_CBRUR_OFFSET)); + dmainfo(" CLAR: %08" PRIx32 "\n", + dmachan_getreg(dmachan, N32_MDMACH_CLAR_OFFSET)); + dmainfo(" CTBR: %08" PRIx32 "\n", + dmachan_getreg(dmachan, N32_MDMACH_CTBR_OFFSET)); + dmainfo(" CMAR: %08" PRIx32 "\n", + dmachan_getreg(dmachan, N32_MDMACH_CMAR_OFFSET)); + dmainfo(" CMDR: %08" PRIx32 "\n", + dmachan_getreg(dmachan, N32_MDMACH_CMDR_OFFSET)); +} +#endif + +#endif /* CONFIG_N32H7_MDMA */ + +/**************************************************************************** + * Standard DMA functions + ****************************************************************************/ + +#if defined(CONFIG_N32H7_DMA1) || defined(CONFIG_N32H7_DMA2) || defined(CONFIG_N32H7_DMA3) + +/**************************************************************************** + * Name: n32_sdma_disable + * + * Description: + * Disable standard DMA chanel (DMA1/DMA2) + * + ****************************************************************************/ + +static void n32_sdma_disable(DMA_CHANNEL dmachan) +{ + uint32_t regval = 0; + uint8_t chanel = 0; + + DEBUGASSERT(dmachan->ctrl == DMA1 || + dmachan->ctrl == DMA2 || + dmachan->ctrl == DMA3); + + /* Get DMA chanel */ + + chanel = dmachan->chan; + + DEBUGASSERT(chanel < 8); + + /* Disable the DMA chanel */ + + /* Set chanel enable bit writable */ + + regval = dmabase_getreg(dmachan, N32_DMA_CHEN_OFFSET); + regval |= DMA_CHEN_CHWEN(chanel); + + /* Clear chanel enable bit */ + + regval &= ~DMA_CHEN_CH(chanel); + dmabase_putreg(dmachan, N32_DMA_CHEN_OFFSET, regval); + + while (dmachan_getreg(dmachan, N32_DMA_CHEN_OFFSET) & + DMA_CHEN_CH(chanel)); + + /* Clear pending chanel interrupts */ + + regval = DMA_INT_CH(chanel); + dmabase_putreg(dmachan, N32_DMA_TCINTCLR_OFFSET, regval); + regval = DMA_INT_CH(chanel); + dmabase_putreg(dmachan, N32_DMA_BTCINTCLR_OFFSET, regval); + regval = DMA_INT_CH(chanel); + dmabase_putreg(dmachan, N32_DMA_STCINTCLR_OFFSET, regval); + regval = DMA_INT_CH(chanel); + dmabase_putreg(dmachan, N32_DMA_DTCINTCLR_OFFSET, regval); + regval = DMA_INT_CH(chanel); + dmabase_putreg(dmachan, N32_DMA_ERRINTCLR_OFFSET, regval); + + /* Disable all interrupts at the DMA controller */ + + regval = dmachan_getreg(dmachan, N32_DMA_CH_CTRL_OFFSET); + regval &= ~DMA_CHCTRL_INTEN; + dmachan_putreg(dmachan, N32_DMA_CH_CTRL_OFFSET, regval); +} + +/**************************************************************************** + * Name: n32_sdma_interrupt + * + * Description: + * Standard DMA interrupt handler + * + ****************************************************************************/ + +static int n32_sdma_interrupt(int irq, void *context, void *arg) +{ + DMA_CHANNEL dmachan = NULL; + uint32_t status = 0; + uint32_t regval = 0; + uint8_t chanel = 0; + uint8_t controller = 0; + + /* Get the chanel and the controller that generated the interrupt */ + +#ifdef CONFIG_N32H7_DMA1 + if (irq >= N32_IRQ_DMA1_CHANNEL0 && irq <= N32_IRQ_DMA1_CHANNEL7) + { + chanel = irq - N32_IRQ_DMA1_CHANNEL0; + controller = DMA1; + } + else +#endif +#ifdef CONFIG_N32H7_DMA2 + if (irq >= N32_IRQ_DMA2_CHANNEL0 && irq <= N32_IRQ_DMA2_CHANNEL7) + { + chanel = irq - N32_IRQ_DMA2_CHANNEL0; + controller = DMA2; + } + else +#endif +#ifdef CONFIG_N32H7_DMA3 + if (irq >= N32_IRQ_DMA3_CHANNEL0 && irq <= N32_IRQ_DMA3_CHANNEL7) + { + chanel = irq - N32_IRQ_DMA3_CHANNEL0; + controller = DMA3; + } + else +#endif + { + DEBUGPANIC(); + } + + /* Get the channel structure from the chanel and controller numbers */ + + dmachan = n32_dma_channel_get(chanel, controller); + + /* Get the interrupt status for this chanel */ + + status = (((dmabase_getreg(dmachan, N32_DMA_TCINTSTS_OFFSET) & + DMA_INT_CH(chanel)) >> chanel) << 0) | + (((dmabase_getreg(dmachan, N32_DMA_BTCINTSTS_OFFSET) & + DMA_INT_CH(chanel)) >> chanel) << 1) | + (((dmabase_getreg(dmachan, N32_DMA_STCINTSTS_OFFSET) & + DMA_INT_CH(chanel)) >> chanel) << 2) | + (((dmabase_getreg(dmachan, N32_DMA_DTCINTSTS_OFFSET) & + DMA_INT_CH(chanel)) >> chanel) << 3) | + (((dmabase_getreg(dmachan, N32_DMA_ERRINTSTS_OFFSET) & + DMA_INT_CH(chanel)) >> chanel) << 4); + + /* Clear fetched chanel interrupts */ + + regval = DMA_INT_CH(chanel); + dmabase_putreg(dmachan, N32_DMA_TCINTCLR_OFFSET, regval); + regval = DMA_INT_CH(chanel); + dmabase_putreg(dmachan, N32_DMA_BTCINTCLR_OFFSET, regval); + regval = DMA_INT_CH(chanel); + dmabase_putreg(dmachan, N32_DMA_STCINTCLR_OFFSET, regval); + regval = DMA_INT_CH(chanel); + dmabase_putreg(dmachan, N32_DMA_DTCINTCLR_OFFSET, regval); + regval = DMA_INT_CH(chanel); + dmabase_putreg(dmachan, N32_DMA_ERRINTCLR_OFFSET, regval); + + /* Invoke the callback */ + + if (dmachan->callback) + { + dmachan->callback(dmachan, status, dmachan->arg); + } + + return OK; +} + +/**************************************************************************** + * Name: n32_sdma_setup + * + * Description: + * Configure standard DMA before using + * + ****************************************************************************/ + +static void n32_sdma_setup(DMA_HANDLE handle, n32_dmacfg_t *cfg) +{ + DMA_CHANNEL dmachan = (DMA_CHANNEL)handle; + uint8_t ch = dmachan->chan; + uint32_t reg; + + /* Disable channel if active, wait until stopped */ + + if (dmabase_getreg(dmachan, N32_DMA_CHEN_OFFSET) & DMA_CHEN_CH(ch)) + { + reg = dmabase_getreg(dmachan, N32_DMA_CHEN_OFFSET); + reg |= DMA_CHEN_CHWEN(ch); + reg &= ~DMA_CHEN_CH(ch); + dmabase_putreg(dmachan, N32_DMA_CHEN_OFFSET, reg); + + int timeout = 100; + + while (timeout-- && (dmabase_getreg(dmachan, N32_DMA_CHEN_OFFSET) & + DMA_CHEN_CH(ch))) + { + up_udelay(1); + } + + DEBUGASSERT((dmabase_getreg(dmachan, N32_DMA_CHEN_OFFSET) & + DMA_CHEN_CH(ch)) == 0); + } + + /* Clear all pending interrupts */ + + uint32_t clr = DMA_INT_CH(ch); + + dmabase_putreg(dmachan, N32_DMA_TCINTCLR_OFFSET, clr); + dmabase_putreg(dmachan, N32_DMA_BTCINTCLR_OFFSET, clr); + dmabase_putreg(dmachan, N32_DMA_STCINTCLR_OFFSET, clr); + dmabase_putreg(dmachan, N32_DMA_DTCINTCLR_OFFSET, clr); + dmabase_putreg(dmachan, N32_DMA_ERRINTCLR_OFFSET, clr); + + /* Set address and linked-list registers */ + + dmachan_putreg(dmachan, N32_DMA_CH_SA_OFFSET, cfg->src_addr); + dmachan_putreg(dmachan, N32_DMA_CH_DA_OFFSET, cfg->dst_addr); + dmachan_putreg(dmachan, N32_DMA_CH_LLP_OFFSET, (uint32_t) + (uintptr_t)cfg->link_list); + + /* Write control register (merge block_size into BTS field) */ + + uint64_t full_ctrl = cfg->ctrl; + + full_ctrl &= ~DMA_CHCTRL_BTS_MASK; + full_ctrl |= DMA_CHCTRL_BTS((uint64_t)cfg->block_size & 0xfffull); + dmachan_putreg(dmachan, N32_DMA_CH_CTRL_OFFSET, + (uint32_t)full_ctrl); + dmachan_putreg(dmachan, N32_DMA_CH_CTRL_OFFSET + 4, + (uint32_t)(full_ctrl >> 32)); + + /* Optional SG/DS registers */ + + if (cfg->sg_cfg) + { + dmachan_putreg(dmachan, N32_DMA_CH_SG_OFFSET, + cfg->sg_cfg); + } + + if (cfg->ds_cfg) + { + dmachan_putreg(dmachan, N32_DMA_CH_DS_OFFSET, + cfg->ds_cfg); + } + + /* Configure CH_CFG: handshake interfaces, priority, and HSSEL bits */ + + uint32_t cfg_low = dmachan_getreg(dmachan, N32_DMA_CH_CFG_OFFSET); + uint32_t cfg_high = dmachan_getreg(dmachan, N32_DMA_CH_CFG_OFFSET + 4); + + cfg_high &= ~(DMA_CHCFG_SRCPER_MASK >> 32); + cfg_high &= ~(DMA_CHCFG_DSTPER_MASK >> 32); + cfg_high |= ((uint64_t)(cfg->src_hs_if & 0x7) << + (DMA_CHCFG_SRCPER_SHIFT - 32)); + cfg_high |= ((uint64_t)(cfg->dst_hs_if & 0x7) << + (DMA_CHCFG_DSTPER_SHIFT - 32)); + + cfg_low &= ~(DMA_CHCFG_HSSELSRC | DMA_CHCFG_HSSELDST | + DMA_CHCFG_CHPRIOR_MASK); + + if (cfg->src_hs_mode == 1) + { + cfg_low |= DMA_CHCFG_HSSELSRC; + } + + if (cfg->dst_hs_mode == 1) + { + cfg_low |= DMA_CHCFG_HSSELDST; + } + + cfg_low |= ((cfg->priority & 0x7) << DMA_CHCFG_CHPRIOR_SHIFT); + + dmachan_putreg(dmachan, N32_DMA_CH_CFG_OFFSET, cfg_low); + dmachan_putreg(dmachan, N32_DMA_CH_CFG_OFFSET + 4, cfg_high); +} + +/**************************************************************************** + * Name: n32_sdma_start + * + * Description: + * Start the standard DMA transfer + ****************************************************************************/ + +static void n32_sdma_start(DMA_HANDLE handle, dma_callback_t callback, + void *arg) +{ + DMA_CHANNEL dmachan = (DMA_CHANNEL)handle; + uint32_t regval = 0; + + DEBUGASSERT(handle != NULL); + DEBUGASSERT(dmachan->ctrl == DMA1 || dmachan->ctrl == DMA2); + + /* Save the callback info. This will be invoked when the DMA completes */ + + dmachan->callback = callback; + dmachan->arg = arg; + + /* UnMask TFC and ERR interrupt */ + + regval = DMA_CHEN_CHWEN(dmachan->chan) | DMA_CHEN_CH(dmachan->chan); + dmabase_putreg(dmachan, N32_DMA_TCINTMSK_OFFSET, regval); + dmabase_putreg(dmachan, N32_DMA_ERRINTMSK_OFFSET, regval); + dmabase_putreg(dmachan, N32_DMA_BTCINTMSK_OFFSET, regval); + dmabase_putreg(dmachan, N32_DMA_STCINTMSK_OFFSET, regval); + dmabase_putreg(dmachan, N32_DMA_DTCINTMSK_OFFSET, regval); + + /* Enable all interrupts at the DMA controller */ + + regval = dmachan_getreg(dmachan, N32_DMA_CH_CTRL_OFFSET); + regval |= DMA_CHCTRL_INTEN; + dmachan_putreg(dmachan, N32_DMA_CH_CTRL_OFFSET, regval); + + /* Set chanel enable bit writable */ + + regval = dmabase_getreg(dmachan, N32_DMA_CHEN_OFFSET); + regval |= DMA_CHEN_CHWEN(dmachan->chan); + + /* Set chanel enable bit */ + + regval |= DMA_CHEN_CH(dmachan->chan); + dmabase_putreg(dmachan, N32_DMA_CHEN_OFFSET, regval); + + n32_dmadump(handle, "DMA after start"); +} + +/**************************************************************************** + * Name: n32_sdma_residual + ****************************************************************************/ + +static size_t n32_sdma_residual(DMA_HANDLE handle) +{ + DMA_CHANNEL dmachan = (DMA_CHANNEL)handle; + uint32_t residual = 0; + + DEBUGASSERT(dmachan->ctrl == DMA1 || dmachan->ctrl == DMA2); + + /* Fetch the count of bytes remaining to be transferred. + * + * If the FIFO is enabled, this count may be inaccurate. ST don't + * appear to document whether this counts the peripheral or the memory + * side of the channel, and they don't make the memory pointer + * available either. + * + * For reception in circular mode the FIFO is disabled in order that + * this value can be useful. + */ + + residual = dmachan_getreg(dmachan, N32_DMA_CH_SG_OFFSET); + + return (size_t)((residual & DMA_SG_SGC_MASK) >> DMA_SG_SGC_SHIFT); +} + +/**************************************************************************** + * Name: n32_sdma_capable + ****************************************************************************/ + +#ifdef CONFIG_N32H7_DMACAPABLE +static bool n32_sdma_capable(n32_dmacfg_t *cfg) +{ + uint32_t transfer_size; + uint32_t burst_length; + uint32_t mend; + uint32_t ccr = cfg->cfg1; + + dmainfo("0x%08" PRIx32 "/%" PRIu32 " 0x%08" PRIx32 "\n", + cfg->maddr, cfg->ndata, cfg->cfg1); + + /* Verify that the address conforms to the memory transfer size. + * Transfers to/from memory performed by the DMA controller are + * required to be aligned to their size. + * + * See ST RM0410 DocID028270 Rev 2, section 8.3.11 Single and burst + * transfers + * + * Compute mend inline to avoid a possible non-constant integer + * multiply. + */ + + switch (ccr & DMA_SCR_MSIZE_MASK) + { + case DMA_SCR_MSIZE_8BITS: + { + transfer_size = 1; + mend = cfg->maddr + cfg->ndata - 1; + break; + } + + case DMA_SCR_MSIZE_16BITS: + { + transfer_size = 2; + mend = cfg->maddr + (cfg->ndata << 1) - 1; + break; + } + + case DMA_SCR_MSIZE_32BITS: + { + transfer_size = 4; + mend = cfg->maddr + (cfg->ndata << 2) - 1; + break; + } + + default: + { + dmainfo("n32_dmacapable: bad transfer size in CCR\n"); + return false; + } + } + + if ((cfg->maddr & (transfer_size - 1)) != 0) + { + dmainfo("n32_dmacapable: transfer unaligned\n"); + return false; + } + +# if defined(CONFIG_ARMV7M_DCACHE) && \ + !defined(CONFIG_ARMV7M_DCACHE_WRITETHROUGH) + /* buffer alignment is required for RX DMA transfers with dcache in + * buffered mode (not write-through) because arch_invalidate_dcache could + * lose buffered writes + */ + + if ((ccr & DMA_SCR_DIR_MASK) == DMA_SCR_DIR_P2M || + (ccr & DMA_SCR_DIR_MASK) == DMA_SCR_DIR_M2M) + { + if ((cfg->maddr & (ARMV7M_DCACHE_LINESIZE - 1)) != 0 || + ((mend + 1) & (ARMV7M_DCACHE_LINESIZE - 1)) != 0) + { + dmainfo("n32_dmacapable: dcache unaligned " + "maddr:0x%08" PRIx32 " mend:0x%08" PRIx32 "\n", + cfg->maddr, mend); +#if !defined(CONFIG_N32H7_DMACAPABLE_ASSUME_CACHE_ALIGNED) + return false; +#endif + } + } +# endif + + /* Verify that burst transfers do not cross a 1KiB boundary. */ + + if ((cfg->maddr / 1024) != (mend / 1024)) + { + /* The transfer as a whole crosses a 1KiB boundary. + * Verify that no burst does by asserting that the address + * is aligned to the burst length. + */ + + switch (ccr & DMA_SCR_MBURST_MASK) + { + case DMA_SCR_MBURST_SINGLE: + { + burst_length = transfer_size; + break; + } + + case DMA_SCR_MBURST_INCR4: + { + burst_length = transfer_size << 2; + break; + } + + case DMA_SCR_MBURST_INCR8: + { + burst_length = transfer_size << 3; + break; + } + + case DMA_SCR_MBURST_INCR16: + { + burst_length = transfer_size << 4; + break; + } + + default: + { + dmainfo("n32_dmacapable: bad burst size in CCR\n"); + return false; + } + } + + if ((cfg->maddr & (burst_length - 1)) != 0) + { + dmainfo("n32_dmacapable: burst crosses 1KiB\n"); + return false; + } + } + + /* Verify that transfer is froma a supported memory region */ + + if ((cfg->paddr & N32_PREGION_MASK) != N32_D2_BASE) + { + /* DMA1/DMA2 support only D2 domain */ + + dmainfo("transfer from unknown/unsupported region\n"); + return false; + } + + /* Verify that the transfer is to a memory region that supports DMA. */ + + if ((cfg->maddr & N32_REGION_MASK) != (mend & N32_REGION_MASK)) + { + dmainfo("n32_dmacapable: transfer crosses memory region\n"); + return false; + } + + switch (cfg->maddr & N32_REGION_MASK) + { + case N32_AXISRAM_BASE: + case N32_FMC_BANK1: + case N32_FMC_BANK2: + case N32_FMC_BANK3: + case N32_FMC_BANK4: + case N32_FMC_BANK5: + case N32_FMC_BANK6: + { + /* All RAM and FMC is supported */ + + break; + } + + case N32_SRAM_BASE: + { + /* DTCM not supported for standard DMA (DMA1/DMA2) */ + + if (cfg->maddr >= N32_DTCRAM_BASE + && (cfg->maddr - N32_DTCRAM_BASE) < 0x1ffff) + { + dmainfo("transfer targets DTCRAM\n"); + return false; + } + break; + } + + case N32_CODE_BASE: + { + /* ITCM not supported for standard DMA (DMA1/DMA2) */ + + if (cfg->maddr >= N32_ITCM_BASE + && (cfg->maddr - N32_ITCM_BASE) < 0xffff) + { + dmainfo("transfer targets ITCM RAM\n"); + return false; + } + break; + } + + default: + { + /* Everything else is unsupported by DMA */ + + dmainfo("transfer targets unknown/unsupported region\n"); + return false; + } + } + + dmainfo("transfer OK\n"); + return true; +} +#endif + +/**************************************************************************** + * Name: n32_sdma_dump + ****************************************************************************/ + +#ifdef CONFIG_DEBUG_DMA_INFO +static void n32_sdma_dump(DMA_HANDLE handle, const char *msg) +{ + DMA_CHANNEL dmachan = (DMA_CHANNEL)handle; + + DEBUGASSERT(dmachan->ctrl == DMA1 || dmachan->ctrl == DMA2); + + dmainfo(" LISR: %08" PRIx32 "\n", + dmabase_getreg(dmachan, N32_DMA_LISR_OFFSET)); + dmainfo(" HISR: %08" PRIx32 "\n", + dmabase_getreg(dmachan, N32_DMA_HISR_OFFSET)); + dmainfo(" SCR: %08" PRIx32 "\n", + dmachan_getreg(dmachan, N32_DMA_SCR_OFFSET)); + dmainfo(" SNDTR: %08" PRIx32 "\n", + dmachan_getreg(dmachan, N32_DMA_SNDTR_OFFSET)); + dmainfo(" SPAR: %08" PRIx32 "\n", + dmachan_getreg(dmachan, N32_DMA_SPAR_OFFSET)); + dmainfo(" SM0AR: %08" PRIx32 "\n", + dmachan_getreg(dmachan, N32_DMA_SM0AR_OFFSET)); + dmainfo(" SM1AR: %08" PRIx32 "\n", + dmachan_getreg(dmachan, N32_DMA_SM1AR_OFFSET)); + dmainfo(" SFCR: %08" PRIx32 "\n", + dmachan_getreg(dmachan, N32_DMA_SFCR_OFFSET)); + + n32_dmamux_dump(g_dma[dmachan->ctrl].dmamux, + dmachan->chan + g_dma[dmachan->ctrl].dmamux_offset); +} +#endif + +#endif /* CONFIG_N32H7_DMA1 || CONFIG_N32H7_DMA2 || CONFIG_N32H7_DMA3 */ + +/**************************************************************************** + * Name: n32_dmainitialize + * + * Description: + * Initialize the DMA subsystem (DMA1, DMA2, MDMA and DMA3) + * + * Returned Value: + * None + * + ****************************************************************************/ + +void arm_dma_initialize(void) +{ + DMA_CHANNEL dmachan = NULL; + uint8_t controller = 0; + int channel = 0; + + dmainfo("Initialize DMA\n"); + + /* Initialize DMA channels */ + + for (channel = 0; channel < DMA_NCHANNELS; channel++) + { + dmachan = &g_dmach[channel]; + + /* Initialize flag */ + + dmachan->used = false; + + /* Get DMA controller associated with channel */ + + controller = dmachan->ctrl; + + DEBUGASSERT(controller >= MDMA && controller <= DMA3); + + /* Attach standard DMA interrupt vectors */ + + irq_attach(dmachan->irq, g_dma_ops[controller].dma_interrupt, + dmachan); + + /* Disable the DMA stream */ + + g_dma_ops[controller].dma_disable(dmachan); + + /* Enable the IRQ at the NVIC (still disabled at the DMA controller) */ + + up_enable_irq(dmachan->irq); + + /* Set the interrupt priority */ + +#ifdef CONFIG_ARCH_IRQPRIO + switch (controller) + { +#if defined(CONFIG_N32H7_DMA1) || defined(CONFIG_N32H7_DMA2) || defined(CONFIG_N32H7_DMA3) + case DMA1: + case DMA2: + case DMA3: + { + up_prioritize_irq(dmachan->irq, CONFIG_DMA_PRI); + break; + } +#endif /* CONFIG_N32H7_DMA1 && CONFIG_N32H7_DMA2 */ + +#ifdef CONFIG_N32H7_MDMA + case MDMA: + { + up_prioritize_irq(dmachan->irq, CONFIG_MDMA_PRI); + break; + } +#endif /* CONFIG_N32H7_MDMA */ + + default: + { + PANIC(); + break; + } + } +#endif + } +} + +/**************************************************************************** + * Name: n32_dmachannel + * + * Description: + * Allocate a DMA channel. This function gives the caller mutually + * exclusive access to the DMA channel specified by the 'dmamap' argument. + * It is common for standard DMA (DMA1, DMA2), master DMA (MDMA) and + * basic DMA (BDMA) controllers. + * + * Input Parameters: + * dmamap - Identifies the stream/channel resource. For the N32 H7, this + * is a bit-encoded value as provided by the DMAMAP_* definitions + * in chip/n32h7xxxxxxx_dmamux.h + * + * Returned Value: + * On success, this function returns a non-NULL, void* DMA channel handle. + * NULL is returned on any failure. This function can fail only if no DMA + * channel is available. + * + * Assumptions: + * - The caller does not hold he DMA channel. + * - The caller can wait for the DMA channel to be freed if it is no + * available. + * + ****************************************************************************/ + +DMA_HANDLE n32_dmachannel(unsigned int dmamap) +{ + DMA_CHANNEL dmachan = NULL; + DMA_MUX dmamux = NULL; + irqstate_t flags; + uint8_t controller = 0; + uint8_t dmamux_req = 0; + uint32_t regval = 0; + uint8_t first = 0; + uint8_t nchan = 0; + int item = -1; + int i = 0; + + /* Get DMA controller from encoded DMAMAP value */ + + controller = DMAMAP_CONTROLLER(dmamap); + DEBUGASSERT(controller >= MDMA && controller <= DMA3); + + /* Get DMAMUX channel from encoded DMAMAP value */ + + dmamux_req = DMAMAP_REQUEST(dmamap); + + /* Get g_dma array limits for given controller */ + + n32_gdma_limits_get(controller, &first, &nchan); + + /* Find available channel for given controller */ + + flags = enter_critical_section(); + for (i = first; i < first + nchan; i += 1) + { + if (g_dmach[i].used == false) + { + item = i; + g_dmach[i].used = true; + break; + } + } + + leave_critical_section(flags); + + dmainfo("ctrl=%" PRIu8 " item=%d\n", controller, item); + + if (item == -1) + { + dmainfo("No available DMA chan for CTRL=%" PRIu8 "\n", + controller); + + /* No available channel */ + + goto errout; + } + + /* Assign DMA item */ + + dmachan = &g_dmach[item]; + + dmainfo("Get g_dmach[%d] CTRL=%" PRIu8 " CH=%" PRIu8 "\n", + i, controller, dmachan->chan); + + /* Be sure that we have proper DMA controller */ + + DEBUGASSERT(dmachan->ctrl == controller); + + /* Get DMAMUX associated with DMA controller */ + + dmamux = g_dma[controller].dmamux; + + /* No DMAMUX for Master DMA */ + + if (dmamux != NULL) + { + uint8_t dmamux_chan = dmachan->chan + g_dma[controller].dmamux_offset; + + dmainfo("Get DMAMUX%" PRIu8 " CH %" PRIu8 "\n", + dmamux->id, dmamux_chan); + + /* DMAMUX Set DMA channel source */ + + regval = dmamux_req << DMAMUX_CXCR_REQID_SHIFT; + dmamux_putreg(dmamux, N32_DMAMUX_CXCR_OFFSET(dmamux_chan), regval); + + /* DMAMUX Set RGCR register */ + + regval = 0; + dmamux_putreg(dmamux, N32_DMAMUX_RGXCR_OFFSET(dmamux_chan), regval); + } + +errout: + return (DMA_HANDLE)dmachan; +} + +/**************************************************************************** + * Name: n32_dmafree + * + * Description: + * Release a DMA channel and unmap DMAMUX if required. + * + * NOTE: The 'handle' used in this argument must NEVER be used again + * until n32_dmachannel() is called again to re-gain access to the + * channel + * + * Returned Value: + * None + * + * Assumptions: + * - The caller holds the DMA channel. + * - There is no DMA in progress + * + ****************************************************************************/ + +void n32_dmafree(DMA_HANDLE handle) +{ + DMA_CHANNEL dmachan = (DMA_CHANNEL)handle; + uint8_t controller = dmachan->ctrl; + DMA_MUX dmamux = NULL; + irqstate_t flags; + + DEBUGASSERT(handle != NULL); + + /* Get DMA controller */ + + controller = dmachan->ctrl; + DEBUGASSERT(controller >= MDMA && controller <= DMA3); + + /* Get DMAMUX associated with DMA controller */ + + dmamux = g_dma[controller].dmamux; + + /* No DMAMUX for Master DMA */ + + if (dmamux != NULL) + { + uint8_t dmamux_chan = dmachan->chan + g_dma[controller].dmamux_offset; + + dmainfo("Free DMAMUX%" PRIu8 " CH %" PRIu8 "\n", + dmamux->id, dmamux_chan); + + /* Clear DMAMUX CCR register associated with channel */ + + dmamux_putreg(dmamux, N32_DMAMUX_CXCR_OFFSET(dmamux_chan), 0); + + /* Clear DMAMUX RGCR register associated with channel */ + + dmamux_putreg(dmamux, N32_DMAMUX_RGXCR_OFFSET(dmamux_chan), 0); + } + + /* Release the channel */ + + flags = enter_critical_section(); + dmachan->used = false; + leave_critical_section(flags); + + dmainfo("Unmapping DMAMUX(%" PRIu8 ")\n", dmachan->chan); +} + +/**************************************************************************** + * Name: n32_dmasetup + * + * Description: + * Configure DMA before using + * + ****************************************************************************/ + +void n32_dmasetup(DMA_HANDLE handle, n32_dmacfg_t *cfg) +{ + DMA_CHANNEL dmachan = (DMA_CHANNEL)handle; + uint8_t controller = dmachan->ctrl; + + /* Get DMA controller */ + + DEBUGASSERT(controller >= MDMA && controller <= DMA3); + + g_dma_ops[controller].dma_setup(handle, cfg); +} + +/**************************************************************************** + * Name: n32_dmastart + * + * Description: + * Start the DMA transfer + * + * Assumptions: + * - DMA handle allocated by n32_dmachannel() + * - No DMA in progress + * + ****************************************************************************/ + +void n32_dmastart(DMA_HANDLE handle, dma_callback_t callback, void *arg) +{ + DMA_CHANNEL dmachan = (DMA_CHANNEL)handle; + uint8_t controller = dmachan->ctrl; + + DEBUGASSERT(controller >= MDMA && controller <= DMA3); + + g_dma_ops[controller].dma_start(handle, callback, arg); +} + +/**************************************************************************** + * Name: n32_dmastop + * + * Description: + * Cancel the DMA. After n32_dmastop() is called, the DMA channel is + * reset and n32_dmasetup() must be called before n32_dmastart() can be + * called again + * + * Assumptions: + * - DMA handle allocated by n32_dmachannel() + * + ****************************************************************************/ + +void n32_dmastop(DMA_HANDLE handle) +{ + DMA_CHANNEL dmachan = (DMA_CHANNEL)handle; + uint8_t controller = dmachan->ctrl; + + DEBUGASSERT(controller >= MDMA && controller <= DMA3); + + g_dma_ops[controller].dma_disable(dmachan); +} + +/**************************************************************************** + * Name: n32_getchanel + * + * Description: + * Read the DMA bytes-remaining register. + * + * Assumptions: + * - DMA handle allocated by n32_dmachannel() + * + ****************************************************************************/ + +size_t n32_getchanel(DMA_HANDLE handle) +{ + DMA_CHANNEL dmachan = (DMA_CHANNEL)handle; + + return dmachan->chan; +} + +uint32_t n32_dmaptr_src(DMA_HANDLE handle) +{ + DMA_CHANNEL dmachan = (DMA_CHANNEL)handle; + + return dmachan_getreg(dmachan, N32_DMA_CH_SA_OFFSET); +} + +uint32_t n32_dmaptr_dst(DMA_HANDLE handle) +{ + DMA_CHANNEL dmachan = (DMA_CHANNEL)handle; + + return dmachan_getreg(dmachan, N32_DMA_CH_DA_OFFSET); +} + +uint32_t n32_getcount(DMA_HANDLE handle) +{ + DMA_CHANNEL dmachan = (DMA_CHANNEL)handle; + + return dmachan_getreg(dmachan, N32_DMA_CH_CTRL_OFFSET + 4) & 0x0fff; +} + +/**************************************************************************** + * Name: n32_dmacapable + * + * Description: + * Check if the DMA controller can transfer data to/from given memory + * address. This depends on the internal connections in the ARM bus matrix + * of the processor. Note that this only applies to memory addresses, it + * will return false for any peripheral address. + * + * Input Parameters: + * cfg - DMA transfer configuration + * + * Returned Value: + * True, if transfer is possible. + * + ****************************************************************************/ + +#ifdef CONFIG_N32H7_DMACAPABLE +bool n32_dmacapable(DMA_HANDLE handle, n32_dmacfg_t *cfg) +{ + DMA_CHANNEL dmachan = (DMA_CHANNEL)handle; + uint8_t controller = dmachan->ctrl; + + DEBUGASSERT(controller >= MDMA && controller <= DMA3); + + return g_dma_ops[controller].dma_capable(cfg); +} +#endif + +/**************************************************************************** + * Name: n32_dmadump + * + * Description: + * Dump previously sampled DMA register contents + * + * Assumptions: + * - DMA handle allocated by n32_dmachannel() + * + ****************************************************************************/ + +#ifdef CONFIG_DEBUG_DMA_INFO +void n32_dmadump(DMA_HANDLE handle, const char *msg) +{ + DMA_CHANNEL dmachan = (DMA_CHANNEL)handle; + uint8_t controller = dmachan->ctrl; + + DEBUGASSERT(controller >= MDMA && controller <= DMA3); + + dmainfo("DMA %" PRIu8 " CH%" PRIu8 " Registers: %s\n", + dmachan->ctrl, dmachan->ctrl, msg); + + g_dma_ops[controller].dma_dump(handle, msg); +} +#endif diff --git a/arch/arm/src/n32h7/n32_dma.h b/arch/arm/src/n32h7/n32_dma.h new file mode 100644 index 0000000000000..31e952ebe3903 --- /dev/null +++ b/arch/arm/src/n32h7/n32_dma.h @@ -0,0 +1,339 @@ +/**************************************************************************** + * arch/arm/src/n32h7/n32_dma.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __ARCH_ARM_SRC_N32H7_N32_DMA_H +#define __ARCH_ARM_SRC_N32H7_N32_DMA_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include +#include + +#include "hardware/n32h7_dma.h" +#include "hardware/n32h7_dmamux.h" + +/**************************************************************************** + * Public Types + ****************************************************************************/ + +#define DMA_INT_TFR (1 << 0) +#define DMA_INT_BLOCK (1 << 1) +#define DMA_INT_SRCT (1 << 2) +#define DMA_INT_DSTT (1 << 3) +#define DMA_INT_ERROR (1 << 4) + +/* DMA Channel Initialize configuration structure */ + +typedef struct +{ + uint32_t src_addr; /* Source address */ + uint32_t dst_addr; /* Destination address */ + uint32_t block_size; /* Block transfer size (max 4095) */ + uint64_t ctrl; /* CH_CTRL value (combine macros from n32h7_dma.h) */ + uint32_t sg_cfg; /* CH_SG (source gather), 0 if unused */ + uint32_t ds_cfg; /* CH_DS (dest scatter), 0 if unused */ + + uint8_t src_hs_if; /* Source handshake interface (0~7) -> SRCPER */ + uint8_t dst_hs_if; /* Dest handshake interface (0~7) -> DSTPER */ + uint8_t priority; /* Channel priority (0~7) -> CHPRIOR */ + + uint8_t src_hs_mode; /* 0: HW handshake, 1: SW handshake -> HSSELSRC */ + uint8_t dst_hs_mode; /* 0: HW, 1: SW -> HSSELDST */ + + void *link_list; /* Linked list pointer (NULL if not used) */ +} n32_dmacfg_t; + +/* DMA_HANDLE Provides an opaque reference that can be used to represent a + * DMA stream. + */ + +typedef void *DMA_HANDLE; + +/* Description: + * This is the type of the callback that is used to inform the user of the + * completion of the DMA. NOTE: The DMA module does *NOT* perform any + * cache operations. It is the responsibility of the DMA client to + * invalidate DMA buffers after completion of the DMA RX operations. + * + * Input Parameters: + * handle - Refers to the DMA channel or stream + * status - A bit encoded value that provides the completion status. See + * the DMASTATUS_* definitions above. + * arg - A user-provided value that was provided when n32_dmastart() + * was called. + */ + +typedef void (*dma_callback_t)(DMA_HANDLE handle, uint8_t status, void *arg); + +/**************************************************************************** + * Public Data + ****************************************************************************/ + +#ifndef __ASSEMBLY__ + +#undef EXTERN +#if defined(__cplusplus) +#define EXTERN extern "C" +extern "C" +{ +#else +#define EXTERN extern +#endif + +/**************************************************************************** + * Public Function Prototypes + ****************************************************************************/ + +/**************************************************************************** + * Name: n32_dmachannel + * + * Description: + * Allocate a DMA channel. This function gives the caller mutually + * exclusive access to the DMA channel specified by the 'dmamap' argument. + * It is common for standard DMA (DMA1, DMA2, DMA3), master DMA (MDMA) + * controllers. + * + * Input Parameters: + * dmamap - Identifies the stream/channel resource. For the N32 H7, this + * is a bit-encoded value as provided by the DMAMAP_* definitions + * in chip/n32h7xxxxxxx_dmamux.h + * + * Returned Value: + * On success, this function returns a non-NULL, void* DMA channel handle. + * NULL is returned on any failure. This function can fail only if no DMA + * channel is available. + * + * Assumptions: + * - The caller does not hold he DMA channel. + * - The caller can wait for the DMA channel to be freed if it is no + * available. + * + ****************************************************************************/ + +DMA_HANDLE n32_dmachannel(unsigned int dmamap); + +/**************************************************************************** + * Name: n32_dmafree + * + * Description: + * Release a DMA channel and unmap DMAMUX if required. + * + * NOTE: The 'handle' used in this argument must NEVER be used again + * until n32_dmachannel() is called again to re-gain access to the + * channel. + * + * Returned Value: + * None + * + * Assumptions: + * - The caller holds the DMA channel. + * - There is no DMA in progress + * + ****************************************************************************/ + +void n32_dmafree(DMA_HANDLE handle); + +/**************************************************************************** + * Name: n32_dmasetup + * + * Description: + * Configure DMA before using it. + * + * Input Parameters: + * handle - DMA channel handle + * cfg - Pointer to DMA configuration structure + * + * Returned Value: + * None + * + ****************************************************************************/ + +void n32_dmasetup(DMA_HANDLE handle, n32_dmacfg_t *cfg); + +/**************************************************************************** + * Name: n32_dmastart + * + * Description: + * Start DMA transfer. + * + * Input Parameters: + * handle - DMA channel handle + * callback - Pointer to DMA completion callback + * arg - User-provided value to pass to the callback + * + * Returned Value: + * None + * + ****************************************************************************/ + +void n32_dmastart(DMA_HANDLE handle, dma_callback_t callback, void *arg); + +/**************************************************************************** + * Name: n32_dmastop + * + * Description: + * Stop DMA transfer. + * + * Input Parameters: + * handle - DMA channel handle + * + * Returned Value: + * None + * + ****************************************************************************/ + +void n32_dmastop(DMA_HANDLE handle); + +/**************************************************************************** + * Name: n32_getchanel + * + * Description: + * Get the current DMA channel. + * + * Input Parameters: + * handle - DMA channel handle + * + * Returned Value: + * DMA channel number + * + * Assumptions: + * - The caller holds the DMA channel. + * + ****************************************************************************/ + +size_t n32_getchanel(DMA_HANDLE handle); + +/**************************************************************************** + * Name: n32_dmaptr_src + * + * Description: + * Get the source DMA pointer. + * + * Input Parameters: + * handle - DMA channel handle + * + * Returned Value: + * Source DMA pointer + * + * Assumptions: + * - The caller holds the DMA channel. + * + ****************************************************************************/ + +uint32_t n32_dmaptr_src(DMA_HANDLE handle); + +/**************************************************************************** + * Name: n32_dmaptr_dst + * + * Description: + * Get the destination DMA pointer. + * + * Input Parameters: + * handle - DMA channel handle + * + * Returned Value: + * Destination DMA pointer + * + * Assumptions: + * - The caller holds the DMA channel. + * + ****************************************************************************/ + +uint32_t n32_dmaptr_dst(DMA_HANDLE handle); + +/**************************************************************************** + * Name: n32_getcount + * + * Description: + * Get the number of bytes to be transferred. + * + * Input Parameters: + * handle - DMA channel handle + * + * Returned Value: + * Number of bytes to be transferred + * + * Assumptions: + * - The caller holds the DMA channel. + * + ****************************************************************************/ + +uint32_t n32_getcount(DMA_HANDLE handle); + +/**************************************************************************** + * Name: n32_dmacapable + * + * Description: + * Check if the DMA channel is capable of the transfer. + * + * Input Parameters: + * handle - DMA channel handle + * cfg - Pointer to DMA configuration structure + * + * Returned Value: + * True if the DMA channel is capable of the transfer, False otherwise + * + * Assumptions: + * - The caller holds the DMA channel. + * + ****************************************************************************/ + +#ifdef CONFIG_N32H7_DMACAPABLE +bool n32_dmacapable(DMA_HANDLE handle, n32_dmacfg_t *cfg); +#else +# define n32_dmacapable(handle, cfg) (true) +#endif + +/**************************************************************************** + * Name: n32_dmadump + * + * Description: + * Dump the DMA channel configuration. + * + * Input Parameters: + * handle - DMA channel handle + * msg - Optional message to print before the dump + * + * Returned Value: + * None + * + * Assumptions: + * - The caller holds the DMA channel. + * + ****************************************************************************/ + +#ifdef CONFIG_DEBUG_DMA_INFO +void n32_dmadump(DMA_HANDLE handle, const char *msg); +#else +# define n32_dmadump(handle,msg) +#endif + +#undef EXTERN +#if defined(__cplusplus) +} +#endif + +#endif /* __ASSEMBLY__ */ +#endif /* __ARCH_ARM_SRC_N32H7_N32_DMA_H */ diff --git a/arch/arm/src/n32h7/n32_exti.h b/arch/arm/src/n32h7/n32_exti.h new file mode 100644 index 0000000000000..af90a9eb90f97 --- /dev/null +++ b/arch/arm/src/n32h7/n32_exti.h @@ -0,0 +1,132 @@ +/**************************************************************************** + * arch/arm/src/n32h7/n32_exti.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + + #ifndef __ARCH_ARM_SRC_N32H7_N32_EXTI_H + #define __ARCH_ARM_SRC_N32H7_N32_EXTI_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include + +#include "chip.h" +#include "hardware/n32h7_exti.h" + +/**************************************************************************** + * Public Data + ****************************************************************************/ + +#ifndef __ASSEMBLY__ + +#undef EXTERN +#if defined(__cplusplus) +#define EXTERN extern "C" +extern "C" +{ +#else +#define EXTERN extern +#endif + +/**************************************************************************** + * Public Function Prototypes + ****************************************************************************/ + +/**************************************************************************** + * Name: n32_gpiosetevent + * + * Description: + * Sets/clears GPIO based event and interrupt triggers. + * + * Input Parameters: + * - pinset: GPIO pin configuration + * - risingedge: Enables interrupt on rising edges + * - fallingedge: Enables interrupt on falling edges + * - event: Generate event when set + * - func: When non-NULL, generate interrupt + * - arg: Argument passed to the interrupt callback + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure indicating the + * nature of the failure. + * + ****************************************************************************/ + +int n32_gpiosetevent(uint32_t pinset, bool risingedge, bool fallingedge, + bool event, xcpt_t func, void *arg); + +/**************************************************************************** + * Name: n32_exti_alarm + * + * Description: + * Sets/clears EXTI alarm interrupt. + * + * Input Parameters: + * - risingedge: Enables interrupt on rising edges + * - fallingedge: Enables interrupt on falling edges + * - event: Generate event when set + * - func: When non-NULL, generate interrupt + * - arg: Argument passed to the interrupt callback + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure indicating the + * nature of the failure. + * + ****************************************************************************/ + +#ifdef CONFIG_RTC_ALARM +int n32_exti_alarm(bool risingedge, bool fallingedge, bool event, + xcpt_t func, void *arg); +#endif + +/**************************************************************************** + * Name: n32_exti_wakeup + * + * Description: + * Sets/clears EXTI wakeup interrupt. + * + * Input Parameters: + * - rising/falling edge: enables interrupt on rising/falling edges + * - event: generate event when set + * - func: when non-NULL, generate interrupt + * - arg: Argument passed to the interrupt callback + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure indicating the + * nature of the failure. + * + ****************************************************************************/ + +#ifdef CONFIG_RTC_PERIODIC +int n32_exti_wakeup(bool risingedge, bool fallingedge, bool event, + xcpt_t func, void *arg); +#endif + +#undef EXTERN +#if defined(__cplusplus) +} +#endif + +#endif /* __ASSEMBLY__ */ +#endif /* __ARCH_ARM_SRC_N32H7_N32_EXTI_H */ diff --git a/arch/arm/src/n32h7/n32_exti_gpio.c b/arch/arm/src/n32h7/n32_exti_gpio.c new file mode 100644 index 0000000000000..92ec83216a1a8 --- /dev/null +++ b/arch/arm/src/n32h7/n32_exti_gpio.c @@ -0,0 +1,428 @@ +/**************************************************************************** + * arch/arm/src/n32h7/n32_exti_gpio.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include +#include + +#include +#include +#include +#include + +#include + +#include "arm_internal.h" +#include "chip.h" +#include "n32_gpio.h" +#include "n32_exti.h" + +/* Content of this file requires verification before it is used with other + * families + */ + +#if defined(CONFIG_N32H7_N32H76X) +/**************************************************************************** + * Private Types + ****************************************************************************/ + +struct gpio_callback_s +{ + uint32_t port; + uint32_t pin; + xcpt_t callback; + void *arg; +}; + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +/* Interrupt handlers attached to each EXTI */ + +static struct gpio_callback_s g_gpio_callbacks[16]; + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Interrupt Service Routines - Dispatchers + ****************************************************************************/ + +static int n32_exti0_isr(int irq, void *context, void *arg) +{ + int ret = OK; + + /* Clear the pending interrupt */ + + putreg32(0x00000001, N32_EXTI_M7PEND0); + + /* And dispatch the interrupt to the handler */ + + if (g_gpio_callbacks[0].callback != NULL) + { + xcpt_t callback = g_gpio_callbacks[0].callback; + void *cbarg = g_gpio_callbacks[0].arg; + + ret = callback(irq, context, cbarg); + } + + return ret; +} + +static int n32_exti1_isr(int irq, void *context, void *arg) +{ + int ret = OK; + + /* Clear the pending interrupt */ + + putreg32(0x00000002, N32_EXTI_M7PEND0); + + /* And dispatch the interrupt to the handler */ + + if (g_gpio_callbacks[1].callback != NULL) + { + xcpt_t callback = g_gpio_callbacks[1].callback; + void *cbarg = g_gpio_callbacks[1].arg; + + ret = callback(irq, context, cbarg); + } + + return ret; +} + +static int n32_exti2_isr(int irq, void *context, void *arg) +{ + int ret = OK; + + /* Clear the pending interrupt */ + + putreg32(0x00000004, N32_EXTI_M7PEND0); + + /* And dispatch the interrupt to the handler */ + + if (g_gpio_callbacks[2].callback != NULL) + { + xcpt_t callback = g_gpio_callbacks[2].callback; + void *cbarg = g_gpio_callbacks[2].arg; + + ret = callback(irq, context, cbarg); + } + + return ret; +} + +static int n32_exti3_isr(int irq, void *context, void *arg) +{ + int ret = OK; + + /* Clear the pending interrupt */ + + putreg32(0x00000008, N32_EXTI_M7PEND0); + + /* And dispatch the interrupt to the handler */ + + if (g_gpio_callbacks[3].callback != NULL) + { + xcpt_t callback = g_gpio_callbacks[3].callback; + void *cbarg = g_gpio_callbacks[3].arg; + + ret = callback(irq, context, cbarg); + } + + return ret; +} + +static int n32_exti4_isr(int irq, void *context, void *arg) +{ + int ret = OK; + + /* Clear the pending interrupt */ + + putreg32(0x00000010, N32_EXTI_M7PEND0); + + /* And dispatch the interrupt to the handler */ + + if (g_gpio_callbacks[4].callback != NULL) + { + xcpt_t callback = g_gpio_callbacks[4].callback; + void *cbarg = g_gpio_callbacks[4].arg; + + ret = callback(irq, context, cbarg); + } + + return ret; +} + +static int n32_exti_multiisr(int irq, void *context, int first, int last) +{ + uint32_t pr; + int pin; + int ret = OK; + + /* Examine the state of each pin in the group */ + + pr = getreg32(N32_EXTI_M7PEND0); + + /* And dispatch the interrupt to the handler */ + + for (pin = first; pin <= last; pin++) + { + /* Is an interrupt pending on this pin? */ + + uint32_t mask = (1 << pin); + + if ((pr & mask) != 0) + { + /* Clear the pending interrupt */ + + putreg32(mask, N32_EXTI_M7PEND0); + + /* And dispatch the interrupt to the handler */ + + if (g_gpio_callbacks[pin].callback != NULL) + { + xcpt_t callback = g_gpio_callbacks[pin].callback; + void *cbarg = g_gpio_callbacks[pin].arg; + int tmp; + + tmp = callback(irq, context, cbarg); + if (tmp < 0) + { + ret = tmp; + } + } + } + } + + return ret; +} + +static int n32_exti95_isr(int irq, void *context, void *arg) +{ + return n32_exti_multiisr(irq, context, 5, 9); +} + +static int n32_exti1510_isr(int irq, void *context, void *arg) +{ + return n32_exti_multiisr(irq, context, 10, 15); +} + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: n32_gpiosetevent + * + * Description: + * Sets/clears GPIO based event and interrupt triggers. + * + * Input Parameters: + * - pinset: GPIO pin configuration + * - risingedge: Enables interrupt on rising edges + * - fallingedge: Enables interrupt on falling edges + * - event: Generate event when set + * - func: When non-NULL, generate interrupt + * - arg: Argument passed to the interrupt callback + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure indicating the + * nature of the failure. + * + ****************************************************************************/ + +int n32_gpiosetevent(uint32_t pinset, bool risingedge, bool fallingedge, + bool event, xcpt_t func, void *arg) +{ + struct gpio_callback_s *shared_cbs; + uint32_t port = (pinset & GPIO_PORT_MASK) >> GPIO_PORT_SHIFT; + uint32_t pin = (pinset & GPIO_PIN_MASK) >> GPIO_PIN_SHIFT; + uint32_t exti; + uint32_t regval; + xcpt_t handler; + int nshared; + int i; + int irq; + + /* Find the first available EXTI line */ + + for (exti = 0; exti < 16; exti++) + { + if (func && g_gpio_callbacks[exti].callback != NULL && + g_gpio_callbacks[exti].port == port && + g_gpio_callbacks[exti].pin == pin) + { + break; + } + else if (func && g_gpio_callbacks[exti].callback == NULL) + { + break; + } + else if (!func && g_gpio_callbacks[exti].port == port && + g_gpio_callbacks[exti].pin == pin) + { + break; + } + } + + /* Select the interrupt handler for this EXTI line */ + + if (exti < 5) + { + irq = exti + N32_IRQ_EXTI0; + nshared = 1; + shared_cbs = &g_gpio_callbacks[exti]; + switch (exti) + { + case 0: + handler = n32_exti0_isr; + break; + + case 1: + handler = n32_exti1_isr; + break; + + case 2: + handler = n32_exti2_isr; + break; + + case 3: + handler = n32_exti3_isr; + break; + + default: + handler = n32_exti4_isr; + break; + } + } + else if (exti < 10) + { + irq = N32_IRQ_EXTI9_5; + handler = n32_exti95_isr; + shared_cbs = &g_gpio_callbacks[5]; + nshared = 5; + } + else if (exti < 16) + { + irq = N32_IRQ_EXTI15_10; + handler = n32_exti1510_isr; + shared_cbs = &g_gpio_callbacks[10]; + nshared = 6; + } + else + { + if (func) + { + return -EINVAL; + } + else + { + return OK; + } + } + + /* Install external interrupt handlers */ + + if (func) + { + /* Save the new IRQ handler. */ + + g_gpio_callbacks[exti].port = port; + g_gpio_callbacks[exti].pin = pin; + + regval = getreg32(N32_AFIO_EXTI_CFG(exti >> 2)); + regval &= ~N32_AFIO_EXTICR_EXTI_MASK(exti); + regval |= (pin * 11 + port) << N32_AFIO_EXTICR_EXTI_SHIFT(exti); + putreg32(regval, N32_AFIO_EXTI_CFG(exti >> 2)); + + g_gpio_callbacks[exti].callback = func; + g_gpio_callbacks[exti].arg = arg; + + irq_attach(irq, handler, NULL); + up_enable_irq(irq); + } + else + { + /* Clear the previous IRQ handler. */ + + g_gpio_callbacks[exti].port = 0; + g_gpio_callbacks[exti].pin = 0; + + regval = getreg32(N32_AFIO_EXTI_CFG(exti >> 2)); + regval &= ~N32_AFIO_EXTICR_EXTI_MASK(exti); + putreg32(regval, N32_AFIO_EXTI_CFG(exti >> 2)); + + g_gpio_callbacks[exti].callback = NULL; + g_gpio_callbacks[exti].arg = NULL; + + /* Only disable IRQ if shared handler does not have any active + * callbacks. + */ + + for (i = 0; i < nshared; i++) + { + if (shared_cbs[i].callback != NULL) + { + break; + } + } + + if (i == nshared) + { + up_disable_irq(irq); + } + } + + /* Configure GPIO, enable EXTI line enabled if event or interrupt is + * enabled. + */ + + n32_configgpio(pinset); + + /* Configure rising/falling edges */ + + modifyreg32(N32_EXTI_RT_CFG0, + risingedge ? 0 : (1U << exti), + risingedge ? (1U << exti) : 0); + modifyreg32(N32_EXTI_FT_CFG0, + fallingedge ? 0 : (1U << exti), + fallingedge ? (1U << exti) : 0); + + /* Enable Events and Interrupts */ + + modifyreg32(N32_EXTI_M7EMASK0, + event ? 0 : (1U << exti), + event ? (1U << exti) : 0); + modifyreg32(N32_EXTI_M7IMASK0, + func ? 0 : (1U << exti), + func ? (1U << exti) : 0); + + return OK; +} + +#endif /* CONFIG_N32H7_N32H76X */ diff --git a/arch/arm/src/n32h7/n32_flash.c b/arch/arm/src/n32h7/n32_flash.c new file mode 100644 index 0000000000000..d063ade16da34 --- /dev/null +++ b/arch/arm/src/n32h7/n32_flash.c @@ -0,0 +1,247 @@ +/**************************************************************************** + * arch/arm/src/n32h7/n32_flash.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "arm_internal.h" +#include "n32_flash.h" + +/**************************************************************************** + * Private Definitions + ****************************************************************************/ + +/* ROM function addresses (Thumb mode entry points) */ +#define ROM_WRITE_FUNC ((uint32_t (*)(uint32_t, uint8_t*, uint32_t))0x1fff7b81) +#define ROM_ERASE_FUNC ((uint32_t (*)(uint32_t))0x1fff7c81) + +/* Return codes from ROM (as defined in SMU, but duplicated here) */ +#define FLASH_SUCCESS 0 +#define FLASH_BUS_ADDR_ERROR 1 +#define FLASH_LOGIC_ADDR_ERROR 2 +#define FLASH_RESTRICTED 3 +#define FLASH_RDP_PROTECTED 4 +#define FLASH_SECURE_AREA 5 +#define FLASH_PFOER_AREA 6 +#define FLASH_WRP_PROTECTED 7 +#define FLASH_FAILED 8 + +/* Helper to check success */ +#define FLASH_OP_OK(code) ((code) == FLASH_SUCCESS) + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +static mutex_t g_flash_lock = NXMUTEX_INITIALIZER; + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +static bool n32_flash_valid_addr(uintptr_t addr, size_t len) +{ + return (addr >= (N32_FLASH_BASE | N32_MTD_FLASH_BASE) && + addr + len <= (N32_FLASH_BASE | N32_MTD_FLASH_BASE) + + N32_MTD_FLASH_SIZE); +} + +static ssize_t n32_flash_verify_erased(uintptr_t addr, size_t len) +{ + const uint8_t *p = (const uint8_t *)addr; + size_t count = 0; + + for (size_t i = 0; i < len; i++) + { + if (p[i] != 0xff) + { + count++; + } + } + + return (ssize_t)count; +} + +/**************************************************************************** + * Public Functions – progmem API + ****************************************************************************/ + +size_t up_progmem_pagesize(size_t page) +{ + return N32_FLASH_PAGE_SIZE; +} + +size_t up_progmem_neraseblocks(void) +{ + return N32_FLASH_NBLOCKS; +} + +bool up_progmem_isuniform(void) +{ + return true; +} + +size_t up_progmem_erasesize(size_t block) +{ + if (block >= N32_FLASH_NBLOCKS) + { + return 0; + } + + return N32_FLASH_SECTOR_SIZE; +} + +size_t up_progmem_getaddress(size_t page) +{ + if (page >= N32_FLASH_NPAGES) + { + return SIZE_MAX; + } + + return (N32_FLASH_BASE | N32_MTD_FLASH_BASE) + page * N32_FLASH_PAGE_SIZE; +} + +ssize_t up_progmem_getpage(size_t addr) +{ + if (addr < (N32_FLASH_BASE | N32_MTD_FLASH_BASE) || addr >= (N32_FLASH_BASE + | N32_MTD_FLASH_BASE) + N32_MTD_FLASH_SIZE) + { + return -EFAULT; + } + + return (addr - (N32_FLASH_BASE | N32_MTD_FLASH_BASE)) / + N32_FLASH_PAGE_SIZE; +} + +ssize_t up_progmem_ispageerased(size_t page) +{ + size_t addr = up_progmem_getaddress(page); + + if (addr == SIZE_MAX) + { + return -EFAULT; + } + + return n32_flash_verify_erased(addr, N32_FLASH_PAGE_SIZE); +} + +ssize_t up_progmem_eraseblock(size_t block) +{ + int ret; + uint32_t status; + uintptr_t addr; + + if (block >= N32_FLASH_NBLOCKS) + { + return -EFAULT; + } + + addr = (N32_FLASH_BASE | N32_MTD_FLASH_BASE) + block * + N32_FLASH_SECTOR_SIZE; + + ret = nxmutex_lock(&g_flash_lock); + if (ret < 0) + { + return ret; + } + + /* Invalidate cache before erase */ + + up_invalidate_dcache(addr, addr + N32_FLASH_SECTOR_SIZE); + + status = ROM_ERASE_FUNC(addr); + if (!FLASH_OP_OK(status)) + { + finfo("Erase failed, status=%" PRIu32 "\n", status); + ret = -EIO; + goto unlock; + } + + /* Verify erased */ + + if (n32_flash_verify_erased(addr, N32_FLASH_SECTOR_SIZE) != 0) + { + ret = -EIO; + goto unlock; + } + + ret = (ssize_t)N32_FLASH_SECTOR_SIZE; + +unlock: + nxmutex_unlock(&g_flash_lock); + return ret; +} + +ssize_t up_progmem_write(size_t addr, const void *buf, size_t count) +{ + int ret; + uint32_t status; + + if (!n32_flash_valid_addr(addr, count)) + { + return -EFAULT; + } + + ret = nxmutex_lock(&g_flash_lock); + if (ret < 0) + { + return ret; + } + + up_invalidate_dcache(addr, addr + count); + + status = ROM_WRITE_FUNC(addr, (uint8_t *)buf, count); + if (!FLASH_OP_OK(status)) + { + finfo("Write failed, status=%" PRIu32 "\n", status); + ret = -EIO; + goto unlock; + } + + if (memcmp((const void *)addr, buf, count) != 0) + { + ret = -EIO; + goto unlock; + } + + ret = (ssize_t)count; + +unlock: + nxmutex_unlock(&g_flash_lock); + return ret; +} + +uint8_t up_progmem_erasestate(void) +{ + return 0xff; +} diff --git a/arch/arm/src/n32h7/n32_flash.h b/arch/arm/src/n32h7/n32_flash.h new file mode 100644 index 0000000000000..6c31d9ee965ba --- /dev/null +++ b/arch/arm/src/n32h7/n32_flash.h @@ -0,0 +1,34 @@ +/**************************************************************************** + * arch/arm/src/n32h7/n32_flash.h + * + * SPDX-License-Identifier: Apache-2.0 + ****************************************************************************/ + +#ifndef __ARCH_ARM_SRC_N32H7_N32_FLASH_H +#define __ARCH_ARM_SRC_N32H7_N32_FLASH_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include +#include "hardware/n32h7_memorymap.h" + +/* Flash geometry */ +#define N32_FLASH_SECTOR_SIZE (4 * 1024) /* 4KB sector */ +#define N32_FLASH_PAGE_SIZE (4 * 1024) /* 4KB page size */ + +#ifdef CONFIG_N32H7_FLASH_CONFIG_I +#define N32_MTD_FLASH_BASE (0x000E0000) +#define N32_MTD_FLASH_SIZE (0x00100000) +#endif /* CONFIG_N32H7_FLASH_CONFIG_I */ +#ifdef CONFIG_N32H7_FLASH_CONFIG_K +#define N32_MTD_FLASH_BASE (0x001E0000) +#define N32_MTD_FLASH_SIZE (0x00200000) +#endif /* CONFIG_N32H7_FLASH_CONFIG_K */ + +#define N32_FLASH_NBLOCKS (N32_MTD_FLASH_SIZE / N32_FLASH_SECTOR_SIZE) +#define N32_FLASH_NPAGES (N32_MTD_FLASH_SIZE / N32_FLASH_PAGE_SIZE) + +#endif /* __ARCH_ARM_SRC_N32H7_N32_FLASH_H */ diff --git a/arch/arm/src/n32h7/n32_gpio.c b/arch/arm/src/n32h7/n32_gpio.c new file mode 100644 index 0000000000000..71af4780b3fa7 --- /dev/null +++ b/arch/arm/src/n32h7/n32_gpio.c @@ -0,0 +1,444 @@ +/**************************************************************************** + * arch/arm/src/n32h7/n32_gpio.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "arm_internal.h" +#include "hardware/n32h7_afio.h" +#include "n32_gpio.h" + +#if defined(CONFIG_N32H7_N32H76X) + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +static spinlock_t g_configgpio_lock = SP_UNLOCKED; + +/**************************************************************************** + * Public Data + ****************************************************************************/ + +/* Base addresses for each GPIO block */ + +const uint32_t g_gpiobase[N32H7_NGPIO] = +{ + N32_GPIOA_BASE, + N32_GPIOB_BASE, + N32_GPIOC_BASE, + N32_GPIOD_BASE, +#if N32H7_NGPIO > 4 + N32_GPIOE_BASE, +#endif +#if N32H7_NGPIO > 5 + N32_GPIOF_BASE, +#endif +#if N32H7_NGPIO > 6 + N32_GPIOG_BASE, +#endif +#if N32H7_NGPIO > 7 + N32_GPIOH_BASE, +#endif +#if N32H7_NGPIO > 8 + N32_GPIOI_BASE, +#endif +#if N32H7_NGPIO > 9 + N32_GPIOJ_BASE, +#endif +#if N32H7_NGPIO > 10 + N32_GPIOK_BASE, +#endif +}; + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Function: n32_gpioinit + * + * Description: + * Based on configuration within the .config file, it does: + * - Remaps positions of alternative functions. + * + * Typically called from n32_start(). + * + * Assumptions: + * This function is called early in the initialization sequence so that + * no mutual exclusion is necessary. + * + ****************************************************************************/ + +void n32_gpioinit(void) +{ +} + +/**************************************************************************** + * Name: n32_configgpio + * + * Description: + * Configure a GPIO pin based on bit-encoded description of the pin. + * Once it is configured as Alternative (GPIO_ALT|GPIO_CNF_AFPP|...) + * function, it must be unconfigured with n32_unconfiggpio() with + * the same cfgset first before it can be set to non-alternative function. + * + * Returned Value: + * OK on success + * A negated errno value on invalid port, or when pin is locked as ALT + * function. + * + * To-Do: Auto Power Enable + ****************************************************************************/ + +int n32_configgpio(uint32_t cfgset) +{ + uintptr_t base; + uint32_t regval; + uint32_t setting; + uint32_t alt_setting; + unsigned int regoffset; + unsigned int port; + unsigned int pin; + unsigned int pos; + unsigned int pinmode; + irqstate_t flags; + + /* Verify that this hardware supports the select GPIO port */ + + port = (cfgset & GPIO_PORT_MASK) >> GPIO_PORT_SHIFT; + if (port >= N32H7_NGPIO) + { + return -EINVAL; + } + + /* Get the port base address */ + + base = g_gpiobase[port]; + if (base == 0) + { + return -EINVAL; + } + + /* Get the pin number and select the port configuration register for that + * pin + */ + + pin = (cfgset & GPIO_PIN_MASK) >> GPIO_PIN_SHIFT; + + /* Set up the mode register (and remember whether the pin mode) */ + + switch (cfgset & GPIO_MODE_MASK) + { + default: + case GPIO_INPUT: /* Input mode */ + pinmode = GPIO_MODER_INPUT; + break; + + case GPIO_OUTPUT: /* General purpose output mode */ + pinmode = GPIO_MODER_OUTPUT; + break; + + case GPIO_ALT: /* Alternate function mode */ + pinmode = GPIO_MODER_ALT; + break; + + case GPIO_ANALOG: /* Analog mode */ + pinmode = GPIO_MODER_ANALOG; + break; + } + + /* Interrupts must be disabled from here on out so that we have mutually + * exclusive access to all of the GPIO configuration registers. + */ + + flags = spin_lock_irqsave(&g_configgpio_lock); + + /* Determine the alternate function (Only alternate function pins) */ + + if (pinmode == GPIO_MODER_ALT) + { + setting = (cfgset & GPIO_AF_MASK) >> GPIO_AF_SHIFT; + } + else + { + setting = 0; + } + + if (pinmode == GPIO_MODER_ALT) + { + alt_setting = (cfgset & GPIO_AF_MASK) >> GPIO_AF_SHIFT; + } + else + { + alt_setting = 0; + } + + /* Set the alternate function (Only alternate function pins) + * This is done before configuring the Outputs on a change to + * an Alternate function. + */ + + if (pin < 8) + { + regoffset = N32_GPIO_AFL_OFFSET; + pos = pin; + } + else + { + regoffset = N32_GPIO_AFH_OFFSET; + pos = pin - 8; + } + + regval = getreg32(base + regoffset); + regval &= ~GPIO_AFR_MASK(pos); + regval |= (alt_setting << GPIO_AFR_SHIFT(pos)); + putreg32(regval, base + regoffset); + + /* Now apply the configuration to the mode register */ + + regval = getreg32(base + N32_GPIO_MODER_OFFSET); + regval &= ~GPIO_MODER_MASK(pin); + regval |= ((uint32_t)pinmode << GPIO_MODER_SHIFT(pin)); + putreg32(regval, base + N32_GPIO_MODER_OFFSET); + + /* Set up the pull-up/pull-down configuration (all but analog pins) */ + + setting = GPIO_PUPDR_NONE; + if (pinmode != GPIO_MODER_ANALOG) + { + switch (cfgset & GPIO_PUPD_MASK) + { + default: + case GPIO_FLOAT: /* No pull-up, pull-down */ + break; + + case GPIO_PULLUP: /* Pull-up */ + setting = GPIO_PUPDR_PULLUP; + break; + + case GPIO_PULLDOWN: /* Pull-down */ + setting = GPIO_PUPDR_PULLDOWN; + break; + } + } + + regval = getreg32(base + N32_GPIO_PUPD_OFFSET); + regval &= ~GPIO_PUPDR_MASK(pin); + regval |= (setting << GPIO_PUPDR_SHIFT(pin)); + putreg32(regval, base + N32_GPIO_PUPD_OFFSET); + + /* Set drive strength (Only outputs and alternate function pins) */ + + if (pinmode == GPIO_MODER_OUTPUT || pinmode == GPIO_MODER_ALT) + { + switch (cfgset & GPIO_DRIVE_MASK) + { + default: + case GPIO_DRIVE_2mA: /* 2 MHz Low speed output */ + setting = GPIO_DS_2mA; + break; + + case GPIO_DRIVE_4mA: /* 4 mA */ + setting = GPIO_DS_4mA; + break; + + case GPIO_DRIVE_8mA: /* 8 mA */ + setting = GPIO_DS_8mA; + break; + + case GPIO_DRIVE_12mA: /* 12 mA */ + setting = GPIO_DS_12mA; + break; + } + } + else + { + setting = 0; + } + + regval = getreg32(base + N32_GPIO_DS_OFFSET); + regval &= ~GPIO_DS_MASK(pin); + regval |= (setting << GPIO_DS_SHIFT(pin)); + putreg32(regval, base + N32_GPIO_DS_OFFSET); + + /* Set slew rate (Only outputs and alternate function pins) */ + + regval = getreg32(base + N32_GPIO_SR_OFFSET); + setting = GPIO_SR_SLOW_SLEW(pin); + + if ((pinmode == GPIO_MODER_OUTPUT || pinmode == GPIO_MODER_ALT) && + (cfgset & GPIO_SLEW_RATE_SLOW) != 0) + { + regval |= setting; + } + else + { + regval &= ~setting; + } + + putreg32(regval, base + N32_GPIO_SR_OFFSET); + + /* Set push-pull/open-drain (Only outputs and alternate function pins) */ + + regval = getreg32(base + N32_GPIO_OTYPER_OFFSET); + setting = GPIO_OTYPER_OD(pin); + + if ((pinmode == GPIO_MODER_OUTPUT || pinmode == GPIO_MODER_ALT) && + (cfgset & GPIO_OPENDRAIN) != 0) + { + regval |= setting; + } + else + { + regval &= ~setting; + } + + putreg32(regval, base + N32_GPIO_OTYPER_OFFSET); + + spin_unlock_irqrestore(&g_configgpio_lock, flags); + return OK; +} + +/**************************************************************************** + * Name: n32_unconfiggpio + * + * Description: + * Unconfigure a GPIO pin based on bit-encoded description of the pin, set + * it into default HiZ state (and possibly mark it's unused) and unlock it + * whether it was previously selected as alternative function + * (GPIO_ALT|GPIO_CNF_AFPP|...). + * + * This is a safety function and prevents hardware from shocks, as + * unexpected write to the Timer Channel Output GPIO to fixed '1' or '0' + * while it should operate in PWM mode could produce excessive on-board + * currents and trigger over-current/alarm function. + * + * Returned Value: + * OK on success + * A negated errno value on invalid port + * + * To-Do: Auto Power Disable + ****************************************************************************/ + +int n32_unconfiggpio(uint32_t cfgset) +{ + /* Reuse port and pin number and set it to default HiZ INPUT */ + + cfgset &= GPIO_PORT_MASK | GPIO_PIN_MASK; + cfgset |= GPIO_INPUT | GPIO_FLOAT; + + /* To-Do: Mark its unuse for automatic power saving options */ + + return n32_configgpio(cfgset); +} + +/**************************************************************************** + * Name: n32_gpiowrite + * + * Description: + * Write one or zero to the selected GPIO pin + * + ****************************************************************************/ + +void n32_gpiowrite(uint32_t pinset, bool value) +{ + uint32_t base; + uint32_t bit; + unsigned int port; + unsigned int pin; + + port = (pinset & GPIO_PORT_MASK) >> GPIO_PORT_SHIFT; + if (port < N32H7_NGPIO) + { + /* Get the port base address */ + + base = g_gpiobase[port]; + if (base != 0) + { + /* Get the pin number */ + + pin = (pinset & GPIO_PIN_MASK) >> GPIO_PIN_SHIFT; + + /* Set or clear the output on the pin */ + + if (value) + { + bit = GPIO_PBSC_SET(pin); + } + else + { + bit = GPIO_PBSC_RESET(pin); + } + + putreg32(bit, base + N32_GPIO_PBSC_OFFSET); + } + } +} + +/**************************************************************************** + * Name: n32_gpioread + * + * Description: + * Read one or zero from the selected GPIO pin + * + ****************************************************************************/ + +bool n32_gpioread(uint32_t pinset) +{ + uint32_t base; + unsigned int port; + unsigned int pin; + + port = (pinset & GPIO_PORT_MASK) >> GPIO_PORT_SHIFT; + if (port < N32H7_NGPIO) + { + /* Get the port base address */ + + base = g_gpiobase[port]; + if (base != 0) + { + /* Get the pin number and return the input state of that pin */ + + pin = (pinset & GPIO_PIN_MASK) >> GPIO_PIN_SHIFT; + return ((getreg32(base + N32_GPIO_PID_OFFSET) & + (1 << pin)) != 0); + } + } + + return 0; +} + +#endif /* CONFIG_N32H7_N32H76X */ diff --git a/arch/arm/src/n32h7/n32_gpio.h b/arch/arm/src/n32h7/n32_gpio.h new file mode 100644 index 0000000000000..338d7934e987d --- /dev/null +++ b/arch/arm/src/n32h7/n32_gpio.h @@ -0,0 +1,366 @@ +/**************************************************************************** + * arch/arm/src/n32h7/n32_gpio.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + + #ifndef __ARCH_ARM_SRC_N32H7_N32_GPIO_H + #define __ARCH_ARM_SRC_N32H7_N32_GPIO_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#ifndef __ASSEMBLY__ +# include +# include +#endif + +#include + +#include "chip.h" +#include "hardware/n32h7_gpio.h" +#include "hardware/n32h7_afio.h" + +/**************************************************************************** + * Pre-Processor Declarations + ****************************************************************************/ + +/* Bit-encoded input to n32_configgpio() */ + +/* Each port bit of the general-purpose I/O (GPIO) ports can be individually + * configured by software in several modes: + * + * - Input floating + * - Input pull-up + * - Input-pull-down + * - Output open-drain with pull-up or pull-down capability + * - Output push-pull with pull-up or pull-down capability + * - Alternate function push-pull with pull-up or pull-down capability + * - Alternate function open-drain with pull-up or pull-down capability + * - Analog + * + * 20-bit Encoding: 1111 1111 1100 0000 0000 + * 9876 5432 1098 7654 3210 + * ---- ---- ---- ---- ---- + * Inputs: MMUU .... ...X PPPP BBBB + * Outputs: MMUU .... DDOS PPPP BBBB + * Alternate Functions: MMUU AAAA DDOS PPPP BBBB + * Analog: MM.. .... .... PPPP BBBB + */ + +/* Mode: + * + * 1111 1111 1100 0000 0000 + * 9876 5432 1098 7654 3210 + * ---- ---- ---- ---- ---- + * MM.. .... .... .... .... + */ + +#define GPIO_MODE_SHIFT (18) /* Bits 18-19: GPIO port mode */ +#define GPIO_MODE_MASK (3 << GPIO_MODE_SHIFT) +# define GPIO_INPUT (0 << GPIO_MODE_SHIFT) /* Input mode */ +# define GPIO_OUTPUT (1 << GPIO_MODE_SHIFT) /* General purpose output mode */ +# define GPIO_ALT (2 << GPIO_MODE_SHIFT) /* Alternate function mode */ +# define GPIO_ANALOG (3 << GPIO_MODE_SHIFT) /* Analog mode */ + +/* Input/output pull-ups/downs (not used with analog): + * + * 1111 1111 1100 0000 0000 + * 9876 5432 1098 7654 3210 + * ---- ---- ---- ---- ---- + * ..UU .... .... .... .... + */ + +#define GPIO_PUPD_SHIFT (16) /* Bits 16-17: Pull-up/pull down */ +#define GPIO_PUPD_MASK (3 << GPIO_PUPD_SHIFT) +# define GPIO_FLOAT (0 << GPIO_PUPD_SHIFT) /* No pull-up, pull-down */ +# define GPIO_PULLUP (1 << GPIO_PUPD_SHIFT) /* Pull-up */ +# define GPIO_PULLDOWN (2 << GPIO_PUPD_SHIFT) /* Pull-down */ + +/* Alternate Functions: + * + * 1111 1111 1100 0000 0000 + * 9876 5432 1098 7654 3210 + * ---- ---- ---- ---- ---- + * .... AAAA .... .... .... + */ + +#define GPIO_AF_SHIFT (12) /* Bits 12-15: Alternate function */ +#define GPIO_AF_MASK (15 << GPIO_AF_SHIFT) +# define GPIO_AF(n) ((n) << GPIO_AF_SHIFT) +# define GPIO_AF0 (0 << GPIO_AF_SHIFT) +# define GPIO_AF1 (1 << GPIO_AF_SHIFT) +# define GPIO_AF2 (2 << GPIO_AF_SHIFT) +# define GPIO_AF3 (3 << GPIO_AF_SHIFT) +# define GPIO_AF4 (4 << GPIO_AF_SHIFT) +# define GPIO_AF5 (5 << GPIO_AF_SHIFT) +# define GPIO_AF6 (6 << GPIO_AF_SHIFT) +# define GPIO_AF7 (7 << GPIO_AF_SHIFT) +# define GPIO_AF8 (8 << GPIO_AF_SHIFT) +# define GPIO_AF9 (9 << GPIO_AF_SHIFT) +# define GPIO_AF10 (10 << GPIO_AF_SHIFT) +# define GPIO_AF11 (11 << GPIO_AF_SHIFT) +# define GPIO_AF12 (12 << GPIO_AF_SHIFT) +# define GPIO_AF13 (13 << GPIO_AF_SHIFT) +# define GPIO_AF14 (14 << GPIO_AF_SHIFT) +# define GPIO_AF15 (15 << GPIO_AF_SHIFT) + +/* Output/Alt function drive current selection: + * + * 1111 1111 1100 0000 0000 + * 9876 5432 1098 7654 3210 + * ---- ---- ---- ---- ---- + * .... .... DD.. .... .... + */ + +#define GPIO_DRIVE_SHIFT (10) /* Bits 10-11: GPIO drive current selection */ +#define GPIO_DRIVE_MASK (3 << GPIO_DRIVE_SHIFT) +# define GPIO_DRIVE_2mA (0 << GPIO_DRIVE_SHIFT) /* 2 mA Low drive current output */ +# define GPIO_DRIVE_4mA (2 << GPIO_DRIVE_SHIFT) /* 4 mA Medium drive current output */ +# define GPIO_DRIVE_8mA (1 << GPIO_DRIVE_SHIFT) /* 8 mA Fast drive current output */ +# define GPIO_DRIVE_12mA (3 << GPIO_DRIVE_SHIFT) /* 12 mA High drive current output */ + +/* Output/Alt function type selection: + * + * 1111 1111 1100 0000 0000 + * 9876 5432 1098 7654 3210 + * ---- ---- ---- ---- ---- + * .... .... ..O. .... .... + */ + +#define GPIO_OPENDRAIN (1 << 9) /* Bit9: 1=Open-drain output */ +#define GPIO_PUSHPULL (0) /* Bit9: 0=Push-pull output */ + +/* Output/Alt function slew rate selection: + * + * 1111 1111 1100 0000 0000 + * 9876 5432 1098 7654 3210 + * ---- ---- ---- ---- ---- + * .... .... ...S .... .... + */ + +#define GPIO_SLEW_RATE_SLOW (1 << 8) /* Bit 8: If output, initial value of output */ +#define GPIO_SLEW_RATE_FAST (0) + +/* This identifies the GPIO port: + * + * 1111 1111 1100 0000 0000 + * 9876 5432 1098 7654 3210 + * ---- ---- ---- ---- ---- + * .... .... .... PPPP .... + */ + +#define GPIO_PORT_SHIFT (4) /* Bit 4-7: Port number */ +#define GPIO_PORT_MASK (15 << GPIO_PORT_SHIFT) + +# define GPIO_PORTA (0 << GPIO_PORT_SHIFT) /* GPIOA */ +# define GPIO_PORTB (1 << GPIO_PORT_SHIFT) /* GPIOB */ +# define GPIO_PORTC (2 << GPIO_PORT_SHIFT) /* GPIOC */ +# define GPIO_PORTD (3 << GPIO_PORT_SHIFT) /* GPIOD */ +#if N32H7_NGPIO > 4 +# define GPIO_PORTE (4 << GPIO_PORT_SHIFT) /* GPIOE */ +#endif +#if N32H7_NGPIO > 5 +# define GPIO_PORTF (5 << GPIO_PORT_SHIFT) /* GPIOF */ +#endif +#if N32H7_NGPIO > 6 +# define GPIO_PORTG (6 << GPIO_PORT_SHIFT) /* GPIOG */ +#endif +#if N32H7_NGPIO > 7 +# define GPIO_PORTH (7 << GPIO_PORT_SHIFT) /* GPIOH */ +#endif +#if N32H7_NGPIO > 8 +# define GPIO_PORTI (8 << GPIO_PORT_SHIFT) /* GPIOI */ +#endif +#if N32H7_NGPIO > 9 +# define GPIO_PORTJ (9 << GPIO_PORT_SHIFT) /* GPIOJ */ +#endif +#if N32H7_NGPIO > 10 +# define GPIO_PORTK (10 << GPIO_PORT_SHIFT) /* GPIOK */ +#endif + +/* This identifies the bit in the port: + * + * 1111 1111 1100 0000 0000 + * 9876 5432 1098 7654 3210 + * ---- ---- ---- ---- ---- + * .... .... .... .... BBBB + */ + +#define GPIO_PIN_SHIFT (0) /* Bits 0-3: GPIO number: 0-15 */ +#define GPIO_PIN_MASK (15 << GPIO_PIN_SHIFT) +# define GPIO_PIN0 (0 << GPIO_PIN_SHIFT) +# define GPIO_PIN1 (1 << GPIO_PIN_SHIFT) +# define GPIO_PIN2 (2 << GPIO_PIN_SHIFT) +# define GPIO_PIN3 (3 << GPIO_PIN_SHIFT) +# define GPIO_PIN4 (4 << GPIO_PIN_SHIFT) +# define GPIO_PIN5 (5 << GPIO_PIN_SHIFT) +# define GPIO_PIN6 (6 << GPIO_PIN_SHIFT) +# define GPIO_PIN7 (7 << GPIO_PIN_SHIFT) +# define GPIO_PIN8 (8 << GPIO_PIN_SHIFT) +# define GPIO_PIN9 (9 << GPIO_PIN_SHIFT) +# define GPIO_PIN10 (10 << GPIO_PIN_SHIFT) +# define GPIO_PIN11 (11 << GPIO_PIN_SHIFT) +# define GPIO_PIN12 (12 << GPIO_PIN_SHIFT) +# define GPIO_PIN13 (13 << GPIO_PIN_SHIFT) +# define GPIO_PIN14 (14 << GPIO_PIN_SHIFT) +# define GPIO_PIN15 (15 << GPIO_PIN_SHIFT) + +/**************************************************************************** + * Public Data + ****************************************************************************/ + +#ifndef __ASSEMBLY__ + +#undef EXTERN +#if defined(__cplusplus) +#define EXTERN extern "C" +extern "C" +{ +#else +#define EXTERN extern +#endif + +/* Base addresses for each GPIO block */ + +EXTERN const uint32_t g_gpiobase[N32H7_NGPIO]; + +/**************************************************************************** + * Public Function Prototypes + ****************************************************************************/ + +/**************************************************************************** + * Name: n32_configgpio + * + * Description: + * Configure a GPIO pin based on bit-encoded description of the pin. + * Once it is configured as Alternative (GPIO_ALT|GPIO_CNF_AFPP|...) + * function, it must be unconfigured with n32_unconfiggpio() with + * the same cfgset first before it can be set to non-alternative function. + * + * Returned Value: + * OK on success + * ERROR on invalid port, or when pin is locked as ALT function. + * + ****************************************************************************/ + +int n32_configgpio(uint32_t cfgset); + +/**************************************************************************** + * Name: n32_unconfiggpio + * + * Description: + * Unconfigure a GPIO pin based on bit-encoded description of the pin, set + * it into default HiZ state (and possibly mark it's unused) and unlock it + * whether it was previously selected as alternative function + * (GPIO_ALT|GPIO_CNF_AFPP|...). + * + * This is a safety function and prevents hardware from shocks, as + * unexpected write to the Timer Channel Output GPIO to fixed '1' or '0' + * while it should operate in PWM mode could produce excessive on-board + * currents and trigger over-current/alarm function. + * + * Returned Value: + * OK on success + * ERROR on invalid port + * + ****************************************************************************/ + +int n32_unconfiggpio(uint32_t cfgset); + +/**************************************************************************** + * Name: n32_gpiowrite + * + * Description: + * Write one or zero to the selected GPIO pin + * + ****************************************************************************/ + +void n32_gpiowrite(uint32_t pinset, bool value); + +/**************************************************************************** + * Name: n32_gpioread + * + * Description: + * Read one or zero from the selected GPIO pin + * + ****************************************************************************/ + +bool n32_gpioread(uint32_t pinset); + +/**************************************************************************** + * Name: n32_gpiosetevent + * + * Description: + * Sets/clears GPIO based event and interrupt triggers. + * + * Input Parameters: + * - pinset: GPIO pin configuration + * - risingedge: Enables interrupt on rising edges + * - fallingedge: Enables interrupt on falling edges + * - event: Generate event when set + * - func: When non-NULL, generate interrupt + * - arg: Argument passed to the interrupt callback + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure indicating the + * nature of the failure. + * + ****************************************************************************/ + +int n32_gpiosetevent(uint32_t pinset, bool risingedge, bool fallingedge, + bool event, xcpt_t func, void *arg); + +/**************************************************************************** + * Function: n32_dumpgpio + * + * Description: + * Dump all GPIO registers associated with the provided base address + * + ****************************************************************************/ + +#ifdef CONFIG_DEBUG_GPIO_INFO +int n32_dumpgpio(uint32_t pinset, const char *msg); +#else +# define n32_dumpgpio(p,m) +#endif + +/**************************************************************************** + * Function: n32_gpioinit + * + * Description: + * Based on configuration within the .config file, it does: + * - Remaps positions of alternative functions. + * + * Typically called from n32_start(). + * + ****************************************************************************/ + +void n32_gpioinit(void); + +#undef EXTERN +#if defined(__cplusplus) +} +#endif + +#endif /* __ASSEMBLY__ */ +#endif /* __ARCH_ARM_SRC_N32H7_N32_GPIO_H */ diff --git a/arch/arm/src/n32h7/n32_idle.c b/arch/arm/src/n32h7/n32_idle.c new file mode 100644 index 0000000000000..fcbc1868e53f8 --- /dev/null +++ b/arch/arm/src/n32h7/n32_idle.c @@ -0,0 +1,189 @@ +/**************************************************************************** + * arch/arm/src/n32h7/n32_idle.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include +#include + +#include +#include +#include + +#include + +#include "chip.h" +#include "n32_pm.h" +#include "arm_internal.h" + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* Does the board support an IDLE LED to indicate that the board is in the + * IDLE state? + */ + +#if defined(CONFIG_ARCH_LEDS) && defined(LED_IDLE) +# define BEGIN_IDLE() board_autoled_on(LED_IDLE) +# define END_IDLE() board_autoled_off(LED_IDLE) +#else +# define BEGIN_IDLE() +# define END_IDLE() +#endif + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: up_idlepm + * + * Description: + * Perform IDLE state power management. + * + ****************************************************************************/ + +#ifdef CONFIG_PM +static void up_idlepm(void) +{ + static enum pm_state_e oldstate = PM_NORMAL; + enum pm_state_e newstate; + irqstate_t flags; + int ret; + + /* Decide, which power saving level can be obtained */ + + newstate = pm_checkstate(PM_IDLE_DOMAIN); + + /* Check for state changes */ + + if (newstate != oldstate) + { + flags = enter_critical_section(); + + /* Perform board-specific, state-dependent logic here */ + + _info("newstate= %d oldstate=%d\n", newstate, oldstate); + + /* Then force the global state change */ + + ret = pm_changestate(PM_IDLE_DOMAIN, newstate); + if (ret < 0) + { + /* The new state change failed, revert to the preceding state */ + + pm_changestate(PM_IDLE_DOMAIN, oldstate); + } + else + { + /* Save the new state */ + + oldstate = newstate; + } + + /* MCU-specific power management logic */ + + switch (newstate) + { + case PM_NORMAL: + break; + + case PM_IDLE: + break; + + case PM_STANDBY: + n32_pmstandby(); + break; + + case PM_SLEEP: + n32_pmsleep(false); + break; + + default: + break; + } + + leave_critical_section(flags); + } +} +#else +# define up_idlepm() +#endif + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: up_idle + * + * Description: + * up_idle() is the logic that will be executed when there is no other + * ready-to-run task. This is processor idle time and will continue until + * some interrupt occurs to cause a context switch from the idle task. + * + * Processing in this state may be processor-specific. e.g., this is where + * power management operations might be performed. + * + ****************************************************************************/ + +void up_idle(void) +{ +#if defined(CONFIG_SUPPRESS_INTERRUPTS) || defined(CONFIG_SUPPRESS_TIMER_INTS) + /* If the system is idle and there are no timer interrupts, then process + * "fake" timer interrupts. Hopefully, something will wake up. + */ + + nxsched_process_timer(); +#else + + /* Perform IDLE mode power management */ + + up_idlepm(); + + /* Sleep until an interrupt occurs to save power. + * + * + * "2.17.11 Ethernet DMA not working after WFI/WFE instruction + * Description + * If a WFI/WFE instruction is executed to put the system in sleep mode + * while the Ethernet MAC master clock on the AHB bus matrix is ON and + * all remaining masters clocks are OFF, the Ethernet DMA will be not + * able to perform any AHB master accesses during sleep mode." + * + * Workaround + * Enable DMA1 or DMA2 clocks in the RCC_AHBENR register before + * executing the WFI/WFE instruction." + * + */ + +#if 0 + BEGIN_IDLE(); + asm("WFI"); + END_IDLE(); +#endif +#endif +} diff --git a/arch/arm/src/n32h7/n32_irq.c b/arch/arm/src/n32h7/n32_irq.c new file mode 100644 index 0000000000000..28d31449ce847 --- /dev/null +++ b/arch/arm/src/n32h7/n32_irq.c @@ -0,0 +1,815 @@ +/**************************************************************************** + * arch/arm/src/n32h7/n32_irq.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include +#include + +#include +#include + +#include +#include + +#include "nvic.h" +#include "ram_vectors.h" +#include "arm_internal.h" + +#ifdef CONFIG_N32H7_GPIO_IRQ +# include "n32_gpio.h" +#endif + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* Get a 32-bit version of the default priority */ + +#define DEFPRIORITY32 \ + ( NVIC_SYSH_PRIORITY_DEFAULT << 24 | \ + NVIC_SYSH_PRIORITY_DEFAULT << 16 | \ + NVIC_SYSH_PRIORITY_DEFAULT << 8 | \ + NVIC_SYSH_PRIORITY_DEFAULT) + +#define SYSPRIORITY32 \ + ( ((NVIC_SYSH_PRIORITY_MAX+NVIC_SYSH_PRIORITY_STEP) << 24) | \ + ((NVIC_SYSH_PRIORITY_MAX+NVIC_SYSH_PRIORITY_STEP) << 16) | \ + ((NVIC_SYSH_PRIORITY_MAX+NVIC_SYSH_PRIORITY_STEP) << 8) | \ + ((NVIC_SYSH_PRIORITY_MAX+NVIC_SYSH_PRIORITY_STEP))) + +/* Given the address of a NVIC ENABLE register, this is the offset to + * the corresponding CLEAR ENABLE register. + */ + +#define NVIC_ENA_OFFSET (0) +#define NVIC_CLRENA_OFFSET (NVIC_IRQ0_31_CLEAR - NVIC_IRQ0_31_ENABLE) + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: n32_dumpnvic + * + * Description: + * Dump some interesting NVIC registers + * + ****************************************************************************/ + +#if defined(CONFIG_DEBUG_IRQ_INFO) +static void n32_dumpnvic(const char *msg, int irq) +{ + irqstate_t flags; + + flags = enter_critical_section(); + + irqinfo("NVIC (%s, irq=%d):\n", msg, irq); + irqinfo(" INTCTRL: %08x VECTAB: %08x\n", + getreg32(NVIC_INTCTRL), getreg32(NVIC_VECTAB)); +#if 0 + irqinfo(" SYSH ENABLE MEMFAULT: %08x BUSFAULT: %08x USGFAULT: %08x " + "SYSTICK: %08x\n", + getreg32(NVIC_SYSHCON_MEMFAULTENA), + getreg32(NVIC_SYSHCON_BUSFAULTENA), + getreg32(NVIC_SYSHCON_USGFAULTENA), + getreg32(NVIC_SYSTICK_CTRL_ENABLE)); +#endif + irqinfo(" IRQ ENABLE: %08x %08x %08x\n", + getreg32(NVIC_IRQ0_31_ENABLE), + getreg32(NVIC_IRQ32_63_ENABLE), + getreg32(NVIC_IRQ64_95_ENABLE)); + irqinfo(" SYSH_PRIO: %08x %08x %08x\n", + getreg32(NVIC_SYSH4_7_PRIORITY), + getreg32(NVIC_SYSH8_11_PRIORITY), + getreg32(NVIC_SYSH12_15_PRIORITY)); + irqinfo(" IRQ PRIO: %08x %08x %08x %08x\n", + getreg32(NVIC_IRQ0_3_PRIORITY), + getreg32(NVIC_IRQ4_7_PRIORITY), + getreg32(NVIC_IRQ8_11_PRIORITY), + getreg32(NVIC_IRQ12_15_PRIORITY)); +#if N32H7_IRQ_NEXTINTS > 15 + irqinfo(" %08x %08x %08x %08x\n", + getreg32(NVIC_IRQ16_19_PRIORITY), + getreg32(NVIC_IRQ20_23_PRIORITY), + getreg32(NVIC_IRQ24_27_PRIORITY), + getreg32(NVIC_IRQ28_31_PRIORITY)); +#endif +#if N32H7_IRQ_NEXTINTS > 31 + irqinfo(" %08x %08x %08x %08x\n", + getreg32(NVIC_IRQ32_35_PRIORITY), + getreg32(NVIC_IRQ36_39_PRIORITY), + getreg32(NVIC_IRQ40_43_PRIORITY), + getreg32(NVIC_IRQ44_47_PRIORITY)); +#endif +#if N32H7_IRQ_NEXTINTS > 47 + irqinfo(" %08x %08x %08x %08x\n", + getreg32(NVIC_IRQ48_51_PRIORITY), + getreg32(NVIC_IRQ52_55_PRIORITY), + getreg32(NVIC_IRQ56_59_PRIORITY), + getreg32(NVIC_IRQ60_63_PRIORITY)); +#endif +#if N32H7_IRQ_NEXTINTS > 63 + irqinfo(" %08x %08x %08x %08x\n", + getreg32(NVIC_IRQ64_67_PRIORITY), + getreg32(NVIC_IRQ68_71_PRIORITY), + getreg32(NVIC_IRQ72_75_PRIORITY), + getreg32(NVIC_IRQ76_79_PRIORITY)); +#endif +#if N32H7_IRQ_NEXTINTS > 79 + irqinfo(" %08x %08x %08x %08x\n", + getreg32(NVIC_IRQ80_83_PRIORITY), + getreg32(NVIC_IRQ84_87_PRIORITY), + getreg32(NVIC_IRQ88_91_PRIORITY), + getreg32(NVIC_IRQ92_95_PRIORITY)); +#endif +#if N32H7_IRQ_NEXTINTS > 95 + irqinfo(" %08x %08x %08x %08x\n", + getreg32(NVIC_IRQ96_99_PRIORITY), + getreg32(NVIC_IRQ100_103_PRIORITY), + getreg32(NVIC_IRQ104_107_PRIORITY), + getreg32(NVIC_IRQ108_111_PRIORITY)); +#endif +#if N32H7_IRQ_NEXTINTS > 111 + irqinfo(" %08x %08x %08x %08x\n", + getreg32(NVIC_IRQ112_115_PRIORITY), + getreg32(NVIC_IRQ116_119_PRIORITY), + getreg32(NVIC_IRQ120_123_PRIORITY), + getreg32(NVIC_IRQ124_127_PRIORITY)); +#endif +#if N32H7_IRQ_NEXTINTS > 127 + irqinfo(" %08x %08x %08x %08x\n", + getreg32(NVIC_IRQ128_131_PRIORITY), + getreg32(NVIC_IRQ132_135_PRIORITY), + getreg32(NVIC_IRQ136_139_PRIORITY), + getreg32(NVIC_IRQ140_143_PRIORITY)); +#endif +#if N32H7_IRQ_NEXTINTS > 143 + irqinfo(" %08x %08x %08x %08x\n", + getreg32(NVIC_IRQ144_147_PRIORITY), + getreg32(NVIC_IRQ148_151_PRIORITY), + getreg32(NVIC_IRQ152_155_PRIORITY), + getreg32(NVIC_IRQ156_159_PRIORITY)); +#endif +#if N32H7_IRQ_NEXTINTS > 159 + irqinfo(" %08x %08x %08x %08x\n", + getreg32(NVIC_IRQ160_163_PRIORITY), + getreg32(NVIC_IRQ164_167_PRIORITY), + getreg32(NVIC_IRQ168_171_PRIORITY), + getreg32(NVIC_IRQ172_175_PRIORITY)); +#endif +#if N32H7_IRQ_NEXTINTS > 175 + irqinfo(" %08x %08x %08x %08x\n", + getreg32(NVIC_IRQ176_179_PRIORITY), + getreg32(NVIC_IRQ180_183_PRIORITY), + getreg32(NVIC_IRQ184_187_PRIORITY), + getreg32(NVIC_IRQ188_191_PRIORITY)); +#endif +#if N32H7_IRQ_NEXTINTS > 191 + irqinfo(" %08x %08x %08x %08x\n", + getreg32(NVIC_IRQ192_195_PRIORITY), + getreg32(NVIC_IRQ196_199_PRIORITY), + getreg32(NVIC_IRQ200_203_PRIORITY), + getreg32(NVIC_IRQ204_207_PRIORITY)); +#endif +#if N32H7_IRQ_NEXTINTS > 207 + irqinfo(" %08x %08x %08x %08x\n", + getreg32(NVIC_IRQ208_211_PRIORITY), + getreg32(NVIC_IRQ212_215_PRIORITY), + getreg32(NVIC_IRQ216_219_PRIORITY), + getreg32(NVIC_IRQ220_223_PRIORITY)); +#endif +#if N32H7_IRQ_NEXTINTS > 223 + irqinfo(" %08x %08x %08x\n", + getreg32(NVIC_IRQ224_227_PRIORITY), + getreg32(NVIC_IRQ228_231_PRIORITY), + getreg32(NVIC_IRQ232_235_PRIORITY)); +#else +# error "Missing logic" +#endif + + /* TODO: Make sure this covers all interrupts that are available. */ + + leave_critical_section(flags); +} +#else +# define n32_dumpnvic(msg, irq) +#endif + +/**************************************************************************** + * Name: n32_nmi, n32_pendsv, n32_pendsv, n32_reserved + * + * Description: + * Handlers for various exceptions. None are handled and all are fatal + * error conditions. The only advantage these provided over the default + * unexpected interrupt handler is that they provide a diagnostic output. + * + ****************************************************************************/ + +#ifdef CONFIG_DEBUG_FEATURES +static int n32_nmi(int irq, void *context, void *arg) +{ + up_irq_save(); + _err("PANIC!!! NMI received\n"); + PANIC(); + return 0; +} + +static int n32_pendsv(int irq, void *context, void *arg) +{ + up_irq_save(); + _err("PANIC!!! PendSV received\n"); + PANIC(); + return 0; +} + +static int n32_reserved(int irq, void *context, void *arg) +{ + up_irq_save(); + _err("PANIC!!! Reserved interrupt\n"); + PANIC(); + return 0; +} +#endif + +/**************************************************************************** + * Name: n32_prioritize_syscall + * + * Description: + * Set the priority of an exception. This function may be needed + * internally even if support for prioritized interrupts is not enabled. + * + ****************************************************************************/ + +static inline void n32_prioritize_syscall(int priority) +{ + uint32_t regval; + + /* SVCALL is system handler 11 */ + + regval = getreg32(NVIC_SYSH8_11_PRIORITY); + regval &= ~NVIC_SYSH_PRIORITY_PR11_MASK; + regval |= (priority << NVIC_SYSH_PRIORITY_PR11_SHIFT); + putreg32(regval, NVIC_SYSH8_11_PRIORITY); +} + +/**************************************************************************** + * Name: n32_irqinfo + * + * Description: + * Given an IRQ number, provide the register and bit setting to enable or + * disable the irq. + * + ****************************************************************************/ + +static int n32_irqinfo(int irq, uintptr_t *regaddr, uint32_t *bit, + uintptr_t offset) +{ + unsigned int extint = irq - N32_IRQ_FIRST; + + DEBUGASSERT(irq >= N32_IRQ_NMI && irq < NR_IRQS); + + /* Check for external interrupt */ + + if (irq >= N32_IRQ_FIRST) + { +#if N32H7_IRQ_NEXTINTS <= 32 + if (extint < N32H7_IRQ_NEXTINTS) + { + *regaddr = (NVIC_IRQ0_31_ENABLE + offset); + *bit = 1 << extint; + } + else +#elif N32H7_IRQ_NEXTINTS <= 64 + if (extint < 32) + { + *regaddr = (NVIC_IRQ0_31_ENABLE + offset); + *bit = 1 << extint; + } + else if (extint < N32H7_IRQ_NEXTINTS) + { + *regaddr = (NVIC_IRQ32_63_ENABLE + offset); + *bit = 1 << (extint - 32); + } + else +#elif N32H7_IRQ_NEXTINTS <= 96 + if (extint < 32) + { + *regaddr = (NVIC_IRQ0_31_ENABLE + offset); + *bit = 1 << extint; + } + else if (extint < 64) + { + *regaddr = (NVIC_IRQ32_63_ENABLE + offset); + *bit = 1 << (extint - 32); + } + else if (extint < N32H7_IRQ_NEXTINTS) + { + *regaddr = (NVIC_IRQ64_95_ENABLE + offset); + *bit = 1 << (extint - 64); + } + else +#elif N32H7_IRQ_NEXTINTS <= 128 + if (extint < 32) + { + *regaddr = (NVIC_IRQ0_31_ENABLE + offset); + *bit = 1 << extint; + } + else if (extint < 64) + { + *regaddr = (NVIC_IRQ32_63_ENABLE + offset); + *bit = 1 << (extint - 32); + } + else if (extint < 96) + { + *regaddr = (NVIC_IRQ64_95_ENABLE + offset); + *bit = 1 << (extint - 64); + } + else if (extint < N32H7_IRQ_NEXTINTS) + { + *regaddr = (NVIC_IRQ96_127_ENABLE + offset); + *bit = 1 << (extint - 96); + } + else +#elif N32H7_IRQ_NEXTINTS <= 160 + if (extint < 32) + { + *regaddr = (NVIC_IRQ0_31_ENABLE + offset); + *bit = 1 << extint; + } + else if (extint < 64) + { + *regaddr = (NVIC_IRQ32_63_ENABLE + offset); + *bit = 1 << (extint - 32); + } + else if (extint < 96) + { + *regaddr = (NVIC_IRQ64_95_ENABLE + offset); + *bit = 1 << (extint - 64); + } + else if (extint < 128) + { + *regaddr = (NVIC_IRQ96_127_ENABLE + offset); + *bit = 1 << (extint - 96); + } + else if (extint < N32H7_IRQ_NEXTINTS) + { + *regaddr = (NVIC_IRQ128_159_ENABLE + offset); + *bit = 1 << (extint - 128); + } + else +#elif N32H7_IRQ_NEXTINTS <= 192 + if (extint < 32) + { + *regaddr = (NVIC_IRQ0_31_ENABLE + offset); + *bit = 1 << extint; + } + else if (extint < 64) + { + *regaddr = (NVIC_IRQ32_63_ENABLE + offset); + *bit = 1 << (extint - 32); + } + else if (extint < 96) + { + *regaddr = (NVIC_IRQ64_95_ENABLE + offset); + *bit = 1 << (extint - 64); + } + else if (extint < 128) + { + *regaddr = (NVIC_IRQ96_127_ENABLE + offset); + *bit = 1 << (extint - 96); + } + else if (extint < 160) + { + *regaddr = (NVIC_IRQ128_159_ENABLE + offset); + *bit = 1 << (extint - 128); + } + else if (extint < N32H7_IRQ_NEXTINTS) + { + *regaddr = (NVIC_IRQ160_191_ENABLE + offset); + *bit = 1 << (extint - 160); + } + else +#elif N32H7_IRQ_NEXTINTS <= 224 + if (extint < 32) + { + *regaddr = (NVIC_IRQ0_31_ENABLE + offset); + *bit = 1 << extint; + } + else if (extint < 64) + { + *regaddr = (NVIC_IRQ32_63_ENABLE + offset); + *bit = 1 << (extint - 32); + } + else if (extint < 96) + { + *regaddr = (NVIC_IRQ64_95_ENABLE + offset); + *bit = 1 << (extint - 64); + } + else if (extint < 128) + { + *regaddr = (NVIC_IRQ96_127_ENABLE + offset); + *bit = 1 << (extint - 96); + } + else if (extint < 160) + { + *regaddr = (NVIC_IRQ128_159_ENABLE + offset); + *bit = 1 << (extint - 128); + } + else if (extint < 192) + { + *regaddr = (NVIC_IRQ160_191_ENABLE + offset); + *bit = 1 << (extint - 160); + } + else if (extint < N32H7_IRQ_NEXTINTS) + { + *regaddr = (NVIC_IRQ192_223_ENABLE + offset); + *bit = 1 << (extint - 192); + } + else +#elif N32H7_IRQ_NEXTINTS <= 256 + if (extint < 32) + { + *regaddr = (NVIC_IRQ0_31_ENABLE + offset); + *bit = 1 << extint; + } + else if (extint < 64) + { + *regaddr = (NVIC_IRQ32_63_ENABLE + offset); + *bit = 1 << (extint - 32); + } + else if (extint < 96) + { + *regaddr = (NVIC_IRQ64_95_ENABLE + offset); + *bit = 1 << (extint - 64); + } + else if (extint < 128) + { + *regaddr = (NVIC_IRQ96_127_ENABLE + offset); + *bit = 1 << (extint - 96); + } + else if (extint < 160) + { + *regaddr = (NVIC_IRQ128_159_ENABLE + offset); + *bit = 1 << (extint - 128); + } + else if (extint < 192) + { + *regaddr = (NVIC_IRQ160_191_ENABLE + offset); + *bit = 1 << (extint - 160); + } + else if (extint < N32H7_IRQ_NEXTINTS) + { + *regaddr = (NVIC_IRQ192_223_ENABLE + offset); + *bit = 1 << (extint - 192); + } + else +#else +# warning Missing logic +#endif + { + return ERROR; /* Invalid interrupt */ + } + } + + /* Handle processor exceptions. Only a few can be disabled */ + + else + { + *regaddr = NVIC_SYSHCON; + if (irq == N32_IRQ_MEMFAULT) + { + *bit = NVIC_SYSHCON_MEMFAULTENA; + } + else if (irq == N32_IRQ_BUSFAULT) + { + *bit = NVIC_SYSHCON_BUSFAULTENA; + } + else if (irq == N32_IRQ_USAGEFAULT) + { + *bit = NVIC_SYSHCON_USGFAULTENA; + } + else if (irq == N32_IRQ_SYSTICK) + { + *regaddr = NVIC_SYSTICK_CTRL; + *bit = NVIC_SYSTICK_CTRL_ENABLE; + } + else + { + return ERROR; /* Invalid or unsupported exception */ + } + } + + return OK; +} + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: up_irqinitialize + * + * Description: + * Initialize the NVIC interrupt controller. + * + ****************************************************************************/ + +void up_irqinitialize(void) +{ + uintptr_t regaddr; + int nintlines; + int i; + + /* The NVIC ICTR register (bits 0-4) holds the number of interrupt + * lines that the NVIC supports, defined in groups of 32. That is, + * the total number of interrupt lines is up to (32*(INTLINESNUM+1)). + * + * 0 -> 32 interrupt lines, 1 enable register, 8 priority registers + * 1 -> 64 " " " ", 2 enable registers, 16 priority registers + * 2 -> 96 " " " ", 3 enable registers, 24 priority registers + * ... + */ + + nintlines = (getreg32(NVIC_ICTR) & NVIC_ICTR_INTLINESNUM_MASK) + 1; + + /* Disable all interrupts. There are nintlines interrupt enable + * registers. + */ + + for (i = nintlines, regaddr = NVIC_IRQ0_31_CLEAR; + i > 0; + i--, regaddr += 4) + { + putreg32(0xffffffff, regaddr); + } + + /* Make sure that we are using the correct vector table. The default + * vector address is 0x0000:0000 but if we are executing code that is + * positioned in SRAM or in external FLASH, then we may need to reset + * the interrupt vector so that it refers to the table in SRAM or in + * external FLASH. + */ + + putreg32((uint32_t)_vectors, NVIC_VECTAB); + +#ifdef CONFIG_ARCH_RAMVECTORS + /* If CONFIG_ARCH_RAMVECTORS is defined, then we are using a RAM-based + * vector table that requires special initialization. + */ + + arm_ramvec_initialize(); +#endif + + /* Set all interrupts (and exceptions) to the default priority */ + + putreg32(SYSPRIORITY32, NVIC_SYSH4_7_PRIORITY); + putreg32(DEFPRIORITY32, NVIC_SYSH8_11_PRIORITY); + putreg32(DEFPRIORITY32, NVIC_SYSH12_15_PRIORITY); + + /* Now set all of the interrupt lines to the default priority. There are + * nintlines * 8 priority registers. + */ + + for (i = (nintlines << 3), regaddr = NVIC_IRQ0_3_PRIORITY; + i > 0; + i--, regaddr += 4) + { + putreg32(DEFPRIORITY32, regaddr); + } + + /* Attach the SVCall and Hard Fault exception handlers. The SVCall + * exception is used for performing context switches; The Hard Fault + * must also be caught because a SVCall may show up as a Hard Fault + * under certain conditions. + */ + + irq_attach(N32_IRQ_SVCALL, arm_svcall, NULL); + irq_attach(N32_IRQ_HARDFAULT, arm_hardfault, NULL); + + /* Set the priority of the SVCall interrupt */ + +#ifdef CONFIG_ARCH_IRQPRIO + /* up_prioritize_irq(N32_IRQ_PENDSV, NVIC_SYSH_PRIORITY_MIN); */ +#endif + n32_prioritize_syscall(NVIC_SYSH_SVCALL_PRIORITY); + + /* If the MPU is enabled, then attach and enable the Memory Management + * Fault handler. + */ + +#ifdef CONFIG_ARM_MPU + irq_attach(N32_IRQ_MEMFAULT, arm_memfault, NULL); + up_enable_irq(N32_IRQ_MEMFAULT); +#endif + + /* Attach all other processor exceptions (except reset and sys tick) */ + +#ifdef CONFIG_DEBUG_FEATURES + irq_attach(N32_IRQ_NMI, n32_nmi, NULL); +#ifndef CONFIG_ARM_MPU + irq_attach(N32_IRQ_MEMFAULT, arm_memfault, NULL); +#endif + irq_attach(N32_IRQ_BUSFAULT, arm_busfault, NULL); + irq_attach(N32_IRQ_USAGEFAULT, arm_usagefault, NULL); + irq_attach(N32_IRQ_PENDSV, n32_pendsv, NULL); + arm_enable_dbgmonitor(); + irq_attach(N32_IRQ_DBGMONITOR, arm_dbgmonitor, NULL); + irq_attach(N32_IRQ_RESERVED, n32_reserved, NULL); +#endif + + n32_dumpnvic("initial", NR_IRQS); + +#ifndef CONFIG_SUPPRESS_INTERRUPTS + /* Initialize logic to support a second level of interrupt decoding for + * GPIO pins. + */ + +#ifdef CONFIG_N32H7_GPIO_IRQ + n32_gpioirqinitialize(); +#endif + + /* And finally, enable interrupts */ + + up_irq_enable(); +#endif +} + +/**************************************************************************** + * Name: up_disable_irq + * + * Description: + * Disable the IRQ specified by 'irq' + * + ****************************************************************************/ + +void up_disable_irq(int irq) +{ + uintptr_t regaddr; + uint32_t regval; + uint32_t bit; + + if (n32_irqinfo(irq, ®addr, &bit, NVIC_CLRENA_OFFSET) == 0) + { + /* Modify the appropriate bit in the register to disable the interrupt. + * For normal interrupts, we need to set the bit in the associated + * Interrupt Clear Enable register. For other exceptions, we need to + * clear the bit in the System Handler Control and State Register. + */ + + if (irq >= N32_IRQ_FIRST) + { + putreg32(bit, regaddr); + } + else + { + regval = getreg32(regaddr); + regval &= ~bit; + putreg32(regval, regaddr); + } + } +#ifdef CONFIG_N32H7_GPIO_IRQ + else + { + /* Maybe it is a (derived) GPIO IRQ */ + + n32_gpioirqdisable(irq); + } +#endif + +#if 0 /* Might be useful in early bring-up */ + n32_dumpnvic("disable", irq); +#endif +} + +/**************************************************************************** + * Name: up_enable_irq + * + * Description: + * Enable the IRQ specified by 'irq' + * + ****************************************************************************/ + +void up_enable_irq(int irq) +{ + uintptr_t regaddr; + uint32_t regval; + uint32_t bit; + + if (n32_irqinfo(irq, ®addr, &bit, NVIC_ENA_OFFSET) == 0) + { + /* Modify the appropriate bit in the register to enable the interrupt. + * For normal interrupts, we need to set the bit in the associated + * Interrupt Set Enable register. For other exceptions, we need to + * set the bit in the System Handler Control and State Register. + */ + + if (irq >= N32_IRQ_FIRST) + { + putreg32(bit, regaddr); + } + else + { + regval = getreg32(regaddr); + regval |= bit; + putreg32(regval, regaddr); + } + } +#ifdef CONFIG_N32H7_GPIO_IRQ + else + { + /* Maybe it is a (derived) GPIO IRQ */ + + n32_gpioirqenable(irq); + } +#endif + +#if 0 /* Might be useful in early bring-up */ + n32_dumpnvic("enable", irq); +#endif +} + +/**************************************************************************** + * Name: arm_ack_irq + * + * Description: + * Acknowledge the IRQ + * + ****************************************************************************/ + +void arm_ack_irq(int irq) +{ +} + +/**************************************************************************** + * Name: up_prioritize_irq + * + * Description: + * Set the priority of an IRQ. + * + * Since this API is not supported on all architectures, it should be + * avoided in common implementations where possible. + * + ****************************************************************************/ + +#ifdef CONFIG_ARCH_IRQPRIO +int up_prioritize_irq(int irq, int priority) +{ + uint32_t regaddr; + uint32_t regval; + int shift; + + DEBUGASSERT(irq >= N32_IRQ_MEMFAULT && irq < NR_IRQS && + (unsigned)priority <= NVIC_SYSH_PRIORITY_MIN); + + if (irq < N32_IRQ_FIRST) + { + /* NVIC_SYSH_PRIORITY() maps {0..15} to one of three priority + * registers (0-3 are invalid) + */ + + regaddr = NVIC_SYSH_PRIORITY(irq); + irq -= 4; + } + else + { + /* NVIC_IRQ_PRIORITY() maps {0..} to one of many priority registers */ + + irq -= N32_IRQ_FIRST; + regaddr = NVIC_IRQ_PRIORITY(irq); + } + + regval = getreg32(regaddr); + shift = ((irq & 3) << 3); + regval &= ~(0xff << shift); + regval |= (priority << shift); + putreg32(regval, regaddr); + + n32_dumpnvic("prioritize", irq); + return OK; +} +#endif diff --git a/arch/arm/src/n32h7/n32_lowputc.c b/arch/arm/src/n32h7/n32_lowputc.c new file mode 100644 index 0000000000000..d1c37758adba4 --- /dev/null +++ b/arch/arm/src/n32h7/n32_lowputc.c @@ -0,0 +1,274 @@ +/**************************************************************************** + * arch/arm/src/n32h7/n32_lowputc.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include + +#include "arm_internal.h" +#include "chip.h" + +#include "hardware/n32h7_pinmap.h" +#include "hardware/n32h7_uart.h" +#include "n32_lowputc.h" +#include "n32_rcc.h" +#include "n32_gpio.h" +#include "n32_uart.h" + +#include + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* Select USART parameters for the selected console */ + +#ifdef HAVE_CONSOLE +# if defined(CONFIG_USART1_SERIAL_CONSOLE) +# define N32_CONSOLE_BASE N32_USART1_BASE +# define N32_AHBCLOCK N32_AHB_FREQUENCY +# define N32_CONSOLE_APBREG N32_RCC_APB1EN3 +# define N32_CONSOLE_APBEN RCC_APB1EN3_M7USART1EN +# define N32_CONSOLE_BAUD CONFIG_USART1_BAUD +# define N32_CONSOLE_BITS CONFIG_USART1_BITS +# define N32_CONSOLE_PARITY CONFIG_USART1_PARITY +# define N32_CONSOLE_2STOP CONFIG_USART1_2STOP +# define N32_CONSOLE_TX GPIO_USART1_TX +# define N32_CONSOLE_RX GPIO_USART1_RX +# else +# error "No valid console configuration" +# endif + + /* CTRL1 settings */ + +# if N32_CONSOLE_BITS == 9 +# define CTRL1_WL USART_CTRL1_WL +# else /* N32_CONSOLE_BITS == 8 */ +# define CTRL1_WL 0b0 +# endif + +# if N32_CONSOLE_PARITY == 1 +# define CTRL1_PARITY (USART_CTRL1_PCEN | USART_CTRL1_PSEL) +# elif N32_CONSOLE_PARITY == 2 +# define CTRL1_PARITY USART_CTRL1_PCEN +# else +# define CTRL1_PARITY 0b00 +# endif + +# define USART_CTRL1_CLRBITS (USART_CTRL1_RXEN | USART_CTRL1_TXEN \ + |USART_CTRL1_PSEL | USART_CTRL1_PCEN \ + |USART_CTRL1_OSPM | USART_CTRL1_WL) + +# define USART_CTRL1_SETBITS (CTRL1_WL | CTRL1_PARITY ) + + /* CTRL2 settings */ + +# if N32_CONSOLE_2STOP != 0 +# define CTRL2_STOP2 USART_CTRL2_STPB(N32_CONSOLE_2STOP) +# else +# define CTRL2_STOP2 0b0 +# endif + +# define USART_CTRL2_CLRBITS (USART_CTRL2_STPB_MASK) + +# define USART_CTRL2_SETBITS CTRL2_STOP2 + + /* CTRL3 settings */ + +# define USART_CTRL3_CLRBITS (USART_CTRL3_CTSEN | USART_CTRL3_RTSEN) + +# define USART_CTRL3_SETBITS 0 + + /* Calculate USART BAUD rate divider */ + + /* Baud rate for standard USART (SPI mode included): + * + * In case of oversampling by 16, the equation is: + * baud = fCK / (16 * UARTDIV) + * UARTDIV = fCK / (16 * baud) + * + */ + +# define N32_USARTDIV16 \ + ((25 * (N32_AHBCLOCK / 4)) / (N32_CONSOLE_BAUD)) +# define N32_USARTDIV8 \ + ((25 * (N32_AHBCLOCK / 2)) / (N32_CONSOLE_BAUD)) + + /* Use oversampling by 8 only if the divisor is small. But what is + * small? + */ +# undef USE_OVER8 +# if N32_USARTDIV8 > 100 +# define N32_UART_DIV N32_USARTDIV16 +# else +# define USE_OVER8 1 +# define N32_UART_DIV \ + ((N32_USARTDIV8 & 0xfff0) | ((N32_USARTDIV8 & 0x000f) >> 1)) +# endif +#endif /* HAVE_CONSOLE */ + +/**************************************************************************** + * Private Types + ****************************************************************************/ + +/**************************************************************************** + * Private Function Prototypes + ****************************************************************************/ + +/**************************************************************************** + * Public Data + ****************************************************************************/ + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: arm_lowputc + * + * Desregvaliption: + * Output one byte on the serial console + * + ****************************************************************************/ + +void arm_lowputc(char ch) +{ +#ifdef HAVE_CONSOLE + + /* Wait until the TX data register is empty */ + + while ((getreg32(N32_CONSOLE_BASE + N32_USART_STS_OFFSET) & + USART_STS_TXDE) == 0); + + /* Then send the character */ + + putreg32((uint32_t)ch, N32_CONSOLE_BASE + N32_USART_DAT_OFFSET); + +#endif /* HAVE_CONSOLE */ +} + +/**************************************************************************** + * Name: n32_lowsetup + * + * Desregvaliption: + * This performs basic initialization of the USART used for the serial + * console. Its purpose is to get the console output available as soon + * as possible. + * + ****************************************************************************/ + +void n32_lowsetup(void) +{ +#if defined(HAVE_UART) +#if defined(HAVE_CONSOLE) && !defined(CONFIG_SUPPRESS_UART_CONFIG) + uint32_t regval; + uint32_t tmp; +#endif + +#if defined(HAVE_CONSOLE) + /* Enable USART APB1/2 clock */ + + modifyreg32(N32_CONSOLE_APBREG, 0, N32_CONSOLE_APBEN); +#endif + + /* Enable the console USART and configure GPIO pins needed for rx/tx. + * + * NOTE: Clocking for selected U[S]ARTs was already provided in n32_rcc.c + */ + +#ifdef N32_CONSOLE_TX + n32_configgpio(N32_CONSOLE_TX); +#endif +#ifdef N32_CONSOLE_RX + n32_configgpio(N32_CONSOLE_RX); +#endif + + /* Enable and configure the selected console device */ + +#if defined(HAVE_CONSOLE) && !defined(CONFIG_SUPPRESS_UART_CONFIG) + /* Configure CTRL2 */ + + regval = getreg32(N32_CONSOLE_BASE + N32_USART_CTRL2_OFFSET); + regval &= ~USART_CTRL2_CLRBITS; + regval |= USART_CTRL2_SETBITS; + putreg32(regval, N32_CONSOLE_BASE + N32_USART_CTRL2_OFFSET); + + /* Configure CTRL1 */ + + regval = getreg32(N32_CONSOLE_BASE + N32_USART_CTRL1_OFFSET); + regval &= ~USART_CTRL1_CLRBITS; + regval |= USART_CTRL1_SETBITS; +#ifdef USE_OVER8 + regval |= USART_CTRL1_OSPM; +#endif + putreg32(regval, N32_CONSOLE_BASE + N32_USART_CTRL1_OFFSET); + + /* Configure CTRL3 */ + + regval = getreg32(N32_CONSOLE_BASE + N32_USART_CTRL3_OFFSET); + regval &= ~USART_CTRL3_CLRBITS; + regval |= USART_CTRL3_SETBITS; + putreg32(regval, N32_CONSOLE_BASE + N32_USART_CTRL3_OFFSET); + + /* Configure the USART Baud Rate */ + + regval = (N32_UART_DIV / 100) << 4; + tmp = N32_UART_DIV - ((regval >> 4) * 100); +#ifdef USE_OVER8 + tmp = ((((tmp * 8) + 50) / 100)) & ((uint8_t)0x0f); + if (tmp == 0x08) + { + regval = regval | 0x10; + } + else + { + regval |= tmp; + } +#else + + /* Oversampling mode is 16 Samples */ + + regval += ((((tmp * 16) + 50) / 100)) & ((uint8_t)0x1f); +#endif + putreg32(regval, N32_CONSOLE_BASE + N32_USART_BRCF_OFFSET); + + /* Enable Rx, Tx and the USART */ + + regval = getreg32(N32_CONSOLE_BASE + N32_USART_CTRL1_OFFSET); + regval |= (USART_CTRL1_UEN | USART_CTRL1_TXEN | USART_CTRL1_RXEN); + putreg32(regval, N32_CONSOLE_BASE + N32_USART_CTRL1_OFFSET); + +#endif /* HAVE_CONSOLE && !CONFIG_SUPPRESS_UART_CONFIG */ +#endif /* HAVE_UART */ +} diff --git a/arch/arm/src/n32h7/n32_lowputc.h b/arch/arm/src/n32h7/n32_lowputc.h new file mode 100644 index 0000000000000..7c4104634c247 --- /dev/null +++ b/arch/arm/src/n32h7/n32_lowputc.h @@ -0,0 +1,64 @@ +/**************************************************************************** + * arch/arm/src/n32h7/n32_lowputc.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __ARCH_ARM_SRC_N32H7_N32_LOWPUTC_H +#define __ARCH_ARM_SRC_N32H7_N32_LOWPUTC_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +/**************************************************************************** + * Public Function Prototypes + ****************************************************************************/ + +#ifndef __ASSEMBLY__ + +#undef EXTERN +#if defined(__cplusplus) +#define EXTERN extern "C" +extern "C" +{ +#else +#define EXTERN extern +#endif + +/**************************************************************************** + * Name: n32_lowsetup + * + * Description: + * Called at the very beginning of _start. + * Performs low level initialization of serial console. + * + ****************************************************************************/ + +void n32_lowsetup(void); + +#undef EXTERN +#if defined(__cplusplus) +} +#endif + +#endif /* __ASSEMBLY__ */ +#endif /* __ARCH_ARM_SRC_N32H7_N32_LOWPUTC_H */ diff --git a/arch/arm/src/n32h7/n32_mpuinit.c b/arch/arm/src/n32h7/n32_mpuinit.c new file mode 100644 index 0000000000000..6541fa237d302 --- /dev/null +++ b/arch/arm/src/n32h7/n32_mpuinit.c @@ -0,0 +1,130 @@ +/**************************************************************************** + * arch/arm/src/n32h7/n32_mpuinit.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include +#include + +#ifdef CONFIG_BUILD_PROTECTED +# include +#endif + +#include "mpu.h" +#include "hardware/n32h7_memorymap.h" +#include "n32_mpuinit.h" +#include "arm_internal.h" + +#ifdef CONFIG_ARM_MPU + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +#ifdef CONFIG_RPTUN +# ifdef CONFIG_N32H7_SHMEM_SRAM3 +# define N32_SHMEM_BASE N32_SRAM3_BASE +# define N32_SHMEM_SIZE N32H7_SRAM3_SIZE +# else +# error missing shmem MPU configuration +# endif +#endif + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: n32_mpuinitialize + * + * Description: + * Configure the MPU. + * + * If PROTECTED build: + * - permit user-space access to only restricted N32 resources. + * + * If RPTUN: + * - configure shared memory as non-cacheable + * + ****************************************************************************/ + +void n32_mpuinitialize(void) +{ +#ifdef CONFIG_BUILD_PROTECTED + uintptr_t datastart = MIN(USERSPACE->us_datastart, USERSPACE->us_bssstart); + uintptr_t dataend = MAX(USERSPACE->us_dataend, USERSPACE->us_bssend); + + DEBUGASSERT(USERSPACE->us_textend >= USERSPACE->us_textstart && + dataend >= datastart); +#endif + + /* Show MPU information */ + + mpu_showtype(); + + /* Reset MPU if enabled */ + + mpu_reset(); + +#ifdef CONFIG_BUILD_PROTECTED + /* Configure user flash and SRAM space */ + + mpu_user_flash(USERSPACE->us_textstart, + USERSPACE->us_textend - USERSPACE->us_textstart); + + mpu_user_intsram(datastart, dataend - datastart); +#endif + +#ifdef CONFIG_RPTUN + /* Configure shared memory as non-cacheable */ + + mpu_priv_shmem((uintptr_t)N32_SHMEM_BASE, N32_SHMEM_SIZE); +#endif + + /* Then enable the MPU */ + + mpu_control(true, false, true); +} + +#ifdef CONFIG_BUILD_PROTECTED +/**************************************************************************** + * Name: n32_mpu_uheap + * + * Description: + * Map the user-heap region. + * + * This logic may need an extension to handle external SDRAM). + * + ****************************************************************************/ + +void n32_mpu_uheap(uintptr_t start, size_t size) +{ + mpu_user_intsram(start, size); +} +#endif + +#endif /* CONFIG_ARM_MPU */ diff --git a/arch/arm/src/n32h7/n32_mpuinit.h b/arch/arm/src/n32h7/n32_mpuinit.h new file mode 100644 index 0000000000000..501bab2881f8f --- /dev/null +++ b/arch/arm/src/n32h7/n32_mpuinit.h @@ -0,0 +1,84 @@ +/**************************************************************************** + * arch/arm/src/n32h7/n32_mpuinit.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __ARCH_ARM_SRC_N32H7_N32_MPUINIT_H +#define __ARCH_ARM_SRC_N32H7_N32_MPUINIT_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include + +#ifndef __ASSEMBLY__ + +#undef EXTERN +#if defined(__cplusplus) +#define EXTERN extern "C" +extern "C" +{ +#else +#define EXTERN extern +#endif + +/**************************************************************************** + * Public Function Prototypes + ****************************************************************************/ + +/**************************************************************************** + * Name: n32_mpuinitialize + * + * Description: + * Configure the MPU. + * + ****************************************************************************/ + +#ifdef CONFIG_ARM_MPU +void n32_mpuinitialize(void); +#else +# define n32_mpuinitialize() +#endif + +/**************************************************************************** + * Name: n32_mpu_uheap + * + * Description: + * Map the user heap region. + * + ****************************************************************************/ + +#ifdef CONFIG_BUILD_PROTECTED +void n32_mpu_uheap(uintptr_t start, size_t size); +#else +# define n32_mpu_uheap(start,size) +#endif + +#undef EXTERN +#if defined(__cplusplus) +} +#endif + +#endif /* __ASSEMBLY__ */ +#endif /* __ARCH_ARM_SRC_N32H7_N32_MPUINIT_H */ diff --git a/arch/arm/src/n32h7/n32_oneshot.c b/arch/arm/src/n32h7/n32_oneshot.c new file mode 100644 index 0000000000000..0be2e3b351a10 --- /dev/null +++ b/arch/arm/src/n32h7/n32_oneshot.c @@ -0,0 +1,462 @@ +/**************************************************************************** + * arch/arm/src/n32h7/n32_oneshot.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "n32_oneshot.h" + +#ifdef CONFIG_N32H7_ONESHOT + +/**************************************************************************** + * Private Function Prototypes + ****************************************************************************/ + +static int n32_oneshot_handler(int irg_num, void *context, void *arg); + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +static struct n32_oneshot_s *g_oneshot[CONFIG_N32H7_ONESHOT_MAXCHANNELS]; + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: n32_oneshot_handler + * + * Description: + * Common timer interrupt callback. When any oneshot timer interrupt + * expires, this function will be called. It will forward the call to + * the next level up. + * + * Input Parameters: + * oneshot - The state associated with the expired timer + * + * Returned Value: + * Always returns OK + * + ****************************************************************************/ + +static int n32_oneshot_handler(int irg_num, void *context, void *arg) +{ + struct n32_oneshot_s *oneshot = (struct n32_oneshot_s *)arg; + n32_oneshot_handler_t oneshot_handler; + void *oneshot_arg; + + tmrinfo("Expired (Interrupt)...\n"); + DEBUGASSERT(oneshot != NULL && oneshot->handler); + + /* The clock was stopped, but not disabled when the CC match occurred. + * Disable the TC now and disable any further interrupts. + */ + + N32_TIM_SETISR(oneshot->tch, NULL, NULL, N32_TIM_ISR_CC); + N32_TIM_DISABLEINT(oneshot->tch, N32_ONESHOT_CCIE(oneshot->channel)); + N32_TIM_SETMODE(oneshot->tch, N32_TIM_MODE_DISABLED); + N32_TIM_ACKINT(oneshot->tch, N32_ONESHOT_CCIF(oneshot->channel)); + + /* The timer is no longer running */ + + oneshot->running = false; + + /* Forward the event, clearing out any vestiges */ + + oneshot_handler = oneshot->handler; + oneshot->handler = NULL; + oneshot_arg = (void *)oneshot->arg; + oneshot->arg = NULL; + + oneshot_handler(oneshot_arg); + return OK; +} + +/**************************************************************************** + * Name: n32_allocate_handler + * + * Description: + * Allocate a timer callback handler for the oneshot instance. + * + * Input Parameters: + * oneshot - The state instance the new oneshot timer + * + * Returned Value: + * Returns zero (OK) on success. This can only fail if the number of + * timers exceeds CONFIG_N32H7_ONESHOT_MAXCHANNELS. + * + ****************************************************************************/ + +static inline int n32_allocate_handler(struct n32_oneshot_s *oneshot) +{ +#if CONFIG_N32H7_ONESHOT_MAXCHANNELS > 1 + int ret = -EBUSY; + int i; + + /* Search for an unused handler */ + + for (i = 0; i < CONFIG_N32H7_ONESHOT_MAXCHANNELS; i++) + { + /* Is this handler available? */ + + if (g_oneshot[i] == NULL) + { + /* Yes... assign it to this oneshot */ + + g_oneshot[i] = oneshot; + oneshot->cbndx = i; + ret = OK; + break; + } + } + + return ret; + +#else + if (g_oneshot[0] == NULL) + { + g_oneshot[0] = oneshot; + return OK; + } + + return -EBUSY; +#endif +} + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: n32_oneshot_initialize + * + * Description: + * Initialize the oneshot timer wrapper + * + * Input Parameters: + * oneshot Caller allocated instance of the oneshot state structure + * timer Timer number (1-18, see n32_tim_init mapping) + * channel Capture/compare channel (1-4) + * resolution The required resolution of the timer in units of + * microseconds. NOTE that the range is restricted to the + * range of uint16_t (excluding zero). + * + * Returned Value: + * Zero (OK) is returned on success; a negated errno value is returned + * on failure. + * + ****************************************************************************/ + +int n32_oneshot_initialize(struct n32_oneshot_s *oneshot, int timer, + int channel, uint16_t resolution) +{ + uint32_t frequency; + + tmrinfo("timer=%d channel=%d resolution=%u usec, USEC_PER_SEC:%ld\n", + timer, channel, resolution, USEC_PER_SEC); + DEBUGASSERT(oneshot && resolution > 0); + DEBUGASSERT(timer >= 1 && timer <= 18); + DEBUGASSERT(channel >= 1 && channel <= 4); + + /* Get the TC frequency that corresponds to the requested resolution */ + + frequency = USEC_PER_SEC / (uint32_t)resolution; + tmrinfo("frequency: %" PRIu32 "\n", frequency); + oneshot->frequency = frequency; + + /* Store timer and channel information */ + + oneshot->timer = timer; + oneshot->channel = channel; + + /* Initialize the timer hardware. + * n32_tim_init() takes the timer number (1-18). + */ + + oneshot->tch = n32_tim_init(timer); + if (!oneshot->tch) + { + tmrerr("ERROR: Failed to allocate TIM%d\n", timer); + return -EBUSY; + } + + N32_TIM_SETCLOCK(oneshot->tch, frequency); + + /* Initialize the remaining fields in the state structure. */ + + oneshot->running = false; + oneshot->handler = NULL; + oneshot->arg = NULL; + oneshot->period = 0; + + /* Assign a callback handler to the oneshot */ + + return n32_allocate_handler(oneshot); +} + +/**************************************************************************** + * Name: n32_oneshot_max_delay + * + * Description: + * Determine the maximum delay of the one-shot timer (in microseconds) + * + ****************************************************************************/ + +int n32_oneshot_max_delay(struct n32_oneshot_s *oneshot, uint64_t *usec) +{ + int width; + + DEBUGASSERT(oneshot != NULL && usec != NULL); + + width = N32_TIM_GETWIDTH(oneshot->tch); + + tmrinfo("frequency: %" PRIu32 ", USEC_PER_SEC: %ld, width: %d\n", + oneshot->frequency, USEC_PER_SEC, width); + + if (width == 32) + { + *usec = ((uint64_t)UINT32_MAX * (uint64_t)USEC_PER_SEC) / + (uint64_t)oneshot->frequency; + } + else + { + *usec = ((uint64_t)UINT16_MAX * (uint64_t)USEC_PER_SEC) / + (uint64_t)oneshot->frequency; + } + + return OK; +} + +/**************************************************************************** + * Name: n32_oneshot_start + * + * Description: + * Start the oneshot timer + * + * Input Parameters: + * oneshot Caller allocated instance of the oneshot state structure. This + * structure must have been previously initialized via a call to + * n32_oneshot_initialize(); + * handler The function to call when when the oneshot timer expires. + * arg An opaque argument that will accompany the callback. + * ts Provides the duration of the one shot timer. + * + * Returned Value: + * Zero (OK) is returned on success; a negated errno value is returned + * on failure. + * + ****************************************************************************/ + +int n32_oneshot_start(struct n32_oneshot_s *oneshot, + n32_oneshot_handler_t handler, void *arg, + const struct timespec *ts) +{ + uint64_t usec; + uint64_t period; + irqstate_t flags; + + tmrinfo("handler=%p arg=%p, ts=(%lu, %lu)\n", handler, arg, + (unsigned long)ts->tv_sec, (unsigned long)ts->tv_nsec); + DEBUGASSERT(oneshot && handler && ts); + DEBUGASSERT(oneshot->tch); + + /* Was the oneshot already running? */ + + flags = enter_critical_section(); + if (oneshot->running) + { + /* Yes.. then cancel it */ + + tmrinfo("Already running... cancelling\n"); + n32_oneshot_cancel(oneshot, NULL); + } + + /* Save the new handler and its argument */ + + oneshot->handler = handler; + oneshot->arg = arg; + + /* Express the delay in microseconds */ + + usec = (uint64_t)ts->tv_sec * USEC_PER_SEC + + (uint64_t)(ts->tv_nsec / NSEC_PER_USEC); + + /* Get the timer counter frequency and determine the number of counts need + * to achieve the requested delay. + * + * frequency = ticks / second + * ticks = seconds * frequency + * = (usecs * frequency) / USEC_PER_SEC; + */ + + period = (usec * (uint64_t)oneshot->frequency) / USEC_PER_SEC; + + tmrinfo("usec=%llu period=%08llx\n", usec, period); + DEBUGASSERT(period <= UINT32_MAX); + + /* Set up to receive the callback when the interrupt occurs */ + + N32_TIM_SETISR(oneshot->tch, n32_oneshot_handler, oneshot, N32_TIM_ISR_CC); + + /* Set timer period (auto-reload) to the calculated period */ + + oneshot->period = (uint32_t)period; + N32_TIM_SETPERIOD(oneshot->tch, (uint32_t)period); + + /* Set the compare register using the channel number */ + + N32_TIM_SETCOMPARE(oneshot->tch, oneshot->channel, (uint32_t)period); + + /* Start the counter in up-count mode (one-shot pulse mode) */ + + N32_TIM_SETMODE(oneshot->tch, N32_TIM_MODE_PULSE); + + /* Acknowledge any pending interrupt and enable the CC interrupt */ + + N32_TIM_ACKINT(oneshot->tch, N32_ONESHOT_CCIF(oneshot->channel)); + N32_TIM_ENABLEINT(oneshot->tch, N32_ONESHOT_CCIE(oneshot->channel)); + + /* Enable interrupts. We should get the callback when the interrupt + * occurs. + */ + + oneshot->running = true; + leave_critical_section(flags); + return OK; +} + +/**************************************************************************** + * Name: n32_oneshot_cancel + * + * Description: + * Cancel the oneshot timer and return the time remaining on the timer. + * + * NOTE: This function may execute at a high rate with no timer running (as + * when pre-emption is enabled and disabled). + * + * Input Parameters: + * oneshot Caller allocated instance of the oneshot state structure. This + * structure must have been previously initialized via a call to + * n32_oneshot_initialize(); + * ts The location in which to return the time remaining on the + * oneshot timer. A time of zero is returned if the timer is + * not running. ts may be zero in which case the time remaining + * is not returned. + * + * Returned Value: + * Zero (OK) is returned on success. A call to up_timer_cancel() when + * the timer is not active should also return success; a negated errno + * value is returned on any failure. + * + ****************************************************************************/ + +int n32_oneshot_cancel(struct n32_oneshot_s *oneshot, + struct timespec *ts) +{ + irqstate_t flags; + uint32_t count; + uint32_t period; + uint64_t usec; + + /* Was the timer running? */ + + flags = enter_critical_section(); + if (!oneshot->running) + { + /* No.. Just return zero timer remaining and successful cancellation. + * This function may execute at a high rate with no timer running + * (as when pre-emption is enabled and disabled). + */ + + if (ts) + { + ts->tv_sec = 0; + ts->tv_nsec = 0; + } + + leave_critical_section(flags); + return OK; + } + + tmrinfo("Cancelling...\n"); + + /* Now we can disable the interrupt and stop the timer. */ + + N32_TIM_DISABLEINT(oneshot->tch, N32_ONESHOT_CCIE(oneshot->channel)); + N32_TIM_SETISR(oneshot->tch, NULL, NULL, N32_TIM_ISR_CC); + N32_TIM_SETMODE(oneshot->tch, N32_TIM_MODE_DISABLED); + + /* Get the current counter value and period */ + + count = N32_TIM_GETCOUNTER(oneshot->tch); + period = oneshot->period; + + oneshot->running = false; + oneshot->handler = NULL; + oneshot->arg = NULL; + leave_critical_section(flags); + + /* Did the caller provide us with a location to return the time + * remaining? + */ + + if (ts) + { + /* Calculate remaining time in microseconds */ + + if (count < period) + { + usec = ((uint64_t)(period - count) * USEC_PER_SEC) / + oneshot->frequency; + } + else + { + usec = 0; + } + + ts->tv_sec = (time_t)(usec / USEC_PER_SEC); + ts->tv_nsec = (long)((usec - (uint64_t)(ts->tv_sec * USEC_PER_SEC)) * + NSEC_PER_USEC); + + tmrinfo("Remaining: %lu sec, %lu nsec\n", + (unsigned long)ts->tv_sec, (unsigned long)ts->tv_nsec); + } + + return OK; +} + +#endif /* CONFIG_N32H7_ONESHOT */ diff --git a/arch/arm/src/n32h7/n32_oneshot.h b/arch/arm/src/n32h7/n32_oneshot.h new file mode 100644 index 0000000000000..0921674828369 --- /dev/null +++ b/arch/arm/src/n32h7/n32_oneshot.h @@ -0,0 +1,179 @@ +/**************************************************************************** + * arch/arm/src/n32h7/n32_oneshot.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __ARCH_ARM_SRC_N32H7_N32_ONESHOT_H +#define __ARCH_ARM_SRC_N32H7_N32_ONESHOT_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include + +#include + +#include "n32_tim.h" + +#ifdef CONFIG_N32H7_ONESHOT + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +#if !defined(CONFIG_N32H7_ONESHOT_MAXCHANNELS) || \ + CONFIG_N32H7_ONESHOT_MAXCHANNELS < 1 +# undef CONFIG_N32H7_ONESHOT_MAXCHANNELS +# define CONFIG_N32H7_ONESHOT_MAXCHANNELS 1 +#endif + +#if CONFIG_N32H7_ONESHOT_MAXCHANNELS > 8 +# warning Additional logic required to handle more than 8 timers +# undef CONFIG_N32H7_ONESHOT_MAXCHANNELS +# define CONFIG_N32H7_ONESHOT_MAXCHANNELS 8 +#endif + +/* Interrupt source for oneshot timer (capture/compare interrupt) */ + +#define N32_ONESHOT_CCIE(ch) \ + (N32_ATIM_DINTEN_CC1IEN << ((ch) - 1)) + +#define N32_ONESHOT_CCIF(ch) \ + (N32_ATIM_STS_CC1ITF << ((ch) - 1)) + +#define N32_ONESHOT_UIE N32_ATIM_DINTEN_UIEN +#define N32_ONESHOT_UIF N32_ATIM_STS_UDITF + +/**************************************************************************** + * Public Types + ****************************************************************************/ + +/* This describes the callback function that will be invoked when the oneshot + * timer expires. The oneshot fires, the client will receive: + * + * arg - The opaque argument provided when the interrupt was registered + */ + +typedef void (*n32_oneshot_handler_t)(void *arg); + +/* The oneshot client must allocate an instance of this structure and call + * n32_oneshot_initialize() before using the oneshot facilities. The client + * should not access the contents of this structure directly since the + * contents are subject to change. + */ + +struct n32_oneshot_s +{ + uint8_t timer; /* Timer number (1 for ATIM1, 3 for GTIMA1, etc.) */ + uint8_t channel; /* CC channel (1-4) */ +#if CONFIG_N32H7_ONESHOT_MAXCHANNELS > 1 + uint8_t cbndx; /* Timer callback handler index */ +#endif + volatile bool running; /* True: the timer is running */ + struct n32_tim_dev_s *tch; /* Pointer returned by n32_tim_init() */ + volatile n32_oneshot_handler_t handler; /* Oneshot expiration callback */ + volatile void *arg; /* The argument that will accompany the callback */ + uint32_t frequency; /* Timer clock frequency */ + uint32_t period; /* Current period in ticks */ +}; + +/**************************************************************************** + * Public Data + ****************************************************************************/ + +#undef EXTERN +#if defined(__cplusplus) +#define EXTERN extern "C" +extern "C" +{ +#else +#define EXTERN extern +#endif + +/**************************************************************************** + * Public Function Prototypes + ****************************************************************************/ + +/**************************************************************************** + * Name: n32_oneshot_initialize + * + * Description: + * Initialize the oneshot timer wrapper (internal use) + * + * Input Parameters: + * oneshot Caller allocated instance of the oneshot state structure + * timer Timer number (1-18, see n32_tim_init mapping) + * channel Capture/compare channel (1-4) + * resolution The required resolution of the timer in units of + * microseconds. + * + * Returned Value: + * Zero (OK) is returned on success; a negated errno value is returned + * on failure. + * + ****************************************************************************/ + +int n32_oneshot_initialize(struct n32_oneshot_s *oneshot, int timer, + int channel, uint16_t resolution); + +/**************************************************************************** + * Name: n32_oneshot_max_delay + * + * Description: + * Determine the maximum delay of the one-shot timer (in microseconds) + * + ****************************************************************************/ + +int n32_oneshot_max_delay(struct n32_oneshot_s *oneshot, uint64_t *usec); + +/**************************************************************************** + * Name: n32_oneshot_start + * + * Description: + * Start the oneshot timer + * + ****************************************************************************/ + +int n32_oneshot_start(struct n32_oneshot_s *oneshot, + n32_oneshot_handler_t handler, void *arg, + const struct timespec *ts); + +/**************************************************************************** + * Name: n32_oneshot_cancel + * + * Description: + * Cancel the oneshot timer and return the time remaining on the timer. + * + ****************************************************************************/ + +int n32_oneshot_cancel(struct n32_oneshot_s *oneshot, + struct timespec *ts); + +#undef EXTERN +#ifdef __cplusplus +} +#endif + +#endif /* CONFIG_N32H7_ONESHOT */ +#endif /* __ARCH_ARM_SRC_N32H7_N32_ONESHOT_H */ diff --git a/arch/arm/src/n32h7/n32_oneshot_lowerhalf.c b/arch/arm/src/n32h7/n32_oneshot_lowerhalf.c new file mode 100644 index 0000000000000..e249ab7ce8961 --- /dev/null +++ b/arch/arm/src/n32h7/n32_oneshot_lowerhalf.c @@ -0,0 +1,354 @@ +/**************************************************************************** + * arch/arm/src/n32h7/n32_oneshot_lowerhalf.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "n32_oneshot.h" + +#ifdef CONFIG_ONESHOT + +/**************************************************************************** + * Private Types + ****************************************************************************/ + +/* This structure describes the state of the oneshot timer lower-half driver + */ + +struct n32_oneshot_lowerhalf_s +{ + /* This is the part of the lower half driver that is visible to the upper- + * half client of the driver. This must be the first thing in this + * structure so that pointers to struct oneshot_lowerhalf_s are cast + * compatible to struct n32_oneshot_lowerhalf_s and vice versa. + */ + + struct oneshot_lowerhalf_s lh; /* Common lower-half driver fields */ + + /* Private lower half data follows */ + + struct n32_oneshot_s oneshot; /* N32-specific oneshot state */ + oneshot_callback_t callback; /* Internal handler that receives callback */ + void *arg; /* Argument that is passed to the handler */ +}; + +/**************************************************************************** + * Private Function Prototypes + ****************************************************************************/ + +static void n32_oneshot_handler(void *arg); + +static int n32_max_delay(struct oneshot_lowerhalf_s *lower, + struct timespec *ts); +static int n32_start(struct oneshot_lowerhalf_s *lower, + const struct timespec *ts); +static int n32_cancel(struct oneshot_lowerhalf_s *lower, + struct timespec *ts); + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +/* Lower half operations */ + +static const struct oneshot_operations_s g_oneshot_ops = +{ + .max_delay = n32_max_delay, + .start = n32_start, + .cancel = n32_cancel, +}; + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: n32_oneshot_handler + * + * Description: + * Timer expiration handler + * + * Input Parameters: + * arg - Should be the same argument provided when n32_oneshot_start() + * was called. + * + * Returned Value: + * None + * + ****************************************************************************/ + +static void n32_oneshot_handler(void *arg) +{ + struct n32_oneshot_lowerhalf_s *priv = + (struct n32_oneshot_lowerhalf_s *)arg; + oneshot_callback_t callback; + void *cbarg; + + DEBUGASSERT(priv != NULL); + + /* Perhaps the callback was nullified in a race condition with + * n32_cancel? + */ + + if (priv->callback) + { + /* Sample and nullify BEFORE executing callback (in case the callback + * restarts the oneshot). + */ + + callback = priv->callback; + cbarg = priv->arg; + priv->callback = NULL; + priv->arg = NULL; + + /* Then perform the callback */ + + callback(&priv->lh, cbarg); + } +} + +/**************************************************************************** + * Name: n32_max_delay + * + * Description: + * Determine the maximum delay of the one-shot timer (in microseconds) + * + * Input Parameters: + * lower An instance of the lower-half oneshot state structure. This + * structure must have been previously initialized via a call to + * oneshot_initialize(); + * ts The location in which to return the maximum delay. + * + * Returned Value: + * Zero (OK) is returned on success; a negated errno value is returned + * on failure. + * + ****************************************************************************/ + +static int n32_max_delay(struct oneshot_lowerhalf_s *lower, + struct timespec *ts) +{ + struct n32_oneshot_lowerhalf_s *priv = + (struct n32_oneshot_lowerhalf_s *)lower; + uint64_t usecs; + int ret; + + DEBUGASSERT(priv != NULL && ts != NULL); + ret = n32_oneshot_max_delay(&priv->oneshot, &usecs); + if (ret >= 0) + { + uint64_t sec = usecs / 1000000; + + usecs -= 1000000 * sec; + + ts->tv_sec = (time_t)sec; + ts->tv_nsec = (long)(usecs * 1000); + } + + return ret; +} + +/**************************************************************************** + * Name: n32_start + * + * Description: + * Start the oneshot timer + * + * Input Parameters: + * lower An instance of the lower-half oneshot state structure. This + * structure must have been previously initialized via a call to + * oneshot_initialize(); + * handler The function to call when when the oneshot timer expires. + * arg An opaque argument that will accompany the callback. + * ts Provides the duration of the one shot timer. + * + * Returned Value: + * Zero (OK) is returned on success; a negated errno value is returned + * on failure. + * + ****************************************************************************/ + +static int n32_start(struct oneshot_lowerhalf_s *lower, + const struct timespec *ts) +{ + struct n32_oneshot_lowerhalf_s *priv = + (struct n32_oneshot_lowerhalf_s *)lower; + irqstate_t flags; + int ret; + + DEBUGASSERT(priv != NULL && lower->callback != NULL && ts != NULL); + + /* Save the callback information and start the timer */ + + flags = enter_critical_section(); + priv->callback = lower->callback; + priv->arg = lower->arg; + ret = n32_oneshot_start(&priv->oneshot, + n32_oneshot_handler, priv, ts); + leave_critical_section(flags); + + if (ret < 0) + { + tmrerr("ERROR: n32_oneshot_start failed: %d\n", ret); + } + + return ret; +} + +/**************************************************************************** + * Name: n32_cancel + * + * Description: + * Cancel the oneshot timer and return the time remaining on the timer. + * + * Input Parameters: + * lower Caller allocated instance of the oneshot state structure. This + * structure must have been previously initialized via a call to + * oneshot_initialize(); + * ts The location in which to return the time remaining on the + * oneshot timer. A time of zero is returned if the timer is + * not running. + * + * Returned Value: + * Zero (OK) is returned on success. A call to up_timer_cancel() when + * the timer is not active should also return success; a negated errno + * value is returned on any failure. + * + ****************************************************************************/ + +static int n32_cancel(struct oneshot_lowerhalf_s *lower, + struct timespec *ts) +{ + struct n32_oneshot_lowerhalf_s *priv = + (struct n32_oneshot_lowerhalf_s *)lower; + irqstate_t flags; + int ret; + + DEBUGASSERT(priv != NULL); + + /* Cancel the timer */ + + flags = enter_critical_section(); + ret = n32_oneshot_cancel(&priv->oneshot, ts); + priv->callback = NULL; + priv->arg = NULL; + leave_critical_section(flags); + + if (ret < 0) + { + tmrerr("ERROR: n32_oneshot_cancel failed: %d\n", ret); + } + + return ret; +} + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: oneshot_initialize + * + * Description: + * Initialize the oneshot timer and return a oneshot lower half driver + * instance. + * + * Input Parameters: + * chan Encoded timer and channel: (timer << 4) | channel + * timer: 1 for ATIM1, 3 for GTIMA1, 15 for BTIM1, etc. + * channel: 1-4 (CC1-CC4) + * resolution The required resolution of the timer in units of + * microseconds. NOTE that the range is restricted to the + * range of uint16_t (excluding zero). + * + * Returned Value: + * On success, a non-NULL instance of the oneshot lower-half driver is + * returned. NULL is return on any failure. + * + ****************************************************************************/ + +struct oneshot_lowerhalf_s *oneshot_initialize(int chan, + uint16_t resolution) +{ + struct n32_oneshot_lowerhalf_s *priv; + int timer; + int channel; + int ret; + + /* Decode timer and channel from chan parameter. + * Bits 7-4: timer number (1-18) + * Bits 3-0: channel number (1-4) + */ + + timer = (chan >> 4) & 0x0f; + channel = chan & 0x0f; + + /* Validate channel number */ + + if (channel < 1 || channel > 4) + { + tmrerr("ERROR: Invalid channel: %d (must be 1-4)\n", channel); + return NULL; + } + + /* Allocate an instance of the lower half driver */ + + priv = (struct n32_oneshot_lowerhalf_s *) + kmm_zalloc(sizeof(struct n32_oneshot_lowerhalf_s)); + + if (priv == NULL) + { + tmrerr("ERROR: Failed to allocate state structure\n"); + return NULL; + } + + /* Initialize the lower-half driver structure */ + + priv->lh.ops = &g_oneshot_ops; + + /* Initialize the contained N32 oneshot timer */ + + ret = n32_oneshot_initialize(&priv->oneshot, timer, channel, resolution); + if (ret < 0) + { + tmrerr("ERROR: n32_oneshot_initialize failed: %d\n", ret); + kmm_free(priv); + return NULL; + } + + return &priv->lh; +} + +#endif /* CONFIG_ONESHOT */ diff --git a/arch/arm/src/n32h7/n32_pm.h b/arch/arm/src/n32h7/n32_pm.h new file mode 100644 index 0000000000000..e4267f09a4f3e --- /dev/null +++ b/arch/arm/src/n32h7/n32_pm.h @@ -0,0 +1,109 @@ +/**************************************************************************** + * arch/arm/src/n32h7/n32_pm.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __ARCH_ARM_SRC_STM32H7_STM32_PM_H +#define __ARCH_ARM_SRC_STM32H7_STM32_PM_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include + +#include "chip.h" +#include "arm_internal.h" + +/**************************************************************************** + * Public Function Prototypes + ****************************************************************************/ + +#ifndef __ASSEMBLY__ +#ifdef __cplusplus +#define EXTERN extern "C" +extern "C" +{ +#else +#define EXTERN extern +#endif + +/**************************************************************************** + * Name: n32_pmstop + * + * Description: + * Enter STOP mode. + * + * Input Parameters: + * stop2 - true: To further reduce power consumption in Stop mode, put the + * internal voltage regulator in low-power under-drive mode using + * the LPDS and LPUDS bits of the Power control register (PWR_CR1). + * + * Returned Value: + * None + * + ****************************************************************************/ + +void n32_pmstop(bool stop2); + +/**************************************************************************** + * Name: n32_pmstandby + * + * Description: + * Enter STANDBY mode. + * + * Input Parameters: + * None + * + * Returned Value: + * None + * + ****************************************************************************/ + +void n32_pmstandby(void); + +/**************************************************************************** + * Name: n32_pmsleep + * + * Description: + * Enter SLEEP mode. + * + * Input Parameters: + * sleeponexit - true: SLEEPONEXIT bit is set when the WFI instruction is + * executed, the MCU enters Sleep mode as soon as it + * exits the lowest priority ISR. + * - false: SLEEPONEXIT bit is cleared, the MCU enters Sleep + * mode as soon as WFI or WFE instruction is executed. + * Returned Value: + * None + * + ****************************************************************************/ + +void n32_pmsleep(bool sleeponexit); + +#undef EXTERN +#ifdef __cplusplus +} +#endif +#endif /* __ASSEMBLY__ */ + +#endif /* __ARCH_ARM_SRC_STM32H7_STM32_PM_H */ diff --git a/arch/arm/src/n32h7/n32_pminitialize.c b/arch/arm/src/n32h7/n32_pminitialize.c new file mode 100644 index 0000000000000..97c504f310114 --- /dev/null +++ b/arch/arm/src/n32h7/n32_pminitialize.c @@ -0,0 +1,64 @@ +/**************************************************************************** + * arch/arm/src/n32h7/n32_pminitialize.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include + +#include "arm_internal.h" +#include "n32_pm.h" + +#ifdef CONFIG_PM + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: arm_pminitialize + * + * Description: + * This function is called by MCU-specific logic at power-on reset in + * order to provide one-time initialization the power management subsystem. + * This function must be called *very* early in the initialization sequence + * *before* any other device drivers are initialized (since they may + * attempt to register with the power management subsystem). + * + * Input Parameters: + * None. + * + * Returned Value: + * None. + * + ****************************************************************************/ + +void arm_pminitialize(void) +{ + /* Initialize the NuttX power management subsystem proper */ + + pm_initialize(); +} + +#endif /* CONFIG_PM */ diff --git a/arch/arm/src/n32h7/n32_pmsleep.c b/arch/arm/src/n32h7/n32_pmsleep.c new file mode 100644 index 0000000000000..14c138f88e652 --- /dev/null +++ b/arch/arm/src/n32h7/n32_pmsleep.c @@ -0,0 +1,87 @@ +/**************************************************************************** + * arch/arm/src/n32h7/n32_pmsleep.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include + +#include "arm_internal.h" +#include "nvic.h" +#include "n32_pwr.h" +#include "n32_pm.h" + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: n32_pmsleep + * + * Description: + * Enter SLEEP mode. + * + * Input Parameters: + * sleeponexit - true: SLEEPONEXIT bit is set when the WFI instruction is + * executed, the MCU enters Sleep mode as soon as it + * exits the lowest priority ISR. + * - false: SLEEPONEXIT bit is cleared, the MCU enters Sleep + * mode as soon as WFI or WFE instruction is executed. + * Returned Value: + * None + * + ****************************************************************************/ + +void n32_pmsleep(bool sleeponexit) +{ + uint32_t regval; + + /* Clear SLEEPDEEP bit of Cortex System Control Register */ + + regval = getreg32(NVIC_SYSCON); + regval &= ~NVIC_SYSCON_SLEEPDEEP; + if (sleeponexit) + { + regval |= NVIC_SYSCON_SLEEPONEXIT; + } + else + { + regval &= ~NVIC_SYSCON_SLEEPONEXIT; + } + + putreg32(regval, NVIC_SYSCON); + + /* Sleep until the wakeup interrupt or event occurs */ + +#ifdef CONFIG_PM_WFE + /* Mode: SLEEP + Entry with WFE */ + + asm("wfe"); +#else + /* Mode: SLEEP + Entry with WFI */ + + asm("wfi"); +#endif +} diff --git a/arch/arm/src/n32h7/n32_pmstandby.c b/arch/arm/src/n32h7/n32_pmstandby.c new file mode 100644 index 0000000000000..73b8191016296 --- /dev/null +++ b/arch/arm/src/n32h7/n32_pmstandby.c @@ -0,0 +1,79 @@ +/**************************************************************************** + * arch/arm/src/n32h7/n32_pmstandby.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include + +#include "arm_internal.h" +#include "nvic.h" +#include "n32_rcc.h" +#include "n32_pwr.h" +#include "n32_pm.h" + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: n32_pmstandby + * + * Description: + * Enter STANDBY mode. + * + * Input Parameters: + * None + * + * Returned Value: + * None + * + ****************************************************************************/ + +void n32_pmstandby(void) +{ + uint32_t regval; + + /* Clear the wake-up flags before resetting. */ + + modifyreg32(N32_PWR_C1_PWR_CR, 0, PWR_M7CTRL1_CWKUPF); + modifyreg32(N32_PWR_C1_PWR_CR2, PWR_M7CTRL2_STOP2EN, 0); + + /* Set the domain Power Down Deep Sleep (PDDS) bits in the power control + * register so that D1, D2, and D3 will go into the DStop state. + */ + + modifyreg32(N32_PWR_C1_PWR_CR, 0, PWR_M7CTRL1_PDSEN); + + /* Set SLEEPDEEP bit of Cortex System Control Register */ + + regval = getreg32(NVIC_SYSCON); + regval |= NVIC_SYSCON_SLEEPDEEP; + putreg32(regval, NVIC_SYSCON); + + /* Sleep until the wakeup reset occurs */ + + asm("wfi"); +} diff --git a/arch/arm/src/n32h7/n32_pmstop.c b/arch/arm/src/n32h7/n32_pmstop.c new file mode 100644 index 0000000000000..2972313686696 --- /dev/null +++ b/arch/arm/src/n32h7/n32_pmstop.c @@ -0,0 +1,95 @@ +/**************************************************************************** + * arch/arm/src/n32h7/n32_pmstop.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include + +#include "arm_internal.h" +#include "nvic.h" +#include "n32_pwr.h" +#include "n32_pm.h" + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: n32_pmstop + * + * Description: + * Enter STOP mode. + * + * Returned Value: + * None + * + ****************************************************************************/ + +void n32_pmstop(bool stop2) +{ + uint32_t regval; + + /* Clear the domain standby bits so D1, D2 and D3 remain in DStop mode */ + + modifyreg32(N32_PWR_C1_PWR_CR, PWR_M7CTRL1_PDSEN, 0); + + if (stop2) + { + modifyreg32(N32_PWR_C1_PWR_CR2, 0, PWR_M7CTRL2_STOP2EN); + } + else + { + modifyreg32(N32_PWR_C1_PWR_CR2, PWR_M7CTRL2_STOP2EN, 0); + } + + /* Set SLEEPDEEP bit of Cortex System Control Register */ + + regval = getreg32(NVIC_SYSCON); + regval |= NVIC_SYSCON_SLEEPDEEP; + putreg32(regval, NVIC_SYSCON); + + /* Sleep until the wakeup interrupt or event occurs */ + +#ifdef CONFIG_PM_WFE + /* Mode: SLEEP + Entry with WFE */ + + asm volatile ("wfe"); +#else + /* Mode: SLEEP + Entry with WFI */ + + asm volatile ("wfi"); +#endif + + /* Clear deep sleep bits, so that MCU does not go into deep sleep in + * idle. + */ + + /* Clear SLEEPDEEP bit of Cortex System Control Register */ + + regval = getreg32(NVIC_SYSCON); + regval &= ~NVIC_SYSCON_SLEEPDEEP; + putreg32(regval, NVIC_SYSCON); +} diff --git a/arch/arm/src/n32h7/n32_pwm.c b/arch/arm/src/n32h7/n32_pwm.c new file mode 100644 index 0000000000000..0e7509b537aac --- /dev/null +++ b/arch/arm/src/n32h7/n32_pwm.c @@ -0,0 +1,2515 @@ +/**************************************************************************** + * arch/arm/src/n32h7/n32_pwm.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include "arm_internal.h" +#include "n32_pwm.h" +#include "n32_gpio.h" +#include "n32_rcc.h" +#include "hardware/n32h7_tim.h" +#include "hardware/n32h76x_pinmap.h" +#include "hardware/n32h7_rcc.h" + +#ifdef CONFIG_N32H7_PWM + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* Register offsets (common for ATIM/GTIMA/GTIMB) */ +#define N32_PWM_CTRL1_OFFSET 0x0000 +#define N32_PWM_CTRL2_OFFSET 0x0004 +#define N32_PWM_STS_OFFSET 0x0008 +#define N32_PWM_ETGEN_OFFSET 0x000c +#define N32_PWM_SMCTRL_OFFSET 0x0010 +#define N32_PWM_DINTEN_OFFSET 0x0014 +#define N32_PWM_CCMOD1_OFFSET 0x0018 +#define N32_PWM_CCMOD2_OFFSET 0x001c +#define N32_PWM_CCMOD3_OFFSET 0x0020 +#define N32_PWM_CCEN_OFFSET 0x0024 +#define N32_PWM_CCDAT1_OFFSET 0x0028 +#define N32_PWM_CCDAT2_OFFSET 0x002c +#define N32_PWM_CCDAT3_OFFSET 0x0030 +#define N32_PWM_CCDAT4_OFFSET 0x0034 +#define N32_PWM_PSC_OFFSET 0x0040 +#define N32_PWM_AR_OFFSET 0x0044 +#define N32_PWM_CNT_OFFSET 0x0048 +#define N32_PWM_REPCNT_OFFSET 0x004c +#define N32_PWM_BKDT_OFFSET 0x0050 + +/* Bit definitions (same as ATIM) */ +#define PWM_CR1_CEN N32_ATIM_CTRL1_CNTEN +#define PWM_CR1_DIR N32_ATIM_CTRL1_DIR +#define PWM_CR1_CMS_MASK N32_ATIM_CTRL1_CAMSEL_MASK +#define PWM_CR1_ARPE N32_ATIM_CTRL1_ARPEN +#define PWM_CR1_OPM N32_ATIM_CTRL1_ONEPM +#define PWM_CR1_CKD_MASK N32_ATIM_CTRL1_CLKD_MASK + +#define PWM_CCER_CC1E N32_ATIM_CCEN_CC1EN +#define PWM_CCER_CC1P N32_ATIM_CCEN_CC1P +#define PWM_CCER_CC1NE N32_ATIM_CCEN_CC1NEN +#define PWM_CCER_CC1NP N32_ATIM_CCEN_CC1NP +#define PWM_CCER_CC2E N32_ATIM_CCEN_CC2EN +#define PWM_CCER_CC2P N32_ATIM_CCEN_CC2P +#define PWM_CCER_CC2NE N32_ATIM_CCEN_CC2NEN +#define PWM_CCER_CC2NP N32_ATIM_CCEN_CC2NP +#define PWM_CCER_CC3E N32_ATIM_CCEN_CC3EN +#define PWM_CCER_CC3P N32_ATIM_CCEN_CC3P +#define PWM_CCER_CC3NE N32_ATIM_CCEN_CC3NEN +#define PWM_CCER_CC3NP N32_ATIM_CCEN_CC3NP +#define PWM_CCER_CC4E N32_ATIM_CCEN_CC4EN +#define PWM_CCER_CC4P N32_ATIM_CCEN_CC4P + +#define PWM_CCMR_CCS_OUT N32_ATIM_CCMOD1_CC1OUT +#define PWM_CCMR_OC1PE N32_ATIM_CCMOD1_OC1PEN +#define PWM_CCMR_OC2PE N32_ATIM_CCMOD1_OC2PEN +#define PWM_CCMR_OC3PE N32_ATIM_CCMOD2_OC3PEN +#define PWM_CCMR_OC4PE N32_ATIM_CCMOD2_OC4PEN + +#define PWM_BDTR_MOE N32_ATIM_BKDT_MOEN +#define PWM_BDTR_BKE N32_ATIM_BKDT_BKEN +#define PWM_BDTR_BKP N32_ATIM_BKDT_BKP +#define PWM_BDTR_DTG_MASK N32_ATIM_BKDT_DTGN_MASK +#define PWM_BDTR_LOCK_MASK N32_ATIM_BKDT_LCKCFG_MASK + +#define PWM_DIER_UIE N32_ATIM_DINTEN_UIEN +#define PWM_DIER_CC1IE N32_ATIM_DINTEN_CC1IEN +#define PWM_DIER_CC2IE N32_ATIM_DINTEN_CC2IEN +#define PWM_DIER_CC3IE N32_ATIM_DINTEN_CC3IEN +#define PWM_DIER_CC4IE N32_ATIM_DINTEN_CC4IEN + +#define PWM_SR_UIF N32_ATIM_STS_UDITF +#define PWM_SR_CC1IF N32_ATIM_STS_CC1ITF +#define PWM_SR_CC2IF N32_ATIM_STS_CC2ITF +#define PWM_SR_CC3IF N32_ATIM_STS_CC3ITF +#define PWM_SR_CC4IF N32_ATIM_STS_CC4ITF + +#define PWM_EGR_UG N32_ATIM_ETGEN_UDGN + +/* Helpers for timer type */ + +static inline bool pwm_has_comp(struct n32_pwmtimer_s *priv) +{ + return (priv->timtype == TIMTYPE_ADVANCED || + priv->timtype == TIMTYPE_GTIMB); +} + +static inline bool pwm_has_break(struct n32_pwmtimer_s *priv) +{ + return (priv->timtype == TIMTYPE_ADVANCED || + priv->timtype == TIMTYPE_GTIMB); +} + +/**************************************************************************** + * Private Types + ****************************************************************************/ + +/* Forward reference for ops */ + +struct pwm_lowerhalf_s; + +/**************************************************************************** + * Static Function Prototypes + ****************************************************************************/ + +static int pwm_setup(struct pwm_lowerhalf_s *dev); +static int pwm_shutdown(struct pwm_lowerhalf_s *dev); +static int pwm_start(struct pwm_lowerhalf_s *dev, + const struct pwm_info_s *info); +static int pwm_stop(struct pwm_lowerhalf_s *dev); +static int pwm_ioctl(struct pwm_lowerhalf_s *dev, int cmd, + unsigned long arg); + +#ifdef CONFIG_DEBUG_PWM_INFO +static void pwm_dumpregs(struct pwm_lowerhalf_s *dev, const char *msg); +#else +# define pwm_dumpregs(dev,msg) +#endif + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +static const struct pwm_ops_s g_pwmops = +{ + .setup = pwm_setup, + .shutdown = pwm_shutdown, + .start = pwm_start, + .stop = pwm_stop, + .ioctl = pwm_ioctl, +}; + +/* -------------------------------------------------------------------------- + * Timer instance data (generated) + * -------------------------------------------------------------------------- + */ + +#ifdef CONFIG_N32H7_ATIM1_PWM +static struct n32_pwmchan_s g_pwmatim1channels[] = +{ +#ifdef CONFIG_N32H7_ATIM1_CHANNEL1 + { + .channel = 1, + .mode = CONFIG_N32H7_ATIM1_CH1MODE, +#ifdef CONFIG_N32H7_ATIM1_BREAK1 + .brk = + { + .en1 = 1, + .pol1 = CONFIG_N32H7_ATIM1_BRK1POL, + }, +#endif + .out1 = + { + .in_use = 1, + .pol = CONFIG_N32H7_ATIM1_CH1POL, + .idle = CONFIG_N32H7_ATIM1_CH1IDLE, + .pincfg = GPIO_ATIM1_CH1OUT, + }, +#ifdef CONFIG_N32H7_ATIM1_CH1NOUT + .out2 = + { + .in_use = 1, + .pol = CONFIG_N32H7_ATIM1_CH1NPOL, + .idle = CONFIG_N32H7_ATIM1_CH1NIDLE, + .pincfg = GPIO_ATIM1_CH1NOUT, + }, +#endif + }, +#endif +#ifdef CONFIG_N32H7_ATIM1_CHANNEL2 + { + .channel = 2, + .mode = CONFIG_N32H7_ATIM1_CH2MODE, + .out1 = + { + .in_use = 1, + .pol = CONFIG_N32H7_ATIM1_CH2POL, + .idle = CONFIG_N32H7_ATIM1_CH2IDLE, + .pincfg = GPIO_ATIM1_CH2OUT, + }, +#ifdef CONFIG_N32H7_ATIM1_CH2NOUT + .out2 = + { + .in_use = 1, + .pol = CONFIG_N32H7_ATIM1_CH2NPOL, + .idle = CONFIG_N32H7_ATIM1_CH2NIDLE, + .pincfg = GPIO_ATIM1_CH2NOUT, + }, +#endif + }, +#endif +#ifdef CONFIG_N32H7_ATIM1_CHANNEL3 + { + .channel = 3, + .mode = CONFIG_N32H7_ATIM1_CH3MODE, + .out1 = + { + .in_use = 1, + .pol = CONFIG_N32H7_ATIM1_CH3POL, + .idle = CONFIG_N32H7_ATIM1_CH3IDLE, + .pincfg = GPIO_ATIM1_CH3OUT, + }, +#ifdef CONFIG_N32H7_ATIM1_CH3NOUT + .out2 = + { + .in_use = 1, + .pol = CONFIG_N32H7_ATIM1_CH3NPOL, + .idle = CONFIG_N32H7_ATIM1_CH3NIDLE, + .pincfg = GPIO_ATIM1_CH3NOUT, + }, +#endif + }, +#endif +#ifdef CONFIG_N32H7_ATIM1_CHANNEL4 + { + .channel = 4, + .mode = CONFIG_N32H7_ATIM1_CH4MODE, + .out1 = + { + .in_use = 1, + .pol = CONFIG_N32H7_ATIM1_CH4POL, + .idle = CONFIG_N32H7_ATIM1_CH4IDLE, + .pincfg = GPIO_ATIM1_CH4OUT, + }, +#ifdef CONFIG_N32H7_ATIM1_CH4NOUT + .out2 = + { + .in_use = 1, + .pol = CONFIG_N32H7_ATIM1_CH4NPOL, + .idle = CONFIG_N32H7_ATIM1_CH4NIDLE, + .pincfg = GPIO_ATIM1_CH4NOUT, + }, +#endif + }, +#endif +}; + +static struct n32_pwmtimer_s g_pwmatim1dev = +{ + .ops = &g_pwmops, + .timid = 1, + .channels = g_pwmatim1channels, + .timtype = TIMTYPE_ADVANCED, + .mode = CONFIG_N32H7_ATIM1_MODE, + .lock = CONFIG_N32H7_ATIM1_LOCK, + .deadtime = CONFIG_N32H7_ATIM1_DEADTIME, + .t_dts = CONFIG_N32H7_ATIM1_TDTS, + .base = N32_ATIMER1_BASE, + .pclk = N32_AHB_FREQUENCY, + .frequency = 0, +#ifdef CONFIG_PWM_PULSECOUNT + .irq = N32_IRQ_ATIM1, + .handle = NULL, +#endif +}; +#endif /* CONFIG_N32H7_ATIM1_PWM */ + +#ifdef CONFIG_N32H7_ATIM2_PWM +static struct n32_pwmchan_s g_pwmatim2channels[] = +{ +#ifdef CONFIG_N32H7_ATIM2_CHANNEL1 + { + .channel = 1, + .mode = CONFIG_N32H7_ATIM2_CH1MODE, +#ifdef CONFIG_N32H7_ATIM2_BREAK1 + .brk = + { + .en1 = 1, + .pol1 = CONFIG_N32H7_ATIM2_BRK1POL, + }, +#endif + .out1 = + { + .in_use = 1, + .pol = CONFIG_N32H7_ATIM2_CH1POL, + .idle = CONFIG_N32H7_ATIM2_CH1IDLE, + .pincfg = GPIO_ATIM2_CH1OUT, + }, +#ifdef CONFIG_N32H7_ATIM2_CH1NOUT + .out2 = + { + .in_use = 1, + .pol = CONFIG_N32H7_ATIM2_CH1NPOL, + .idle = CONFIG_N32H7_ATIM2_CH1NIDLE, + .pincfg = GPIO_ATIM2_CH1NOUT, + }, +#endif + }, +#endif +#ifdef CONFIG_N32H7_ATIM2_CHANNEL2 + { + .channel = 2, + .mode = CONFIG_N32H7_ATIM2_CH2MODE, + .out1 = + { + .in_use = 1, + .pol = CONFIG_N32H7_ATIM2_CH2POL, + .idle = CONFIG_N32H7_ATIM2_CH2IDLE, + .pincfg = GPIO_ATIM2_CH2OUT, + }, +#ifdef CONFIG_N32H7_ATIM2_CH2NOUT + .out2 = + { + .in_use = 1, + .pol = CONFIG_N32H7_ATIM2_CH2NPOL, + .idle = CONFIG_N32H7_ATIM2_CH2NIDLE, + .pincfg = GPIO_ATIM2_CH2NOUT, + }, +#endif + }, +#endif +#ifdef CONFIG_N32H7_ATIM2_CHANNEL3 + { + .channel = 3, + .mode = CONFIG_N32H7_ATIM2_CH3MODE, + .out1 = + { + .in_use = 1, + .pol = CONFIG_N32H7_ATIM2_CH3POL, + .idle = CONFIG_N32H7_ATIM2_CH3IDLE, + .pincfg = GPIO_ATIM2_CH3OUT, + }, +#ifdef CONFIG_N32H7_ATIM2_CH3NOUT + .out2 = + { + .in_use = 1, + .pol = CONFIG_N32H7_ATIM2_CH3NPOL, + .idle = CONFIG_N32H7_ATIM2_CH3NIDLE, + .pincfg = GPIO_ATIM2_CH3NOUT, + }, +#endif + }, +#endif +#ifdef CONFIG_N32H7_ATIM2_CHANNEL4 + { + .channel = 4, + .mode = CONFIG_N32H7_ATIM2_CH4MODE, + .out1 = + { + .in_use = 1, + .pol = CONFIG_N32H7_ATIM2_CH4POL, + .idle = CONFIG_N32H7_ATIM2_CH4IDLE, + .pincfg = GPIO_ATIM2_CH4OUT, + }, +#ifdef CONFIG_N32H7_ATIM2_CH4NOUT + .out2 = + { + .in_use = 1, + .pol = CONFIG_N32H7_ATIM2_CH4NPOL, + .idle = CONFIG_N32H7_ATIM2_CH4NIDLE, + .pincfg = GPIO_ATIM2_CH4NOUT, + }, +#endif + }, +#endif +}; + +static struct n32_pwmtimer_s g_pwmatim2dev = +{ + .ops = &g_pwmops, + .timid = 2, + .channels = g_pwmatim2channels, + .timtype = TIMTYPE_ADVANCED, + .mode = CONFIG_N32H7_ATIM2_MODE, + .lock = CONFIG_N32H7_ATIM2_LOCK, + .deadtime = CONFIG_N32H7_ATIM2_DEADTIME, + .t_dts = CONFIG_N32H7_ATIM2_TDTS, + .base = N32_ATIMER2_BASE, + .pclk = N32_AHB_FREQUENCY, + .frequency = 0, +#ifdef CONFIG_PWM_PULSECOUNT + .irq = N32_IRQ_ATIM2, + .handle = NULL, +#endif +}; +#endif /* CONFIG_N32H7_ATIM2_PWM */ + +#ifdef CONFIG_N32H7_ATIM3_PWM +static struct n32_pwmchan_s g_pwmatim3channels[] = +{ +#ifdef CONFIG_N32H7_ATIM3_CHANNEL1 + { + .channel = 1, + .mode = CONFIG_N32H7_ATIM3_CH1MODE, +#ifdef CONFIG_N32H7_ATIM3_BREAK1 + .brk = + { + .en1 = 1, + .pol1 = CONFIG_N32H7_ATIM3_BRK1POL, + }, +#endif + .out1 = + { + .in_use = 1, + .pol = CONFIG_N32H7_ATIM3_CH1POL, + .idle = CONFIG_N32H7_ATIM3_CH1IDLE, + .pincfg = GPIO_ATIM3_CH1OUT, + }, +#ifdef CONFIG_N32H7_ATIM3_CH1NOUT + .out2 = + { + .in_use = 1, + .pol = CONFIG_N32H7_ATIM3_CH1NPOL, + .idle = CONFIG_N32H7_ATIM3_CH1NIDLE, + .pincfg = GPIO_ATIM3_CH1NOUT, + }, +#endif + }, +#endif +#ifdef CONFIG_N32H7_ATIM3_CHANNEL2 + { + .channel = 2, + .mode = CONFIG_N32H7_ATIM3_CH2MODE, + .out1 = + { + .in_use = 1, + .pol = CONFIG_N32H7_ATIM3_CH2POL, + .idle = CONFIG_N32H7_ATIM3_CH2IDLE, + .pincfg = GPIO_ATIM3_CH2OUT, + }, +#ifdef CONFIG_N32H7_ATIM3_CH2NOUT + .out2 = + { + .in_use = 1, + .pol = CONFIG_N32H7_ATIM3_CH2NPOL, + .idle = CONFIG_N32H7_ATIM3_CH2NIDLE, + .pincfg = GPIO_ATIM3_CH2NOUT, + }, +#endif + }, +#endif +#ifdef CONFIG_N32H7_ATIM3_CHANNEL3 + { + .channel = 3, + .mode = CONFIG_N32H7_ATIM3_CH3MODE, + .out1 = + { + .in_use = 1, + .pol = CONFIG_N32H7_ATIM3_CH3POL, + .idle = CONFIG_N32H7_ATIM3_CH3IDLE, + .pincfg = GPIO_ATIM3_CH3OUT, + }, +#ifdef CONFIG_N32H7_ATIM3_CH3NOUT + .out2 = + { + .in_use = 1, + .pol = CONFIG_N32H7_ATIM3_CH3NPOL, + .idle = CONFIG_N32H7_ATIM3_CH3NIDLE, + .pincfg = GPIO_ATIM3_CH3NOUT, + }, +#endif + }, +#endif +#ifdef CONFIG_N32H7_ATIM3_CHANNEL4 + { + .channel = 4, + .mode = CONFIG_N32H7_ATIM3_CH4MODE, + .out1 = + { + .in_use = 1, + .pol = CONFIG_N32H7_ATIM3_CH4POL, + .idle = CONFIG_N32H7_ATIM3_CH4IDLE, + .pincfg = GPIO_ATIM3_CH4OUT, + }, +#ifdef CONFIG_N32H7_ATIM3_CH4NOUT + .out2 = + { + .in_use = 1, + .pol = CONFIG_N32H7_ATIM3_CH4NPOL, + .idle = CONFIG_N32H7_ATIM3_CH4NIDLE, + .pincfg = GPIO_ATIM3_CH4NOUT, + }, +#endif + }, +#endif +}; + +static struct n32_pwmtimer_s g_pwmatim3dev = +{ + .ops = &g_pwmops, + .timid = 3, + .channels = g_pwmatim3channels, + .timtype = TIMTYPE_ADVANCED, + .mode = CONFIG_N32H7_ATIM3_MODE, + .lock = CONFIG_N32H7_ATIM3_LOCK, + .deadtime = CONFIG_N32H7_ATIM3_DEADTIME, + .t_dts = CONFIG_N32H7_ATIM3_TDTS, + .base = N32_ATIMER3_BASE, + .pclk = N32_AHB_FREQUENCY, + .frequency = 0, +#ifdef CONFIG_PWM_PULSECOUNT + .irq = N32_IRQ_ATIM3, + .handle = NULL, +#endif +}; +#endif /* CONFIG_N32H7_ATIM3_PWM */ + +#ifdef CONFIG_N32H7_ATIM4_PWM +static struct n32_pwmchan_s g_pwmatim4channels[] = +{ +#ifdef CONFIG_N32H7_ATIM4_CHANNEL1 + { + .channel = 1, + .mode = CONFIG_N32H7_ATIM4_CH1MODE, +#ifdef CONFIG_N32H7_ATIM4_BREAK1 + .brk = + { + .en1 = 1, + .pol1 = CONFIG_N32H7_ATIM4_BRK1POL, + }, +#endif + .out1 = + { + .in_use = 1, + .pol = CONFIG_N32H7_ATIM4_CH1POL, + .idle = CONFIG_N32H7_ATIM4_CH1IDLE, + .pincfg = GPIO_ATIM4_CH1OUT, + }, +#ifdef CONFIG_N32H7_ATIM4_CH1NOUT + .out2 = + { + .in_use = 1, + .pol = CONFIG_N32H7_ATIM4_CH1NPOL, + .idle = CONFIG_N32H7_ATIM4_CH1NIDLE, + .pincfg = GPIO_ATIM4_CH1NOUT, + }, +#endif + }, +#endif +#ifdef CONFIG_N32H7_ATIM4_CHANNEL2 + { + .channel = 2, + .mode = CONFIG_N32H7_ATIM4_CH2MODE, + .out1 = + { + .in_use = 1, + .pol = CONFIG_N32H7_ATIM4_CH2POL, + .idle = CONFIG_N32H7_ATIM4_CH2IDLE, + .pincfg = GPIO_ATIM4_CH2OUT, + }, +#ifdef CONFIG_N32H7_ATIM4_CH2NOUT + .out2 = + { + .in_use = 1, + .pol = CONFIG_N32H7_ATIM4_CH2NPOL, + .idle = CONFIG_N32H7_ATIM4_CH2NIDLE, + .pincfg = GPIO_ATIM4_CH2NOUT, + }, +#endif + }, +#endif +#ifdef CONFIG_N32H7_ATIM4_CHANNEL3 + { + .channel = 3, + .mode = CONFIG_N32H7_ATIM4_CH3MODE, + .out1 = + { + .in_use = 1, + .pol = CONFIG_N32H7_ATIM4_CH3POL, + .idle = CONFIG_N32H7_ATIM4_CH3IDLE, + .pincfg = GPIO_ATIM4_CH3OUT, + }, +#ifdef CONFIG_N32H7_ATIM4_CH3NOUT + .out2 = + { + .in_use = 1, + .pol = CONFIG_N32H7_ATIM4_CH3NPOL, + .idle = CONFIG_N32H7_ATIM4_CH3NIDLE, + .pincfg = GPIO_ATIM4_CH3NOUT, + }, +#endif + }, +#endif +#ifdef CONFIG_N32H7_ATIM4_CHANNEL4 + { + .channel = 4, + .mode = CONFIG_N32H7_ATIM4_CH4MODE, + .out1 = + { + .in_use = 1, + .pol = CONFIG_N32H7_ATIM4_CH4POL, + .idle = CONFIG_N32H7_ATIM4_CH4IDLE, + .pincfg = GPIO_ATIM4_CH4OUT, + }, +#ifdef CONFIG_N32H7_ATIM4_CH4NOUT + .out2 = + { + .in_use = 1, + .pol = CONFIG_N32H7_ATIM4_CH4NPOL, + .idle = CONFIG_N32H7_ATIM4_CH4NIDLE, + .pincfg = GPIO_ATIM4_CH4NOUT, + }, +#endif + }, +#endif +}; + +static struct n32_pwmtimer_s g_pwmatim4dev = +{ + .ops = &g_pwmops, + .timid = 4, + .channels = g_pwmatim4channels, + .timtype = TIMTYPE_ADVANCED, + .mode = CONFIG_N32H7_ATIM4_MODE, + .lock = CONFIG_N32H7_ATIM4_LOCK, + .deadtime = CONFIG_N32H7_ATIM4_DEADTIME, + .t_dts = CONFIG_N32H7_ATIM4_TDTS, + .base = N32_ATIMER4_BASE, + .pclk = N32_AHB_FREQUENCY, + .frequency = 0, +#ifdef CONFIG_PWM_PULSECOUNT + .irq = N32_IRQ_ATIM4, + .handle = NULL, +#endif +}; +#endif /* CONFIG_N32H7_ATIM4_PWM */ + +#ifdef CONFIG_N32H7_GTIMA1_PWM +static struct n32_pwmchan_s g_pwmgtima1channels[] = +{ +#ifdef CONFIG_N32H7_GTIMA1_CHANNEL1 + { + .channel = 1, + .mode = CONFIG_N32H7_GTIMA1_CH1MODE, + .out1 = + { + .in_use = 1, + .pol = CONFIG_N32H7_GTIMA1_CH1POL, + .idle = CONFIG_N32H7_GTIMA1_CH1IDLE, + .pincfg = GPIO_GTIMA1_CH1OUT, + }, + }, +#endif +#ifdef CONFIG_N32H7_GTIMA1_CHANNEL2 + { + .channel = 2, + .mode = CONFIG_N32H7_GTIMA1_CH2MODE, + .out1 = + { + .in_use = 1, + .pol = CONFIG_N32H7_GTIMA1_CH2POL, + .idle = CONFIG_N32H7_GTIMA1_CH2IDLE, + .pincfg = GPIO_GTIMA1_CH2OUT, + }, + }, +#endif +#ifdef CONFIG_N32H7_GTIMA1_CHANNEL3 + { + .channel = 3, + .mode = CONFIG_N32H7_GTIMA1_CH3MODE, + .out1 = + { + .in_use = 1, + .pol = CONFIG_N32H7_GTIMA1_CH3POL, + .idle = CONFIG_N32H7_GTIMA1_CH3IDLE, + .pincfg = GPIO_GTIMA1_CH3OUT, + }, + }, +#endif +#ifdef CONFIG_N32H7_GTIMA1_CHANNEL4 + { + .channel = 4, + .mode = CONFIG_N32H7_GTIMA1_CH4MODE, + .out1 = + { + .in_use = 1, + .pol = CONFIG_N32H7_GTIMA1_CH4POL, + .idle = CONFIG_N32H7_GTIMA1_CH4IDLE, + .pincfg = GPIO_GTIMA1_CH4OUT, + }, + }, +#endif +}; + +static struct n32_pwmtimer_s g_pwmgtima1dev = +{ + .ops = &g_pwmops, + .timid = 5, + .channels = g_pwmgtima1channels, + .timtype = TIMTYPE_GENERAL16, + .mode = CONFIG_N32H7_GTIMA1_MODE, + .lock = 0, + .deadtime = 0, + .t_dts = 0, + .base = N32_GTIMERA1_BASE, + .pclk = N32_AHB_FREQUENCY, + .frequency = 0, +#ifdef CONFIG_PWM_PULSECOUNT + .irq = N32_IRQ_GTIMA1, + .handle = NULL, +#endif +}; +#endif /* CONFIG_N32H7_GTIMA1_PWM */ + +#ifdef CONFIG_N32H7_GTIMA2_PWM +static struct n32_pwmchan_s g_pwmgtima2channels[] = +{ +#ifdef CONFIG_N32H7_GTIMA2_CHANNEL1 + { + .channel = 1, + .mode = CONFIG_N32H7_GTIMA2_CH1MODE, + .out1 = + { + .in_use = 1, + .pol = CONFIG_N32H7_GTIMA2_CH1POL, + .idle = CONFIG_N32H7_GTIMA2_CH1IDLE, + .pincfg = GPIO_GTIMA2_CH1OUT, + }, + }, +#endif +#ifdef CONFIG_N32H7_GTIMA2_CHANNEL2 + { + .channel = 2, + .mode = CONFIG_N32H7_GTIMA2_CH2MODE, + .out1 = + { + .in_use = 1, + .pol = CONFIG_N32H7_GTIMA2_CH2POL, + .idle = CONFIG_N32H7_GTIMA2_CH2IDLE, + .pincfg = GPIO_GTIMA2_CH2OUT, + }, + }, +#endif +#ifdef CONFIG_N32H7_GTIMA2_CHANNEL3 + { + .channel = 3, + .mode = CONFIG_N32H7_GTIMA2_CH3MODE, + .out1 = + { + .in_use = 1, + .pol = CONFIG_N32H7_GTIMA2_CH3POL, + .idle = CONFIG_N32H7_GTIMA2_CH3IDLE, + .pincfg = GPIO_GTIMA2_CH3OUT, + }, + }, +#endif +#ifdef CONFIG_N32H7_GTIMA2_CHANNEL4 + { + .channel = 4, + .mode = CONFIG_N32H7_GTIMA2_CH4MODE, + .out1 = + { + .in_use = 1, + .pol = CONFIG_N32H7_GTIMA2_CH4POL, + .idle = CONFIG_N32H7_GTIMA2_CH4IDLE, + .pincfg = GPIO_GTIMA2_CH4OUT, + }, + }, +#endif +}; + +static struct n32_pwmtimer_s g_pwmgtima2dev = +{ + .ops = &g_pwmops, + .timid = 6, + .channels = g_pwmgtima2channels, + .timtype = TIMTYPE_GENERAL16, + .mode = CONFIG_N32H7_GTIMA2_MODE, + .lock = 0, + .deadtime = 0, + .t_dts = 0, + .base = N32_GTIMERA2_BASE, + .pclk = N32_AHB_FREQUENCY, + .frequency = 0, +#ifdef CONFIG_PWM_PULSECOUNT + .irq = N32_IRQ_GTIMA2, + .handle = NULL, +#endif +}; +#endif /* CONFIG_N32H7_GTIMA2_PWM */ + +#ifdef CONFIG_N32H7_GTIMA3_PWM +static struct n32_pwmchan_s g_pwmgtima3channels[] = +{ +#ifdef CONFIG_N32H7_GTIMA3_CHANNEL1 + { + .channel = 1, + .mode = CONFIG_N32H7_GTIMA3_CH1MODE, + .out1 = + { + .in_use = 1, + .pol = CONFIG_N32H7_GTIMA3_CH1POL, + .idle = CONFIG_N32H7_GTIMA3_CH1IDLE, + .pincfg = GPIO_GTIMA3_CH1OUT, + }, + }, +#endif +#ifdef CONFIG_N32H7_GTIMA3_CHANNEL2 + { + .channel = 2, + .mode = CONFIG_N32H7_GTIMA3_CH2MODE, + .out1 = + { + .in_use = 1, + .pol = CONFIG_N32H7_GTIMA3_CH2POL, + .idle = CONFIG_N32H7_GTIMA3_CH2IDLE, + .pincfg = GPIO_GTIMA3_CH2OUT, + }, + }, +#endif +#ifdef CONFIG_N32H7_GTIMA3_CHANNEL3 + { + .channel = 3, + .mode = CONFIG_N32H7_GTIMA3_CH3MODE, + .out1 = + { + .in_use = 1, + .pol = CONFIG_N32H7_GTIMA3_CH3POL, + .idle = CONFIG_N32H7_GTIMA3_CH3IDLE, + .pincfg = GPIO_GTIMA3_CH3OUT, + }, + }, +#endif +#ifdef CONFIG_N32H7_GTIMA3_CHANNEL4 + { + .channel = 4, + .mode = CONFIG_N32H7_GTIMA3_CH4MODE, + .out1 = + { + .in_use = 1, + .pol = CONFIG_N32H7_GTIMA3_CH4POL, + .idle = CONFIG_N32H7_GTIMA3_CH4IDLE, + .pincfg = GPIO_GTIMA3_CH4OUT, + }, + }, +#endif +}; + +static struct n32_pwmtimer_s g_pwmgtima3dev = +{ + .ops = &g_pwmops, + .timid = 7, + .channels = g_pwmgtima3channels, + .timtype = TIMTYPE_GENERAL16, + .mode = CONFIG_N32H7_GTIMA3_MODE, + .lock = 0, + .deadtime = 0, + .t_dts = 0, + .base = N32_GTIMERA3_BASE, + .pclk = N32_AHB_FREQUENCY, + .frequency = 0, +#ifdef CONFIG_PWM_PULSECOUNT + .irq = N32_IRQ_GTIMA3, + .handle = NULL, +#endif +}; +#endif /* CONFIG_N32H7_GTIMA3_PWM */ + +#ifdef CONFIG_N32H7_GTIMA4_PWM +static struct n32_pwmchan_s g_pwmgtima4channels[] = +{ +#ifdef CONFIG_N32H7_GTIMA4_CHANNEL1 + { + .channel = 1, + .mode = CONFIG_N32H7_GTIMA4_CH1MODE, + .out1 = + { + .in_use = 1, + .pol = CONFIG_N32H7_GTIMA4_CH1POL, + .idle = CONFIG_N32H7_GTIMA4_CH1IDLE, + .pincfg = GPIO_GTIMA4_CH1OUT, + }, + }, +#endif +#ifdef CONFIG_N32H7_GTIMA4_CHANNEL2 + { + .channel = 2, + .mode = CONFIG_N32H7_GTIMA4_CH2MODE, + .out1 = + { + .in_use = 1, + .pol = CONFIG_N32H7_GTIMA4_CH2POL, + .idle = CONFIG_N32H7_GTIMA4_CH2IDLE, + .pincfg = GPIO_GTIMA4_CH2OUT, + }, + }, +#endif +#ifdef CONFIG_N32H7_GTIMA4_CHANNEL3 + { + .channel = 3, + .mode = CONFIG_N32H7_GTIMA4_CH3MODE, + .out1 = + { + .in_use = 1, + .pol = CONFIG_N32H7_GTIMA4_CH3POL, + .idle = CONFIG_N32H7_GTIMA4_CH3IDLE, + .pincfg = GPIO_GTIMA4_CH3OUT, + }, + }, +#endif +#ifdef CONFIG_N32H7_GTIMA4_CHANNEL4 + { + .channel = 4, + .mode = CONFIG_N32H7_GTIMA4_CH4MODE, + .out1 = + { + .in_use = 1, + .pol = CONFIG_N32H7_GTIMA4_CH4POL, + .idle = CONFIG_N32H7_GTIMA4_CH4IDLE, + .pincfg = GPIO_GTIMA4_CH4OUT, + }, + }, +#endif +}; + +static struct n32_pwmtimer_s g_pwmgtima4dev = +{ + .ops = &g_pwmops, + .timid = 8, + .channels = g_pwmgtima4channels, + .timtype = TIMTYPE_GENERAL16, + .mode = CONFIG_N32H7_GTIMA4_MODE, + .lock = 0, + .deadtime = 0, + .t_dts = 0, + .base = N32_GTIMERA4_BASE, + .pclk = N32_AHB_FREQUENCY, + .frequency = 0, +#ifdef CONFIG_PWM_PULSECOUNT + .irq = N32_IRQ_GTIMA4, + .handle = NULL, +#endif +}; +#endif /* CONFIG_N32H7_GTIMA4_PWM */ + +#ifdef CONFIG_N32H7_GTIMA5_PWM +static struct n32_pwmchan_s g_pwmgtima5channels[] = +{ +#ifdef CONFIG_N32H7_GTIMA5_CHANNEL1 + { + .channel = 1, + .mode = CONFIG_N32H7_GTIMA5_CH1MODE, + .out1 = + { + .in_use = 1, + .pol = CONFIG_N32H7_GTIMA5_CH1POL, + .idle = CONFIG_N32H7_GTIMA5_CH1IDLE, + .pincfg = GPIO_GTIMA5_CH1OUT, + }, + }, +#endif +#ifdef CONFIG_N32H7_GTIMA5_CHANNEL2 + { + .channel = 2, + .mode = CONFIG_N32H7_GTIMA5_CH2MODE, + .out1 = + { + .in_use = 1, + .pol = CONFIG_N32H7_GTIMA5_CH2POL, + .idle = CONFIG_N32H7_GTIMA5_CH2IDLE, + .pincfg = GPIO_GTIMA5_CH2OUT, + }, + }, +#endif +#ifdef CONFIG_N32H7_GTIMA5_CHANNEL3 + { + .channel = 3, + .mode = CONFIG_N32H7_GTIMA5_CH3MODE, + .out1 = + { + .in_use = 1, + .pol = CONFIG_N32H7_GTIMA5_CH3POL, + .idle = CONFIG_N32H7_GTIMA5_CH3IDLE, + .pincfg = GPIO_GTIMA5_CH3OUT, + }, + }, +#endif +#ifdef CONFIG_N32H7_GTIMA5_CHANNEL4 + { + .channel = 4, + .mode = CONFIG_N32H7_GTIMA5_CH4MODE, + .out1 = + { + .in_use = 1, + .pol = CONFIG_N32H7_GTIMA5_CH4POL, + .idle = CONFIG_N32H7_GTIMA5_CH4IDLE, + .pincfg = GPIO_GTIMA5_CH4OUT, + }, + }, +#endif +}; + +static struct n32_pwmtimer_s g_pwmgtima5dev = +{ + .ops = &g_pwmops, + .timid = 9, + .channels = g_pwmgtima5channels, + .timtype = TIMTYPE_GENERAL16, + .mode = CONFIG_N32H7_GTIMA5_MODE, + .lock = 0, + .deadtime = 0, + .t_dts = 0, + .base = N32_GTIMERA5_BASE, + .pclk = N32_AHB_FREQUENCY, + .frequency = 0, +#ifdef CONFIG_PWM_PULSECOUNT + .irq = N32_IRQ_GTIMA5, + .handle = NULL, +#endif +}; +#endif /* CONFIG_N32H7_GTIMA5_PWM */ + +#ifdef CONFIG_N32H7_GTIMA6_PWM +static struct n32_pwmchan_s g_pwmgtima6channels[] = +{ +#ifdef CONFIG_N32H7_GTIMA6_CHANNEL1 + { + .channel = 1, + .mode = CONFIG_N32H7_GTIMA6_CH1MODE, + .out1 = + { + .in_use = 1, + .pol = CONFIG_N32H7_GTIMA6_CH1POL, + .idle = CONFIG_N32H7_GTIMA6_CH1IDLE, + .pincfg = GPIO_GTIMA6_CH1OUT, + }, + }, +#endif +#ifdef CONFIG_N32H7_GTIMA6_CHANNEL2 + { + .channel = 2, + .mode = CONFIG_N32H7_GTIMA6_CH2MODE, + .out1 = + { + .in_use = 1, + .pol = CONFIG_N32H7_GTIMA6_CH2POL, + .idle = CONFIG_N32H7_GTIMA6_CH2IDLE, + .pincfg = GPIO_GTIMA6_CH2OUT, + }, + }, +#endif +#ifdef CONFIG_N32H7_GTIMA6_CHANNEL3 + { + .channel = 3, + .mode = CONFIG_N32H7_GTIMA6_CH3MODE, + .out1 = + { + .in_use = 1, + .pol = CONFIG_N32H7_GTIMA6_CH3POL, + .idle = CONFIG_N32H7_GTIMA6_CH3IDLE, + .pincfg = GPIO_GTIMA6_CH3OUT, + }, + }, +#endif +#ifdef CONFIG_N32H7_GTIMA6_CHANNEL4 + { + .channel = 4, + .mode = CONFIG_N32H7_GTIMA6_CH4MODE, + .out1 = + { + .in_use = 1, + .pol = CONFIG_N32H7_GTIMA6_CH4POL, + .idle = CONFIG_N32H7_GTIMA6_CH4IDLE, + .pincfg = GPIO_GTIMA6_CH4OUT, + }, + }, +#endif +}; + +static struct n32_pwmtimer_s g_pwmgtima6dev = +{ + .ops = &g_pwmops, + .timid = 10, + .channels = g_pwmgtima6channels, + .timtype = TIMTYPE_GENERAL16, + .mode = CONFIG_N32H7_GTIMA6_MODE, + .lock = 0, + .deadtime = 0, + .t_dts = 0, + .base = N32_GTIMERA6_BASE, + .pclk = N32_AHB_FREQUENCY, + .frequency = 0, +#ifdef CONFIG_PWM_PULSECOUNT + .irq = N32_IRQ_GTIMA6, + .handle = NULL, +#endif +}; +#endif /* CONFIG_N32H7_GTIMA6_PWM */ + +#ifdef CONFIG_N32H7_GTIMA7_PWM +static struct n32_pwmchan_s g_pwmgtima7channels[] = +{ +#ifdef CONFIG_N32H7_GTIMA7_CHANNEL1 + { + .channel = 1, + .mode = CONFIG_N32H7_GTIMA7_CH1MODE, + .out1 = + { + .in_use = 1, + .pol = CONFIG_N32H7_GTIMA7_CH1POL, + .idle = CONFIG_N32H7_GTIMA7_CH1IDLE, + .pincfg = GPIO_GTIMA7_CH1OUT, + }, + }, +#endif +#ifdef CONFIG_N32H7_GTIMA7_CHANNEL2 + { + .channel = 2, + .mode = CONFIG_N32H7_GTIMA7_CH2MODE, + .out1 = + { + .in_use = 1, + .pol = CONFIG_N32H7_GTIMA7_CH2POL, + .idle = CONFIG_N32H7_GTIMA7_CH2IDLE, + .pincfg = GPIO_GTIMA7_CH2OUT, + }, + }, +#endif +#ifdef CONFIG_N32H7_GTIMA7_CHANNEL3 + { + .channel = 3, + .mode = CONFIG_N32H7_GTIMA7_CH3MODE, + .out1 = + { + .in_use = 1, + .pol = CONFIG_N32H7_GTIMA7_CH3POL, + .idle = CONFIG_N32H7_GTIMA7_CH3IDLE, + .pincfg = GPIO_GTIMA7_CH3OUT, + }, + }, +#endif +#ifdef CONFIG_N32H7_GTIMA7_CHANNEL4 + { + .channel = 4, + .mode = CONFIG_N32H7_GTIMA7_CH4MODE, + .out1 = + { + .in_use = 1, + .pol = CONFIG_N32H7_GTIMA7_CH4POL, + .idle = CONFIG_N32H7_GTIMA7_CH4IDLE, + .pincfg = GPIO_GTIMA7_CH4OUT, + }, + }, +#endif +}; + +static struct n32_pwmtimer_s g_pwmgtima7dev = +{ + .ops = &g_pwmops, + .timid = 11, + .channels = g_pwmgtima7channels, + .timtype = TIMTYPE_GENERAL16, + .mode = CONFIG_N32H7_GTIMA7_MODE, + .lock = 0, + .deadtime = 0, + .t_dts = 0, + .base = N32_GTIMERA7_BASE, + .pclk = N32_AHB_FREQUENCY, + .frequency = 0, +#ifdef CONFIG_PWM_PULSECOUNT + .irq = N32_IRQ_GTIMA7, + .handle = NULL, +#endif +}; +#endif /* CONFIG_N32H7_GTIMA7_PWM */ + +#ifdef CONFIG_N32H7_GTIMB1_PWM +static struct n32_pwmchan_s g_pwmgtimb1channels[] = +{ +#ifdef CONFIG_N32H7_GTIMB1_CHANNEL1 + { + .channel = 1, + .mode = CONFIG_N32H7_GTIMB1_CH1MODE, +#ifdef CONFIG_N32H7_GTIMB1_BREAK1 + .brk = + { + .en1 = 1, + .pol1 = CONFIG_N32H7_GTIMB1_BRK1POL, + }, +#endif + .out1 = + { + .in_use = 1, + .pol = CONFIG_N32H7_GTIMB1_CH1POL, + .idle = CONFIG_N32H7_GTIMB1_CH1IDLE, + .pincfg = GPIO_GTIMB1_CH1OUT, + }, +#ifdef CONFIG_N32H7_GTIMB1_CH1NOUT + .out2 = + { + .in_use = 1, + .pol = CONFIG_N32H7_GTIMB1_CH1NPOL, + .idle = CONFIG_N32H7_GTIMB1_CH1NIDLE, + .pincfg = GPIO_GTIMB1_CH1NOUT, + }, +#endif + }, +#endif +#ifdef CONFIG_N32H7_GTIMB1_CHANNEL2 + { + .channel = 2, + .mode = CONFIG_N32H7_GTIMB1_CH2MODE, + .out1 = + { + .in_use = 1, + .pol = CONFIG_N32H7_GTIMB1_CH2POL, + .idle = CONFIG_N32H7_GTIMB1_CH2IDLE, + .pincfg = GPIO_GTIMB1_CH2OUT, + }, + }, +#endif +#ifdef CONFIG_N32H7_GTIMB1_CHANNEL3 + { + .channel = 3, + .mode = CONFIG_N32H7_GTIMB1_CH3MODE, + .out1 = + { + .in_use = 1, + .pol = CONFIG_N32H7_GTIMB1_CH3POL, + .idle = CONFIG_N32H7_GTIMB1_CH3IDLE, + .pincfg = GPIO_GTIMB1_CH3OUT, + }, + }, +#endif +#ifdef CONFIG_N32H7_GTIMB1_CHANNEL4 + { + .channel = 4, + .mode = CONFIG_N32H7_GTIMB1_CH4MODE, + .out1 = + { + .in_use = 1, + .pol = CONFIG_N32H7_GTIMB1_CH4POL, + .idle = CONFIG_N32H7_GTIMB1_CH4IDLE, + .pincfg = GPIO_GTIMB1_CH4OUT, + }, + }, +#endif +}; + +static struct n32_pwmtimer_s g_pwmgtimb1dev = +{ + .ops = &g_pwmops, + .timid = 12, + .channels = g_pwmgtimb1channels, + .timtype = TIMTYPE_GTIMB, + .mode = CONFIG_N32H7_GTIMB1_MODE, + .lock = CONFIG_N32H7_GTIMB1_LOCK, + .deadtime = CONFIG_N32H7_GTIMB1_DEADTIME, + .t_dts = CONFIG_N32H7_GTIMB1_TDTS, + .base = N32_GTIMERB1_BASE, + .pclk = N32_AHB_FREQUENCY, + .frequency = 0, +#ifdef CONFIG_PWM_PULSECOUNT + .irq = N32_IRQ_GTIMB1, + .handle = NULL, +#endif +}; +#endif /* CONFIG_N32H7_GTIMB1_PWM */ + +#ifdef CONFIG_N32H7_GTIMB2_PWM +static struct n32_pwmchan_s g_pwmgtimb2channels[] = +{ +#ifdef CONFIG_N32H7_GTIMB2_CHANNEL1 + { + .channel = 1, + .mode = CONFIG_N32H7_GTIMB2_CH1MODE, +#ifdef CONFIG_N32H7_GTIMB2_BREAK1 + .brk = + { + .en1 = 1, + .pol1 = CONFIG_N32H7_GTIMB2_BRK1POL, + }, +#endif + .out1 = + { + .in_use = 1, + .pol = CONFIG_N32H7_GTIMB2_CH1POL, + .idle = CONFIG_N32H7_GTIMB2_CH1IDLE, + .pincfg = GPIO_GTIMB2_CH1OUT, + }, +#ifdef CONFIG_N32H7_GTIMB2_CH1NOUT + .out2 = + { + .in_use = 1, + .pol = CONFIG_N32H7_GTIMB2_CH1NPOL, + .idle = CONFIG_N32H7_GTIMB2_CH1NIDLE, + .pincfg = GPIO_GTIMB2_CH1NOUT, + }, +#endif + }, +#endif +#ifdef CONFIG_N32H7_GTIMB2_CHANNEL2 + { + .channel = 2, + .mode = CONFIG_N32H7_GTIMB2_CH2MODE, + .out1 = + { + .in_use = 1, + .pol = CONFIG_N32H7_GTIMB2_CH2POL, + .idle = CONFIG_N32H7_GTIMB2_CH2IDLE, + .pincfg = GPIO_GTIMB2_CH2OUT, + }, + }, +#endif +#ifdef CONFIG_N32H7_GTIMB2_CHANNEL3 + { + .channel = 3, + .mode = CONFIG_N32H7_GTIMB2_CH3MODE, + .out1 = + { + .in_use = 1, + .pol = CONFIG_N32H7_GTIMB2_CH3POL, + .idle = CONFIG_N32H7_GTIMB2_CH3IDLE, + .pincfg = GPIO_GTIMB2_CH3OUT, + }, + }, +#endif +#ifdef CONFIG_N32H7_GTIMB2_CHANNEL4 + { + .channel = 4, + .mode = CONFIG_N32H7_GTIMB2_CH4MODE, + .out1 = + { + .in_use = 1, + .pol = CONFIG_N32H7_GTIMB2_CH4POL, + .idle = CONFIG_N32H7_GTIMB2_CH4IDLE, + .pincfg = GPIO_GTIMB2_CH4OUT, + }, + }, +#endif +}; + +static struct n32_pwmtimer_s g_pwmgtimb2dev = +{ + .ops = &g_pwmops, + .timid = 13, + .channels = g_pwmgtimb2channels, + .timtype = TIMTYPE_GTIMB, + .mode = CONFIG_N32H7_GTIMB2_MODE, + .lock = CONFIG_N32H7_GTIMB2_LOCK, + .deadtime = CONFIG_N32H7_GTIMB2_DEADTIME, + .t_dts = CONFIG_N32H7_GTIMB2_TDTS, + .base = N32_GTIMERB2_BASE, + .pclk = N32_AHB_FREQUENCY, + .frequency = 0, +#ifdef CONFIG_PWM_PULSECOUNT + .irq = N32_IRQ_GTIMB2, + .handle = NULL, +#endif +}; +#endif /* CONFIG_N32H7_GTIMB2_PWM */ + +#ifdef CONFIG_N32H7_GTIMB3_PWM +static struct n32_pwmchan_s g_pwmgtimb3channels[] = +{ +#ifdef CONFIG_N32H7_GTIMB3_CHANNEL1 + { + .channel = 1, + .mode = CONFIG_N32H7_GTIMB3_CH1MODE, +#ifdef CONFIG_N32H7_GTIMB3_BREAK1 + .brk = + { + .en1 = 1, + .pol1 = CONFIG_N32H7_GTIMB3_BRK1POL, + }, +#endif + .out1 = + { + .in_use = 1, + .pol = CONFIG_N32H7_GTIMB3_CH1POL, + .idle = CONFIG_N32H7_GTIMB3_CH1IDLE, + .pincfg = GPIO_GTIMB3_CH1OUT, + }, +#ifdef CONFIG_N32H7_GTIMB3_CH1NOUT + .out2 = + { + .in_use = 1, + .pol = CONFIG_N32H7_GTIMB3_CH1NPOL, + .idle = CONFIG_N32H7_GTIMB3_CH1NIDLE, + .pincfg = GPIO_GTIMB3_CH1NOUT, + }, +#endif + }, +#endif +#ifdef CONFIG_N32H7_GTIMB3_CHANNEL2 + { + .channel = 2, + .mode = CONFIG_N32H7_GTIMB3_CH2MODE, + .out1 = + { + .in_use = 1, + .pol = CONFIG_N32H7_GTIMB3_CH2POL, + .idle = CONFIG_N32H7_GTIMB3_CH2IDLE, + .pincfg = GPIO_GTIMB3_CH2OUT, + }, + }, +#endif +#ifdef CONFIG_N32H7_GTIMB3_CHANNEL3 + { + .channel = 3, + .mode = CONFIG_N32H7_GTIMB3_CH3MODE, + .out1 = + { + .in_use = 1, + .pol = CONFIG_N32H7_GTIMB3_CH3POL, + .idle = CONFIG_N32H7_GTIMB3_CH3IDLE, + .pincfg = GPIO_GTIMB3_CH3OUT, + }, + }, +#endif +#ifdef CONFIG_N32H7_GTIMB3_CHANNEL4 + { + .channel = 4, + .mode = CONFIG_N32H7_GTIMB3_CH4MODE, + .out1 = + { + .in_use = 1, + .pol = CONFIG_N32H7_GTIMB3_CH4POL, + .idle = CONFIG_N32H7_GTIMB3_CH4IDLE, + .pincfg = GPIO_GTIMB3_CH4OUT, + }, + }, +#endif +}; + +static struct n32_pwmtimer_s g_pwmgtimb3dev = +{ + .ops = &g_pwmops, + .timid = 14, + .channels = g_pwmgtimb3channels, + .timtype = TIMTYPE_GTIMB, + .mode = CONFIG_N32H7_GTIMB3_MODE, + .lock = CONFIG_N32H7_GTIMB3_LOCK, + .deadtime = CONFIG_N32H7_GTIMB3_DEADTIME, + .t_dts = CONFIG_N32H7_GTIMB3_TDTS, + .base = N32_GTIMERB3_BASE, + .pclk = N32_AHB_FREQUENCY, + .frequency = 0, +#ifdef CONFIG_PWM_PULSECOUNT + .irq = N32_IRQ_GTIMB3, + .handle = NULL, +#endif +}; +#endif /* CONFIG_N32H7_GTIMB3_PWM */ + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: pwm_reg_is_32bit + ****************************************************************************/ + +static bool pwm_reg_is_32bit(uint8_t timtype, uint32_t offset) +{ + bool ret = false; + + /* Only GENERAL32 (not used for PWM) would have 32-bit registers */ + + if (timtype == TIMTYPE_GENERAL32) + { + if (offset == N32_PWM_CNT_OFFSET || + offset == N32_PWM_AR_OFFSET || + offset == N32_PWM_CCDAT1_OFFSET || + offset == N32_PWM_CCDAT2_OFFSET || + offset == N32_PWM_CCDAT3_OFFSET || + offset == N32_PWM_CCDAT4_OFFSET) + { + ret = true; + } + } + + /* Advanced timers have some 32-bit registers (CR2, CCMR, CCER, BDTR) */ + + else if (timtype == TIMTYPE_ADVANCED) + { + if (offset == N32_PWM_CTRL2_OFFSET || + offset == N32_PWM_CCMOD1_OFFSET || + offset == N32_PWM_CCMOD2_OFFSET || + offset == N32_PWM_CCEN_OFFSET || + offset == N32_PWM_BKDT_OFFSET || + offset == N32_PWM_CCMOD3_OFFSET) + { + ret = true; + } + } + + /* GTIMB also has some 32-bit regs (CTRL2, CCMOD1/2/3, CCEN, BKDT) */ + + else if (timtype == TIMTYPE_GTIMB) + { + if (offset == N32_PWM_CTRL2_OFFSET || + offset == N32_PWM_CCMOD1_OFFSET || + offset == N32_PWM_CCMOD2_OFFSET || + offset == N32_PWM_CCMOD3_OFFSET || + offset == N32_PWM_CCEN_OFFSET || + offset == N32_PWM_BKDT_OFFSET) + { + ret = true; + } + } + + return ret; +} + +/**************************************************************************** + * Name: pwm_getreg / pwm_putreg / pwm_modifyreg + ****************************************************************************/ + +static uint32_t pwm_getreg(struct n32_pwmtimer_s *priv, uint32_t offset) +{ + if (pwm_reg_is_32bit(priv->timtype, offset)) + { + return getreg32(priv->base + offset); + } + else + { + return getreg16(priv->base + offset); + } +} + +static void pwm_putreg(struct n32_pwmtimer_s *priv, uint32_t offset, + uint32_t value) +{ + if (pwm_reg_is_32bit(priv->timtype, offset)) + { + putreg32(value, priv->base + offset); + } + else + { + putreg16((uint16_t)value, priv->base + offset); + } +} + +static void pwm_modifyreg(struct n32_pwmtimer_s *priv, uint32_t offset, + uint32_t clearbits, uint32_t setbits) +{ + if (pwm_reg_is_32bit(priv->timtype, offset)) + { + modifyreg32(priv->base + offset, clearbits, setbits); + } + else + { + modifyreg16(priv->base + offset, (uint16_t)clearbits, + (uint16_t)setbits); + } +} + +/**************************************************************************** + * Name: pwm_set_apb_clock + * + * Description: + * Enable or disable APB clock for the timer peripheral + ****************************************************************************/ + +static int pwm_set_apb_clock(struct n32_pwmtimer_s *priv, bool on) +{ + uint32_t regaddr = 0; + uint32_t en_bit = 0; + + switch (priv->timid) + { + #ifdef CONFIG_N32H7_ATIM1_PWM + case 1: + regaddr = N32_RCC_APB2EN1; + en_bit = RCC_APB2EN1_M7ATIM1EN; + break; + #endif + #ifdef CONFIG_N32H7_ATIM2_PWM + case 2: + regaddr = N32_RCC_APB2EN1; + en_bit = RCC_APB2EN1_M7ATIM2EN; + break; + #endif + #ifdef CONFIG_N32H7_GTIMA1_PWM + case 3: + regaddr = N32_RCC_APB2EN1; + en_bit = RCC_APB2EN1_M7GTIMA1EN; + break; + #endif + #ifdef CONFIG_N32H7_GTIMA2_PWM + case 4: + regaddr = N32_RCC_APB2EN1; + en_bit = RCC_APB2EN1_M7GTIMA2EN; + break; + #endif + #ifdef CONFIG_N32H7_GTIMA3_PWM + case 5: + regaddr = N32_RCC_APB2EN1; + en_bit = RCC_APB2EN1_M7GTIMA3EN; + break; + #endif + #ifdef CONFIG_N32H7_ATIM3_PWM + case 6: + regaddr = N32_RCC_APB5EN1; + en_bit = RCC_APB5EN1_M7ATIM3EN; + break; + #endif + #ifdef CONFIG_N32H7_ATIM4_PWM + case 7: + regaddr = N32_RCC_APB5EN1; + en_bit = RCC_APB5EN1_M7ATIM4EN; + break; + #endif + #ifdef CONFIG_N32H7_GTIMA4_PWM + case 8: + regaddr = N32_RCC_APB1EN1; + en_bit = RCC_APB1EN1_M7GTIMA4EN; + break; + #endif + #ifdef CONFIG_N32H7_GTIMA5_PWM + case 9: + regaddr = N32_RCC_APB1EN2; + en_bit = RCC_APB1EN2_M7GTIMA5EN; + break; + #endif + #ifdef CONFIG_N32H7_GTIMA6_PWM + case 10: + regaddr = N32_RCC_APB1EN2; + en_bit = RCC_APB1EN2_M7GTIMA6EN; + break; + #endif + #ifdef CONFIG_N32H7_GTIMA7_PWM + case 11: + regaddr = N32_RCC_APB1EN2; + en_bit = RCC_APB1EN2_M7GTIMA7EN; + break; + #endif + #ifdef CONFIG_N32H7_GTIMB1_PWM + case 12: + regaddr = N32_RCC_APB1EN1; + en_bit = RCC_APB1EN1_M7GTIMB1EN; + break; + #endif + #ifdef CONFIG_N32H7_GTIMB2_PWM + case 13: + regaddr = N32_RCC_APB1EN1; + en_bit = RCC_APB1EN1_M7GTIMB2EN; + break; + #endif + #ifdef CONFIG_N32H7_GTIMB3_PWM + case 14: + regaddr = N32_RCC_APB1EN1; + en_bit = RCC_APB1EN1_M7GTIMB3EN; + break; + #endif + default: + return -EINVAL; + } + + if (on) + { + modifyreg32(regaddr, 0, en_bit); + } + else + { + modifyreg32(regaddr, en_bit, 0); + } + + return OK; +} + +/**************************************************************************** + * Name: pwm_timer_configure + * + * Description: + * Initial configuration for PWM timer (mode, ARPE, etc.) + ****************************************************************************/ + +static int pwm_timer_configure(struct n32_pwmtimer_s *priv) +{ + uint32_t cr1 = pwm_getreg(priv, N32_PWM_CTRL1_OFFSET); + + /* Set counter mode (if not basic) */ + + if (priv->timtype != TIMTYPE_BASIC) /* BASIC not used for PWM */ + { + cr1 &= ~(PWM_CR1_DIR | PWM_CR1_CMS_MASK); + + switch (priv->mode) + { + case 0: /* Up-count */ + cr1 |= N32_ATIM_CTRL1_EDGE; + break; + case 1: /* Down-count */ + cr1 |= N32_ATIM_CTRL1_EDGE | PWM_CR1_DIR; + break; + case 2: /* Center-aligned 1 */ + cr1 |= N32_ATIM_CTRL1_CENTER1; + break; + case 3: /* Center-aligned 2 */ + cr1 |= N32_ATIM_CTRL1_CENTER2; + break; + case 4: /* Center-aligned 3 */ + cr1 |= N32_ATIM_CTRL1_CENTER3; + break; + default: + return -EINVAL; + } + } + + /* Enable ARR preload */ + + cr1 |= PWM_CR1_ARPE; + pwm_putreg(priv, N32_PWM_CTRL1_OFFSET, cr1); + + return OK; +} + +/**************************************************************************** + * Name: pwm_break_dt_configure + * + * Description: + * Configure Break and Dead-time for advanced timers + ****************************************************************************/ + +static int pwm_break_dt_configure(struct n32_pwmtimer_s *priv) +{ + uint32_t bdtr = 0; + + /* Set clock division (CKD) for dead-time */ + + pwm_modifyreg(priv, N32_PWM_CTRL1_OFFSET, PWM_CR1_CKD_MASK, + priv->t_dts << N32_ATIM_CTRL1_CLKD_SHIFT); + + /* Dead-time */ + + bdtr |= (priv->deadtime << N32_ATIM_BKDT_DTGN_SHIFT); + + /* Break1 (if enabled) */ + + if (priv->channels[0].brk.en1) + { + bdtr |= PWM_BDTR_BKE; + if (priv->channels[0].brk.pol1 == N32_POL_NEG) + { + bdtr |= PWM_BDTR_BKP; + } + } + + /* Lock */ + + bdtr |= (priv->lock << N32_ATIM_BKDT_LCKCFG_SHIFT); + + /* Clear OSSI/OSSR (idle mode settings) */ + + bdtr &= ~(N32_ATIM_BKDT_OSSI | N32_ATIM_BKDT_OSSR); + + pwm_putreg(priv, N32_PWM_BKDT_OFFSET, bdtr); + return OK; +} + +/**************************************************************************** + * Name: pwm_frequency_update + * + * Description: + * Calculate and set prescaler and ARR for desired frequency + ****************************************************************************/ + +static int pwm_frequency_update(struct pwm_lowerhalf_s *dev, + uint32_t frequency) +{ + struct n32_pwmtimer_s *priv = (struct n32_pwmtimer_s *)dev; + uint32_t timclk = priv->pclk; + uint32_t prescaler; + uint32_t reload; + + prescaler = (timclk / frequency + 65534) / 65535; + if (prescaler < 1) + { + prescaler = 1; + } + + if (prescaler > 65536) + { + prescaler = 65536; + } + + reload = (timclk / prescaler) / frequency; + if (reload < 2) + { + reload = 1; + } + else if (reload > 65535) + { + reload = 65535; + } + else + { + reload--; + } + + pwm_putreg(priv, N32_PWM_PSC_OFFSET, prescaler - 1); + pwm_putreg(priv, N32_PWM_AR_OFFSET, reload); + priv->frequency = frequency; + return OK; +} + +/**************************************************************************** + * Name: pwm_mode_configure + * + * Description: + * Configure output compare mode for a channel + ****************************************************************************/ + +static int pwm_mode_configure(struct pwm_lowerhalf_s *dev, uint8_t channel, + uint32_t mode) +{ + struct n32_pwmtimer_s *priv = (struct n32_pwmtimer_s *)dev; + uint32_t ccmr_offset; + uint32_t shift; + uint32_t ccmr; + uint32_t ccmr_val; + uint32_t oc_pe_bit; + + if (channel <= 2) + { + ccmr_offset = N32_PWM_CCMOD1_OFFSET; + shift = (channel == 1) ? 0 : (N32_ATIM_CCMOD1_OC2MD_SHIFT - + N32_ATIM_CCMOD1_OC1MD_SHIFT); + oc_pe_bit = (channel == 1) ? N32_ATIM_CCMOD1_OC1PEN : + N32_ATIM_CCMOD1_OC2PEN; + } + else + { + ccmr_offset = N32_PWM_CCMOD2_OFFSET; + shift = (channel == 3) ? 0 : (N32_ATIM_CCMOD2_OC4MD_SHIFT - + N32_ATIM_CCMOD2_OC3MD_SHIFT); + oc_pe_bit = (channel == 3) ? N32_ATIM_CCMOD2_OC3PEN : + N32_ATIM_CCMOD2_OC4PEN; + } + + ccmr = pwm_getreg(priv, ccmr_offset); + ccmr &= ~(0xff << shift); /* clear OCxM and OCxPE */ + switch (mode) + { + case N32_CHANMODE_FRZN: + ccmr_val = N32_ATIM_CCMOD1_OCMODE_FRZN; + break; + case N32_CHANMODE_CHACT: + ccmr_val = N32_ATIM_CCMOD1_OCMODE_ACTIVE; + break; + case N32_CHANMODE_CHINACT: + ccmr_val = N32_ATIM_CCMOD1_OCMODE_INACTIVE; + break; + case N32_CHANMODE_OCREFTOG: + ccmr_val = N32_ATIM_CCMOD1_OCMODE_TOGGLE; + break; + case N32_CHANMODE_OCREFLO: + ccmr_val = N32_ATIM_CCMOD1_OCMODE_FORCELO; + break; + case N32_CHANMODE_OCREFHI: + ccmr_val = N32_ATIM_CCMOD1_OCMODE_FORCEHI; + break; + case N32_CHANMODE_PWM1: + ccmr_val = N32_ATIM_CCMOD1_OCMODE_PWM1; + break; + case N32_CHANMODE_PWM2: + ccmr_val = N32_ATIM_CCMOD1_OCMODE_PWM2; + break; + default: + return -EINVAL; + } + + ccmr |= (ccmr_val << shift) | oc_pe_bit; + pwm_putreg(priv, ccmr_offset, ccmr); + return OK; +} + +/**************************************************************************** + * Name: pwm_output_configure + * + * Description: + * Configure polarity, idle state, and complementary for a channel + ****************************************************************************/ + +static int pwm_output_configure(struct n32_pwmtimer_s *priv, + struct n32_pwmchan_s *chan) +{ + uint32_t cr2 = pwm_getreg(priv, N32_PWM_CTRL2_OFFSET); + uint32_t ccer = pwm_getreg(priv, N32_PWM_CCEN_OFFSET); + uint8_t ch = chan->channel; + uint32_t shift = (ch - 1) * 4; + + /* Main output polarity */ + + if (chan->out1.pol == N32_POL_NEG) + { + ccer |= (PWM_CCER_CC1P << shift); + } + else + { + ccer &= ~(PWM_CCER_CC1P << shift); + } + + if (pwm_has_comp(priv)) + { + /* Main output idle state */ + + if (chan->out1.idle == N32_IDLE_ACTIVE) + { + cr2 |= (N32_ATIM_CTRL2_O11 << ((ch - 1) * 2)); + } + else + { + cr2 &= ~(N32_ATIM_CTRL2_O11 << ((ch - 1) * 2)); + } + + /* Complementary output */ + + if (chan->out2.in_use) + { + /* Polarity */ + + if (chan->out2.pol == N32_POL_NEG) + { + ccer |= (PWM_CCER_CC1NP << shift); + } + else + { + ccer &= ~(PWM_CCER_CC1NP << shift); + } + + /* Idle state */ + + if (chan->out2.idle == N32_IDLE_ACTIVE) + { + cr2 |= (N32_ATIM_CTRL2_O11N << ((ch - 1) * 2)); + } + else + { + cr2 &= ~(N32_ATIM_CTRL2_O11N << ((ch - 1) * 2)); + } + } + } + else + { + /* GTIMA: clear NP bits if any */ + + ccer &= ~(PWM_CCER_CC1NP << shift); + } + + pwm_putreg(priv, N32_PWM_CTRL2_OFFSET, cr2); + pwm_putreg(priv, N32_PWM_CCEN_OFFSET, ccer); + return OK; +} + +/**************************************************************************** + * Name: pwm_outputs_enable + * + * Description: + * Enable or disable outputs in bulk + ****************************************************************************/ + +static int pwm_outputs_enable(struct pwm_lowerhalf_s *dev, uint16_t outputs, + bool state) +{ + struct n32_pwmtimer_s *priv = (struct n32_pwmtimer_s *)dev; + uint32_t ccer = pwm_getreg(priv, N32_PWM_CCEN_OFFSET); + uint32_t mask = 0; + + if (outputs & N32_PWM_OUT1) + { + mask |= PWM_CCER_CC1E; + } + + if (outputs & N32_PWM_OUT2) + { + mask |= PWM_CCER_CC2E; + } + + if (outputs & N32_PWM_OUT3) + { + mask |= PWM_CCER_CC3E; + } + + if (outputs & N32_PWM_OUT4) + { + mask |= PWM_CCER_CC4E; + } + + if (outputs & N32_PWM_OUT1N) + { + mask |= PWM_CCER_CC1NE; + } + + if (outputs & N32_PWM_OUT2N) + { + mask |= PWM_CCER_CC2NE; + } + + if (outputs & N32_PWM_OUT3N) + { + mask |= PWM_CCER_CC3NE; + } + + if (state) + { + ccer |= mask; + } + else + { + ccer &= ~mask; + } + + pwm_putreg(priv, N32_PWM_CCEN_OFFSET, ccer); + return OK; +} + +/**************************************************************************** + * Name: pwm_soft_break + * + * Description: + * Software break (enable/disable MOE) + ****************************************************************************/ + +static int pwm_soft_break(struct pwm_lowerhalf_s *dev, bool state) +{ + struct n32_pwmtimer_s *priv = (struct n32_pwmtimer_s *)dev; + + if (pwm_has_break(priv)) + { + if (state) + { + pwm_modifyreg(priv, N32_PWM_BKDT_OFFSET, PWM_BDTR_MOE, 0); + } + else + { + pwm_modifyreg(priv, N32_PWM_BKDT_OFFSET, 0, PWM_BDTR_MOE); + } + } + + return OK; +} + +/**************************************************************************** + * Name: pwm_soft_update + * + * Description: + * Generate software update event + ****************************************************************************/ + +static int pwm_soft_update(struct pwm_lowerhalf_s *dev) +{ + struct n32_pwmtimer_s *priv = (struct n32_pwmtimer_s *)dev; + + pwm_putreg(priv, N32_PWM_ETGEN_OFFSET, PWM_EGR_UG); + + return OK; +} + +/**************************************************************************** + * Name: pwm_outputs_from_channels + * + * Description: + * Build output mask from channel configuration + ****************************************************************************/ + +static uint16_t pwm_outputs_from_channels(struct n32_pwmtimer_s *priv) +{ + uint16_t outputs = 0; + + for (int i = 0; i < CONFIG_PWM_NCHANNELS; i++) + { + if (priv->channels[i].channel == 0) + { + continue; + } + + if (priv->channels[i].out1.in_use) + { + outputs |= (N32_PWM_OUT1 << ((priv->channels[i].channel - 1) * 2)); + } + + if (pwm_has_comp(priv) && priv->channels[i].out2.in_use) + { + outputs |= (N32_PWM_OUT1N << ((priv->channels[i].channel - 1) * 2) + ); + } + } + + return outputs; +} + +/**************************************************************************** + * Name: pwm_configure (non-pulsecount mode) + * + * Description: + * Initial configuration without pulsecount + ****************************************************************************/ + +static int pwm_configure(struct pwm_lowerhalf_s *dev) +{ + struct n32_pwmtimer_s *priv = (struct n32_pwmtimer_s *)dev; + int ret; + int i; + + /* Disable timer */ + + pwm_modifyreg(priv, N32_PWM_CTRL1_OFFSET, PWM_CR1_CEN, 0); + + /* Basic timer config */ + + ret = pwm_timer_configure(priv); + if (ret < 0) + { + return ret; + } + + /* Break/deadtime for advanced timers */ + + if (pwm_has_break(priv)) + { + ret = pwm_break_dt_configure(priv); + if (ret < 0) + { + return ret; + } + } + + /* Configure each channel */ + + for (i = 0; i < CONFIG_PWM_NCHANNELS; i++) + { + struct n32_pwmchan_s *chan = &priv->channels[i]; + + if (chan->channel == 0) + { + continue; + } + + ret = pwm_mode_configure(dev, chan->channel, chan->mode); + if (ret < 0) + { + return ret; + } + + ret = pwm_output_configure(priv, chan); + if (ret < 0) + { + return ret; + } + } + + /* Enable main output for advanced timers */ + + if (pwm_has_break(priv)) + { + pwm_soft_break(dev, false); + } + + return OK; +} + +/**************************************************************************** + * Name: pwm_start + ****************************************************************************/ + +static int pwm_start(struct pwm_lowerhalf_s *dev, + const struct pwm_info_s *info) +{ + struct n32_pwmtimer_s *priv = (struct n32_pwmtimer_s *)dev; + int ret; + + /* Set frequency */ + + ret = pwm_frequency_update(dev, info->frequency); + if (ret < 0) + { + return ret; + } + + /* Set duty for each channel */ + + for (int i = 0; i < CONFIG_PWM_NCHANNELS; i++) + { + if (info->channels[i].channel == -1) + { + break; + } + + if (info->channels[i].channel == 0) + { + continue; + } + + uint32_t reload = pwm_getreg(priv, N32_PWM_AR_OFFSET); + uint32_t ccr = (uint32_t)(b16toi(info->channels[i].duty * reload + + b16HALF)); + int ch = info->channels[i].channel; + + pwm_putreg(priv, N32_PWM_CCDAT1_OFFSET + (ch - 1) * 4, ccr); + } + + /* Enable outputs */ + + uint16_t outputs = pwm_outputs_from_channels(priv); + + ret = pwm_outputs_enable(dev, outputs, true); + if (ret < 0) + { + return ret; + } + + /* Generate update event and enable counter */ + + pwm_soft_update(dev); + pwm_modifyreg(priv, N32_PWM_CTRL1_OFFSET, 0, PWM_CR1_CEN); + return OK; +} + +/**************************************************************************** + * Name: pwm_stop + ****************************************************************************/ + +static int pwm_stop(struct pwm_lowerhalf_s *dev) +{ + struct n32_pwmtimer_s *priv = (struct n32_pwmtimer_s *)dev; + + pwm_modifyreg(priv, N32_PWM_CTRL1_OFFSET, PWM_CR1_CEN, 0); + pwm_outputs_enable(dev, 0xffff, false); + pwm_putreg(priv, N32_PWM_DINTEN_OFFSET, 0); + pwm_putreg(priv, N32_PWM_CNT_OFFSET, 0); + + priv->frequency = 0; + return OK; +} + +/**************************************************************************** + * Name: pwm_setup + ****************************************************************************/ + +static int pwm_setup(struct pwm_lowerhalf_s *dev) +{ + struct n32_pwmtimer_s *priv = (struct n32_pwmtimer_s *)dev; + int ret; + + /* Enable clock */ + + ret = pwm_set_apb_clock(priv, true); + if (ret < 0) + { + return ret; + } + + /* Configure GPIOs */ + + for (int i = 0; i < CONFIG_PWM_NCHANNELS; i++) + { + if (priv->channels[i].channel == 0) + { + continue; + } + + if (priv->channels[i].out1.in_use && priv->channels[i].out1.pincfg) + { + n32_configgpio(priv->channels[i].out1.pincfg); + } + + if (pwm_has_comp(priv) && priv->channels[i].out2.in_use && + priv->channels[i].out2.pincfg) + { + n32_configgpio(priv->channels[i].out2.pincfg); + } + } + + /* Configure timer */ + + ret = pwm_configure(dev); + if (ret < 0) + { + pwm_set_apb_clock(priv, false); + return ret; + } + + pwm_dumpregs(dev, "After setup"); + return OK; +} + +/**************************************************************************** + * Name: pwm_shutdown + ****************************************************************************/ + +static int pwm_shutdown(struct pwm_lowerhalf_s *dev) +{ + struct n32_pwmtimer_s *priv = (struct n32_pwmtimer_s *)dev; + + pwm_stop(dev); + pwm_set_apb_clock(priv, false); + + /* Unconfigure GPIOs */ + + for (int i = 0; i < CONFIG_PWM_NCHANNELS; i++) + { + if (priv->channels[i].channel == 0) + { + continue; + } + + if (priv->channels[i].out1.pincfg) + { + n32_unconfiggpio(priv->channels[i].out1.pincfg); + } + + if (priv->channels[i].out2.pincfg) + { + n32_unconfiggpio(priv->channels[i].out2.pincfg); + } + } + + return OK; +} + +/**************************************************************************** + * Name: pwm_ioctl + ****************************************************************************/ + +static int pwm_ioctl(struct pwm_lowerhalf_s *dev, int cmd, unsigned long arg) +{ + return -ENOTTY; +} + +/**************************************************************************** + * Name: pwm_dumpregs + ****************************************************************************/ + +#ifdef CONFIG_DEBUG_PWM_INFO +static void pwm_dumpregs(struct pwm_lowerhalf_s *dev, const char *msg) +{ + struct n32_pwmtimer_s *priv = (struct n32_pwmtimer_s *)dev; + + pwminfo("%s: CR1=%04x CR2=%04x CCER=%04x CNT=%04x ARR=%04x PSC=%04x\n", + msg, + pwm_getreg(priv, N32_PWM_CTRL1_OFFSET), + pwm_getreg(priv, N32_PWM_CTRL2_OFFSET), + pwm_getreg(priv, N32_PWM_CCEN_OFFSET), + pwm_getreg(priv, N32_PWM_CNT_OFFSET), + pwm_getreg(priv, N32_PWM_AR_OFFSET), + pwm_getreg(priv, N32_PWM_PSC_OFFSET)); +} +#endif + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +struct pwm_lowerhalf_s *n32_pwminitialize(int timer) +{ + struct n32_pwmtimer_s *lower = NULL; + + switch (timer) + { + #ifdef CONFIG_N32H7_ATIM1_PWM + case 1: + lower = &g_pwmatim1dev; + #ifdef CONFIG_PWM_PULSECOUNT + irq_attach(lower->irq, pwm_irq_handler, NULL); + up_disable_irq(lower->irq); + #endif + break; + #endif + #ifdef CONFIG_N32H7_ATIM2_PWM + case 2: + lower = &g_pwmatim2dev; + #ifdef CONFIG_PWM_PULSECOUNT + irq_attach(lower->irq, pwm_irq_handler, NULL); + up_disable_irq(lower->irq); + #endif + break; + #endif + #ifdef CONFIG_N32H7_ATIM3_PWM + case 3: + lower = &g_pwmatim3dev; + #ifdef CONFIG_PWM_PULSECOUNT + irq_attach(lower->irq, pwm_irq_handler, NULL); + up_disable_irq(lower->irq); + #endif + break; + #endif + #ifdef CONFIG_N32H7_ATIM4_PWM + case 4: + lower = &g_pwmatim4dev; + #ifdef CONFIG_PWM_PULSECOUNT + irq_attach(lower->irq, pwm_irq_handler, NULL); + up_disable_irq(lower->irq); + #endif + break; + #endif + #ifdef CONFIG_N32H7_GTIMA1_PWM + case 5: + lower = &g_pwmgtima1dev; + #ifdef CONFIG_PWM_PULSECOUNT + irq_attach(lower->irq, pwm_irq_handler, NULL); + up_disable_irq(lower->irq); + #endif + break; + #endif + #ifdef CONFIG_N32H7_GTIMA2_PWM + case 6: + lower = &g_pwmgtima2dev; + #ifdef CONFIG_PWM_PULSECOUNT + irq_attach(lower->irq, pwm_irq_handler, NULL); + up_disable_irq(lower->irq); + #endif + break; + #endif + #ifdef CONFIG_N32H7_GTIMA3_PWM + case 7: + lower = &g_pwmgtima3dev; + #ifdef CONFIG_PWM_PULSECOUNT + irq_attach(lower->irq, pwm_irq_handler, NULL); + up_disable_irq(lower->irq); + #endif + break; + #endif + #ifdef CONFIG_N32H7_GTIMA4_PWM + case 8: + lower = &g_pwmgtima4dev; + #ifdef CONFIG_PWM_PULSECOUNT + irq_attach(lower->irq, pwm_irq_handler, NULL); + up_disable_irq(lower->irq); + #endif + break; + #endif + #ifdef CONFIG_N32H7_GTIMA5_PWM + case 9: + lower = &g_pwmgtima5dev; + #ifdef CONFIG_PWM_PULSECOUNT + irq_attach(lower->irq, pwm_irq_handler, NULL); + up_disable_irq(lower->irq); + #endif + break; + #endif + #ifdef CONFIG_N32H7_GTIMA6_PWM + case 10: + lower = &g_pwmgtima6dev; + #ifdef CONFIG_PWM_PULSECOUNT + irq_attach(lower->irq, pwm_irq_handler, NULL); + up_disable_irq(lower->irq); + #endif + break; + #endif + #ifdef CONFIG_N32H7_GTIMA7_PWM + case 11: + lower = &g_pwmgtima7dev; + #ifdef CONFIG_PWM_PULSECOUNT + irq_attach(lower->irq, pwm_irq_handler, NULL); + up_disable_irq(lower->irq); + #endif + break; + #endif + #ifdef CONFIG_N32H7_GTIMB1_PWM + case 12: + lower = &g_pwmgtimb1dev; + #ifdef CONFIG_PWM_PULSECOUNT + irq_attach(lower->irq, pwm_irq_handler, NULL); + up_disable_irq(lower->irq); + #endif + break; + #endif + #ifdef CONFIG_N32H7_GTIMB2_PWM + case 13: + lower = &g_pwmgtimb2dev; + #ifdef CONFIG_PWM_PULSECOUNT + irq_attach(lower->irq, pwm_irq_handler, NULL); + up_disable_irq(lower->irq); + #endif + break; + #endif + #ifdef CONFIG_N32H7_GTIMB3_PWM + case 14: + lower = &g_pwmgtimb3dev; + #ifdef CONFIG_PWM_PULSECOUNT + irq_attach(lower->irq, pwm_irq_handler, NULL); + up_disable_irq(lower->irq); + #endif + break; + #endif + default: + return NULL; + } + + return (struct pwm_lowerhalf_s *)lower; +} + +#endif /* CONFIG_N32H7_PWM */ diff --git a/arch/arm/src/n32h7/n32_pwm.h b/arch/arm/src/n32h7/n32_pwm.h new file mode 100644 index 0000000000000..881618c888417 --- /dev/null +++ b/arch/arm/src/n32h7/n32_pwm.h @@ -0,0 +1,167 @@ +/**************************************************************************** + * arch/arm/src/n32h7/n32_pwm.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __ARCH_ARM_SRC_N32H7_N32_PWM_H +#define __ARCH_ARM_SRC_N32H7_N32_PWM_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include +#include "chip.h" + +#ifdef CONFIG_N32H7_PWM + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* Timer type */ +#define TIMTYPE_BASIC 0 +#define TIMTYPE_GENERAL16 1 +#define TIMTYPE_GENERAL32 2 +#define TIMTYPE_ADVANCED 3 +#define TIMTYPE_GTIMB 4 /* GTIMB (complementary, no break2) */ + +/* Timer modes */ + +enum n32_pwm_tim_mode_e +{ + N32_TIMMODE_COUNTUP = 0, + N32_TIMMODE_COUNTDOWN = 1, + N32_TIMMODE_CENTER1 = 2, + N32_TIMMODE_CENTER2 = 3, + N32_TIMMODE_CENTER3 = 4, +}; + +/* Polarity */ + +enum n32_pwm_pol_e +{ + N32_POL_POS = 0, + N32_POL_NEG = 1, +}; + +/* Idle state */ + +enum n32_pwm_idle_e +{ + N32_IDLE_INACTIVE = 0, + N32_IDLE_ACTIVE = 1, +}; + +/* PWM channel mode */ + +enum n32_pwm_chanmode_e +{ + N32_CHANMODE_FRZN = 0, + N32_CHANMODE_CHACT = 1, + N32_CHANMODE_CHINACT = 2, + N32_CHANMODE_OCREFTOG = 3, + N32_CHANMODE_OCREFLO = 4, + N32_CHANMODE_OCREFHI = 5, + N32_CHANMODE_PWM1 = 6, + N32_CHANMODE_PWM2 = 7, +}; + +/* PWM channel numbers */ + +enum n32_pwm_chan_e +{ + N32_PWM_CHAN1 = 1, + N32_PWM_CHAN2 = 2, + N32_PWM_CHAN3 = 3, + N32_PWM_CHAN4 = 4, +}; + +/* Output mask */ + +enum n32_pwm_output_e +{ + N32_PWM_OUT1 = (1 << 0), + N32_PWM_OUT1N = (1 << 1), + N32_PWM_OUT2 = (1 << 2), + N32_PWM_OUT2N = (1 << 3), + N32_PWM_OUT3 = (1 << 4), + N32_PWM_OUT3N = (1 << 5), + N32_PWM_OUT4 = (1 << 6), +}; + +/**************************************************************************** + * Public Types + ****************************************************************************/ + +struct n32_pwm_out_s +{ + uint8_t in_use:1; + uint8_t pol:1; + uint8_t idle:1; + uint32_t pincfg; +}; + +struct n32_pwm_break_s +{ + uint8_t en1:1; + uint8_t pol1:1; +}; + +struct n32_pwmchan_s +{ + uint8_t channel:4; + uint8_t mode:4; + struct n32_pwm_out_s out1; + struct n32_pwm_break_s brk; + struct n32_pwm_out_s out2; /* complementary */ +}; + +struct n32_pwmtimer_s +{ + const struct pwm_ops_s *ops; + uint8_t timid; + uint8_t timtype:3; + uint8_t mode:3; + uint8_t lock:2; + uint8_t deadtime; + uint8_t t_dts; + uint32_t base; + uint32_t pclk; + struct n32_pwmchan_s *channels; + uint32_t frequency; /* current frequency */ +#ifdef CONFIG_PWM_PULSECOUNT + uint8_t irq; + uint8_t prev; + uint8_t curr; + uint32_t count; + void *handle; +#endif +}; + +/**************************************************************************** + * Public Function Prototypes + ****************************************************************************/ + +struct pwm_lowerhalf_s *n32_pwminitialize(int timer); + +#endif /* CONFIG_N32H7_PWM */ +#endif /* __ARCH_ARM_SRC_N32H7_N32_PWM_H */ diff --git a/arch/arm/src/n32h7/n32_pwr.c b/arch/arm/src/n32h7/n32_pwr.c new file mode 100644 index 0000000000000..465c0e8d3122c --- /dev/null +++ b/arch/arm/src/n32h7/n32_pwr.c @@ -0,0 +1,228 @@ +/**************************************************************************** + * arch/arm/src/n32h7/n32_pwr.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include +#include + +#include +#include +#include +#include + +#include "arm_internal.h" +#include "n32_pwr.h" + +#if defined(CONFIG_N32H7_PWR) + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +static uint16_t g_bkp_writable_counter = 0; + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +static inline uint32_t n32_pwr_getreg(uint32_t offset) +{ + return getreg32(N32_PWR_BASE + offset); +} + +static inline void n32_pwr_putreg(uint32_t offset, uint32_t value) +{ + putreg32(value, N32_PWR_BASE + offset); +} + +static inline void n32_pwr_modifyreg(uint32_t offset, uint32_t clearbits, + uint32_t setbits) +{ + modifyreg32(N32_PWR_BASE + offset, clearbits, setbits); +} + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: n32_pwr_initbkp + ****************************************************************************/ + +void n32_pwr_initbkp(bool writable) +{ + irqstate_t flags; + uint32_t regval; + + flags = enter_critical_section(); + + regval = n32_pwr_getreg(N32_PWR_SYS_PWR_CR_OFFSET); + regval &= ~PWR_SYSCTRL1_DBKP; + n32_pwr_putreg(N32_PWR_SYS_PWR_CR_OFFSET, regval); + + g_bkp_writable_counter = 0; + + leave_critical_section(flags); + + n32_pwr_enablebkp(writable); +} + +/**************************************************************************** + * Name: n32_pwr_enablebkp + ****************************************************************************/ + +void n32_pwr_enablebkp(bool writable) +{ + irqstate_t flags; + uint32_t regval; + bool waswritable; + + flags = enter_critical_section(); + UP_DSB(); + + regval = n32_pwr_getreg(N32_PWR_C1_PWR_CR_OFFSET); + waswritable = ((regval & PWR_SYSCTRL1_DBKP) != 0); + + if (writable) + { + DEBUGASSERT(g_bkp_writable_counter < UINT16_MAX); + g_bkp_writable_counter++; + } + else if (g_bkp_writable_counter > 0) + { + g_bkp_writable_counter--; + } + + if (waswritable && g_bkp_writable_counter == 0) + { + regval &= ~PWR_SYSCTRL1_DBKP; + n32_pwr_putreg(N32_PWR_C1_PWR_CR_OFFSET, regval); + } + else if (!waswritable && g_bkp_writable_counter > 0) + { + regval |= PWR_SYSCTRL1_DBKP; + n32_pwr_putreg(N32_PWR_C1_PWR_CR_OFFSET, regval); + up_udelay(4); + } + + UP_DSB(); + leave_critical_section(flags); +} + +/**************************************************************************** + * Name: n32_pwr_setpvd + ****************************************************************************/ + +void n32_pwr_setpvd(uint32_t pls) +{ + uint32_t regval; + + regval = n32_pwr_getreg(N32_PWR_C1_PWR_CR_OFFSET); + regval &= ~PWR_PVD_LEVEL_MASK; + regval |= (pls & PWR_PVD_LEVEL_MASK); + n32_pwr_putreg(N32_PWR_C1_PWR_CR_OFFSET, regval); +} + +/**************************************************************************** + * Name: n32_pwr_enablepvd + ****************************************************************************/ + +void n32_pwr_enablepvd(void) +{ + n32_pwr_modifyreg(N32_PWR_C1_PWR_CR_OFFSET, 0, PWR_SYSCTRL1_PVDEN); +} + +/**************************************************************************** + * Name: n32_pwr_disablepvd + ****************************************************************************/ + +void n32_pwr_disablepvd(void) +{ + n32_pwr_modifyreg(N32_PWR_C1_PWR_CR_OFFSET, PWR_SYSCTRL1_PVDEN, 0); +} + +/**************************************************************************** + * Name: n32_pwr_configurewkup + ****************************************************************************/ + +void n32_pwr_configurewkup(uint32_t pin, bool en, bool rising, uint32_t pull) +{ + irqstate_t flags; + uint32_t regval; + + DEBUGASSERT(pin < 6); + + flags = enter_critical_section(); + + regval = n32_pwr_getreg(N32_PWR_C1_PWR_CSR_OFFSET); + + if (en) + { + regval |= (PWR_M7CTRLSTS_WKUP0F << pin); /* WKUP0EN -> WKUP5EN */ + } + else + { + regval &= ~(PWR_M7CTRLSTS_WKUP0F << pin); + } + + if (rising) + { + regval &= ~(PWR_M7CTRLSTS_WKUP0POL << pin); /* WKUP0POL -> WKUP5POL */ + } + else + { + regval |= (PWR_M7CTRLSTS_WKUP0POL << pin); + } + + n32_pwr_putreg(N32_PWR_C1_PWR_CSR_OFFSET, regval); + + leave_critical_section(flags); +} + +/**************************************************************************** + * Name: n32_pwr_setcorepwrsrc + ****************************************************************************/ + +void n32_pwr_setcorepwrsrc(pwr_vcoresrc_e src) +{ + switch (src) + { + case PWR_VCORESRC_EXT: + n32_pwr_modifyreg(N32_PWR_SYS_PWR_CR4_OFFSET, PWR_VCORESRC_MASK, + PWR_SYSCTRL4_VCORESRC); + break; + case PWR_VCORESRC_LDO: + n32_pwr_modifyreg(N32_PWR_SYS_PWR_CR4_OFFSET, PWR_VCORESRC_MASK, + PWR_SYSCTRL4_MLDOEN); + break; + case PWR_VCORESRC_SMPS: + n32_pwr_modifyreg(N32_PWR_SYS_PWR_CR4_OFFSET, PWR_VCORESRC_MASK, + PWR_SYSCTRL4_DCDEN); + break; + } +} + +#endif /* CONFIG_N32H7_PWR */ diff --git a/arch/arm/src/n32h7/n32_pwr.h b/arch/arm/src/n32h7/n32_pwr.h new file mode 100644 index 0000000000000..586412cec0866 --- /dev/null +++ b/arch/arm/src/n32h7/n32_pwr.h @@ -0,0 +1,141 @@ +/**************************************************************************** + * arch/arm/src/n32h7/n32_pwr.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __ARCH_ARM_SRC_N32H7_N32_PWR_H +#define __ARCH_ARM_SRC_N32H7_N32_PWR_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include + +#include "chip.h" +#include "hardware/n32h7_pwr.h" + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +#ifndef __ASSEMBLY__ + +#undef EXTERN +#if defined(__cplusplus) +#define EXTERN extern "C" +extern "C" +{ +#else +#define EXTERN extern +#endif + +/**************************************************************************** + * Public Function Prototypes + ****************************************************************************/ + +/**************************************************************************** + * Name: n32_pwr_initbkp + * + * Description: + * Insures the referenced count access to the backup domain (RTC registers, + * RTC backup data registers and backup SRAM is consistent with the HW + * state without relying on a variable. + * + * NOTE: This function should only be called by SoC Start up code. + * + * Input Parameters: + * writable - set the initial state of the enable and the + * bkp_writable_counter + * + * Returned Value: + * None + * + ****************************************************************************/ + +void n32_pwr_initbkp(bool writable); + +/**************************************************************************** + * Name: n32_pwr_enablebkp + * + * Description: + * Enables access to the backup domain (RTC registers, RTC backup data + * registers and backup SRAM). + * + * Input Parameters: + * writable - True: enable ability to write to backup domain registers + * + * Returned Value: + * none + * + ****************************************************************************/ + +void n32_pwr_enablebkp(bool writable); + +/**************************************************************************** + * Name: n32_pwr_configurewkup + * + * Description: + * Configures the external wakeup (WKUP) signals for wakeup from standby + * mode. + * Sets rising/falling edge sensitivity and pull state. + * + * + * Input Parameters: + * pin - WKUP pin number (0-5) to work on + * en - Enables the specified WKUP pin if true + * rising - If true, wakeup is triggered on rising edge, otherwise, + * it is triggered on the falling edge. + * pull - Specifies the WKUP pin pull resistor configuration + * (GPIO_FLOAT, GPIO_PULLUP, or GPIO_PULLDOWN) + * + * Returned Value: + * None + * + ****************************************************************************/ + +void n32_pwr_configurewkup(uint32_t pin, bool en, + bool rising, uint32_t pull); + +/**************************************************************************** + * Name: n32_pwr_setcorepwrsrc + * + * Description: + * Sets the core power source. + * + * Input Parameters: + * src - The power source to set. + * + * Returned Value: + * None + * + ****************************************************************************/ + +void n32_pwr_setcorepwrsrc(pwr_vcoresrc_e src); + +#undef EXTERN +#if defined(__cplusplus) +} +#endif + +#endif /* __ASSEMBLY__ */ +#endif /* __ARCH_ARM_SRC_N32H7_N32_PWR_H */ diff --git a/arch/arm/src/n32h7/n32_rcc.c b/arch/arm/src/n32h7/n32_rcc.c new file mode 100644 index 0000000000000..d1b8f0175d2ed --- /dev/null +++ b/arch/arm/src/n32h7/n32_rcc.c @@ -0,0 +1,175 @@ +/**************************************************************************** + * arch/arm/src/n32h7/n32_rcc.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include +#include +#include + +#include + +#include "arm_internal.h" +#include "n32_gpio.h" +#include "n32_rcc.h" +#include "n32_pwr.h" + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* Allow up to 100 milliseconds for the high speed clock to become ready. + * that is a very long delay, but if the clock does not become ready we are + * hosed anyway. + */ + +#define HSERDY_TIMEOUT (100 * CONFIG_BOARD_LOOPSPERMSEC) + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +/* Include chip-specific clocking initialization logic */ + +#if defined(CONFIG_N32H7_N32H76X) +# include "n32h76x_rcc.c" +#else +# error "Unsupported N32H7 chip" +#endif + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: n32_clockconfig + * + * Description: + * Called to establish the clock settings based on the values in board.h. + * This function (by default) will reset most everything, enable the PLL, + * and enable peripheral clocking for all peripherals enabled in the NuttX + * configuration file. + * + * If CONFIG_N32H7_CUSTOM_CLOCKCONFIG is defined, then clocking will be + * enabled by an externally provided, board-specific function called + * n32_board_clockconfig(). + * + * Input Parameters: + * None + * + * Returned Value: + * None + * + ****************************************************************************/ + +void n32_clockconfig(void) +{ +#ifndef CONFIG_N32H7_BYPASS_CLOCKCONFIG + /* Make sure that we are starting in the reset state */ + + rcc_reset(); + +# if defined(CONFIG_N32H7_PWR) + + /* Insure the bkp is initialized */ + + n32_pwr_initbkp(false); +# endif + +# if defined(CONFIG_N32H7_CUSTOM_CLOCKCONFIG) + + /* Invoke Board Custom Clock Configuration */ + + n32_board_clockconfig(); + +# else + + /* Invoke standard, fixed clock configuration based on definitions in + * board.h + */ + + n32_stdclockconfig(); + +# endif +#endif /* !CONFIG_N32H7_BYPASS_CLOCKCONFIG */ + + /* Enable peripheral clocking */ + + rcc_enableperipherals(); + +#ifdef CONFIG_N32H7_SYSCFG_IOCOMPENSATION + /* Enable I/O Compensation */ + + n32_iocompensation(); +#endif +} + +/**************************************************************************** + * Name: n32_clockenable + * + * Description: + * Re-enable the clock and restore the clock settings based on settings in + * board.h. This function is only available to support low-power modes of + * operation: When re-awakening from deep-sleep modes, it is necessary to + * re-enable/re-start the PLL + * + * This functional performs a subset of the operations performed by + * n32_clockconfig(): It does not reset any devices, and it does not + * reset the currently enabled peripheral clocks. + * + * If CONFIG_N32H7_CUSTOM_CLOCKCONFIG is defined, then clocking will be + * enabled by an externally provided, board-specific function called + * n32_board_clockconfig(). + * + * Input Parameters: + * None + * + * Returned Value: + * None + * + ****************************************************************************/ + +#ifdef CONFIG_PM +void n32_clockenable(void) +{ +#if defined(CONFIG_N32H7_CUSTOM_CLOCKCONFIG) + + /* Invoke Board Custom Clock Configuration */ + + n32_board_clockconfig(); + +#else + + /* Invoke standard, fixed clock configuration based on definitions in + * board.h + */ + + n32_stdclockconfig(); + +#endif +} +#endif diff --git a/arch/arm/src/n32h7/n32_rcc.h b/arch/arm/src/n32h7/n32_rcc.h new file mode 100644 index 0000000000000..d5b89e359bee7 --- /dev/null +++ b/arch/arm/src/n32h7/n32_rcc.h @@ -0,0 +1,174 @@ +/**************************************************************************** + * arch/arm/src/n32h7/n32_rcc.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __ARCH_ARM_SRC_N32H7_N32_RCC_H +#define __ARCH_ARM_SRC_N32H7_N32_RCC_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include "arm_internal.h" +#include "hardware/n32h7_rcc.h" + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +#ifndef __ASSEMBLY__ + +#undef EXTERN +#if defined(__cplusplus) +#define EXTERN extern "C" +extern "C" +{ +#else +#define EXTERN extern +#endif + +/**************************************************************************** + * Inline Functions + ****************************************************************************/ + +/**************************************************************************** + * Public Function Prototypes + ****************************************************************************/ + +/**************************************************************************** + * Name: n32h7_clockconfig + * + * Description: + * Called to establish the clock settings based on the values in board.h. + * This function (by default) will reset most everything, enable the PLL, + * and enable peripheral clocking for all peripherals enabled in the NuttX + * configuration file. + * + * If CONFIG_N32H7_CUSTOM_CLOCKCONFIG is defined, then clocking will be + * enabled by an externally provided, board-specific function called + * n32_board_clockconfig(). + * + * Input Parameters: + * None + * + * Returned Value: + * None + * + ****************************************************************************/ + +void n32_clockconfig(void); + +/**************************************************************************** + * Name: n32_stdclockconfig + * + * Description: + * Setup the system using the "standard" clock configuration + * + ****************************************************************************/ + +void n32_stdclockconfig(void); + +/**************************************************************************** + * Name: n32_board_clockconfig + * + * Description: + * Any N32 board may replace the "standard" board clock configuration + * logic with its own, custom clock configuration logic. + * + ****************************************************************************/ + +#ifdef CONFIG_N32H7_CUSTOM_CLOCKCONFIG +void n32_board_clockconfig(void); +#endif + +/**************************************************************************** + * Name: n32_clockenable + * + * Description: + * Re-enable the clock and restore the clock settings based on settings in + * board.h. This function is only available to support low-power modes of + * operation: When re-awakening from deep-sleep modes, it is necessary to + * re-enable/re-start the PLL + * + * This functional performs a subset of the operations performed by + * n32_clockconfig(): It does not reset any devices, and it does not + * reset the currently enabled peripheral clocks. + * + * If CONFIG_N32H7_CUSTOM_CLOCKCONFIG is defined, then clocking will be + * enabled by an externally provided, board-specific function called + * n32_board_clockconfig(). + * + * Input Parameters: + * None + * + * Returned Value: + * None + * + ****************************************************************************/ + +#ifdef CONFIG_PM +void n32_clockenable(void); +#endif + +/**************************************************************************** + * Name: n32_rcc_enablelse + * + * Description: + * Enable the External Low-Speed (LSE) Oscillator. + * + * Input Parameters: + * None + * + * Returned Value: + * None + * + ****************************************************************************/ + +void n32_rcc_enablelse(void); + +/**************************************************************************** + * Name: n32_rcc_enablelsi + * + * Description: + * Enable the Internal Low-Speed (LSI) RC Oscillator. + * + ****************************************************************************/ + +void n32_rcc_enablelsi(void); + +/**************************************************************************** + * Name: n32_rcc_disablelsi + * + * Description: + * Disable the Internal Low-Speed (LSI) RC Oscillator. + * + ****************************************************************************/ + +void n32_rcc_disablelsi(void); + +#undef EXTERN +#if defined(__cplusplus) +} +#endif +#endif /* __ASSEMBLY__ */ +#endif /* __ARCH_ARM_SRC_N32H7_N32_RCC_H */ diff --git a/arch/arm/src/n32h7/n32_sdmmc.c b/arch/arm/src/n32h7/n32_sdmmc.c new file mode 100644 index 0000000000000..578a275897545 --- /dev/null +++ b/arch/arm/src/n32h7/n32_sdmmc.c @@ -0,0 +1,2735 @@ +/**************************************************************************** + * arch/arm/src/n32h7/n32_sdmmc.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "chip.h" +#include "arm_internal.h" +#include "hardware/n32h7_sdmmc.h" +#include "n32_gpio.h" +#include "n32_sdmmc.h" +#include "hardware/n32h76x_pwr.h" +#include "hardware/n32h76x_rcc.h" + +#if defined(CONFIG_N32H7_SDMMC1) || defined(CONFIG_N32H7_SDMMC2) + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* Configuration ************************************************************/ + +/* Workqueue support required */ + +#if !defined(CONFIG_SCHED_WORKQUEUE) || !defined(CONFIG_SCHED_HPWORK) +# error "Callback support requires CONFIG_SCHED_WORKQUEUE and CONFIG_SCHED_HPWORK" +#endif + +/* DMA support (ADMA2) is optional but recommended */ + +#ifdef CONFIG_N32H7_SDMMC_ADMA +# define HAVE_ADMA2 1 +#else +# define HAVE_ADMA2 0 +#endif + +/* FIFO Size (4KB Block Buffer) */ + +#define N32_SDMMC_FIFO_SIZE (4096) + +/* Max Block Size (512 bytes for SD, 2048 for eMMC) */ + +#define N32_SDMMC_MAX_BLOCK_SIZE (512) + +/* Default Data Timeout (250 ms) */ + +#define N32_SDMMC_DATATIMEOUT_MS (250) + +/* Command Timeout Loops */ + +#define N32_SDMMC_CMDTIMEOUT (1000000) + +/* Event wait masks */ + +#define N32_WAIT_CMDDONE (N32_SDHOST_INTSTS_CMDC) +#define N32_WAIT_RESPDONE (N32_SDHOST_INTSTS_CMDC | N32_SDHOST_INTSTS_CTERR | N32_SDHOST_INTSTS_CCRCERR) +#define N32_WAIT_XFRDONE (N32_SDHOST_INTSTS_TC | N32_SDHOST_INTSTS_DTERR | N32_SDHOST_INTSTS_DCRERR | N32_SDHOST_INTSTS_ADMAERR) + +#define N32_WAIT_ALL (N32_SDHOST_INTSTS_CMDC | N32_SDHOST_INTSTS_TC | N32_SDHOST_INTSTS_BLKGAPE | N32_SDHOST_INTSTS_DMAINT |\ + N32_SDHOST_INTSTS_BUFWRDY | N32_SDHOST_INTSTS_BUFRRDY | N32_SDHOST_INTSTS_CINS | N32_SDHOST_INTSTS_CRMV |\ + N32_SDHOST_INTSTS_CINT | N32_SDHOST_INTSTS_RETUNE | N32_SDHOST_INTSTS_BOOTACKR | N32_SDHOST_INTSTS_BOOTTER |\ + N32_SDHOST_INTSTS_CTERR | N32_SDHOST_INTSTS_CCRCERR | N32_SDHOST_INTSTS_CENDBERR | N32_SDHOST_INTSTS_CINXERR |\ + N32_SDHOST_INTSTS_DTERR | N32_SDHOST_INTSTS_DCRERR | N32_SDHOST_INTSTS_DENDERR | N32_SDHOST_INTSTS_ACMDERR |\ + N32_SDHOST_INTSTS_ADMAERR | N32_SDHOST_INTSTS_TRGRERR) + +/* Helper: Get CFG and HOST base addresses */ + +#define N32_CFG_BASE(priv) ((priv)->cfg_base) +#define N32_HOST_BASE(priv) ((priv)->host_base) +#define N32_PUT_CFG(priv, off, val) putreg32((val), (priv)->cfg_base + (off)) +#define N32_GET_CFG(priv, off) getreg32((priv)->cfg_base + (off)) +#define N32_PUT_HOST(priv, off, val) putreg32((val), (priv)->host_base + (off)) +#define N32_GET_HOST(priv, off) getreg32((priv)->host_base + (off)) + +/* Clock calculation: SDCLK = BCLKF / (2 * SDCLKSEL), BCLKF in MHz */ + +#define N32_BCLKF_FREQ (N32_PLL1B_FREQUENCY / 1000000) /* 100 MHz */ + +/**************************************************************************** + * Private Types + ****************************************************************************/ + +/* ADMA2 Descriptor List (for scatter-gather) */ + +struct n32_sdmmc_adma_list_s +{ + struct n32_sdmmc_adma_desc_s *desc; /* Pointer to descriptor array */ + int count; /* Number of descriptors */ + uint32_t total_len; +}; + +/* N32 SDMMC Device State */ + +struct n32_sdmmc_s +{ + struct sdio_dev_s dev; /* Standard SDIO interface */ + + uint32_t cfg_base; /* SDMMC_CFG base address */ + uint32_t host_base; /* SDHOST base address */ + int irq; /* Interrupt number */ + + /* Clock */ + + uint32_t clock; /* Current SDCLK frequency in Hz */ + + /* Event support */ + + sem_t waitsem; /* Event wait semaphore */ + sdio_eventset_t waitevents; /* Events to wait for */ + uint32_t waitmask; /* Interrupt mask for waiting */ + volatile sdio_eventset_t wkupevent; /* Wakeup event */ + struct wdog_s waitwdog; /* Timeout watchdog */ + + /* Callback support */ + + sdio_statset_t cdstatus; /* Card status */ + sdio_eventset_t cbevents; /* Callback events */ + worker_t callback; /* Callback function */ + void *cbarg; /* Callback argument */ + struct work_s cbwork; /* Callback work */ + + /* Transfer state (PIO / DMA) */ + + uint32_t *buffer; /* Current buffer pointer */ + size_t remaining; /* Bytes remaining */ + uint32_t blocksize; /* Current block size */ + uint32_t nblocks; /* Number of blocks */ + bool is_read; /* true=read, false=write */ + bool using_dma; /* true if using ADMA */ + + /* ADMA2 state */ + +#if HAVE_ADMA2 + struct n32_sdmmc_adma_list_s adma_list; + bool adma_in_progress; +#endif + + /* Misc */ + + bool widebus; /* 4-bit bus mode */ +}; + +/**************************************************************************** + * Private Function Prototypes + ****************************************************************************/ + +/* Register access helpers */ + +static inline void n32_sdmmc_putreg(struct n32_sdmmc_s *priv, + uint32_t value, int offset); +static inline uint32_t n32_sdmmc_getreg(struct n32_sdmmc_s *priv, + int offset); +static inline void n32_sdmmc_modifyreg(struct n32_sdmmc_s *priv, + int offset, uint32_t clr, + uint32_t set); + +/* Interrupt control */ + +static void n32_sdmmc_configints(struct n32_sdmmc_s *priv); +static void n32_sdmmc_configsts(struct n32_sdmmc_s *priv, uint32_t mask); + +/* Clock / Power */ + +static int n32_sdmmc_enable_clock(struct n32_sdmmc_s *priv, + uint32_t freq_hz); +static void n32_sdmmc_power_on(struct n32_sdmmc_s *priv); +static void n32_sdmmc_power_off(struct n32_sdmmc_s *priv); + +/* Command & Response */ + +static int n32_sdmmc_send_cmd(struct n32_sdmmc_s *priv, + uint32_t cmd, uint32_t arg); +static int n32_sdmmc_wait_cmd_done(struct n32_sdmmc_s *priv, + uint32_t cmd); +static void n32_sdmmc_get_response(struct n32_sdmmc_s *priv, + uint32_t cmd, uint32_t *resp); + +/* Data transfer (PIO) */ + +static void n32_sdmmc_setup_data(struct n32_sdmmc_s *priv); +static void n32_sdmmc_send_fifo(struct n32_sdmmc_s *priv); +static void n32_sdmmc_recv_fifo(struct n32_sdmmc_s *priv); +static void n32_sdmmc_datadisable(struct n32_sdmmc_s *priv); + +/* ADMA2 */ + +#if HAVE_ADMA2 +static int n32_sdmmc_build_adma_desc(struct n32_sdmmc_s *priv, + uint8_t *buffer, size_t len); +static void n32_sdmmc_start_adma(struct n32_sdmmc_s *priv); +static void n32_sdmmc_stop_adma(struct n32_sdmmc_s *priv); +#endif + +/* Event handling */ + +static void n32_sdmmc_endwait(struct n32_sdmmc_s *priv, + sdio_eventset_t wkupevent); +static void n32_sdmmc_eventtimeout(wdparm_t arg); + +/* Interrupt handler */ + +static int n32_sdmmc_interrupt(int irq, void *context, void *arg); + +/* SDIO interface methods */ + +#ifdef CONFIG_SDIO_MUXBUS +static int n32_sdmmc_lock(struct sdio_dev_s *dev, bool lock); +#endif /* CONFIG_SDIO_MUXBUS */ +static void n32_sdmmc_reset(struct sdio_dev_s *dev); +static sdio_capset_t n32_sdmmc_capabilities(struct sdio_dev_s *dev); +static sdio_statset_t n32_sdmmc_status(struct sdio_dev_s *dev); +static void n32_sdmmc_widebus(struct sdio_dev_s *dev, bool enable); +static void n32_sdmmc_clock(struct sdio_dev_s *dev, enum sdio_clock_e rate); +static int n32_sdmmc_attach(struct sdio_dev_s *dev); +static int n32_sdmmc_sendcmd(struct sdio_dev_s *dev, uint32_t cmd, + uint32_t arg); +static void n32_sdmmc_blocksetup(struct sdio_dev_s *dev, + unsigned int blocksize, + unsigned int nblocks); +static int n32_sdmmc_recvsetup(struct sdio_dev_s *dev, uint8_t *buffer, + size_t nbytes); +static int n32_sdmmc_sendsetup(struct sdio_dev_s *dev, + const uint8_t *buffer, size_t nbytes); +static int n32_sdmmc_cancel(struct sdio_dev_s *dev); +static int n32_sdmmc_waitresponse(struct sdio_dev_s *dev, uint32_t cmd); +static int n32_sdmmc_recvshortcrc(struct sdio_dev_s *dev, uint32_t cmd, + uint32_t *rshort); +static int n32_sdmmc_recvlong(struct sdio_dev_s *dev, uint32_t cmd, + uint32_t rlong[4]); +static int n32_sdmmc_recvshort(struct sdio_dev_s *dev, uint32_t cmd, + uint32_t *rshort); +static void n32_sdmmc_waitenable(struct sdio_dev_s *dev, + sdio_eventset_t eventset, + uint32_t timeout); +static sdio_eventset_t n32_sdmmc_eventwait(struct sdio_dev_s *dev); +static void n32_sdmmc_callbackenable(struct sdio_dev_s *dev, + sdio_eventset_t eventset); +static int n32_sdmmc_registercallback(struct sdio_dev_s *dev, + worker_t callback, void *arg); +#ifdef CONFIG_SDIO_DMA +# if HAVE_ADMA2 +static int n32_sdmmc_dmarecvsetup(struct sdio_dev_s *dev, + uint8_t *buffer, size_t buflen); +static int n32_sdmmc_dmasendsetup(struct sdio_dev_s *dev, + const uint8_t *buffer, size_t buflen); +# else +# error "CONFIG_SDIO_DMA requires HAVE_ADMA2" +# endif /* HAVE_ADMA2 */ +#endif /* CONFIG_SDIO_DMA */ + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +/* SDMMC1 and SDMMC2 device instances */ + +#if defined(CONFIG_N32H7_SDMMC1) +static struct n32_sdmmc_s g_sdmmc1_dev = +{ + .dev = + { +#ifdef CONFIG_SDIO_MUXBUS + .lock = n32_sdmmc_lock, +#endif /* CONFIG_SDIO_MUXBUS */ + .reset = n32_sdmmc_reset, + .capabilities = n32_sdmmc_capabilities, + .status = n32_sdmmc_status, + .widebus = n32_sdmmc_widebus, + .clock = n32_sdmmc_clock, + .attach = n32_sdmmc_attach, + .sendcmd = n32_sdmmc_sendcmd, + .blocksetup = n32_sdmmc_blocksetup, + .recvsetup = n32_sdmmc_recvsetup, + .sendsetup = n32_sdmmc_sendsetup, + .cancel = n32_sdmmc_cancel, + .waitresponse = n32_sdmmc_waitresponse, + .recv_r1 = n32_sdmmc_recvshortcrc, + .recv_r2 = n32_sdmmc_recvlong, + .recv_r3 = n32_sdmmc_recvshort, + .recv_r4 = n32_sdmmc_recvshort, + .recv_r5 = n32_sdmmc_recvshortcrc, + .recv_r6 = n32_sdmmc_recvshortcrc, + .recv_r7 = n32_sdmmc_recvshort, + .waitenable = n32_sdmmc_waitenable, + .eventwait = n32_sdmmc_eventwait, + .callbackenable = n32_sdmmc_callbackenable, + .registercallback = n32_sdmmc_registercallback, +#ifdef CONFIG_SDIO_DMA +# if HAVE_ADMA2 + .dmarecvsetup = n32_sdmmc_dmarecvsetup, + .dmasendsetup = n32_sdmmc_dmasendsetup, +# else +# error "CONFIG_SDIO_DMA requires HAVE_ADMA2" +# endif /* HAVE_ADMA2 */ +#endif /* CONFIG_SDIO_DMA */ + }, + .cfg_base = N32_SDMMC1_CFG_BASE, + .host_base = N32_SDHOST1_BASE, + .irq = N32_IRQ_SDMMC1, + .waitsem = SEM_INITIALIZER(0), +}; +#endif + +#if defined(CONFIG_N32H7_SDMMC2) +static struct n32_sdmmc_s g_sdmmc2_dev = +{ + .dev = + { +#ifdef CONFIG_SDIO_MUXBUS + .lock = n32_sdmmc_lock, +#endif /* CONFIG_SDIO_MUXBUS */ + .reset = n32_sdmmc_reset, + .capabilities = n32_sdmmc_capabilities, + .status = n32_sdmmc_status, + .widebus = n32_sdmmc_widebus, + .clock = n32_sdmmc_clock, + .attach = n32_sdmmc_attach, + .sendcmd = n32_sdmmc_sendcmd, + .blocksetup = n32_sdmmc_blocksetup, + .recvsetup = n32_sdmmc_recvsetup, + .sendsetup = n32_sdmmc_sendsetup, + .cancel = n32_sdmmc_cancel, + .waitresponse = n32_sdmmc_waitresponse, + .recv_r1 = n32_sdmmc_recvshortcrc, + .recv_r2 = n32_sdmmc_recvlong, + .recv_r3 = n32_sdmmc_recvshort, + .recv_r4 = n32_sdmmc_recvshort, + .recv_r5 = n32_sdmmc_recvshortcrc, + .recv_r6 = n32_sdmmc_recvshortcrc, + .recv_r7 = n32_sdmmc_recvshort, + .waitenable = n32_sdmmc_waitenable, + .eventwait = n32_sdmmc_eventwait, + .callbackenable = n32_sdmmc_callbackenable, + .registercallback = n32_sdmmc_registercallback, +#ifdef CONFIG_SDIO_DMA +# if HAVE_ADMA2 + .dmarecvsetup = n32_sdmmc_dmarecvsetup, + .dmasendsetup = n32_sdmmc_dmasendsetup, +# else +# error "CONFIG_SDIO_DMA requires HAVE_ADMA2" +# endif /* HAVE_ADMA2 */ +#endif /* CONFIG_SDIO_DMA */ + }, + .cfg_base = N32_SDMMC2_CFG_BASE, + .host_base = N32_SDHOST2_BASE, + .irq = N32_IRQ_SDMMC2, + .waitsem = SEM_INITIALIZER(0), +}; +#endif + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/* ========================================================================== + * Register Access Helpers + * ========================================================================== + */ + +/**************************************************************************** + * Name: n32_sdmmc_putreg + * + * Description: + * Write a 32-bit value to a SDHOST register. + * + * Input Parameters: + * priv - SDMMC device instance + * value - Value to write + * offset - Register offset from SDHOST base + * + * Returned Value: + * None + * + ****************************************************************************/ + +static inline void n32_sdmmc_putreg(struct n32_sdmmc_s *priv, + uint32_t value, int offset) +{ + putreg32(value, priv->host_base + offset); +} + +/**************************************************************************** + * Name: n32_sdmmc_getreg + * + * Description: + * Read a 32-bit value from a SDHOST register. + * + * Input Parameters: + * priv - SDMMC device instance + * offset - Register offset from SDHOST base + * + * Returned Value: + * Register value + * + ****************************************************************************/ + +static inline uint32_t n32_sdmmc_getreg(struct n32_sdmmc_s *priv, + int offset) +{ + return getreg32(priv->host_base + offset); +} + +/**************************************************************************** + * Name: n32_sdmmc_modifyreg + * + * Description: + * Atomically modify a SDHOST register (clear and set bits). + * + * Input Parameters: + * priv - SDMMC device instance + * offset - Register offset + * clr - Bits to clear + * set - Bits to set + * + * Returned Value: + * None + * + ****************************************************************************/ + +static inline void n32_sdmmc_modifyreg(struct n32_sdmmc_s *priv, + int offset, uint32_t clr, + uint32_t set) +{ + uint32_t reg = n32_sdmmc_getreg(priv, offset); + + reg &= ~clr; + reg |= set; + n32_sdmmc_putreg(priv, reg, offset); +} + +/* ========================================================================== + * Interrupt Configuration + * ========================================================================== + */ + +/**************************************************************************** + * Name: n32_sdmmc_configints + * + * Description: + * Enable/disable SDHOST interrupts and set waiting events. + * + * Input Parameters: + * priv - SDMMC device instance + * mask - Interrupt mask to write to ISE + * events - Events to be waited for (SDIOWAIT_*) + * + * Returned Value: + * None + * + ****************************************************************************/ + +static void n32_sdmmc_configints(struct n32_sdmmc_s *priv) +{ + irqstate_t flags = enter_critical_section(); + + /* Enable interrupts at the signal level (ISE) */ + + n32_sdmmc_putreg(priv, priv->waitmask, N32_SDHOST_ISE_OFFSET); + + leave_critical_section(flags); +} + +/**************************************************************************** + * Name: n32_sdmmc_configsts + * + * Description: + * Enable/disable SDHOST status signal and set waiting events. + * + * Input Parameters: + * priv - SDMMC device instance + * mask - Interrupt mask to write to IE + * + * Returned Value: + * None + * + ****************************************************************************/ + +static void n32_sdmmc_configsts(struct n32_sdmmc_s *priv, uint32_t mask) +{ + irqstate_t flags = enter_critical_section(); + + /* Enable interrupts at the SDHOST level (IE) */ + + n32_sdmmc_putreg(priv, mask, N32_SDHOST_IE_OFFSET); + + leave_critical_section(flags); +} + +/* ========================================================================== + * Clock & Power Control + * ========================================================================== + */ + +/**************************************************************************** + * Name: n32_sdmmc_enable_clock + * + * Description: + * Enable or disable SD clock with the desired frequency. + * + * Input Parameters: + * priv - SDMMC device instance + * freq_hz - Desired SD clock frequency in Hz (0 to disable) + * + * Returned Value: + * OK on success, negated errno on failure. + * + ****************************************************************************/ + +static int n32_sdmmc_enable_clock(struct n32_sdmmc_s *priv, uint32_t freq_hz) +{ + uint32_t regval; + uint32_t div; + int timeout = 10000; + + /* If freq_hz is 0, disable clock */ + + if (freq_hz == 0) + { + n32_sdmmc_modifyreg(priv, N32_SDHOST_CTRL2_OFFSET, + N32_SDHOST_CTRL2_INCLKE | + N32_SDHOST_CTRL2_SDCLKE, + 0); + priv->clock = 0; + return OK; + } + + /* Calculate SDCLKSEL divider: freq = BCLKF / (2 * div) */ + + /* BCLKF is in MHz, freq_hz in Hz */ + + uint32_t bclk_hz = N32_BCLKF_FREQ * 1000000UL; + + div = bclk_hz / (2 * freq_hz); + + if (div > 0x3ff) + { + div = 0x3ff; /* Max divider */ + } + + priv->clock = freq_hz; + + /* 1. Disable clock */ + + n32_sdmmc_modifyreg(priv, N32_SDHOST_CTRL2_OFFSET, + N32_SDHOST_CTRL2_INCLKE | N32_SDHOST_CTRL2_SDCLKE, 0); + + /* 2. Set divider */ + + regval = n32_sdmmc_getreg(priv, N32_SDHOST_CTRL2_OFFSET); + regval &= ~(N32_SDHOST_CTRL2_SDCLKSEL70_MASK | + N32_SDHOST_CTRL2_SDCLKSEL98_MASK); + regval |= N32_SDHOST_CTRL2_SDCLKSEL(div); + n32_sdmmc_putreg(priv, regval, N32_SDHOST_CTRL2_OFFSET); + + /* 3. Enable clock */ + + n32_sdmmc_modifyreg(priv, N32_SDHOST_CTRL2_OFFSET, 0, + N32_SDHOST_CTRL2_INCLKE | N32_SDHOST_CTRL2_SDCLKE); + + /* 4. Wait for stable */ + + do + { + regval = n32_sdmmc_getreg(priv, N32_SDHOST_CTRL2_OFFSET); + if (regval & N32_SDHOST_CTRL2_INCLKSTS) + { + break; + } + + up_udelay(10); + } + while (--timeout > 0); + + if (timeout == 0) + { + mcerr("ERROR: Internal clock not stable\n"); + return -ETIMEDOUT; + } + + mcinfo("SDCLK enabled: freq=%lu Hz, div=%lu\n", (unsigned long)freq_hz, + (unsigned long)div); + return OK; +} + +/**************************************************************************** + * Name: n32_sdmmc_power_on + * + * Description: + * Turn on SD bus power (3.3V). + * + * Input Parameters: + * priv - SDMMC device instance + * + * Returned Value: + * None + * + ****************************************************************************/ + +static void n32_sdmmc_power_on(struct n32_sdmmc_s *priv) +{ + uint32_t regval; + + /* Set voltage to 3.3V and enable power */ + + regval = n32_sdmmc_getreg(priv, N32_SDHOST_CTRL1_OFFSET); + regval &= ~(N32_SDHOST_CTRL1_SDBVSEL_MASK | N32_SDHOST_CTRL1_SDPWR); + regval |= N32_SDHOST_CTRL1_SDBVSEL_3V3; + n32_sdmmc_putreg(priv, regval, N32_SDHOST_CTRL1_OFFSET); + + /* Power up delay */ + + nxsched_msleep(10); + regval |= N32_SDHOST_CTRL1_SDPWR; + n32_sdmmc_putreg(priv, regval, N32_SDHOST_CTRL1_OFFSET); +} + +/**************************************************************************** + * Name: n32_sdmmc_power_off + * + * Description: + * Turn off SD bus power. + * + * Input Parameters: + * priv - SDMMC device instance + * + * Returned Value: + * None + * + ****************************************************************************/ + +static void n32_sdmmc_power_off(struct n32_sdmmc_s *priv) +{ + n32_sdmmc_modifyreg(priv, N32_SDHOST_CTRL1_OFFSET, + N32_SDHOST_CTRL1_SDPWR, 0); +} + +/* ========================================================================== + * Command & Response + * ========================================================================== + */ + +/**************************************************************************** + * Name: n32_sdmmc_send_cmd + * + * Description: + * Format and send an SD command. + * + * Input Parameters: + * priv - SDMMC device instance + * cmd - Command word (including flags) + * arg - 32-bit argument + * + * Returned Value: + * OK on success, negated errno on failure. + * + ****************************************************************************/ + +static int n32_sdmmc_send_cmd(struct n32_sdmmc_s *priv, + uint32_t cmd, uint32_t arg) +{ + uint32_t regval = 0; + uint32_t cmdidx; + + /* Clear previous command status */ + + n32_sdmmc_putreg(priv, N32_SDHOST_INTSTS_CMDC | N32_SDHOST_INTSTS_CTERR | + N32_SDHOST_INTSTS_CCRCERR | N32_SDHOST_INTSTS_CINXERR | + N32_SDHOST_INTSTS_CENDBERR, + N32_SDHOST_INTSTS_OFFSET); + + /* Set argument */ + + n32_sdmmc_putreg(priv, arg, N32_SDHOST_CMDARG1_OFFSET); + + /* Build TMODE register */ + + cmdidx = (cmd & MMCSD_CMDIDX_MASK) >> MMCSD_CMDIDX_SHIFT; + regval |= (cmdidx << N32_SDHOST_TMODE_CMDINDEX_SHIFT); + + /* Response type */ + + switch (cmd & MMCSD_RESPONSE_MASK) + { + case MMCSD_NO_RESPONSE: + regval |= N32_SDHOST_TMODE_RTYPES_NONE; + break; + case MMCSD_R1_RESPONSE: + case MMCSD_R5_RESPONSE: + case MMCSD_R6_RESPONSE: + case MMCSD_R7_RESPONSE: + regval |= N32_SDHOST_TMODE_RTYPES_48 | N32_SDHOST_TMODE_CRCCK | + N32_SDHOST_TMODE_CMDXCK; + break; + case MMCSD_R1B_RESPONSE: + regval |= N32_SDHOST_TMODE_RTYPES_48_BUSY | N32_SDHOST_TMODE_CRCCK | + N32_SDHOST_TMODE_CMDXCK; + break; + case MMCSD_R2_RESPONSE: + regval |= N32_SDHOST_TMODE_RTYPES_136 | N32_SDHOST_TMODE_CRCCK; + break; + case MMCSD_R3_RESPONSE: + case MMCSD_R4_RESPONSE: + regval |= N32_SDHOST_TMODE_RTYPES_48; + break; + default: + return -EINVAL; + } + + /* Data transfer */ + + if ((cmd & MMCSD_DATAXFR_MASK) != MMCSD_NODATAXFR) + { + regval |= N32_SDHOST_TMODE_DPSEL; + if ((cmd & MMCSD_DATAXFR_MASK) == MMCSD_RDDATAXFR) + { + regval |= N32_SDHOST_TMODE_DATDIR; /* Read */ + priv->is_read = true; + } + else + { + priv->is_read = false; /* Write */ + } + + n32_sdmmc_setup_data(priv); + } + + /* Multi-block */ + + if (priv->nblocks > 1) + { + regval |= N32_SDHOST_TMODE_BLKSEL | N32_SDHOST_TMODE_BCNTE; + } + + /* DMA enable if using ADMA */ + + if (priv->using_dma) + { + regval |= N32_SDHOST_TMODE_DMAE; + } + + /* Write TMODE to trigger command */ + + n32_sdmmc_putreg(priv, regval, N32_SDHOST_TMODE_OFFSET); + + mcinfo("CMD: 0x%08lx ARG: 0x%08lx TMODE: 0x%08lx\n", + (unsigned long)cmd, (unsigned long)arg, + (unsigned long)regval); + + return OK; +} + +/**************************************************************************** + * Name: n32_sdmmc_wait_cmd_done + * + * Description: + * Poll-wait for command completion or error. + * + * Input Parameters: + * priv - SDMMC device instance + * cmd - Command word (for debugging) + * + * Returned Value: + * OK on success, -ETIMEDOUT or -EIO on error. + * + ****************************************************************************/ + +static int n32_sdmmc_wait_cmd_done(struct n32_sdmmc_s *priv, uint32_t cmd) +{ + uint32_t regval; + int32_t timeout = N32_SDMMC_CMDTIMEOUT; + + /* Wait for command complete or error */ + + while (--timeout > 0) + { + regval = n32_sdmmc_getreg(priv, N32_SDHOST_INTSTS_OFFSET); + if (regval & N32_SDHOST_INTSTS_CMDC) + { + /* Clear it */ + + n32_sdmmc_putreg(priv, N32_SDHOST_INTSTS_CMDC, + N32_SDHOST_INTSTS_OFFSET); + return OK; + } + + if (regval & (N32_SDHOST_INTSTS_CTERR | N32_SDHOST_INTSTS_CCRCERR)) + { + mcerr("CMD error: Istatus=0x%08lx\n", (unsigned long)regval); + + /* Reset command line */ + + regval = n32_sdmmc_getreg(priv, N32_SDHOST_CTRL2_OFFSET); + regval |= N32_SDHOST_CTRL2_SWRSTCMD; + n32_sdmmc_putreg(priv, regval, N32_SDHOST_CTRL2_OFFSET); + return -EIO; + } + + up_udelay(1); + } + + mcerr("CMD timeout: status=0x%08lx\n", + (unsigned long)n32_sdmmc_getreg(priv, N32_SDHOST_INTSTS_OFFSET)); + return -ETIMEDOUT; +} + +/**************************************************************************** + * Name: n32_sdmmc_get_response + * + * Description: + * Read command response from response registers. + * + * Input Parameters: + * priv - SDMMC device instance + * cmd - Command word (to determine response length) + * resp - Pointer to store response (if R2, points to 4-word array) + * + * Returned Value: + * None + * + ****************************************************************************/ + +static void n32_sdmmc_get_response(struct n32_sdmmc_s *priv, + uint32_t cmd, uint32_t *resp) +{ + int rtype = cmd & MMCSD_RESPONSE_MASK; + + if (rtype == MMCSD_R2_RESPONSE) + { + if (resp) + { + resp[3] = n32_sdmmc_getreg(priv, N32_SDHOST_CMDRSP0_OFFSET) << 8; + resp[2] = (n32_sdmmc_getreg(priv, N32_SDHOST_CMDRSP1_OFFSET) << 8) + | (n32_sdmmc_getreg(priv, N32_SDHOST_CMDRSP0_OFFSET) >> 24); + resp[1] = (n32_sdmmc_getreg(priv, N32_SDHOST_CMDRSP2_OFFSET) << 8) + | (n32_sdmmc_getreg(priv, N32_SDHOST_CMDRSP1_OFFSET) >> 24); + resp[0] = (n32_sdmmc_getreg(priv, N32_SDHOST_CMDRSP3_OFFSET) << 8) + | (n32_sdmmc_getreg(priv, N32_SDHOST_CMDRSP2_OFFSET) >> 24); + } + } + else + { + if (resp) + { + *resp = n32_sdmmc_getreg(priv, N32_SDHOST_CMDRSP0_OFFSET); + } + } +} + +/* ========================================================================== + * Data Transfer (PIO) + * ========================================================================== + */ + +/**************************************************************************** + * Name: n32_sdmmc_setup_data + * + * Description: + * Configure BLKCFG for a data transfer. + * + * Input Parameters: + * priv - SDMMC device instance + * blocksize - Block size in bytes + * nblocks - Number of blocks + * read - true for read, false for write + * + * Returned Value: + * None + * + ****************************************************************************/ + +static void n32_sdmmc_setup_data(struct n32_sdmmc_s *priv) +{ + uint32_t regval; + uint32_t total_len = priv->blocksize * priv->nblocks; + + /* Set BLKCFG */ + + regval = ((priv->nblocks & 0xffff) << N32_SDHOST_BLKCFG_CNT_SHIFT) | + (priv->blocksize & N32_SDHOST_BLKCFG_SIZE_MASK); + n32_sdmmc_putreg(priv, regval, N32_SDHOST_BLKCFG_OFFSET); + + up_udelay(10); + + mcinfo("DATA: size=%lu, blocks=%lu, total=%lu, dir=%s\n", + (unsigned long)priv->blocksize, (unsigned long)priv->nblocks, + (unsigned long)total_len, priv->is_read ? "READ" : "WRITE"); +} + +/**************************************************************************** + * Name: n32_sdmmc_send_fifo + * + * Description: + * Write data from buffer to SDHOST FIFO (PIO write). + * + * Input Parameters: + * priv - SDMMC device instance + * + * Returned Value: + * None + * + ****************************************************************************/ + +static void n32_sdmmc_send_fifo(struct n32_sdmmc_s *priv) +{ + uint32_t data; + uint32_t status; + + while (priv->remaining > 0) + { + status = n32_sdmmc_getreg(priv, N32_SDHOST_PRESTS_OFFSET); + if (!(status & N32_SDHOST_PRESTS_BUFW)) + { + break; /* FIFO full */ + } + + if (priv->remaining >= 4) + { + data = *priv->buffer++; + priv->remaining -= 4; + } + else + { + /* Last fractional word */ + + uint8_t *ptr = (uint8_t *)priv->buffer; + + data = 0; + for (int i = 0; i < priv->remaining; i++) + { + ((uint8_t *)&data)[i] = ptr[i]; + } + + priv->remaining = 0; + } + + n32_sdmmc_putreg(priv, data, N32_SDHOST_BUFDAT_OFFSET); + } +} + +/**************************************************************************** + * Name: n32_sdmmc_recv_fifo + * + * Description: + * Read data from SDHOST FIFO to buffer (PIO read). + * + * Input Parameters: + * priv - SDMMC device instance + * + * Returned Value: + * None + * + ****************************************************************************/ + +static void n32_sdmmc_recv_fifo(struct n32_sdmmc_s *priv) +{ + uint32_t data; + uint32_t status; + + while (priv->remaining > 0) + { + status = n32_sdmmc_getreg(priv, N32_SDHOST_PRESTS_OFFSET); + if (!(status & N32_SDHOST_PRESTS_BUFR)) + { + break; /* No data */ + } + + data = n32_sdmmc_getreg(priv, N32_SDHOST_BUFDAT_OFFSET); + + if (priv->remaining >= 4) + { + *priv->buffer++ = data; + priv->remaining -= 4; + } + else + { + uint8_t *ptr = (uint8_t *)priv->buffer; + + for (int i = 0; i < priv->remaining; i++) + { + ptr[i] = ((uint8_t *)&data)[i]; + } + + priv->remaining = 0; + } + } +} + +/**************************************************************************** + * Name: n32_sdmmc_datadisable + * + * Description: + * Disable data path, stop DMA, and reset data state. + * + * Input Parameters: + * priv - SDMMC device instance + * + * Returned Value: + * None + * + ****************************************************************************/ + +static void n32_sdmmc_datadisable(struct n32_sdmmc_s *priv) +{ + /* Clear BLKCFG to prevent residual data */ + + n32_sdmmc_putreg(priv, 0, N32_SDHOST_BLKCFG_OFFSET); + + /* If in DMA mode, stop ADMA */ + +#if HAVE_ADMA2 + if (priv->adma_in_progress) + { + n32_sdmmc_stop_adma(priv); + } +#endif + + /* Software reset data line to flush FIFO */ + + n32_sdmmc_modifyreg(priv, N32_SDHOST_CTRL2_OFFSET, + 0, N32_SDHOST_CTRL2_SWRSTDAT); + up_udelay(10); + n32_sdmmc_modifyreg(priv, N32_SDHOST_CTRL2_OFFSET, + N32_SDHOST_CTRL2_SWRSTDAT, 0); + + /* Clear all data-related interrupt pending bits */ + + n32_sdmmc_putreg(priv, N32_SDHOST_INTSTS_TC | N32_SDHOST_INTSTS_BUFWRDY | + N32_SDHOST_INTSTS_BUFRRDY | N32_SDHOST_INTSTS_DMAINT | + N32_SDHOST_INTSTS_DTERR | N32_SDHOST_INTSTS_DCRERR | + N32_SDHOST_INTSTS_ADMAERR, + N32_SDHOST_INTSTS_OFFSET); + + priv->remaining = 0; + priv->using_dma = false; +} + +/* ========================================================================== + * ADMA2 Support + * ========================================================================== + */ + +#if HAVE_ADMA2 + +/**************************************************************************** + * Name: n32_sdmmc_build_adma_desc + * + * Description: + * Build an ADMA2 descriptor table in system memory. + * + * Input Parameters: + * priv - SDMMC device instance + * buffer - Data buffer address + * len - Total data length in bytes + * + * Returned Value: + * OK on success, negated errno on failure. + * + ****************************************************************************/ + +/* ADMA2 descriptor table in None-TCM memory */ +#ifdef CONFIG_N32H7_SDMMC1 +static struct n32_sdmmc_adma_desc_s locate_data(".axi_ram") + n32_sdmmc1_desc[CONFIG_N32H7_SDMMC_MAX_DESCS] aligned_data(4); +#endif /* CONFIG_N32H7_SDMMC1 */ +#ifdef CONFIG_N32H7_SDMMC2 +static struct n32_sdmmc_adma_desc_s locate_data(".axi_ram") + n32_sdmmc2_desc[CONFIG_N32H7_SDMMC_MAX_DESCS] aligned_data(4); +#endif /* CONFIG_N32H7_SDMMC2 */ +#if CONFIG_MMCSD_MULTIBLOCK_LIMIT <= 16 +# ifdef CONFIG_N32H7_SDMMC1 +static uint8_t locate_data(".axi_ram") + n32_sdmmc1_blk_buf + [N32_SDMMC_MAX_BLOCK_SIZE * CONFIG_MMCSD_MULTIBLOCK_LIMIT] + aligned_data(4); +# endif /* CONFIG_N32H7_SDMMC1 */ +# ifdef CONFIG_N32H7_SDMMC2 +static uint8_t locate_data(".axi_ram") + n32_sdmmc2_blk_buf + [N32_SDMMC_MAX_BLOCK_SIZE * CONFIG_MMCSD_MULTIBLOCK_LIMIT] + aligned_data(4); +# endif /* CONFIG_N32H7_SDMMC2 */ +#else +# error "CONFIG_MMCSD_MULTIBLOCK_LIMIT must be less than or equal to 16" +#endif /* CONFIG_MMCSD_MULTIBLOCK_LIMIT */ + +static int n32_sdmmc_build_adma_desc(struct n32_sdmmc_s *priv, + uint8_t *buffer, size_t len) +{ + uint32_t total_len = len; + uint32_t offset = 0; + uint32_t max_chunk = 65535; /* 64KB - 1 */ + struct n32_sdmmc_adma_desc_s *desc = NULL; + uint8_t desc_count = 0; + uint8_t *blk_buf = NULL; + +#ifdef CONFIG_N32H7_SDMMC1 + if (priv->irq == N32_IRQ_SDMMC1) + { + desc = n32_sdmmc1_desc; + blk_buf = n32_sdmmc1_blk_buf; + } +#endif /* CONFIG_N32H7_SDMMC1 */ + +#ifdef CONFIG_N32H7_SDMMC2 + if (priv->irq == N32_IRQ_SDMMC2) + { + desc = n32_sdmmc2_desc; + blk_buf = n32_sdmmc2_blk_buf; + } +#endif /* CONFIG_N32H7_SDMMC2 */ + + /* Calculate number of descriptors needed */ + + while (len > 0) + { + uint32_t chunk = (len > max_chunk) ? max_chunk : len; + + desc_count++; + len -= chunk; + } + + if (desc_count == 0 || desc_count > CONFIG_N32H7_SDMMC_MAX_DESCS) + { + return -EINVAL; + } + + priv->adma_list.desc = desc; + priv->adma_list.count = desc_count; + priv->adma_list.total_len = total_len; + + /* Fill descriptors */ + + len = total_len; + offset = 0; + for (uint8_t i = 0; i < desc_count; i++) + { + uint32_t chunk = (len > max_chunk) ? max_chunk : len; + + desc[i].addr = (uint32_t *)(blk_buf + offset); + desc[i].len = (uint16_t)chunk; + desc[i].attr = N32_ADMA_ENTRY_VALID | N32_ADMA_ACT_TRAN; + + /* Prepare block buffer in None-TCM memory */ + + if (!priv->is_read) + { + memcpy(desc[i].addr, buffer + offset, chunk); + } + + /* Invalidate D-Cache before DMA read from memory */ + + up_invalidate_dcache((uintptr_t)desc[i].addr, + (uintptr_t)desc[i].addr + chunk); + + if (i == desc_count - 1) + { + desc[i].attr |= N32_ADMA_ENTRY_END; + } + + /* Optionally set INT for every descriptor or at end */ + + /* desc[i].attr |= N32_ADMA_ENTRY_INT; */ + + offset += chunk; + len -= chunk; + } + + mcinfo("ADMA desc: count=%d, total_len=%lu\n", + desc_count, (unsigned long)total_len); + return OK; +} + +/**************************************************************************** + * Name: n32_sdmmc_start_adma + * + * Description: + * Start ADMA2 transfer by setting descriptor address and enabling ADMA. + * + * Input Parameters: + * priv - SDMMC device instance + * + * Returned Value: + * None + * + ****************************************************************************/ + +static void n32_sdmmc_start_adma(struct n32_sdmmc_s *priv) +{ + /* Set ADMA descriptor address */ + + n32_sdmmc_putreg(priv, (uint32_t)priv->adma_list.desc, + N32_SDHOST_ASADD0_OFFSET); + + /* High 32 bits = 0 (32-bit addressing) */ + + n32_sdmmc_putreg(priv, 0, N32_SDHOST_ASADD1_OFFSET); + + /* Select ADMA2 in CTRL1 */ + + n32_sdmmc_modifyreg(priv, N32_SDHOST_CTRL1_OFFSET, + N32_SDHOST_CTRL1_DMASEL_MASK, + N32_SDHOST_CTRL1_DMASEL_ADMA2); + + priv->adma_in_progress = true; + priv->using_dma = true; + + mcinfo("ADMA started, desc addr=0x%08lx\n", + (unsigned long)priv->adma_list.desc); +} + +/**************************************************************************** + * Name: n32_sdmmc_stop_adma + * + * Description: + * Stop ADMA2 and free descriptor table. + * + * Input Parameters: + * priv - SDMMC device instance + * + * Returned Value: + * None + * + ****************************************************************************/ + +static void n32_sdmmc_stop_adma(struct n32_sdmmc_s *priv) +{ + priv->adma_in_progress = false; + priv->using_dma = false; + + /* Disable ADMA */ + + n32_sdmmc_modifyreg(priv, N32_SDHOST_CTRL1_OFFSET, + N32_SDHOST_CTRL1_DMASEL_MASK, 0); + + /* Free descriptor table */ + + if (priv->adma_list.desc) + { + priv->adma_list.desc = NULL; + priv->adma_list.count = 0; + priv->adma_list.total_len = 0; + } + + mcinfo("ADMA stopped\n"); +} + +#endif /* HAVE_ADMA2 */ + +/* ========================================================================== + * Event Handling + * ========================================================================== + */ + +/**************************************************************************** + * Name: n32_sdmmc_endwait + * + * Description: + * Wake up a waiting thread, cancel timeout, and clear events. + * + * Input Parameters: + * priv - SDMMC device instance + * wkupevent - Event that caused the wakeup + * + * Returned Value: + * None + * + ****************************************************************************/ + +static void n32_sdmmc_endwait(struct n32_sdmmc_s *priv, + sdio_eventset_t wkupevent) +{ + /* Cancel the watchdog timeout */ + + wd_cancel(&priv->waitwdog); + + /* Disable all waiting-related interrupts */ + + priv->waitmask = 0; + priv->waitevents = 0; + n32_sdmmc_configints(priv); + + /* Set wakeup event and post semaphore */ + + priv->wkupevent = wkupevent; + nxsem_post(&priv->waitsem); +} + +/**************************************************************************** + * Name: n32_sdmmc_eventtimeout + * + * Description: + * Watchdog timeout handler for event wait. + * + * Input Parameters: + * arg - Pointer to SDMMC device instance + * + * Returned Value: + * None + * + ****************************************************************************/ + +static void n32_sdmmc_eventtimeout(wdparm_t arg) +{ + struct n32_sdmmc_s *priv = (struct n32_sdmmc_s *)arg; + + if (priv->waitevents & SDIOWAIT_TIMEOUT) + { + n32_sdmmc_endwait(priv, SDIOWAIT_TIMEOUT); + } +} + +/* ========================================================================== + * Interrupt Handler + * ========================================================================== + */ + +/**************************************************************************** + * Name: n32_sdmmc_interrupt + * + * Description: + * SDHOST interrupt handler. + * + * Input Parameters: + * irq - IRQ number + * context - Interrupt context + * arg - Pointer to SDMMC device instance + * + * Returned Value: + * Always returns OK. + * + ****************************************************************************/ + +static int n32_sdmmc_interrupt(int irq, void *context, void *arg) +{ + struct n32_sdmmc_s *priv = (struct n32_sdmmc_s *)arg; + uint32_t status; + uint32_t enabled; + uint32_t error_mask; + + status = n32_sdmmc_getreg(priv, N32_SDHOST_INTSTS_OFFSET); + enabled = status & n32_sdmmc_getreg(priv, N32_SDHOST_ISE_OFFSET); + + if (enabled == 0) + { + return OK; + } + + /* Handle errors (all error bits) */ + + error_mask = enabled & (N32_SDHOST_INTSTS_CTERR | + N32_SDHOST_INTSTS_CCRCERR | + N32_SDHOST_INTSTS_CENDBERR | + N32_SDHOST_INTSTS_CINXERR | + N32_SDHOST_INTSTS_DTERR | + N32_SDHOST_INTSTS_DCRERR | + N32_SDHOST_INTSTS_DENDERR | + N32_SDHOST_INTSTS_ADMAERR | + N32_SDHOST_INTSTS_ACMDERR); + + if (error_mask) + { + mcerr("ERROR: status=0x%08lx mask=0x%08lx\n", + (unsigned long)status, (unsigned long)error_mask); + n32_sdmmc_putreg(priv, error_mask, N32_SDHOST_INTSTS_OFFSET); + + /* Disable data path on data errors */ + + if (error_mask & (N32_SDHOST_INTSTS_DTERR | + N32_SDHOST_INTSTS_DCRERR | + N32_SDHOST_INTSTS_DENDERR | + N32_SDHOST_INTSTS_ADMAERR)) + { + n32_sdmmc_datadisable(priv); + } + + if (priv->waitevents & SDIOWAIT_ERROR) + { + n32_sdmmc_endwait(priv, SDIOWAIT_ERROR); + } + + return OK; + } + + /* Command Complete */ + + if (enabled & N32_SDHOST_INTSTS_CMDC) + { + n32_sdmmc_putreg(priv, N32_SDHOST_INTSTS_CMDC, + N32_SDHOST_INTSTS_OFFSET); + if (priv->waitevents & SDIOWAIT_CMDDONE) + { + n32_sdmmc_endwait(priv, SDIOWAIT_CMDDONE); + } + } + + /* Transfer Complete */ + + if (enabled & N32_SDHOST_INTSTS_TC) + { + n32_sdmmc_putreg(priv, N32_SDHOST_INTSTS_TC, + N32_SDHOST_INTSTS_OFFSET); + + if (priv->waitevents & SDIOWAIT_TRANSFERDONE) + { + if (priv->using_dma) + { + priv->adma_in_progress = false; + if (priv->is_read) + { + uint32_t offset = 0; + + for (uint8_t i = 0; i < priv->adma_list.count; i++) + { + /* Invalidate D-Cache after DMA write to memory */ + + up_invalidate_dcache((uintptr_t) + priv->adma_list.desc[i].addr, + (uintptr_t)priv->adma_list.desc[i].addr + + priv->adma_list.desc[i].len); + + /* Copy data from None-TCM memory to buffer */ + + memcpy(priv->buffer + offset, + priv->adma_list.desc[i].addr, + priv->adma_list.desc[i].len); + priv->remaining -= priv->adma_list.desc[i].len; + offset += priv->adma_list.desc[i].len; + if (priv->adma_list.desc[i].attr & N32_ADMA_ENTRY_END) + { + break; + } + } + } + else + { + priv->remaining = 0; + } + } + + if (priv->remaining == 0) + { + n32_sdmmc_endwait(priv, SDIOWAIT_TRANSFERDONE); + } + } + } + + /* Buffer Write Ready (PIO) */ + + if (enabled & N32_SDHOST_INTSTS_BUFWRDY) + { + n32_sdmmc_putreg(priv, N32_SDHOST_INTSTS_BUFWRDY, + N32_SDHOST_INTSTS_OFFSET); + if (!priv->using_dma && !priv->is_read) + { + n32_sdmmc_send_fifo(priv); + if (priv->remaining == 0) + { + /* All data written, disable BUFWRDY interrupt */ + + priv->waitmask &= ~N32_SDHOST_INTSTS_BUFWRDY; + n32_sdmmc_configints(priv); + } + } + } + + /* Buffer Read Ready (PIO) */ + + if (enabled & N32_SDHOST_INTSTS_BUFRRDY) + { + n32_sdmmc_putreg(priv, N32_SDHOST_INTSTS_BUFRRDY, + N32_SDHOST_INTSTS_OFFSET); + if (!priv->using_dma && priv->is_read) + { + n32_sdmmc_recv_fifo(priv); + if (priv->remaining == 0) + { + /* All data read, disable BUFRRDY interrupt */ + + priv->waitmask &= ~N32_SDHOST_INTSTS_BUFRRDY; + n32_sdmmc_configints(priv); + } + } + } + + /* DMA Interrupt (for SDMA, not used by ADMA) */ + + if (enabled & N32_SDHOST_INTSTS_DMAINT) + { + n32_sdmmc_putreg(priv, N32_SDHOST_INTSTS_DMAINT, + N32_SDHOST_INTSTS_OFFSET); + } + + return OK; +} + +/* ========================================================================== + * SDIO Interface Methods + * ========================================================================== + */ + +/**************************************************************************** + * Name: n32_sdmmc_lock + * + * Description: + * Lock/unlock the SD bus (not implemented for single slot). + * + * Input Parameters: + * dev - SDIO device instance + * lock - true to lock, false to unlock + * + * Returned Value: + * Always OK. + * + ****************************************************************************/ +#ifdef CONFIG_SDIO_MUXBUS +static int n32_sdmmc_lock(struct sdio_dev_s *dev, bool lock) +{ + /* Not implemented for single slot */ + + return OK; +} +#endif /* CONFIG_SDIO_MUXBUS */ + +/**************************************************************************** + * Name: n32_sdmmc_reset + * + * Description: + * Reset the SDMMC controller to initial state. + * + * Input Parameters: + * dev - SDIO device instance + * + * Returned Value: + * None + * + ****************************************************************************/ + +static void n32_sdmmc_reset(struct sdio_dev_s *dev) +{ + struct n32_sdmmc_s *priv = (struct n32_sdmmc_s *)dev; + uint32_t regval; + uint16_t timeout = 10000; + + /* 1. Software Reset All */ + + n32_sdmmc_modifyreg(priv, N32_SDHOST_CTRL2_OFFSET, + 0, N32_SDHOST_CTRL2_SWRSTALL); + + /* Wait for reset to clear */ + + do + { + regval = n32_sdmmc_getreg(priv, N32_SDHOST_CTRL2_OFFSET); + if ((regval & N32_SDHOST_CTRL2_SWRSTALL) == 0) + { + break; + } + + up_udelay(10); + } + while (--timeout > 0); + + /* Disable all status word */ + + priv->waitmask = 0; + priv->waitevents = 0; + n32_sdmmc_configints(priv); + n32_sdmmc_configsts(priv, 0); + + /* 2. Soft CD enable */ + + regval = n32_sdmmc_getreg(priv, N32_SDHOST_CTRL1_OFFSET); + regval |= N32_SDHOST_CTRL1_CDSD; + n32_sdmmc_putreg(priv, regval, N32_SDHOST_CTRL1_OFFSET); + + /* 3. Configure CFG1 (BCLKF = 100 MHz, TCLKU = KHz) */ + + regval = (N32_BCLKF_FREQ << N32_SDMMC_CFG1_BCLKF_SHIFT) | 0; /* TCLKU=0 */ + N32_PUT_CFG(priv, N32_SDMMC_CFG1_OFFSET, regval); + + /* 4. Set capabilities (hardcoded) */ + + regval = N32_SDMMC_CFG2_VS33 | N32_SDMMC_CFG2_HS | N32_SDMMC_CFG2_ADMA2; + N32_PUT_CFG(priv, N32_SDMMC_CFG2_OFFSET, regval); + + /* 5. Reset state */ + + priv->clock = 0; + priv->remaining = 0; + priv->using_dma = false; + priv->widebus = false; + priv->waitevents = 0; + priv->wkupevent = 0; + priv->cdstatus = 0; + + wd_cancel(&priv->waitwdog); + + mcinfo("SDMMC reset completed\n"); +} + +/**************************************************************************** + * Name: n32_sdmmc_capabilities + * + * Description: + * Return SDIO capabilities (DMA supported if ADMA enabled). + * + * Input Parameters: + * dev - SDIO device instance + * + * Returned Value: + * Bitmask of capabilities (SDIO_CAPS_*). + * + ****************************************************************************/ + +static sdio_capset_t n32_sdmmc_capabilities(struct sdio_dev_s *dev) +{ + sdio_capset_t caps = SDIO_CAPS_4BIT | SDIO_CAPS_DMABEFOREWRITE; +#if HAVE_ADMA2 + caps |= (SDIO_CAPS_DMASUPPORTED/* | SDIO_CAPS_SD_HS_MODE */); +#endif + return caps; +} + +/**************************************************************************** + * Name: n32_sdmmc_status + * + * Description: + * Return current card status (present, write protected). + * + * Input Parameters: + * dev - SDIO device instance + * + * Returned Value: + * Bitmask of status flags (SDIO_STATUS_*). + * + ****************************************************************************/ + +static sdio_statset_t n32_sdmmc_status(struct sdio_dev_s *dev) +{ + struct n32_sdmmc_s *priv = (struct n32_sdmmc_s *)dev; + return priv->cdstatus; +} + +/**************************************************************************** + * Name: n32_sdmmc_widebus + * + * Description: + * Enable/disable 4-bit wide bus mode. + * + * Input Parameters: + * dev - SDIO device instance + * enable - true for 4-bit, false for 1-bit + * + * Returned Value: + * None + * + ****************************************************************************/ + +static void n32_sdmmc_widebus(struct sdio_dev_s *dev, bool enable) +{ + struct n32_sdmmc_s *priv = (struct n32_sdmmc_s *)dev; + priv->widebus = enable; + + if (enable) + { + n32_sdmmc_modifyreg(priv, N32_SDHOST_CTRL1_OFFSET, + 0, N32_SDHOST_CTRL1_DTWIDTH); + } + else + { + n32_sdmmc_modifyreg(priv, N32_SDHOST_CTRL1_OFFSET, + N32_SDHOST_CTRL1_DTWIDTH, 0); + } +} + +/**************************************************************************** + * Name: n32_sdmmc_clock + * + * Description: + * Set SD clock frequency based on the requested mode. + * + * Input Parameters: + * dev - SDIO device instance + * rate - Clock mode (CLOCK_*) + * + * Returned Value: + * None + * + ****************************************************************************/ + +static void n32_sdmmc_clock(struct sdio_dev_s *dev, enum sdio_clock_e rate) +{ + struct n32_sdmmc_s *priv = (struct n32_sdmmc_s *)dev; + uint32_t freq = 0, regval; + + switch (rate) + { + case CLOCK_SDIO_DISABLED: + freq = 0; + break; + case CLOCK_IDMODE: + freq = 400000; + break; + case CLOCK_MMC_TRANSFER: + case CLOCK_MMC_TRANSFER_4BIT: + freq = 25000000; + break; + case CLOCK_SD_TRANSFER_1BIT: + case CLOCK_SD_TRANSFER_4BIT: + freq = 25000000; + break; + case CLOCK_SD_TRANSFER_4BIT_HS: + regval = n32_sdmmc_getreg(priv, N32_SDHOST_CTRL1_OFFSET); + regval |= N32_SDHOST_CTRL1_HSEN; + n32_sdmmc_putreg(priv, regval, N32_SDHOST_CTRL1_OFFSET); + freq = 50000000; + break; + default: + freq = 400000; + break; + } + + n32_sdmmc_enable_clock(priv, freq); +} + +/**************************************************************************** + * Name: n32_sdmmc_attach + * + * Description: + * Attach interrupt handler and enable NVIC. + * + * Input Parameters: + * dev - SDIO device instance + * + * Returned Value: + * OK on success, negated errno on failure. + * + ****************************************************************************/ + +static int n32_sdmmc_attach(struct sdio_dev_s *dev) +{ + struct n32_sdmmc_s *priv = (struct n32_sdmmc_s *)dev; + int ret; + + ret = irq_attach(priv->irq, n32_sdmmc_interrupt, priv); + if (ret == OK) + { + /* Disable all interrupts */ + + n32_sdmmc_putreg(priv, 0, N32_SDHOST_IE_OFFSET); + n32_sdmmc_putreg(priv, 0, N32_SDHOST_ISE_OFFSET); + + /* Clear pending */ + + n32_sdmmc_putreg(priv, 0xffffffff, N32_SDHOST_INTSTS_OFFSET); + up_enable_irq(priv->irq); + } + + return ret; +} + +/**************************************************************************** + * Name: n32_sdmmc_sendcmd + * + * Description: + * Send an SD command (wrapper for n32_sdmmc_send_cmd). + * + * Input Parameters: + * dev - SDIO device instance + * cmd - Command word + * arg - 32-bit argument + * + * Returned Value: + * OK on success, negated errno on failure. + * + ****************************************************************************/ + +static int n32_sdmmc_sendcmd(struct sdio_dev_s *dev, uint32_t cmd, + uint32_t arg) +{ + struct n32_sdmmc_s *priv = (struct n32_sdmmc_s *)dev; + return n32_sdmmc_send_cmd(priv, cmd, arg); +} + +/**************************************************************************** + * Name: n32_sdmmc_blocksetup + * + * Description: + * Configure block size and number of blocks for next transfer. + * + * Input Parameters: + * dev - SDIO device instance + * blocksize - Block size in bytes + * nblocks - Number of blocks + * + * Returned Value: + * None + * + ****************************************************************************/ + +static void n32_sdmmc_blocksetup(struct sdio_dev_s *dev, + unsigned int blocksize, + unsigned int nblocks) +{ + struct n32_sdmmc_s *priv = (struct n32_sdmmc_s *)dev; + + priv->blocksize = blocksize; + priv->nblocks = nblocks; +} + +/**************************************************************************** + * Name: n32_sdmmc_recvsetup + * + * Description: + * Setup for PIO read transfer. + * + * Input Parameters: + * dev - SDIO device instance + * buffer - Data buffer + * nbytes - Number of bytes to read + * + * Returned Value: + * OK on success. + * + ****************************************************************************/ + +static int n32_sdmmc_recvsetup(struct sdio_dev_s *dev, uint8_t *buffer, + size_t nbytes) +{ + struct n32_sdmmc_s *priv = (struct n32_sdmmc_s *)dev; + + /* Reset data path state */ + + n32_sdmmc_datadisable(priv); + + priv->buffer = (uint32_t *)buffer; + priv->remaining = nbytes; + priv->is_read = true; + priv->using_dma = false; + + /* Enable buffer read ready interrupt */ + + n32_sdmmc_putreg(priv, N32_SDHOST_INTSTS_BUFRRDY, + N32_SDHOST_INTSTS_OFFSET); + priv->waitmask |= N32_SDHOST_INTSTS_BUFRRDY; + n32_sdmmc_configints(priv); + + mcinfo("PIO recv setup: buffer=%p, len=%zu\n", buffer, nbytes); + return OK; +} + +/**************************************************************************** + * Name: n32_sdmmc_sendsetup + * + * Description: + * Setup for PIO write transfer. + * + * Input Parameters: + * dev - SDIO device instance + * buffer - Data buffer + * nbytes - Number of bytes to write + * + * Returned Value: + * OK on success. + * + ****************************************************************************/ + +static int n32_sdmmc_sendsetup(struct sdio_dev_s *dev, + const uint8_t *buffer, size_t nbytes) +{ + struct n32_sdmmc_s *priv = (struct n32_sdmmc_s *)dev; + + /* Reset data path state */ + + n32_sdmmc_datadisable(priv); + + priv->buffer = (uint32_t *)buffer; + priv->remaining = nbytes; + priv->is_read = false; + priv->using_dma = false; + + /* Enable buffer write ready interrupt */ + + n32_sdmmc_putreg(priv, N32_SDHOST_INTSTS_BUFWRDY, + N32_SDHOST_INTSTS_OFFSET); + priv->waitmask |= N32_SDHOST_INTSTS_BUFWRDY; + n32_sdmmc_configints(priv); + + mcinfo("PIO send setup: buffer=%p, len=%zu\n", buffer, nbytes); + return OK; +} + +/**************************************************************************** + * Name: n32_sdmmc_cancel + * + * Description: + * Cancel any ongoing data transfer and reset controller state. + * + * Input Parameters: + * dev - SDIO device instance + * + * Returned Value: + * OK on success. + * + ****************************************************************************/ + +static int n32_sdmmc_cancel(struct sdio_dev_s *dev) +{ + struct n32_sdmmc_s *priv = (struct n32_sdmmc_s *)dev; + + /* Disable interrupts */ + + priv->waitmask = 0; + priv->waitevents = 0; + n32_sdmmc_configints(priv); + wd_cancel(&priv->waitwdog); + + /* Disable data path */ + + n32_sdmmc_datadisable(priv); + + /* Soft reset command line */ + + n32_sdmmc_modifyreg(priv, N32_SDHOST_CTRL2_OFFSET, + 0, N32_SDHOST_CTRL2_SWRSTCMD); + up_udelay(10); + n32_sdmmc_modifyreg(priv, N32_SDHOST_CTRL2_OFFSET, + N32_SDHOST_CTRL2_SWRSTCMD, 0); + + return OK; +} + +/**************************************************************************** + * Name: n32_sdmmc_waitresponse + * + * Description: + * Poll-wait for command response. + * + * Input Parameters: + * dev - SDIO device instance + * cmd - Command word + * + * Returned Value: + * OK on success, negated errno on failure. + * + ****************************************************************************/ + +static int n32_sdmmc_waitresponse(struct sdio_dev_s *dev, uint32_t cmd) +{ + struct n32_sdmmc_s *priv = (struct n32_sdmmc_s *)dev; + return n32_sdmmc_wait_cmd_done(priv, cmd); +} + +/**************************************************************************** + * Name: n32_sdmmc_recvshortcrc + * + * Description: + * Receive short response with CRC (R1, R5, R6). + * + * Input Parameters: + * dev - SDIO device instance + * cmd - Command word + * rshort - Pointer to store response + * + * Returned Value: + * OK on success, negated errno on failure. + * + ****************************************************************************/ + +static int n32_sdmmc_recvshortcrc(struct sdio_dev_s *dev, uint32_t cmd, + uint32_t *rshort) +{ + struct n32_sdmmc_s *priv = (struct n32_sdmmc_s *)dev; + uint32_t status; + + status = n32_sdmmc_getreg(priv, N32_SDHOST_INTSTS_OFFSET); + if (status & N32_SDHOST_INTSTS_CTERR) + { + n32_sdmmc_putreg(priv, N32_SDHOST_INTSTS_CTERR, + N32_SDHOST_INTSTS_OFFSET); + return -ETIMEDOUT; + } + + if (status & N32_SDHOST_INTSTS_CCRCERR) + { + n32_sdmmc_putreg(priv, N32_SDHOST_INTSTS_CCRCERR, + N32_SDHOST_INTSTS_OFFSET); + return -EIO; + } + + n32_sdmmc_get_response(priv, cmd, rshort); + return OK; +} + +/**************************************************************************** + * Name: n32_sdmmc_recvlong + * + * Description: + * Receive long response (R2). + * + * Input Parameters: + * dev - SDIO device instance + * cmd - Command word + * rlong - Pointer to 4-word array for response + * + * Returned Value: + * OK on success, negated errno on failure. + * + ****************************************************************************/ + +static int n32_sdmmc_recvlong(struct sdio_dev_s *dev, uint32_t cmd, + uint32_t rlong[4]) +{ + struct n32_sdmmc_s *priv = (struct n32_sdmmc_s *)dev; + uint32_t status; + + status = n32_sdmmc_getreg(priv, N32_SDHOST_INTSTS_OFFSET); + if (status & N32_SDHOST_INTSTS_CTERR) + { + n32_sdmmc_putreg(priv, N32_SDHOST_INTSTS_CTERR, + N32_SDHOST_INTSTS_OFFSET); + return -ETIMEDOUT; + } + + if (status & N32_SDHOST_INTSTS_CCRCERR) + { + n32_sdmmc_putreg(priv, N32_SDHOST_INTSTS_CCRCERR, + N32_SDHOST_INTSTS_OFFSET); + return -EIO; + } + + n32_sdmmc_get_response(priv, cmd, rlong); + return OK; +} + +/**************************************************************************** + * Name: n32_sdmmc_recvshort + * + * Description: + * Receive short response without CRC (R3, R4, R7). + * + * Input Parameters: + * dev - SDIO device instance + * cmd - Command word + * rshort - Pointer to store response + * + * Returned Value: + * OK on success, negated errno on failure. + * + ****************************************************************************/ + +static int n32_sdmmc_recvshort(struct sdio_dev_s *dev, uint32_t cmd, + uint32_t *rshort) +{ + struct n32_sdmmc_s *priv = (struct n32_sdmmc_s *)dev; + uint32_t status; + + status = n32_sdmmc_getreg(priv, N32_SDHOST_INTSTS_OFFSET); + if (status & N32_SDHOST_INTSTS_CTERR) + { + n32_sdmmc_putreg(priv, N32_SDHOST_INTSTS_CTERR, + N32_SDHOST_INTSTS_OFFSET); + return -ETIMEDOUT; + } + + n32_sdmmc_get_response(priv, cmd, rshort); + return OK; +} + +/**************************************************************************** + * Name: n32_sdmmc_waitenable + * + * Description: + * Enable waiting for a set of events. + * + * Input Parameters: + * dev - SDIO device instance + * eventset - Events to wait for (SDIOWAIT_*) + * timeout - Timeout in milliseconds + * + * Returned Value: + * None + * + ****************************************************************************/ + +static void n32_sdmmc_waitenable(struct sdio_dev_s *dev, + sdio_eventset_t eventset, + uint32_t timeout) +{ + struct n32_sdmmc_s *priv = (struct n32_sdmmc_s *)dev; + uint32_t mask = priv->waitmask; + + if (eventset & SDIOWAIT_CMDDONE) + { + mask |= N32_SDHOST_INTSTS_CMDC; + } + + if (eventset & SDIOWAIT_TRANSFERDONE) + { + mask |= N32_SDHOST_INTSTS_TC | N32_SDHOST_INTSTS_DTERR | + N32_SDHOST_INTSTS_DCRERR; + } + + if (eventset & SDIOWAIT_ERROR) + { +#if HAVE_ADMA2 + mask |= N32_SDHOST_INTSTS_CTERR | N32_SDHOST_INTSTS_CCRCERR | + N32_SDHOST_INTSTS_ADMAERR; +#else + mask |= N32_SDHOST_INTSTS_CTERR | N32_SDHOST_INTSTS_CCRCERR; +#endif + } + + /* Clear interrupt status register */ + + n32_sdmmc_putreg(priv, mask, N32_SDHOST_INTSTS_OFFSET); + + /* Enable interrupts */ + + priv->waitmask = mask; + priv->waitevents = eventset; + n32_sdmmc_configints(priv); + + if (eventset & SDIOWAIT_TIMEOUT) + { + int delay = MSEC2TICK(timeout); + wd_start(&priv->waitwdog, delay, n32_sdmmc_eventtimeout, + (wdparm_t)priv); + } +} + +/**************************************************************************** + * Name: n32_sdmmc_eventwait + * + * Description: + * Wait for one of the enabled events to occur. + * + * Input Parameters: + * dev - SDIO device instance + * + * Returned Value: + * The event that occurred. + * + ****************************************************************************/ + +static sdio_eventset_t n32_sdmmc_eventwait(struct sdio_dev_s *dev) +{ + struct n32_sdmmc_s *priv = (struct n32_sdmmc_s *)dev; + sdio_eventset_t wkupevent = 0; + int ret; + + while (1) + { + ret = nxsem_wait_uninterruptible(&priv->waitsem); + if (ret < 0) + { + wd_cancel(&priv->waitwdog); + return SDIOWAIT_ERROR; + } + + wkupevent = priv->wkupevent; + if (wkupevent != 0) + break; + } + + /* Disable interrupts after event */ + + priv->waitmask = 0; + priv->waitevents = 0; + n32_sdmmc_configints(priv); + return wkupevent; +} + +/**************************************************************************** + * Name: n32_sdmmc_callbackenable + * + * Description: + * Enable callback events (not fully implemented). + * + * Input Parameters: + * dev - SDIO device instance + * eventset - Events to enable for callback + * + * Returned Value: + * None + * + ****************************************************************************/ + +static void n32_sdmmc_callbackenable(struct sdio_dev_s *dev, + sdio_eventset_t eventset) +{ + struct n32_sdmmc_s *priv = (struct n32_sdmmc_s *)dev; + priv->cbevents = eventset; +} + +/**************************************************************************** + * Name: n32_sdmmc_registercallback + * + * Description: + * Register a callback function for card status changes. + * + * Input Parameters: + * dev - SDIO device instance + * callback - Callback function + * arg - Argument for callback + * + * Returned Value: + * OK on success. + * + ****************************************************************************/ + +static int n32_sdmmc_registercallback(struct sdio_dev_s *dev, + worker_t callback, void *arg) +{ + struct n32_sdmmc_s *priv = (struct n32_sdmmc_s *)dev; + priv->callback = callback; + priv->cbarg = arg; + priv->cbevents = 0; + return OK; +} +#ifdef CONFIG_SDIO_DMA +# if HAVE_ADMA2 + +/**************************************************************************** + * Name: n32_sdmmc_dmarecvsetup + * + * Description: + * Setup for ADMA read transfer (with cache invalidation). + * + * Input Parameters: + * dev - SDIO device instance + * buffer - Data buffer + * buflen - Number of bytes to read + * + * Returned Value: + * OK on success, negated errno on failure. + * + ****************************************************************************/ + +static int n32_sdmmc_dmarecvsetup(struct sdio_dev_s *dev, + uint8_t *buffer, size_t buflen) +{ + struct n32_sdmmc_s *priv = (struct n32_sdmmc_s *)dev; + int ret; + + /* Reset data path state */ + + n32_sdmmc_datadisable(priv); + + priv->buffer = (uint32_t *)buffer; + priv->remaining = buflen; + priv->is_read = true; + priv->using_dma = true; + + ret = n32_sdmmc_build_adma_desc(priv, buffer, buflen); + if (ret < 0) + { + return ret; + } + + n32_sdmmc_start_adma(priv); + + return OK; +} + +/**************************************************************************** + * Name: n32_sdmmc_dmasendsetup + * + * Description: + * Setup for ADMA write transfer (with cache clean). + * + * Input Parameters: + * dev - SDIO device instance + * buffer - Data buffer + * buflen - Number of bytes to write + * + * Returned Value: + * OK on success, negated errno on failure. + * + ****************************************************************************/ + +static int n32_sdmmc_dmasendsetup(struct sdio_dev_s *dev, + const uint8_t *buffer, size_t buflen) +{ + struct n32_sdmmc_s *priv = (struct n32_sdmmc_s *)dev; + int ret; + + /* Reset data path state */ + + n32_sdmmc_datadisable(priv); + + priv->buffer = (uint32_t *)buffer; + priv->remaining = buflen; + priv->is_read = false; + priv->using_dma = true; + + ret = n32_sdmmc_build_adma_desc(priv, (uint8_t *)buffer, buflen); + if (ret < 0) + { + return ret; + } + + n32_sdmmc_start_adma(priv); + + return OK; +} +# else + error "CONFIG_SDIO_DMA requires HAVE_ADMA2" +# endif /* HAVE_ADMA2 */ +#endif /* CONFIG_SDIO_DMA */ + +/**************************************************************************** + * Name: n32_sdmmc_callback + * + * Description: + * Perform callback. + * + * Assumptions: + * This function does not execute in the context of an interrupt handler. + * It may be invoked on any user thread or scheduled on the work thread + * from an interrupt handler. + * + ****************************************************************************/ + +static void n32_sdmmc_callback(void *arg) +{ + struct n32_sdmmc_s *priv = (struct n32_sdmmc_s *)arg; + uint32_t regval; + uint8_t timeout = 100; + + /* Is a callback registered? */ + + DEBUGASSERT(priv != NULL); + + /* Wait for CD to settle */ + + if (priv->cdstatus & SDIO_STATUS_PRESENT) + { + regval = n32_sdmmc_getreg(priv, N32_SDHOST_CTRL1_OFFSET); + regval |= N32_SDHOST_CTRL1_CDTL; + n32_sdmmc_putreg(priv, regval, N32_SDHOST_CTRL1_OFFSET); + + do + { + nxsched_msleep(10); + regval = n32_sdmmc_getreg(priv, N32_SDHOST_PRESTS_OFFSET); + if ((regval & N32_SDHOST_PRESTS_CSTSL) == N32_SDHOST_PRESTS_CSTSL) + break; + } + while (--timeout > 0); + + n32_sdmmc_power_on(priv); + n32_sdmmc_configsts(priv, N32_WAIT_ALL); + } + else + { + regval = n32_sdmmc_getreg(priv, N32_SDHOST_CTRL1_OFFSET); + regval &= ~N32_SDHOST_CTRL1_CDTL; + n32_sdmmc_putreg(priv, regval, N32_SDHOST_CTRL1_OFFSET); + + do + { + nxsched_msleep(10); + regval = n32_sdmmc_getreg(priv, N32_SDHOST_PRESTS_OFFSET); + if ((regval & N32_SDHOST_PRESTS_CSTSL) == N32_SDHOST_PRESTS_CSTSL) + break; + } + while (--timeout > 0); + + n32_sdmmc_power_off(priv); + n32_sdmmc_configsts(priv, 0); + } + + mcinfo("Callback %p(%p) cbevents: %02" PRIx8 " cdstatus: %02" PRIx8 "\n", + priv->callback, priv->cbarg, priv->cbevents, priv->cdstatus); + + if (priv->callback) + { + /* Yes.. Check for enabled callback events */ + + if ((priv->cdstatus & SDIO_STATUS_PRESENT) != 0) + { + /* Media is present. Is the media inserted event enabled? */ + + if ((priv->cbevents & SDIOMEDIA_INSERTED) == 0) + { + /* No... return without performing the callback */ + + return; + } + } + else + { + /* Media is not present. Is the media eject event enabled? */ + + if ((priv->cbevents & SDIOMEDIA_EJECTED) == 0) + { + /* No... return without performing the callback */ + + return; + } + } + + /* Perform the callback, disabling further callbacks. Of course, the + * the callback can (and probably should) re-enable callbacks. + */ + + priv->cbevents = 0; + + mcinfo("Callback to %p(%p)\n", priv->callback, priv->cbarg); + priv->callback(priv->cbarg); + } +} + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: sdio_initialize + * + * Description: + * Initialize SDIO for operation. + * + * Input Parameters: + * slotno - 0 for SDMMC1, 1 for SDMMC2 (depending on config). + * + * Returned Values: + * A reference to an SDIO interface structure. NULL is returned on failure. + * + ****************************************************************************/ + +struct sdio_dev_s *sdio_initialize(int slotno) +{ + struct n32_sdmmc_s *priv = NULL; + uint32_t regval; + +#if defined(CONFIG_N32H7_SDMMC1) + if (slotno == 0) + { + priv = &g_sdmmc1_dev; + + /* Enable the HSC1 Power Gate */ + + regval = getreg32(N32_PWR_SYS_PWR_CR3); + regval |= PWR_SYSCTRL3_HSC1_PGEN; + putreg32(regval, N32_PWR_SYS_PWR_CR3); + + while ((getreg32(N32_PWR_SYS_PWR_CR3) & + PWR_SYSCTRL3_HSC1_PWRRDY) == 0); + + regval = getreg32(N32_PWR_SYS_PWR_CR3); + regval |= (PWR_SYSCTRL3_HSC1_FUCEN | PWR_SYSCTRL3_HSC1_ISNEN); + putreg32(regval, N32_PWR_SYS_PWR_CR3); + + /* Enable the SDMMC1 peripheral clock */ + + regval = getreg32(N32_RCC_AXIEN1); + regval |= RCC_AXIEN1_M7SDMMC1EN; + putreg32(regval, N32_RCC_AXIEN1); + + regval = getreg32(N32_PWR_IP_MEMPWR_CR); + regval &= ~PWR_IPMEMCTRL_SDMMC1_PGEN; + putreg32(regval, N32_PWR_IP_MEMPWR_CR); + + while ((getreg32(N32_PWR_IP_MEMPWR_CSR) & + PWR_IPMEMSTS_SDMMC1_PRDY) == 0); + + /* Configure sdmmc1_clk source is PLL1B */ + + regval = getreg32(N32_RCC_AXISEL1); + regval &= ~RCC_AXISEL1_SDMMC1KERSEL_MASK; + regval |= RCC_AXISEL1_SDMMC1KERSEL_PLL1B; + putreg32(regval, N32_RCC_AXISEL1); + + /* Enable clock and reset */ + + regval = getreg32(N32_RCC_AXIEN1); + regval |= RCC_AXIEN1_M7SDMMC1EN; + putreg32(regval, N32_RCC_AXIEN1); + regval = getreg32(N32_RCC_AXIRST1); + regval |= (RCC_AXIRST1_SDMMC1RST | RCC_AXIRST1_SDHOST1RST); + putreg32(regval, N32_RCC_AXIRST1); + up_udelay(10); + regval &= ~(RCC_AXIRST1_SDMMC1RST | RCC_AXIRST1_SDHOST1RST); + putreg32(regval, N32_RCC_AXIRST1); + + /* Configure GPIOs (must be defined in board.h) */ + +#ifndef CONFIG_SDIO_MUXBUS + n32_configgpio(GPIO_SDMMC1_CK); + n32_configgpio(GPIO_SDMMC1_CMD); + n32_configgpio(GPIO_SDMMC1_D0); +# ifndef CONFIG_SDMMC1_WIDTH_D1_ONLY + n32_configgpio(GPIO_SDMMC1_D1); + n32_configgpio(GPIO_SDMMC1_D2); + n32_configgpio(GPIO_SDMMC1_D3); +# endif + + /* Enable internal clock feedback */ + + regval = getreg32(N32_AFIO_RMP_CFG); + regval |= N32_AFIO_RMP_CFG_SDMMC1_CLKFB; + putreg32(regval, N32_AFIO_RMP_CFG); +#endif + } + else +#endif +#if defined(CONFIG_N32H7_SDMMC2) + if (slotno == 1) + { + priv = &g_sdmmc2_dev; + + /* Enable the HSC2 Power Gate */ + + regval = getreg32(N32_PWR_SYS_PWR_CR3); + regval |= PWR_SYSCTRL3_HSC2_PGEN; + putreg32(regval, N32_PWR_SYS_PWR_CR3); + + while ((getreg32(N32_PWR_SYS_PWR_CR3) & + PWR_SYSCTRL3_HSC2_PWRRDY) == 0); + + regval = getreg32(N32_PWR_SYS_PWR_CR3); + regval |= (PWR_SYSCTRL3_HSC2_FUCEN | PWR_SYSCTRL3_HSC2_ISNEN); + putreg32(regval, N32_PWR_SYS_PWR_CR3); + + /* Enable the USBHS2 peripheral clock */ + + regval = getreg32(N32_RCC_AHB1EN1); + regval |= RCC_AHB1EN1_M7SDMMC2EN; + putreg32(regval, N32_RCC_AHB1EN1); + + regval = getreg32(N32_PWR_IP_MEMPWR_CR); + regval &= ~PWR_IPMEMCTRL_SDMMC2_PGEN; + putreg32(regval, N32_PWR_IP_MEMPWR_CR); + + while ((getreg32(N32_PWR_IP_MEMPWR_CSR) & + PWR_IPMEMSTS_SDMMC2_PRDY) == 0); + + /* Configure sdmmc2_clk source is PLL1B */ + + regval = getreg32(N32_RCC_AHB1SEL1); + regval &= ~RCC_AHB1SEL1_SDMMC2KERSEL_MASK; + regval |= RCC_AHB1SEL1_SDMMC2KERSEL_PLL1B; + putreg32(regval, N32_RCC_AHB1SEL1); + + /* Enable clock and reset */ + + regval = getreg32(N32_RCC_AHB1EN1); + regval |= RCC_AHB1EN1_M7SDMMC2EN; + putreg32(regval, N32_RCC_AHB1EN1); + regval = getreg32(N32_RCC_AHB1RST1); + regval |= (RCC_AHB1RST1_SDMMC2RST | RCC_AHB1RST1_SDHOST2RST); + putreg32(regval, N32_RCC_AHB1RST1); + up_udelay(10); + regval &= ~(RCC_AHB1RST1_SDMMC2RST | RCC_AHB1RST1_SDHOST2RST); + putreg32(regval, N32_RCC_AHB1RST1); + +#ifndef CONFIG_SDIO_MUXBUS + n32_configgpio(GPIO_SDMMC2_CK); + n32_configgpio(GPIO_SDMMC2_CMD); + n32_configgpio(GPIO_SDMMC2_D0); +# ifndef CONFIG_SDMMC2_WIDTH_D1_ONLY + n32_configgpio(GPIO_SDMMC2_D1); + n32_configgpio(GPIO_SDMMC2_D2); + n32_configgpio(GPIO_SDMMC2_D3); +# endif + + /* Enable internal clock feedback */ + + regval = getreg32(N32_AFIO_RMP_CFG); + regval |= N32_AFIO_RMP_CFG_SDMMC2_CLKFB; + putreg32(regval, N32_AFIO_RMP_CFG); +#endif + } + else +#endif + { + mcerr("ERROR: Unsupported SDMMC slot: %d\n", slotno); + return NULL; + } + + if (priv) + { + n32_sdmmc_reset(&priv->dev); + } + + return &priv->dev; +} + +/**************************************************************************** + * Name: sdio_mediachange + * + * Description: + * Called by board-specific logic to signal card insertion/removal. + * + * Input Parameters: + * dev - SDIO device instance + * cardinslot - true if card inserted, false otherwise + * + * Returned Value: + * None + * + ****************************************************************************/ + +void sdio_mediachange(struct sdio_dev_s *dev, bool cardinslot) +{ + struct n32_sdmmc_s *priv = (struct n32_sdmmc_s *)dev; + sdio_statset_t oldstatus; + irqstate_t flags; + + flags = enter_critical_section(); + + /* Save the old status for comparison */ + + oldstatus = priv->cdstatus; + + /* Update the card status */ + + if (cardinslot) + { + priv->cdstatus |= SDIO_STATUS_PRESENT; + } + else + { + priv->cdstatus &= ~SDIO_STATUS_PRESENT; + } + + leave_critical_section(flags); + + /* If the status actually changed, schedule the callback to notify + * the upper MMC/SD layer. Note: This may be called from an interrupt + * context (EXTI), so we must use the high-priority work queue. + */ + + if (oldstatus != priv->cdstatus) + { + mcinfo("Media change: old=0x%02x, new=0x%02x, scheduling callback\n", + oldstatus, priv->cdstatus); + + /* Callbacks cannot be performed in the context of an interrupt + * handler. If we are in an interrupt handler, then queue the + * callback to be performed later on the work thread. + */ + + if (up_interrupt_context()) + { + /* Yes.. queue it */ + + work_queue(HPWORK, &priv->cbwork, n32_sdmmc_callback, + priv, 0); + } + + else + { + /* No.. then just call the callback here */ + + n32_sdmmc_callback(priv); + } + } +} + +/**************************************************************************** + * Name: sdio_wrprotect + * + * Description: + * Called by board-specific logic to report write protect status. + * + * Input Parameters: + * dev - SDIO device instance + * wrprotect - true if write protected, false otherwise + * + * Returned Value: + * None + * + ****************************************************************************/ + +void sdio_wrprotect(struct sdio_dev_s *dev, bool wrprotect) +{ + struct n32_sdmmc_s *priv = (struct n32_sdmmc_s *)dev; + irqstate_t flags = enter_critical_section(); + + if (wrprotect) + priv->cdstatus |= SDIO_STATUS_WRPROTECTED; + else + priv->cdstatus &= ~SDIO_STATUS_WRPROTECTED; + + leave_critical_section(flags); +} + +#endif /* CONFIG_N32H7_SDMMC1 || CONFIG_N32H7_SDMMC2 */ diff --git a/arch/arm/src/n32h7/n32_sdmmc.h b/arch/arm/src/n32h7/n32_sdmmc.h new file mode 100644 index 0000000000000..616b3495879e3 --- /dev/null +++ b/arch/arm/src/n32h7/n32_sdmmc.h @@ -0,0 +1,86 @@ +/**************************************************************************** + * arch/arm/src/n32h7/n32_sdmmc.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * N32H7 SDMMC Driver Public Interface + ****************************************************************************/ + +#ifndef __ARCH_ARM_SRC_N32H7_N32H7_SDMMC_H +#define __ARCH_ARM_SRC_N32H7_N32H7_SDMMC_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include +#include +#include + +#include "chip.h" +#include "hardware/n32h7_sdmmc.h" + +/**************************************************************************** + * Public Function Prototypes + ****************************************************************************/ + +#ifndef __ASSEMBLY__ + +#undef EXTERN +#if defined(__cplusplus) +#define EXTERN extern "C" +extern "C" +{ +#else +#define EXTERN extern +#endif + +/**************************************************************************** + * Name: sdio_initialize + * + * Description: + * Initialize SDIO for operation. + * + * Input Parameters: + * slotno - 0 for SDMMC1, 1 for SDMMC2 (depending on config). + * + * Returned Values: + * A reference to an SDIO interface structure. NULL is returned on failure. + * + ****************************************************************************/ + +struct sdio_dev_s *sdio_initialize(int slotno); + +/**************************************************************************** + * Name: sdio_mediachange + * + * Description: + * Called by board-specific logic to signal card insertion/removal. + * + ****************************************************************************/ + +void sdio_mediachange(struct sdio_dev_s *dev, bool cardinslot); + +/**************************************************************************** + * Name: sdio_wrprotect + * + * Description: + * Called by board-specific logic to report write protect status. + * + ****************************************************************************/ + +void sdio_wrprotect(struct sdio_dev_s *dev, bool wrprotect); + +#if defined(CONFIG_SDMMC1_SDIO_MODE) || defined(CONFIG_SDMMC2_SDIO_MODE) +void sdio_set_sdio_card_isr(struct sdio_dev_s *dev, + int (*func)(void *), void *arg); +#endif + +#undef EXTERN +#if defined(__cplusplus) +} +#endif + +#endif /* __ASSEMBLY__ */ +#endif /* __ARCH_ARM_SRC_N32H7_N32_SDMMC_H */ diff --git a/arch/arm/src/n32h7/n32_serial.c b/arch/arm/src/n32h7/n32_serial.c new file mode 100644 index 0000000000000..cf5ec4589850e --- /dev/null +++ b/arch/arm/src/n32h7/n32_serial.c @@ -0,0 +1,2777 @@ +/**************************************************************************** + * arch/arm/src/n32h7/n32_serial.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#ifdef CONFIG_SERIAL_TERMIOS +# include +#endif + +#include "arm_internal.h" +#include "chip.h" +#include "n32_gpio.h" +#include "hardware/n32h7_uart.h" +#include "hardware/n32h76x_pinmap.h" +#include "n32_rcc.h" +#include "n32_dma.h" +#include "n32_uart.h" +#include + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ +#ifdef HAVE_UART + +/* DMA Support */ +#ifdef CONFIG_ARCH_DMA +# define SERIAL_HAVE_DMA 1 +#else +# undef CONFIG_USART1_RXDMA +# undef CONFIG_USART1_TXDMA +# undef CONFIG_USART2_RXDMA +# undef CONFIG_USART2_TXDMA +# undef CONFIG_USART3_RXDMA +# undef CONFIG_USART3_TXDMA +# undef CONFIG_USART4_RXDMA +# undef CONFIG_USART4_TXDMA +# undef CONFIG_USART5_RXDMA +# undef CONFIG_USART5_TXDMA +# undef CONFIG_USART6_RXDMA +# undef CONFIG_USART6_TXDMA +# undef CONFIG_USART7_RXDMA +# undef CONFIG_USART7_TXDMA +# undef CONFIG_USART8_RXDMA +# undef CONFIG_USART8_TXDMA +# undef CONFIG_UART9_RXDMA +# undef CONFIG_UART9_TXDMA +# undef CONFIG_UART10_RXDMA +# undef CONFIG_UART10_TXDMA +# undef CONFIG_UART11_RXDMA +# undef CONFIG_UART11_TXDMA +# undef CONFIG_UART12_RXDMA +# undef CONFIG_UART12_TXDMA +# undef CONFIG_UART13_RXDMA +# undef CONFIG_UART13_TXDMA +# undef CONFIG_UART14_RXDMA +# undef CONFIG_UART14_TXDMA +# undef CONFIG_UART15_RXDMA +# undef CONFIG_UART15_TXDMA +#endif + +/* Detect which UARTs have DMA enabled */ +#undef SERIAL_HAVE_RXDMA +#if defined(CONFIG_USART1_RXDMA) || defined(CONFIG_USART2_RXDMA) || \ + defined(CONFIG_USART3_RXDMA) || defined(CONFIG_USART4_RXDMA) || \ + defined(CONFIG_USART5_RXDMA) || defined(CONFIG_USART6_RXDMA) || \ + defined(CONFIG_USART7_RXDMA) || defined(CONFIG_USART8_RXDMA) || \ + defined(CONFIG_UART9_RXDMA) || defined(CONFIG_UART10_RXDMA) || \ + defined(CONFIG_UART11_RXDMA) || defined(CONFIG_UART12_RXDMA) || \ + defined(CONFIG_UART13_RXDMA) || defined(CONFIG_UART14_RXDMA) || \ + defined(CONFIG_UART15_RXDMA) +# define SERIAL_HAVE_RXDMA 1 +n32_dmacfg_t rxcfg = +{ + .src_addr = (uint32_t)NULL, + .dst_addr = (uint32_t)NULL, + .block_size = 0, + .ctrl = (DMA_CHCTRL_INTEN | + DMA_CHCTRL_DTW(DMA_WIDTH_8BITS) | + DMA_CHCTRL_STW(DMA_WIDTH_8BITS) | + DMA_CHCTRL_DINC(DMA_ADDR_INC) | + DMA_CHCTRL_SINC(DMA_ADDR_NOCHANGE) | + DMA_CHCTRL_DSTMSIZE(DMA_BURST_1) | + DMA_CHCTRL_SRCMSIZE(DMA_BURST_1) | + DMA_CHCTRL_SMS(DMA_MS_1) | + DMA_CHCTRL_DMS(DMA_MS_1) | + DMA_CHCTRL_TTFC(DMA_TTFC_PER_TO_MEM_DMA)), + .sg_cfg = 0, + .ds_cfg = 0, + .src_hs_if = 0, + .dst_hs_if = 0, + .priority = 7, + .src_hs_mode = 0, /* HW handshake */ + .dst_hs_mode = 0, + .link_list = NULL, +}; +#endif + +#undef SERIAL_HAVE_TXDMA +#if defined(CONFIG_USART1_TXDMA) || defined(CONFIG_USART2_TXDMA) || \ + defined(CONFIG_USART3_TXDMA) || defined(CONFIG_USART4_TXDMA) || \ + defined(CONFIG_USART5_TXDMA) || defined(CONFIG_USART6_TXDMA) || \ + defined(CONFIG_USART7_TXDMA) || defined(CONFIG_USART8_TXDMA) || \ + defined(CONFIG_UART9_TXDMA) || defined(CONFIG_UART10_TXDMA) || \ + defined(CONFIG_UART11_TXDMA) || defined(CONFIG_UART12_TXDMA) || \ + defined(CONFIG_UART13_TXDMA) || defined(CONFIG_UART14_TXDMA) || \ + defined(CONFIG_UART15_TXDMA) +# define SERIAL_HAVE_TXDMA 1 +n32_dmacfg_t txcfg = +{ + .src_addr = (uint32_t)NULL, + .dst_addr = (uint32_t)NULL, + .block_size = 0, + .ctrl = (DMA_CHCTRL_INTEN | + DMA_CHCTRL_DTW(DMA_WIDTH_8BITS) | + DMA_CHCTRL_STW(DMA_WIDTH_8BITS) | + DMA_CHCTRL_DINC(DMA_ADDR_NOCHANGE) | + DMA_CHCTRL_SINC(DMA_ADDR_INC) | + DMA_CHCTRL_DSTMSIZE(DMA_BURST_1) | + DMA_CHCTRL_SRCMSIZE(DMA_BURST_1) | + DMA_CHCTRL_SMS(DMA_MS_1) | + DMA_CHCTRL_DMS(DMA_MS_1) | + DMA_CHCTRL_TTFC(DMA_TTFC_MEM_TO_PER_DMA)), + .sg_cfg = 0, + .ds_cfg = 0, + .src_hs_if = 0, + .dst_hs_if = 0, + .priority = 7, + .src_hs_mode = 0, /* HW handshake */ + .dst_hs_mode = 0, + .link_list = NULL, +}; + +#endif + +#undef SERIAL_HAVE_RXDMA_TXDMA +#if defined(SERIAL_HAVE_RXDMA) && defined(SERIAL_HAVE_TXDMA) +# define SERIAL_HAVE_RXDMA_TXDMA 1 +#endif + +/* Interrupt masks for up_setusartint */ +#define USART_CTRL1_USED_INTS \ + (USART_CTRL1_RXDNEIEN | USART_CTRL1_TXDEIEN | USART_CTRL1_IDLEIEN | \ + USART_CTRL1_PEIEN | USART_CTRL1_TXCIEN) +#define USART_CTRL3_USED_INTS \ + (USART_CTRL3_CTSIEN | USART_CTRL3_ERRIEN) + +/* Power management activity count */ +#ifndef CONFIG_N32H7_PM_SERIAL_ACTIVITY +# define CONFIG_N32H7_PM_SERIAL_ACTIVITY 10 +#endif + +/**************************************************************************** + * Private Types + ****************************************************************************/ + +struct up_dev_s +{ + struct uart_dev_s dev; /* Generic UART device */ + uint16_t ie; /* Saved interrupt enable bits */ + uint16_t sr; /* Saved status (for ISR) */ + bool initialized; + +#ifdef CONFIG_PM + bool suspended; /* UART suspended for PM */ + uint16_t suspended_ie; +#endif + +#ifdef CONFIG_SERIAL_TERMIOS + uint8_t parity; + uint8_t bits; + bool stopbits2; +# ifdef CONFIG_SERIAL_IFLOWCONTROL + bool iflow; +# endif +# ifdef CONFIG_SERIAL_OFLOWCONTROL + bool oflow; +# endif + uint32_t baud; +#else + const uint8_t parity; + const uint8_t bits; + const bool stopbits2; +# ifdef CONFIG_SERIAL_IFLOWCONTROL + const bool iflow; +# endif +# ifdef CONFIG_SERIAL_OFLOWCONTROL + const bool oflow; +# endif + const uint32_t baud; +#endif + + const uint8_t irq; + const uint32_t apbclock; + const uint32_t usartbase; + const uint32_t tx_gpio; + const uint32_t rx_gpio; +#ifdef CONFIG_SERIAL_IFLOWCONTROL + const uint32_t rts_gpio; +#endif +#ifdef CONFIG_SERIAL_OFLOWCONTROL + const uint32_t cts_gpio; +#endif + +#ifdef SERIAL_HAVE_TXDMA + const unsigned int txdma_channel; + DMA_HANDLE txdma; +#endif +#ifdef SERIAL_HAVE_RXDMA + const unsigned int rxdma_channel; + DMA_HANDLE rxdma; +# ifdef CONFIG_PM + bool rxdmasusp; +# endif +#endif + + spinlock_t lock; +}; + +#ifdef CONFIG_PM +struct pm_config_s +{ + struct pm_callback_s pm_cb; + bool serial_suspended; +}; +#endif + +/**************************************************************************** + * Private Function Prototypes + ****************************************************************************/ + +static void up_set_format(struct uart_dev_s *dev); +static int up_setup(struct uart_dev_s *dev); +static void up_shutdown(struct uart_dev_s *dev); +static int up_attach(struct uart_dev_s *dev); +static void up_detach(struct uart_dev_s *dev); +static int up_interrupt(int irq, void *context, void *arg); +static int up_ioctl(struct file *filep, int cmd, unsigned long arg); + +#if !defined(SERIAL_HAVE_ONLY_RXDMA) +static int up_receive(struct uart_dev_s *dev, unsigned int *status); +#endif +static void up_rxint(struct uart_dev_s *dev, bool enable); +static bool up_rxavailable(struct uart_dev_s *dev); +#ifdef CONFIG_SERIAL_IFLOWCONTROL +static bool up_rxflowcontrol(struct uart_dev_s *dev, unsigned int nbuffered, + bool upper); +#endif +static void up_send(struct uart_dev_s *dev, int ch); +static void up_txint(struct uart_dev_s *dev, bool enable); +static bool up_txready(struct uart_dev_s *dev); +static bool up_txempty(struct uart_dev_s *dev); + +#ifdef SERIAL_HAVE_TXDMA +static void up_dma_send(struct uart_dev_s *dev); +static void up_dma_txint(struct uart_dev_s *dev, bool enable); +static void up_dma_txavailable(struct uart_dev_s *dev); +static void up_dma_txcallback(DMA_HANDLE handle, uint8_t status, void *arg); +#endif + +#ifdef SERIAL_HAVE_RXDMA +static void up_dma_receive(struct uart_dev_s *dev); +static void up_dma_rxint(struct uart_dev_s *dev, bool enable); +static bool up_dma_rxavailable(struct uart_dev_s *dev); +static void up_dma_rxcallback(DMA_HANDLE handle, uint8_t status, void *arg); +#endif + +#if defined(SERIAL_HAVE_RXDMA) || defined(SERIAL_HAVE_TXDMA) +static int up_dma_setup(struct uart_dev_s *dev); +static void up_dma_shutdown(struct uart_dev_s *dev); +#endif + +#ifdef CONFIG_PM +static void up_pm_setsuspend(bool suspend); +static void up_pm_notify(struct pm_callback_s *cb, int domain, + enum pm_state_e pmstate); +static int up_pm_prepare(struct pm_callback_s *cb, int domain, + enum pm_state_e pmstate); +#endif + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +/* Ops tables: Different combinations of DMA usage */ +#ifdef SERIAL_HAVE_RXDMA +static const struct uart_ops_s g_uart_rxdma_ops = +{ + .setup = up_dma_setup, + .shutdown = up_dma_shutdown, + .attach = up_attach, + .detach = up_detach, + .ioctl = up_ioctl, + .receive = up_receive, + .dmareceive = up_dma_receive, + .rxint = up_dma_rxint, + .rxavailable = up_dma_rxavailable, +#ifdef CONFIG_SERIAL_IFLOWCONTROL + .rxflowcontrol = up_rxflowcontrol, +#endif + .send = up_send, + .txint = up_txint, + .txready = up_txready, + .txempty = up_txempty, +}; +#endif + +#ifdef SERIAL_HAVE_TXDMA +static const struct uart_ops_s g_uart_txdma_ops = +{ + .setup = up_dma_setup, + .shutdown = up_dma_shutdown, + .attach = up_attach, + .detach = up_detach, + .ioctl = up_ioctl, + .receive = up_receive, + .rxint = up_rxint, + .rxavailable = up_rxavailable, +#ifdef CONFIG_SERIAL_IFLOWCONTROL + .rxflowcontrol = up_rxflowcontrol, +#endif + .send = up_send, + .txint = up_dma_txint, + .txready = up_txready, + .txempty = up_txempty, + .dmatxavail = up_dma_txavailable, + .dmasend = up_dma_send, +}; +#endif + +#ifdef SERIAL_HAVE_RXDMA_TXDMA +static const struct uart_ops_s g_uart_rxtxdma_ops = +{ + .setup = up_dma_setup, + .shutdown = up_dma_shutdown, + .attach = up_attach, + .detach = up_detach, + .ioctl = up_ioctl, + .receive = up_receive, + .dmareceive = up_dma_receive, + .rxint = up_dma_rxint, + .rxavailable = up_dma_rxavailable, +#ifdef CONFIG_SERIAL_IFLOWCONTROL + .rxflowcontrol = up_rxflowcontrol, +#endif + .send = up_send, + .txint = up_dma_txint, + .txready = up_txready, + .txempty = up_txempty, + .dmatxavail = up_dma_txavailable, + .dmasend = up_dma_send, +}; +#endif + +/* Non-DMA ops */ + +static const struct uart_ops_s g_uart_ops = +{ + .setup = up_setup, + .shutdown = up_shutdown, + .attach = up_attach, + .detach = up_detach, + .ioctl = up_ioctl, + .receive = up_receive, + .rxint = up_rxint, + .rxavailable = up_rxavailable, +#ifdef CONFIG_SERIAL_IFLOWCONTROL + .rxflowcontrol = up_rxflowcontrol, +#endif + .send = up_send, + .txint = up_txint, + .txready = up_txready, + .txempty = up_txempty, +}; + +/* -------------------------------------------------------------------------- + * OPS macro definitions (choose correct ops based on DMA config) + * -------------------------------------------------------------------------- + */ +#if defined(CONFIG_USART1_RXDMA) && defined(CONFIG_USART1_TXDMA) +# define UART_USART1_OPS &g_uart_rxtxdma_ops +#elif defined(CONFIG_USART1_RXDMA) +# define UART_USART1_OPS &g_uart_rxdma_ops +#elif defined(CONFIG_USART1_TXDMA) +# define UART_USART1_OPS &g_uart_txdma_ops +#else +# define UART_USART1_OPS &g_uart_ops +#endif +#if defined(CONFIG_USART2_RXDMA) && defined(CONFIG_USART2_TXDMA) +# define UART_USART2_OPS &g_uart_rxtxdma_ops +#elif defined(CONFIG_USART2_RXDMA) +# define UART_USART2_OPS &g_uart_rxdma_ops +#elif defined(CONFIG_USART2_TXDMA) +# define UART_USART2_OPS &g_uart_txdma_ops +#else +# define UART_USART2_OPS &g_uart_ops +#endif +#if defined(CONFIG_USART3_RXDMA) && defined(CONFIG_USART3_TXDMA) +# define UART_USART3_OPS &g_uart_rxtxdma_ops +#elif defined(CONFIG_USART3_RXDMA) +# define UART_USART3_OPS &g_uart_rxdma_ops +#elif defined(CONFIG_USART3_TXDMA) +# define UART_USART3_OPS &g_uart_txdma_ops +#else +# define UART_USART3_OPS &g_uart_ops +#endif +#if defined(CONFIG_USART4_RXDMA) && defined(CONFIG_USART4_TXDMA) +# define UART_USART4_OPS &g_uart_rxtxdma_ops +#elif defined(CONFIG_USART4_RXDMA) +# define UART_USART4_OPS &g_uart_rxdma_ops +#elif defined(CONFIG_USART4_TXDMA) +# define UART_USART4_OPS &g_uart_txdma_ops +#else +# define UART_USART4_OPS &g_uart_ops +#endif +#if defined(CONFIG_USART5_RXDMA) && defined(CONFIG_USART5_TXDMA) +# define UART_USART5_OPS &g_uart_rxtxdma_ops +#elif defined(CONFIG_USART5_RXDMA) +# define UART_USART5_OPS &g_uart_rxdma_ops +#elif defined(CONFIG_USART5_TXDMA) +# define UART_USART5_OPS &g_uart_txdma_ops +#else +# define UART_USART5_OPS &g_uart_ops +#endif +#if defined(CONFIG_USART6_RXDMA) && defined(CONFIG_USART6_TXDMA) +# define UART_USART6_OPS &g_uart_rxtxdma_ops +#elif defined(CONFIG_USART6_RXDMA) +# define UART_USART6_OPS &g_uart_rxdma_ops +#elif defined(CONFIG_USART6_TXDMA) +# define UART_USART6_OPS &g_uart_txdma_ops +#else +# define UART_USART6_OPS &g_uart_ops +#endif +#if defined(CONFIG_USART7_RXDMA) && defined(CONFIG_USART7_TXDMA) +# define UART_USART7_OPS &g_uart_rxtxdma_ops +#elif defined(CONFIG_USART7_RXDMA) +# define UART_USART7_OPS &g_uart_rxdma_ops +#elif defined(CONFIG_USART7_TXDMA) +# define UART_USART7_OPS &g_uart_txdma_ops +#else +# define UART_USART7_OPS &g_uart_ops +#endif +#if defined(CONFIG_USART8_RXDMA) && defined(CONFIG_USART8_TXDMA) +# define UART_USART8_OPS &g_uart_rxtxdma_ops +#elif defined(CONFIG_USART8_RXDMA) +# define UART_USART8_OPS &g_uart_rxdma_ops +#elif defined(CONFIG_USART8_TXDMA) +# define UART_USART8_OPS &g_uart_txdma_ops +#else +# define UART_USART8_OPS &g_uart_ops +#endif +#if defined(CONFIG_UART9_RXDMA) && defined(CONFIG_UART9_TXDMA) +# define UART_UART9_OPS &g_uart_rxtxdma_ops +#elif defined(CONFIG_UART9_RXDMA) +# define UART_UART9_OPS &g_uart_rxdma_ops +#elif defined(CONFIG_UART9_TXDMA) +# define UART_UART9_OPS &g_uart_txdma_ops +#else +# define UART_UART9_OPS &g_uart_ops +#endif +#if defined(CONFIG_UART10_RXDMA) && defined(CONFIG_UART10_TXDMA) +# define UART_UART10_OPS &g_uart_rxtxdma_ops +#elif defined(CONFIG_UART10_RXDMA) +# define UART_UART10_OPS &g_uart_rxdma_ops +#elif defined(CONFIG_UART10_TXDMA) +# define UART_UART10_OPS &g_uart_txdma_ops +#else +# define UART_UART10_OPS &g_uart_ops +#endif +#if defined(CONFIG_UART11_RXDMA) && defined(CONFIG_UART11_TXDMA) +# define UART_UART11_OPS &g_uart_rxtxdma_ops +#elif defined(CONFIG_UART11_RXDMA) +# define UART_UART11_OPS &g_uart_rxdma_ops +#elif defined(CONFIG_UART11_TXDMA) +# define UART_UART11_OPS &g_uart_txdma_ops +#else +# define UART_UART11_OPS &g_uart_ops +#endif +#if defined(CONFIG_UART12_RXDMA) && defined(CONFIG_UART12_TXDMA) +# define UART_UART12_OPS &g_uart_rxtxdma_ops +#elif defined(CONFIG_UART12_RXDMA) +# define UART_UART12_OPS &g_uart_rxdma_ops +#elif defined(CONFIG_UART12_TXDMA) +# define UART_UART12_OPS &g_uart_txdma_ops +#else +# define UART_UART12_OPS &g_uart_ops +#endif +#if defined(CONFIG_UART13_RXDMA) && defined(CONFIG_UART13_TXDMA) +# define UART_UART13_OPS &g_uart_rxtxdma_ops +#elif defined(CONFIG_UART13_RXDMA) +# define UART_UART13_OPS &g_uart_rxdma_ops +#elif defined(CONFIG_UART13_TXDMA) +# define UART_UART13_OPS &g_uart_txdma_ops +#else +# define UART_UART13_OPS &g_uart_ops +#endif +#if defined(CONFIG_UART14_RXDMA) && defined(CONFIG_UART14_TXDMA) +# define UART_UART14_OPS &g_uart_rxtxdma_ops +#elif defined(CONFIG_UART14_RXDMA) +# define UART_UART14_OPS &g_uart_rxdma_ops +#elif defined(CONFIG_UART14_TXDMA) +# define UART_UART14_OPS &g_uart_txdma_ops +#else +# define UART_UART14_OPS &g_uart_ops +#endif +#if defined(CONFIG_UART15_RXDMA) && defined(CONFIG_UART15_TXDMA) +# define UART_UART15_OPS &g_uart_rxtxdma_ops +#elif defined(CONFIG_UART15_RXDMA) +# define UART_UART15_OPS &g_uart_rxdma_ops +#elif defined(CONFIG_UART15_TXDMA) +# define UART_UART15_OPS &g_uart_txdma_ops +#else +# define UART_UART15_OPS &g_uart_ops +#endif + +/* -------------------------------------------------------------------------- + * Instance data (generated by script) + * -------------------------------------------------------------------------- + */ +#ifdef CONFIG_N32H7_USART1 +static char locate_data(".axi_ram") g_usart1rxbuffer[CONFIG_USART1_RXBUFSIZE] + aligned_data(ARMV7M_DCACHE_LINESIZE); +static char locate_data(".axi_ram") g_usart1txbuffer[CONFIG_USART1_TXBUFSIZE] + aligned_data(ARMV7M_DCACHE_LINESIZE); + +static struct up_dev_s g_usart1priv = +{ + .dev = + { +#if CONSOLE_UART == 1 + .isconsole = true, +#endif + .recv = + { + .size = sizeof(g_usart1rxbuffer), + .buffer = g_usart1rxbuffer + }, + .xmit = + { + .size = sizeof(g_usart1txbuffer), + .buffer = g_usart1txbuffer + }, + .ops = UART_USART1_OPS, + .priv = &g_usart1priv, + }, + .irq = N32_IRQ_USART1, + .parity = CONFIG_USART1_PARITY, + .bits = CONFIG_USART1_BITS, + .stopbits2 = CONFIG_USART1_2STOP, + .baud = CONFIG_USART1_BAUD, + .apbclock = N32_AHB_FREQUENCY, + .usartbase = N32_USART1_BASE, + .tx_gpio = GPIO_USART1_TX, + .rx_gpio = GPIO_USART1_RX, +#ifdef CONFIG_USART1_IFLOWCONTROL + .iflow = true, + .rts_gpio = GPIO_USART1_RTS, +#endif +#ifdef CONFIG_USART1_OFLOWCONTROL + .oflow = true, + .cts_gpio = GPIO_USART1_CTS, +#endif +#ifdef CONFIG_USART1_TXDMA + .txdma_channel = DMAMAP_USART1_TX, +#endif +#ifdef CONFIG_USART1_RXDMA + .rxdma_channel = DMAMAP_USART1_RX, +#endif + .lock = SP_UNLOCKED, +}; +#endif /* CONFIG_N32H7_USART1 */ + +#ifdef CONFIG_N32H7_USART2 +static char locate_data(".axi_ram") g_usart2rxbuffer[CONFIG_USART2_RXBUFSIZE] + aligned_data(ARMV7M_DCACHE_LINESIZE); +static char locate_data(".axi_ram") g_usart2txbuffer[CONFIG_USART2_TXBUFSIZE] + aligned_data(ARMV7M_DCACHE_LINESIZE); + +static struct up_dev_s g_usart2priv = +{ + .dev = + { +#if CONSOLE_UART == 2 + .isconsole = true, +#endif + .recv = + { + .size = sizeof(g_usart2rxbuffer), + .buffer = g_usart2rxbuffer + }, + .xmit = + { + .size = sizeof(g_usart2txbuffer), + .buffer = g_usart2txbuffer + }, + .ops = UART_USART2_OPS, + .priv = &g_usart2priv, + }, + .irq = N32_IRQ_USART2, + .parity = CONFIG_USART2_PARITY, + .bits = CONFIG_USART2_BITS, + .stopbits2 = CONFIG_USART2_2STOP, + .baud = CONFIG_USART2_BAUD, + .apbclock = N32_AHB_FREQUENCY, + .usartbase = N32_USART2_BASE, + .tx_gpio = GPIO_USART2_TX, + .rx_gpio = GPIO_USART2_RX, +#ifdef CONFIG_USART2_IFLOWCONTROL + .iflow = true, + .rts_gpio = GPIO_USART2_RTS, +#endif +#ifdef CONFIG_USART2_OFLOWCONTROL + .oflow = true, + .cts_gpio = GPIO_USART2_CTS, +#endif +#ifdef CONFIG_USART2_TXDMA + .txdma_channel = DMAMAP_USART2_TX, +#endif +#ifdef CONFIG_USART2_RXDMA + .rxdma_channel = DMAMAP_USART2_RX, +#endif + .lock = SP_UNLOCKED, +}; +#endif /* CONFIG_N32H7_USART2 */ + +#ifdef CONFIG_N32H7_USART3 +static char locate_data(".axi_ram") g_usart3rxbuffer[CONFIG_USART3_RXBUFSIZE] + aligned_data(ARMV7M_DCACHE_LINESIZE); +static char locate_data(".axi_ram") g_usart3txbuffer[CONFIG_USART3_TXBUFSIZE] + aligned_data(ARMV7M_DCACHE_LINESIZE); + +static struct up_dev_s g_usart3priv = +{ + .dev = + { +#if CONSOLE_UART == 3 + .isconsole = true, +#endif + .recv = + { + .size = sizeof(g_usart3rxbuffer), + .buffer = g_usart3rxbuffer + }, + .xmit = + { + .size = sizeof(g_usart3txbuffer), + .buffer = g_usart3txbuffer + }, + .ops = UART_USART3_OPS, + .priv = &g_usart3priv, + }, + .irq = N32_IRQ_USART3, + .parity = CONFIG_USART3_PARITY, + .bits = CONFIG_USART3_BITS, + .stopbits2 = CONFIG_USART3_2STOP, + .baud = CONFIG_USART3_BAUD, + .apbclock = N32_APB_FREQUENCY, + .usartbase = N32_USART3_BASE, + .tx_gpio = GPIO_USART3_TX, + .rx_gpio = GPIO_USART3_RX, +#ifdef CONFIG_USART3_IFLOWCONTROL + .iflow = true, + .rts_gpio = GPIO_USART3_RTS, +#endif +#ifdef CONFIG_USART3_OFLOWCONTROL + .oflow = true, + .cts_gpio = GPIO_USART3_CTS, +#endif +#ifdef CONFIG_USART3_TXDMA + .txdma_channel = DMAMAP_USART3_TX, +#endif +#ifdef CONFIG_USART3_RXDMA + .rxdma_channel = DMAMAP_USART3_RX, +#endif + .lock = SP_UNLOCKED, +}; +#endif /* CONFIG_N32H7_USART3 */ + +#ifdef CONFIG_N32H7_USART4 +static char locate_data(".axi_ram") g_usart4rxbuffer[CONFIG_USART4_RXBUFSIZE] + aligned_data(ARMV7M_DCACHE_LINESIZE); +static char locate_data(".axi_ram") g_usart4txbuffer[CONFIG_USART4_TXBUFSIZE] + aligned_data(ARMV7M_DCACHE_LINESIZE); + +static struct up_dev_s g_usart4priv = +{ + .dev = + { +#if CONSOLE_UART == 4 + .isconsole = true, +#endif + .recv = + { + .size = sizeof(g_usart4rxbuffer), + .buffer = g_usart4rxbuffer + }, + .xmit = + { + .size = sizeof(g_usart4txbuffer), + .buffer = g_usart4txbuffer + }, + .ops = UART_USART4_OPS, + .priv = &g_usart4priv, + }, + .irq = N32_IRQ_USART4, + .parity = CONFIG_USART4_PARITY, + .bits = CONFIG_USART4_BITS, + .stopbits2 = CONFIG_USART4_2STOP, + .baud = CONFIG_USART4_BAUD, + .apbclock = N32_APB_FREQUENCY, + .usartbase = N32_USART4_BASE, + .tx_gpio = GPIO_USART4_TX, + .rx_gpio = GPIO_USART4_RX, +#ifdef CONFIG_USART4_IFLOWCONTROL + .iflow = true, + .rts_gpio = GPIO_USART4_RTS, +#endif +#ifdef CONFIG_USART4_OFLOWCONTROL + .oflow = true, + .cts_gpio = GPIO_USART4_CTS, +#endif +#ifdef CONFIG_USART4_TXDMA + .txdma_channel = DMAMAP_USART4_TX, +#endif +#ifdef CONFIG_USART4_RXDMA + .rxdma_channel = DMAMAP_USART4_RX, +#endif + .lock = SP_UNLOCKED, +}; +#endif /* CONFIG_N32H7_USART4 */ + +#ifdef CONFIG_N32H7_USART5 +static char locate_data(".axi_ram") g_usart5rxbuffer[CONFIG_USART5_RXBUFSIZE] + aligned_data(ARMV7M_DCACHE_LINESIZE); +static char locate_data(".axi_ram") g_usart5txbuffer[CONFIG_USART5_TXBUFSIZE] + aligned_data(ARMV7M_DCACHE_LINESIZE); + +static struct up_dev_s g_usart5priv = +{ + .dev = + { +#if CONSOLE_UART == 5 + .isconsole = true, +#endif + .recv = + { + .size = sizeof(g_usart5rxbuffer), + .buffer = g_usart5rxbuffer + }, + .xmit = + { + .size = sizeof(g_usart5txbuffer), + .buffer = g_usart5txbuffer + }, + .ops = UART_USART5_OPS, + .priv = &g_usart5priv, + }, + .irq = N32_IRQ_USART5, + .parity = CONFIG_USART5_PARITY, + .bits = CONFIG_USART5_BITS, + .stopbits2 = CONFIG_USART5_2STOP, + .baud = CONFIG_USART5_BAUD, + .apbclock = N32_APB_FREQUENCY, + .usartbase = N32_USART5_BASE, + .tx_gpio = GPIO_USART5_TX, + .rx_gpio = GPIO_USART5_RX, +#ifdef CONFIG_USART5_IFLOWCONTROL + .iflow = true, + .rts_gpio = GPIO_USART5_RTS, +#endif +#ifdef CONFIG_USART5_OFLOWCONTROL + .oflow = true, + .cts_gpio = GPIO_USART5_CTS, +#endif +#ifdef CONFIG_USART5_TXDMA + .txdma_channel = DMAMAP_USART5_TX, +#endif +#ifdef CONFIG_USART5_RXDMA + .rxdma_channel = DMAMAP_USART5_RX, +#endif + .lock = SP_UNLOCKED, +}; +#endif /* CONFIG_N32H7_USART5 */ + +#ifdef CONFIG_N32H7_USART6 +static char locate_data(".axi_ram") g_usart6rxbuffer[CONFIG_USART6_RXBUFSIZE] + aligned_data(ARMV7M_DCACHE_LINESIZE); +static char locate_data(".axi_ram") g_usart6txbuffer[CONFIG_USART6_TXBUFSIZE] + aligned_data(ARMV7M_DCACHE_LINESIZE); + +static struct up_dev_s g_usart6priv = +{ + .dev = + { +#if CONSOLE_UART == 6 + .isconsole = true, +#endif + .recv = + { + .size = sizeof(g_usart6rxbuffer), + .buffer = g_usart6rxbuffer + }, + .xmit = + { + .size = sizeof(g_usart6txbuffer), + .buffer = g_usart6txbuffer + }, + .ops = UART_USART6_OPS, + .priv = &g_usart6priv, + }, + .irq = N32_IRQ_USART6, + .parity = CONFIG_USART6_PARITY, + .bits = CONFIG_USART6_BITS, + .stopbits2 = CONFIG_USART6_2STOP, + .baud = CONFIG_USART6_BAUD, + .apbclock = N32_APB_FREQUENCY, + .usartbase = N32_USART6_BASE, + .tx_gpio = GPIO_USART6_TX, + .rx_gpio = GPIO_USART6_RX, +#ifdef CONFIG_USART6_IFLOWCONTROL + .iflow = true, + .rts_gpio = GPIO_USART6_RTS, +#endif +#ifdef CONFIG_USART6_OFLOWCONTROL + .oflow = true, + .cts_gpio = GPIO_USART6_CTS, +#endif +#ifdef CONFIG_USART6_TXDMA + .txdma_channel = DMAMAP_USART6_TX, +#endif +#ifdef CONFIG_USART6_RXDMA + .rxdma_channel = DMAMAP_USART6_RX, +#endif + .lock = SP_UNLOCKED, +}; +#endif /* CONFIG_N32H7_USART6 */ + +#ifdef CONFIG_N32H7_USART7 +static char locate_data(".axi_ram") g_usart7rxbuffer[CONFIG_USART7_RXBUFSIZE] + aligned_data(ARMV7M_DCACHE_LINESIZE); +static char locate_data(".axi_ram") g_usart7txbuffer[CONFIG_USART7_TXBUFSIZE] + aligned_data(ARMV7M_DCACHE_LINESIZE); + +static struct up_dev_s g_usart7priv = +{ + .dev = + { +#if CONSOLE_UART == 7 + .isconsole = true, +#endif + .recv = + { + .size = sizeof(g_usart7rxbuffer), + .buffer = g_usart7rxbuffer + }, + .xmit = + { + .size = sizeof(g_usart7txbuffer), + .buffer = g_usart7txbuffer + }, + .ops = UART_USART7_OPS, + .priv = &g_usart7priv, + }, + .irq = N32_IRQ_USART7, + .parity = CONFIG_USART7_PARITY, + .bits = CONFIG_USART7_BITS, + .stopbits2 = CONFIG_USART7_2STOP, + .baud = CONFIG_USART7_BAUD, + .apbclock = N32_APB_FREQUENCY, + .usartbase = N32_USART7_BASE, + .tx_gpio = GPIO_USART7_TX, + .rx_gpio = GPIO_USART7_RX, +#ifdef CONFIG_USART7_IFLOWCONTROL + .iflow = true, + .rts_gpio = GPIO_USART7_RTS, +#endif +#ifdef CONFIG_USART7_OFLOWCONTROL + .oflow = true, + .cts_gpio = GPIO_USART7_CTS, +#endif +#ifdef CONFIG_USART7_TXDMA + .txdma_channel = DMAMAP_USART7_TX, +#endif +#ifdef CONFIG_USART7_RXDMA + .rxdma_channel = DMAMAP_USART7_RX, +#endif + .lock = SP_UNLOCKED, +}; +#endif /* CONFIG_N32H7_USART7 */ + +#ifdef CONFIG_N32H7_USART8 +static char locate_data(".axi_ram") g_usart8rxbuffer[CONFIG_USART8_RXBUFSIZE] + aligned_data(ARMV7M_DCACHE_LINESIZE); +static char locate_data(".axi_ram") g_usart8txbuffer[CONFIG_USART8_TXBUFSIZE] + aligned_data(ARMV7M_DCACHE_LINESIZE); + +static struct up_dev_s g_usart8priv = +{ + .dev = + { +#if CONSOLE_UART == 8 + .isconsole = true, +#endif + .recv = + { + .size = sizeof(g_usart8rxbuffer), + .buffer = g_usart8rxbuffer + }, + .xmit = + { + .size = sizeof(g_usart8txbuffer), + .buffer = g_usart8txbuffer + }, + .ops = UART_USART8_OPS, + .priv = &g_usart8priv, + }, + .irq = N32_IRQ_USART8, + .parity = CONFIG_USART8_PARITY, + .bits = CONFIG_USART8_BITS, + .stopbits2 = CONFIG_USART8_2STOP, + .baud = CONFIG_USART8_BAUD, + .apbclock = N32_APB_FREQUENCY, + .usartbase = N32_USART8_BASE, + .tx_gpio = GPIO_USART8_TX, + .rx_gpio = GPIO_USART8_RX, +#ifdef CONFIG_USART8_IFLOWCONTROL + .iflow = true, + .rts_gpio = GPIO_USART8_RTS, +#endif +#ifdef CONFIG_USART8_OFLOWCONTROL + .oflow = true, + .cts_gpio = GPIO_USART8_CTS, +#endif +#ifdef CONFIG_USART8_TXDMA + .txdma_channel = DMAMAP_USART8_TX, +#endif +#ifdef CONFIG_USART8_RXDMA + .rxdma_channel = DMAMAP_USART8_RX, +#endif + .lock = SP_UNLOCKED, +}; +#endif /* CONFIG_N32H7_USART8 */ + +#ifdef CONFIG_N32H7_UART9 +static char locate_data(".axi_ram") g_uart9rxbuffer[CONFIG_UART9_RXBUFSIZE] + aligned_data(ARMV7M_DCACHE_LINESIZE); +static char locate_data(".axi_ram") g_uart9txbuffer[CONFIG_UART9_TXBUFSIZE] + aligned_data(ARMV7M_DCACHE_LINESIZE); + +static struct up_dev_s g_uart9priv = +{ + .dev = + { +#if CONSOLE_UART == 9 + .isconsole = true, +#endif + .recv = + { + .size = sizeof(g_uart9rxbuffer), + .buffer = g_uart9rxbuffer + }, + .xmit = + { + .size = sizeof(g_uart9txbuffer), + .buffer = g_uart9txbuffer + }, + .ops = UART_UART9_OPS, + .priv = &g_uart9priv, + }, + .irq = N32_IRQ_UART9, + .parity = CONFIG_UART9_PARITY, + .bits = CONFIG_UART9_BITS, + .stopbits2 = CONFIG_UART9_2STOP, + .baud = CONFIG_UART9_BAUD, + .apbclock = N32_APB_FREQUENCY, + .usartbase = N32_UART9_BASE, + .tx_gpio = GPIO_UART9_TX, + .rx_gpio = GPIO_UART9_RX, +#ifdef CONFIG_UART9_IFLOWCONTROL + .iflow = true, + .rts_gpio = GPIO_UART9_RTS, +#endif +#ifdef CONFIG_UART9_OFLOWCONTROL + .oflow = true, + .cts_gpio = GPIO_UART9_CTS, +#endif +#ifdef CONFIG_UART9_TXDMA + .txdma_channel = DMAMAP_UART9_TX, +#endif +#ifdef CONFIG_UART9_RXDMA + .rxdma_channel = DMAMAP_UART9_RX, +#endif + .lock = SP_UNLOCKED, +}; +#endif /* CONFIG_N32H7_UART9 */ + +#ifdef CONFIG_N32H7_UART10 +static char locate_data(".axi_ram") g_uart10rxbuffer[CONFIG_UART10_RXBUFSIZE] + aligned_data(ARMV7M_DCACHE_LINESIZE); +static char locate_data(".axi_ram") g_uart10txbuffer[CONFIG_UART10_TXBUFSIZE] + aligned_data(ARMV7M_DCACHE_LINESIZE); + +static struct up_dev_s g_uart10priv = +{ + .dev = + { +#if CONSOLE_UART == 10 + .isconsole = true, +#endif + .recv = + { + .size = sizeof(g_uart10rxbuffer), + .buffer = g_uart10rxbuffer + }, + .xmit = + { + .size = sizeof(g_uart10txbuffer), + .buffer = g_uart10txbuffer + }, + .ops = UART_UART10_OPS, + .priv = &g_uart10priv, + }, + .irq = N32_IRQ_UART10, + .parity = CONFIG_UART10_PARITY, + .bits = CONFIG_UART10_BITS, + .stopbits2 = CONFIG_UART10_2STOP, + .baud = CONFIG_UART10_BAUD, + .apbclock = N32_APB_FREQUENCY, + .usartbase = N32_UART10_BASE, + .tx_gpio = GPIO_UART10_TX, + .rx_gpio = GPIO_UART10_RX, +#ifdef CONFIG_UART10_IFLOWCONTROL + .iflow = true, + .rts_gpio = GPIO_UART10_RTS, +#endif +#ifdef CONFIG_UART10_OFLOWCONTROL + .oflow = true, + .cts_gpio = GPIO_UART10_CTS, +#endif +#ifdef CONFIG_UART10_TXDMA + .txdma_channel = DMAMAP_UART10_TX, +#endif +#ifdef CONFIG_UART10_RXDMA + .rxdma_channel = DMAMAP_UART10_RX, +#endif + .lock = SP_UNLOCKED, +}; +#endif /* CONFIG_N32H7_UART10 */ + +#ifdef CONFIG_N32H7_UART11 +static char locate_data(".axi_ram") g_uart11rxbuffer[CONFIG_UART11_RXBUFSIZE] + aligned_data(ARMV7M_DCACHE_LINESIZE); +static char locate_data(".axi_ram") g_uart11txbuffer[CONFIG_UART11_TXBUFSIZE] + aligned_data(ARMV7M_DCACHE_LINESIZE); + +static struct up_dev_s g_uart11priv = +{ + .dev = + { +#if CONSOLE_UART == 11 + .isconsole = true, +#endif + .recv = + { + .size = sizeof(g_uart11rxbuffer), + .buffer = g_uart11rxbuffer + }, + .xmit = + { + .size = sizeof(g_uart11txbuffer), + .buffer = g_uart11txbuffer + }, + .ops = UART_UART11_OPS, + .priv = &g_uart11priv, + }, + .irq = N32_IRQ_UART11, + .parity = CONFIG_UART11_PARITY, + .bits = CONFIG_UART11_BITS, + .stopbits2 = CONFIG_UART11_2STOP, + .baud = CONFIG_UART11_BAUD, + .apbclock = N32_APB_FREQUENCY, + .usartbase = N32_UART11_BASE, + .tx_gpio = GPIO_UART11_TX, + .rx_gpio = GPIO_UART11_RX, +#ifdef CONFIG_UART11_IFLOWCONTROL + .iflow = true, + .rts_gpio = GPIO_UART11_RTS, +#endif +#ifdef CONFIG_UART11_OFLOWCONTROL + .oflow = true, + .cts_gpio = GPIO_UART11_CTS, +#endif +#ifdef CONFIG_UART11_TXDMA + .txdma_channel = DMAMAP_UART11_TX, +#endif +#ifdef CONFIG_UART11_RXDMA + .rxdma_channel = DMAMAP_UART11_RX, +#endif + .lock = SP_UNLOCKED, +}; +#endif /* CONFIG_N32H7_UART11 */ + +#ifdef CONFIG_N32H7_UART12 +static char locate_data(".axi_ram") g_uart12rxbuffer[CONFIG_UART12_RXBUFSIZE] + aligned_data(ARMV7M_DCACHE_LINESIZE); +static char locate_data(".axi_ram") g_uart12txbuffer[CONFIG_UART12_TXBUFSIZE] + aligned_data(ARMV7M_DCACHE_LINESIZE); + +static struct up_dev_s g_uart12priv = +{ + .dev = + { +#if CONSOLE_UART == 12 + .isconsole = true, +#endif + .recv = + { + .size = sizeof(g_uart12rxbuffer), + .buffer = g_uart12rxbuffer + }, + .xmit = + { + .size = sizeof(g_uart12txbuffer), + .buffer = g_uart12txbuffer + }, + .ops = UART_UART12_OPS, + .priv = &g_uart12priv, + }, + .irq = N32_IRQ_UART12, + .parity = CONFIG_UART12_PARITY, + .bits = CONFIG_UART12_BITS, + .stopbits2 = CONFIG_UART12_2STOP, + .baud = CONFIG_UART12_BAUD, + .apbclock = N32_APB_FREQUENCY, + .usartbase = N32_UART12_BASE, + .tx_gpio = GPIO_UART12_TX, + .rx_gpio = GPIO_UART12_RX, +#ifdef CONFIG_UART12_IFLOWCONTROL + .iflow = true, + .rts_gpio = GPIO_UART12_RTS, +#endif +#ifdef CONFIG_UART12_OFLOWCONTROL + .oflow = true, + .cts_gpio = GPIO_UART12_CTS, +#endif +#ifdef CONFIG_UART12_TXDMA + .txdma_channel = DMAMAP_UART12_TX, +#endif +#ifdef CONFIG_UART12_RXDMA + .rxdma_channel = DMAMAP_UART12_RX, +#endif + .lock = SP_UNLOCKED, +}; +#endif /* CONFIG_N32H7_UART12 */ + +#ifdef CONFIG_N32H7_UART13 +static char locate_data(".axi_ram") g_uart13rxbuffer[CONFIG_UART13_RXBUFSIZE] + aligned_data(ARMV7M_DCACHE_LINESIZE); +static char locate_data(".axi_ram") g_uart13txbuffer[CONFIG_UART13_TXBUFSIZE] + aligned_data(ARMV7M_DCACHE_LINESIZE); + +static struct up_dev_s g_uart13priv = +{ + .dev = + { +#if CONSOLE_UART == 13 + .isconsole = true, +#endif + .recv = + { + .size = sizeof(g_uart13rxbuffer), + .buffer = g_uart13rxbuffer + }, + .xmit = + { + .size = sizeof(g_uart13txbuffer), + .buffer = g_uart13txbuffer + }, + .ops = UART_UART13_OPS, + .priv = &g_uart13priv, + }, + .irq = N32_IRQ_UART13, + .parity = CONFIG_UART13_PARITY, + .bits = CONFIG_UART13_BITS, + .stopbits2 = CONFIG_UART13_2STOP, + .baud = CONFIG_UART13_BAUD, + .apbclock = N32_APB_FREQUENCY, + .usartbase = N32_UART13_BASE, + .tx_gpio = GPIO_UART13_TX, + .rx_gpio = GPIO_UART13_RX, +#ifdef CONFIG_UART13_IFLOWCONTROL + .iflow = true, + .rts_gpio = GPIO_UART13_RTS, +#endif +#ifdef CONFIG_UART13_OFLOWCONTROL + .oflow = true, + .cts_gpio = GPIO_UART13_CTS, +#endif +#ifdef CONFIG_UART13_TXDMA + .txdma_channel = DMAMAP_UART13_TX, +#endif +#ifdef CONFIG_UART13_RXDMA + .rxdma_channel = DMAMAP_UART13_RX, +#endif + .lock = SP_UNLOCKED, +}; +#endif /* CONFIG_N32H7_UART13 */ + +#ifdef CONFIG_N32H7_UART14 +static char locate_data(".axi_ram") g_uart14rxbuffer[CONFIG_UART14_RXBUFSIZE] + aligned_data(ARMV7M_DCACHE_LINESIZE); +static char locate_data(".axi_ram") g_uart14txbuffer[CONFIG_UART14_TXBUFSIZE] + aligned_data(ARMV7M_DCACHE_LINESIZE); + +static struct up_dev_s g_uart14priv = +{ + .dev = + { +#if CONSOLE_UART == 14 + .isconsole = true, +#endif + .recv = + { + .size = sizeof(g_uart14rxbuffer), + .buffer = g_uart14rxbuffer + }, + .xmit = + { + .size = sizeof(g_uart14txbuffer), + .buffer = g_uart14txbuffer + }, + .ops = UART_UART14_OPS, + .priv = &g_uart14priv, + }, + .irq = N32_IRQ_UART14, + .parity = CONFIG_UART14_PARITY, + .bits = CONFIG_UART14_BITS, + .stopbits2 = CONFIG_UART14_2STOP, + .baud = CONFIG_UART14_BAUD, + .apbclock = N32_APB_FREQUENCY, + .usartbase = N32_UART14_BASE, + .tx_gpio = GPIO_UART14_TX, + .rx_gpio = GPIO_UART14_RX, +#ifdef CONFIG_UART14_IFLOWCONTROL + .iflow = true, + .rts_gpio = GPIO_UART14_RTS, +#endif +#ifdef CONFIG_UART14_OFLOWCONTROL + .oflow = true, + .cts_gpio = GPIO_UART14_CTS, +#endif +#ifdef CONFIG_UART14_TXDMA + .txdma_channel = DMAMAP_UART14_TX, +#endif +#ifdef CONFIG_UART14_RXDMA + .rxdma_channel = DMAMAP_UART14_RX, +#endif + .lock = SP_UNLOCKED, +}; +#endif /* CONFIG_N32H7_UART14 */ + +#ifdef CONFIG_N32H7_UART15 +static char locate_data(".axi_ram") g_uart15rxbuffer[CONFIG_UART15_RXBUFSIZE] + aligned_data(ARMV7M_DCACHE_LINESIZE); +static char locate_data(".axi_ram") g_uart15txbuffer[CONFIG_UART15_TXBUFSIZE] + aligned_data(ARMV7M_DCACHE_LINESIZE); + +static struct up_dev_s g_uart15priv = +{ + .dev = + { +#if CONSOLE_UART == 15 + .isconsole = true, +#endif + .recv = + { + .size = sizeof(g_uart15rxbuffer), + .buffer = g_uart15rxbuffer + }, + .xmit = + { + .size = sizeof(g_uart15txbuffer), + .buffer = g_uart15txbuffer + }, + .ops = UART_UART15_OPS, + .priv = &g_uart15priv, + }, + .irq = N32_IRQ_UART15, + .parity = CONFIG_UART15_PARITY, + .bits = CONFIG_UART15_BITS, + .stopbits2 = CONFIG_UART15_2STOP, + .baud = CONFIG_UART15_BAUD, + .apbclock = N32_APB_FREQUENCY, + .usartbase = N32_UART15_BASE, + .tx_gpio = GPIO_UART15_TX, + .rx_gpio = GPIO_UART15_RX, +#ifdef CONFIG_UART15_IFLOWCONTROL + .iflow = true, + .rts_gpio = GPIO_UART15_RTS, +#endif +#ifdef CONFIG_UART15_OFLOWCONTROL + .oflow = true, + .cts_gpio = GPIO_UART15_CTS, +#endif +#ifdef CONFIG_UART15_TXDMA + .txdma_channel = DMAMAP_UART15_TX, +#endif +#ifdef CONFIG_UART15_RXDMA + .rxdma_channel = DMAMAP_UART15_RX, +#endif + .lock = SP_UNLOCKED, +}; +#endif /* CONFIG_N32H7_UART15 */ + +/* Device pointer array */ + +static struct up_dev_s * const g_uart_devs[] = +{ +#ifdef CONFIG_N32H7_USART1 + [0] = &g_usart1priv, +#endif +#ifdef CONFIG_N32H7_USART2 + [1] = &g_usart2priv, +#endif +#ifdef CONFIG_N32H7_USART3 + [2] = &g_usart3priv, +#endif +#ifdef CONFIG_N32H7_USART4 + [3] = &g_usart4priv, +#endif +#ifdef CONFIG_N32H7_USART5 + [4] = &g_usart5priv, +#endif +#ifdef CONFIG_N32H7_USART6 + [5] = &g_usart6priv, +#endif +#ifdef CONFIG_N32H7_USART7 + [6] = &g_usart7priv, +#endif +#ifdef CONFIG_N32H7_USART8 + [7] = &g_usart8priv, +#endif +#ifdef CONFIG_N32H7_UART9 + [8] = &g_uart9priv, +#endif +#ifdef CONFIG_N32H7_UART10 + [9] = &g_uart10priv, +#endif +#ifdef CONFIG_N32H7_UART11 + [10] = &g_uart11priv, +#endif +#ifdef CONFIG_N32H7_UART12 + [11] = &g_uart12priv, +#endif +#ifdef CONFIG_N32H7_UART13 + [12] = &g_uart13priv, +#endif +#ifdef CONFIG_N32H7_UART14 + [13] = &g_uart14priv, +#endif +#ifdef CONFIG_N32H7_UART15 + [14] = &g_uart15priv, +#endif +}; + +#ifdef CONFIG_PM +static struct pm_config_s g_serialpm = +{ + .pm_cb.notify = up_pm_notify, + .pm_cb.prepare = up_pm_prepare, + .serial_suspended = false +}; +#endif + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +static inline uint32_t up_serialin(struct up_dev_s *priv, int offset) +{ + return getreg32(priv->usartbase + offset); +} + +static inline void up_serialout(struct up_dev_s *priv, int offset, + uint32_t value) +{ + putreg32(value, priv->usartbase + offset); +} + +/**************************************************************************** + * Name: up_setusartint + ****************************************************************************/ + +static inline void up_setusartint(struct up_dev_s *priv, uint16_t ie) +{ + uint32_t cr1; + uint32_t cr3; + irqstate_t flags = spin_lock_irqsave(&priv->lock); + + priv->ie = ie; + + cr1 = up_serialin(priv, N32_USART_CTRL1_OFFSET); + cr1 &= ~USART_CTRL1_USED_INTS; + cr1 |= (ie & USART_CTRL1_USED_INTS); + up_serialout(priv, N32_USART_CTRL1_OFFSET, cr1); + + cr3 = up_serialin(priv, N32_USART_CTRL3_OFFSET); + cr3 &= ~USART_CTRL3_USED_INTS; + cr3 |= (ie & USART_CTRL3_USED_INTS); + up_serialout(priv, N32_USART_CTRL3_OFFSET, cr3); + + spin_unlock_irqrestore(&priv->lock, flags); +} + +/**************************************************************************** + * Name: up_disableusartint + ****************************************************************************/ + +static void up_disableusartint(struct up_dev_s *priv, uint16_t *ie) +{ + irqstate_t flags = spin_lock_irqsave(&priv->lock); + + if (ie) + { + uint32_t cr1 = up_serialin(priv, N32_USART_CTRL1_OFFSET); + uint32_t cr3 = up_serialin(priv, N32_USART_CTRL3_OFFSET); + + *ie = (cr1 & USART_CTRL1_USED_INTS) | (cr3 & USART_CTRL3_USED_INTS); + } + + up_setusartint(priv, 0); + spin_unlock_irqrestore(&priv->lock, flags); +} + +/**************************************************************************** + * Name: up_set_format + ****************************************************************************/ + +#ifndef CONFIG_SUPPRESS_UART_CONFIG +static void up_set_format(struct uart_dev_s *dev) +{ + struct up_dev_s *priv = (struct up_dev_s *)dev->priv; + uint32_t cr1; + uint32_t cr2; + uint32_t cr3; + uint32_t brcf; + uint32_t usartdiv; + irqstate_t flags = enter_critical_section(); + + /* Disable UE */ + + cr1 = up_serialin(priv, N32_USART_CTRL1_OFFSET); + cr1 &= ~USART_CTRL1_UEN; + up_serialout(priv, N32_USART_CTRL1_OFFSET, cr1); + + /* Calculate baud rate */ + + bool over8 = false; + uint32_t tmp = (25 * (priv->apbclock / 2)) / priv->baud; + + if (tmp < 100) /* Empirical threshold for using 8x oversampling */ + { + over8 = true; + usartdiv = (tmp & 0xfff0) | ((tmp & 0x000f) >> 1); + } + else + { + usartdiv = (25 * (priv->apbclock / 4)) / priv->baud; + } + + /* Convert to 12.4 format (integer part 12 bits, fractional 4 bits) */ + + brcf = (usartdiv / 100) << 4; + tmp = usartdiv - ((brcf >> 4) * 100); + if (over8) + { + tmp = ((((tmp * 8) + 50) / 100)) & ((uint8_t)0x0f); + if (tmp == 0x08) + { + brcf = brcf + 0x10; + } + else + { + brcf |= tmp; + } + } + else + { + /* Oversampling mode is 16 Samples */ + + brcf += ((((tmp * 16) + 50) / 100)) & ((uint8_t)0x1f); + } + + up_serialout(priv, N32_USART_BRCF_OFFSET, brcf); + + /* Oversampling mode */ + + cr1 = up_serialin(priv, N32_USART_CTRL1_OFFSET); + if (over8) + { + cr1 |= USART_CTRL1_OSPM; + } + else + { + cr1 &= ~USART_CTRL1_OSPM; + } + + /* Word length and parity */ + + cr1 &= ~(USART_CTRL1_WL | USART_CTRL1_PCEN | USART_CTRL1_PSEL); + if (priv->bits == 8 && priv->parity != 0) + { + cr1 |= USART_CTRL1_WL; + } + + if (priv->parity == 1) /* Odd parity */ + { + cr1 |= (USART_CTRL1_PCEN | USART_CTRL1_PSEL); + } + else if (priv->parity == 2) /* Even parity */ + { + cr1 |= USART_CTRL1_PCEN; + } + + /* Stop bits */ + + cr2 = up_serialin(priv, N32_USART_CTRL2_OFFSET); + cr2 &= ~USART_CTRL2_STPB_MASK; + if (priv->stopbits2) + { + cr2 |= USART_CTRL2_STPB(2); /* 2 stop bits */ + } + else + { + cr2 |= USART_CTRL2_STPB(0); /* 1 stop bit */ + } + + up_serialout(priv, N32_USART_CTRL2_OFFSET, cr2); + + /* Hardware flow control (RTSE/CTSE) */ + + cr3 = up_serialin(priv, N32_USART_CTRL3_OFFSET); + cr3 &= ~(USART_CTRL3_CTSEN | USART_CTRL3_RTSEN); +#ifdef CONFIG_SERIAL_IFLOWCONTROL + if (priv->iflow) + { + cr3 |= USART_CTRL3_RTSEN; + } +#endif + +#ifdef CONFIG_SERIAL_OFLOWCONTROL + if (priv->oflow) + { + cr3 |= USART_CTRL3_CTSEN; + } +#endif + + up_serialout(priv, N32_USART_CTRL3_OFFSET, cr3); + + /* Re-enable UE */ + + cr1 |= USART_CTRL1_UEN; + up_serialout(priv, N32_USART_CTRL1_OFFSET, cr1); + + leave_critical_section(flags); +} +#endif + +/**************************************************************************** + * Name: up_set_apb_clock + ****************************************************************************/ + +static void up_set_apb_clock(struct up_dev_s *priv, bool on) +{ + uint32_t regaddr = 0; + uint32_t en_bit = 0; + + switch (priv->usartbase) + { + #ifdef CONFIG_N32H7_USART1 + case N32_USART1_BASE: + regaddr = N32_RCC_APB1EN3; + en_bit = RCC_APB1EN3_M7USART1EN; + break; + #endif + #ifdef CONFIG_N32H7_USART2 + case N32_USART2_BASE: + regaddr = N32_RCC_APB1EN3; + en_bit = RCC_APB1EN3_M7USART2EN; + break; + #endif + #ifdef CONFIG_N32H7_USART3 + case N32_USART3_BASE: + regaddr = N32_RCC_APB1EN3; + en_bit = RCC_APB1EN3_M7USART3EN; + break; + #endif + #ifdef CONFIG_N32H7_USART4 + case N32_USART4_BASE: + regaddr = N32_RCC_APB1EN3; + en_bit = RCC_APB1EN3_M7USART4EN; + break; + #endif + #ifdef CONFIG_N32H7_USART5 + case N32_USART5_BASE: + regaddr = N32_RCC_APB2EN3; + en_bit = RCC_APB2EN3_M7USART5EN; + break; + #endif + #ifdef CONFIG_N32H7_USART6 + case N32_USART6_BASE: + regaddr = N32_RCC_APB2EN3; + en_bit = RCC_APB2EN3_M7USART6EN; + break; + #endif + #ifdef CONFIG_N32H7_USART7 + case N32_USART7_BASE: + regaddr = N32_RCC_APB2EN3; + en_bit = RCC_APB2EN3_M7USART7EN; + break; + #endif + #ifdef CONFIG_N32H7_USART8 + case N32_USART8_BASE: + regaddr = N32_RCC_APB2EN3; + en_bit = RCC_APB2EN3_M7USART8EN; + break; + #endif + #ifdef CONFIG_N32H7_UART9 + case N32_UART9_BASE: + regaddr = N32_RCC_APB1EN3; + en_bit = RCC_APB1EN3_M7UART9EN; + break; + #endif + #ifdef CONFIG_N32H7_UART10 + case N32_UART10_BASE: + regaddr = N32_RCC_APB1EN3; + en_bit = RCC_APB1EN3_M7UART10EN; + break; + #endif + #ifdef CONFIG_N32H7_UART11 + case N32_UART11_BASE: + regaddr = N32_RCC_APB1EN3; + en_bit = RCC_APB1EN3_M7UART11EN; + break; + #endif + #ifdef CONFIG_N32H7_UART12 + case N32_UART12_BASE: + regaddr = N32_RCC_APB1EN3; + en_bit = RCC_APB1EN3_M7UART12EN; + break; + #endif + #ifdef CONFIG_N32H7_UART13 + case N32_UART13_BASE: + regaddr = N32_RCC_APB2EN3; + en_bit = RCC_APB2EN3_M7UART13EN; + break; + #endif + #ifdef CONFIG_N32H7_UART14 + case N32_UART14_BASE: + regaddr = N32_RCC_APB2EN3; + en_bit = RCC_APB2EN3_M7UART14EN; + break; + #endif + #ifdef CONFIG_N32H7_UART15 + case N32_UART15_BASE: + regaddr = N32_RCC_APB2EN3; + en_bit = RCC_APB2EN3_M7UART15EN; + break; + #endif + default: + return; + } + + if (on) + { + modifyreg32(regaddr, 0, en_bit); + } + else + { + modifyreg32(regaddr, en_bit, 0); + } +} + +/**************************************************************************** + * Name: up_setup (non-DMA) + ****************************************************************************/ + +static int up_setup(struct uart_dev_s *dev) +{ + struct up_dev_s *priv = (struct up_dev_s *)dev->priv; + uint32_t cr1; + uint32_t cr2; + uint32_t cr3; + + /* Enable clock */ + + up_set_apb_clock(priv, true); + + /* Configure GPIOs */ + + n32_configgpio(priv->tx_gpio); + n32_configgpio(priv->rx_gpio); +#ifdef CONFIG_SERIAL_IFLOWCONTROL + if (priv->rts_gpio) + { + n32_configgpio(priv->rts_gpio); + } +#endif + +#ifdef CONFIG_SERIAL_OFLOWCONTROL + if (priv->cts_gpio) + { + n32_configgpio(priv->cts_gpio); + } +#endif + + /* Disable USART for configuration */ + + cr1 = up_serialin(priv, N32_USART_CTRL1_OFFSET); + cr1 &= ~USART_CTRL1_UEN; + up_serialout(priv, N32_USART_CTRL1_OFFSET, cr1); + + /* Configure CR2 (stop bits) */ + + cr2 = up_serialin(priv, N32_USART_CTRL2_OFFSET); + cr2 &= ~(USART_CTRL2_STPB_MASK | USART_CTRL2_CLKEN | USART_CTRL2_LINMEN); + if (priv->stopbits2) + { + cr2 |= USART_CTRL2_STPB(2); + } + + up_serialout(priv, N32_USART_CTRL2_OFFSET, cr2); + + /* Configure CR3 (flow control, DMA, etc.) */ + + cr3 = up_serialin(priv, N32_USART_CTRL3_OFFSET); + cr3 &= ~(USART_CTRL3_CTSEN | USART_CTRL3_RTSEN | + USART_CTRL3_DMARXEN | USART_CTRL3_DMATXEN | + USART_CTRL3_HDMEN | USART_CTRL3_SCMEN | USART_CTRL3_IRDAMEN); +#ifdef CONFIG_SERIAL_IFLOWCONTROL + if (priv->iflow) + { + cr3 |= USART_CTRL3_RTSEN; + } +#endif + +#ifdef CONFIG_SERIAL_OFLOWCONTROL + if (priv->oflow) + { + cr3 |= USART_CTRL3_CTSEN; + } +#endif + + up_serialout(priv, N32_USART_CTRL3_OFFSET, cr3); + + /* Call up_set_format to set baud rate, word length, parity, etc. */ + + up_set_format(dev); + + /* Disable FIFO */ + + uint32_t fifo = up_serialin(priv, N32_USART_FIFO_OFFSET); + + fifo &= ~USART_FIFO_EN; + up_serialout(priv, N32_USART_FIFO_OFFSET, fifo); + + /* Enable USART (UE, TE, RE) */ + + cr1 = up_serialin(priv, N32_USART_CTRL1_OFFSET); + cr1 |= (USART_CTRL1_UEN | USART_CTRL1_TXEN | USART_CTRL1_RXEN); + up_serialout(priv, N32_USART_CTRL1_OFFSET, cr1); + + priv->initialized = true; + return OK; +} + +/**************************************************************************** + * Name: up_shutdown (non-DMA) + ****************************************************************************/ + +static void up_shutdown(struct uart_dev_s *dev) +{ + struct up_dev_s *priv = (struct up_dev_s *)dev->priv; + + priv->initialized = false; + + /* Disable interrupts */ + + up_disableusartint(priv, NULL); + + /* Disable USART */ + + uint32_t cr1 = up_serialin(priv, N32_USART_CTRL1_OFFSET); + + cr1 &= ~(USART_CTRL1_UEN | USART_CTRL1_TXEN | USART_CTRL1_RXEN); + up_serialout(priv, N32_USART_CTRL1_OFFSET, cr1); + + /* Disable clock */ + + up_set_apb_clock(priv, false); + + /* Release GPIOs (optional) */ + + n32_unconfiggpio(priv->tx_gpio); + n32_unconfiggpio(priv->rx_gpio); +#ifdef CONFIG_SERIAL_IFLOWCONTROL + if (priv->rts_gpio) + { + n32_unconfiggpio(priv->rts_gpio); + } +#endif + +#ifdef CONFIG_SERIAL_OFLOWCONTROL + if (priv->cts_gpio) + { + n32_unconfiggpio(priv->cts_gpio); + } +#endif +} + +/**************************************************************************** + * Name: up_dma_setup / up_dma_shutdown + ****************************************************************************/ + +#if defined(SERIAL_HAVE_RXDMA) || defined(SERIAL_HAVE_TXDMA) +static int up_dma_setup(struct uart_dev_s *dev) +{ + struct up_dev_s *priv = (struct up_dev_s *)dev->priv; + int ret; + + /* Perform basic setup first */ + + ret = up_setup(dev); + if (ret < 0) + { + return ret; + } + + /* Configure TX DMA */ + +#ifdef SERIAL_HAVE_TXDMA + if (priv->txdma_channel != 0) + { + priv->txdma = n32_dmachannel(priv->txdma_channel); + if (!priv->txdma) + { + return -ENODEV; + } + + /* Enable USART DMA transmission */ + + uint32_t cr3 = up_serialin(priv, N32_USART_CTRL3_OFFSET); + + cr3 |= USART_CTRL3_DMATXEN; + up_serialout(priv, N32_USART_CTRL3_OFFSET, cr3); + } +#endif + + /* Configure RX DMA */ + +#ifdef SERIAL_HAVE_RXDMA + if (priv->rxdma_channel != 0) + { + uart_recvchars_dma(&priv->dev); + priv->rxdma = n32_dmachannel(priv->rxdma_channel); + if (!priv->rxdma) + { + return -ENODEV; + } + + /* Configure DMA for circular reception */ + + rxcfg.src_addr = priv->usartbase + N32_USART_DAT_OFFSET; + rxcfg.dst_addr = (uint32_t)priv->dev.dmarx.buffer; + rxcfg.block_size = priv->dev.dmarx.length; + rxcfg.src_hs_if = n32_getchanel(priv->rxdma); + rxcfg.dst_hs_if = n32_getchanel(priv->rxdma); + + n32_dmasetup(priv->rxdma, &rxcfg); + n32_dmastart(priv->rxdma, up_dma_rxcallback, priv); + + /* Enable USART DMA reception */ + + uint32_t cr3 = up_serialin(priv, N32_USART_CTRL3_OFFSET); + + cr3 |= USART_CTRL3_DMARXEN; + up_serialout(priv, N32_USART_CTRL3_OFFSET, cr3); + } +#endif + + return OK; +} + +static void up_dma_shutdown(struct uart_dev_s *dev) +{ + struct up_dev_s *priv = (struct up_dev_s *)dev->priv; + + /* Stop DMA */ + +#ifdef SERIAL_HAVE_RXDMA + if (priv->rxdma) + { + n32_dmastop(priv->rxdma); + n32_dmafree(priv->rxdma); + priv->rxdma = NULL; + } +#endif + +#ifdef SERIAL_HAVE_TXDMA + if (priv->txdma) + { + n32_dmastop(priv->txdma); + n32_dmafree(priv->txdma); + priv->txdma = NULL; + } +#endif + + up_shutdown(dev); +} +#endif + +/**************************************************************************** + * Name: up_attach / up_detach + ****************************************************************************/ + +static int up_attach(struct uart_dev_s *dev) +{ + struct up_dev_s *priv = (struct up_dev_s *)dev->priv; + int ret = irq_attach(priv->irq, up_interrupt, priv); + + if (ret == OK) + { + up_enable_irq(priv->irq); + } + + return ret; +} + +static void up_detach(struct uart_dev_s *dev) +{ + struct up_dev_s *priv = (struct up_dev_s *)dev->priv; + + up_disable_irq(priv->irq); + irq_detach(priv->irq); +} + +/**************************************************************************** + * Name: up_interrupt + ****************************************************************************/ + +static int up_interrupt(int irq, void *context, void *arg) +{ + struct up_dev_s *priv = (struct up_dev_s *)arg; + uint32_t sts = up_serialin(priv, N32_USART_STS_OFFSET); + + /* Report activity to PM */ + +#ifdef CONFIG_PM + pm_activity(PM_IDLE_DOMAIN, CONFIG_N32H7_PM_SERIAL_ACTIVITY); +#endif + + /* Handle errors (ORE, FE, NE) */ + + if (sts & (USART_STS_OREF | USART_STS_FEF | USART_STS_NEF)) + { + /* Clear error by reading STS then DAT */ + + uint32_t dat = up_serialin(priv, N32_USART_DAT_OFFSET); + + UNUSED(dat); + } + + /* Handle IDLE interrupt (DMA reception complete) */ + + if ((sts & USART_STS_IDLEF) && (priv->rxdma) && + (priv->ie & USART_CTRL1_IDLEIEN)) + { + if (up_dma_rxavailable(&priv->dev)) + { + /* Clear error by reading STS then DAT */ + + uint32_t dat = up_serialin(priv, N32_USART_DAT_OFFSET); + + UNUSED(dat); + + n32_dmastop(priv->rxdma); + priv->dev.dmarx.nbytes = n32_getcount(priv->rxdma); + uart_recvchars_done(&priv->dev); + uart_recvchars_dma(&priv->dev); + + rxcfg.src_addr = priv->usartbase + N32_USART_DAT_OFFSET; + rxcfg.dst_addr = (uint32_t)priv->dev.dmarx.buffer; + rxcfg.block_size = priv->dev.dmarx.length; + rxcfg.src_hs_if = n32_getchanel(priv->rxdma); + rxcfg.dst_hs_if = n32_getchanel(priv->rxdma); + + n32_dmasetup(priv->rxdma, &rxcfg); + n32_dmastart(priv->rxdma, up_dma_rxcallback, priv); + + return OK; + } + } + + /* Non-DMA reception */ + + if ((sts & USART_STS_RXDNE) && (priv->ie & USART_CTRL1_RXDNEIEN)) + { + uart_recvchars(&priv->dev); + } + + /* Transmit by interrupt */ + + if ((sts & USART_STS_TXDE) && (priv->ie & USART_CTRL1_TXDEIEN)) + { + uart_xmitchars(&priv->dev); + } + + return OK; +} + +/**************************************************************************** + * Name: up_receive (non-DMA) + ****************************************************************************/ + +#ifndef SERIAL_HAVE_ONLY_RXDMA +static int up_receive(struct uart_dev_s *dev, unsigned int *status) +{ + struct up_dev_s *priv = (struct up_dev_s *)dev->priv; + uint32_t dat = up_serialin(priv, N32_USART_DAT_OFFSET); + + *status = 0; + return dat & 0xff; +} +#endif + +/**************************************************************************** + * Name: up_rxint + ****************************************************************************/ + +static void up_rxint(struct uart_dev_s *dev, bool enable) +{ + struct up_dev_s *priv = (struct up_dev_s *)dev->priv; + irqstate_t flags; + uint16_t ie; + + /* USART receive interrupts: + * + * Enable Status Meaning Usage + * ------------------ --------------- ------------------------ ---------- + * USART_CR1_IDLEIE USART_ISR_IDLE Idle Line Detected (not used) + * USART_CR1_RXNEIE USART_ISR_RXNE Received Data Ready + * to be Read + * " " USART_ISR_ORE Overrun Error Detected + * USART_CR1_PEIE USART_ISR_PE Parity Error + * + * USART_CR2_LBDIE USART_ISR_LBD Break Flag (not used) + * USART_CR3_EIE USART_ISR_FE Framing Error + * " " USART_ISR_NF Noise Error + * " " USART_ISR_ORE Overrun Error Detected + */ + + flags = enter_critical_section(); + ie = priv->ie; + if (enable) + { + /* Receive an interrupt when their is anything in the Rx data register + * (or an Rx timeout occurs). + */ + +#ifndef CONFIG_SUPPRESS_SERIAL_INTS +#ifdef CONFIG_USART_ERRINTS + ie |= (USART_CTRL1_RXDNEIEN | USART_CTRL1_PEIEN | USART_CTRL3_ERRIEN); +#else + ie |= USART_CTRL1_RXDNEIEN; +#endif +#endif + } + else + { + ie &= ~(USART_CTRL1_RXDNEIEN | USART_CTRL1_PEIEN | USART_CTRL3_ERRIEN); + } + + /* Then set the new interrupt state */ + + up_setusartint(priv, ie); + + leave_critical_section(flags); +} + +/**************************************************************************** + * Name: up_rxavailable + ****************************************************************************/ + +static bool up_rxavailable(struct uart_dev_s *dev) +{ + struct up_dev_s *priv = (struct up_dev_s *)dev->priv; + + return (up_serialin(priv, N32_USART_STS_OFFSET) & USART_STS_RXDNE) != 0; +} + +/**************************************************************************** + * Name: up_rxflowcontrol + ****************************************************************************/ + +#ifdef CONFIG_SERIAL_IFLOWCONTROL +static bool up_rxflowcontrol(struct uart_dev_s *dev, unsigned int nbuffered, + bool upper) +{ + struct up_dev_s *priv = (struct up_dev_s *)dev->priv; + + if (priv->iflow) + { + /* Simple flow control: disable RX interrupt when buffer full */ + + if (upper) + { + uart_disablerxint(dev); + return true; + } + else + { + uart_enablerxint(dev); + } + } + + return false; +} +#endif + +/**************************************************************************** + * Name: up_send + ****************************************************************************/ + +static void up_send(struct uart_dev_s *dev, int ch) +{ + struct up_dev_s *priv = (struct up_dev_s *)dev->priv; + + up_serialout(priv, N32_USART_DAT_OFFSET, (uint32_t)ch); +} + +/**************************************************************************** + * Name: up_txint + ****************************************************************************/ + +static void up_txint(struct uart_dev_s *dev, bool enable) +{ + struct up_dev_s *priv = (struct up_dev_s *)dev->priv; + irqstate_t flags; + + /* USART transmit interrupts: + * + * Enable Status Meaning Usage + * --------------- -------------- --------------------- ---------- + * USART_CR1_TCIE USART_ISR_TC Transmission Complete (used only + * for RS-485) + * USART_CR1_TXEIE USART_ISR_TXE Transmit Data + * Register Empty + * USART_CR3_CTSIE USART_ISR_CTS CTS flag (not used) + */ + + flags = enter_critical_section(); + if (enable) + { + /* Set to receive an interrupt when the TX data register is empty */ + +#ifndef CONFIG_SUPPRESS_SERIAL_INTS + uint16_t ie = priv->ie | USART_CTRL1_TXDEIEN; + +# ifdef CONFIG_STM32_SERIALBRK_BSDCOMPAT + if (priv->ie & USART_CR1_IE_BREAK_INPROGRESS) + { + leave_critical_section(flags); + return; + } +# endif + + up_setusartint(priv, ie); +#else + /* Fake a TX interrupt here by just calling uart_xmitchars() with + * interrupts disabled (note this may recurse). + */ + + uart_xmitchars(dev); +#endif + } + else + { + /* Disable the TX interrupt */ + + up_setusartint(priv, priv->ie & ~USART_CTRL1_TXDEIEN); + } + + leave_critical_section(flags); +} + +/**************************************************************************** + * Name: up_txready / up_txempty + ****************************************************************************/ + +static bool up_txready(struct uart_dev_s *dev) +{ + struct up_dev_s *priv = (struct up_dev_s *)dev->priv; + + return (up_serialin(priv, N32_USART_STS_OFFSET) & USART_STS_TXDE) != 0; +} + +static bool up_txempty(struct uart_dev_s *dev) +{ + struct up_dev_s *priv = (struct up_dev_s *)dev->priv; + + return (up_serialin(priv, N32_USART_STS_OFFSET) & USART_STS_TXC) != 0; +} + +/**************************************************************************** + * Name: up_dma_rxcallback + ****************************************************************************/ + +#ifdef SERIAL_HAVE_RXDMA +static void up_dma_rxcallback(DMA_HANDLE handle, uint8_t status, void *arg) +{ + struct up_dev_s *priv = arg; + + uart_recvchars_dma(&priv->dev); +} +#endif + +/**************************************************************************** + * Name: up_dma_receive / up_dma_rxint / up_dma_rxavailable + ****************************************************************************/ + +#ifdef SERIAL_HAVE_RXDMA +static void up_dma_receive(struct uart_dev_s *dev) +{ + struct up_dev_s *priv = (struct up_dev_s *)dev->priv; + uint32_t nextrx = n32_getcount(priv->rxdma); + + /* Check if more data is available */ + + if (nextrx != 0) + { +#ifdef CONFIG_ARMV7M_DCACHE + /* If the data cache is enabled, then we will also need to manage + * cache coherency. Are any bytes available in the currently coherent + * region of the data cache? + */ + + uintptr_t addr; + + /* Invalidate the DMA buffer range */ + + addr = (uintptr_t)&dev->recv.buffer[dev->recv.tail]; + up_invalidate_dcache(addr, addr + nextrx); +#endif + } +} + +static void up_dma_rxint(struct uart_dev_s *dev, bool enable) +{ + struct up_dev_s *priv = (struct up_dev_s *)dev->priv; + irqstate_t flags; + + /* Check if DMA handle is valid */ + + if (!priv->rxdma) + { + return; + } + + flags = enter_critical_section(); + if (enable) + { + uint16_t ie = priv->ie | USART_CTRL1_IDLEIEN; + + up_setusartint(priv, ie); + } + else + { + uint16_t ie = priv->ie & ~USART_CTRL1_IDLEIEN; + + up_setusartint(priv, ie); + } + + leave_critical_section(flags); +} + +static bool up_dma_rxavailable(struct uart_dev_s *dev) +{ + struct up_dev_s *priv = (struct up_dev_s *)dev->priv; + + return n32_getcount(priv->rxdma) != 0; +} +#endif + +/**************************************************************************** + * Name: up_dma_txcallback / up_dma_txavailable / up_dma_send / up_dma_txint + ****************************************************************************/ + +#ifdef SERIAL_HAVE_TXDMA +static void up_dma_txcallback(DMA_HANDLE handle, uint8_t status, void *arg) +{ + struct up_dev_s *priv = arg; + + if (status == DMA_INT_TFR) + { + priv->dev.dmatx.nbytes += priv->dev.dmatx.length; + if (priv->dev.dmatx.nlength) + { + /* Set up DMA on next buffer */ + + txcfg.src_addr = (uint32_t)priv->dev.dmatx.nbuffer; + txcfg.dst_addr = (uint32_t)priv->usartbase | N32_USART_DAT_OFFSET; + txcfg.block_size = priv->dev.dmatx.nlength; + txcfg.src_hs_if = n32_getchanel(priv->txdma); + txcfg.dst_hs_if = n32_getchanel(priv->txdma); + n32_dmasetup(priv->txdma, &txcfg); + + /* Set length for the next completion */ + + priv->dev.dmatx.length = priv->dev.dmatx.nlength; + priv->dev.dmatx.nlength = 0; + + /* Start transmission with the callback on DMA completion */ + + n32_dmastart(priv->txdma, up_dma_txcallback, priv); + + return; + } + } + else if(status == DMA_INT_ERROR) + { + PANIC(); + } + + /* Adjust the pointers */ + + uart_xmitchars_done(&priv->dev); + + /* Send more if available */ + + up_dma_txavailable(&priv->dev); +} + +static void up_dma_txavailable(struct uart_dev_s *dev) +{ + struct up_dev_s *priv = (struct up_dev_s *)dev->priv; + irqstate_t flags = enter_critical_section(); + + if (priv->dev.dmatx.length == 0 && priv->dev.dmatx.nlength == 0) + { + uart_xmitchars_dma(dev); + } + + leave_critical_section(flags); +} + +static void up_dma_send(struct uart_dev_s *dev) +{ + struct up_dev_s *priv = (struct up_dev_s *)dev->priv; + + /* We need to stop DMA before reconfiguration */ + + n32_dmastop(priv->txdma); + + /* Reset the number sent */ + + dev->dmatx.nbytes = 0; + + /* Flush the contents of the TX buffer into physical memory */ + + up_clean_dcache((uintptr_t)dev->dmatx.buffer, + (uintptr_t)dev->dmatx.buffer + dev->dmatx.length); + + /* Is this a split transfer */ + + if (dev->dmatx.nbuffer) + { + /* Flush the contents of the next TX buffer into physical memory */ + + up_clean_dcache((uintptr_t)dev->dmatx.nbuffer, + (uintptr_t)dev->dmatx.nbuffer + dev->dmatx.nlength); + } + + /* Configure TX DMA */ + + txcfg.src_addr = (uint32_t)priv->dev.dmatx.buffer; + txcfg.dst_addr = (uint32_t)priv->usartbase | N32_USART_DAT_OFFSET; + txcfg.block_size = priv->dev.dmatx.length; + txcfg.src_hs_if = n32_getchanel(priv->txdma); + txcfg.dst_hs_if = n32_getchanel(priv->txdma); + + n32_dmasetup(priv->txdma, &txcfg); + n32_dmastart(priv->txdma, up_dma_txcallback, priv); +} + +static void up_dma_txint(struct uart_dev_s *dev, bool enable) +{ + /* DMA TX doesn't use interrupts, driven by DMA callback */ +} +#endif + +/**************************************************************************** + * Name: up_ioctl + ****************************************************************************/ + +static int up_ioctl(struct file *filep, int cmd, unsigned long arg) +{ +#if defined(CONFIG_SERIAL_TERMIOS) || defined(CONFIG_SERIAL_TIOCSERGSTRUCT) + struct inode *inode = filep->f_inode; + struct uart_dev_s *dev = inode->i_private; + struct up_dev_s *priv = (struct up_dev_s *)dev->priv; + int ret = OK; +#endif + + switch (cmd) + { + #ifdef CONFIG_SERIAL_TIOCSERGSTRUCT + case TIOCSERGSTRUCT: + { + struct up_dev_s *user = (struct up_dev_s *)arg; + + if (!user) + { + ret = -EINVAL; + } + else + { + memcpy(user, priv, sizeof(struct up_dev_s)); + } + } + break; + #endif + + #ifdef CONFIG_SERIAL_TERMIOS + case TCGETS: + { + struct termios *t = (struct termios *)arg; + + if (!t) + { + ret = -EINVAL; + } + + t->c_cflag = ((priv->parity != 0) ? PARENB : 0) | + ((priv->parity == 1) ? PARODD : 0) | + ((priv->stopbits2) ? CSTOPB : 0) | + #ifdef CONFIG_SERIAL_OFLOWCONTROL + ((priv->oflow) ? CCTS_OFLOW : 0) | + #endif + #ifdef CONFIG_SERIAL_IFLOWCONTROL + ((priv->iflow) ? CRTS_IFLOW : 0) | + #endif + ((priv->bits == 8 && priv->parity != 0) ? CS7 : CS8); + cfsetispeed(t, priv->baud); + cfsetospeed(t, priv->baud); + } + break; + + case TCSETS: + { + struct termios *t = (struct termios *)arg; + + if (!t) + { + return -EINVAL; + } + + if ((t->c_cflag & (CS8 | CS7)) == 0) + { + return -EINVAL; + } + + if ((t->c_cflag & CSIZE) == CS7 && (t->c_cflag & PARENB) == 0) + { + return -EINVAL; + } + + priv->parity = (t->c_cflag & PARENB) ? + ((t->c_cflag & PARODD) ? 1 : 2) : 0; + priv->stopbits2 = (t->c_cflag & CSTOPB) != 0; + #ifdef CONFIG_SERIAL_OFLOWCONTROL + priv->oflow = (t->c_cflag & CCTS_OFLOW) != 0; + #endif + #ifdef CONFIG_SERIAL_IFLOWCONTROL + priv->iflow = (t->c_cflag & CRTS_IFLOW) != 0; + #endif + priv->baud = cfgetispeed(t); + up_set_format(dev); + } + + break; + #endif + + case TIOCSSWAP: + { + uint32_t cr1 = up_serialin(priv, N32_USART_CTRL1_OFFSET); + uint32_t ue = cr1 & USART_CTRL1_UEN; + + cr1 &= ~USART_CTRL1_UEN; + up_serialout(priv, N32_USART_CTRL1_OFFSET, cr1); + if (arg) + { + cr1 |= USART_CTRL1_SWAP; + } + else + { + cr1 &= ~USART_CTRL1_SWAP; + } + + cr1 |= ue; + up_serialout(priv, N32_USART_CTRL1_OFFSET, cr1); + } + + break; + + case TIOCSBRK: + { + uint32_t cr1 = up_serialin(priv, N32_USART_CTRL1_OFFSET); + + cr1 |= USART_CTRL1_SDBRK; + up_serialout(priv, N32_USART_CTRL1_OFFSET, cr1); + + /* Wait for break to be sent (hardware clears it automatically) */ + + while (up_serialin(priv, N32_USART_CTRL1_OFFSET) & + USART_CTRL1_SDBRK); + } + + break; + case TIOCCBRK: + + /* No operation needed */ + + break; + + default: + ret = -ENOTTY; + break; + } + + return ret; +} + +/**************************************************************************** + * Name: up_pm_* (Power Management) + ****************************************************************************/ + +#ifdef CONFIG_PM +static void up_pm_setsuspend(bool suspend) +{ + /* Iterate all UARTs to suspend/resume */ + + for (int i = 0; i < sizeof(g_uart_devs) / sizeof(g_uart_devs[0]); i++) + { + struct up_dev_s *priv = g_uart_devs[i]; + + if (!priv || !priv->initialized) + { + continue; + } + + if (suspend) + { + /* Save and disable interrupts */ + + up_disableusartint(priv, &priv->suspended_ie); + priv->suspended = true; + } + else + { + up_setusartint(priv, priv->suspended_ie); + priv->suspended = false; + } + } +} + +static void up_pm_notify(struct pm_callback_s *cb, int domain, + enum pm_state_e pmstate) +{ + if (pmstate == PM_NORMAL || pmstate == PM_IDLE) + { + up_pm_setsuspend(false); + } + else + { + up_pm_setsuspend(true); + } +} + +static int up_pm_prepare(struct pm_callback_s *cb, int domain, + enum pm_state_e pmstate) +{ + /* Check if there is pending data, prevent low-power if so */ + + if (pmstate == PM_SLEEP || pmstate == PM_STANDBY) + { + for (int i = 0; i < sizeof(g_uart_devs) / sizeof(g_uart_devs[0]); i++) + { + struct up_dev_s *priv = g_uart_devs[i]; + + if (!priv || !priv->initialized) + { + continue; + } + + if (priv->dev.xmit.head != priv->dev.xmit.tail) + { + return -EBUSY; + } + + if (priv->dev.recv.head != priv->dev.recv.tail) + { + return -EBUSY; + } + } + } + + return OK; +} +#endif + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: n32_serial_get_uart + ****************************************************************************/ + +uart_dev_t *n32_serial_get_uart(int uart_num) +{ + int idx = uart_num - 1; + + if (idx < 0 || idx >= (int)(sizeof(g_uart_devs) / sizeof(g_uart_devs[0]))) + { + return NULL; + } + + struct up_dev_s *priv = g_uart_devs[idx]; + + if (!priv || !priv->initialized) + { + return NULL; + } + + return &priv->dev; +} + +/**************************************************************************** + * Name: arm_earlyserialinit + ****************************************************************************/ + +void arm_earlyserialinit(void) +{ +#ifdef HAVE_UART + /* Disable all UART interrupts */ + + for (int i = 0; i < sizeof(g_uart_devs) / sizeof(g_uart_devs[0]); i++) + { + if (g_uart_devs[i]) + { + up_disableusartint(g_uart_devs[i], NULL); + } + } +#endif +} + +/**************************************************************************** + * Name: arm_serialinit + ****************************************************************************/ + +void arm_serialinit(void) +{ +#ifdef HAVE_UART + char devname[32]; + int minor = 0; + + UNUSED(g_uart_rxdma_ops); + UNUSED(g_uart_txdma_ops); + UNUSED(g_uart_rxtxdma_ops); + UNUSED(g_uart_ops); + + /* Configure console */ + +#if CONSOLE_UART > 0 +#if defined(SERIAL_HAVE_TXDMA) || defined(SERIAL_HAVE_RXDMA) + up_dma_setup(&g_uart_devs[CONSOLE_UART - 1]->dev); +#else + up_setup(&g_uart_devs[CONSOLE_UART - 1]->dev); +#endif +#endif + +#ifdef CONFIG_PM + pm_register(&g_serialpm.pm_cb); +#endif + + /* Register console */ + +#if CONSOLE_UART > 0 + uart_register("/dev/console", &g_uart_devs[CONSOLE_UART - 1]->dev); + + /* Register as ttyS0 first, skip console in later loop */ + + uart_register("/dev/ttyS0", &g_uart_devs[CONSOLE_UART - 1]->dev); + minor = 1; +#endif + + /* Register remaining UARTs */ + + for (int i = 0; i < sizeof(g_uart_devs) / sizeof(g_uart_devs[0]); i++) + { + if (!g_uart_devs[i]) + { + continue; + } + + if (g_uart_devs[i]->dev.isconsole) + { + continue; + } + + snprintf(devname, sizeof(devname), "/dev/ttyS%d", minor++); + uart_register(devname, &g_uart_devs[i]->dev); + } +#endif +} + +/**************************************************************************** + * Name: up_putc + ****************************************************************************/ + +void up_putc(int ch) +{ +#if CONSOLE_UART > 0 + struct up_dev_s *priv = g_uart_devs[CONSOLE_UART - 1]; + uint16_t ie; + + up_disableusartint(priv, &ie); + arm_lowputc(ch); + up_setusartint(priv, ie); +#endif +} + +#endif /* HAVE_UART */ diff --git a/arch/arm/src/n32h7/n32_start.c b/arch/arm/src/n32h7/n32_start.c new file mode 100644 index 0000000000000..bdf783b9652f1 --- /dev/null +++ b/arch/arm/src/n32h7/n32_start.c @@ -0,0 +1,397 @@ +/**************************************************************************** + * arch/arm/src/n32h7/n32_start.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include + +#include +#include +#include +#include +#include + +#include "arm_internal.h" +#include "nvic.h" +#include "mpu.h" +#ifdef CONFIG_ARM_MPU +# include "n32_mpuinit.h" +#endif + +#include "n32_rcc.h" +#include "n32_lowputc.h" +#include "n32_start.h" + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* Memory Map ***************************************************************/ + +extern const uint32_t _sbss_rel[]; +extern const uint32_t _ebss_rel[]; +extern const uint32_t _sivectors[]; +extern const uint32_t _svectors[]; +extern const uint32_t _evectors[]; +extern const uint32_t _sitext[]; +extern const uint32_t __extab_start[]; +extern const uint32_t __extab_end[]; +extern const uint32_t __exidx_start[]; +extern const uint32_t __exidx_end[]; + +/**************************************************************************** + * Public Data + ****************************************************************************/ + +/* g_idle_topstack: _sbss is the start of the BSS region as defined by the + * linker script. _ebss lies at the end of the BSS region. The idle task + * stack starts at the end of BSS and is of size CONFIG_IDLETHREAD_STACKSIZE. + * The IDLE thread is the thread that the system boots on and, eventually, + * becomes the IDLE, do nothing task that runs only when there is nothing + * else to run. The heap continues from there until the end of memory. + * g_idle_topstack is a read-only variable the provides this computed + * address. + */ + +const uintptr_t g_idle_topstack = (uintptr_t)_ebss_rel + + CONFIG_IDLETHREAD_STACKSIZE; + +/**************************************************************************** + * Private Function prototypes + ****************************************************************************/ + +/**************************************************************************** + * Name: showprogress + * + * Description: + * Print a character on the UART to show boot status. + * + ****************************************************************************/ + +void up_lowputc(int ch) +{ + arm_lowputc(ch); +} +#ifdef CONFIG_DEBUG_FEATURES +# define showprogress(c) arm_lowputc(c) +#else +# define showprogress(c) +#endif + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +#ifdef CONFIG_ARMV7M_STACKCHECK +/* we need to get r10 set before we can allow instrumentation calls */ + +void __start(void) noinstrument_function; +#endif + +#ifdef CONFIG_ARCH_CHIP_N32H7_CORTEXM7 +/**************************************************************************** + * Name: n32_tcmenable + * + * Description: + * Enable/disable tightly coupled memories. Size of tightly coupled + * memory regions is controlled by GPNVM Bits 7-8. + * + ****************************************************************************/ + +static inline no_builtin("memcpy") no_builtin("memset") + void n32_tcmenable(void) +{ + uint32_t regval; + + UP_MB(); + + /* Enabled/disabled ITCM */ + +#ifdef CONFIG_ARMV7M_ITCM + regval = NVIC_TCMCR_EN | NVIC_TCMCR_RMW | NVIC_TCMCR_RETEN; +#else + regval = getreg32(NVIC_ITCMCR); + regval &= ~NVIC_TCMCR_EN; +#endif + putreg32(regval, NVIC_ITCMCR); + + /* Enabled/disabled DTCM */ + +#ifdef CONFIG_ARMV7M_DTCM + + regval = NVIC_TCMCR_EN | NVIC_TCMCR_RMW | NVIC_TCMCR_RETEN; +#else + regval = getreg32(NVIC_DTCMCR); + regval &= ~NVIC_TCMCR_EN; +#endif + putreg32(regval, NVIC_DTCMCR); + + UP_MB(); + +#ifdef CONFIG_ARMV7M_ITCM + const uint32_t *src; + uint32_t *dest; + + /* Copy TCM code from flash to ITCM */ + + for (src = _sivectors, dest = (uint32_t *)_svectors; dest < _evectors; ) + { + *dest++ = *src++; + } + + for (src = _sitext, dest = (uint32_t *)_stext; dest < (uint32_t *)_etext; ) + { + *dest++ = *src++; + } + + for (dest = (uint32_t *)_sinit; dest < (uint32_t *)_einit; ) + { + *dest++ = *src++; + } + + for (dest = (uint32_t *)__extab_start; dest < __extab_end; ) + { + *dest++ = *src++; + } + + for (dest = (uint32_t *)__exidx_start; dest < __exidx_end; ) + { + *dest++ = *src++; + } +#endif +} +#endif + +/**************************************************************************** + * Name: n32_tcm_init + * + * Description: + * Initialize the TCM Controller. + * No Memory Access, only register access. + * + * Input Parameters: + * tcm_size - TCM size config code + * + ****************************************************************************/ + +static inline void n32_tcm_init(uint32_t tcm_size) +{ + __asm__ volatile ("ldr r3, =0x1ff00f01\n\t" + "push {r0, lr}\n\t" + "blx r3\n\t" + "mov r3, r0\n\t" + "pop {r0, lr}\n\t" + "cmp r3, r0\n\t" + "beq tcm_ok\n\t" + "ldr r3, =0x51105280\n\t" + "mov r2, r0\n\t" + "str r2, [r3]\n\t" + "ldr r3, =0xE000ED0C\n\t" + "ldr r3, [r3]\n\t" + "and r2, r3, #0x0700\n\t" + "ldr r1, =0xE000ED0C\n\t" + "ldr r3, =0x05FA0004\n\t" + "orrs r3, r2\n\t" + "str r3, [r1]\n\t" + "dsb\n\t" + "loop:\n\t" + "nop\n\t" + "b loop\n\t" + "tcm_ok:\n\t" + "ldr r3, =g_idle_topstack\n\t" + "ldr r3, [r3]\n\t" + "mov sp, r3\n\t": : "r"(tcm_size) : "r3", "r1", "r2", + "memory"); +} + +/**************************************************************************** + * Name: n32_startup_m7 + * + * Description: + * Startup function. + * No Flash access. + * + ****************************************************************************/ + +static noinline_function void n32_startup_m7(void) +{ + const uint32_t *src; + uint32_t *dest; + +#ifdef CONFIG_ARMV7M_STACKCHECK + /* Set the stack limit before we attempt to call any functions */ + + __asm__ volatile("sub r10, sp, %0" : : + "r"(CONFIG_IDLETHREAD_STACKSIZE - 64) :); +#endif + + /* If enabled reset the MPU */ + + mpu_early_reset(); + + /* In case of TCM configuration can be changed after POR, + * we use AXI_RAM as .bss section before TCM configuration is initialized, + * so we need to clear .bss_rel instead after TCM configuration has been + * done. + */ + + for (dest = (uint32_t *)_sbss_rel; dest < (uint32_t *)_ebss_rel; ) + { + *dest++ = 0; + } + + /* Move the initialized data section from his temporary holding spot in + * FLASH into the correct place in SRAM. The correct place in SRAM is + * give by _sdata and _edata. The temporary location is in FLASH at the + * end of all of the other read-only data (.text, .rodata) at _eronly. + */ + + for (src = (const uint32_t *)_eronly, + dest = (uint32_t *)_sdata; dest < (uint32_t *)_edata; + ) + { + *dest++ = *src++; + } + + /* Copy any necessary code sections from FLASH to RAM. The correct + * destination in SRAM is given by _sramfuncs and _eramfuncs. The + * temporary location is in flash after the data initialization code + * at _framfuncs. This should be done before n32_clockconfig() is + * called (in case it has some dependency on initialized C variables). + */ + +#ifdef CONFIG_ARCH_RAMFUNCS + for (src = (const uint32_t *)_framfuncs, + dest = (uint32_t *)_sramfuncs; dest < (uint32_t *)_eramfuncs; + ) + { + *dest++ = *src++; + } +#endif + +#ifdef CONFIG_ARMV7M_STACKCHECK + arm_stack_check_init(); +#endif + /* Configure the UART so that we can get debug output as soon as possible */ + + n32_clockconfig(); + arm_fpuconfig(); + n32_lowsetup(); + syslog(LOG_INFO, "\033[2J\033[0m"); + showprogress('A'); + + /* Initialize onboard resources */ + + n32_boardinitialize(); + showprogress('B'); + +#ifdef CONFIG_ARCH_CHIP_N32H7_CORTEXM7 + /* Enable I- and D-Caches */ + + up_enable_icache(); + up_enable_dcache(); +#endif + showprogress('C'); + +#ifdef CONFIG_ARCH_PERF_EVENTS + up_perf_init((void *)N32_M7CPU_FREQUENCY); +#endif + + /* Perform early serial initialization */ + +#ifdef USE_EARLYSERIALINIT + arm_earlyserialinit(); +#endif + showprogress('D'); + + /* For the case of the separate user-/kernel-space build, perform whatever + * platform specific initialization of the user memory is required. + * Normally this just means initializing the user space .data and .bss + * segments. + */ + +#ifdef CONFIG_BUILD_PROTECTED + n32_userspace(); +#endif + showprogress('E'); + + /* Then start NuttX */ + + showprogress('\r'); + showprogress('\n'); + +#ifdef CONFIG_ARM_MPU + /* Configure the MPU */ + + n32_mpuinitialize(); +#endif + + nx_start(); + + /* Shouldn't get here */ + + board_autoled_off(LED_STACKCREATED); + for (; ; ) + { + board_autoled_on(LED_PANIC); + up_mdelay(250); + board_autoled_off(LED_PANIC); + up_mdelay(250); + } +} + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: __start + * + * Description: + * This is the reset entry point. + * + ****************************************************************************/ + +osentry_function +void __start(void) +{ +#ifdef CONFIG_ARCH_CHIP_N32H7_CORTEXM7 + /* Initialize TCM */ + + n32_tcm_init(TCM_SIZE_VALUE); + + /* Enable/disable tightly coupled memories */ + + n32_tcmenable(); + + /* CM7 Startup function */ + + n32_startup_m7(); +#else +# error "N32H7_CORTEXM4 is not supported" +#endif +} diff --git a/arch/arm/src/n32h7/n32_start.h b/arch/arm/src/n32h7/n32_start.h new file mode 100644 index 0000000000000..a48dbef00d23c --- /dev/null +++ b/arch/arm/src/n32h7/n32_start.h @@ -0,0 +1,74 @@ +/**************************************************************************** + * arch/arm/src/n32h7/n32_start.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __ARCH_ARM_SRC_N32H7_N32_START_H +#define __ARCH_ARM_SRC_N32H7_N32_START_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include + +#include +#include +#include + +#include "arm_internal.h" +#include "chip.h" + +#ifndef __ASSEMBLY__ + +#undef EXTERN +#if defined(__cplusplus) +#define EXTERN extern "C" +extern "C" +{ +#else +#define EXTERN extern +#endif + +/**************************************************************************** + * Public Function Prototypes + ****************************************************************************/ + +/**************************************************************************** + * Name: n32_boardinitialize + * + * Description: + * All SAMV7 architectures must provide the following entry point. + * This entry point is called early in the initialization -- after clocking + * and memory have been configured but before caches have been enabled and + * before any devices have been initialized. + * + ****************************************************************************/ + +void n32_boardinitialize(void); + +#undef EXTERN +#if defined(__cplusplus) +} +#endif + +#endif /* __ASSEMBLY__ */ +#endif /* __ARCH_ARM_SRC_N32H7_N32_START_H */ diff --git a/arch/arm/src/n32h7/n32_systemreset.c b/arch/arm/src/n32h7/n32_systemreset.c new file mode 100644 index 0000000000000..9fbed874dba4c --- /dev/null +++ b/arch/arm/src/n32h7/n32_systemreset.c @@ -0,0 +1,95 @@ +/**************************************************************************** + * arch/arm/src/n32h7/n32_systemreset.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include + +#include +#include +#include + +#include "arm_internal.h" +#include "hardware/n32h7_rcc.h" +#include "n32_systemreset.h" + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: n32_get_reset_cause + * + * Description: + * Get cause of the last CPU reset. This is done by reading reset status + * registger. + * + * Returned Value: + * CPU reset cause in form of macros defined in sam_systemreset.h. This is + * to avoid passing boardctl dependent structure to architecture layer. + * Board level specific code should include sam_systemreset.h and set + * boardctl result according to that. -1 is returned in case of invalid + * value in status register. + * + ****************************************************************************/ + +int n32_get_reset_cause(void) +{ + int ret = -1; + static uint32_t rstsr = 0; + + if (rstsr == 0) + { + rstsr = getreg32(N32_RCC_CTRLSTS); + putreg32(RCC_CTRLSTS_RMRSTF, N32_RCC_CTRLSTS); + putreg32(~RCC_CTRLSTS_RMRSTF, N32_RCC_CTRLSTS); + } + + if (rstsr & RCC_CTRLSTS_PORRSTF) + { + ret = N32H7_RESET_PWRUP; + } + else if (rstsr & RCC_CTRLSTS_BORRSTF) + { + ret = N32H7_RESET_BOR; + } + else if (rstsr & (RCC_CTRLSTS_WWDG1RSTF | RCC_CTRLSTS_WWDG2RSTF | + RCC_CTRLSTS_IWDG1RSTF | RCC_CTRLSTS_IWDG2RSTF)) + { + ret = N32H7_RESET_WDOG; + } + else if (rstsr & RCC_CTRLSTS_CM7SFTRSTF) + { + ret = N32H7_RESET_SWRST; + } + else if (rstsr & RCC_CTRLSTS_PINRSTF) + { + ret = N32H7_RESET_NRST; + } + + return ret; +} diff --git a/arch/arm/src/n32h7/n32_systemreset.h b/arch/arm/src/n32h7/n32_systemreset.h new file mode 100644 index 0000000000000..3af9879f0ff86 --- /dev/null +++ b/arch/arm/src/n32h7/n32_systemreset.h @@ -0,0 +1,64 @@ +/**************************************************************************** + * arch/arm/src/n32h7/n32_systemreset.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __ARCH_ARM_SRC_N32H7_N32_SYSTEMRESET_H +#define __ARCH_ARM_SRC_N32H7_N32_SYSTEMRESET_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +#define N32H7_RESET_PWRUP 1 +#define N32H7_RESET_BOR 2 +#define N32H7_RESET_WDOG 3 +#define N32H7_RESET_SWRST 4 +#define N32H7_RESET_NRST 5 + +/**************************************************************************** + * Public Function Prototypes + ****************************************************************************/ + +/**************************************************************************** + * Name: n32_get_reset_cause + * + * Description: + * Get cause of the last CPU reset. This is done by reading reset status + * registger. + * + * Returned Value: + * CPU reset cause in form of macros defined in sam_systemreset.h. This is + * to avoid passing boardctl dependent structure to architecture layer. + * Board level specific code should include sam_systemreset.h and set + * boardctl result according to that. -1 is returned in case of invalid + * value in status register. + * + ****************************************************************************/ + +int n32_get_reset_cause(void); + +#endif /* __ARCH_ARM_SRC_N32H7_N32_SYSTEMRESET_H */ diff --git a/arch/arm/src/n32h7/n32_tickless.c b/arch/arm/src/n32h7/n32_tickless.c new file mode 100644 index 0000000000000..8c33ef191efdb --- /dev/null +++ b/arch/arm/src/n32h7/n32_tickless.c @@ -0,0 +1,821 @@ +/**************************************************************************** + * arch/arm/src/n32h7/n32_tickless.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Tickless OS Support. + * + * When CONFIG_SCHED_TICKLESS is enabled, all support for timer interrupts + * is suppressed and the platform specific code is expected to provide the + * following custom functions. + * + * void up_timer_initialize(void): Initializes the timer facilities. + * Called early in the initialization sequence (by up_initialize()). + * int up_timer_gettime(struct timespec *ts): Returns the current + * time from the platform specific time source. + * int up_timer_cancel(void): Cancels the interval timer. + * int up_timer_start(const struct timespec *ts): Start (or re-starts) + * the interval timer. + * + * The RTOS will provide the following interfaces for use by the platform- + * specific interval timer implementation: + * + * void nxsched_timer_expiration(void): Called by the platform-specific + * logic when the interval timer expires. + * + ****************************************************************************/ + +/**************************************************************************** + * N32H7 Timer Usage + * + * This implementation uses one timer: A free running timer to provide + * the current time and a capture/compare channel for timed-events. + * + * Basic timers (BTIM) are incompatible because they don't have + * capture/compare channels. Use ATIM or GTIMA instead. + * + * There are two interrupts generated from our timer: + * - overflow interrupt -> update 64-bit counter + * - compare interrupt -> interval expiration + * + * Some low-level register operations are done directly because the + * n32_tim.c API does not expose all needed controls. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "arm_internal.h" +#include "n32_tim.h" +#include "n32_dbgmcu.h" + +#ifdef CONFIG_SCHED_TICKLESS + +/* Timer is always 16-bit on N32H7 for tickless (we use ATIM/GTIMA) */ + +/* No 32-bit tickless support on N32H7 because BTIM lacks CC channel */ + +#define HAVE_16BIT_TICKLESS 1 + +#if CONFIG_N32H7_TICKLESS_CHANNEL == 1 +# define DIER_CAPT_IE N32_ATIM_DINTEN_CC1IEN +# define SR_CAPT_IF N32_ATIM_STS_CC1ITF +#elif CONFIG_N32H7_TICKLESS_CHANNEL == 2 +# define DIER_CAPT_IE N32_ATIM_DINTEN_CC2IEN +# define SR_CAPT_IF N32_ATIM_STS_CC2ITF +#elif CONFIG_N32H7_TICKLESS_CHANNEL == 3 +# define DIER_CAPT_IE N32_ATIM_DINTEN_CC3IEN +# define SR_CAPT_IF N32_ATIM_STS_CC3ITF +#elif CONFIG_N32H7_TICKLESS_CHANNEL == 4 +# define DIER_CAPT_IE N32_ATIM_DINTEN_CC4IEN +# define SR_CAPT_IF N32_ATIM_STS_CC4ITF +#else +# error "Invalid tickless channel" +#endif + +/* Note: N32H7 ATIM STS and DINTEN are 32-bit registers */ + +#define N32_STS_OFFSET N32_ATIM_STS_OFFSET +#define N32_DINTEN_OFFSET N32_ATIM_DINTEN_OFFSET + +/**************************************************************************** + * Private Types + ****************************************************************************/ + +struct n32_tickless_s +{ + uint8_t timer; /* Timer number (1-18) */ + uint8_t channel; /* Capture/compare channel (1-4) */ + uint32_t base; /* Timer base address */ + struct n32_tim_dev_s *tch; /* Timer device handle */ + uint32_t frequency; /* Timer clock frequency (AHB) */ + volatile uint32_t overflow; /* Number of overflows (16-bit counter) */ + volatile bool pending; /* True: interval timer is pending */ + uint32_t period; /* Interval compare value */ +#ifdef CONFIG_SCHED_TICKLESS_ALARM + uint64_t last_alrm; /* Last alarm time (alarm mode) */ +#endif +}; + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +static struct n32_tickless_s g_tickless; + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: n32_getreg16/n32_putreg16 (for 16-bit registers like CNT, PSC, ARR) + * Name: n32_getreg32/n32_putreg32/n32_modreg32 (for 32-bit registers) + ****************************************************************************/ + +static inline uint16_t n32_getreg16(uint32_t offset) +{ + return getreg16(g_tickless.base + offset); +} + +static inline void n32_putreg16(uint32_t offset, uint16_t value) +{ + putreg16(value, g_tickless.base + offset); +} + +static inline uint32_t n32_getreg32(uint32_t offset) +{ + return getreg32(g_tickless.base + offset); +} + +static inline void n32_putreg32(uint32_t offset, uint32_t value) +{ + putreg32(value, g_tickless.base + offset); +} + +static inline void n32_modreg32(uint32_t offset, uint32_t clearbits, + uint32_t setbits) +{ + modifyreg32(g_tickless.base + offset, clearbits, setbits); +} + +/**************************************************************************** + * Name: n32_tickless_enableint/n32_tickless_disableint/n32_tickless_ackint + ****************************************************************************/ + +static inline void n32_tickless_enableint(void) +{ + n32_modreg32(N32_DINTEN_OFFSET, 0, DIER_CAPT_IE); +} + +static inline void n32_tickless_disableint(void) +{ + n32_modreg32(N32_DINTEN_OFFSET, DIER_CAPT_IE, 0); +} + +static inline void n32_tickless_ackint(void) +{ + n32_putreg32(N32_STS_OFFSET, ~SR_CAPT_IF); +} + +static inline uint32_t n32_tickless_getint(void) +{ + return n32_getreg32(N32_STS_OFFSET); +} + +/**************************************************************************** + * Name: n32_tickless_setchannel + * + * Description: + * Configure the timer channel as output compare (frozen mode) for interval + * timing. This is similar to n32_tim_setchannel but hard-coded for the + * tickless timer. + * + ****************************************************************************/ + +static int n32_tickless_setchannel(uint8_t channel) +{ + uint32_t ccmr_orig; + uint32_t ccmr_val; + uint32_t ccmr_mask; + uint32_t ccmr_offset; + uint32_t ccer_val; + uint32_t ccer_shift; + uint32_t ccmr_mode_shift; + uint32_t ccen_bit; + + if (channel < 1 || channel > 4) + { + return -EINVAL; + } + + ccer_val = n32_getreg16(N32_ATIM_CCEN_OFFSET); + ccer_shift = (uint32_t)(channel - 1) * 4; + ccen_bit = N32_ATIM_CCEN_CC1EN << ccer_shift; + + /* Determine CCMOD register and shift */ + + if (channel <= 2) + { + ccmr_offset = N32_ATIM_CCMOD1_OFFSET; + ccmr_mode_shift = (channel == 1) ? 0 : (N32_ATIM_CCMOD1_OC2MD_SHIFT - + N32_ATIM_CCMOD1_OC1MD_SHIFT); + } + else + { + ccmr_offset = N32_ATIM_CCMOD2_OFFSET; + ccmr_mode_shift = (channel == 3) ? 0 : (N32_ATIM_CCMOD2_OC4MD_SHIFT - + N32_ATIM_CCMOD2_OC3MD_SHIFT); + } + + /* Clear channel enable bit */ + + ccer_val &= ~ccen_bit; + ccer_val &= ~(N32_ATIM_CCEN_CC1P << ccer_shift); + + /* Frozen mode, no preload */ + + ccmr_val = (N32_ATIM_CCMOD1_OCMODE_FRZN << ccmr_mode_shift); + ccmr_mask = 0xff << ccmr_mode_shift; + + /* Clear polarity (active high) and enable output */ + + ccer_val &= ~(N32_ATIM_CCEN_CC1P << ccer_shift); + ccer_val |= ccen_bit; + + /* Write CCMOD */ + + ccmr_orig = n32_getreg16(ccmr_offset); + ccmr_orig &= ~ccmr_mask; + ccmr_orig |= ccmr_val; + n32_putreg16(ccmr_offset, ccmr_orig); + + /* Write CCEN */ + + n32_putreg16(N32_ATIM_CCEN_OFFSET, ccer_val); + + return OK; +} + +/**************************************************************************** + * Name: n32_interval_handler + * + * Description: + * Called when the timer counter matches the compare register. + * + ****************************************************************************/ + +static void n32_interval_handler(void) +{ + tmrinfo("Expired...\n"); + + /* Disable the compare interrupt now. */ + + n32_tickless_disableint(); + n32_tickless_ackint(); + + g_tickless.pending = false; + + nxsched_process_timer(); +} + +/**************************************************************************** + * Name: n32_timing_handler + * + * Description: + * Timer overflow interrupt handler. Increment the overflow counter. + * + ****************************************************************************/ + +static void n32_timing_handler(void) +{ + g_tickless.overflow++; + n32_putreg32(N32_STS_OFFSET, ~N32_ATIM_STS_UDITF); +} + +/**************************************************************************** + * Name: n32_tickless_handler + * + * Description: + * Generic interrupt handler for this timer. Checks the source of the + * interrupt and fires the appropriate handler. + * + ****************************************************************************/ + +static int n32_tickless_handler(int irq, void *context, void *arg) +{ + uint32_t sr = n32_tickless_getint(); + + if (sr & N32_ATIM_STS_UDITF) + { + n32_timing_handler(); + } + + if (sr & SR_CAPT_IF) + { + n32_interval_handler(); + } + + return OK; +} + +/**************************************************************************** + * Name: n32_tickless_get_counter64 + * + * Description: + * Read the 64-bit counter value (overflow + current counter). + * + ****************************************************************************/ + +static uint64_t n32_tickless_get_counter64(void) +{ + irqstate_t flags; + uint32_t overflow; + uint32_t counter; + uint32_t verify; + int pending; + + flags = enter_critical_section(); + + overflow = g_tickless.overflow; + counter = n32_getreg16(N32_ATIM_CNT_OFFSET); + pending = (n32_tickless_getint() & N32_ATIM_STS_UDITF) ? 1 : 0; + verify = n32_getreg16(N32_ATIM_CNT_OFFSET); + + if (pending) + { + /* Acknowledge the overflow interrupt and increment */ + + n32_putreg32(N32_STS_OFFSET, N32_ATIM_STS_UDITF); + overflow++; + counter = verify; + g_tickless.overflow = overflow; + } + + leave_critical_section(flags); + + return ((uint64_t)overflow << 16) | (uint64_t)counter; +} + +/**************************************************************************** + * Name: n32_tickless_dbgmcu_freeze + * + * Description: + * Configure the timer to stop in debug mode. + * + ****************************************************************************/ + +static void n32_tickless_dbgmcu_freeze(uint32_t base) +{ + switch (base) + { +#ifdef CONFIG_N32H7_ATIM3 + case N32_ATIMER3_BASE: + modifyreg32(N32_DBG_M7APB5FZ, 0, DBG_M7APB5FZ_ATIM3_STOP); + break; +#endif +#ifdef CONFIG_N32H7_ATIM4 + case N32_ATIMER4_BASE: + modifyreg32(N32_DBG_M7APB5FZ, 0, DBG_M7APB5FZ_ATIM4_STOP); + break; +#endif + default: + tmrerr("ERROR: Unsupported tickless timer!\n"); + PANIC(); + } +} + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: up_timer_initialize + * + * Description: + * Initializes all platform-specific timer facilities. + * + ****************************************************************************/ + +void up_timer_initialize(void) +{ + int timer = CONFIG_N32H7_TICKLESS_TIMER; + int channel = CONFIG_N32H7_TICKLESS_CHANNEL; + + tmrinfo("timer=%d channel=%d\n", timer, channel); + + /* Set base address and frequency based on selected timer */ + + switch (timer) + { +#ifdef CONFIG_N32H7_ATIM3 + case 6: + g_tickless.base = N32_ATIMER3_BASE; + break; +#endif +#ifdef CONFIG_N32H7_ATIM4 + case 7: + g_tickless.base = N32_ATIMER4_BASE; + break; +#endif + default: + tmrerr("ERROR: Unsupported tickless timer %d\n", timer); + PANIC(); + } + + g_tickless.timer = timer; + g_tickless.channel = channel; + g_tickless.frequency = USEC_PER_SEC / (uint32_t)CONFIG_USEC_PER_TICK; + g_tickless.overflow = 0; + g_tickless.pending = false; + g_tickless.period = 0; + + tmrinfo("base=0x%08lx frequency=%lu Hz\n", + (unsigned long)g_tickless.base, g_tickless.frequency); + + /* Initialize the timer hardware */ + + g_tickless.tch = n32_tim_init(timer); + if (g_tickless.tch == NULL) + { + tmrerr("ERROR: Failed to initialize TIM%d\n", timer); + PANIC(); + } + + /* Set timer clock and period (max for 16-bit) */ + + N32_TIM_SETCLOCK(g_tickless.tch, g_tickless.frequency); + + /* Set up interrupt handler (both update and CC) */ + + N32_TIM_SETISR(g_tickless.tch, n32_tickless_handler, NULL, + N32_TIM_ISR_UPDATE); + N32_TIM_SETISR(g_tickless.tch, n32_tickless_handler, NULL, + N32_TIM_ISR_CC); + + /* Initialize interval to zero */ + + N32_TIM_SETCOMPARE(g_tickless.tch, channel, 0); + + /* Configure compare channel for interval timing */ + + n32_tickless_setchannel(channel); + + /* Set timer period */ + + N32_TIM_SETPERIOD(g_tickless.tch, UINT16_MAX); + + /* Initialize the counter */ + + N32_TIM_SETMODE(g_tickless.tch, N32_TIM_MODE_UP); + + /* Acknowledge any pending interrupts and enable update interrupt */ + + n32_putreg32(N32_STS_OFFSET, N32_ATIM_STS_UDITF | SR_CAPT_IF); + N32_TIM_ENABLEINT(g_tickless.tch, N32_ATIM_DINTEN_UIEN); + + /* Configure debug freeze (stop timer when core halted) */ + + n32_tickless_dbgmcu_freeze(g_tickless.base); + + tmrinfo("Tickless timer initialized\n"); + +#if defined(CONFIG_ARMV7M_SYSTICK) && defined(CONFIG_CPULOAD_PERIOD) + nxsched_period_extclk(systick_initialize(true, N32_M7CPU_FREQUENCY, -1)); +#endif +} + +/**************************************************************************** + * Name: up_timer_gettime + * + * Description: + * Return the elapsed time since power-up. + * + ****************************************************************************/ + +int up_timer_gettime(struct timespec *ts) +{ + uint64_t ticks; + uint64_t usec; + uint64_t sec; + + DEBUGASSERT(ts != NULL); + + if (g_tickless.tch == NULL) + { + ts->tv_sec = 0; + ts->tv_nsec = 0; + return OK; + } + + ticks = n32_tickless_get_counter64(); + + usec = (ticks * USEC_PER_SEC) / g_tickless.frequency; + + sec = usec / USEC_PER_SEC; + ts->tv_sec = (time_t)sec; + ts->tv_nsec = (long)((usec - (sec * USEC_PER_SEC)) * NSEC_PER_USEC); + + tmrinfo("ticks=%llu usec=%llu ts=(%lu, %lu)\n", + ticks, usec, (unsigned long)ts->tv_sec, + (unsigned long)ts->tv_nsec); + + return OK; +} + +#ifdef CONFIG_CLOCK_TIMEKEEPING + +/**************************************************************************** + * Name: up_timer_gettick + ****************************************************************************/ + +int up_timer_gettick(clock_t *ticks) +{ + if (ticks == NULL) + { + return -EINVAL; + } + + *ticks = (clock_t)n32_tickless_get_counter64(); + return OK; +} + +/**************************************************************************** + * Name: up_timer_getmask + ****************************************************************************/ + +void up_timer_getmask(clock_t *mask) +{ + DEBUGASSERT(mask != NULL); + *mask = 0xffff; /* 16-bit timer */ +} + +#endif /* CONFIG_CLOCK_TIMEKEEPING */ + +/**************************************************************************** + * Name: up_timer_cancel + * + * Description: + * Cancel the interval timer and return the time remaining. + * + ****************************************************************************/ + +#ifndef CONFIG_SCHED_TICKLESS_ALARM +int up_timer_cancel(struct timespec *ts) +{ + irqstate_t flags; + uint64_t usec; + uint32_t count; + uint32_t period; + + flags = enter_critical_section(); + + if (!g_tickless.pending) + { + if (ts != NULL) + { + ts->tv_sec = 0; + ts->tv_nsec = 0; + } + + leave_critical_section(flags); + return OK; + } + + tmrinfo("Cancelling...\n"); + + /* Disable the compare interrupt */ + + n32_tickless_disableint(); + + count = n32_getreg16(N32_ATIM_CNT_OFFSET); + period = g_tickless.period; + + g_tickless.pending = false; + + leave_critical_section(flags); + + if (ts != NULL) + { + /* Calculate remaining time */ + + if (count < period) + { + usec = ((uint64_t)(period - count) * USEC_PER_SEC) / + g_tickless.frequency; + } + else + { + usec = 0; + } + + ts->tv_sec = (time_t)(usec / USEC_PER_SEC); + ts->tv_nsec = (long)((usec - (uint64_t)(ts->tv_sec * USEC_PER_SEC)) * + NSEC_PER_USEC); + + tmrinfo("Remaining: %lu sec, %lu nsec\n", + (unsigned long)ts->tv_sec, (unsigned long)ts->tv_nsec); + } + + return OK; +} +#endif /* !CONFIG_SCHED_TICKLESS_ALARM */ + +/**************************************************************************** + * Name: up_timer_start + * + * Description: + * Start the interval timer. + * + ****************************************************************************/ + +#ifndef CONFIG_SCHED_TICKLESS_ALARM +int up_timer_start(const struct timespec *ts) +{ + uint64_t usec; + uint64_t period_ticks; + uint32_t count; + uint32_t compare; + irqstate_t flags; + + DEBUGASSERT(ts != NULL); + + tmrinfo("ts=(%lu, %lu)\n", + (unsigned long)ts->tv_sec, (unsigned long)ts->tv_nsec); + + flags = enter_critical_section(); + + if (g_tickless.pending) + { + up_timer_cancel(NULL); + } + + usec = (uint64_t)ts->tv_sec * USEC_PER_SEC + + (uint64_t)(ts->tv_nsec / NSEC_PER_USEC); + + period_ticks = (usec * g_tickless.frequency) / USEC_PER_SEC; + + if (period_ticks == 0) + { + period_ticks = 1; + } + + count = n32_getreg16(N32_ATIM_CNT_OFFSET); + compare = count + (uint32_t)period_ticks; + + if (compare > 0xffff) + { + /* Wrap around: set compare to count - (0xffff - period) */ + + compare = count - (0xffff - (uint32_t)period_ticks); + } + + g_tickless.period = compare; + n32_putreg16(N32_ATIM_CCDAT1_OFFSET + (g_tickless.channel - 1) * 4, + compare); + + n32_tickless_ackint(); + n32_tickless_enableint(); + + g_tickless.pending = true; + + leave_critical_section(flags); + + tmrinfo("Started: count=%lu compare=%lu\n", count, compare); + + return OK; +} +#endif /* !CONFIG_SCHED_TICKLESS_ALARM */ + +#ifdef CONFIG_SCHED_TICKLESS_ALARM + +/**************************************************************************** + * Name: up_alarm_start + * + * Description: + * Start the alarm timer (absolute time). + * + ****************************************************************************/ + +int up_alarm_start(const struct timespec *ts) +{ + uint64_t target_ticks; + uint64_t current_ticks; + uint32_t compare; + uint32_t current_low; + uint64_t diff; + irqstate_t flags; + + DEBUGASSERT(ts != NULL); + + target_ticks = ((uint64_t)ts->tv_sec * NSEC_PER_SEC + ts->tv_nsec) / + NSEC_PER_TICK; + + flags = enter_critical_section(); + + if (g_tickless.pending) + { + n32_tickless_disableint(); + g_tickless.pending = false; + } + + current_ticks = n32_tickless_get_counter64(); + current_low = n32_getreg16(N32_ATIM_CNT_OFFSET); + diff = target_ticks - current_ticks; + + if (diff <= 0xffff) + { + compare = current_low + (uint32_t)diff; + } + else + { + compare = 0xffff; + } + + if (compare > 0xffff) + { + compare -= 0x10000; + } + + g_tickless.period = compare; + n32_putreg16(N32_ATIM_CCDAT1_OFFSET + (g_tickless.channel - 1) * 4, + compare); + + n32_tickless_ackint(); + n32_tickless_enableint(); + + g_tickless.pending = true; + g_tickless.last_alrm = target_ticks; + + leave_critical_section(flags); + + tmrinfo("Alarm started: current=%llu target=%llu compare=%lu\n", + current_ticks, target_ticks, compare); + + return OK; +} + +/**************************************************************************** + * Name: up_alarm_cancel + ****************************************************************************/ + +int up_alarm_cancel(struct timespec *ts) +{ + irqstate_t flags; + uint64_t nsec; + + flags = enter_critical_section(); + + if (!g_tickless.pending) + { + if (ts != NULL) + { + ts->tv_sec = 0; + ts->tv_nsec = 0; + } + + leave_critical_section(flags); + return OK; + } + + n32_tickless_disableint(); + g_tickless.pending = false; + + uint64_t current_ticks = n32_tickless_get_counter64(); + + leave_critical_section(flags); + + if (ts != NULL) + { + if (g_tickless.last_alrm > current_ticks) + { + uint64_t diff = g_tickless.last_alrm - current_ticks; + + nsec = (diff * NSEC_PER_SEC) / g_tickless.frequency; + } + else + { + nsec = 0; + } + + ts->tv_sec = (time_t)(nsec / NSEC_PER_SEC); + ts->tv_nsec = (long)(nsec % NSEC_PER_SEC); + } + + return OK; +} + +#endif /* CONFIG_SCHED_TICKLESS_ALARM */ + +#endif /* CONFIG_SCHED_TICKLESS */ diff --git a/arch/arm/src/n32h7/n32_tim.c b/arch/arm/src/n32h7/n32_tim.c new file mode 100644 index 0000000000000..9132a5e33dae7 --- /dev/null +++ b/arch/arm/src/n32h7/n32_tim.c @@ -0,0 +1,2358 @@ +/**************************************************************************** + * arch/arm/src/n32h7/n32_tim.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include + +#include "chip.h" +#include "arm_internal.h" +#include "n32_rcc.h" +#include "n32_gpio.h" +#include "n32_tim.h" +#include "hardware/n32h7_rcc.h" +#include "hardware/n32h76x_pinmap.h" + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* Timer devices may be used for different purposes. Such special purposes + * include: + * + * - To generate modulated outputs for such things as motor control. If + * CONFIG_N32H7_TIMn_PWM is defined then the timer is intended to be used + * for pulsed output modulation. + * + * - To control periodic ADC input sampling. If CONFIG_N32H7_TIMn_ADC is + * defined then timer "n" is intended to be used for that purpose. + * + * - To control periodic DAC outputs. If CONFIG_N32H7_TIMn_DAC is defined + * then timer "n" is intended to be used for that purpose. + * + * - To use a Quadrature Encoder. If CONFIG_N32H7_TIMn_QE is defined then + * timer "n" is intended to be used for that purpose. + * + * In any of these cases, the timer will not be used by this timer module. + */ + +/* ATIM1 */ +#if defined(CONFIG_N32H7_ATIM1_PWM) || defined(CONFIG_N32H7_ATIM1_ADC) || \ + defined(CONFIG_N32H7_ATIM1_DAC) || defined(CONFIG_N32H7_ATIM1_QE) +# undef CONFIG_N32H7_ATIM1 +#endif + +/* ATIM2 */ +#if defined(CONFIG_N32H7_ATIM2_PWM) || defined(CONFIG_N32H7_ATIM2_ADC) || \ + defined(CONFIG_N32H7_ATIM2_DAC) || defined(CONFIG_N32H7_ATIM2_QE) +# undef CONFIG_N32H7_ATIM2 +#endif + +/* ATIM3 */ +#if defined(CONFIG_N32H7_ATIM3_PWM) || defined(CONFIG_N32H7_ATIM3_ADC) || \ + defined(CONFIG_N32H7_ATIM3_DAC) || defined(CONFIG_N32H7_ATIM3_QE) +# undef CONFIG_N32H7_ATIM3 +#endif + +/* ATIM4 */ +#if defined(CONFIG_N32H7_ATIM4_PWM) || defined(CONFIG_N32H7_ATIM4_ADC) || \ + defined(CONFIG_N32H7_ATIM4_DAC) || defined(CONFIG_N32H7_ATIM4_QE) +# undef CONFIG_N32H7_ATIM4 +#endif + +/* GTIMA1 */ +#if defined(CONFIG_N32H7_GTIMA1_PWM) || defined(CONFIG_N32H7_GTIMA1_ADC) || \ + defined(CONFIG_N32H7_GTIMA1_DAC) || defined(CONFIG_N32H7_GTIMA1_QE) +# undef CONFIG_N32H7_GTIMA1 +#endif + +/* GTIMA2 */ +#if defined(CONFIG_N32H7_GTIMA2_PWM) || defined(CONFIG_N32H7_GTIMA2_ADC) || \ + defined(CONFIG_N32H7_GTIMA2_DAC) || defined(CONFIG_N32H7_GTIMA2_QE) +# undef CONFIG_N32H7_GTIMA2 +#endif + +/* GTIMA3 */ +#if defined(CONFIG_N32H7_GTIMA3_PWM) || defined(CONFIG_N32H7_GTIMA3_ADC) || \ + defined(CONFIG_N32H7_GTIMA3_DAC) || defined(CONFIG_N32H7_GTIMA3_QE) +# undef CONFIG_N32H7_GTIMA3 +#endif + +/* GTIMA4 */ +#if defined(CONFIG_N32H7_GTIMA4_PWM) || defined(CONFIG_N32H7_GTIMA4_ADC) || \ + defined(CONFIG_N32H7_GTIMA4_DAC) || defined(CONFIG_N32H7_GTIMA4_QE) +# undef CONFIG_N32H7_GTIMA4 +#endif + +/* GTIMA5 */ +#if defined(CONFIG_N32H7_GTIMA5_PWM) || defined(CONFIG_N32H7_GTIMA5_ADC) || \ + defined(CONFIG_N32H7_GTIMA5_DAC) || defined(CONFIG_N32H7_GTIMA5_QE) +# undef CONFIG_N32H7_GTIMA5 +#endif + +/* GTIMA6 */ +#if defined(CONFIG_N32H7_GTIMA6_PWM) || defined(CONFIG_N32H7_GTIMA6_ADC) || \ + defined(CONFIG_N32H7_GTIMA6_DAC) || defined(CONFIG_N32H7_GTIMA6_QE) +# undef CONFIG_N32H7_GTIMA6 +#endif + +/* GTIMA7 */ +#if defined(CONFIG_N32H7_GTIMA7_PWM) || defined(CONFIG_N32H7_GTIMA7_ADC) || \ + defined(CONFIG_N32H7_GTIMA7_DAC) || defined(CONFIG_N32H7_GTIMA7_QE) +# undef CONFIG_N32H7_GTIMA7 +#endif + +/* GTIMB1 */ +#if defined(CONFIG_N32H7_GTIMB1_PWM) || defined(CONFIG_N32H7_GTIMB1_ADC) || \ + defined(CONFIG_N32H7_GTIMB1_DAC) || defined(CONFIG_N32H7_GTIMB1_QE) +# undef CONFIG_N32H7_GTIMB1 +#endif + +/* GTIMB2 */ +#if defined(CONFIG_N32H7_GTIMB2_PWM) || defined(CONFIG_N32H7_GTIMB2_ADC) || \ + defined(CONFIG_N32H7_GTIMB2_DAC) || defined(CONFIG_N32H7_GTIMB2_QE) +# undef CONFIG_N32H7_GTIMB2 +#endif + +/* GTIMB3 */ +#if defined(CONFIG_N32H7_GTIMB3_PWM) || defined(CONFIG_N32H7_GTIMB3_ADC) || \ + defined(CONFIG_N32H7_GTIMB3_DAC) || defined(CONFIG_N32H7_GTIMB3_QE) +# undef CONFIG_N32H7_GTIMB3 +#endif + +/* BTIM1 */ +#if defined(CONFIG_N32H7_BTIM1_PWM) || defined(CONFIG_N32H7_BTIM1_ADC) || \ + defined(CONFIG_N32H7_BTIM1_DAC) || defined(CONFIG_N32H7_BTIM1_QE) +# undef CONFIG_N32H7_BTIM1 +#endif + +/* BTIM2 */ +#if defined(CONFIG_N32H7_BTIM2_PWM) || defined(CONFIG_N32H7_BTIM2_ADC) || \ + defined(CONFIG_N32H7_BTIM2_DAC) || defined(CONFIG_N32H7_BTIM2_QE) +# undef CONFIG_N32H7_BTIM2 +#endif + +/* BTIM3 */ +#if defined(CONFIG_N32H7_BTIM3_PWM) || defined(CONFIG_N32H7_BTIM3_ADC) || \ + defined(CONFIG_N32H7_BTIM3_DAC) || defined(CONFIG_N32H7_BTIM3_QE) +# undef CONFIG_N32H7_BTIM3 +#endif + +/* BTIM4 */ +#if defined(CONFIG_N32H7_BTIM4_PWM) || defined(CONFIG_N32H7_BTIM4_ADC) || \ + defined(CONFIG_N32H7_BTIM4_DAC) || defined(CONFIG_N32H7_BTIM4_QE) +# undef CONFIG_N32H7_BTIM4 +#endif + +/* GPIO output pin configuration support */ + +#if defined(CONFIG_N32H7_ATIM1) +# if defined(GPIO_ATIM1_CH1OUT) || defined(GPIO_ATIM1_CH2OUT) || \ + defined(GPIO_ATIM1_CH3OUT) || defined(GPIO_ATIM1_CH4OUT) +# define HAVE_ATIM1_GPIOCONFIG 1 +# endif +#endif + +#if defined(CONFIG_N32H7_ATIM2) +# if defined(GPIO_ATIM2_CH1OUT) || defined(GPIO_ATIM2_CH2OUT) || \ + defined(GPIO_ATIM2_CH3OUT) || defined(GPIO_ATIM2_CH4OUT) +# define HAVE_ATIM2_GPIOCONFIG 1 +# endif +#endif + +#if defined(CONFIG_N32H7_ATIM3) +# if defined(GPIO_ATIM3_CH1OUT) || defined(GPIO_ATIM3_CH2OUT) || \ + defined(GPIO_ATIM3_CH3OUT) || defined(GPIO_ATIM3_CH4OUT) +# define HAVE_ATIM3_GPIOCONFIG 1 +# endif +#endif + +#if defined(CONFIG_N32H7_ATIM4) +# if defined(GPIO_ATIM4_CH1OUT) || defined(GPIO_ATIM4_CH2OUT) || \ + defined(GPIO_ATIM4_CH3OUT) || defined(GPIO_ATIM4_CH4OUT) +# define HAVE_ATIM4_GPIOCONFIG 1 +# endif +#endif + +#if defined(CONFIG_N32H7_GTIMA1) +# if defined(GPIO_GTIMA1_CH1OUT) || defined(GPIO_GTIMA1_CH2OUT) || \ + defined(GPIO_GTIMA1_CH3OUT) || defined(GPIO_GTIMA1_CH4OUT) +# define HAVE_GTIMA1_GPIOCONFIG 1 +# endif +#endif + +#if defined(CONFIG_N32H7_GTIMA2) +# if defined(GPIO_GTIMA2_CH1OUT) || defined(GPIO_GTIMA2_CH2OUT) || \ + defined(GPIO_GTIMA2_CH3OUT) || defined(GPIO_GTIMA2_CH4OUT) +# define HAVE_GTIMA2_GPIOCONFIG 1 +# endif +#endif + +#if defined(CONFIG_N32H7_GTIMA3) +# if defined(GPIO_GTIMA3_CH1OUT) || defined(GPIO_GTIMA3_CH2OUT) || \ + defined(GPIO_GTIMA3_CH3OUT) || defined(GPIO_GTIMA3_CH4OUT) +# define HAVE_GTIMA3_GPIOCONFIG 1 +# endif +#endif + +#if defined(CONFIG_N32H7_GTIMA4) +# if defined(GPIO_GTIMA4_CH1OUT) || defined(GPIO_GTIMA4_CH2OUT) || \ + defined(GPIO_GTIMA4_CH3OUT) || defined(GPIO_GTIMA4_CH4OUT) +# define HAVE_GTIMA4_GPIOCONFIG 1 +# endif +#endif + +#if defined(CONFIG_N32H7_GTIMA5) +# if defined(GPIO_GTIMA5_CH1OUT) || defined(GPIO_GTIMA5_CH2OUT) || \ + defined(GPIO_GTIMA5_CH3OUT) || defined(GPIO_GTIMA5_CH4OUT) +# define HAVE_GTIMA5_GPIOCONFIG 1 +# endif +#endif + +#if defined(CONFIG_N32H7_GTIMA6) +# if defined(GPIO_GTIMA6_CH1OUT) || defined(GPIO_GTIMA6_CH2OUT) || \ + defined(GPIO_GTIMA6_CH3OUT) || defined(GPIO_GTIMA6_CH4OUT) +# define HAVE_GTIMA6_GPIOCONFIG 1 +# endif +#endif + +#if defined(CONFIG_N32H7_GTIMA7) +# if defined(GPIO_GTIMA7_CH1OUT) || defined(GPIO_GTIMA7_CH2OUT) || \ + defined(GPIO_GTIMA7_CH3OUT) || defined(GPIO_GTIMA7_CH4OUT) +# define HAVE_GTIMA7_GPIOCONFIG 1 +# endif +#endif + +#if defined(CONFIG_N32H7_GTIMB1) +# if defined(GPIO_GTIMB1_CH1POUT) || defined(GPIO_GTIMB1_CH2OUT) || \ + defined(GPIO_GTIMB1_CH3OUT) || defined(GPIO_GTIMB1_CH4OUT) +# define HAVE_GTIMB1_GPIOCONFIG 1 +# endif +#endif + +#if defined(CONFIG_N32H7_GTIMB2) +# if defined(GPIO_GTIMB2_CH1POUT) || defined(GPIO_GTIMB2_CH2OUT) || \ + defined(GPIO_GTIMB2_CH3OUT) || defined(GPIO_GTIMB2_CH4OUT) +# define HAVE_GTIMB2_GPIOCONFIG 1 +# endif +#endif + +#if defined(CONFIG_N32H7_GTIMB3) +# if defined(GPIO_GTIMB3_CH1POUT) || defined(GPIO_GTIMB3_CH2OUT) || \ + defined(GPIO_GTIMB3_CH3OUT) || defined(GPIO_GTIMB3_CH4OUT) +# define HAVE_GTIMB3_GPIOCONFIG 1 +# endif +#endif + +/* This module compiles only if there are enabled timers not intended for + * some other purpose. + */ + +#if defined(CONFIG_N32H7_ATIM1) || defined(CONFIG_N32H7_ATIM2) || \ + defined(CONFIG_N32H7_ATIM3) || defined(CONFIG_N32H7_ATIM4) || \ + defined(CONFIG_N32H7_GTIMA1) || defined(CONFIG_N32H7_GTIMA2) || \ + defined(CONFIG_N32H7_GTIMA3) || defined(CONFIG_N32H7_GTIMA4) || \ + defined(CONFIG_N32H7_GTIMA5) || defined(CONFIG_N32H7_GTIMA6) || \ + defined(CONFIG_N32H7_GTIMA7) || defined(CONFIG_N32H7_GTIMB1) || \ + defined(CONFIG_N32H7_GTIMB2) || defined(CONFIG_N32H7_GTIMB3) || \ + defined(CONFIG_N32H7_BTIM1) || defined(CONFIG_N32H7_BTIM2) || \ + defined(CONFIG_N32H7_BTIM3) || defined(CONFIG_N32H7_BTIM4) + +/**************************************************************************** + * Private Types + ****************************************************************************/ + +/* Timer type enumeration */ + +enum n32_tim_type_e +{ + TIM_TYPE_ATIM, /* Advanced timer (ATIM1-4) */ + TIM_TYPE_GTIMA, /* General-purpose timer A (GTIMA1-7) */ + TIM_TYPE_GTIMB, /* General-purpose timer B (GTIMB1-3) */ + TIM_TYPE_BTIM /* Basic timer (BTIM1-4) */ +}; + +/* Timer device private structure */ + +struct n32_tim_priv_s +{ + const struct n32_tim_ops_s *ops; + enum n32_tim_type_e type; + uint32_t base; /* Timer base address */ + uint32_t freqin; /* Input clock frequency (for setclock) */ +}; + +/**************************************************************************** + * Private Function Prototypes + ****************************************************************************/ + +/* Timer helpers */ + +static void n32_tim_reload_counter(struct n32_tim_dev_s *dev); +static void n32_tim_enable(struct n32_tim_dev_s *dev); +static void n32_tim_disable(struct n32_tim_dev_s *dev); +static void n32_tim_reset(struct n32_tim_dev_s *dev); + +/* Timer methods */ + +static int n32_tim_setmode(struct n32_tim_dev_s *dev, + n32_tim_mode_t mode); +static int n32_tim_setclock(struct n32_tim_dev_s *dev, + uint32_t freq); +static void n32_tim_setperiod(struct n32_tim_dev_s *dev, + uint32_t period); +static uint32_t n32_tim_getperiod(struct n32_tim_dev_s *dev); +static uint32_t n32_tim_getcounter(struct n32_tim_dev_s *dev); +static void n32_tim_setcounter(struct n32_tim_dev_s *dev, + uint32_t count); +static int n32_tim_getwidth(struct n32_tim_dev_s *dev); +static int n32_tim_setchannel(struct n32_tim_dev_s *dev, + uint8_t channel, + n32_tim_channel_t mode); +static int n32_tim_setcompare(struct n32_tim_dev_s *dev, + uint8_t channel, uint32_t compare); +static int n32_tim_getcapture(struct n32_tim_dev_s *dev, + uint8_t channel); +static int n32_tim_setisr(struct n32_tim_dev_s *dev, + xcpt_t handler, void *arg, int source); +static void n32_tim_enableint(struct n32_tim_dev_s *dev, int source); +static void n32_tim_disableint(struct n32_tim_dev_s *dev, int source); +static void n32_tim_ackint(struct n32_tim_dev_s *dev, int source); +static int n32_tim_checkint(struct n32_tim_dev_s *dev, int source); + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +static const struct n32_tim_ops_s n32_tim_ops = +{ + .enable = &n32_tim_enable, + .disable = &n32_tim_disable, + .setmode = &n32_tim_setmode, + .setclock = &n32_tim_setclock, + .setperiod = &n32_tim_setperiod, + .getperiod = &n32_tim_getperiod, + .getcounter = &n32_tim_getcounter, + .setcounter = &n32_tim_setcounter, + .getwidth = &n32_tim_getwidth, + .setchannel = &n32_tim_setchannel, + .setcompare = &n32_tim_setcompare, + .getcapture = &n32_tim_getcapture, + .setisr = &n32_tim_setisr, + .enableint = &n32_tim_enableint, + .disableint = &n32_tim_disableint, + .ackint = &n32_tim_ackint, + .checkint = &n32_tim_checkint, +}; + +/* Timer private structures - ATIM1-4 */ + +#ifdef CONFIG_N32H7_ATIM1 +static struct n32_tim_priv_s n32_tim1_priv = +{ + .ops = &n32_tim_ops, + .type = TIM_TYPE_ATIM, + .base = N32_ATIMER1_BASE, + .freqin = N32_AHB_FREQUENCY, /* 300 MHz */ +}; +#endif + +#ifdef CONFIG_N32H7_ATIM2 +static struct n32_tim_priv_s n32_tim2_priv = +{ + .ops = &n32_tim_ops, + .type = TIM_TYPE_ATIM, + .base = N32_ATIMER2_BASE, + .freqin = N32_AHB_FREQUENCY, +}; +#endif + +#ifdef CONFIG_N32H7_ATIM3 +static struct n32_tim_priv_s n32_tim3_priv = +{ + .ops = &n32_tim_ops, + .type = TIM_TYPE_ATIM, + .base = N32_ATIMER3_BASE, + .freqin = N32_AHB_FREQUENCY, +}; +#endif + +#ifdef CONFIG_N32H7_ATIM4 +static struct n32_tim_priv_s n32_tim4_priv = +{ + .ops = &n32_tim_ops, + .type = TIM_TYPE_ATIM, + .base = N32_ATIMER4_BASE, + .freqin = N32_AHB_FREQUENCY, +}; +#endif + +/* Timer private structures - GTIMA1-7 */ + +#ifdef CONFIG_N32H7_GTIMA1 +static struct n32_tim_priv_s n32_gtima1_priv = +{ + .ops = &n32_tim_ops, + .type = TIM_TYPE_GTIMA, + .base = N32_GTIMERA1_BASE, + .freqin = N32_AHB_FREQUENCY, +}; +#endif + +#ifdef CONFIG_N32H7_GTIMA2 +static struct n32_tim_priv_s n32_gtima2_priv = +{ + .ops = &n32_tim_ops, + .type = TIM_TYPE_GTIMA, + .base = N32_GTIMERA2_BASE, + .freqin = N32_AHB_FREQUENCY, +}; +#endif + +#ifdef CONFIG_N32H7_GTIMA3 +static struct n32_tim_priv_s n32_gtima3_priv = +{ + .ops = &n32_tim_ops, + .type = TIM_TYPE_GTIMA, + .base = N32_GTIMERA3_BASE, + .freqin = N32_AHB_FREQUENCY, +}; +#endif + +#ifdef CONFIG_N32H7_GTIMA4 +static struct n32_tim_priv_s n32_gtima4_priv = +{ + .ops = &n32_tim_ops, + .type = TIM_TYPE_GTIMA, + .base = N32_GTIMERA4_BASE, + .freqin = N32_AHB_FREQUENCY, +}; +#endif + +#ifdef CONFIG_N32H7_GTIMA5 +static struct n32_tim_priv_s n32_gtima5_priv = +{ + .ops = &n32_tim_ops, + .type = TIM_TYPE_GTIMA, + .base = N32_GTIMERA5_BASE, + .freqin = N32_AHB_FREQUENCY, +}; +#endif + +#ifdef CONFIG_N32H7_GTIMA6 +static struct n32_tim_priv_s n32_gtima6_priv = +{ + .ops = &n32_tim_ops, + .type = TIM_TYPE_GTIMA, + .base = N32_GTIMERA6_BASE, + .freqin = N32_AHB_FREQUENCY, +}; +#endif + +#ifdef CONFIG_N32H7_GTIMA7 +static struct n32_tim_priv_s n32_gtima7_priv = +{ + .ops = &n32_tim_ops, + .type = TIM_TYPE_GTIMA, + .base = N32_GTIMERA7_BASE, + .freqin = N32_AHB_FREQUENCY, +}; +#endif + +/* Timer private structures - GTIMB1-3 */ + +#ifdef CONFIG_N32H7_GTIMB1 +static struct n32_tim_priv_s n32_gtimb1_priv = +{ + .ops = &n32_tim_ops, + .type = TIM_TYPE_GTIMB, + .base = N32_GTIMERB1_BASE, + .freqin = N32_AHB_FREQUENCY, +}; +#endif + +#ifdef CONFIG_N32H7_GTIMB2 +static struct n32_tim_priv_s n32_gtimb2_priv = +{ + .ops = &n32_tim_ops, + .type = TIM_TYPE_GTIMB, + .base = N32_GTIMERB2_BASE, + .freqin = N32_AHB_FREQUENCY, +}; +#endif + +#ifdef CONFIG_N32H7_GTIMB3 +static struct n32_tim_priv_s n32_gtimb3_priv = +{ + .ops = &n32_tim_ops, + .type = TIM_TYPE_GTIMB, + .base = N32_GTIMERB3_BASE, + .freqin = N32_AHB_FREQUENCY, +}; +#endif + +/* Timer private structures - BTIM1-4 */ + +#ifdef CONFIG_N32H7_BTIM1 +static struct n32_tim_priv_s n32_btim1_priv = +{ + .ops = &n32_tim_ops, + .type = TIM_TYPE_BTIM, + .base = N32_BTIMER1_BASE, + .freqin = N32_AHB_FREQUENCY, +}; +#endif + +#ifdef CONFIG_N32H7_BTIM2 +static struct n32_tim_priv_s n32_btim2_priv = +{ + .ops = &n32_tim_ops, + .type = TIM_TYPE_BTIM, + .base = N32_BTIMER2_BASE, + .freqin = N32_AHB_FREQUENCY, +}; +#endif + +#ifdef CONFIG_N32H7_BTIM3 +static struct n32_tim_priv_s n32_btim3_priv = +{ + .ops = &n32_tim_ops, + .type = TIM_TYPE_BTIM, + .base = N32_BTIMER3_BASE, + .freqin = N32_AHB_FREQUENCY, +}; +#endif + +#ifdef CONFIG_N32H7_BTIM4 +static struct n32_tim_priv_s n32_btim4_priv = +{ + .ops = &n32_tim_ops, + .type = TIM_TYPE_BTIM, + .base = N32_BTIMER4_BASE, + .freqin = N32_AHB_FREQUENCY, +}; +#endif + +/* Unified register offsets (same for all timer types) */ + +#define N32_TIM_CTRL1_OFFSET 0x0000 /* Control register 1 */ +#define N32_TIM_CTRL2_OFFSET 0x0004 /* Control register 2 */ +#define N32_TIM_STS_OFFSET 0x0008 /* Status register */ +#define N32_TIM_ETGEN_OFFSET 0x000c /* Event generation register */ +#define N32_TIM_SMCTRL_OFFSET 0x0010 /* Slave mode control (not for BTIM) */ +#define N32_TIM_DINTEN_OFFSET 0x0014 /* DMA/Interrupt enable register */ +#define N32_TIM_CCMOD1_OFFSET 0x0018 /* Capture/compare mode 1 (not for BTIM) */ +#define N32_TIM_CCMOD2_OFFSET 0x001c /* Capture/compare mode 2 (not for BTIM) */ +#define N32_TIM_CCMOD3_OFFSET 0x0020 /* Capture/compare mode 3 (ATIM/GTIMB only) */ +#define N32_TIM_CCEN_OFFSET 0x0024 /* Capture/compare enable (not for BTIM) */ +#define N32_TIM_CCDAT1_OFFSET 0x0028 /* Capture/compare reg 1 (not for BTIM) */ +#define N32_TIM_CCDAT2_OFFSET 0x002c /* Capture/compare reg 2 (not for BTIM) */ +#define N32_TIM_CCDAT3_OFFSET 0x0030 /* Capture/compare reg 3 (not for BTIM) */ +#define N32_TIM_CCDAT4_OFFSET 0x0034 /* Capture/compare reg 4 (not for BTIM) */ +#define N32_TIM_PSC_OFFSET 0x0040 /* Prescaler */ +#define N32_TIM_AR_OFFSET 0x0044 /* Auto-reload register */ +#define N32_TIM_CNT_OFFSET 0x0048 /* Counter */ +#define N32_TIM_BKDT_OFFSET 0x0050 /* Break/dead-time (ATIM/GTIMB only) */ + +/* Helper macros for register access */ + +#define n32_getreg16(dev, off) getreg16(((struct n32_tim_priv_s *)dev)->base + (off)) +#define n32_putreg16(dev, off, v) putreg16((v), ((struct n32_tim_priv_s *)dev)->base + (off)) +#define n32_modreg16(dev, off, c, s) modifyreg16(((struct n32_tim_priv_s *)dev)->base + (off), (c), (s)) + +#define n32_getreg32(dev, off) getreg32(((struct n32_tim_priv_s *)dev)->base + (off)) +#define n32_putreg32(dev, off, v) putreg32((v), ((struct n32_tim_priv_s *)dev)->base + (off)) +#define n32_modreg32(dev, off, c, s) modifyreg32(((struct n32_tim_priv_s *)dev)->base + (off), (c), (s)) + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: n32_tim_is_btim + * + * Description: + * Check if the timer is a basic timer (BTIM). + * + ****************************************************************************/ + +static inline bool n32_tim_is_btim(struct n32_tim_dev_s *dev) +{ + return ((struct n32_tim_priv_s *)dev)->type == TIM_TYPE_BTIM; +} + +/**************************************************************************** + * Name: n32_tim_is_atim + * + * Description: + * Check if the timer is an advanced timer (ATIM). + * + ****************************************************************************/ + +static inline bool n32_tim_is_atim(struct n32_tim_dev_s *dev) +{ + return ((struct n32_tim_priv_s *)dev)->type == TIM_TYPE_ATIM; +} + +/**************************************************************************** + * Name: n32_tim_is_gtimb + * + * Description: + * Check if the timer is a GTIMB timer. + * + ****************************************************************************/ + +static inline bool n32_tim_is_gtimb(struct n32_tim_dev_s *dev) +{ + return ((struct n32_tim_priv_s *)dev)->type == TIM_TYPE_GTIMB; +} + +/**************************************************************************** + * Name: n32_tim_get_width + * + * Description: + * Determine the counter width (16 or 32 bits) for the timer. + * + ****************************************************************************/ + +static inline int n32_tim_get_width(struct n32_tim_dev_s *dev) +{ + /* Only BTIM timers are 32-bit */ + + if (n32_tim_is_btim(dev)) + { + return 32; + } + + return 16; +} + +/**************************************************************************** + * Name: n32_tim_reload_counter + * + * Description: + * Generate an update event to reload the counter. + * + ****************************************************************************/ + +static void n32_tim_reload_counter(struct n32_tim_dev_s *dev) +{ + n32_putreg16(dev, N32_TIM_ETGEN_OFFSET, N32_ATIM_ETGEN_UDGN); +} + +/**************************************************************************** + * Name: n32_tim_enable + * + * Description: + * Enable the timer counter. + * + ****************************************************************************/ + +static void n32_tim_enable(struct n32_tim_dev_s *dev) +{ + uint32_t regval; + + regval = n32_getreg32(dev, N32_TIM_CTRL1_OFFSET); + regval |= N32_ATIM_CTRL1_CNTEN; + + /* For ATIM, also set MOE (Main Output Enable) */ + + if (n32_tim_is_atim(dev)) + { + n32_modreg32(dev, N32_TIM_BKDT_OFFSET, 0, N32_ATIM_BKDT_MOEN); + } + + n32_tim_reload_counter(dev); + n32_putreg32(dev, N32_TIM_CTRL1_OFFSET, regval); +} + +/**************************************************************************** + * Name: n32_tim_disable + * + * Description: + * Disable the timer counter. + * + ****************************************************************************/ + +static void n32_tim_disable(struct n32_tim_dev_s *dev) +{ + uint32_t regval; + + regval = n32_getreg32(dev, N32_TIM_CTRL1_OFFSET); + regval &= ~N32_ATIM_CTRL1_CNTEN; + n32_putreg32(dev, N32_TIM_CTRL1_OFFSET, regval); + + /* For ATIM, clear MOE as well */ + + if (n32_tim_is_atim(dev)) + { + n32_modreg32(dev, N32_TIM_BKDT_OFFSET, N32_ATIM_BKDT_MOEN, 0); + } +} + +/**************************************************************************** + * Name: n32_tim_reset + * + * Description: + * Reset the timer to its default state (all relevant registers cleared). + * + ****************************************************************************/ + +static void n32_tim_reset(struct n32_tim_dev_s *dev) +{ + bool is_btim = n32_tim_is_btim(dev); + bool is_atim = n32_tim_is_atim(dev); + + /* Disable counter */ + + n32_tim_disable(dev); + + /* Reset CTRL1: clear all bits except ARPE */ + + n32_putreg32(dev, N32_TIM_CTRL1_OFFSET, N32_ATIM_CTRL1_ARPEN); + + /* Reset CTRL2 */ + + n32_putreg32(dev, N32_TIM_CTRL2_OFFSET, 0); + + /* Clear status register */ + + n32_putreg32(dev, N32_TIM_STS_OFFSET, 0); + + /* Clear event generation register */ + + n32_putreg32(dev, N32_TIM_ETGEN_OFFSET, 0); + + /* Reset DIER (all interrupts/DMA disabled) */ + + n32_putreg32(dev, N32_TIM_DINTEN_OFFSET, 0); + + if (!is_btim) + { + /* Reset CCMOD1 and CCMOD2 */ + + n32_putreg32(dev, N32_TIM_CCMOD1_OFFSET, 0); + n32_putreg32(dev, N32_TIM_CCMOD2_OFFSET, 0); + + /* Reset CCEN */ + + n32_putreg32(dev, N32_TIM_CCEN_OFFSET, 0); + + /* Reset CCR1-4 */ + + n32_putreg32(dev, N32_TIM_CCDAT1_OFFSET, 0); + n32_putreg32(dev, N32_TIM_CCDAT2_OFFSET, 0); + n32_putreg32(dev, N32_TIM_CCDAT3_OFFSET, 0); + n32_putreg32(dev, N32_TIM_CCDAT4_OFFSET, 0); + + /* Reset SMCTRL */ + + n32_putreg32(dev, N32_TIM_SMCTRL_OFFSET, 0); + + /* CCMOD3 exists for ATIM and GTIMB */ + + if (is_atim || n32_tim_is_gtimb(dev)) + { + n32_putreg32(dev, N32_TIM_CCMOD3_OFFSET, 0); + } + + /* BKDT exists for ATIM and GTIMB */ + + if (is_atim || n32_tim_is_gtimb(dev)) + { + n32_putreg32(dev, N32_TIM_BKDT_OFFSET, 0); + } + } + + /* Reset prescaler */ + + n32_putreg32(dev, N32_TIM_PSC_OFFSET, 0); + + /* Reset ARR to max value (16-bit or 32-bit) */ + + if (is_btim) + { + n32_putreg32(dev, N32_TIM_AR_OFFSET, 0xffffffff); + } + else + { + n32_putreg32(dev, N32_TIM_AR_OFFSET, 0xffff); + } + + /* Reset counter */ + + n32_putreg32(dev, N32_TIM_CNT_OFFSET, 0); + + /* For BTIM, PSC and ARR are 32-bit registers */ + + if (is_btim) + { + /* BTIM PSC is 16-bit, ARR is 32-bit, CNT is 32-bit */ + } +} + +/**************************************************************************** + * Name: n32_tim_setmode + * + * Description: + * Set the timer counting mode. + * + ****************************************************************************/ + +static int n32_tim_setmode(struct n32_tim_dev_s *dev, n32_tim_mode_t mode) +{ + uint32_t val = N32_ATIM_CTRL1_CNTEN | N32_ATIM_CTRL1_ARPEN; + + DEBUGASSERT(dev != NULL); + + /* BTIM does not support mode setting */ + + if (n32_tim_is_btim(dev) && (mode & ~N32_TIM_MODE_UP)) + { + return -EINVAL; + } + + switch (mode & N32_TIM_MODE_MASK) + { + case N32_TIM_MODE_DISABLED: + val &= ~N32_ATIM_CTRL1_CNTEN; + break; + + case N32_TIM_MODE_DOWN: + val |= N32_ATIM_CTRL1_DIR; + + /* Fall through */ + + case N32_TIM_MODE_UP: + break; + + case N32_TIM_MODE_UPDOWN: + val |= N32_ATIM_CTRL1_CENTER1; + break; + + case N32_TIM_MODE_PULSE: + val |= N32_ATIM_CTRL1_ONEPM; + break; + + default: + return -EINVAL; + } + + n32_tim_reload_counter(dev); + n32_tim_ackint(dev, N32_ATIM_STS_UDITF); + n32_putreg32(dev, N32_TIM_CTRL1_OFFSET, val); + + /* For ATIM, ensure MOE is set when counter is enabled */ + + if (n32_tim_is_atim(dev)) + { + n32_modreg32(dev, N32_TIM_BKDT_OFFSET, 0, N32_ATIM_BKDT_MOEN); + } + + return OK; +} + +/**************************************************************************** + * Name: n32_tim_setclock + * + * Description: + * Set the timer clock frequency by configuring the prescaler. + * + * Timer core clock is AHB frequency (300 MHz) for all timers. + * + ****************************************************************************/ + +static int n32_tim_setclock(struct n32_tim_dev_s *dev, uint32_t freq) +{ + struct n32_tim_priv_s *priv = (struct n32_tim_priv_s *)dev; + uint32_t freqin; + uint32_t prescaler; + uint32_t psc_mask; + + DEBUGASSERT(dev != NULL); + + /* If frequency is 0, disable the timer */ + + if (freq == 0) + { + n32_tim_disable(dev); + return 0; + } + + /* All timers use AHB clock as their core clock */ + + freqin = priv->freqin; + + /* Calculate prescaler value */ + + prescaler = freqin / freq; + + /* Decrement by 1 (pre-scaler value is PSC+1) */ + + if (prescaler > 0) + { + prescaler--; + } + + /* Check for overflow (16-bit prescaler for all timer types) */ + + psc_mask = 0xffff; + if (prescaler > psc_mask) + { + prescaler = psc_mask; + } + + n32_putreg32(dev, N32_TIM_PSC_OFFSET, prescaler); + + return prescaler; +} + +/**************************************************************************** + * Name: n32_tim_setperiod + * + * Description: + * Set the auto-reload value (period). + * + ****************************************************************************/ + +static void n32_tim_setperiod(struct n32_tim_dev_s *dev, uint32_t period) +{ + bool is_btim = n32_tim_is_btim(dev); + uint32_t max_period; + + DEBUGASSERT(dev != NULL); + + max_period = is_btim ? 0xffffffff : 0xffff; + + if (period > max_period) + { + period = max_period; + } + + n32_putreg32(dev, N32_TIM_AR_OFFSET, period); +} + +/**************************************************************************** + * Name: n32_tim_getperiod + * + * Description: + * Get the current period value. + * + ****************************************************************************/ + +static uint32_t n32_tim_getperiod(struct n32_tim_dev_s *dev) +{ + DEBUGASSERT(dev != NULL); + + return n32_getreg32(dev, N32_TIM_AR_OFFSET); +} + +/**************************************************************************** + * Name: n32_tim_getcounter + * + * Description: + * Read the current counter value. + * + ****************************************************************************/ + +static uint32_t n32_tim_getcounter(struct n32_tim_dev_s *dev) +{ + DEBUGASSERT(dev != NULL); + + if (n32_tim_is_btim(dev)) + { + return n32_getreg32(dev, N32_TIM_CNT_OFFSET); + } + else + { + return n32_getreg16(dev, N32_TIM_CNT_OFFSET); + } +} + +/**************************************************************************** + * Name: n32_tim_setcounter + * + * Description: + * Set the counter value. + * + ****************************************************************************/ + +static void n32_tim_setcounter(struct n32_tim_dev_s *dev, uint32_t count) +{ + DEBUGASSERT(dev != NULL); + + if (n32_tim_is_btim(dev)) + { + n32_putreg32(dev, N32_TIM_CNT_OFFSET, count); + } + else + { + n32_putreg16(dev, N32_TIM_CNT_OFFSET, (uint16_t)count); + } +} + +/**************************************************************************** + * Name: n32_tim_getwidth + * + * Description: + * Get the counter width in bits. + * + ****************************************************************************/ + +static int n32_tim_getwidth(struct n32_tim_dev_s *dev) +{ + return n32_tim_get_width(dev); +} + +/**************************************************************************** + * Name: n32_tim_gpioconfig + * + * Description: + * Configure or unconfigure a GPIO pin for timer output. + * + ****************************************************************************/ + +#if defined(HAVE_ATIM1_GPIOCONFIG) || defined(HAVE_ATIM2_GPIOCONFIG) || \ + defined(HAVE_ATIM3_GPIOCONFIG) || defined(HAVE_ATIM4_GPIOCONFIG) || \ + defined(HAVE_GTIMA1_GPIOCONFIG) || defined(HAVE_GTIMA2_GPIOCONFIG) || \ + defined(HAVE_GTIMA3_GPIOCONFIG) || defined(HAVE_GTIMA4_GPIOCONFIG) || \ + defined(HAVE_GTIMA5_GPIOCONFIG) || defined(HAVE_GTIMA6_GPIOCONFIG) || \ + defined(HAVE_GTIMA7_GPIOCONFIG) || defined(HAVE_GTIMB1_GPIOCONFIG) || \ + defined(HAVE_GTIMB2_GPIOCONFIG) || defined(HAVE_GTIMB3_GPIOCONFIG) + +static void n32_tim_gpioconfig(uint32_t cfg, n32_tim_channel_t mode) +{ + if (mode & N32_TIM_CH_MODE_MASK) + { + n32_configgpio(cfg); + } + else + { + n32_unconfiggpio(cfg); + } +} +#endif + +/**************************************************************************** + * Name: n32_tim_setchannel + * + * Description: + * Configure a timer channel for output or input. + * + ****************************************************************************/ + +static int n32_tim_setchannel(struct n32_tim_dev_s *dev, + uint8_t channel, n32_tim_channel_t mode) +{ + struct n32_tim_priv_s *priv = (struct n32_tim_priv_s *)dev; + uint32_t ccmr_orig; + uint32_t ccmr_val; + uint32_t ccmr_mask; + uint32_t ccmr_offset; + uint32_t ccer_val; + uint32_t ccer_shift; + uint32_t ccmr_mode_shift; + uint32_t oc_pe_bit; + uint32_t ccen_bit; + + DEBUGASSERT(dev != NULL); + + /* BTIM does not support channels */ + + if (n32_tim_is_btim(dev)) + { + return -EINVAL; + } + + /* Channel numbering: 1..4 (or more for ATIM/GTIMB) */ + + if (channel < 1 || channel > 4) + { + /* For now, only support channels 1-4 */ + + return -EINVAL; + } + + ccer_val = n32_getreg32(dev, N32_TIM_CCEN_OFFSET); + ccer_shift = (uint32_t)(channel - 1) * 4; + ccen_bit = N32_ATIM_CCEN_CC1EN << ccer_shift; + + /* Determine CCMOD register and shift */ + + if (channel <= 2) + { + ccmr_offset = N32_TIM_CCMOD1_OFFSET; + ccmr_mode_shift = (channel == 1) ? 0 : (N32_ATIM_CCMOD1_OC2MD_SHIFT - + N32_ATIM_CCMOD1_OC1MD_SHIFT); + oc_pe_bit = (channel == 1) ? N32_ATIM_CCMOD1_OC1PEN : + N32_ATIM_CCMOD1_OC2PEN; + } + else + { + ccmr_offset = N32_TIM_CCMOD2_OFFSET; + ccmr_mode_shift = (channel == 3) ? 0 : (N32_ATIM_CCMOD2_OC4MD_SHIFT - + N32_ATIM_CCMOD2_OC3MD_SHIFT); + oc_pe_bit = (channel == 3) ? N32_ATIM_CCMOD2_OC3PEN : + N32_ATIM_CCMOD2_OC4PEN; + } + + /* Clear channel enable bit */ + + ccer_val &= ~ccen_bit; + ccer_val &= ~(N32_ATIM_CCEN_CC1P << ccer_shift); + + /* Default: channel disabled */ + + ccmr_val = 0; + ccmr_mask = 0xff << ccmr_mode_shift; + + /* Decode channel mode */ + + switch (mode & N32_TIM_CH_MODE_MASK) + { + case N32_TIM_CH_DISABLED: + break; + + case N32_TIM_CH_OUTTOGGLE: + ccmr_val = (N32_ATIM_CCMOD1_OCMODE_TOGGLE << ccmr_mode_shift) | + oc_pe_bit; + ccer_val |= ccen_bit; + break; + + case N32_TIM_CH_OUTPWM: + ccmr_val = (N32_ATIM_CCMOD1_OCMODE_PWM1 << ccmr_mode_shift) | + oc_pe_bit; + ccer_val |= ccen_bit; + break; + + default: + return -EINVAL; + } + + /* Set polarity (negative if requested) */ + + if (mode & N32_TIM_CH_POLARITY_NEG) + { + ccer_val |= (N32_ATIM_CCEN_CC1P << ccer_shift); + } + + /* Write CCMOD */ + + ccmr_orig = n32_getreg32(dev, ccmr_offset); + ccmr_orig &= ~ccmr_mask; + ccmr_orig |= ccmr_val; + n32_putreg32(dev, ccmr_offset, ccmr_orig); + + /* Write CCEN */ + + n32_putreg32(dev, N32_TIM_CCEN_OFFSET, ccer_val); + + /* Configure GPIO */ + + switch (priv->base) + { +#ifdef CONFIG_N32H7_ATIM1 + case N32_ATIMER1_BASE: + switch (channel) + { +# if defined(GPIO_ATIM1_CH1OUT) + case 1: + n32_tim_gpioconfig(GPIO_ATIM1_CH1OUT, mode); + break; +# endif +# if defined(GPIO_ATIM1_CH2OUT) + case 2: + n32_tim_gpioconfig(GPIO_ATIM1_CH2OUT, mode); + break; +# endif +# if defined(GPIO_ATIM1_CH3OUT) + case 3: + n32_tim_gpioconfig(GPIO_ATIM1_CH3OUT, mode); + break; +# endif +# if defined(GPIO_ATIM1_CH4OUT) + case 4: + n32_tim_gpioconfig(GPIO_ATIM1_CH4OUT, mode); + break; +# endif + default: + return -EINVAL; + } + break; +#endif + +#ifdef CONFIG_N32H7_ATIM2 + case N32_ATIMER2_BASE: + switch (channel) + { +# if defined(GPIO_ATIM2_CH1OUT) + case 1: + n32_tim_gpioconfig(GPIO_ATIM2_CH1OUT, mode); + break; +# endif +# if defined(GPIO_ATIM2_CH2OUT) + case 2: + n32_tim_gpioconfig(GPIO_ATIM2_CH2OUT, mode); + break; +# endif +# if defined(GPIO_ATIM2_CH3OUT) + case 3: + n32_tim_gpioconfig(GPIO_ATIM2_CH3OUT, mode); + break; +# endif +# if defined(GPIO_ATIM2_CH4OUT) + case 4: + n32_tim_gpioconfig(GPIO_ATIM2_CH4OUT, mode); + break; +# endif + default: + return -EINVAL; + } + break; +#endif + +#ifdef CONFIG_N32H7_ATIM3 + case N32_ATIMER3_BASE: + switch (channel) + { +# if defined(GPIO_ATIM3_CH1OUT) + case 1: + n32_tim_gpioconfig(GPIO_ATIM3_CH1OUT, mode); + break; +# endif +# if defined(GPIO_ATIM3_CH2OUT) + case 2: + n32_tim_gpioconfig(GPIO_ATIM3_CH2OUT, mode); + break; +# endif +# if defined(GPIO_ATIM3_CH3OUT) + case 3: + n32_tim_gpioconfig(GPIO_ATIM3_CH3OUT, mode); + break; +# endif +# if defined(GPIO_ATIM3_CH4OUT) + case 4: + n32_tim_gpioconfig(GPIO_ATIM3_CH4OUT, mode); + break; +# endif + default: + return -EINVAL; + } + break; +#endif + +#ifdef CONFIG_N32H7_ATIM4 + case N32_ATIMER4_BASE: + switch (channel) + { +# if defined(GPIO_ATIM4_CH1OUT) + case 1: + n32_tim_gpioconfig(GPIO_ATIM4_CH1OUT, mode); + break; +# endif +# if defined(GPIO_ATIM4_CH2OUT) + case 2: + n32_tim_gpioconfig(GPIO_ATIM4_CH2OUT, mode); + break; +# endif +# if defined(GPIO_ATIM4_CH3OUT) + case 3: + n32_tim_gpioconfig(GPIO_ATIM4_CH3OUT, mode); + break; +# endif +# if defined(GPIO_ATIM4_CH4OUT) + case 4: + n32_tim_gpioconfig(GPIO_ATIM4_CH4OUT, mode); + break; +# endif + default: + return -EINVAL; + } + break; +#endif + +#ifdef CONFIG_N32H7_GTIMA1 + case N32_GTIMERA1_BASE: + switch (channel) + { +# if defined(GPIO_GTIMA1_CH1OUT) + case 1: + n32_tim_gpioconfig(GPIO_GTIMA1_CH1OUT, mode); + break; +# endif +# if defined(GPIO_GTIMA1_CH2OUT) + case 2: + n32_tim_gpioconfig(GPIO_GTIMA1_CH2OUT, mode); + break; +# endif +# if defined(GPIO_GTIMA1_CH3OUT) + case 3: + n32_tim_gpioconfig(GPIO_GTIMA1_CH3OUT, mode); + break; +# endif +# if defined(GPIO_GTIMA1_CH4OUT) + case 4: + n32_tim_gpioconfig(GPIO_GTIMA1_CH4OUT, mode); + break; +# endif + default: + return -EINVAL; + } + break; +#endif + +#ifdef CONFIG_N32H7_GTIMA2 + case N32_GTIMERA2_BASE: + switch (channel) + { +# if defined(GPIO_GTIMA2_CH1OUT) + case 1: + n32_tim_gpioconfig(GPIO_GTIMA2_CH1OUT, mode); + break; +# endif +# if defined(GPIO_GTIMA2_CH2OUT) + case 2: + n32_tim_gpioconfig(GPIO_GTIMA2_CH2OUT, mode); + break; +# endif +# if defined(GPIO_GTIMA2_CH3OUT) + case 3: + n32_tim_gpioconfig(GPIO_GTIMA2_CH3OUT, mode); + break; +# endif +# if defined(GPIO_GTIMA2_CH4OUT) + case 4: + n32_tim_gpioconfig(GPIO_GTIMA2_CH4OUT, mode); + break; +# endif + default: + return -EINVAL; + } + break; +#endif + +#ifdef CONFIG_N32H7_GTIMA3 + case N32_GTIMERA3_BASE: + switch (channel) + { +# if defined(GPIO_GTIMA3_CH1OUT) + case 1: + n32_tim_gpioconfig(GPIO_GTIMA3_CH1OUT, mode); + break; +# endif +# if defined(GPIO_GTIMA3_CH2OUT) + case 2: + n32_tim_gpioconfig(GPIO_GTIMA3_CH2OUT, mode); + break; +# endif +# if defined(GPIO_GTIMA3_CH3OUT) + case 3: + n32_tim_gpioconfig(GPIO_GTIMA3_CH3OUT, mode); + break; +# endif +# if defined(GPIO_GTIMA3_CH4OUT) + case 4: + n32_tim_gpioconfig(GPIO_GTIMA3_CH4OUT, mode); + break; +# endif + default: + return -EINVAL; + } + break; +#endif + +#ifdef CONFIG_N32H7_GTIMA4 + case N32_GTIMERA4_BASE: + switch (channel) + { +# if defined(GPIO_GTIMA4_CH1OUT) + case 1: + n32_tim_gpioconfig(GPIO_GTIMA4_CH1OUT, mode); + break; +# endif +# if defined(GPIO_GTIMA4_CH2OUT) + case 2: + n32_tim_gpioconfig(GPIO_GTIMA4_CH2OUT, mode); + break; +# endif +# if defined(GPIO_GTIMA4_CH3OUT) + case 3: + n32_tim_gpioconfig(GPIO_GTIMA4_CH3OUT, mode); + break; +# endif +# if defined(GPIO_GTIMA4_CH4OUT) + case 4: + n32_tim_gpioconfig(GPIO_GTIMA4_CH4OUT, mode); + break; +# endif + default: + return -EINVAL; + } + break; +#endif + +#ifdef CONFIG_N32H7_GTIMA5 + case N32_GTIMERA5_BASE: + switch (channel) + { +# if defined(GPIO_GTIMA5_CH1OUT) + case 1: + n32_tim_gpioconfig(GPIO_GTIMA5_CH1OUT, mode); + break; +# endif +# if defined(GPIO_GTIMA5_CH2OUT) + case 2: + n32_tim_gpioconfig(GPIO_GTIMA5_CH2OUT, mode); + break; +# endif +# if defined(GPIO_GTIMA5_CH3OUT) + case 3: + n32_tim_gpioconfig(GPIO_GTIMA5_CH3OUT, mode); + break; +# endif +# if defined(GPIO_GTIMA5_CH4OUT) + case 4: + n32_tim_gpioconfig(GPIO_GTIMA5_CH4OUT, mode); + break; +# endif + default: + return -EINVAL; + } + break; +#endif + +#ifdef CONFIG_N32H7_GTIMA6 + case N32_GTIMERA6_BASE: + switch (channel) + { +# if defined(GPIO_GTIMA6_CH1OUT) + case 1: + n32_tim_gpioconfig(GPIO_GTIMA6_CH1OUT, mode); + break; +# endif +# if defined(GPIO_GTIMA6_CH2OUT) + case 2: + n32_tim_gpioconfig(GPIO_GTIMA6_CH2OUT, mode); + break; +# endif +# if defined(GPIO_GTIMA6_CH3OUT) + case 3: + n32_tim_gpioconfig(GPIO_GTIMA6_CH3OUT, mode); + break; +# endif +# if defined(GPIO_GTIMA6_CH4OUT) + case 4: + n32_tim_gpioconfig(GPIO_GTIMA6_CH4OUT, mode); + break; +# endif + default: + return -EINVAL; + } + break; +#endif + +#ifdef CONFIG_N32H7_GTIMA7 + case N32_GTIMERA7_BASE: + switch (channel) + { +# if defined(GPIO_GTIMA7_CH1OUT) + case 1: + n32_tim_gpioconfig(GPIO_GTIMA7_CH1OUT, mode); + break; +# endif +# if defined(GPIO_GTIMA7_CH2OUT) + case 2: + n32_tim_gpioconfig(GPIO_GTIMA7_CH2OUT, mode); + break; +# endif +# if defined(GPIO_GTIMA7_CH3OUT) + case 3: + n32_tim_gpioconfig(GPIO_GTIMA7_CH3OUT, mode); + break; +# endif +# if defined(GPIO_GTIMA7_CH4OUT) + case 4: + n32_tim_gpioconfig(GPIO_GTIMA7_CH4OUT, mode); + break; +# endif + default: + return -EINVAL; + } + break; +#endif + +#ifdef CONFIG_N32H7_GTIMB1 + case N32_GTIMERB1_BASE: + switch (channel) + { +# if defined(GPIO_GTIMB1_CH1POUT) + case 1: + n32_tim_gpioconfig(GPIO_GTIMB1_CH1POUT, mode); + break; +# endif +# if defined(GPIO_GTIMB1_CH2OUT) + case 2: + n32_tim_gpioconfig(GPIO_GTIMB1_CH2OUT, mode); + break; +# endif +# if defined(GPIO_GTIMB1_CH3OUT) + case 3: + n32_tim_gpioconfig(GPIO_GTIMB1_CH3OUT, mode); + break; +# endif +# if defined(GPIO_GTIMB1_CH4OUT) + case 4: + n32_tim_gpioconfig(GPIO_GTIMB1_CH4OUT, mode); + break; +# endif + default: + return -EINVAL; + } + break; +#endif + +#ifdef CONFIG_N32H7_GTIMB2 + case N32_GTIMERB2_BASE: + switch (channel) + { +# if defined(GPIO_GTIMB2_CH1POUT) + case 1: + n32_tim_gpioconfig(GPIO_GTIMB2_CH1POUT, mode); + break; +# endif +# if defined(GPIO_GTIMB2_CH2OUT) + case 2: + n32_tim_gpioconfig(GPIO_GTIMB2_CH2OUT, mode); + break; +# endif +# if defined(GPIO_GTIMB2_CH3OUT) + case 3: + n32_tim_gpioconfig(GPIO_GTIMB2_CH3OUT, mode); + break; +# endif +# if defined(GPIO_GTIMB2_CH4OUT) + case 4: + n32_tim_gpioconfig(GPIO_GTIMB2_CH4OUT, mode); + break; +# endif + default: + return -EINVAL; + } + break; +#endif + +#ifdef CONFIG_N32H7_GTIMB3 + case N32_GTIMERB3_BASE: + switch (channel) + { +# if defined(GPIO_GTIMB3_CH1POUT) + case 1: + n32_tim_gpioconfig(GPIO_GTIMB3_CH1POUT, mode); + break; +# endif +# if defined(GPIO_GTIMB3_CH2OUT) + case 2: + n32_tim_gpioconfig(GPIO_GTIMB3_CH2OUT, mode); + break; +# endif +# if defined(GPIO_GTIMB3_CH3OUT) + case 3: + n32_tim_gpioconfig(GPIO_GTIMB3_CH3OUT, mode); + break; +# endif +# if defined(GPIO_GTIMB3_CH4OUT) + case 4: + n32_tim_gpioconfig(GPIO_GTIMB3_CH4OUT, mode); + break; +# endif + default: + return -EINVAL; + } + break; +#endif + + default: + return -EINVAL; + } + + return OK; +} + +/**************************************************************************** + * Name: n32_tim_setcompare + * + * Description: + * Set the compare value for a channel. + * + ****************************************************************************/ + +static int n32_tim_setcompare(struct n32_tim_dev_s *dev, + uint8_t channel, uint32_t compare) +{ + uint32_t max_val; + + DEBUGASSERT(dev != NULL); + + /* BTIM does not support channels */ + + if (n32_tim_is_btim(dev)) + { + return -EINVAL; + } + + max_val = n32_tim_get_width(dev) > 16 ? 0xffffffff : 0xffff; + if (compare > max_val) + { + compare = max_val; + } + + switch (channel) + { + case 1: + n32_putreg32(dev, N32_TIM_CCDAT1_OFFSET, compare); + break; + case 2: + n32_putreg32(dev, N32_TIM_CCDAT2_OFFSET, compare); + break; + case 3: + n32_putreg32(dev, N32_TIM_CCDAT3_OFFSET, compare); + break; + case 4: + n32_putreg32(dev, N32_TIM_CCDAT4_OFFSET, compare); + break; + default: + return -EINVAL; + } + + return OK; +} + +/**************************************************************************** + * Name: n32_tim_getcapture + * + * Description: + * Get the captured value for a channel (input capture mode). + * + ****************************************************************************/ + +static int n32_tim_getcapture(struct n32_tim_dev_s *dev, uint8_t channel) +{ + DEBUGASSERT(dev != NULL); + + /* BTIM does not support capture */ + + if (n32_tim_is_btim(dev)) + { + return -EINVAL; + } + + switch (channel) + { + case 1: + return n32_getreg32(dev, N32_TIM_CCDAT1_OFFSET); + case 2: + return n32_getreg32(dev, N32_TIM_CCDAT2_OFFSET); + case 3: + return n32_getreg32(dev, N32_TIM_CCDAT3_OFFSET); + case 4: + return n32_getreg32(dev, N32_TIM_CCDAT4_OFFSET); + default: + return -EINVAL; + } +} + +/**************************************************************************** + * Name: n32_tim_setisr + * + * Description: + * Attach an interrupt handler to the timer based on the source. + * + * Supported sources (see N32_TIM_ISR_* definitions): + * N32_TIM_ISR_UPDATE - Update event (overflow/underflow) + * N32_TIM_ISR_CC - Capture/Compare event (CC1-CC4) + * N32_TIM_ISR_TRG_COM - Trigger or COM event + * N32_TIM_ISR_BRK - Break event (advanced timers only) + * + * Input Parameters: + * dev - Timer device handle + * handler - Interrupt handler (NULL to detach) + * arg - Argument passed to handler + * source - Bitmask of desired interrupt sources + * (only one bit should be set) + * + * Returned Value: + * OK on success; negated errno on failure. + * + ****************************************************************************/ + +static int n32_tim_setisr(struct n32_tim_dev_s *dev, + xcpt_t handler, void *arg, int source) +{ + struct n32_tim_priv_s *priv = (struct n32_tim_priv_s *)dev; + int irqno = -1; + bool valid_source = false; + + DEBUGASSERT(dev != NULL); + + /* Determine which IRQ number corresponds to the requested source + * based on the timer type and hardware capabilities. + */ + + switch (priv->base) + { +#ifdef CONFIG_N32H7_ATIM1 + case N32_ATIMER1_BASE: + if (source & N32_TIM_ISR_UPDATE) + { + irqno = N32_IRQ_ATIM1_UP; + valid_source = true; + } + else if (source & N32_TIM_ISR_CC) + { + irqno = N32_IRQ_ATIM1_CC; + valid_source = true; + } + else if (source & N32_TIM_ISR_TRG_COM) + { + irqno = N32_IRQ_ATIM1_TRG_COM; + valid_source = true; + } + else if (source & N32_TIM_ISR_BRK) + { + irqno = N32_IRQ_ATIM1_BRK; + valid_source = true; + } + break; +#endif + +#ifdef CONFIG_N32H7_ATIM2 + case N32_ATIMER2_BASE: + if (source & N32_TIM_ISR_UPDATE) + { + irqno = N32_IRQ_ATIM2_UP; + valid_source = true; + } + else if (source & N32_TIM_ISR_CC) + { + irqno = N32_IRQ_ATIM2_CC; + valid_source = true; + } + else if (source & N32_TIM_ISR_TRG_COM) + { + irqno = N32_IRQ_ATIM2_TRG_COM; + valid_source = true; + } + else if (source & N32_TIM_ISR_BRK) + { + irqno = N32_IRQ_ATIM2_BRK; + valid_source = true; + } + break; +#endif + +#ifdef CONFIG_N32H7_ATIM3 + case N32_ATIMER3_BASE: + if (source & N32_TIM_ISR_UPDATE) + { + irqno = N32_IRQ_ATIM3_UP; + valid_source = true; + } + else if (source & N32_TIM_ISR_CC) + { + irqno = N32_IRQ_ATIM3_CC; + valid_source = true; + } + else if (source & N32_TIM_ISR_TRG_COM) + { + irqno = N32_IRQ_ATIM3_TRG_COM; + valid_source = true; + } + else if (source & N32_TIM_ISR_BRK) + { + irqno = N32_IRQ_ATIM3_BRK; + valid_source = true; + } + break; +#endif + +#ifdef CONFIG_N32H7_ATIM4 + case N32_ATIMER4_BASE: + if (source & N32_TIM_ISR_UPDATE) + { + irqno = N32_IRQ_ATIM4_UP; + valid_source = true; + } + else if (source & N32_TIM_ISR_CC) + { + irqno = N32_IRQ_ATIM4_CC; + valid_source = true; + } + else if (source & N32_TIM_ISR_TRG_COM) + { + irqno = N32_IRQ_ATIM4_TRG_COM; + valid_source = true; + } + else if (source & N32_TIM_ISR_BRK) + { + irqno = N32_IRQ_ATIM4_BRK; + valid_source = true; + } + break; +#endif + +#ifdef CONFIG_N32H7_GTIMA1 + case N32_GTIMERA1_BASE: + + /* GTIMA timers have only one combined interrupt vector */ + + if (source & (N32_TIM_ISR_UPDATE | N32_TIM_ISR_CC | + N32_TIM_ISR_TRG_COM | N32_TIM_ISR_BRK)) + { + irqno = N32_IRQ_GTIMA1; + valid_source = true; + } + break; +#endif + +#ifdef CONFIG_N32H7_GTIMA2 + case N32_GTIMERA2_BASE: + if (source & (N32_TIM_ISR_UPDATE | N32_TIM_ISR_CC | + N32_TIM_ISR_TRG_COM | N32_TIM_ISR_BRK)) + { + irqno = N32_IRQ_GTIMA2; + valid_source = true; + } + break; +#endif + +#ifdef CONFIG_N32H7_GTIMA3 + case N32_GTIMERA3_BASE: + if (source & (N32_TIM_ISR_UPDATE | N32_TIM_ISR_CC | + N32_TIM_ISR_TRG_COM | N32_TIM_ISR_BRK)) + { + irqno = N32_IRQ_GIIMA3; /* Note: typo in original */ + valid_source = true; + } + break; +#endif + +#ifdef CONFIG_N32H7_GTIMA4 + case N32_GTIMERA4_BASE: + if (source & (N32_TIM_ISR_UPDATE | N32_TIM_ISR_CC | + N32_TIM_ISR_TRG_COM | N32_TIM_ISR_BRK)) + { + irqno = N32_IRQ_GTIMA4; + valid_source = true; + } + break; +#endif + +#ifdef CONFIG_N32H7_GTIMA5 + case N32_GTIMERA5_BASE: + if (source & (N32_TIM_ISR_UPDATE | N32_TIM_ISR_CC | + N32_TIM_ISR_TRG_COM | N32_TIM_ISR_BRK)) + { + irqno = N32_IRQ_GTIMA5; + valid_source = true; + } + break; +#endif + +#ifdef CONFIG_N32H7_GTIMA6 + case N32_GTIMERA6_BASE: + if (source & (N32_TIM_ISR_UPDATE | N32_TIM_ISR_CC | + N32_TIM_ISR_TRG_COM | N32_TIM_ISR_BRK)) + { + irqno = N32_IRQ_GTIMA6; + valid_source = true; + } + break; +#endif + +#ifdef CONFIG_N32H7_GTIMA7 + case N32_GTIMERA7_BASE: + if (source & (N32_TIM_ISR_UPDATE | N32_TIM_ISR_CC | + N32_TIM_ISR_TRG_COM | N32_TIM_ISR_BRK)) + { + irqno = N32_IRQ_GTIMA7; + valid_source = true; + } + break; +#endif + +#ifdef CONFIG_N32H7_GTIMB1 + case N32_GTIMERB1_BASE: + if (source & (N32_TIM_ISR_UPDATE | N32_TIM_ISR_CC | + N32_TIM_ISR_TRG_COM | N32_TIM_ISR_BRK)) + { + irqno = N32_IRQ_GTIMB1; + valid_source = true; + } + break; +#endif + +#ifdef CONFIG_N32H7_GTIMB2 + case N32_GTIMERB2_BASE: + if (source & (N32_TIM_ISR_UPDATE | N32_TIM_ISR_CC | + N32_TIM_ISR_TRG_COM | N32_TIM_ISR_BRK)) + { + irqno = N32_IRQ_GTIMB2; + valid_source = true; + } + break; +#endif + +#ifdef CONFIG_N32H7_GTIMB3 + case N32_GTIMERB3_BASE: + if (source & (N32_TIM_ISR_UPDATE | N32_TIM_ISR_CC | + N32_TIM_ISR_TRG_COM | N32_TIM_ISR_BRK)) + { + irqno = N32_IRQ_GTIMB3; + valid_source = true; + } + break; +#endif + +#ifdef CONFIG_N32H7_BTIM1 + case N32_BTIMER1_BASE: + + /* BTIM timers only support update interrupt */ + + if (source & N32_TIM_ISR_UPDATE) + { + irqno = N32_IRQ_BTIM1; + valid_source = true; + } + break; +#endif + +#ifdef CONFIG_N32H7_BTIM2 + case N32_BTIMER2_BASE: + if (source & N32_TIM_ISR_UPDATE) + { + irqno = N32_IRQ_BTIM2; + valid_source = true; + } + break; +#endif + +#ifdef CONFIG_N32H7_BTIM3 + case N32_BTIMER3_BASE: + if (source & N32_TIM_ISR_UPDATE) + { + irqno = N32_IRQ_BTIM3; + valid_source = true; + } + break; +#endif + +#ifdef CONFIG_N32H7_BTIM4 + case N32_BTIMER4_BASE: + if (source & N32_TIM_ISR_UPDATE) + { + irqno = N32_IRQ_BTIM4; + valid_source = true; + } + break; +#endif + + default: + break; + } + + if (!valid_source || irqno < 0) + { + return -EINVAL; + } + + /* If handler is NULL, detach and disable IRQ */ + + if (handler == NULL) + { + up_disable_irq(irqno); + irq_detach(irqno); + return OK; + } + + /* Attach handler and enable IRQ */ + + irq_attach(irqno, handler, arg); + up_enable_irq(irqno); + +#ifdef CONFIG_ARCH_IRQPRIO + up_prioritize_irq(irqno, NVIC_SYSH_HIGH_PRIORITY); +#endif + + return OK; +} + +/**************************************************************************** + * Name: n32_tim_enableint + * + * Description: + * Enable the specified interrupt source. + * + ****************************************************************************/ + +static void n32_tim_enableint(struct n32_tim_dev_s *dev, int source) +{ + DEBUGASSERT(dev != NULL); + n32_modreg32(dev, N32_TIM_DINTEN_OFFSET, 0, source); +} + +/**************************************************************************** + * Name: n32_tim_disableint + * + * Description: + * Disable the specified interrupt source. + * + ****************************************************************************/ + +static void n32_tim_disableint(struct n32_tim_dev_s *dev, int source) +{ + DEBUGASSERT(dev != NULL); + n32_modreg32(dev, N32_TIM_DINTEN_OFFSET, source, 0); +} + +/**************************************************************************** + * Name: n32_tim_checkint + * + * Description: + * Check if the specified interrupt source is pending. + * + ****************************************************************************/ + +static int n32_tim_checkint(struct n32_tim_dev_s *dev, int source) +{ + uint32_t regval; + + DEBUGASSERT(dev != NULL); + regval = n32_getreg32(dev, N32_TIM_STS_OFFSET); + return (regval & source) ? 1 : 0; +} + +/**************************************************************************** + * Name: n32_tim_ackint + * + * Description: + * Acknowledge the specified interrupt source. + * + ****************************************************************************/ + +static void n32_tim_ackint(struct n32_tim_dev_s *dev, int source) +{ + DEBUGASSERT(dev != NULL); + n32_putreg32(dev, N32_TIM_STS_OFFSET, ~source); +} + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: n32_tim_init + * + * Description: + * Initialize a timer device. + * + * Input Parameters: + * timer - Timer number (1-4 for ATIM, 1-7 for GTIMA, etc.) + * Determined by CONFIG_N32H7_TIMx definitions. + * + * Returned Value: + * Pointer to timer device structure, or NULL on failure. + * + ****************************************************************************/ + +struct n32_tim_dev_s *n32_tim_init(int timer) +{ + struct n32_tim_dev_s *dev = NULL; + + /* Select the timer private structure and enable its clock */ + + switch (timer) + { +#ifdef CONFIG_N32H7_ATIM1 + case 1: + dev = (struct n32_tim_dev_s *)&n32_tim1_priv; + modifyreg32(N32_RCC_APB2EN1, 0, RCC_APB2EN1_M7ATIM1EN); + break; +#endif +#ifdef CONFIG_N32H7_ATIM2 + case 2: + dev = (struct n32_tim_dev_s *)&n32_tim2_priv; + modifyreg32(N32_RCC_APB2EN1, 0, RCC_APB2EN1_M7ATIM2EN); + break; +#endif +#ifdef CONFIG_N32H7_GTIMA1 + case 3: + dev = (struct n32_tim_dev_s *)&n32_gtima1_priv; + modifyreg32(N32_RCC_APB2EN1, 0, RCC_APB2EN1_M7GTIMA1EN); + break; +#endif +#ifdef CONFIG_N32H7_GTIMA2 + case 4: + dev = (struct n32_tim_dev_s *)&n32_gtima2_priv; + modifyreg32(N32_RCC_APB2EN1, 0, RCC_APB2EN1_M7GTIMA2EN); + break; +#endif +#ifdef CONFIG_N32H7_GTIMA3 + case 5: + dev = (struct n32_tim_dev_s *)&n32_gtima3_priv; + modifyreg32(N32_RCC_APB2EN1, 0, RCC_APB2EN1_M7GTIMA3EN); + break; +#endif +#ifdef CONFIG_N32H7_ATIM3 + case 6: + dev = (struct n32_tim_dev_s *)&n32_tim3_priv; + modifyreg32(N32_RCC_APB5EN1, 0, RCC_APB5EN1_M7ATIM3EN); + break; +#endif +#ifdef CONFIG_N32H7_ATIM4 + case 7: + dev = (struct n32_tim_dev_s *)&n32_tim4_priv; + modifyreg32(N32_RCC_APB5EN1, 0, RCC_APB5EN1_M7ATIM4EN); + break; +#endif +#ifdef CONFIG_N32H7_GTIMA4 + case 8: + dev = (struct n32_tim_dev_s *)&n32_gtima4_priv; + modifyreg32(N32_RCC_APB1EN1, 0, RCC_APB1EN1_M7GTIMA4EN); + break; +#endif +#ifdef CONFIG_N32H7_GTIMA5 + case 9: + dev = (struct n32_tim_dev_s *)&n32_gtima5_priv; + modifyreg32(N32_RCC_APB1EN2, 0, RCC_APB1EN2_M7GTIMA5EN); + break; +#endif +#ifdef CONFIG_N32H7_GTIMA6 + case 10: + dev = (struct n32_tim_dev_s *)&n32_gtima6_priv; + modifyreg32(N32_RCC_APB1EN2, 0, RCC_APB1EN2_M7GTIMA6EN); + break; +#endif +#ifdef CONFIG_N32H7_GTIMA7 + case 11: + dev = (struct n32_tim_dev_s *)&n32_gtima7_priv; + modifyreg32(N32_RCC_APB1EN2, 0, RCC_APB1EN2_M7GTIMA7EN); + break; +#endif +#ifdef CONFIG_N32H7_GTIMB1 + case 12: + dev = (struct n32_tim_dev_s *)&n32_gtimb1_priv; + modifyreg32(N32_RCC_APB1EN1, 0, RCC_APB1EN1_M7GTIMB1EN); + break; +#endif +#ifdef CONFIG_N32H7_GTIMB2 + case 13: + dev = (struct n32_tim_dev_s *)&n32_gtimb2_priv; + modifyreg32(N32_RCC_APB1EN1, 0, RCC_APB1EN1_M7GTIMB2EN); + break; +#endif +#ifdef CONFIG_N32H7_GTIMB3 + case 14: + dev = (struct n32_tim_dev_s *)&n32_gtimb3_priv; + modifyreg32(N32_RCC_APB1EN1, 0, RCC_APB1EN1_M7GTIMB3EN); + break; +#endif +#ifdef CONFIG_N32H7_BTIM1 + case 15: + dev = (struct n32_tim_dev_s *)&n32_btim1_priv; + modifyreg32(N32_RCC_APB1EN1, 0, RCC_APB1EN1_M7BTIM1EN); + break; +#endif +#ifdef CONFIG_N32H7_BTIM2 + case 16: + dev = (struct n32_tim_dev_s *)&n32_btim2_priv; + modifyreg32(N32_RCC_APB1EN1, 0, RCC_APB1EN1_M7BTIM2EN); + break; +#endif +#ifdef CONFIG_N32H7_BTIM3 + case 17: + dev = (struct n32_tim_dev_s *)&n32_btim3_priv; + modifyreg32(N32_RCC_APB1EN1, 0, RCC_APB1EN1_M7BTIM3EN); + break; +#endif +#ifdef CONFIG_N32H7_BTIM4 + case 18: + dev = (struct n32_tim_dev_s *)&n32_btim4_priv; + modifyreg32(N32_RCC_APB1EN1, 0, RCC_APB1EN1_M7BTIM4EN); + break; +#endif + default: + return NULL; + } + + /* Reset the timer to a known state */ + + n32_tim_reset(dev); + + return dev; +} + +/**************************************************************************** + * Name: n32_tim_deinit + * + * Description: + * De-initialize a timer device. + * + * Input Parameters: + * dev - Timer device structure. + * + * Returned Value: + * OK on success, negated errno on failure. + * + ****************************************************************************/ + +int n32_tim_deinit(struct n32_tim_dev_s *dev) +{ + struct n32_tim_priv_s *priv = (struct n32_tim_priv_s *)dev; + uint32_t base; + + DEBUGASSERT(dev != NULL); + + base = priv->base; + + /* Disable the timer */ + + n32_tim_disable(dev); + + /* Reset to default state */ + + n32_tim_reset(dev); + + /* Disable the clock */ + + switch (base) + { +#ifdef CONFIG_N32H7_ATIM1 + case N32_ATIMER1_BASE: + modifyreg32(N32_RCC_APB2EN1, RCC_APB2EN1_M7ATIM1EN, 0); + break; +#endif +#ifdef CONFIG_N32H7_ATIM2 + case N32_ATIMER2_BASE: + modifyreg32(N32_RCC_APB2EN1, RCC_APB2EN1_M7ATIM2EN, 0); + break; +#endif +#ifdef CONFIG_N32H7_ATIM3 + case N32_ATIMER3_BASE: + modifyreg32(N32_RCC_APB5EN1, RCC_APB5EN1_M7ATIM3EN, 0); + break; +#endif +#ifdef CONFIG_N32H7_ATIM4 + case N32_ATIMER4_BASE: + modifyreg32(N32_RCC_APB5EN1, RCC_APB5EN1_M7ATIM4EN, 0); + break; +#endif +#ifdef CONFIG_N32H7_GTIMA1 + case N32_GTIMERA1_BASE: + modifyreg32(N32_RCC_APB2EN1, RCC_APB2EN1_M7GTIMA1EN, 0); + break; +#endif +#ifdef CONFIG_N32H7_GTIMA2 + case N32_GTIMERA2_BASE: + modifyreg32(N32_RCC_APB2EN1, RCC_APB2EN1_M7GTIMA2EN, 0); + break; +#endif +#ifdef CONFIG_N32H7_GTIMA3 + case N32_GTIMERA3_BASE: + modifyreg32(N32_RCC_APB2EN1, RCC_APB2EN1_M7GTIMA3EN, 0); + break; +#endif +#ifdef CONFIG_N32H7_GTIMA4 + case N32_GTIMERA4_BASE: + modifyreg32(N32_RCC_APB1EN1, RCC_APB1EN1_M7GTIMA4EN, 0); + break; +#endif +#ifdef CONFIG_N32H7_GTIMA5 + case N32_GTIMERA5_BASE: + modifyreg32(N32_RCC_APB1EN2, RCC_APB1EN2_M7GTIMA5EN, 0); + break; +#endif +#ifdef CONFIG_N32H7_GTIMA6 + case N32_GTIMERA6_BASE: + modifyreg32(N32_RCC_APB1EN2, RCC_APB1EN2_M7GTIMA6EN, 0); + break; +#endif +#ifdef CONFIG_N32H7_GTIMA7 + case N32_GTIMERA7_BASE: + modifyreg32(N32_RCC_APB1EN2, RCC_APB1EN2_M7GTIMA7EN, 0); + break; +#endif +#ifdef CONFIG_N32H7_GTIMB1 + case N32_GTIMERB1_BASE: + modifyreg32(N32_RCC_APB1EN1, RCC_APB1EN1_M7GTIMB1EN, 0); + break; +#endif +#ifdef CONFIG_N32H7_GTIMB2 + case N32_GTIMERB2_BASE: + modifyreg32(N32_RCC_APB1EN1, RCC_APB1EN1_M7GTIMB2EN, 0); + break; +#endif +#ifdef CONFIG_N32H7_GTIMB3 + case N32_GTIMERB3_BASE: + modifyreg32(N32_RCC_APB1EN1, RCC_APB1EN1_M7GTIMB3EN, 0); + break; +#endif +#ifdef CONFIG_N32H7_BTIM1 + case N32_BTIMER1_BASE: + modifyreg32(N32_RCC_APB1EN1, RCC_APB1EN1_M7BTIM1EN, 0); + break; +#endif +#ifdef CONFIG_N32H7_BTIM2 + case N32_BTIMER2_BASE: + modifyreg32(N32_RCC_APB1EN1, RCC_APB1EN1_M7BTIM2EN, 0); + break; +#endif +#ifdef CONFIG_N32H7_BTIM3 + case N32_BTIMER3_BASE: + modifyreg32(N32_RCC_APB1EN1, RCC_APB1EN1_M7BTIM3EN, 0); + break; +#endif +#ifdef CONFIG_N32H7_BTIM4 + case N32_BTIMER4_BASE: + modifyreg32(N32_RCC_APB1EN1, RCC_APB1EN1_M7BTIM4EN, 0); + break; +#endif + default: + return -EINVAL; + } + + return OK; +} + +#endif /* defined(CONFIG_N32H7_ATIM1 || ... || CONFIG_N32H7_BTIM4) */ diff --git a/arch/arm/src/n32h7/n32_tim.h b/arch/arm/src/n32h7/n32_tim.h new file mode 100644 index 0000000000000..da0c71249183b --- /dev/null +++ b/arch/arm/src/n32h7/n32_tim.h @@ -0,0 +1,232 @@ +/**************************************************************************** + * arch/arm/src/n32h7/n32_tim.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __ARCH_ARM_SRC_N32H7_N32_TIM_H +#define __ARCH_ARM_SRC_N32H7_N32_TIM_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include "chip.h" +#include "hardware/n32h7_tim.h" + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* Helpers for timer driver operations **************************************/ + +#define N32_TIM_SETMODE(d, mode) ((d)->ops->setmode(d, mode)) +#define N32_TIM_SETCLOCK(d, freq) ((d)->ops->setclock(d, freq)) +#define N32_TIM_SETPERIOD(d, period) ((d)->ops->setperiod(d, period)) +#define N32_TIM_GETPERIOD(d) ((d)->ops->getperiod(d)) +#define N32_TIM_GETCOUNTER(d) ((d)->ops->getcounter(d)) +#define N32_TIM_SETCOUNTER(d, c) ((d)->ops->setcounter(d, c)) +#define N32_TIM_GETWIDTH(d) ((d)->ops->getwidth(d)) +#define N32_TIM_SETCHANNEL(d, ch, m) ((d)->ops->setchannel(d, ch, m)) +#define N32_TIM_SETCOMPARE(d, ch, c) ((d)->ops->setcompare(d, ch, c)) +#define N32_TIM_GETCAPTURE(d, ch) ((d)->ops->getcapture(d, ch)) +#define N32_TIM_SETISR(d, h, a, s) ((d)->ops->setisr(d, h, a, s)) +#define N32_TIM_ENABLEINT(d, s) ((d)->ops->enableint(d, s)) +#define N32_TIM_DISABLEINT(d, s) ((d)->ops->disableint(d, s)) +#define N32_TIM_ACKINT(d, s) ((d)->ops->ackint(d, s)) +#define N32_TIM_CHECKINT(d, s) ((d)->ops->checkint(d, s)) +#define N32_TIM_ENABLE(d) ((d)->ops->enable(d)) +#define N32_TIM_DISABLE(d) ((d)->ops->disable(d)) + +/* Timer interrupt sources for use with N32_TIM_SETISR */ +#define N32_TIM_ISR_UPDATE (1 << 0) /* Update interrupt (overflow/underflow) */ +#define N32_TIM_ISR_CC (1 << 1) /* Capture/Compare interrupt (CC1-CC4) */ +#define N32_TIM_ISR_TRG_COM (1 << 2) /* Trigger and COM interrupt */ +#define N32_TIM_ISR_BRK (1 << 3) /* Break interrupt (only ATIM) */ + +/**************************************************************************** + * Public Types + ****************************************************************************/ + +#ifndef __ASSEMBLY__ + +#undef EXTERN +#if defined(__cplusplus) +#define EXTERN extern "C" +extern "C" +{ +#else +#define EXTERN extern +#endif + +/* Forward reference */ + +struct n32_tim_dev_s; + +/* Timer modes of operation */ + +typedef enum +{ + N32_TIM_MODE_UNUSED = -1, + + /* One of the following */ + + N32_TIM_MODE_MASK = 0x0310, + N32_TIM_MODE_DISABLED = 0x0000, + N32_TIM_MODE_UP = 0x0100, + N32_TIM_MODE_DOWN = 0x0110, + N32_TIM_MODE_UPDOWN = 0x0200, + N32_TIM_MODE_PULSE = 0x0300, + + /* Clock source options (not fully supported in this version) */ + + N32_TIM_MODE_CK_INT = 0x0000, +} n32_tim_mode_t; + +/* Timer channel modes */ + +typedef enum +{ + N32_TIM_CH_DISABLED = 0x00, + + /* Common configuration */ + + N32_TIM_CH_POLARITY_POS = 0x00, + N32_TIM_CH_POLARITY_NEG = 0x01, + + /* MODES: */ + + N32_TIM_CH_MODE_MASK = 0x0e, + + /* Output compare modes */ + + N32_TIM_CH_OUTPWM = 0x04, /* PWM mode 1 (active high) */ + N32_TIM_CH_OUTTOGGLE = 0x08, /* Toggle on match */ +} n32_tim_channel_t; + +/* Timer operations structure */ + +struct n32_tim_ops_s +{ + /* Basic timer operations */ + + void (*enable)(struct n32_tim_dev_s *dev); + void (*disable)(struct n32_tim_dev_s *dev); + int (*setmode)(struct n32_tim_dev_s *dev, n32_tim_mode_t mode); + int (*setclock)(struct n32_tim_dev_s *dev, uint32_t freq); + void (*setperiod)(struct n32_tim_dev_s *dev, uint32_t period); + uint32_t (*getperiod)(struct n32_tim_dev_s *dev); + uint32_t (*getcounter)(struct n32_tim_dev_s *dev); + void (*setcounter)(struct n32_tim_dev_s *dev, uint32_t count); + + /* General and advanced timers */ + + int (*getwidth)(struct n32_tim_dev_s *dev); + int (*setchannel)(struct n32_tim_dev_s *dev, uint8_t channel, + n32_tim_channel_t mode); + int (*setcompare)(struct n32_tim_dev_s *dev, uint8_t channel, + uint32_t compare); + int (*getcapture)(struct n32_tim_dev_s *dev, uint8_t channel); + + /* Timer interrupts */ + + int (*setisr)(struct n32_tim_dev_s *dev, xcpt_t handler, void *arg, + int source); + void (*enableint)(struct n32_tim_dev_s *dev, int source); + void (*disableint)(struct n32_tim_dev_s *dev, int source); + void (*ackint)(struct n32_tim_dev_s *dev, int source); + int (*checkint)(struct n32_tim_dev_s *dev, int source); +}; + +/* Timer device structure (public) */ + +struct n32_tim_dev_s +{ + const struct n32_tim_ops_s *ops; +}; + +/**************************************************************************** + * Public Function Prototypes + ****************************************************************************/ + +/**************************************************************************** + * Name: n32_tim_init + * + * Description: + * Initialize a timer device and enable its clock. + * + * Input Parameters: + * timer - Timer number (1-18, as defined by the configuration). + * The mapping is determined by CONFIG_N32H7_ATIMx, + * CONFIG_N32H7_GTIMAx, CONFIG_N32H7_GTIMBx, CONFIG_N32H7_BTIMx. + * + * Returned Value: + * Pointer to the timer device structure, or NULL on failure. + * + ****************************************************************************/ + +struct n32_tim_dev_s *n32_tim_init(int timer); + +/**************************************************************************** + * Name: n32_tim_deinit + * + * Description: + * De-initialize a timer device, disable its clock, and reset it. + * + * Input Parameters: + * dev - Timer device structure. + * + * Returned Value: + * OK on success, negated errno on failure. + * + ****************************************************************************/ + +int n32_tim_deinit(struct n32_tim_dev_s *dev); + +/**************************************************************************** + * Name: n32_timer_initialize + * + * Description: + * Bind the configuration timer to a timer lower half instance and + * register the timer drivers at 'devpath' + * + * Input Parameters: + * devpath - The full path to the timer device. This should be of the + * form /dev/timer0 + * timer - The timer number. + * + * Returned Values: + * Zero (OK) is returned on success; A negated errno value is returned + * to indicate the nature of any failure. + * + ****************************************************************************/ + +#ifdef CONFIG_TIMER +int n32_timer_initialize(const char *devpath, int timer); +#endif + +#undef EXTERN +#if defined(__cplusplus) +} +#endif + +#endif /* __ASSEMBLY__ */ +#endif /* __ARCH_ARM_SRC_N32H7_N32_TIM_H */ diff --git a/arch/arm/src/n32h7/n32_tim_lowerhalf.c b/arch/arm/src/n32h7/n32_tim_lowerhalf.c new file mode 100644 index 0000000000000..2de01ad7335a2 --- /dev/null +++ b/arch/arm/src/n32h7/n32_tim_lowerhalf.c @@ -0,0 +1,621 @@ +/**************************************************************************** + * arch/arm/src/n32h7/n32_tim_lowerhalf.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include + +#include +#include +#include + +#include +#include + +#include + +#include "n32_tim.h" + +#if defined(CONFIG_TIMER) && \ + (defined(CONFIG_N32H7_ATIM1) || defined(CONFIG_N32H7_ATIM2) || \ + defined(CONFIG_N32H7_ATIM3) || defined(CONFIG_N32H7_ATIM4) || \ + defined(CONFIG_N32H7_GTIMA1) || defined(CONFIG_N32H7_GTIMA2) || \ + defined(CONFIG_N32H7_GTIMA3) || defined(CONFIG_N32H7_GTIMA4) || \ + defined(CONFIG_N32H7_GTIMA5) || defined(CONFIG_N32H7_GTIMA6) || \ + defined(CONFIG_N32H7_GTIMA7) || defined(CONFIG_N32H7_GTIMB1) || \ + defined(CONFIG_N32H7_GTIMB2) || defined(CONFIG_N32H7_GTIMB3) || \ + defined(CONFIG_N32H7_BTIM1) || defined(CONFIG_N32H7_BTIM2) || \ + defined(CONFIG_N32H7_BTIM3) || defined(CONFIG_N32H7_BTIM4)) + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* Interrupt source for timer upper half (update interrupt) */ + +#define N32_TIM_UIE N32_ATIM_DINTEN_UIEN +#define N32_TIM_UIF N32_ATIM_STS_UDITF + +/**************************************************************************** + * Private Types + ****************************************************************************/ + +/* This structure provides the private representation of the "lower-half" + * driver state structure. + */ + +struct n32_lowerhalf_s +{ + const struct timer_ops_s *ops; /* Lower half operations */ + struct n32_tim_dev_s *tim; /* N32 timer driver */ + tccb_t callback; /* Current user interrupt callback */ + void *arg; /* Argument passed to upper half callback */ + bool started; /* True: Timer has been started */ + const uint8_t resolution; /* Number of bits in the timer (16 or 32 bits) */ +}; + +/**************************************************************************** + * Private Function Prototypes + ****************************************************************************/ + +static int n32_timer_handler(int irq, void *context, void *arg); + +/* "Lower half" driver methods **********************************************/ + +static int n32_start(struct timer_lowerhalf_s *lower); +static int n32_stop(struct timer_lowerhalf_s *lower); +static int n32_getstatus(struct timer_lowerhalf_s *lower, + struct timer_status_s *status); +static int n32_settimeout(struct timer_lowerhalf_s *lower, + uint32_t timeout); +static void n32_setcallback(struct timer_lowerhalf_s *lower, + tccb_t callback, void *arg); +static int n32_maxtimeout(struct timer_lowerhalf_s *lower, + uint32_t *maxtimeout); + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +/* "Lower half" driver methods */ + +static const struct timer_ops_s g_timer_ops = +{ + .start = n32_start, + .stop = n32_stop, + .getstatus = n32_getstatus, + .settimeout = n32_settimeout, + .setcallback = n32_setcallback, + .ioctl = NULL, + .maxtimeout = n32_maxtimeout, + .tick_getstatus = NULL, + .tick_settimeout = NULL, + .tick_maxtimeout = NULL, +}; + +#ifdef CONFIG_N32H7_ATIM1 +static struct n32_lowerhalf_s g_tim1_lowerhalf = +{ + .ops = &g_timer_ops, + .resolution = 16, /* ATIM1 is 16-bit */ +}; +#endif + +#ifdef CONFIG_N32H7_ATIM2 +static struct n32_lowerhalf_s g_tim2_lowerhalf = +{ + .ops = &g_timer_ops, + .resolution = 16, +}; +#endif + +#ifdef CONFIG_N32H7_GTIMA1 +static struct n32_lowerhalf_s g_gtima1_lowerhalf = +{ + .ops = &g_timer_ops, + .resolution = 16, +}; +#endif + +#ifdef CONFIG_N32H7_GTIMA2 +static struct n32_lowerhalf_s g_gtima2_lowerhalf = +{ + .ops = &g_timer_ops, + .resolution = 16, +}; +#endif + +#ifdef CONFIG_N32H7_GTIMA3 +static struct n32_lowerhalf_s g_gtima3_lowerhalf = +{ + .ops = &g_timer_ops, + .resolution = 16, +}; +#endif + +#ifdef CONFIG_N32H7_ATIM3 +static struct n32_lowerhalf_s g_tim3_lowerhalf = +{ + .ops = &g_timer_ops, + .resolution = 16, +}; +#endif + +#ifdef CONFIG_N32H7_ATIM4 +static struct n32_lowerhalf_s g_tim4_lowerhalf = +{ + .ops = &g_timer_ops, + .resolution = 16, +}; +#endif + +#ifdef CONFIG_N32H7_GTIMA4 +static struct n32_lowerhalf_s g_gtima4_lowerhalf = +{ + .ops = &g_timer_ops, + .resolution = 16, +}; +#endif + +#ifdef CONFIG_N32H7_GTIMA5 +static struct n32_lowerhalf_s g_gtima5_lowerhalf = +{ + .ops = &g_timer_ops, + .resolution = 16, +}; +#endif + +#ifdef CONFIG_N32H7_GTIMA6 +static struct n32_lowerhalf_s g_gtima6_lowerhalf = +{ + .ops = &g_timer_ops, + .resolution = 16, +}; +#endif + +#ifdef CONFIG_N32H7_GTIMA7 +static struct n32_lowerhalf_s g_gtima7_lowerhalf = +{ + .ops = &g_timer_ops, + .resolution = 16, +}; +#endif + +#ifdef CONFIG_N32H7_GTIMB1 +static struct n32_lowerhalf_s g_gtimb1_lowerhalf = +{ + .ops = &g_timer_ops, + .resolution = 16, +}; +#endif + +#ifdef CONFIG_N32H7_GTIMB2 +static struct n32_lowerhalf_s g_gtimb2_lowerhalf = +{ + .ops = &g_timer_ops, + .resolution = 16, +}; +#endif + +#ifdef CONFIG_N32H7_GTIMB3 +static struct n32_lowerhalf_s g_gtimb3_lowerhalf = +{ + .ops = &g_timer_ops, + .resolution = 16, +}; +#endif + +#ifdef CONFIG_N32H7_BTIM1 +static struct n32_lowerhalf_s g_btim1_lowerhalf = +{ + .ops = &g_timer_ops, + .resolution = 32, +}; +#endif + +#ifdef CONFIG_N32H7_BTIM2 +static struct n32_lowerhalf_s g_btim2_lowerhalf = +{ + .ops = &g_timer_ops, + .resolution = 32, +}; +#endif + +#ifdef CONFIG_N32H7_BTIM3 +static struct n32_lowerhalf_s g_btim3_lowerhalf = +{ + .ops = &g_timer_ops, + .resolution = 32, +}; +#endif + +#ifdef CONFIG_N32H7_BTIM4 +static struct n32_lowerhalf_s g_btim4_lowerhalf = +{ + .ops = &g_timer_ops, + .resolution = 32, +}; +#endif + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: n32_timer_handler + * + * Description: + * Timer interrupt handler + * + ****************************************************************************/ + +static int n32_timer_handler(int irq, void *context, void *arg) +{ + struct n32_lowerhalf_s *lower = (struct n32_lowerhalf_s *)arg; + uint32_t next_interval_us = 0; + + N32_TIM_ACKINT(lower->tim, N32_TIM_UIF); + + if (lower->callback(&next_interval_us, lower->arg)) + { + if (next_interval_us > 0) + { + N32_TIM_SETPERIOD(lower->tim, next_interval_us); + } + } + else + { + n32_stop((struct timer_lowerhalf_s *)lower); + } + + return OK; +} + +/**************************************************************************** + * Name: n32_start + * + * Description: + * Start the timer, resetting the time to the current timeout. + * + ****************************************************************************/ + +static int n32_start(struct timer_lowerhalf_s *lower) +{ + struct n32_lowerhalf_s *priv = (struct n32_lowerhalf_s *)lower; + + if (!priv->started) + { + N32_TIM_SETMODE(priv->tim, N32_TIM_MODE_UP); + + if (priv->callback != NULL) + { + N32_TIM_SETISR(priv->tim, n32_timer_handler, priv, + N32_TIM_ISR_UPDATE); + N32_TIM_ENABLEINT(priv->tim, N32_TIM_UIE); + } + + priv->started = true; + return OK; + } + + return -EBUSY; +} + +/**************************************************************************** + * Name: n32_stop + * + * Description: + * Stop the timer + * + ****************************************************************************/ + +static int n32_stop(struct timer_lowerhalf_s *lower) +{ + struct n32_lowerhalf_s *priv = (struct n32_lowerhalf_s *)lower; + + if (priv->started) + { + N32_TIM_SETMODE(priv->tim, N32_TIM_MODE_DISABLED); + N32_TIM_DISABLEINT(priv->tim, N32_TIM_UIE); + N32_TIM_SETISR(priv->tim, NULL, NULL, N32_TIM_ISR_UPDATE); + priv->started = false; + return OK; + } + + return -ENODEV; +} + +/**************************************************************************** + * Name: n32_getstatus + * + * Description: + * Get the current timer status. + * + ****************************************************************************/ + +static int n32_getstatus(struct timer_lowerhalf_s *lower, + struct timer_status_s *status) +{ + struct n32_lowerhalf_s *priv = (struct n32_lowerhalf_s *)lower; + + if (status == NULL) + { + return -EINVAL; + } + + memset(status, 0, sizeof(*status)); + + if (priv->started) + { + status->flags |= TCFLAGS_ACTIVE; + } + + if (priv->callback != NULL) + { + status->flags |= TCFLAGS_HANDLER; + } + + status->timeout = N32_TIM_GETPERIOD(priv->tim); + status->timeleft = status->timeout - N32_TIM_GETCOUNTER(priv->tim); + + return OK; +} + +/**************************************************************************** + * Name: n32_settimeout + * + * Description: + * Set a new timeout value (and reset the timer) + * + ****************************************************************************/ + +static int n32_settimeout(struct timer_lowerhalf_s *lower, + uint32_t timeout) +{ + struct n32_lowerhalf_s *priv = (struct n32_lowerhalf_s *)lower; + uint64_t maxtimeout; + + if (priv->started) + { + return -EPERM; + } + + maxtimeout = (1ULL << priv->resolution) - 1; + + /* If timeout exceeds the maximum counter value, scale the clock down */ + + if (timeout > maxtimeout) + { + uint64_t freq = (maxtimeout * 1000000ULL) / timeout; + + N32_TIM_SETCLOCK(priv->tim, (uint32_t)freq); + N32_TIM_SETPERIOD(priv->tim, (uint32_t)maxtimeout); + } + else + { + N32_TIM_SETCLOCK(priv->tim, 1000000); + N32_TIM_SETPERIOD(priv->tim, timeout); + } + + return OK; +} + +/**************************************************************************** + * Name: n32_setcallback + * + * Description: + * Call this user provided timeout callback. + * + ****************************************************************************/ + +static void n32_setcallback(struct timer_lowerhalf_s *lower, + tccb_t callback, void *arg) +{ + struct n32_lowerhalf_s *priv = (struct n32_lowerhalf_s *)lower; + irqstate_t flags; + + flags = enter_critical_section(); + + /* Save the new callback */ + + priv->callback = callback; + priv->arg = arg; + + if (callback != NULL && priv->started) + { + N32_TIM_SETISR(priv->tim, n32_timer_handler, priv, N32_TIM_ISR_UPDATE); + N32_TIM_ENABLEINT(priv->tim, N32_TIM_UIE); + } + else + { + N32_TIM_DISABLEINT(priv->tim, N32_TIM_UIE); + N32_TIM_SETISR(priv->tim, NULL, NULL, N32_TIM_ISR_UPDATE); + } + + leave_critical_section(flags); +} + +/**************************************************************************** + * Name: n32_maxtimeout + * + * Description: + * Return the maximum supported timeout value in microseconds. + * + ****************************************************************************/ + +static int n32_maxtimeout(struct timer_lowerhalf_s *lower, + uint32_t *maxtimeout) +{ + struct n32_lowerhalf_s *priv = (struct n32_lowerhalf_s *)lower; + + if (maxtimeout == NULL) + { + return -EINVAL; + } + + *maxtimeout = (1ULL << priv->resolution) - 1; + + return OK; +} + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: n32_timer_initialize + * + * Description: + * Bind the configuration timer to a timer lower half instance and + * register the timer drivers at 'devpath' + * + ****************************************************************************/ + +int n32_timer_initialize(const char *devpath, int timer) +{ + struct n32_lowerhalf_s *lower; + + switch (timer) + { +#ifdef CONFIG_N32H7_ATIM1 + case 1: + lower = &g_tim1_lowerhalf; + break; +#endif +#ifdef CONFIG_N32H7_ATIM2 + case 2: + lower = &g_tim2_lowerhalf; + break; +#endif +#ifdef CONFIG_N32H7_GTIMA1 + case 3: + lower = &g_gtima1_lowerhalf; + break; +#endif +#ifdef CONFIG_N32H7_GTIMA2 + case 4: + lower = &g_gtima2_lowerhalf; + break; +#endif +#ifdef CONFIG_N32H7_GTIMA3 + case 5: + lower = &g_gtima3_lowerhalf; + break; +#endif +#ifdef CONFIG_N32H7_ATIM3 + case 6: + lower = &g_tim3_lowerhalf; + break; +#endif +#ifdef CONFIG_N32H7_ATIM4 + case 7: + lower = &g_tim4_lowerhalf; + break; +#endif +#ifdef CONFIG_N32H7_GTIMA4 + case 8: + lower = &g_gtima4_lowerhalf; + break; +#endif +#ifdef CONFIG_N32H7_GTIMA5 + case 9: + lower = &g_gtima5_lowerhalf; + break; +#endif +#ifdef CONFIG_N32H7_GTIMA6 + case 10: + lower = &g_gtima6_lowerhalf; + break; +#endif +#ifdef CONFIG_N32H7_GTIMA7 + case 11: + lower = &g_gtima7_lowerhalf; + break; +#endif +#ifdef CONFIG_N32H7_GTIMB1 + case 12: + lower = &g_gtimb1_lowerhalf; + break; +#endif +#ifdef CONFIG_N32H7_GTIMB2 + case 13: + lower = &g_gtimb2_lowerhalf; + break; +#endif +#ifdef CONFIG_N32H7_GTIMB3 + case 14: + lower = &g_gtimb3_lowerhalf; + break; +#endif +#ifdef CONFIG_N32H7_BTIM1 + case 15: + lower = &g_btim1_lowerhalf; + break; +#endif +#ifdef CONFIG_N32H7_BTIM2 + case 16: + lower = &g_btim2_lowerhalf; + break; +#endif +#ifdef CONFIG_N32H7_BTIM3 + case 17: + lower = &g_btim3_lowerhalf; + break; +#endif +#ifdef CONFIG_N32H7_BTIM4 + case 18: + lower = &g_btim4_lowerhalf; + break; +#endif + default: + return -ENODEV; + } + + /* Initialize the elements of lower half state structure */ + + lower->started = false; + lower->callback = NULL; + lower->tim = n32_tim_init(timer); + + if (lower->tim == NULL) + { + return -EINVAL; + } + + /* Register the timer driver as /dev/timerX */ + + void *drvr = timer_register(devpath, + (struct timer_lowerhalf_s *)lower); + + if (drvr == NULL) + { + return -EEXIST; + } + + return OK; +} + +#endif /* CONFIG_TIMER && ... */ diff --git a/arch/arm/src/n32h7/n32_timerisr.c b/arch/arm/src/n32h7/n32_timerisr.c new file mode 100644 index 0000000000000..60be549d6fba5 --- /dev/null +++ b/arch/arm/src/n32h7/n32_timerisr.c @@ -0,0 +1,167 @@ +/**************************************************************************** + * arch/arm/src/n32h7/n32_timerisr.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include +#include +#include +#include + +#include "nvic.h" +#include "clock/clock.h" +#include "arm_internal.h" +#include "chip.h" + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* Select MCU-specific settings + * + * The RCC feeds the external clock of the Cortex System Timer (SysTick) with + * the AHB clock (HCLK) divided by 8. The SysTick can work either with this + * clock or with the Cortex clock (HCLK), configurable in the SysTick control + * and status register. + * + * The SysTick calibration value is fixed to 75000, which gives a reference + * time base of 1 ms with the SysTick clock set to 75 MHz (HCLK/8, with + * HCLK set to 600 MHz). + * + * REVISIT: Per ES0392 Rev 4: N32H743xI Errata sheet N32H743xI device + * limitations + * + * SysTick external clock is not HCLK/8 + * Description + * The SysTick external clock is the system clock, instead of the system + * clock divided by 8 (HCLK/8). + * Workaround + * Use the system clock (HCLK) as external clock and multiply the reload + * value by 8 in STK_LOAD register (take care that the maximum value is + * 224-1). + */ + +#undef CONFIG_N32H7_SYSTICK_HCLKd8 + +/* REVISIT: + * It looks like SYSTICK for H7 is always clocked from CPUCLK and doesn't + * depend on the SYSTICK_CTRL_CLKSOURCE bit settings. + */ + +#ifdef CONFIG_N32H7_SYSTICK_HCLKd8 +# define N32_SYSTICK_CLOCK (N32_M7CPU_FREQUENCY / 8) +#else +# define N32_SYSTICK_CLOCK (N32_M7CPU_FREQUENCY) +#endif + +/* The desired timer interrupt frequency is provided by the definition + * CLK_TCK (see include/time.h). CLK_TCK defines the desired number of + * system clock ticks per second. That value is a user configurable setting + * that defaults to 1000 (1000 ticks per second = 1 MS interval). + * + * For example, suppose HCLK = 600 MHz and CLK_TCK = 1000, then: + * + * N32_SYSTICK_CLOCK = 600 MHz + * SYSTICK_RELOAD = (600,000,000 / 1000) - 1 = 599,999 + */ + +#define SYSTICK_RELOAD ((N32_SYSTICK_CLOCK / CLK_TCK) - 1) + +/* The size of the reload field is 24 bits. Verify that the reload value + * will fit in the reload register. + */ + +#if SYSTICK_RELOAD > 0x00ffffff +# error SYSTICK_RELOAD exceeds the range of the RELOAD register +#endif + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Function: n32_timerisr + * + * Description: + * The timer ISR will perform a variety of services for various portions + * of the systems. + * + ****************************************************************************/ + +static int n32_timerisr(int irq, uint32_t *regs, void *arg) +{ + /* Process timer interrupt */ + + nxsched_process_timer(); + return 0; +} + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Function: up_timer_initialize + * + * Description: + * This function is called during start-up to initialize the timer + * interrupt. + * + ****************************************************************************/ + +void up_timer_initialize(void) +{ + uint32_t regval; + + /* Configure SysTick to interrupt at the requested rate */ + + putreg32(SYSTICK_RELOAD, NVIC_SYSTICK_RELOAD); + putreg32(0, NVIC_SYSTICK_CURRENT); + + /* Attach the timer interrupt vector */ + + irq_attach(N32_IRQ_SYSTICK, (xcpt_t)n32_timerisr, NULL); + + /* Enable SysTick interrupts: + * + * NVIC_SYSTICK_CTRL_CLKSOURCE : Configurable, 0=HCLK/8, 1=CPU + * NVIC_SYSTICK_CTRL_TICKINT=1 : Generate interrupts + * NVIC_SYSTICK_CTRL_ENABLE : Enable the counter + */ + + regval = (NVIC_SYSTICK_CTRL_TICKINT | NVIC_SYSTICK_CTRL_ENABLE); +#ifndef CONFIG_N32H7_SYSTICK_HCLKd8 + regval |= NVIC_SYSTICK_CTRL_CLKSOURCE; +#else + regval &= ~NVIC_SYSTICK_CTRL_CLKSOURCE; +#endif + putreg32(regval, NVIC_SYSTICK_CTRL); + + /* And enable the timer interrupt */ + + up_enable_irq(N32_IRQ_SYSTICK); +} diff --git a/arch/arm/src/n32h7/n32_uart.h b/arch/arm/src/n32h7/n32_uart.h new file mode 100644 index 0000000000000..e542b3842edc1 --- /dev/null +++ b/arch/arm/src/n32h7/n32_uart.h @@ -0,0 +1,166 @@ +/**************************************************************************** + * arch/arm/src/n32h7/n32_uart.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************/ + +#ifndef __ARCH_ARM_SRC_N32H7_N32H7_UART_H +#define __ARCH_ARM_SRC_N32H7_N32H7_UART_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* Disable UARTs not supported by the chip */ +#if N32H7_NUSART < 8 +# undef CONFIG_N32H7_USART8 +#endif +#if N32H7_NUSART < 7 +# undef CONFIG_N32H7_USART7 +#endif +#if N32H7_NUSART < 6 +# undef CONFIG_N32H7_USART6 +#endif +#if N32H7_NUSART < 5 +# undef CONFIG_N32H7_USART5 +#endif +#if N32H7_NUSART < 4 +# undef CONFIG_N32H7_USART4 +#endif +#if N32H7_NUSART < 3 +# undef CONFIG_N32H7_USART3 +#endif +#if N32H7_NUSART < 2 +# undef CONFIG_N32H7_USART2 +#endif +#if N32H7_NUSART < 1 +# undef CONFIG_N32H7_USART1 +#endif + +#if N32H7_NUART < 7 +# undef CONFIG_N32H7_UART15 +#endif +#if N32H7_NUART < 6 +# undef CONFIG_N32H7_UART14 +#endif +#if N32H7_NUART < 5 +# undef CONFIG_N32H7_UART13 +#endif +#if N32H7_NUART < 4 +# undef CONFIG_N32H7_UART12 +#endif +#if N32H7_NUART < 3 +# undef CONFIG_N32H7_UART11 +#endif +#if N32H7_NUART < 2 +# undef CONFIG_N32H7_UART10 +#endif +#if N32H7_NUART < 1 +# undef CONFIG_N32H7_UART9 +#endif + +/* Check if any UART is enabled */ +#if defined(CONFIG_N32H7_USART1) || defined(CONFIG_N32H7_USART2) || \ + defined(CONFIG_N32H7_USART3) || defined(CONFIG_N32H7_USART4) || \ + defined(CONFIG_N32H7_USART5) || defined(CONFIG_N32H7_USART6) || \ + defined(CONFIG_N32H7_USART7) || defined(CONFIG_N32H7_USART8) || \ + defined(CONFIG_N32H7_UART9) || defined(CONFIG_N32H7_UART10) || \ + defined(CONFIG_N32H7_UART11) || defined(CONFIG_N32H7_UART12) || \ + defined(CONFIG_N32H7_UART13) || defined(CONFIG_N32H7_UART14) || \ + defined(CONFIG_N32H7_UART15) +# define HAVE_UART 1 +#endif + +/* Console selection */ +#undef CONSOLE_UART +#undef HAVE_CONSOLE + +#if defined(CONFIG_USART1_SERIAL_CONSOLE) && defined(CONFIG_N32H7_USART1) +# define CONSOLE_UART 1 +# define HAVE_CONSOLE 1 +#elif defined(CONFIG_USART2_SERIAL_CONSOLE) && defined(CONFIG_N32H7_USART2) +# define CONSOLE_UART 2 +# define HAVE_CONSOLE 1 +#elif defined(CONFIG_USART3_SERIAL_CONSOLE) && defined(CONFIG_N32H7_USART3) +# define CONSOLE_UART 3 +# define HAVE_CONSOLE 1 +#elif defined(CONFIG_USART4_SERIAL_CONSOLE) && defined(CONFIG_N32H7_USART4) +# define CONSOLE_UART 4 +# define HAVE_CONSOLE 1 +#elif defined(CONFIG_USART5_SERIAL_CONSOLE) && defined(CONFIG_N32H7_USART5) +# define CONSOLE_UART 5 +# define HAVE_CONSOLE 1 +#elif defined(CONFIG_USART6_SERIAL_CONSOLE) && defined(CONFIG_N32H7_USART6) +# define CONSOLE_UART 6 +# define HAVE_CONSOLE 1 +#elif defined(CONFIG_USART7_SERIAL_CONSOLE) && defined(CONFIG_N32H7_USART7) +# define CONSOLE_UART 7 +# define HAVE_CONSOLE 1 +#elif defined(CONFIG_USART8_SERIAL_CONSOLE) && defined(CONFIG_N32H7_USART8) +# define CONSOLE_UART 8 +# define HAVE_CONSOLE 1 +#elif defined(CONFIG_UART9_SERIAL_CONSOLE) && defined(CONFIG_N32H7_UART9) +# define CONSOLE_UART 9 +# define HAVE_CONSOLE 1 +#elif defined(CONFIG_UART10_SERIAL_CONSOLE) && defined(CONFIG_N32H7_UART10) +# define CONSOLE_UART 10 +# define HAVE_CONSOLE 1 +#elif defined(CONFIG_UART11_SERIAL_CONSOLE) && defined(CONFIG_N32H7_UART11) +# define CONSOLE_UART 11 +# define HAVE_CONSOLE 1 +#elif defined(CONFIG_UART12_SERIAL_CONSOLE) && defined(CONFIG_N32H7_UART12) +# define CONSOLE_UART 12 +# define HAVE_CONSOLE 1 +#elif defined(CONFIG_UART13_SERIAL_CONSOLE) && defined(CONFIG_N32H7_UART13) +# define CONSOLE_UART 13 +# define HAVE_CONSOLE 1 +#elif defined(CONFIG_UART14_SERIAL_CONSOLE) && defined(CONFIG_N32H7_UART14) +# define CONSOLE_UART 14 +# define HAVE_CONSOLE 1 +#elif defined(CONFIG_UART15_SERIAL_CONSOLE) && defined(CONFIG_N32H7_UART15) +# define CONSOLE_UART 15 +# define HAVE_CONSOLE 1 +#else +# define CONSOLE_UART 0 +# undef HAVE_CONSOLE +#endif + +#define CONFIG_N32H7_SERIAL_RXDMA_BUFFER_SIZE 64 + +/**************************************************************************** + * Public Functions Prototypes + ****************************************************************************/ + +#ifdef __cplusplus +extern "C" +{ +#endif + +uart_dev_t *n32_serial_get_uart(int uart_num); +void n32_serial_dma_poll(void); + +#ifdef __cplusplus +} +#endif + +#endif /* __ARCH_ARM_SRC_N32H7_N32_UART_H */ diff --git a/arch/arm/src/n32h7/n32_uid.c b/arch/arm/src/n32h7/n32_uid.c new file mode 100644 index 0000000000000..6f545b048e2ca --- /dev/null +++ b/arch/arm/src/n32h7/n32_uid.c @@ -0,0 +1,66 @@ +/**************************************************************************** + * arch/arm/src/n32h7/n32_uid.c + * + * SPDX-License-Identifier: BSD-3-Clause + * SPDX-FileCopyrightText: 2015 Marawan Ragab. All rights reserved. + * SPDX-FileContributor: Marawan Ragab + * SPDX-FileContributor: David Sidrane + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include "hardware/n32h7_memorymap.h" + +#include "n32_uid.h" + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +void n32_get_uniqueid(uint8_t uniqueid[16]) +{ + uint32_t otpc_tmp; + + for (int i = 0; i < 4; i++) + { + putreg32(N32_SYSMEM_UID + i, N32H7_OTPC_ADDR); + usleep(25000); + otpc_tmp = getreg32(N32H7_OTPC_DATA); + uniqueid[i * 4 + 0] = (otpc_tmp >> 0) & 0xff; + uniqueid[i * 4 + 1] = (otpc_tmp >> 8) & 0xff; + uniqueid[i * 4 + 2] = (otpc_tmp >> 16) & 0xff; + uniqueid[i * 4 + 3] = (otpc_tmp >> 24) & 0xff; + } +} diff --git a/arch/arm/src/n32h7/n32_uid.h b/arch/arm/src/n32h7/n32_uid.h new file mode 100644 index 0000000000000..d9128db8707d7 --- /dev/null +++ b/arch/arm/src/n32h7/n32_uid.h @@ -0,0 +1,57 @@ +/**************************************************************************** + * arch/arm/src/n32h7/n32_uid.h + * + * SPDX-License-Identifier: BSD-3-Clause + * SPDX-FileCopyrightText: 2015 Marawan Ragab. All rights reserved. + * SPDX-FileContributor: Marawan Ragab + * SPDX-FileContributor: David Sidrane + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +#ifndef __ARCH_ARM_SRC_N32H7_N32_UID_H +#define __ARCH_ARM_SRC_N32H7_N32_UID_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include "arm_internal.h" + +#define N32H7_OTPC_ADDR 0x51118010 +#define N32H7_OTPC_DATA 0x51118014 + +/**************************************************************************** + * Public Function Prototypes + ****************************************************************************/ + +void n32_get_uniqueid(uint8_t uniqueid[16]); + +#endif /* __ARCH_ARM_SRC_N32H7_N32_UID_H */ diff --git a/arch/arm/src/n32h7/n32_usbhs.h b/arch/arm/src/n32h7/n32_usbhs.h new file mode 100644 index 0000000000000..85919921caa3f --- /dev/null +++ b/arch/arm/src/n32h7/n32_usbhs.h @@ -0,0 +1,424 @@ +/**************************************************************************** + * arch/arm/src/n32h7/n32_usbhs.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/* N32H7 MOD: + * This file is the N32H76x counterpart of the STM32H7 stm32_otg.h driver + * common header. It provides the shared definitions used by the N32H7 + * USBHS device (n32_usbhsdev.c) and host (n32_usbhshost.c) drivers. + * + * Register offsets and bitfields are NOT duplicated here; they live in + * hardware/n32h7_usbhs.h. This header only composes the instance base + * address with the hardware offsets and supplies the small set of + * driver-local constants that the ported Synopsys OTG core logic needs. + */ + +#ifndef __ARCH_ARM_SRC_N32H7_N32_USBHS_H +#define __ARCH_ARM_SRC_N32H7_N32_USBHS_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include + +#include +#include + +#include "chip.h" +#include "hardware/n32h7_usbhs.h" +#include "hardware/n32h76x_rcc.h" +#include "hardware/n32h76x_pwr.h" + +#if defined(CONFIG_N32H7_USBHS1_DEV) || defined(CONFIG_N32H7_USBHS2_DEV) || \ + defined(CONFIG_N32H7_USBHS1_HOST) || defined(CONFIG_N32H7_USBHS2_HOST) + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* Register Addresses *******************************************************/ + +/* Core global registers */ + +#define N32_USBHS_GCTRLSTS (N32_USBHS_BASE + N32_USBHS_GCTRLSTS_OFF) +#define N32_USBHS_GAHBCFG (N32_USBHS_BASE + N32_USBHS_GAHBCFG_OFF) +#define N32_USBHS_GCFG (N32_USBHS_BASE + N32_USBHS_GCFG_OFF) +#define N32_USBHS_GRSTCTRL (N32_USBHS_BASE + N32_USBHS_GRSTCTRL_OFF) +#define N32_USBHS_GINTSTS (N32_USBHS_BASE + N32_USBHS_GINTSTS_OFF) +#define N32_USBHS_GINTEN (N32_USBHS_BASE + N32_USBHS_GINTEN_OFF) +#define N32_USBHS_GRXSTS (N32_USBHS_BASE + N32_USBHS_GRXSTS_OFF) +#define N32_USBHS_GRXSTSP (N32_USBHS_BASE + N32_USBHS_GRXSTSP_OFF) +#define N32_USBHS_GRXFSIZ (N32_USBHS_BASE + N32_USBHS_GRXFSIZ_OFF) +#define N32_USBHS_GNPTXFSIZ (N32_USBHS_BASE + N32_USBHS_GNPTXFSIZ_OFF) +#define N32_USBHS_GNPTXFSTS (N32_USBHS_BASE + N32_USBHS_GNPTXFSTS_OFF) +#define N32_USBHS_CID (N32_USBHS_BASE + N32_USBHS_CID_OFF) +#define N32_USBHS_GPD (N32_USBHS_BASE + N32_USBHS_GPD_OFF) +#define N32_USBHS_HPTXFSIZ (N32_USBHS_BASE + N32_USBHS_HPTXFSIZ_OFF) + +#define N32_USBHS_DINEPPTXFSIZ(n) (N32_USBHS_BASE + \ + N32_USBHS_DINEPPTXFSIZ_OFF + (((n)-1) << 2)) + +/* N32H7 MOD: + * In device mode the IN EP0 TxFIFO size register shares the 0x028 offset + * with GNPTXFSIZ (same physical register, like DIEPTXF0/HNPTXFSIZ on the + * STM32H7 OTG core). + */ + +#define N32_USBHS_DINEPTXF0 (N32_USBHS_BASE + N32_USBHS_GNPTXFSIZ_OFF) + +/* Host mode registers */ + +#define N32_USBHS_HCFG (N32_USBHS_BASE + N32_USBHS_HCFG_OFF) +#define N32_USBHS_HFRI (N32_USBHS_BASE + N32_USBHS_HFRI_OFF) +#define N32_USBHS_HFNUM (N32_USBHS_BASE + N32_USBHS_HFNUM_OFF) +#define N32_USBHS_HPTXFQSTS (N32_USBHS_BASE + N32_USBHS_HPTXFQSTS_OFF) +#define N32_USBHS_HACHINT (N32_USBHS_BASE + N32_USBHS_HACHINT_OFF) +#define N32_USBHS_HACHINTEN (N32_USBHS_BASE + N32_USBHS_HACHINTEN_OFF) +#define N32_USBHS_HPCS (N32_USBHS_BASE + N32_USBHS_HPCS_OFF) + +/* Host channel registers */ + +#define N32_USBHS_HCHCTRL(n) (N32_USBHS_BASE + N32_USBHS_HCHCTRL_OFF(n)) +#define N32_USBHS_HCSCTRL(n) (N32_USBHS_BASE + N32_USBHS_HCSCTRL_OFF(n)) +#define N32_USBHS_HCHINTSTS(n) (N32_USBHS_BASE + N32_USBHS_HCHINTSTS_OFF(n)) +#define N32_USBHS_HCHINTEN(n) (N32_USBHS_BASE + N32_USBHS_HCHINTEN_OFF(n)) +#define N32_USBHS_HCHTXSIZ(n) (N32_USBHS_BASE + N32_USBHS_HCHTXSIZ_OFF(n)) +#define N32_USBHS_HCHDMADD(n) (N32_USBHS_BASE + N32_USBHS_HCHDMADD_OFF(n)) + +/* Device mode registers */ + +#define N32_USBHS_DCFG (N32_USBHS_BASE + N32_USBHS_DCFG_OFF) +#define N32_USBHS_DCTRL (N32_USBHS_BASE + N32_USBHS_DCTRL_OFF) +#define N32_USBHS_DSTS (N32_USBHS_BASE + N32_USBHS_DSTS_OFF) +#define N32_USBHS_DINEPINTEN (N32_USBHS_BASE + N32_USBHS_DINEPINTEN_OFF) +#define N32_USBHS_DOUTEPINTEN (N32_USBHS_BASE + N32_USBHS_DOUTEPINTEN_OFF) +#define N32_USBHS_DAEPINTSTS (N32_USBHS_BASE + N32_USBHS_DAEPINTSTS_OFF) +#define N32_USBHS_DAEPINTEN (N32_USBHS_BASE + N32_USBHS_DAEPINTEN_OFF) +#define N32_USBHS_DTHRCTRL (N32_USBHS_BASE + N32_USBHS_DTHRCTRL_OFF) +#define N32_USBHS_DINEPFEINTEN (N32_USBHS_BASE + N32_USBHS_DINEPFEINTEN_OFF) + +/* Device IN/OUT endpoint registers */ + +#define N32_USBHS_DINEPCTRL(n) (N32_USBHS_BASE + N32_USBHS_DINEPCTRL_OFF(n)) +#define N32_USBHS_DINEPINTSTS(n) (N32_USBHS_BASE + N32_USBHS_DINEPINTSTS_OFF(n)) +#define N32_USBHS_DINEPTXSIZ(n) (N32_USBHS_BASE + N32_USBHS_DINEPTXSIZ_OFF(n)) +#define N32_USBHS_DINEPTXFSTS(n) (N32_USBHS_BASE + N32_USBHS_DINEPTXFSTS_OFF(n)) +#define N32_USBHS_DOUTEPCTRL(n) (N32_USBHS_BASE + N32_USBHS_DOUTEPCTRL_OFF(n)) +#define N32_USBHS_DOUTEPINTSTS(n) (N32_USBHS_BASE + N32_USBHS_DOUTEPINTSTS_OFF(n)) +#define N32_USBHS_DOUTEPTXSIZ(n) (N32_USBHS_BASE + N32_USBHS_DOUTEPTXSIZ_OFF(n)) + +/* Power and clock gating control register */ + +#define N32_USBHS_PWRCTRL (N32_USBHS_BASE + N32_USBHS_PWRCTRL_OFF) +#define N32_USBHS_PWRCTRL1 (N32_USBHS_BASE + N32_USBHS_PWRCTRL1_OFF) + +/* Wrapper Registers */ +#define N32_USBHS_WRPCTRL (N32_USBHS_WRAPPER_BASE + N32_USBHS_WRPCTRL_OFF) +#define N32_USBHS_WRPCFG (N32_USBHS_WRAPPER_BASE + N32_USBHS_WRPCFG_OFF) + +/* N32H7 MOD: + * Data FIFO access (push/pop) addresses. The Synopsys-compatible core + * maps one 4Kb FIFO debug/push-pop region per endpoint (device mode) or + * per host channel starting at offset 0x1000. hardware/n32h7_usbhs.h + * does not carry FIFO window definitions, so they are provided here. + */ + +#define N32_USBHS_DFIFO_DEP(n) (N32_USBHS_BASE + 0x1000UL + \ + ((uint32_t)(n) << 12)) +#define N32_USBHS_DFIFO_HCH(n) (N32_USBHS_BASE + 0x1000UL + \ + ((uint32_t)(n) << 12)) + +/**************************************************************************** + * Inline Functions + ****************************************************************************/ + +#ifndef __ASSEMBLY__ + +/**************************************************************************** + * Name: n32_usbhs_enableclock + * + * Description: + * Enable the AHB clock of the USBHS instance selected by the including + * driver file (via N32_USBHS_BASE) and un-gate the USBHS core memory + * power. + * + * N32H7 MOD: + * Replaces the STM32 RCC OTG clock enable. Per n32h76x_rcc.h the + * USBHS1 core clock is RCC_AHB2EN1_M7USB1EN and the USBHS2 core clock + * is RCC_AHB1EN1_M7USB2EN. The USBHS core memory power gate is + * controlled through N32_PWR_IP_MEMPWR_CR (PWR_IPMEMCTRL_USBx_PGEN); + * there is no USB voltage regulator / VDD33 detector as on STM32H7 + * (PWR_CR3_USBREGEN / PWR_CR3_USB33DEN do not exist on N32H76x). + * + * Defined static inline in this header so that both n32_usbhsdev.c and + * n32_usbhshost.c can use it without duplicate symbols when device and + * host roles are enabled on different instances in the same build. + * + ****************************************************************************/ + +static inline void n32_usbhs_enableclock(void) +{ + uint32_t regval; + + /* Enable the USBHS core memory power gate and wait until ready */ + + if (N32_USBHS_BASE == N32_USBCTRL1_BASE) + { + /* Enable the HSC1 Power Gate */ + + regval = getreg32(N32_PWR_SYS_PWR_CR3); + regval |= PWR_SYSCTRL3_HSC1_PGEN; + putreg32(regval, N32_PWR_SYS_PWR_CR3); + + while ((getreg32(N32_PWR_SYS_PWR_CR3) & + PWR_SYSCTRL3_HSC1_PWRRDY) == 0); + + regval = getreg32(N32_PWR_SYS_PWR_CR3); + regval |= (PWR_SYSCTRL3_HSC1_FUCEN | PWR_SYSCTRL3_HSC1_ISNEN); + putreg32(regval, N32_PWR_SYS_PWR_CR3); + + /* Enable the USBHS1 peripheral clock */ + + regval = getreg32(N32_RCC_AHB2EN1); + regval |= RCC_AHB2EN1_M7USB1EN; + putreg32(regval, N32_RCC_AHB2EN1); + + regval = getreg32(N32_PWR_IP_MEMPWR_CR); + regval &= ~PWR_IPMEMCTRL_USB1_PGEN; + putreg32(regval, N32_PWR_IP_MEMPWR_CR); + + while ((getreg32(N32_PWR_IP_MEMPWR_CSR) & + PWR_IPMEMSTS_USB1_PRDY) == 0); + + /* Reset the USBHS1 core */ + + regval = getreg32(N32_RCC_AHB2RST1); + regval |= RCC_AHB2RST1_USB1RST; + putreg32(regval, N32_RCC_AHB2RST1); + regval &= ~RCC_AHB2RST1_USB1RST; + putreg32(regval, N32_RCC_AHB2RST1); + } + else + { + /* Enable the HSC2 Power Gate */ + + regval = getreg32(N32_PWR_SYS_PWR_CR3); + regval |= PWR_SYSCTRL3_HSC2_PGEN; + putreg32(regval, N32_PWR_SYS_PWR_CR3); + + while ((getreg32(N32_PWR_SYS_PWR_CR3) & + PWR_SYSCTRL3_HSC2_PWRRDY) == 0); + + regval = getreg32(N32_PWR_SYS_PWR_CR3); + regval |= (PWR_SYSCTRL3_HSC2_FUCEN | PWR_SYSCTRL3_HSC2_ISNEN); + putreg32(regval, N32_PWR_SYS_PWR_CR3); + + /* Enable the USBHS2 peripheral clock */ + + regval = getreg32(N32_RCC_AHB1EN1); + regval |= RCC_AHB1EN1_M7USB2EN; + putreg32(regval, N32_RCC_AHB1EN1); + + regval = getreg32(N32_PWR_IP_MEMPWR_CR); + regval &= ~PWR_IPMEMCTRL_USB2_PGEN; + putreg32(regval, N32_PWR_IP_MEMPWR_CR); + + while ((getreg32(N32_PWR_IP_MEMPWR_CSR) & + PWR_IPMEMSTS_USB2_PRDY) == 0); + + /* Reset the USBHS2 core */ + + regval = getreg32(N32_RCC_AHB1RST1); + regval |= RCC_AHB1RST1_USB2RST; + putreg32(regval, N32_RCC_AHB1RST1); + regval &= ~RCC_AHB1RST1_USB2RST; + putreg32(regval, N32_RCC_AHB1RST1); + } +} + +/**************************************************************************** + * Name: n32_usbhs_disableclock + * + * Description: + * Disable the AHB clock of the USBHS instance selected by the including + * driver file and gate the USBHS core memory power. + ****************************************************************************/ + +static inline void n32_usbhs_disableclock(void) +{ + uint32_t regval; + + if (N32_USBHS_BASE == N32_USBCTRL1_BASE) + { + regval = getreg32(N32_RCC_AHB2EN1); + regval &= ~RCC_AHB2EN1_M7USB1EN; + putreg32(regval, N32_RCC_AHB2EN1); + + regval = getreg32(N32_PWR_IP_MEMPWR_CR); + regval |= PWR_IPMEMCTRL_USB1_PGEN; + putreg32(regval, N32_PWR_IP_MEMPWR_CR); + } + else + { + regval = getreg32(N32_RCC_AHB1EN1); + regval &= ~RCC_AHB1EN1_M7USB2EN; + putreg32(regval, N32_RCC_AHB1EN1); + + regval = getreg32(N32_PWR_IP_MEMPWR_CR); + regval |= PWR_IPMEMCTRL_USB2_PGEN; + putreg32(regval, N32_PWR_IP_MEMPWR_CR); + } +} + +/**************************************************************************** + * Name: n32_usbhs_phy_initialize + * + * Description: + * Initialize the USBHS PHY interface. + * + * N32H7 MOD: + * The N32H76x USBHS core has no on-chip HS PHY; an external ULPI PHY is + * used instead. The STM32H7 wrapper (WRPCTRL/WRPCFG) internal PHY PLL + * configuration is therefore not required and is intentionally skipped. + * The FS serial transceiver select (GCFG.PHYSEL) is only programmed by + * the drivers when the internal FS PHY configuration is selected + * (CONFIG_N32H7_USBHS_FS); for the default external ULPI configuration + * PHYSEL remains cleared. + ****************************************************************************/ + +static inline void n32_usbhs_phy_initialize(void) +{ + /* N32H7 MOD: + * External ULPI PHY is used. + * Skip internal PHY wrapper (WRPCTRL/WRPCFG) PLL configuration. + * Any board-level ULPI PHY reset is performed via n32_usbulpireset(). + */ +} + +/**************************************************************************** + * Public Function Prototypes + ****************************************************************************/ + +#undef EXTERN +#if defined(__cplusplus) +#define EXTERN extern "C" +extern "C" +{ +#else +#define EXTERN extern +#endif + +/**************************************************************************** + * Name: n32_usbhshost_initialize + * + * Description: + * Initialize USB host device controller hardware. + * + * Input Parameters: + * controller -- If the device supports more than USB host controller, then + * this identifies which controller is being initialized. Normally, + * this is just zero. + * + * Returned Value: + * And instance of the USB host interface. The controlling task should + * use this interface to (1) call the wait() method to wait for a device + * to be connected, and (2) call the enumerate() method to bind the device + * to a class driver. + * + * Assumptions: + * - This function should called in the initialization sequence in order + * to initialize the USB device functionality. + * - Class drivers should be initialized prior to calling this function. + * Otherwise, there is a race condition if the device is already connected. + * + ****************************************************************************/ + +#ifdef CONFIG_USBHOST +struct usbhost_connection_s; +struct usbhost_connection_s *n32_usbhshost_initialize(int controller); +#endif + +/**************************************************************************** + * Name: n32_usbsuspend + * + * Description: + * Board logic must provide the n32_usbsuspend logic if the USBHS + * device driver is used. This function is called whenever the USB enters + * or leaves suspend mode. This is an opportunity for the board logic to + * shutdown clocks, power, etc. while the USB is suspended. + * + ****************************************************************************/ + +struct usbdev_s; +extern void n32_usbsuspend(struct usbdev_s *dev, bool resume); + +/**************************************************************************** + * Name: n32_usbulpireset + * + * Description: + * Reset external ULPI PHY. + * + ****************************************************************************/ + +#ifndef CONFIG_N32H7_USBHS_FS +struct usbdev_s; +void n32_usbulpireset(struct usbdev_s *dev); +#endif + +/**************************************************************************** + * Name: n32_usbhs_vbusdrive + * + * Description: + * Enable/disable driving of VBUS 5V output. This function must be + * provided by each board that implements the N32H7 USBHS host interface. + * + * On-chip 5V VBUS generation is not supported. A charge pump or a basic + * power switch must be added externally to drive the 5V VBUS line; it + * can be driven by any GPIO output. When the application powers on + * VBUS using the chosen GPIO, it must also set the port power bit + * (HPCS.PPWR). + * + * Input Parameters: + * iface - For future growth to handle multiple USB host interfaces. + * Should be zero. + * enable - true: enable VBUS power; false: disable VBUS power + * + * Returned Value: + * None + * + ****************************************************************************/ + +#ifdef CONFIG_USBHOST +extern void n32_usbhs_vbusdrive(int iface, bool enable); +#endif + +#undef EXTERN +#if defined(__cplusplus) +} +#endif + +#endif /* __ASSEMBLY__ */ +#endif /* CONFIG_N32H7_USBHS1_DEV || CONFIG_N32H7_USBHS2_DEV || ... */ +#endif /* __ARCH_ARM_SRC_N32H7_N32_USBHS_H */ diff --git a/arch/arm/src/n32h7/n32_usbhsdev.c b/arch/arm/src/n32h7/n32_usbhsdev.c new file mode 100644 index 0000000000000..4e0dc0afda104 --- /dev/null +++ b/arch/arm/src/n32h7/n32_usbhsdev.c @@ -0,0 +1,6009 @@ +/**************************************************************************** + * arch/arm/src/n32h7/n32_usbhsdev.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include + +#include "chip.h" +#include "n32_gpio.h" +#include "arm_internal.h" + +#if defined(CONFIG_USBDEV) && (defined(CONFIG_N32H7_USBHS1_DEV) || \ + defined(CONFIG_N32H7_USBHS2_DEV)) + +/* N32_USBHS_BASE and N32_IRQ_USBHS are defined before n32_usbhs.h is + * included so that the register address macros and the static inline + * clock/PHY helpers in that header expand for the correct instance. + * The USBHS GPIO pin definitions (GPIO_USBHS_*) are provided by board.h. + */ + +#if defined(CONFIG_N32H7_USBHS1_DEV) +# define N32_IRQ_USBHS N32_IRQ_USBHS1_HS +# define N32_USBHS_BASE N32_USBCTRL1_BASE +# define N32_USBHS_WRAPPER_BASE N32_USBCTRL1_WRAPPER_BASE +# define GPIO_USBHS_DM GPIO_USBHS1_DM +# define GPIO_USBHS_DP GPIO_USBHS1_DP +#elif defined(CONFIG_N32H7_USBHS2_DEV) +# define N32_IRQ_USBHS N32_IRQ_USBHS2_HS +# define N32_USBHS_BASE N32_USBCTRL2_BASE +# define N32_USBHS_WRAPPER_BASE N32_USBCTRL2_WRAPPER_BASE +# define GPIO_USBHS_DM GPIO_USBHS2_DM +# define GPIO_USBHS_DP GPIO_USBHS2_DP +#else +# error Not selected USBDEV peripheral +#endif + +#if defined(CONFIG_N32H7_USBHS1_DEV) && defined(CONFIG_N32H7_USBHS2_DEV) +# error Only one USBDEV role supported +#endif + +/* N32H7 MOD: + * The N32H76x USBHS core has no on-chip HS PHY; an external ULPI PHY is + * the default configuration. Define CONFIG_N32H7_USBHS_FS to select the + * FS serial transceiver (GCFG.PHYSEL) instead. + */ + +#include "n32_usbhs.h" + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* Configuration ************************************************************/ + +#ifndef CONFIG_USBDEV_EP0_MAXSIZE +# define CONFIG_USBDEV_EP0_MAXSIZE 64 +#endif + +#ifndef CONFIG_USBDEV_SETUP_MAXDATASIZE +# define CONFIG_USBDEV_SETUP_MAXDATASIZE CONFIG_USBDEV_EP0_MAXSIZE +#endif + +#ifndef CONFIG_USBDEV_MAXPOWER +# define CONFIG_USBDEV_MAXPOWER 100 /* mA */ +#endif + +/* There is 4Kb of FIFO memory. The default partitions this memory + * so that there is a TxFIFO allocated for each endpoint and with more + * memory provided for the common RxFIFO. A more knowledge-able + * configuration would not allocate any TxFIFO space to OUT endpoints. + */ + +#ifndef CONFIG_USBDEV_RXFIFO_SIZE +# define CONFIG_USBDEV_RXFIFO_SIZE 512 +#endif + +#if N32_USBHS_NENDPOINTS > 0 +# ifndef CONFIG_USBDEV_EP0_TXFIFO_SIZE +# define CONFIG_USBDEV_EP0_TXFIFO_SIZE 64 +# endif +#else +# define CONFIG_USBDEV_EP0_TXFIFO_SIZE 0 +#endif + +#if N32_USBHS_NENDPOINTS > 1 +# ifndef CONFIG_USBDEV_EP1_TXFIFO_SIZE +# define CONFIG_USBDEV_EP1_TXFIFO_SIZE ((N32_USBHS_FIFO_SIZE - CONFIG_USBDEV_RXFIFO_SIZE - CONFIG_USBDEV_EP0_TXFIFO_SIZE)/(N32_USBHS_NENDPOINTS-1)) +# endif +#else +# define CONFIG_USBDEV_EP1_TXFIFO_SIZE 0 +#endif + +#if N32_USBHS_NENDPOINTS > 2 +# ifndef CONFIG_USBDEV_EP2_TXFIFO_SIZE +# define CONFIG_USBDEV_EP2_TXFIFO_SIZE ((N32_USBHS_FIFO_SIZE - CONFIG_USBDEV_RXFIFO_SIZE - CONFIG_USBDEV_EP0_TXFIFO_SIZE)/(N32_USBHS_NENDPOINTS-1)) +# endif +#else +# define CONFIG_USBDEV_EP2_TXFIFO_SIZE 0 +#endif + +#if N32_USBHS_NENDPOINTS > 3 +# ifndef CONFIG_USBDEV_EP3_TXFIFO_SIZE +# define CONFIG_USBDEV_EP3_TXFIFO_SIZE ((N32_USBHS_FIFO_SIZE - CONFIG_USBDEV_RXFIFO_SIZE - CONFIG_USBDEV_EP0_TXFIFO_SIZE)/(N32_USBHS_NENDPOINTS-1)) +# endif +#else +# define CONFIG_USBDEV_EP3_TXFIFO_SIZE 0 +#endif + +#if N32_USBHS_NENDPOINTS > 4 +# ifndef CONFIG_USBDEV_EP4_TXFIFO_SIZE +# define CONFIG_USBDEV_EP4_TXFIFO_SIZE ((N32_USBHS_FIFO_SIZE - CONFIG_USBDEV_RXFIFO_SIZE - CONFIG_USBDEV_EP0_TXFIFO_SIZE)/(N32_USBHS_NENDPOINTS-1)) +# endif +#else +# define CONFIG_USBDEV_EP4_TXFIFO_SIZE 0 +#endif + +#if N32_USBHS_NENDPOINTS > 5 +# ifndef CONFIG_USBDEV_EP5_TXFIFO_SIZE +# define CONFIG_USBDEV_EP5_TXFIFO_SIZE ((N32_USBHS_FIFO_SIZE - CONFIG_USBDEV_RXFIFO_SIZE - CONFIG_USBDEV_EP0_TXFIFO_SIZE)/(N32_USBHS_NENDPOINTS-1)) +# endif +#else +# define CONFIG_USBDEV_EP5_TXFIFO_SIZE 0 +#endif + +#if N32_USBHS_NENDPOINTS > 6 +# ifndef CONFIG_USBDEV_EP6_TXFIFO_SIZE +# define CONFIG_USBDEV_EP6_TXFIFO_SIZE ((N32_USBHS_FIFO_SIZE - CONFIG_USBDEV_RXFIFO_SIZE - CONFIG_USBDEV_EP0_TXFIFO_SIZE)/(N32_USBHS_NENDPOINTS-1)) +# endif +#else +# define CONFIG_USBDEV_EP6_TXFIFO_SIZE 0 +#endif + +#if N32_USBHS_NENDPOINTS > 7 +# ifndef CONFIG_USBDEV_EP7_TXFIFO_SIZE +# define CONFIG_USBDEV_EP7_TXFIFO_SIZE ((N32_USBHS_FIFO_SIZE - CONFIG_USBDEV_RXFIFO_SIZE - CONFIG_USBDEV_EP0_TXFIFO_SIZE)/(N32_USBHS_NENDPOINTS-1)) +# endif +#else +# define CONFIG_USBDEV_EP7_TXFIFO_SIZE 0 +#endif + +#if N32_USBHS_NENDPOINTS > 8 +# ifndef CONFIG_USBDEV_EP8_TXFIFO_SIZE +# define CONFIG_USBDEV_EP8_TXFIFO_SIZE ((N32_USBHS_FIFO_SIZE - CONFIG_USBDEV_RXFIFO_SIZE - CONFIG_USBDEV_EP0_TXFIFO_SIZE)/(N32_USBHS_NENDPOINTS-1)) +# endif +#else +# define CONFIG_USBDEV_EP8_TXFIFO_SIZE 0 +#endif + +/* The actual FIFO addresses that we use must be aligned to 4-byte + * boundaries; FIFO sizes must be provided in units of 32-bit words. + */ + +#define N32_RXFIFO_BYTES ((CONFIG_USBDEV_RXFIFO_SIZE + 3) & ~3) +#define N32_RXFIFO_WORDS ((CONFIG_USBDEV_RXFIFO_SIZE + 3) >> 2) + +#define N32_EP0_TXFIFO_BYTES ((CONFIG_USBDEV_EP0_TXFIFO_SIZE + 3) & ~3) +#define N32_EP0_TXFIFO_WORDS ((CONFIG_USBDEV_EP0_TXFIFO_SIZE + 3) >> 2) + +#define N32_EP1_TXFIFO_BYTES ((CONFIG_USBDEV_EP1_TXFIFO_SIZE + 3) & ~3) +#define N32_EP1_TXFIFO_WORDS ((CONFIG_USBDEV_EP1_TXFIFO_SIZE + 3) >> 2) + +#define N32_EP2_TXFIFO_BYTES ((CONFIG_USBDEV_EP2_TXFIFO_SIZE + 3) & ~3) +#define N32_EP2_TXFIFO_WORDS ((CONFIG_USBDEV_EP2_TXFIFO_SIZE + 3) >> 2) + +#define N32_EP3_TXFIFO_BYTES ((CONFIG_USBDEV_EP3_TXFIFO_SIZE + 3) & ~3) +#define N32_EP3_TXFIFO_WORDS ((CONFIG_USBDEV_EP3_TXFIFO_SIZE + 3) >> 2) + +#define N32_EP4_TXFIFO_BYTES ((CONFIG_USBDEV_EP4_TXFIFO_SIZE + 3) & ~3) +#define N32_EP4_TXFIFO_WORDS ((CONFIG_USBDEV_EP4_TXFIFO_SIZE + 3) >> 2) + +#define N32_EP5_TXFIFO_BYTES ((CONFIG_USBDEV_EP5_TXFIFO_SIZE + 3) & ~3) +#define N32_EP5_TXFIFO_WORDS ((CONFIG_USBDEV_EP5_TXFIFO_SIZE + 3) >> 2) + +#define N32_EP6_TXFIFO_BYTES ((CONFIG_USBDEV_EP6_TXFIFO_SIZE + 3) & ~3) +#define N32_EP6_TXFIFO_WORDS ((CONFIG_USBDEV_EP6_TXFIFO_SIZE + 3) >> 2) + +#define N32_EP7_TXFIFO_BYTES ((CONFIG_USBDEV_EP7_TXFIFO_SIZE + 3) & ~3) +#define N32_EP7_TXFIFO_WORDS ((CONFIG_USBDEV_EP7_TXFIFO_SIZE + 3) >> 2) + +#define N32_EP8_TXFIFO_BYTES ((CONFIG_USBDEV_EP8_TXFIFO_SIZE + 3) & ~3) +#define N32_EP8_TXFIFO_WORDS ((CONFIG_USBDEV_EP8_TXFIFO_SIZE + 3) >> 2) + +#if (N32_RXFIFO_BYTES + \ + N32_EP0_TXFIFO_BYTES + N32_EP1_TXFIFO_BYTES + N32_EP2_TXFIFO_BYTES + N32_EP3_TXFIFO_BYTES + \ + N32_EP4_TXFIFO_BYTES + N32_EP5_TXFIFO_BYTES + N32_EP6_TXFIFO_BYTES + N32_EP7_TXFIFO_BYTES + CONFIG_USBDEV_EP8_TXFIFO_SIZE \ + ) > N32_USBHS_FIFO_SIZE +# error "FIFO allocations exceed FIFO memory size" +#endif + +/* Driver-private constants ************************************************* + * + * N32H7 MOD: + * The following constants have no counterpart in hardware/n32h7_usbhs.h + * (the hardware header provides only the field SHIFT/MASK). They are + * driver-internal encodings used by the ported core logic, private to + * this file. + */ + +/* Device configuration (DCFG) device speed field values: + * 00: High speed (external ULPI HS PHY) + * 01: Full speed + */ + +#define N32_USBHS_DCFG_DEVSPD_HS (0UL << N32_USBHS_DCFG_DEVSPD_SHIFT) +#define N32_USBHS_DCFG_DEVSPD_FS (1UL << N32_USBHS_DCFG_DEVSPD_SHIFT) + +/* Endpoint type values (unshifted, driver-internal encoding; matches the + * DINEPCTRL/DOUTEPCTRL EPTYPE field encoding) + */ + +#define N32_USBHS_EPTYPE_CTRL 0 +#define N32_USBHS_EPTYPE_ISOC 1 +#define N32_USBHS_EPTYPE_BULK 2 +#define N32_USBHS_EPTYPE_INTR 3 + +/* Data PID values (unshifted; matches the DINEPTXSIZ PID field encoding) */ + +#define N32_USBHS_PID_DATA0 0 +#define N32_USBHS_PID_DATA1 2 +#define N32_USBHS_PID_SETUP 3 + +/* Test mode values (unshifted; matches the DCTRL test mode field encoding) */ + +#define N32_USBHS_TESTMODE_DISABLED 0 +#define N32_USBHS_TESTMODE_J 1 +#define N32_USBHS_TESTMODE_K 2 +#define N32_USBHS_TESTMODE_SE0_NAK 3 +#define N32_USBHS_TESTMODE_PACKET 4 +#define N32_USBHS_TESTMODE_FORCE 5 + +/* GCFG turnaround time helper (TRDTIM field, AHB clock turnaround) */ + +#define N32_USBHS_GCFG_TRDTIM(n) ((uint32_t)(n) << N32_USBHS_GCFG_TRDTIM_SHIFT) + +/* GRSTCTRL TxFIFO number helpers */ + +#define N32_USBHS_GRSTCTRL_TXFNUM_D(n) \ + ((uint32_t)(n) << N32_USBHS_GRSTCTRL_TXFNUM_SHIFT) +#define N32_USBHS_GRSTCTRL_TXFNUM_DALL \ + (0x10UL << N32_USBHS_GRSTCTRL_TXFNUM_SHIFT) + +/* Device all-endpoints interrupt helpers (DAEPINTSTS/DAEPINTEN) */ + +#define N32_USBHS_DAINT_IEP(n) (1UL << (n)) +#define N32_USBHS_DAINT_IEP_MASK N32_USBHS_DAEPINTSTS_INEPINT_MASK +#define N32_USBHS_DAINT_OEP(n) (1UL << ((n) + 16)) +#define N32_USBHS_DAINT_OEP_SHIFT N32_USBHS_DAEPINTSTS_OUTEPINT_SHIFT +#define N32_USBHS_DAINT_OEP_MASK N32_USBHS_DAEPINTSTS_OUTEPINT_MASK + +/* IN endpoint TxFIFO empty interrupt enable helper (DINEPFEINTEN) */ + +#define N32_USBHS_DINEPFEINTEN_IEP(n) (1UL << (n)) + +/* Device status (DSTS) frame number helpers */ + +#define N32_USBHS_DSTS_SOFFN0 (1UL << N32_USBHS_DSTS_SOFFN_SHIFT) +#define N32_USBHS_DSTS_SOFFN_EVEN (0) + +/* N32H7 MOD: + * The N32 USBHS core has no LPM interrupt; the corresponding bit was + * dropped from the read/clear-to-write-one mask. Bit 30 (VBUS valid / + * session request) is named only on the enable side in + * hardware/n32h7_usbhs.h; the same bit position in GINTSTS is + * write-1-to-clear. + */ + +#define N32_USBHS_GINT_RC_W1 (N32_USBHS_GINTSTS_MODMISIF | \ + N32_USBHS_GINTSTS_SOFIF | \ + N32_USBHS_GINTSTS_ESUSPIF | \ + N32_USBHS_GINTSTS_USBSUSPIF | \ + N32_USBHS_GINTSTS_USBRSTIF | \ + N32_USBHS_GINTSTS_ENUMDIF | \ + N32_USBHS_GINTSTS_ISOUTPDIF | \ + N32_USBHS_GINTSTS_EOPFIF | \ + N32_USBHS_GINTSTS_ISOINCIF | \ + N32_USBHS_GINTSTS_PTNCIF_ISOUTNCIF | \ + N32_USBHS_GINTSTS_RSTDIF | \ + N32_USBHS_GINTSTS_IDSTSCIF | \ + N32_USBHS_GINTSTS_DISCIF | \ + N32_USBHS_GINTEN_VBUSVIF | \ + N32_USBHS_GINTSTS_WKUPIF) + +/* Reserved (read-only / write-ignored) bits of GINTSTS that must be + * preserved when acknowledging interrupts. + */ + +#define N32_USBHS_GINT_RESERVED ((1UL << 8) | (1UL << 9) | \ + (1UL << 16) | (1UL << 17) | \ + (1UL << 27)) + +/* Debug ********************************************************************/ + +/* Trace error codes */ + +#define N32_TRACEERR_ALLOCFAIL 0x01 +#define N32_TRACEERR_BADCLEARFEATURE 0x02 +#define N32_TRACEERR_BADDEVGETSTATUS 0x03 +#define N32_TRACEERR_BADEPNO 0x04 +#define N32_TRACEERR_BADEPGETSTATUS 0x05 +#define N32_TRACEERR_BADGETCONFIG 0x06 +#define N32_TRACEERR_BADGETSETDESC 0x07 +#define N32_TRACEERR_BADGETSTATUS 0x08 +#define N32_TRACEERR_BADSETADDRESS 0x09 +#define N32_TRACEERR_BADSETCONFIG 0x0a +#define N32_TRACEERR_BADSETFEATURE 0x0b +#define N32_TRACEERR_BADTESTMODE 0x0c +#define N32_TRACEERR_BINDFAILED 0x0d +#define N32_TRACEERR_DISPATCHSTALL 0x0e +#define N32_TRACEERR_DRIVER 0x0f +#define N32_TRACEERR_DRIVERREGISTERED 0x10 +#define N32_TRACEERR_EP0NOSETUP 0x11 +#define N32_TRACEERR_EP0SETUPSTALLED 0x12 +#define N32_TRACEERR_EPINNULLPACKET 0x13 +#define N32_TRACEERR_EPINUNEXPECTED 0x14 +#define N32_TRACEERR_EPOUTNULLPACKET 0x15 +#define N32_TRACEERR_EPOUTUNEXPECTED 0x16 +#define N32_TRACEERR_INVALIDCTRLREQ 0x17 +#define N32_TRACEERR_INVALIDPARMS 0x18 +#define N32_TRACEERR_IRQREGISTRATION 0x19 +#define N32_TRACEERR_NOEP 0x1a +#define N32_TRACEERR_NOTCONFIGURED 0x1b +#define N32_TRACEERR_EPOUTQEMPTY 0x1c +#define N32_TRACEERR_EPINREQEMPTY 0x1d +#define N32_TRACEERR_NOOUTSETUP 0x1e +#define N32_TRACEERR_POLLTIMEOUT 0x1f + +/* Trace interrupt codes */ + +#define N32_TRACEINTID_USB 1 /* USB Interrupt entry/exit */ +#define N32_TRACEINTID_INTPENDING 2 /* On each pass through the loop */ + +#define N32_TRACEINTID_EPOUT (10 + 0) /* First level interrupt decode */ +#define N32_TRACEINTID_EPIN (10 + 1) +#define N32_TRACEINTID_MISMATCH (10 + 2) +#define N32_TRACEINTID_WAKEUP (10 + 3) +#define N32_TRACEINTID_SUSPEND (10 + 4) +#define N32_TRACEINTID_SOF (10 + 5) +#define N32_TRACEINTID_RXFIFO (10 + 6) +#define N32_TRACEINTID_DEVRESET (10 + 7) +#define N32_TRACEINTID_ENUMDNE (10 + 8) +#define N32_TRACEINTID_IISOIXFR (10 + 9) +#define N32_TRACEINTID_IISOOXFR (10 + 10) +#define N32_TRACEINTID_SRQ (10 + 11) +#define N32_TRACEINTID_OTG (10 + 12) + +#define N32_TRACEINTID_EPOUT_XFRC (40 + 0) /* EPOUT second level decode */ +#define N32_TRACEINTID_EPOUT_EPDISD (40 + 1) +#define N32_TRACEINTID_EPOUT_SETUP (40 + 2) +#define N32_TRACEINTID_DISPATCH (40 + 3) + +#define N32_TRACEINTID_GETSTATUS (50 + 0) /* EPOUT third level decode */ +#define N32_TRACEINTID_EPGETSTATUS (50 + 1) +#define N32_TRACEINTID_DEVGETSTATUS (50 + 2) +#define N32_TRACEINTID_IFGETSTATUS (50 + 3) +#define N32_TRACEINTID_CLEARFEATURE (50 + 4) +#define N32_TRACEINTID_SETFEATURE (50 + 5) +#define N32_TRACEINTID_SETADDRESS (50 + 6) +#define N32_TRACEINTID_GETSETDESC (50 + 7) +#define N32_TRACEINTID_GETCONFIG (50 + 8) +#define N32_TRACEINTID_SETCONFIG (50 + 9) +#define N32_TRACEINTID_GETSETIF (50 + 10) +#define N32_TRACEINTID_SYNCHFRAME (50 + 11) + +#define N32_TRACEINTID_EPIN_XFRC (70 + 0) /* EPIN second level decode */ +#define N32_TRACEINTID_EPIN_TOC (70 + 1) +#define N32_TRACEINTID_EPIN_ITTXFE (70 + 2) +#define N32_TRACEINTID_EPIN_EPDISD (70 + 3) +#define N32_TRACEINTID_EPIN_TXFE (70 + 4) + +#define N32_TRACEINTID_EPIN_EMPWAIT (80 + 0) /* EPIN second level decode */ + +#define N32_TRACEINTID_OUTNAK (90 + 0) /* RXFLVL second level decode */ +#define N32_TRACEINTID_OUTRECVD (90 + 1) +#define N32_TRACEINTID_OUTDONE (90 + 2) +#define N32_TRACEINTID_SETUPDONE (90 + 3) +#define N32_TRACEINTID_SETUPRECVD (90 + 4) + +/* Endpoints ****************************************************************/ + +/* Odd physical endpoint numbers are IN; even are OUT */ + +#define N32_EPPHYIN2LOG(epphy) ((uint8_t)(epphy)|USB_DIR_IN) +#define N32_EPPHYOUT2LOG(epphy) ((uint8_t)(epphy)|USB_DIR_OUT) + +/* Endpoint 0 */ + +#define EP0 (0) + +/* The set of all endpoints available to the class implementation (1-7) */ + +#define N32_EP_AVAILABLE (0xfe) /* All available endpoints */ + +/* Maximum packet sizes for full speed endpoints */ + +#define N32_MAXPACKET (64) /* Max packet size (1-64) */ + +/* Delays *******************************************************************/ + +#define N32_READY_DELAY 200000 +#define N32_FLUSH_DELAY 200000 + +/* Request queue operations *************************************************/ + +#define n32_rqempty(ep) ((ep)->head == NULL) +#define n32_rqpeek(ep) ((ep)->head) + +/**************************************************************************** + * Private Types + ****************************************************************************/ + +/* Overall device state */ + +enum n32_devstate_e +{ + DEVSTATE_DEFAULT = 0, /* Power-up, unconfigured state. This state simply + * means that the device is not yet been given an + * address. + * SET: At initialization, uninitialization, + * reset, and whenever the device address + * is set to zero + * TESTED: Never + */ + DEVSTATE_ADDRESSED, /* Device address has been assigned, not no + * configuration has yet been selected. + * SET: When either a non-zero device address + * is first assigned or when the device + * is unconfigured (with configuration == 0) + * TESTED: never + */ + DEVSTATE_CONFIGURED, /* Address assigned and configured: + * SET: When the device has been addressed and + * an non-zero configuration has been selected. + * TESTED: In many places to assure that the USB device + * has been properly configured by the host. + */ +}; + +/* Endpoint 0 states */ + +enum n32_ep0state_e +{ + EP0STATE_IDLE = 0, /* Idle State, leave on receiving a SETUP packet or + * epsubmit: + * SET: In n32_epin() and n32_epout() when + * we revert from request processing to + * SETUP processing. + * TESTED: Never + */ + EP0STATE_SETUP_OUT, /* OUT SETUP packet received. Waiting for the DATA + * OUT phase of SETUP Packet to complete before + * processing a SETUP command (without a USB request): + * SET: Set in n32_rxinterrupt() when SETUP OUT + * packet is received. + * TESTED: In n32_ep0out_receive() + */ + EP0STATE_SETUP_READY, /* IN SETUP packet received -OR- OUT SETUP packet and + * accompanying data have been received. Processing + * of SETUP command will happen soon. + * SET: (1) n32_ep0out_receive() when the OUT + * SETUP data phase completes, or (2) + * n32_rxinterrupt() when an IN SETUP is + * packet received. + * TESTED: Tested in n32_epout_interrupt() when + * SETUP phase is done to see if the SETUP + * command is ready to be processed. Also + * tested in n32_ep0out_setup() just to + * double-check that we have a SETUP request + * and any accompanying data. + */ + EP0STATE_SETUP_PROCESS, /* SETUP Packet is being processed by n32_ep0out_setup(): + * SET: When SETUP packet received in EP0 OUT + * TESTED: Never + */ + EP0STATE_SETUPRESPONSE, /* Short SETUP response write (without a USB request): + * SET: When SETUP response is sent by + * n32_ep0in_setupresponse() + * TESTED: Never + */ + EP0STATE_DATA_IN, /* Waiting for data out stage (with a USB request): + * SET: In n32_epin_request() when a write + * request is processed on EP0. + * TESTED: In n32_epin() to see if we should + * revert to SETUP processing. + */ + EP0STATE_DATA_OUT /* Waiting for data in phase to complete ( with a + * USB request) + * SET: In n32_epout_request() when a read + * request is processed on EP0. + * TESTED: In n32_epout() to see if we should + * revert to SETUP processing + */ +}; + +/* Parsed control request */ + +struct n32_ctrlreq_s +{ + uint8_t type; + uint8_t req; + uint16_t value; + uint16_t index; + uint16_t len; +}; + +/* A container for a request so that the request may be retained in a list */ + +struct n32_req_s +{ + struct usbdev_req_s req; /* Standard USB request */ + struct n32_req_s *flink; /* Supports a singly linked list */ +}; + +/* This is the internal representation of an endpoint */ + +struct n32_ep_s +{ + /* Common endpoint fields. This must be the first thing defined in the + * structure so that it is possible to simply cast from struct usbdev_ep_s + * to struct n32_ep_s. + */ + + struct usbdev_ep_s ep; /* Standard endpoint structure */ + + /* N32-specific fields */ + + struct n32_usbdev_s *dev; /* Reference to private driver data */ + struct n32_req_s *head; /* Request list for this endpoint */ + struct n32_req_s *tail; + uint8_t epphy; /* Physical EP address */ + uint8_t eptype:2; /* Endpoint type */ + uint8_t active:1; /* 1: A request is being processed */ + uint8_t stalled:1; /* 1: Endpoint is stalled */ + uint8_t isin:1; /* 1: IN Endpoint */ + uint8_t odd:1; /* 1: Odd frame */ + uint8_t zlp:1; /* 1: Transmit a zero-length-packet (IN EPs only) */ +}; + +/* This structure retains the state of the USB device controller */ + +struct n32_usbdev_s +{ + /* Common device fields. This must be the first thing defined in the + * structure so that it is possible to simply cast from struct usbdev_s + * to struct n32_usbdev_s. + */ + + struct usbdev_s usbdev; + + /* The bound device class driver */ + + struct usbdevclass_driver_s *driver; + + /* N32-specific fields */ + + uint8_t stalled:1; /* 1: Protocol stalled */ + uint8_t selfpowered:1; /* 1: Device is self powered */ + uint8_t addressed:1; /* 1: Peripheral address has been set */ + uint8_t configured:1; /* 1: Class driver has been configured */ + uint8_t wakeup:1; /* 1: Device remote wake-up */ + uint8_t dotest:1; /* 1: Test mode selected */ + + uint8_t devstate:4; /* See enum n32_devstate_e */ + uint8_t ep0state:4; /* See enum n32_ep0state_e */ + uint8_t testmode:4; /* Selected test mode */ + uint8_t epavail[2]; /* Bitset of available OUT/IN endpoints */ + + /* E0 SETUP data buffering. + * + * ctrlreq: + * The 8-byte SETUP request is received on the EP0 OUT endpoint and is + * saved. + * + * ep0data + * For OUT SETUP requests, the SETUP data phase must also complete before + * the SETUP command can be processed. The pack receipt logic will save + * the accompanying EP0 IN data in ep0data[] before the SETUP command is + * processed. + * + * For IN SETUP requests, the DATA phase will occur AFTER the SETUP + * control request is processed. In that case, ep0data[] may be used as + * the response buffer. + * + * ep0datlen + * Length of OUT DATA received in ep0data[] (Not used with OUT data) + */ + + struct usb_ctrlreq_s ctrlreq; + uint8_t ep0data[CONFIG_USBDEV_SETUP_MAXDATASIZE]; + uint16_t ep0datlen; + + /* The endpoint lists */ + + struct n32_ep_s epin[N32_USBHS_NENDPOINTS]; + struct n32_ep_s epout[N32_USBHS_NENDPOINTS]; +}; + +/**************************************************************************** + * Private Function Prototypes + ****************************************************************************/ + +/* Register operations ******************************************************/ + +#if defined(CONFIG_N32_USBDEV_REGDEBUG) && defined(CONFIG_DEBUG_FEATURES) +static uint32_t n32_getreg(uint32_t addr); +static void n32_putreg(uint32_t val, uint32_t addr); +#else +# define n32_getreg(addr) getreg32(addr) +# define n32_putreg(val,addr) putreg32(val,addr) +#endif + +/* Request queue operations *************************************************/ + +static struct n32_req_s *n32_req_remfirst(struct n32_ep_s *privep); +static bool n32_req_addlast(struct n32_ep_s *privep, + struct n32_req_s *req); + +/* Low level data transfers and request operations **************************/ + +/* Special endpoint 0 data transfer logic */ + +static void n32_ep0in_setupresponse(struct n32_usbdev_s *priv, + uint8_t *data, uint32_t nbytes); +static inline void n32_ep0in_transmitzlp(struct n32_usbdev_s *priv); +static void n32_ep0in_activate(void); + +static void n32_ep0out_ctrlsetup(struct n32_usbdev_s *priv); + +/* IN request and TxFIFO handling */ + +static void n32_txfifo_write(struct n32_ep_s *privep, + uint8_t *buf, int nbytes); +static void n32_epin_transfer(struct n32_ep_s *privep, + uint8_t *buf, int nbytes); +static void n32_epin_request(struct n32_usbdev_s *priv, + struct n32_ep_s *privep); + +/* OUT request and RxFIFO handling */ + +static void n32_rxfifo_read(struct n32_ep_s *privep, + uint8_t *dest, uint16_t len); +static void n32_rxfifo_discard(struct n32_ep_s *privep, + int len); +static void n32_epout_complete(struct n32_usbdev_s *priv, + struct n32_ep_s *privep); +static inline void n32_ep0out_receive(struct n32_ep_s *privep, + int bcnt); +static inline void n32_epout_receive(struct n32_ep_s *privep, + int bcnt); +static void n32_epout_request(struct n32_usbdev_s *priv, + struct n32_ep_s *privep); + +/* General request handling */ + +static void n32_ep_flush(struct n32_ep_s *privep); +static void n32_req_complete(struct n32_ep_s *privep, + int16_t result); +static void n32_req_cancel(struct n32_ep_s *privep, + int16_t status); + +/* Interrupt handling *******************************************************/ + +static struct +n32_ep_s *n32_ep_findbyaddr(struct n32_usbdev_s *priv, + uint16_t eplog); +static int n32_req_dispatch(struct n32_usbdev_s *priv, + const struct usb_ctrlreq_s *ctrl); +static void n32_usbreset(struct n32_usbdev_s *priv); + +/* Second level OUT endpoint interrupt processing */ + +static inline void n32_ep0out_testmode(struct n32_usbdev_s *priv, + uint16_t index); +static inline void n32_ep0out_stdrequest(struct n32_usbdev_s *priv, + struct n32_ctrlreq_s *ctrlreq); +static inline void n32_ep0out_setup(struct n32_usbdev_s *priv); +static inline void n32_epout(struct n32_usbdev_s *priv, + uint8_t epno); +static inline void n32_epout_interrupt(struct n32_usbdev_s *priv); + +/* Second level IN endpoint interrupt processing */ + +static inline void n32_epin_runtestmode(struct n32_usbdev_s *priv); +static inline void n32_epin(struct n32_usbdev_s *priv, uint8_t epno); +static inline void n32_epin_txfifoempty(struct n32_usbdev_s *priv, + int epno); +static inline void n32_epin_interrupt(struct n32_usbdev_s *priv); + +/* Other second level interrupt processing */ + +static inline void n32_resumeinterrupt(struct n32_usbdev_s *priv); +static inline void n32_suspendinterrupt(struct n32_usbdev_s *priv); +static inline void n32_rxinterrupt(struct n32_usbdev_s *priv); +static inline void n32_enuminterrupt(struct n32_usbdev_s *priv); +#ifdef CONFIG_USBDEV_ISOCHRONOUS +static inline void n32_isocininterrupt(struct n32_usbdev_s *priv); +static inline void n32_isocoutinterrupt(struct n32_usbdev_s *priv); +#endif +#ifdef CONFIG_USBDEV_VBUSSENSING +static inline void n32_sessioninterrupt(struct n32_usbdev_s *priv); +static inline void n32_otginterrupt(struct n32_usbdev_s *priv); +#endif + +/* First level interrupt processing */ + +static int n32_usbinterrupt(int irq, void *context, + void *arg); + +/* Endpoint operations ******************************************************/ + +/* Global OUT NAK controls */ + +static void n32_enablegonak(struct n32_ep_s *privep); +static void n32_disablegonak(struct n32_ep_s *privep); + +/* Endpoint configuration */ + +static int n32_epout_configure(struct n32_ep_s *privep, + uint8_t eptype, uint16_t maxpacket); +static int n32_epin_configure(struct n32_ep_s *privep, + uint8_t eptype, uint16_t maxpacket); +static int n32_ep_configure(struct usbdev_ep_s *ep, + const struct usb_epdesc_s *desc, bool last); +static void n32_ep0_configure(struct n32_usbdev_s *priv); + +/* Endpoint disable */ + +static void n32_epout_disable(struct n32_ep_s *privep); +static void n32_epin_disable(struct n32_ep_s *privep); +static int n32_ep_disable(struct usbdev_ep_s *ep); + +/* Endpoint request management */ + +static struct usbdev_req_s *n32_ep_allocreq(struct usbdev_ep_s *ep); +static void n32_ep_freereq(struct usbdev_ep_s *ep, + struct usbdev_req_s *); + +/* Endpoint buffer management */ + +#ifdef CONFIG_USBDEV_DMA +static void *n32_ep_allocbuffer(struct usbdev_ep_s *ep, + unsigned bytes); +static void n32_ep_freebuffer(struct usbdev_ep_s *ep, + void *buf); +#endif + +/* Endpoint request submission */ + +static int n32_ep_submit(struct usbdev_ep_s *ep, + struct usbdev_req_s *req); + +/* Endpoint request cancellation */ + +static int n32_ep_cancel(struct usbdev_ep_s *ep, + struct usbdev_req_s *req); + +/* Stall handling */ + +static int n32_epout_setstall(struct n32_ep_s *privep); +static int n32_epin_setstall(struct n32_ep_s *privep); +static int n32_ep_setstall(struct n32_ep_s *privep); +static int n32_ep_clrstall(struct n32_ep_s *privep); +static int n32_ep_stall(struct usbdev_ep_s *ep, bool resume); +static void n32_ep0_stall(struct n32_usbdev_s *priv); + +/* Endpoint allocation */ + +static struct usbdev_ep_s *n32_ep_alloc(struct usbdev_s *dev, + uint8_t epno, bool in, uint8_t eptype); +static void n32_ep_free(struct usbdev_s *dev, + struct usbdev_ep_s *ep); + +/* USB device controller operations *****************************************/ + +static int n32_getframe(struct usbdev_s *dev); +static int n32_wakeup(struct usbdev_s *dev); +static int n32_selfpowered(struct usbdev_s *dev, bool selfpowered); +static int n32_pullup(struct usbdev_s *dev, bool enable); +static void n32_setaddress(struct n32_usbdev_s *priv, + uint16_t address); +static int n32_txfifo_flush(uint32_t txfnum); +static int n32_rxfifo_flush(void); + +/* Initialization ***********************************************************/ + +static void n32_swinitialize(struct n32_usbdev_s *priv); +static void n32_hwinitialize(struct n32_usbdev_s *priv); + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +/* Since there is only a single USB interface, all status information can be + * be simply retained in a single global instance. + */ + +static struct n32_usbdev_s g_usbhsdev; + +static const struct usbdev_epops_s g_epops = +{ + .configure = n32_ep_configure, + .disable = n32_ep_disable, + .allocreq = n32_ep_allocreq, + .freereq = n32_ep_freereq, +#ifdef CONFIG_USBDEV_DMA + .allocbuffer = n32_ep_allocbuffer, + .freebuffer = n32_ep_freebuffer, +#endif + .submit = n32_ep_submit, + .cancel = n32_ep_cancel, + .stall = n32_ep_stall, +}; + +static const struct usbdev_ops_s g_devops = +{ + .allocep = n32_ep_alloc, + .freeep = n32_ep_free, + .getframe = n32_getframe, + .wakeup = n32_wakeup, + .selfpowered = n32_selfpowered, + .pullup = n32_pullup, +}; + +/* Device error strings that may be enabled for more descriptive USB trace + * output. + */ + +#ifdef CONFIG_USBDEV_TRACE_STRINGS +const struct trace_msg_t g_usb_trace_strings_deverror[] = +{ + TRACE_STR(N32_TRACEERR_ALLOCFAIL), + TRACE_STR(N32_TRACEERR_BADCLEARFEATURE), + TRACE_STR(N32_TRACEERR_BADDEVGETSTATUS), + TRACE_STR(N32_TRACEERR_BADEPNO), + TRACE_STR(N32_TRACEERR_BADEPGETSTATUS), + TRACE_STR(N32_TRACEERR_BADGETCONFIG), + TRACE_STR(N32_TRACEERR_BADGETSETDESC), + TRACE_STR(N32_TRACEERR_BADGETSTATUS), + TRACE_STR(N32_TRACEERR_BADSETADDRESS), + TRACE_STR(N32_TRACEERR_BADSETCONFIG), + TRACE_STR(N32_TRACEERR_BADSETFEATURE), + TRACE_STR(N32_TRACEERR_BADTESTMODE), + TRACE_STR(N32_TRACEERR_BINDFAILED), + TRACE_STR(N32_TRACEERR_DISPATCHSTALL), + TRACE_STR(N32_TRACEERR_DRIVER), + TRACE_STR(N32_TRACEERR_DRIVERREGISTERED), + TRACE_STR(N32_TRACEERR_EP0NOSETUP), + TRACE_STR(N32_TRACEERR_EP0SETUPSTALLED), + TRACE_STR(N32_TRACEERR_EPINNULLPACKET), + TRACE_STR(N32_TRACEERR_EPINUNEXPECTED), + TRACE_STR(N32_TRACEERR_EPOUTNULLPACKET), + TRACE_STR(N32_TRACEERR_EPOUTUNEXPECTED), + TRACE_STR(N32_TRACEERR_INVALIDCTRLREQ), + TRACE_STR(N32_TRACEERR_INVALIDPARMS), + TRACE_STR(N32_TRACEERR_IRQREGISTRATION), + TRACE_STR(N32_TRACEERR_NOEP), + TRACE_STR(N32_TRACEERR_NOTCONFIGURED), + TRACE_STR(N32_TRACEERR_EPOUTQEMPTY), + TRACE_STR(N32_TRACEERR_EPINREQEMPTY), + TRACE_STR(N32_TRACEERR_NOOUTSETUP), + TRACE_STR(N32_TRACEERR_POLLTIMEOUT), + TRACE_STR_END +}; +#endif + +/* Interrupt event strings that may be enabled for more descriptive USB trace + * output. + */ + +#ifdef CONFIG_USBDEV_TRACE_STRINGS +const struct trace_msg_t g_usb_trace_strings_intdecode[] = +{ + TRACE_STR(N32_TRACEINTID_USB), + TRACE_STR(N32_TRACEINTID_INTPENDING), + TRACE_STR(N32_TRACEINTID_EPOUT), + TRACE_STR(N32_TRACEINTID_EPIN), + TRACE_STR(N32_TRACEINTID_MISMATCH), + TRACE_STR(N32_TRACEINTID_WAKEUP), + TRACE_STR(N32_TRACEINTID_SUSPEND), + TRACE_STR(N32_TRACEINTID_SOF), + TRACE_STR(N32_TRACEINTID_RXFIFO), + TRACE_STR(N32_TRACEINTID_DEVRESET), + TRACE_STR(N32_TRACEINTID_ENUMDNE), + TRACE_STR(N32_TRACEINTID_IISOIXFR), + TRACE_STR(N32_TRACEINTID_IISOOXFR), + TRACE_STR(N32_TRACEINTID_SRQ), + TRACE_STR(N32_TRACEINTID_OTG), + TRACE_STR(N32_TRACEINTID_EPOUT_XFRC), + TRACE_STR(N32_TRACEINTID_EPOUT_EPDISD), + TRACE_STR(N32_TRACEINTID_EPOUT_SETUP), + TRACE_STR(N32_TRACEINTID_DISPATCH), + TRACE_STR(N32_TRACEINTID_GETSTATUS), + TRACE_STR(N32_TRACEINTID_EPGETSTATUS), + TRACE_STR(N32_TRACEINTID_DEVGETSTATUS), + TRACE_STR(N32_TRACEINTID_IFGETSTATUS), + TRACE_STR(N32_TRACEINTID_CLEARFEATURE), + TRACE_STR(N32_TRACEINTID_SETFEATURE), + TRACE_STR(N32_TRACEINTID_SETADDRESS), + TRACE_STR(N32_TRACEINTID_GETSETDESC), + TRACE_STR(N32_TRACEINTID_GETCONFIG), + TRACE_STR(N32_TRACEINTID_SETCONFIG), + TRACE_STR(N32_TRACEINTID_GETSETIF), + TRACE_STR(N32_TRACEINTID_SYNCHFRAME), + TRACE_STR(N32_TRACEINTID_EPIN_XFRC), + TRACE_STR(N32_TRACEINTID_EPIN_TOC), + TRACE_STR(N32_TRACEINTID_EPIN_ITTXFE), + TRACE_STR(N32_TRACEINTID_EPIN_EPDISD), + TRACE_STR(N32_TRACEINTID_EPIN_TXFE), + TRACE_STR(N32_TRACEINTID_EPIN_EMPWAIT), + TRACE_STR(N32_TRACEINTID_OUTNAK), + TRACE_STR(N32_TRACEINTID_OUTRECVD), + TRACE_STR(N32_TRACEINTID_OUTDONE), + TRACE_STR(N32_TRACEINTID_SETUPDONE), + TRACE_STR(N32_TRACEINTID_SETUPRECVD), + TRACE_STR_END +}; +#endif + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: n32_getreg + * + * Description: + * Get the contents of an N32 register + * + ****************************************************************************/ + +#if defined(CONFIG_N32_USBDEV_REGDEBUG) && defined(CONFIG_DEBUG_FEATURES) +static uint32_t n32_getreg(uint32_t addr) +{ + static uint32_t prevaddr = 0; + static uint32_t preval = 0; + static uint32_t count = 0; + + /* Read the value from the register */ + + uint32_t val = getreg32(addr); + + /* Is this the same value that we read from the same register last time? + * Are we polling the register? If so, suppress some of the output. + */ + + if (addr == prevaddr && val == preval) + { + if (count == 0xffffffff || ++count > 3) + { + if (count == 4) + { + uinfo("...\n"); + } + + return val; + } + } + + /* No this is a new address or value */ + + else + { + /* Did we print "..." for the previous value? */ + + if (count > 3) + { + /* Yes.. then show how many times the value repeated */ + + uinfo("[repeats %" PRId32 " more times]\n", count - 3); + } + + /* Save the new address, value, and count */ + + prevaddr = addr; + preval = val; + count = 1; + } + + /* Show the register value read */ + + uinfo("%08" PRIx32 "->%08" PRIx32 "\n", addr, val); + return val; +} +#endif + +/**************************************************************************** + * Name: n32_putreg + * + * Description: + * Set the contents of an N32 register to a value + * + ****************************************************************************/ + +#if defined(CONFIG_N32_USBDEV_REGDEBUG) && defined(CONFIG_DEBUG_FEATURES) +static void n32_putreg(uint32_t val, uint32_t addr) +{ + /* Show the register value being written */ + + uinfo("%08" PRIx32 "->%08" PRIx32 "\n", addr, val); + + /* Write the value */ + + putreg32(val, addr); +} +#endif + +/**************************************************************************** + * Name: n32_req_remfirst + * + * Description: + * Remove a request from the head of an endpoint request queue + * + ****************************************************************************/ + +static struct n32_req_s *n32_req_remfirst(struct n32_ep_s *privep) +{ + struct n32_req_s *ret = privep->head; + + if (ret) + { + privep->head = ret->flink; + if (!privep->head) + { + privep->tail = NULL; + } + + ret->flink = NULL; + } + + return ret; +} + +/**************************************************************************** + * Name: n32_req_addlast + * + * Description: + * Add a request to the end of an endpoint request queue + * + ****************************************************************************/ + +static bool n32_req_addlast(struct n32_ep_s *privep, + struct n32_req_s *req) +{ + bool is_empty = !privep->head; + + req->flink = NULL; + if (is_empty) + { + privep->head = req; + privep->tail = req; + } + else + { + privep->tail->flink = req; + privep->tail = req; + } + + return is_empty; +} + +/**************************************************************************** + * Name: n32_ep0in_setupresponse + * + * Description: + * Schedule a short transfer on Endpoint 0 (IN or OUT) + * + ****************************************************************************/ + +static void n32_ep0in_setupresponse(struct n32_usbdev_s *priv, + uint8_t *buf, uint32_t nbytes) +{ + n32_epin_transfer(&priv->epin[EP0], buf, nbytes); + priv->ep0state = EP0STATE_SETUPRESPONSE; + n32_ep0out_ctrlsetup(priv); +} + +/**************************************************************************** + * Name: n32_ep0in_transmitzlp + * + * Description: + * Send a zero length packet (ZLP) on endpoint 0 IN + * + ****************************************************************************/ + +static inline void n32_ep0in_transmitzlp(struct n32_usbdev_s *priv) +{ + n32_ep0in_setupresponse(priv, NULL, 0); +} + +/**************************************************************************** + * Name: n32_ep0in_activate + * + * Description: + * Activate the endpoint 0 IN endpoint. + * + ****************************************************************************/ + +static void n32_ep0in_activate(void) +{ + uint32_t regval; + + /* Set the max packet size of the IN EP. */ + + regval = n32_getreg(N32_USBHS_DINEPCTRL(0)); + regval &= ~N32_USBHS_DINEPCTRL_MPLEN_MASK; + + regval |= (CONFIG_USBDEV_EP0_MAXSIZE & N32_USBHS_DINEPCTRL_MPLEN_MASK); + + n32_putreg(regval, N32_USBHS_DINEPCTRL(0)); + + /* Clear global IN NAK */ + + regval = n32_getreg(N32_USBHS_DCTRL); + regval |= N32_USBHS_DCTRL_CGNPINAK; + n32_putreg(regval, N32_USBHS_DCTRL); +} + +/**************************************************************************** + * Name: n32_ep0out_ctrlsetup + * + * Description: + * Setup to receive a SETUP packet. + * + ****************************************************************************/ + +static void n32_ep0out_ctrlsetup(struct n32_usbdev_s *priv) +{ + uint32_t regval; + + /* Setup the hardware to perform the SETUP transfer */ + + regval = (USB_SIZEOF_CTRLREQ * 3 << N32_USBHS_DOUTEP0TXSIZ_TLEN_SHIFT) | + (1 << N32_USBHS_DOUTEP0TXSIZ_PKTCNT_SHIFT) | + (3 << N32_USBHS_DOUTEP0TXSIZ_STUPPCNT_SHIFT); + n32_putreg(regval, N32_USBHS_DOUTEPTXSIZ(0)); + + /* Then clear NAKing and enable the transfer */ + + regval = n32_getreg(N32_USBHS_DOUTEPCTRL(0)); + regval |= (N32_USBHS_DOUTEP0CTRL_CNAK | N32_USBHS_DOUTEP0CTRL_EPEN); + n32_putreg(regval, N32_USBHS_DOUTEPCTRL(0)); +} + +/**************************************************************************** + * Name: n32_txfifo_write + * + * Description: + * Send data to the endpoint's TxFIFO. + * + ****************************************************************************/ + +static void n32_txfifo_write(struct n32_ep_s *privep, + uint8_t *buf, int nbytes) +{ + uint32_t regaddr; + uint32_t regval; + int nwords; + int i; + + /* Convert the number of bytes to words */ + + nwords = (nbytes + 3) >> 2; + + /* Get the TxFIFO for this endpoint (same as the endpoint number) */ + + regaddr = N32_USBHS_DFIFO_DEP(privep->epphy); + + /* Then transfer each word to the TxFIFO */ + + for (i = 0; i < nwords; i++) + { + /* Read four bytes from the source buffer (to avoid unaligned accesses) + * and pack these into one 32-bit word (little endian). + */ + + regval = (uint32_t)*buf++; + regval |= ((uint32_t)*buf++) << 8; + regval |= ((uint32_t)*buf++) << 16; + regval |= ((uint32_t)*buf++) << 24; + + /* Then write the packet data to the TxFIFO */ + + n32_putreg(regval, regaddr); + } +} + +/**************************************************************************** + * Name: n32_epin_transfer + * + * Description: + * Start the Tx data transfer + * + ****************************************************************************/ + +static void n32_epin_transfer(struct n32_ep_s *privep, + uint8_t *buf, int nbytes) +{ + uint32_t pktcnt; + uint32_t regval; + + /* Read the DIEPSIZx register */ + + regval = n32_getreg(N32_USBHS_DINEPTXSIZ(privep->epphy)); + + /* Clear the XFRSIZ, PKTCNT, and MCNT field of the DIEPSIZx register */ + + regval &= ~(N32_USBHS_DINEPTXSIZ_TLEN_MASK | + N32_USBHS_DINEPTXSIZ_PKTCNT_MASK | + N32_USBHS_DINEPTXSIZ_MCNT_MASK); + + /* Are we sending a zero length packet (ZLP) */ + + if (nbytes == 0) + { + /* Yes.. + * leave the transfer size at zero and set the packet count to 1 + */ + + pktcnt = 1; + } + else + { + /* No.. Program the transfer size and packet count. + * First calculate: + * + * xfrsize = The total number of bytes to be sent. + * pktcnt = the number of packets (of maxpacket bytes) required to + * perform the transfer. + */ + + pktcnt = ((uint32_t)nbytes + (privep->ep.maxpacket - 1)) / + privep->ep.maxpacket; + } + + /* Set the XFRSIZ and PKTCNT */ + + regval |= (pktcnt << N32_USBHS_DINEPTXSIZ_PKTCNT_SHIFT); + regval |= ((uint32_t)nbytes << N32_USBHS_DINEPTXSIZ_TLEN_SHIFT); + + /* If this is an isochronous endpoint, then set the multi-count field to + * the PKTCNT as well. + */ + + if (privep->eptype == USB_EP_ATTR_XFER_ISOC) + { + regval |= (pktcnt << N32_USBHS_DINEPTXSIZ_MCNT_SHIFT); + } + + /* Save DIEPSIZx register value */ + + n32_putreg(regval, N32_USBHS_DINEPTXSIZ(privep->epphy)); + + /* Read the DIEPCTLx register */ + + regval = n32_getreg(N32_USBHS_DINEPCTRL(privep->epphy)); + + /* If this is an isochronous endpoint, then set the even/odd frame bit + * the DIEPCTLx register. + */ + + if (privep->eptype == USB_EP_ATTR_XFER_ISOC) + { + /* Check bit 0 of the frame number of the received SOF and set the + * even/odd frame to match. + */ + + uint32_t status = n32_getreg(N32_USBHS_DSTS); + + if ((status & N32_USBHS_DSTS_SOFFN0) == N32_USBHS_DSTS_SOFFN_EVEN) + { + regval |= N32_USBHS_DINEPCTRL_SD0PID_SEVNFRM; + } + else + { + regval |= N32_USBHS_DINEPCTRL_SD1PID_SODDFRM; + } + } + + /* EP enable, IN data in FIFO */ + + regval &= ~N32_USBHS_DINEPCTRL_EPDIS; + regval |= (N32_USBHS_DINEPCTRL_CNAK | N32_USBHS_DINEPCTRL_EPEN); + n32_putreg(regval, N32_USBHS_DINEPCTRL(privep->epphy)); + + /* Transfer the data to the TxFIFO. At this point, the caller has already + * assured that there is sufficient space in the TxFIFO to hold the + * transfer we can just blindly continue. + */ + + n32_txfifo_write(privep, buf, nbytes); +} + +/**************************************************************************** + * Name: n32_epin_request + * + * Description: + * Begin or continue write request processing. + * + ****************************************************************************/ + +static void n32_epin_request(struct n32_usbdev_s *priv, + struct n32_ep_s *privep) +{ + struct n32_req_s *privreq; + uint32_t regaddr; + uint32_t regval; + uint8_t *buf; + int nbytes; + int nwords; + int bytesleft; + + /* We get here in one of four possible ways. From three interrupting + * events: + * + * 1. From n32_epin as part of the transfer complete interrupt processing + * This interrupt indicates that the last transfer has completed. + * 2. As part of the ITTXFE interrupt processing. That interrupt indicates + * that an IN token was received when the associated TxFIFO was empty. + * 3. From n32_epin_txfifoempty as part of the TXFE interrupt processing. + * The TXFE interrupt is only enabled when the TxFIFO is full and the + * software must wait for space to become available in the TxFIFO. + * + * And this function may be called immediately when the write request is + * queue to start up the next transaction. + * + * 4. From n32_ep_submit when a new write request is received WHILE the + * endpoint is not active (privep->active == false). + */ + + /* Check the request from the head of the endpoint request queue */ + + privreq = n32_rqpeek(privep); + if (!privreq) + { + usbtrace(TRACE_DEVERROR(N32_TRACEERR_EPINREQEMPTY), privep->epphy); + + /* There is no TX transfer in progress and no new pending TX + * requests to send. To stop transmitting any data on a particular + * IN endpoint, the application must set the IN NAK bit. To set this + * bit, the following field must be programmed. + */ + + regaddr = N32_USBHS_DINEPCTRL(privep->epphy); + regval = n32_getreg(regaddr); + regval |= N32_USBHS_DINEPCTRL_SNAK; + n32_putreg(regval, regaddr); + + /* The endpoint is no longer active */ + + privep->active = false; + return; + } + + uinfo("EP%" PRId8 " req=%p: len=%" PRId16 " xfrd=%" PRId16" zlp=%" + PRId8 "\n", privep->epphy, privreq, privreq->req.len, + privreq->req.xfrd, privep->zlp); + + /* Check for a special case: If we are just starting a request (xfrd==0) + * and the class driver is trying to send a zero-length packet (len==0). + * Then set the ZLP flag so that the packet will be sent. + */ + + if (privreq->req.len == 0) + { + /* The ZLP flag is set TRUE whenever we want to force the driver to + * send a zero-length-packet on the next pass through the loop (below). + * The flag is cleared whenever a packet is sent in the loop below. + */ + + privep->zlp = true; + } + + /* Add one more packet to the TxFIFO. We will wait for the transfer + * complete event before we add the next packet (or part of a packet + * to the TxFIFO). + * + * The documentation says that we can can multiple packets to the TxFIFO, + * but it seems that we need to get the transfer complete event before + * we can add the next (or maybe I have got something wrong?) + */ + +#if 0 + while (privreq->req.xfrd < privreq->req.len || privep->zlp) +#else + if (privreq->req.xfrd < privreq->req.len || privep->zlp) +#endif + { + /* Get the number of bytes left to be sent in the request */ + + bytesleft = privreq->req.len - privreq->req.xfrd; + nbytes = bytesleft; + + /* Assume no zero-length-packet on the next pass through this loop */ + + privep->zlp = false; + + /* Limit the size of the transfer to one full packet and handle + * zero-length packets (ZLPs). + */ + + if (nbytes > 0) + { + /* Either send the maxpacketsize or all of the remaining data in + * the request. + */ + + if (nbytes >= privep->ep.maxpacket) + { + nbytes = privep->ep.maxpacket; + + /* Handle the case where this packet is exactly the + * maxpacketsize. Do we need to send a zero-length packet + * in this case? + */ + + if (bytesleft == privep->ep.maxpacket && + (privreq->req.flags & USBDEV_REQFLAGS_NULLPKT) != 0) + { + /* The ZLP flag is set TRUE whenever we want to force + * the driver to send a zero-length-packet on the next + * pass through this loop. The flag is cleared (above) + * whenever we are committed to sending any packet and + * set here when we want to force one more pass through + * the loop. + */ + + privep->zlp = true; + } + } + } + + /* Get the transfer size in 32-bit words */ + + nwords = (nbytes + 3) >> 2; + + /* Get the number of 32-bit words available in the TxFIFO. The + * DXTFSTS indicates the amount of free space available in the + * endpoint TxFIFO. Values are in terms of 32-bit words: + * + * 0: Endpoint TxFIFO is full + * 1: 1 word available + * 2: 2 words available + * n: n words available + */ + + regaddr = N32_USBHS_DINEPTXFSTS(privep->epphy); + + /* Check for space in the TxFIFO. If space in the TxFIFO is not + * available, then set up an interrupt to resume the transfer when + * the TxFIFO is empty. + */ + + regval = n32_getreg(regaddr); + if ((int)(regval & N32_USBHS_DINEPTXFSTS_TXFSPCAVL_MASK) < nwords) + { + usbtrace(TRACE_INTDECODE(N32_TRACEINTID_EPIN_EMPWAIT), + (uint16_t)regval); + + /* There is insufficient space in the TxFIFO. Wait for a TxFIFO + * empty interrupt and try again. + */ + + uint32_t empmsk = n32_getreg(N32_USBHS_DINEPFEINTEN); + + empmsk |= N32_USBHS_DINEPFEINTEN_IEP(privep->epphy); + n32_putreg(empmsk, N32_USBHS_DINEPFEINTEN); + +#ifdef CONFIG_DEBUG_FEATURES + /* Check if the configured TXFIFO size is sufficient for a given + * request. If not, raise an assertion here. + */ + + regval = n32_getreg(N32_USBHS_DINEPPTXFSIZ(privep->epphy)); + regval &= N32_USBHS_DINEPPTXFSIZ_INEPTXFDEP_MASK; + regval >>= N32_USBHS_DINEPPTXFSIZ_INEPTXFDEP_SHIFT; + uerr("EP%" PRId8 " TXLEN=%" PRId32 " nwords=%d\n", + privep->epphy, regval, nwords); + DEBUGASSERT(regval >= nwords); +#endif + + /* Terminate the transfer. We will try again when the TxFIFO empty + * interrupt is received. + */ + + return; + } + + /* Transfer data to the TxFIFO */ + + buf = privreq->req.buf + privreq->req.xfrd; + n32_epin_transfer(privep, buf, nbytes); + + /* If it was not before, the OUT endpoint is now actively transferring + * data. + */ + + privep->active = true; + + /* EP0 is a special case */ + + if (privep->epphy == EP0) + { + priv->ep0state = EP0STATE_DATA_IN; + } + + /* Update for the next time through the loop */ + + privreq->req.xfrd += nbytes; + } + + /* Note that the ZLP, if any, must be sent as a separate transfer. + * The need for a ZLP is indicated by privep->zlp. If all of the + * bytes were sent (including any final null packet) then we are + * finished with the transfer + */ + + if (privreq->req.xfrd >= privreq->req.len && !privep->zlp) + { + usbtrace(TRACE_COMPLETE(privep->epphy), privreq->req.xfrd); + + /* We are finished with the request (although the transfer has not + * yet completed). + */ + + n32_req_complete(privep, OK); + } +} + +/**************************************************************************** + * Name: n32_rxfifo_read + * + * Description: + * Read packet from the RxFIFO into a read request. + * + ****************************************************************************/ + +static void n32_rxfifo_read(struct n32_ep_s *privep, + uint8_t *dest, uint16_t len) +{ + uint32_t regaddr; + int i; + + /* Get the address of the RxFIFO. Note: there is only one RxFIFO so + * we might as well use the address associated with EP0. + */ + + regaddr = N32_USBHS_DFIFO_DEP(EP0); + + /* Read 32-bits and write 4 x 8-bits at time + * (to avoid unaligned accesses) + */ + + for (i = 0; i < len; i += 4) + { + union + { + uint32_t w; + uint8_t b[4]; + } data; + + /* Read 1 x 32-bits of EP0 packet data */ + + data.w = n32_getreg(regaddr); + + /* Write 4 x 8-bits of EP0 packet data */ + + *dest++ = data.b[0]; + *dest++ = data.b[1]; + *dest++ = data.b[2]; + *dest++ = data.b[3]; + } +} + +/**************************************************************************** + * Name: n32_rxfifo_discard + * + * Description: + * Discard packet data from the RxFIFO. + * + ****************************************************************************/ + +static void n32_rxfifo_discard(struct n32_ep_s *privep, int len) +{ + if (len > 0) + { + uint32_t regaddr; + int i; + + /* Get the address of the RxFIFO Note: there is only one RxFIFO so + * we might as well use the address associated with EP0. + */ + + regaddr = N32_USBHS_DFIFO_DEP(EP0); + + /* Read 32-bits at time */ + + for (i = 0; i < len; i += 4) + { + volatile uint32_t data = n32_getreg(regaddr); + + UNUSED(data); + } + } +} + +/**************************************************************************** + * Name: n32_epout_complete + * + * Description: + * This function is called when an OUT transfer complete interrupt is + * received. It completes the read request at the head of the endpoint's + * request queue. + * + ****************************************************************************/ + +static void n32_epout_complete(struct n32_usbdev_s *priv, + struct n32_ep_s *privep) +{ + struct n32_req_s *privreq; + + /* Since a transfer just completed, there must be a read request at the + * head of the endpoint request queue. + */ + + privreq = n32_rqpeek(privep); + DEBUGASSERT(privreq); + + if (!privreq) + { + /* An OUT transfer completed, but no packet to receive the data. This + * should not happen. + */ + + usbtrace(TRACE_DEVERROR(N32_TRACEERR_EPOUTQEMPTY), + privep->epphy); + privep->active = false; + return; + } + + uinfo("EP%d: len=%zu xfrd=%zu\n", + privep->epphy, privreq->req.len, privreq->req.xfrd); + + /* Return the completed read request to the class driver and mark the + * state IDLE. + */ + + usbtrace(TRACE_COMPLETE(privep->epphy), privreq->req.xfrd); + n32_req_complete(privep, OK); + privep->active = false; + + /* Now set up the next read request (if any) */ + + n32_epout_request(priv, privep); +} + +/**************************************************************************** + * Name: n32_ep0out_receive + * + * Description: + * This function is called from the RXFLVL interrupt handler when new + * incoming data is available in the endpoint's RxFIFO. This function + * will simply copy the incoming data into pending request's data buffer. + * + ****************************************************************************/ + +static inline void n32_ep0out_receive(struct n32_ep_s *privep, + int bcnt) +{ + struct n32_usbdev_s *priv; + + /* Sanity Checking */ + + DEBUGASSERT(privep && privep->dev); + priv = (struct n32_usbdev_s *)privep->dev; + + uinfo("EP0: bcnt=%d\n", bcnt); + usbtrace(TRACE_READ(EP0), bcnt); + + /* Verify that an OUT SETUP request as received before this data was + * received in the RxFIFO. + */ + + if (priv->ep0state == EP0STATE_SETUP_OUT) + { + /* Read the data into our special buffer for SETUP data */ + + int readlen = MIN(CONFIG_USBDEV_SETUP_MAXDATASIZE, bcnt); + + n32_rxfifo_read(privep, priv->ep0data, readlen); + + /* Do we have to discard any excess bytes? */ + + n32_rxfifo_discard(privep, bcnt - readlen); + + /* Now we can process the setup command */ + + privep->active = false; + priv->ep0state = EP0STATE_SETUP_READY; + priv->ep0datlen = readlen; + + n32_ep0out_setup(priv); + } + else + { + /* This is an error. We don't have any idea what to do with the EP0 + * data in this case. Just read and discard it so that the RxFIFO + * does not become constipated. + */ + + usbtrace(TRACE_DEVERROR(N32_TRACEERR_NOOUTSETUP), priv->ep0state); + n32_rxfifo_discard(privep, bcnt); + privep->active = false; + } +} + +/**************************************************************************** + * Name: n32_epout_receive + * + * Description: + * This function is called from the RXFLVL interrupt handler when new + * incoming data is available in the endpoint's RxFIFO. This function + * will simply copy the incoming data into pending request's data buffer. + * + ****************************************************************************/ + +static inline void n32_epout_receive(struct n32_ep_s *privep, + int bcnt) +{ + struct n32_req_s *privreq; + uint8_t *dest; + int buflen; + int readlen; + + /* Get a reference to the request at the head of the endpoint's request + * queue. + */ + + privreq = n32_rqpeek(privep); + if (!privreq) + { + /* Incoming data is available in the RxFIFO, but there is no read setup + * to receive the receive the data. This should not happen for data + * endpoints; those endpoints should have been NAKing any OUT data + * tokens. + * + * We should get here normally on OUT data phase following an OUT + * SETUP command. EP0 data will still receive data in this case and it + * should not be NAKing. + */ + + if (privep->epphy == 0) + { + n32_ep0out_receive(privep, bcnt); + } + else + { + /* Otherwise, the data is lost. This really should not happen if + * NAKing is working as expected. + */ + + usbtrace(TRACE_DEVERROR(N32_TRACEERR_EPOUTQEMPTY), + privep->epphy); + + /* Discard the data in the RxFIFO */ + + n32_rxfifo_discard(privep, bcnt); + } + + privep->active = false; + return; + } + + uinfo("EP%d: len=%zu xfrd=%zu\n", privep->epphy, + privreq->req.len, privreq->req.xfrd); + usbtrace(TRACE_READ(privep->epphy), bcnt); + + /* Get the number of bytes to transfer from the RxFIFO */ + + buflen = privreq->req.len - privreq->req.xfrd; + DEBUGASSERT(buflen > 0 && buflen >= bcnt); + readlen = MIN(buflen, bcnt); + + /* Get the destination of the data transfer */ + + dest = privreq->req.buf + privreq->req.xfrd; + + /* Transfer the data from the RxFIFO to the request's data buffer */ + + n32_rxfifo_read(privep, dest, readlen); + + /* If there were more bytes in the RxFIFO than could be held in the read + * request, then we will have to discard those. + */ + + n32_rxfifo_discard(privep, bcnt - readlen); + + /* Update the number of bytes transferred */ + + privreq->req.xfrd += readlen; +} + +/**************************************************************************** + * Name: n32_epout_request + * + * Description: + * This function is called when either + * (1) new read request is received, or + * (2) a pending receive request completes. If there is no read in + * pending, then this function will initiate the next OUT (read) operation. + * + ****************************************************************************/ + +static void n32_epout_request(struct n32_usbdev_s *priv, + struct n32_ep_s *privep) +{ + struct n32_req_s *privreq; + uint32_t regaddr; + uint32_t regval; + uint32_t xfrsize; + uint32_t pktcnt; + + /* Make sure that there is not already a pending request request. + * If there is, just return, leaving the newly received request + * in the request queue. + */ + + if (!privep->active) + { + /* Loop until a valid request is found (or the request queue is empty). + * The loop is only need to look at the request queue again is an + * invalid read request is encountered. + */ + + for (; ; ) + { + /* Get a reference to the request at the head of the endpoint's + * request queue + */ + + privreq = n32_rqpeek(privep); + if (!privreq) + { + usbtrace(TRACE_DEVERROR(N32_TRACEERR_EPOUTQEMPTY), + privep->epphy); + + /* There are no read requests to be setup. Configure the + * hardware to NAK any incoming packets. (This should already + * be the case. I think that the hardware will automatically + * NAK after a transfer is completed until SNAK is cleared). + */ + + regaddr = N32_USBHS_DOUTEPCTRL(privep->epphy); + regval = n32_getreg(regaddr); + regval |= N32_USBHS_DOUTEPCTRL_SNAK; + n32_putreg(regval, regaddr); + + /* This endpoint is no longer actively transferring */ + + privep->active = false; + return; + } + + uinfo("EP%d: len=%d\n", privep->epphy, privreq->req.len); + + /* Ignore any attempt to receive a zero length packet (this really + * should not happen. + */ + + if (privreq->req.len <= 0) + { + usbtrace(TRACE_DEVERROR(N32_TRACEERR_EPOUTNULLPACKET), 0); + n32_req_complete(privep, OK); + } + + /* Otherwise, we have a usable read request... + * break out of the loop + */ + + else + { + break; + } + } + + /* Setup the pending read into the request buffer. First calculate: + * + * pktcnt = the number of packets (of maxpacket bytes) required to + * perform the transfer. + * xfrsize = The total number of bytes required (in units of + * maxpacket bytes). + */ + + pktcnt = (privreq->req.len + (privep->ep.maxpacket - 1)) / + privep->ep.maxpacket; + xfrsize = pktcnt * privep->ep.maxpacket; + + /* Then setup the hardware to perform this transfer */ + + regaddr = N32_USBHS_DOUTEPTXSIZ(privep->epphy); + regval = n32_getreg(regaddr); + regval &= ~(N32_USBHS_DOUTEPTXSIZ_TLEN_MASK | + N32_USBHS_DOUTEPTXSIZ_PKTCNT_MASK); + regval |= (xfrsize << N32_USBHS_DOUTEPTXSIZ_TLEN_SHIFT); + regval |= (pktcnt << N32_USBHS_DOUTEPTXSIZ_PKTCNT_SHIFT); + n32_putreg(regval, regaddr); + + /* Then enable the transfer */ + + regaddr = N32_USBHS_DOUTEPCTRL(privep->epphy); + regval = n32_getreg(regaddr); + + /* When an isochronous transfer is enabled the Even/Odd frame bit must + * also be set appropriately. + */ + +#ifdef CONFIG_USBDEV_ISOCHRONOUS + if (privep->eptype == USB_EP_ATTR_XFER_ISOC) + { + if (privep->odd) + { + regval |= N32_USBHS_DOUTEPCTRL_SD1PID_SODDFRM; + } + else + { + regval |= N32_USBHS_DOUTEPCTRL_SD0PID_SEVNFRM; + } + } +#endif + + /* Clearing NAKing and enable the transfer. */ + + regval |= (N32_USBHS_DOUTEPCTRL_CNAK | N32_USBHS_DOUTEPCTRL_EPEN); + n32_putreg(regval, regaddr); + + /* A transfer is now active on this endpoint */ + + privep->active = true; + + /* EP0 is a special case. We need to know when to switch back to + * normal SETUP processing. + */ + + if (privep->epphy == EP0) + { + priv->ep0state = EP0STATE_DATA_OUT; + } + } +} + +/**************************************************************************** + * Name: n32_ep_flush + * + * Description: + * Flush any primed descriptors from this ep + * + ****************************************************************************/ + +static void n32_ep_flush(struct n32_ep_s *privep) +{ + if (privep->isin) + { + n32_txfifo_flush(N32_USBHS_GRSTCTRL_TXFNUM_D(privep->epphy)); + } + else + { + n32_rxfifo_flush(); + } +} + +/**************************************************************************** + * Name: n32_req_complete + * + * Description: + * Handle termination of the request at the head of the endpoint request + * queue. + * + ****************************************************************************/ + +static void n32_req_complete(struct n32_ep_s *privep, int16_t result) +{ + struct n32_req_s *privreq; + + /* Remove the request at the head of the request list */ + + privreq = n32_req_remfirst(privep); + DEBUGASSERT(privreq != NULL); + + /* If endpoint 0, temporarily reflect the state of protocol stalled + * in the callback. + */ + + bool stalled = privep->stalled; + + if (privep->epphy == EP0) + { + privep->stalled = privep->dev->stalled; + } + + /* Save the result in the request structure */ + + privreq->req.result = result; + + /* Callback to the request completion handler */ + + privreq->req.callback(&privep->ep, &privreq->req); + + /* Restore the stalled indication */ + + privep->stalled = stalled; +} + +/**************************************************************************** + * Name: n32_req_cancel + * + * Description: + * Cancel all pending requests for an endpoint + * + ****************************************************************************/ + +static void n32_req_cancel(struct n32_ep_s *privep, int16_t status) +{ + if (!n32_rqempty(privep)) + { + n32_ep_flush(privep); + } + + while (!n32_rqempty(privep)) + { + usbtrace(TRACE_COMPLETE(privep->epphy), + (n32_rqpeek(privep))->req.xfrd); + n32_req_complete(privep, status); + } +} + +/**************************************************************************** + * Name: n32_ep_findbyaddr + * + * Description: + * Find the physical endpoint structure corresponding to a logic endpoint + * address + * + ****************************************************************************/ + +static struct n32_ep_s *n32_ep_findbyaddr(struct n32_usbdev_s *priv, + uint16_t eplog) +{ + struct n32_ep_s *privep; + uint8_t epphy = USB_EPNO(eplog); + + if (epphy >= N32_USBHS_NENDPOINTS) + { + return NULL; + } + + /* Is this an IN or an OUT endpoint? */ + + if (USB_ISEPIN(eplog)) + { + privep = &priv->epin[epphy]; + } + else + { + privep = &priv->epout[epphy]; + } + + /* Return endpoint reference */ + + DEBUGASSERT(privep->epphy == epphy); + return privep; +} + +/**************************************************************************** + * Name: n32_req_dispatch + * + * Description: + * Provide unhandled setup actions to the class driver. This is logically + * part of the USB interrupt handler. + * + ****************************************************************************/ + +static int n32_req_dispatch(struct n32_usbdev_s *priv, + const struct usb_ctrlreq_s *ctrl) +{ + int ret = -EIO; + + usbtrace(TRACE_INTDECODE(N32_TRACEINTID_DISPATCH), 0); + if (priv->driver) + { + /* Forward to the control request to the class driver implementation */ + + ret = CLASS_SETUP(priv->driver, &priv->usbdev, ctrl, + priv->ep0data, priv->ep0datlen); + } + + if (ret < 0) + { + /* Stall on failure */ + + usbtrace(TRACE_DEVERROR(N32_TRACEERR_DISPATCHSTALL), 0); + priv->stalled = true; + } + + return ret; +} + +/**************************************************************************** + * Name: n32_usbreset + * + * Description: + * Reset Usb engine + * + ****************************************************************************/ + +static void n32_usbreset(struct n32_usbdev_s *priv) +{ + struct n32_ep_s *privep; + uint32_t regval; + int i; + + /* Clear the Remote Wake-up Signaling */ + + regval = n32_getreg(N32_USBHS_DCTRL); + regval &= ~N32_USBHS_DCTRL_RMWKUP; + n32_putreg(regval, N32_USBHS_DCTRL); + + /* Flush the EP0 Tx FIFO */ + + n32_txfifo_flush(N32_USBHS_GRSTCTRL_TXFNUM_D(EP0)); + + /* Tell the class driver that we are disconnected. The class + * driver should then accept any new configurations. + */ + + if (priv->driver) + { + CLASS_DISCONNECT(priv->driver, &priv->usbdev); + } + + /* Mark all endpoints as available */ + + priv->epavail[0] = N32_EP_AVAILABLE; + priv->epavail[1] = N32_EP_AVAILABLE; + + /* Disable all end point interrupts */ + + for (i = 0; i < N32_USBHS_NENDPOINTS ; i++) + { + /* Disable endpoint interrupts */ + + n32_putreg(0xff, N32_USBHS_DINEPINTSTS(i)); + n32_putreg(0xff, N32_USBHS_DOUTEPINTSTS(i)); + + /* Return write requests to the class implementation */ + + privep = &priv->epin[i]; + n32_req_cancel(privep, -ESHUTDOWN); + + /* Reset IN endpoint status */ + + privep->stalled = false; + privep->active = false; + privep->zlp = false; + + /* Return read requests to the class implementation */ + + privep = &priv->epout[i]; + n32_req_cancel(privep, -ESHUTDOWN); + + /* Reset endpoint status */ + + privep->stalled = false; + privep->active = false; + privep->zlp = false; + } + + n32_putreg(0xffffffff, N32_USBHS_DAEPINTSTS); + + /* Mask all device endpoint interrupts except EP0 */ + + regval = (N32_USBHS_DAINT_IEP(EP0) | N32_USBHS_DAINT_OEP(EP0)); + n32_putreg(regval, N32_USBHS_DAEPINTEN); + + /* Unmask OUT interrupts */ + + regval = (N32_USBHS_DOUTEPINTEN_TXCIEN | + N32_USBHS_DOUTEPINTEN_STUPDNEIEN | N32_USBHS_DOUTEPINTEN_EPDIEN); + n32_putreg(regval, N32_USBHS_DOUTEPINTEN); + + /* Unmask IN interrupts */ + + regval = (N32_USBHS_DINEPINTEN_TXCIEN | N32_USBHS_DINEPINTEN_EPDIEN | + N32_USBHS_DINEPINTEN_TOIEN); + n32_putreg(regval, N32_USBHS_DINEPINTEN); + + /* Reset device address to 0 */ + + n32_setaddress(priv, 0); + priv->devstate = DEVSTATE_DEFAULT; +#ifndef CONFIG_N32H7_USBHS_FS + priv->usbdev.speed = USB_SPEED_HIGH; +#else + priv->usbdev.speed = USB_SPEED_FULL; +#endif + + /* Re-configure EP0 */ + + n32_ep0_configure(priv); + + /* Setup EP0 to receive SETUP packets */ + + n32_ep0out_ctrlsetup(priv); +} + +/**************************************************************************** + * Name: n32_ep0out_testmode + * + * Description: + * Select test mode + * + ****************************************************************************/ + +static inline void n32_ep0out_testmode(struct n32_usbdev_s *priv, + uint16_t index) +{ + uint8_t testmode; + + testmode = index >> 8; + switch (testmode) + { + case 1: + priv->testmode = N32_USBHS_TESTMODE_J; + break; + + case 2: + priv->testmode = N32_USBHS_TESTMODE_K; + break; + + case 3: + priv->testmode = N32_USBHS_TESTMODE_SE0_NAK; + break; + + case 4: + priv->testmode = N32_USBHS_TESTMODE_PACKET; + break; + + case 5: + priv->testmode = N32_USBHS_TESTMODE_FORCE; + break; + + default: + usbtrace(TRACE_DEVERROR(N32_TRACEERR_BADTESTMODE), testmode); + priv->dotest = false; + priv->testmode = N32_USBHS_TESTMODE_DISABLED; + priv->stalled = true; + } + + priv->dotest = true; + n32_ep0in_transmitzlp(priv); +} + +/**************************************************************************** + * Name: n32_ep0out_stdrequest + * + * Description: + * Handle a standard request on EP0. Pick off the things of interest to + * the USB device controller driver; pass what is left to the class driver. + * + ****************************************************************************/ + +static inline +void n32_ep0out_stdrequest(struct n32_usbdev_s *priv, + struct n32_ctrlreq_s *ctrlreq) +{ + struct n32_ep_s *privep; + + /* Handle standard request */ + + switch (ctrlreq->req) + { + case USB_REQ_GETSTATUS: + { + /* type: device-to-host; recipient = device, interface, endpoint + * value: 0 + * index: zero interface endpoint + * len: 2; data = status + */ + + usbtrace(TRACE_INTDECODE(N32_TRACEINTID_GETSTATUS), 0); + if (!priv->addressed || + ctrlreq->len != 2 || + USB_REQ_ISOUT(ctrlreq->type) || + ctrlreq->value != 0) + { + priv->stalled = true; + } + else + { + switch (ctrlreq->type & USB_REQ_RECIPIENT_MASK) + { + case USB_REQ_RECIPIENT_ENDPOINT: + { + usbtrace(TRACE_INTDECODE(N32_TRACEINTID_EPGETSTATUS), + 0); + privep = n32_ep_findbyaddr(priv, ctrlreq->index); + if (!privep) + { + usbtrace(TRACE_DEVERROR( + N32_TRACEERR_BADEPGETSTATUS), 0); + priv->stalled = true; + } + else + { + if (privep->stalled) + { + priv->ep0data[0] = + (1 << USB_FEATURE_ENDPOINTHALT); + } + else + { + priv->ep0data[0] = 0; /* Not stalled */ + } + + priv->ep0data[1] = 0; + n32_ep0in_setupresponse(priv, priv->ep0data, 2); + } + } + break; + + case USB_REQ_RECIPIENT_DEVICE: + { + if (ctrlreq->index == 0) + { + usbtrace(TRACE_INTDECODE( + N32_TRACEINTID_DEVGETSTATUS), 0); + + /* Features: Remote Wakeup and self-powered */ + + priv->ep0data[0] = (priv->selfpowered << + USB_FEATURE_SELFPOWERED); + priv->ep0data[0] |= (priv->wakeup << + USB_FEATURE_REMOTEWAKEUP); + priv->ep0data[1] = 0; + + n32_ep0in_setupresponse(priv, priv->ep0data, 2); + } + else + { + usbtrace(TRACE_DEVERROR( + N32_TRACEERR_BADDEVGETSTATUS), 0); + priv->stalled = true; + } + } + break; + + case USB_REQ_RECIPIENT_INTERFACE: + { + usbtrace(TRACE_INTDECODE(N32_TRACEINTID_IFGETSTATUS), + 0); + priv->ep0data[0] = 0; + priv->ep0data[1] = 0; + + n32_ep0in_setupresponse(priv, priv->ep0data, 2); + } + break; + + default: + { + usbtrace(TRACE_DEVERROR(N32_TRACEERR_BADGETSTATUS), 0); + priv->stalled = true; + } + break; + } + } + } + break; + + case USB_REQ_CLEARFEATURE: + { + /* type: host-to-device; recipient = device, interface or endpoint + * value: feature selector + * index: zero interface endpoint; + * len: zero, data = none + */ + + usbtrace(TRACE_INTDECODE(N32_TRACEINTID_CLEARFEATURE), 0); + if (priv->addressed != 0 && ctrlreq->len == 0) + { + uint8_t recipient = ctrlreq->type & USB_REQ_RECIPIENT_MASK; + + if (recipient == USB_REQ_RECIPIENT_ENDPOINT && + ctrlreq->value == USB_FEATURE_ENDPOINTHALT && + (privep = n32_ep_findbyaddr(priv, ctrlreq->index)) != NULL) + { + n32_ep_clrstall(privep); + n32_ep0in_transmitzlp(priv); + } + else if (recipient == USB_REQ_RECIPIENT_DEVICE && + ctrlreq->value == USB_FEATURE_REMOTEWAKEUP) + { + priv->wakeup = 0; + n32_ep0in_transmitzlp(priv); + } + else + { + /* Actually, I think we could just stall here. */ + + n32_req_dispatch(priv, &priv->ctrlreq); + } + } + else + { + usbtrace(TRACE_DEVERROR(N32_TRACEERR_BADCLEARFEATURE), 0); + priv->stalled = true; + } + } + break; + + case USB_REQ_SETFEATURE: + { + /* type: host-to-device; recipient = device, interface, endpoint + * value: feature selector + * index: zero interface endpoint; + * len: 0; data = none + */ + + usbtrace(TRACE_INTDECODE(N32_TRACEINTID_SETFEATURE), 0); + if (priv->addressed != 0 && ctrlreq->len == 0) + { + uint8_t recipient = ctrlreq->type & USB_REQ_RECIPIENT_MASK; + + if (recipient == USB_REQ_RECIPIENT_ENDPOINT && + ctrlreq->value == USB_FEATURE_ENDPOINTHALT && + (privep = n32_ep_findbyaddr(priv, ctrlreq->index)) != NULL) + { + n32_ep_setstall(privep); + n32_ep0in_transmitzlp(priv); + } + else if (recipient == USB_REQ_RECIPIENT_DEVICE && + ctrlreq->value == USB_FEATURE_REMOTEWAKEUP) + { + priv->wakeup = 1; + n32_ep0in_transmitzlp(priv); + } + else if (recipient == USB_REQ_RECIPIENT_DEVICE && + ctrlreq->value == USB_FEATURE_TESTMODE && + ((ctrlreq->index & 0xff) == 0)) + { + n32_ep0out_testmode(priv, ctrlreq->index); + } + else if (priv->configured) + { + /* Actually, I think we could just stall here. */ + + n32_req_dispatch(priv, &priv->ctrlreq); + } + else + { + usbtrace(TRACE_DEVERROR(N32_TRACEERR_BADSETFEATURE), 0); + priv->stalled = true; + } + } + else + { + usbtrace(TRACE_DEVERROR(N32_TRACEERR_BADSETFEATURE), 0); + priv->stalled = true; + } + } + + break; + + case USB_REQ_SETADDRESS: + { + /* type: host-to-device; recipient = device + * value: device address + * index: 0 + * len: 0; data = none + */ + + usbtrace(TRACE_INTDECODE(N32_TRACEINTID_SETADDRESS), + ctrlreq->value); + if ((ctrlreq->type & USB_REQ_RECIPIENT_MASK) == + USB_REQ_RECIPIENT_DEVICE && + ctrlreq->index == 0 && + ctrlreq->len == 0 && + ctrlreq->value < 128 && + priv->devstate != DEVSTATE_CONFIGURED) + { + /* Save the address. + * We cannot actually change to the next address until + * the completion of the status phase. + */ + + n32_setaddress(priv, (uint16_t)priv->ctrlreq.value[0]); + n32_ep0in_transmitzlp(priv); + } + else + { + usbtrace(TRACE_DEVERROR(N32_TRACEERR_BADSETADDRESS), 0); + priv->stalled = true; + } + } + break; + + case USB_REQ_GETDESCRIPTOR: + /* type: device-to-host; recipient = device + * value: descriptor type and index + * index: 0 or language ID; + * len: descriptor len; data = descriptor + */ + + case USB_REQ_SETDESCRIPTOR: + /* type: host-to-device; recipient = device + * value: descriptor type and index + * index: 0 or language ID; + * len: descriptor len; data = descriptor + */ + + { + usbtrace(TRACE_INTDECODE(N32_TRACEINTID_GETSETDESC), 0); + if ((ctrlreq->type & USB_REQ_RECIPIENT_MASK) == + USB_REQ_RECIPIENT_DEVICE) + { + n32_req_dispatch(priv, &priv->ctrlreq); + } + else + { + usbtrace(TRACE_DEVERROR(N32_TRACEERR_BADGETSETDESC), 0); + priv->stalled = true; + } + } + break; + + case USB_REQ_GETCONFIGURATION: + /* type: device-to-host; recipient = device + * value: 0; + * index: 0; + * len: 1; data = configuration value + */ + + { + usbtrace(TRACE_INTDECODE(N32_TRACEINTID_GETCONFIG), 0); + if (priv->addressed && + (ctrlreq->type & USB_REQ_RECIPIENT_MASK) == + USB_REQ_RECIPIENT_DEVICE && + ctrlreq->value == 0 && + ctrlreq->index == 0 && + ctrlreq->len == 1) + { + n32_req_dispatch(priv, &priv->ctrlreq); + } + else + { + usbtrace(TRACE_DEVERROR(N32_TRACEERR_BADGETCONFIG), 0); + priv->stalled = true; + } + } + break; + + case USB_REQ_SETCONFIGURATION: + /* type: host-to-device; recipient = device + * value: configuration value + * index: 0; + * len: 0; data = none + */ + + { + usbtrace(TRACE_INTDECODE(N32_TRACEINTID_SETCONFIG), 0); + if (priv->addressed && + (ctrlreq->type & USB_REQ_RECIPIENT_MASK) == + USB_REQ_RECIPIENT_DEVICE && + ctrlreq->index == 0 && + ctrlreq->len == 0) + { + /* Give the configuration to the class driver */ + + int ret = n32_req_dispatch(priv, &priv->ctrlreq); + + /* If the class driver accepted the configuration, then mark + * the device state as configured (or not, depending on the + * configuration). + */ + + if (ret == OK) + { + uint8_t cfg = (uint8_t)ctrlreq->value; + + if (cfg != 0) + { + priv->devstate = DEVSTATE_CONFIGURED; + priv->configured = true; + } + else + { + priv->devstate = DEVSTATE_ADDRESSED; + priv->configured = false; + } + } + } + else + { + usbtrace(TRACE_DEVERROR(N32_TRACEERR_BADSETCONFIG), 0); + priv->stalled = true; + } + } + break; + + case USB_REQ_GETINTERFACE: + /* type: device-to-host; recipient = interface + * value: 0 + * index: interface; + * len: 1; data = alt interface + */ + + case USB_REQ_SETINTERFACE: + /* type: host-to-device; recipient = interface + * value: alternate setting + * index: interface; + * len: 0; data = none + */ + + { + usbtrace(TRACE_INTDECODE(N32_TRACEINTID_GETSETIF), 0); + n32_req_dispatch(priv, &priv->ctrlreq); + } + break; + + case USB_REQ_SYNCHFRAME: + /* type: device-to-host; recipient = endpoint + * value: 0 + * index: endpoint; + * len: 2; data = frame number + */ + + { + usbtrace(TRACE_INTDECODE(N32_TRACEINTID_SYNCHFRAME), 0); + } + break; + + default: + { + usbtrace(TRACE_DEVERROR(N32_TRACEERR_INVALIDCTRLREQ), 0); + priv->stalled = true; + } + break; + } +} + +/**************************************************************************** + * Name: n32_ep0out_setup + * + * Description: + * USB Ctrl EP Setup Event. This is logically part of the USB interrupt + * handler. This event occurs when a setup packet is receive on EP0 OUT. + * + ****************************************************************************/ + +static inline void n32_ep0out_setup(struct n32_usbdev_s *priv) +{ + struct n32_ctrlreq_s ctrlreq; + + /* Verify that a SETUP was received */ + + if (priv->ep0state != EP0STATE_SETUP_READY) + { + usbtrace(TRACE_DEVERROR(N32_TRACEERR_EP0NOSETUP), priv->ep0state); + return; + } + + /* Terminate any pending requests */ + + n32_req_cancel(&priv->epout[EP0], -EPROTO); + n32_req_cancel(&priv->epin[EP0], -EPROTO); + + /* Assume NOT stalled */ + + priv->epout[EP0].stalled = false; + priv->epin[EP0].stalled = false; + priv->stalled = false; + + /* Starting to process a control request - update state */ + + priv->ep0state = EP0STATE_SETUP_PROCESS; + + /* And extract the little-endian 16-bit values to host order */ + + ctrlreq.type = priv->ctrlreq.type; + ctrlreq.req = priv->ctrlreq.req; + ctrlreq.value = GETUINT16(priv->ctrlreq.value); + ctrlreq.index = GETUINT16(priv->ctrlreq.index); + ctrlreq.len = GETUINT16(priv->ctrlreq.len); + + uinfo("type=%02x req=%02x value=%04x index=%04x len=%04x\n", + ctrlreq.type, ctrlreq.req, ctrlreq.value, + ctrlreq.index, ctrlreq.len); + + /* Check for a standard request */ + + if ((ctrlreq.type & USB_REQ_TYPE_MASK) != USB_REQ_TYPE_STANDARD) + { + /* Dispatch any non-standard requests */ + + n32_req_dispatch(priv, &priv->ctrlreq); + } + else + { + /* Handle standard requests. */ + + n32_ep0out_stdrequest(priv, &ctrlreq); + } + + /* Check if the setup processing resulted in a STALL */ + + if (priv->stalled) + { + usbtrace(TRACE_DEVERROR(N32_TRACEERR_EP0SETUPSTALLED), + priv->ep0state); + n32_ep0_stall(priv); + } + + /* Reset state/data associated with the SETUP request */ + + priv->ep0datlen = 0; +} + +/**************************************************************************** + * Name: n32_epout + * + * Description: + * This is part of the OUT endpoint interrupt processing. This function + * handles the OUT event for a single endpoint. + * + ****************************************************************************/ + +static inline void n32_epout(struct n32_usbdev_s *priv, uint8_t epno) +{ + struct n32_ep_s *privep; + + /* Endpoint 0 is a special case. */ + + if (epno == 0) + { + privep = &priv->epout[EP0]; + + /* In the EP0STATE_DATA_OUT state, we are receiving data into the + * request buffer. In that case, we must continue the request + * processing. + */ + + if (priv->ep0state == EP0STATE_DATA_OUT) + { + /* Continue processing data from the EP0 OUT request queue */ + + n32_epout_complete(priv, privep); + + /* If we are not actively processing an OUT request, then we + * need to setup to receive the next control request. + */ + + if (!privep->active) + { + n32_ep0out_ctrlsetup(priv); + priv->ep0state = EP0STATE_IDLE; + } + } + } + + /* For other endpoints, the only possibility is that we are continuing + * or finishing an OUT request. + */ + + else if (priv->devstate == DEVSTATE_CONFIGURED) + { + n32_epout_complete(priv, &priv->epout[epno]); + } +} + +/**************************************************************************** + * Name: n32_epout_interrupt + * + * Description: + * USB OUT endpoint interrupt handler. The core generates this interrupt + * when there is an interrupt is pending on one of the OUT endpoints of the + * core. The driver must read the OTG DAINT register to determine the exact + * number of the OUT endpoint on which the interrupt occurred, and then + * read the corresponding OTG DOEPINTx register to determine the exact + * cause of the interrupt. + * + ****************************************************************************/ + +static inline void n32_epout_interrupt(struct n32_usbdev_s *priv) +{ + uint32_t daint; + uint32_t regval; + uint32_t doepint; + int epno; + + /* Get the pending, enabled interrupts for the OUT endpoint from the + * endpoint interrupt status register. + */ + + regval = n32_getreg(N32_USBHS_DAEPINTSTS); + regval &= n32_getreg(N32_USBHS_DAEPINTEN); + daint = (regval & N32_USBHS_DAINT_OEP_MASK) >> N32_USBHS_DAINT_OEP_SHIFT; + + if (daint == 0) + { + /* We got an interrupt, but there is no unmasked endpoint that caused + * it ?! When this happens, the interrupt flag never gets cleared and + * we are stuck in infinite interrupt loop. + * + * This shouldn't happen if we are diligent about handling timing + * issues when masking endpoint interrupts. However, this workaround + * avoids infinite loop and allows operation to continue normally. It + * works by clearing each endpoint flags, masked or not. + */ + + regval = n32_getreg(N32_USBHS_DAEPINTSTS); + daint = (regval & N32_USBHS_DAINT_OEP_MASK) >> + N32_USBHS_DAINT_OEP_SHIFT; + + usbtrace(TRACE_DEVERROR(N32_TRACEERR_EPOUTUNEXPECTED), + (uint16_t)regval); + + epno = 0; + while (daint) + { + if ((daint & 1) != 0) + { + regval = n32_getreg(N32_USBHS_DOUTEPINTSTS(epno)); + uerr("DOEPINT(%d) = %08" PRIx32 "\n", epno, regval); + n32_putreg(0xff, N32_USBHS_DOUTEPINTSTS(epno)); + } + + epno++; + daint >>= 1; + } + + return; + } + + /* Process each pending IN endpoint interrupt */ + + epno = 0; + while (daint) + { + /* Is an OUT interrupt pending for this endpoint? */ + + if ((daint & 1) != 0) + { + /* Yes.. get the OUT endpoint interrupt status */ + + doepint = n32_getreg(N32_USBHS_DOUTEPINTSTS(epno)); + doepint &= n32_getreg(N32_USBHS_DOUTEPINTEN); + + /* Transfer completed interrupt. This interrupt is triggered when + * n32_rxinterrupt() removes the last packet data from the + * RxFIFO. In this case, core internally sets the NAK bit for this + * endpoint to prevent it from receiving any more packets. + */ + + if ((doepint & N32_USBHS_DOUTEPINTSTS_TXCIF) != 0) + { + usbtrace(TRACE_INTDECODE(N32_TRACEINTID_EPOUT_XFRC), + (uint16_t)doepint); + + /* Clear the bit in DOEPINTn for this interrupt */ + + n32_putreg(N32_USBHS_DOUTEPINTSTS_TXCIF, + N32_USBHS_DOUTEPINTSTS(epno)); + + /* Handle the RX transfer data ready event */ + + n32_epout(priv, epno); + } + + /* Endpoint disabled interrupt (ignored because this interrupt is + * used in polled mode by the endpoint disable logic). + */ +#if 1 + /* REVISIT: */ + + if ((doepint & N32_USBHS_DOUTEPINTSTS_EPDISIF) != 0) + { + usbtrace(TRACE_INTDECODE(N32_TRACEINTID_EPOUT_EPDISD), + (uint16_t)doepint); + + /* Clear the bit in DOEPINTn for this interrupt */ + + n32_putreg(N32_USBHS_DOUTEPINTSTS_EPDISIF, + N32_USBHS_DOUTEPINTSTS(epno)); + } +#endif + + /* Setup Phase Done (control EPs) */ + + if ((doepint & N32_USBHS_DOUTEPINTSTS_STUPPDNEIF) != 0) + { + usbtrace(TRACE_INTDECODE(N32_TRACEINTID_EPOUT_SETUP), + priv->ep0state); + + /* Handle the receipt of the IN SETUP packets now (OUT setup + * packet processing may be delayed until the accompanying + * OUT DATA is received) + */ + + if (priv->ep0state == EP0STATE_SETUP_READY) + { + n32_ep0out_setup(priv); + } + + n32_putreg(N32_USBHS_DOUTEPINTSTS_STUPPDNEIF, + N32_USBHS_DOUTEPINTSTS(epno)); + } + } + + epno++; + daint >>= 1; + } +} + +/**************************************************************************** + * Name: n32_epin_runtestmode + * + * Description: + * Execute the test mode setup by the SET FEATURE request + * + ****************************************************************************/ + +static inline void n32_epin_runtestmode(struct n32_usbdev_s *priv) +{ + uint32_t regval = n32_getreg(N32_USBHS_DCTRL); + + regval &= N32_USBHS_DCTRL_TSCTRL_MASK; + regval |= (uint32_t)priv->testmode << N32_USBHS_DCTRL_TSCTRL_SHIFT; + n32_putreg(regval , N32_USBHS_DCTRL); + + priv->dotest = 0; + priv->testmode = N32_USBHS_TESTMODE_DISABLED; +} + +/**************************************************************************** + * Name: n32_epin + * + * Description: + * This is part of the IN endpoint interrupt processing. This function + * handles the IN event for a single endpoint. + * + ****************************************************************************/ + +static inline void n32_epin(struct n32_usbdev_s *priv, uint8_t epno) +{ + struct n32_ep_s *privep = &priv->epin[epno]; + + /* Endpoint 0 is a special case. */ + + if (epno == 0) + { + /* In the EP0STATE_DATA_IN state, we are sending data from request + * buffer. In that case, we must continue the request processing. + */ + + if (priv->ep0state == EP0STATE_DATA_IN) + { + /* Continue processing data from the EP0 OUT request queue */ + + n32_epin_request(priv, privep); + + /* If we are not actively processing an OUT request, then we + * need to setup to receive the next control request. + */ + + if (!privep->active) + { + n32_ep0out_ctrlsetup(priv); + priv->ep0state = EP0STATE_IDLE; + } + } + + /* Test mode is another special case */ + + if (priv->dotest) + { + n32_epin_runtestmode(priv); + } + } + + /* For other endpoints, the only possibility is that we are continuing + * or finishing an IN request. + */ + + else if (priv->devstate == DEVSTATE_CONFIGURED) + { + /* Continue processing data from the endpoint write request queue */ + + n32_epin_request(priv, privep); + } +} + +/**************************************************************************** + * Name: n32_epin_txfifoempty + * + * Description: + * TxFIFO empty interrupt handling + * + ****************************************************************************/ + +static inline void n32_epin_txfifoempty(struct n32_usbdev_s *priv, + int epno) +{ + struct n32_ep_s *privep = &priv->epin[epno]; + + /* Continue processing the write request queue. This may mean sending + * more data from the existing request or terminating the current requests + * and (perhaps) starting the IN transfer from the next write request. + */ + + n32_epin_request(priv, privep); +} + +/**************************************************************************** + * Name: n32_epin_interrupt + * + * Description: + * USB IN endpoint interrupt handler. The core generates this interrupt + * when an interrupt is pending on one of the IN endpoints of the core. The + * driver must read the OTG DAINT register to determine the exact number of + * the IN endpoint on which the interrupt occurred, and then read the + * corresponding OTG DIEPINTx register to determine the exact cause of the + * interrupt. + * + ****************************************************************************/ + +static inline void n32_epin_interrupt(struct n32_usbdev_s *priv) +{ + uint32_t diepint; + uint32_t daint; + uint32_t mask; + uint32_t empty; + int epno; + + /* Get the pending, enabled interrupts for the IN endpoint from the + * endpoint interrupt status register. + */ + + daint = n32_getreg(N32_USBHS_DAEPINTSTS); + daint &= n32_getreg(N32_USBHS_DAEPINTEN); + daint &= N32_USBHS_DAINT_IEP_MASK; + + if (daint == 0) + { + /* We got an interrupt, but there is no unmasked endpoint that caused + * it ?! When this happens, the interrupt flag never gets cleared and + * we are stuck in infinite interrupt loop. + * + * This shouldn't happen if we are diligent about handling timing + * issues when masking endpoint interrupts. However, this workaround + * avoids infinite loop and allows operation to continue normally. It + * works by clearing each endpoint flags, masked or not. + */ + + daint = n32_getreg(N32_USBHS_DAEPINTSTS); + usbtrace(TRACE_DEVERROR(N32_TRACEERR_EPINUNEXPECTED), + (uint16_t)daint); + + daint &= N32_USBHS_DAINT_IEP_MASK; + epno = 0; + + while (daint) + { + if ((daint & 1) != 0) + { + uerr("DIEPINT(%d) = %08" PRIx32 "\n", + epno, n32_getreg(N32_USBHS_DINEPINTSTS(epno))); + n32_putreg(0xff, N32_USBHS_DINEPINTSTS(epno)); + } + + epno++; + daint >>= 1; + } + + return; + } + + /* Process each pending IN endpoint interrupt */ + + epno = 0; + while (daint) + { + /* Is an IN interrupt pending for this endpoint? */ + + if ((daint & 1) != 0) + { + /* Get IN interrupt mask register. Bits 0-6 correspond to enabled + * interrupts as will be found in the DIEPINT interrupt status + * register. + */ + + mask = n32_getreg(N32_USBHS_DINEPINTEN); + + /* Check if the TxFIFO not empty interrupt is enabled for this + * endpoint in the DIEPMSK register. Bits n corresponds to + * endpoint n in the register. That condition corresponds to + * bit 7 of the DIEPINT interrupt status register. There is + * no TXFE bit in the mask register, so we fake one here. + */ + + empty = n32_getreg(N32_USBHS_DINEPFEINTEN); + if ((empty & N32_USBHS_DINEPFEINTEN_IEP(epno)) != 0) + { + mask |= N32_USBHS_DINEPINTSTS_TXFEIF; + } + + /* Now, read the interrupt status and mask out all disabled + * interrupts. + */ + + diepint = n32_getreg(N32_USBHS_DINEPINTSTS(epno)) & mask; + + /* Decode and process the enabled, pending interrupts */ + + /* Transfer completed interrupt */ + + if ((diepint & N32_USBHS_DINEPINTSTS_TXCIF) != 0) + { + usbtrace(TRACE_INTDECODE(N32_TRACEINTID_EPIN_XFRC), + (uint16_t)diepint); + + /* It is possible that logic may be waiting for a the + * TxFIFO to become empty. We disable the TxFIFO empty + * interrupt here; it will be re-enabled if there is still + * insufficient space in the TxFIFO. + */ + + empty &= ~N32_USBHS_DINEPFEINTEN_IEP(epno); + n32_putreg(empty, N32_USBHS_DINEPFEINTEN); + n32_putreg(N32_USBHS_DINEPINTSTS_TXCIF, + N32_USBHS_DINEPINTSTS(epno)); + + /* IN transfer complete */ + + n32_epin(priv, epno); + } + + /* Timeout condition */ + + if ((diepint & N32_USBHS_DINEPINTSTS_TOUTIF) != 0) + { + usbtrace(TRACE_INTDECODE(N32_TRACEINTID_EPIN_TOC), + (uint16_t)diepint); + n32_putreg(N32_USBHS_DINEPINTSTS_TOUTIF, + N32_USBHS_DINEPINTSTS(epno)); + } + + /* IN token received when TxFIFO is empty. Applies to non-periodic + * IN endpoints only. This interrupt indicates that an IN token + * was received when the associated TxFIFO (periodic/non-periodic) + * was empty. This interrupt is asserted on the endpoint for which + * the IN token was received. + */ + + if ((diepint & N32_USBHS_DINEPINTSTS_TXFERINTIF) != 0) + { + usbtrace(TRACE_INTDECODE(N32_TRACEINTID_EPIN_ITTXFE), + (uint16_t)diepint); + n32_epin_request(priv, &priv->epin[epno]); + n32_putreg(N32_USBHS_DINEPINTSTS_TXFERINTIF, + N32_USBHS_DINEPINTSTS(epno)); + } + + /* IN endpoint NAK effective (ignored as this used only in polled + * mode) + */ +#if 0 + if ((diepint & N32_USBHS_DINEPINTSTS_INEPNAKEIF) != 0) + { + usbtrace(TRACE_INTDECODE(N32_TRACEINTID_EPIN_INEPNE), + (uint16_t)diepint); + n32_putreg(N32_USBHS_DINEPINTSTS_INEPNAKEIF, + N32_USBHS_DINEPINTSTS(epno)); + } +#endif + + /* Endpoint disabled interrupt (ignored as this used only in polled + * mode) + */ +#if 0 + if ((diepint & N32_USBHS_DINEPINTSTS_EPDISIF) != 0) + { + usbtrace(TRACE_INTDECODE(N32_TRACEINTID_EPIN_EPDISD), + (uint16_t)diepint); + n32_putreg(N32_USBHS_DINEPINTSTS_EPDISIF, + N32_USBHS_DINEPINTSTS(epno)); + } +#endif + + /* Transmit FIFO empty */ + + if ((diepint & N32_USBHS_DINEPINTSTS_TXFEIF) != 0) + { + usbtrace(TRACE_INTDECODE(N32_TRACEINTID_EPIN_TXFE), + (uint16_t)diepint); + + /* If we were waiting for TxFIFO to become empty, the we might + * have both XFRC and TXFE interrupts pending. Since we do the + * same thing for both cases, ignore the TXFE if we have + * already processed the XFRC. + */ + + if ((diepint & N32_USBHS_DINEPINTSTS_TXCIF) == 0) + { + /* Mask further FIFO empty interrupts. + * This will be re-enabled whenever we need to wait for a + * FIFO event. + */ + + empty &= ~N32_USBHS_DINEPFEINTEN_IEP(epno); + n32_putreg(empty, N32_USBHS_DINEPFEINTEN); + + /* Handle TxFIFO empty */ + + n32_epin_txfifoempty(priv, epno); + } + + /* Clear the pending TxFIFO empty interrupt */ + + n32_putreg(N32_USBHS_DINEPINTSTS_TXFEIF, + N32_USBHS_DINEPINTSTS(epno)); + } + } + + epno++; + daint >>= 1; + } +} + +/**************************************************************************** + * Name: n32_resumeinterrupt + * + * Description: + * Resume/remote wakeup detected interrupt + * + ****************************************************************************/ + +static inline void n32_resumeinterrupt(struct n32_usbdev_s *priv) +{ + uint32_t regval; + + /* Restart the PHY clock and un-gate USB core clock (HCLK) */ + +#ifdef CONFIG_USBDEV_LOWPOWER + regval = n32_getreg(N32_USBHS_PWRCTRL); + regval &= ~(N32_USBHS_PWRCTRL_PHYSTP | N32_USBHS_PWRCTRL_GATEHCLK); + n32_putreg(regval, N32_USBHS_PWRCTRL); +#endif + + /* Clear remote wake-up signaling */ + + regval = n32_getreg(N32_USBHS_DCTRL); + regval &= ~N32_USBHS_DCTRL_RMWKUP; + n32_putreg(regval, N32_USBHS_DCTRL); + + /* Restore full power -- whatever that means for this particular board */ + + n32_usbsuspend((struct usbdev_s *)priv, true); + + /* Notify the class driver of the resume event */ + + if (priv->driver) + { + CLASS_RESUME(priv->driver, &priv->usbdev); + } +} + +/**************************************************************************** + * Name: n32_suspendinterrupt + * + * Description: + * USB suspend interrupt + * + ****************************************************************************/ + +static inline void n32_suspendinterrupt(struct n32_usbdev_s *priv) +{ +#ifdef CONFIG_USBDEV_LOWPOWER + uint32_t regval; +#endif + + /* Notify the class driver of the suspend event */ + + if (priv->driver) + { + CLASS_SUSPEND(priv->driver, &priv->usbdev); + } + +#ifdef CONFIG_USBDEV_LOWPOWER + /* N32_USBHS_DSTS_SUSPF is set as long as the suspend condition is detected + * on USB. Check if we are still have the suspend condition, that we are + * connected to the host, and that we have been configured. + */ + + regval = n32_getreg(N32_USBHS_DSTS); + + if ((regval & N32_USBHS_DSTS_SUSPF) != 0 && devstate == + DEVSTATE_CONFIGURED) + { + /* Switch off OTG clocking. Setting N32_USBHS_PWRCTRL_PHYSTP stops the + * PHY clock. + */ + + regval = n32_getreg(N32_USBHS_PWRCTRL); + regval |= N32_USBHS_PWRCTRL_PHYSTP; + n32_putreg(regval, N32_USBHS_PWRCTRL); + + /* Setting N32_USBHS_PWRCTRL_GATEHCLK gate HCLK to modules other than + * the AHB Slave and Master and wakeup logic. + */ + + regval |= N32_USBHS_PWRCTRL_GATEHCLK; + n32_putreg(regval, N32_USBHS_PWRCTRL); + } +#endif + + /* Let the board-specific logic know that we have entered the suspend + * state + */ + + n32_usbsuspend((struct usbdev_s *)priv, false); +} + +/**************************************************************************** + * Name: n32_rxinterrupt + * + * Description: + * RxFIFO non-empty interrupt. This interrupt indicates that there is at + * least one packet pending to be read from the RxFIFO. + * + ****************************************************************************/ + +static inline void n32_rxinterrupt(struct n32_usbdev_s *priv) +{ + struct n32_ep_s *privep; + uint32_t regval; + int bcnt; + int epphy; + + /* Get the status from the top of the FIFO */ + + regval = n32_getreg(N32_USBHS_GRXSTSP); + + /* Decode status fields */ + + epphy = (regval & N32_USBHS_GRXSTS_CHEPNUM_MASK) >> + N32_USBHS_GRXSTS_CHEPNUM_SHIFT; + + if (epphy < N32_USBHS_NENDPOINTS) + { + privep = &priv->epout[epphy]; + + /* Handle the RX event according to the packet status field */ + + switch (regval & N32_USBHS_GRXSTS_PKTSTS_MASK) + { + /* Global OUT NAK. + * This indicate that the global OUT NAK bit + * has taken effect. + * + * PKTSTS = Global OUT NAK, BCNT = 0, EPNUM = Don't Care, + * DPID = Don'tCare. + */ + + case N32_USBHS_GRXSTS_OUT_NAK: + { + usbtrace(TRACE_INTDECODE(N32_TRACEINTID_OUTNAK), 0); + } + break; + + /* OUT data packet received. + * + * PKTSTS = DataOUT, BCNT = size of the received data OUT packet, + * EPNUM = EPNUM on which the packet was received, + * DPID = Actual Data PID. + */ + + case N32_USBHS_GRXSTS_OUT_RCVD: + { + usbtrace(TRACE_INTDECODE(N32_TRACEINTID_OUTRECVD), epphy); + bcnt = (regval & N32_USBHS_GRXSTS_BCNT_MASK) >> + N32_USBHS_GRXSTS_BCNT_SHIFT; + if (bcnt > 0) + { + n32_epout_receive(privep, bcnt); + } + } + break; + + /* OUT transfer completed. + * This indicates that an OUT data transfer for the specified OUT + * endpoint has completed. After this entry is popped from the + * receive FIFO, the core asserts a Transfer Completed interrupt + * on the specified OUT endpoint. + * + * PKTSTS = Data OUT Transfer Done, BCNT = 0, EPNUM = OUT EP Num on + * which the data transfer is complete, DPID = Don't Care. + */ + + case N32_USBHS_GRXSTS_OUT_CPLT: + { + usbtrace(TRACE_INTDECODE(N32_TRACEINTID_OUTDONE), epphy); + } + break; + + /* SETUP transaction completed. + * This indicates that the Setup stage for the specified endpoint + * has completed and the Data stage has started. + * After this entry is popped from the receive FIFO, the core + * asserts a Setup interrupt on the specified control OUT endpoint + * (triggers an interrupt). + * + * PKTSTS = Setup Stage Done, BCNT = 0, EPNUM = Control EP Num, + * DPID = Don't Care. + */ + + case N32_USBHS_GRXSTS_SETUP_DNE: + { + usbtrace(TRACE_INTDECODE(N32_TRACEINTID_SETUPDONE), epphy); + + /* Now that the Setup Phase is complete if it was an OUT enable + * the endpoint + * (Doing this here prevents the loss of the first FIFO word) + */ + + if (priv->ep0state == EP0STATE_SETUP_OUT) + { + /* Clear NAKSTS so that we can receive the data */ + + regval = n32_getreg(N32_USBHS_DOUTEPCTRL(0)); + regval |= N32_USBHS_DOUTEP0CTRL_CNAK; + n32_putreg(regval, N32_USBHS_DOUTEPCTRL(0)); + } + } + break; + + /* SETUP data packet received. + * This indicates that a SETUP packet for the specified endpoint is + * now available for reading from the receive FIFO. + * + * PKTSTS = SETUP, BCNT = 8, EPNUM = Control EP Num, DPID = D0. + */ + + case N32_USBHS_GRXSTS_SETUP_RCVD: + { + uint16_t datlen; + + usbtrace(TRACE_INTDECODE(N32_TRACEINTID_SETUPRECVD), epphy); + + /* Read EP0 setup data. + * NOTE: If multiple SETUP packets are received, the last one + * overwrites the previous setup packets and only that last + * SETUP packet will be processed. + */ + + n32_rxfifo_read(&priv->epout[EP0], + (uint8_t *)&priv->ctrlreq, + USB_SIZEOF_CTRLREQ); + + /* Was this an IN or an OUT SETUP packet.If it is an OUT SETUP, + * then we need to wait for the completion of the data phase to + * process the setup command. If it is an IN SETUP packet, then + * we must processing the command BEFORE we enter the DATA + * phase. + * + * If the data associated with the OUT SETUP packet is zero + * length, then, of course, we don't need to wait. + */ + + datlen = GETUINT16(priv->ctrlreq.len); + if (USB_REQ_ISOUT(priv->ctrlreq.type) && datlen > 0) + { + priv->ep0state = EP0STATE_SETUP_OUT; + } + else + { + /* We can process the setup data as soon as SETUP done word + * is popped of the RxFIFO. + */ + + priv->ep0state = EP0STATE_SETUP_READY; + } + } + break; + + default: + { + usbtrace(TRACE_DEVERROR(N32_TRACEERR_INVALIDPARMS), + (regval & N32_USBHS_GRXSTS_PKTSTS_MASK) >> + N32_USBHS_GRXSTS_PKTSTS_SHIFT); + } + break; + } + } +} + +/**************************************************************************** + * Name: n32_enuminterrupt + * + * Description: + * Enumeration done interrupt + * + ****************************************************************************/ + +static inline void n32_enuminterrupt(struct n32_usbdev_s *priv) +{ + uint32_t regval; + + /* Activate EP0 */ + + n32_ep0in_activate(); + + regval = n32_getreg(N32_USBHS_GCFG); + regval &= ~N32_USBHS_GCFG_TRDTIM_MASK; +#ifdef CONFIG_N32H7_USBHS_FS + regval |= N32_USBHS_GCFG_TRDTIM(5); +#else + regval |= N32_USBHS_GCFG_TRDTIM(9); +#endif + n32_putreg(regval, N32_USBHS_GCFG); +} + +/**************************************************************************** + * Name: n32_isocininterrupt + * + * Description: + * Incomplete isochronous IN transfer interrupt. Assertion of the + * incomplete isochronous IN transfer interrupt indicates an incomplete + * isochronous IN transfer on at least one of the isochronous IN endpoints. + * + ****************************************************************************/ + +#ifdef CONFIG_USBDEV_ISOCHRONOUS +static inline void n32_isocininterrupt(struct n32_usbdev_s *priv) +{ + int i; + + /* The application must read the endpoint control register for all + * isochronous IN endpoints to detect endpoints with incomplete IN data + * transfers. + */ + + for (i = 0; i < N32_USBHS_NENDPOINTS; i++) + { + /* Is this an isochronous IN endpoint? */ + + privep = &priv->epin[i]; + if (privep->eptype != USB_EP_ATTR_XFER_ISOC) + { + /* No... keep looking */ + + continue; + } + + /* Is there an active read request on the isochronous OUT endpoint? */ + + if (!privep->active) + { + /* No.. the endpoint is not actively transmitting data */ + + continue; + } + + /* Check if this is the endpoint that had the incomplete transfer */ + + regaddr = N32_USBHS_DINEPCTRL(privep->epphy); + doepctl = n32_getreg(regaddr); + dsts = n32_getreg(N32_USBHS_DSTS); + + /* EONUM = 0:even frame, 1:odd frame + * SOFFN = Frame number of the received SOF + */ + + eonum = ((doepctl & N32_USBHS_DINEPCTRL_EPDPID_EPEOFRM) != 0); + soffn = ((dsts & N32_USBHS_DSTS_SOFFN0) != 0); + + if (eonum != soffn) + { + /* Not this endpoint */ + + continue; + } + + /* For isochronous IN endpoints with incomplete transfers, + * the application must discard the data in the memory and + * disable the endpoint. + */ + + n32_req_complete(privep, -EIO); +#warning "Will clear N32_USBHS_DINEPCTRL_EPACT too" + n32_epin_disable(privep); + break; + } +} +#endif + +/**************************************************************************** + * Name: n32_isocoutinterrupt + * + * Description: + * Incomplete periodic transfer interrupt + * + ****************************************************************************/ + +#ifdef CONFIG_USBDEV_ISOCHRONOUS +static inline void n32_isocoutinterrupt(struct n32_usbdev_s *priv) +{ + struct n32_ep_s *privep; + struct n32_req_s *privreq; + uint32_t regaddr; + uint32_t doepctl; + uint32_t dsts; + bool eonum; + bool soffn; + + /* When it receives an IISOOXFR interrupt, the application must read the + * control registers of all isochronous OUT endpoints to determine which + * endpoints had an incomplete transfer in the current microframe. An + * endpoint transfer is incomplete if both the following conditions are + * true: + * + * DOEPCTLx:EONUM = DSTS:SOFFN[0], and + * DOEPCTLx:EPENA = 1 + */ + + for (i = 0; i < N32_USBHS_NENDPOINTS; i++) + { + /* Is this an isochronous OUT endpoint? */ + + privep = &priv->epout[i]; + if (privep->eptype != USB_EP_ATTR_XFER_ISOC) + { + /* No... keep looking */ + + continue; + } + + /* Is there an active read request on the isochronous OUT endpoint? */ + + if (!privep->active) + { + /* No.. the endpoint is not actively transmitting data */ + + continue; + } + + /* Check if this is the endpoint that had the incomplete transfer */ + + regaddr = N32_USBHS_DOUTEPCTRL(privep->epphy); + doepctl = n32_getreg(regaddr); + dsts = n32_getreg(N32_USBHS_DSTS); + + /* EONUM = 0:even frame, 1:odd frame + * SOFFN = Frame number of the received SOF + */ + + eonum = ((doepctl & N32_USBHS_DOUTEPCTRL_EPDPID_EPEOFRM) != 0); + soffn = ((dsts & N32_USBHS_DSTS_SOFFN0) != 0); + + if (eonum != soffn) + { + /* Not this endpoint */ + + continue; + } + + /* For isochronous OUT endpoints with incomplete transfers, + * the application must discard the data in the memory and + * disable the endpoint. + */ + + n32_req_complete(privep, -EIO); +#warning "Will clear N32_USBHS_DOUTEPCTRL_EPACT too" + n32_epout_disable(privep); + break; + } +} +#endif + +/**************************************************************************** + * Name: n32_sessioninterrupt + * + * Description: + * Session request/new session detected interrupt + * + ****************************************************************************/ + +#ifdef CONFIG_USBDEV_VBUSSENSING +static inline void n32_sessioninterrupt(struct n32_usbdev_s *priv) +{ +#warning "Missing logic" +} +#endif + +/**************************************************************************** + * Name: n32_otginterrupt + * + * Description: + * OTG interrupt + * + ****************************************************************************/ + +#ifdef CONFIG_USBDEV_VBUSSENSING +static inline void n32_otginterrupt(struct n32_usbdev_s *priv) +{ + uint32_t regval; + + regval = n32_getreg(N32_USBHS_GPD); + if ((regval & N32_USBHS_GPD_DISCONNDETSTS) != 0) + { +#warning "Missing logic" + } + + /* Clear the session change status */ + + n32_putreg(regval, N32_USBHS_GPD); +} +#endif + +/**************************************************************************** + * Name: n32_usbinterrupt + * + * Description: + * USB interrupt handler + * + ****************************************************************************/ + +static int n32_usbinterrupt(int irq, void *context, void *arg) +{ + /* At present, there is only a single OTG device support. Hence it is + * pre-allocated as g_usbhsdev. However, in most code, the private data + * structure will be referenced using the 'priv' pointer (rather than the + * global data) in order to simplify any future support for multiple + * devices. + */ + + struct n32_usbdev_s *priv = &g_usbhsdev; + uint32_t regval; + uint32_t reserved; + + usbtrace(TRACE_INTENTRY(N32_TRACEINTID_USB), 0); + + /* Assure that we are in device mode */ + + DEBUGASSERT((n32_getreg(N32_USBHS_GINTSTS) & N32_USBHS_GINTSTS_CMODE) == + 0); + + /* Get the state of all enabled interrupts. We will do this repeatedly + * some interrupts (like RXFLVL) will generate additional interrupting + * events. + */ + + for (; ; ) + { + /* Get the set of pending, un-masked interrupts */ + + regval = n32_getreg(N32_USBHS_GINTSTS); + reserved = (regval & N32_USBHS_GINT_RESERVED); + regval &= n32_getreg(N32_USBHS_GINTEN); + + /* With out modifying the reserved bits, acknowledge all + * **Writable** pending irqs we will service below + */ + + n32_putreg(((regval | reserved) & N32_USBHS_GINT_RC_W1), + N32_USBHS_GINTSTS); + + /* Break out of the loop when there are no further pending (and + * unmasked) interrupts to be processes. + */ + + if (regval == 0) + { + break; + } + + usbtrace(TRACE_INTDECODE(N32_TRACEINTID_INTPENDING), + (uint16_t)regval); + + /* OUT endpoint interrupt. The core sets this bit to indicate that an + * interrupt is pending on one of the OUT endpoints of the core. + */ + + if ((regval & N32_USBHS_GINTSTS_OUTEPIF) != 0) + { + usbtrace(TRACE_INTDECODE(N32_TRACEINTID_EPOUT), + (uint16_t)regval); + n32_epout_interrupt(priv); + } + + /* IN endpoint interrupt. The core sets this bit to indicate that + * an interrupt is pending on one of the IN endpoints of the core. + */ + + if ((regval & N32_USBHS_GINTSTS_INEPIF) != 0) + { + usbtrace(TRACE_INTDECODE(N32_TRACEINTID_EPIN), + (uint16_t)regval); + n32_epin_interrupt(priv); + } + + /* Host/device mode mismatch error interrupt */ + +#ifdef CONFIG_DEBUG_USB + if ((regval & N32_USBHS_GINTSTS_MODMISIF) != 0) + { + usbtrace(TRACE_INTDECODE(N32_TRACEINTID_MISMATCH), + (uint16_t)regval); + } +#endif + + /* Resume/remote wakeup detected interrupt */ + + if ((regval & N32_USBHS_GINTSTS_WKUPIF) != 0) + { + usbtrace(TRACE_INTDECODE(N32_TRACEINTID_WAKEUP), + (uint16_t)regval); + n32_resumeinterrupt(priv); + } + + /* USB suspend interrupt */ + + if ((regval & N32_USBHS_GINTSTS_USBSUSPIF) != 0) + { + usbtrace(TRACE_INTDECODE(N32_TRACEINTID_SUSPEND), + (uint16_t)regval); + n32_suspendinterrupt(priv); + } + + /* Start of frame interrupt */ + +#ifdef CONFIG_USBDEV_SOFINTERRUPT + if ((regval & N32_USBHS_GINTSTS_SOFIF) != 0) + { + usbtrace(TRACE_INTDECODE(N32_TRACEINTID_SOF), + (uint16_t)regval); + usbdev_sof_irq(&priv->usbdev, n32_getframe(&priv->usbdev)); + } +#endif + + /* RxFIFO non-empty interrupt. Indicates that there is at least one + * packet pending to be read from the RxFIFO. + */ + + if ((regval & N32_USBHS_GINTSTS_RXFNEIF) != 0) + { + usbtrace(TRACE_INTDECODE(N32_TRACEINTID_RXFIFO), + (uint16_t)regval); + n32_rxinterrupt(priv); + } + + /* USB reset interrupt */ + + if ((regval & (N32_USBHS_GINTSTS_USBRSTIF | N32_USBHS_GINTSTS_RSTDIF)) + != 0) + { + usbtrace(TRACE_INTDECODE(N32_TRACEINTID_DEVRESET), + (uint16_t)regval); + + /* Perform the device reset */ + + n32_usbreset(priv); + usbtrace(TRACE_INTEXIT(N32_TRACEINTID_USB), 0); + return OK; + } + + /* Enumeration done interrupt */ + + if ((regval & N32_USBHS_GINTSTS_ENUMDIF) != 0) + { + usbtrace(TRACE_INTDECODE(N32_TRACEINTID_ENUMDNE), + (uint16_t)regval); + n32_enuminterrupt(priv); + } + + /* Incomplete isochronous IN transfer interrupt. When the core finds + * non-empty any of the isochronous IN endpoint FIFOs scheduled for + * the current frame non-empty, the core generates an IISOIXFR + * interrupt. + */ + +#ifdef CONFIG_USBDEV_ISOCHRONOUS + if ((regval & N32_USBHS_GINTSTS_ISOINCIF) != 0) + { + usbtrace(TRACE_INTDECODE(N32_TRACEINTID_IISOIXFR), + (uint16_t)regval); + n32_isocininterrupt(priv); + } + + /* Incomplete isochronous OUT transfer. For isochronous OUT + * endpoints, the XFRC interrupt may not always be asserted. If the + * core drops isochronous OUT data packets, the application could fail + * to detect the XFRC interrupt. The incomplete Isochronous OUT data + * interrupt indicates that an XFRC interrupt was not asserted on at + * least one of the isochronous OUT endpoints. At this point, the + * endpoint with the incomplete transfer remains enabled, but no active + * transfers remain in progress on this endpoint on the USB. + */ + + if ((regval & N32_USBHS_GINTSTS_PTNCIF_ISOUTNCIF) != 0) + { + usbtrace(TRACE_INTDECODE(N32_TRACEINTID_IISOOXFR), + (uint16_t)regval); + n32_isocoutinterrupt(priv); + } +#endif + } + + usbtrace(TRACE_INTEXIT(N32_TRACEINTID_USB), 0); + return OK; +} + +/**************************************************************************** + * Endpoint operations + ****************************************************************************/ + +/**************************************************************************** + * Name: n32_enablegonak + * + * Description: + * Enable global OUT NAK mode + * + ****************************************************************************/ + +static void n32_enablegonak(struct n32_ep_s *privep) +{ + uint32_t regval; + + /* First, make sure that there is no GNOAKEFF interrupt pending. */ + +#if 0 + n32_putreg(N32_USBHS_GINTSTS_GOUTNAKEIF, N32_USBHS_GINTSTS); +#endif + + /* Enable Global OUT NAK mode in the core. */ + + regval = n32_getreg(N32_USBHS_DCTRL); + regval |= N32_USBHS_DCTRL_SGONAK; + n32_putreg(regval, N32_USBHS_DCTRL); + +#if 0 + /* Wait for the GONAKEFF interrupt that indicates that the OUT NAK + * mode is in effect. When the interrupt handler pops the OUTNAK word + * from the RxFIFO, the core sets the GONAKEFF interrupt. + */ + + while ((n32_getreg(N32_USBHS_GINTSTS) & N32_USBHS_GINTSTS_GOUTNAKEIF) + == 0); + n32_putreg(N32_USBHS_GINTSTS_GOUTNAKEIF, N32_USBHS_GINTSTS); + +#else + /* Since we are in the interrupt handler, we cannot wait inline for the + * GONAKEFF because it cannot occur until service the RXFLVL global + * interrupt and pop the OUTNAK word from the RxFIFO. + * + * Perhaps it is sufficient to wait for Global OUT NAK status to be + * reported in OTG DCTL register? + */ + + while ((n32_getreg(N32_USBHS_DCTRL) & N32_USBHS_DCTRL_GONAKSTS) == 0); +#endif +} + +/**************************************************************************** + * Name: n32_disablegonak + * + * Description: + * Disable global OUT NAK mode + * + ****************************************************************************/ + +static void n32_disablegonak(struct n32_ep_s *privep) +{ + uint32_t regval; + + /* Set the "Clear the Global OUT NAK bit" to disable global OUT NAK mode */ + + regval = n32_getreg(N32_USBHS_DCTRL); + regval |= N32_USBHS_DCTRL_CGONAK; + n32_putreg(regval, N32_USBHS_DCTRL); +} + +/**************************************************************************** + * Name: n32_epout_configure + * + * Description: + * Configure an OUT endpoint, making it usable + * + * Input Parameters: + * privep - a pointer to an internal endpoint structure + * eptype - The type of the endpoint + * maxpacket - The max packet size of the endpoint + * + ****************************************************************************/ + +static int n32_epout_configure(struct n32_ep_s *privep, + uint8_t eptype, uint16_t maxpacket) +{ + uint32_t mpsiz; + uint32_t mpsiz_mask; + uint32_t regaddr; + uint32_t regval; + + usbtrace(TRACE_EPCONFIGURE, privep->epphy); + + /* The packet size is in bytes for all EP */ + + if (privep->epphy == EP0) + { + DEBUGASSERT(eptype == USB_EP_ATTR_XFER_CONTROL); + if (maxpacket >= 64) + { + mpsiz = N32_USBHS_DOUTEP0CTRL_MPLEN_64; + } + else if(maxpacket >= 32) + { + mpsiz = N32_USBHS_DOUTEP0CTRL_MPLEN_32; + } + else if(maxpacket >= 16) + { + mpsiz = N32_USBHS_DOUTEP0CTRL_MPLEN_16; + } + else + { + mpsiz = N32_USBHS_DOUTEP0CTRL_MPLEN_8; + } + + mpsiz_mask = N32_USBHS_DOUTEP0CTRL_MPLEN_MASK; + } + else + { + mpsiz = (maxpacket << N32_USBHS_DOUTEPCTRL_MPLEN_SHIFT); + mpsiz_mask = N32_USBHS_DOUTEPCTRL_MPLEN_MASK; + } + + /* If the endpoint is already active don't change the endpoint control + * register. + */ + + regaddr = N32_USBHS_DOUTEPCTRL(privep->epphy); + regval = n32_getreg(regaddr); + if ((regval & N32_USBHS_DOUTEPCTRL_EPACT) == 0) + { + if (regval & N32_USBHS_DOUTEPCTRL_NAKSTS) + { + regval |= N32_USBHS_DOUTEPCTRL_CNAK; + } + + regval &= ~(mpsiz_mask | N32_USBHS_DOUTEPCTRL_EPTYPE_MASK); + regval |= mpsiz; + regval |= (eptype << N32_USBHS_DOUTEPCTRL_EPTYPE_SHIFT); + regval |= (N32_USBHS_DOUTEPCTRL_SD0PID_SEVNFRM | + N32_USBHS_DOUTEPCTRL_EPACT); + n32_putreg(regval, regaddr); + + /* Save the endpoint configuration */ + + privep->ep.maxpacket = maxpacket; + privep->eptype = eptype; + privep->stalled = false; + privep->active = false; + privep->zlp = false; + } + + /* Enable the interrupt for this endpoint */ + + regval = n32_getreg(N32_USBHS_DAEPINTEN); + regval |= N32_USBHS_DAINT_OEP(privep->epphy); + n32_putreg(regval, N32_USBHS_DAEPINTEN); + return OK; +} + +/**************************************************************************** + * Name: n32_epin_configure + * + * Description: + * Configure an IN endpoint, making it usable + * + * Input Parameters: + * privep - a pointer to an internal endpoint structure + * eptype - The type of the endpoint + * maxpacket - The max packet size of the endpoint + * + ****************************************************************************/ + +static int n32_epin_configure(struct n32_ep_s *privep, + uint8_t eptype, uint16_t maxpacket) +{ + uint32_t mpsiz; + uint32_t mpsiz_mask; + uint32_t regaddr; + uint32_t regval; + + usbtrace(TRACE_EPCONFIGURE, privep->epphy); + + /* The packet size is in bytes for all EP */ + + if (privep->epphy == EP0) + { + DEBUGASSERT(eptype == USB_EP_ATTR_XFER_CONTROL); + if (maxpacket >= 64) + { + mpsiz = N32_USBHS_DINEP0CTRL_MPLEN_64; + } + else if(maxpacket >= 32) + { + mpsiz = N32_USBHS_DINEP0CTRL_MPLEN_32; + } + else if(maxpacket >= 16) + { + mpsiz = N32_USBHS_DINEP0CTRL_MPLEN_16; + } + else + { + mpsiz = N32_USBHS_DINEP0CTRL_MPLEN_8; + } + + mpsiz_mask = N32_USBHS_DINEP0CTRL_MPLEN_MASK; + } + else + { + mpsiz = (maxpacket << N32_USBHS_DINEPCTRL_MPLEN_SHIFT); + mpsiz_mask = N32_USBHS_DINEPCTRL_MPLEN_MASK; + } + + /* If the endpoint is already active don't change the endpoint control + * register. + */ + + regaddr = N32_USBHS_DINEPCTRL(privep->epphy); + regval = n32_getreg(regaddr); + if ((regval & N32_USBHS_DINEPCTRL_EPACT) == 0) + { + if (regval & N32_USBHS_DINEPCTRL_NAKSTS) + { + regval |= N32_USBHS_DINEPCTRL_CNAK; + } + + regval &= ~(mpsiz_mask | N32_USBHS_DINEPCTRL_EPTYPE_MASK | + N32_USBHS_DINEPCTRL_TXFNUM_MASK); + regval |= mpsiz; + regval |= (eptype << N32_USBHS_DINEPCTRL_EPTYPE_SHIFT); + regval |= (privep->epphy << N32_USBHS_DINEPCTRL_TXFNUM_SHIFT); + regval |= (N32_USBHS_DINEPCTRL_SD0PID_SEVNFRM | + N32_USBHS_DINEPCTRL_EPACT); + n32_putreg(regval, regaddr); + + /* Save the endpoint configuration */ + + privep->ep.maxpacket = maxpacket; + privep->eptype = eptype; + privep->stalled = false; + privep->active = false; + privep->zlp = false; + } + + /* Enable the interrupt for this endpoint */ + + regval = n32_getreg(N32_USBHS_DAEPINTEN); + regval |= N32_USBHS_DAINT_IEP(privep->epphy); + n32_putreg(regval, N32_USBHS_DAEPINTEN); + + return OK; +} + +/**************************************************************************** + * Name: n32_ep_configure + * + * Description: + * Configure endpoint, making it usable + * + * Input Parameters: + * ep - the struct usbdev_ep_s instance obtained from allocep() + * desc - A struct usb_epdesc_s instance describing the endpoint + * last - true if this this last endpoint to be configured. Some hardware + * needs to take special action when all of the endpoints have been + * configured. + * + ****************************************************************************/ + +static int n32_ep_configure(struct usbdev_ep_s *ep, + const struct usb_epdesc_s *desc, + bool last) +{ + struct n32_ep_s *privep = (struct n32_ep_s *)ep; + uint16_t maxpacket; + uint8_t eptype; + int ret; + + usbtrace(TRACE_EPCONFIGURE, privep->epphy); + DEBUGASSERT(desc->addr == ep->eplog); + + /* Initialize EP capabilities */ + + maxpacket = GETUINT16(desc->mxpacketsize); + eptype = desc->attr & USB_EP_ATTR_XFERTYPE_MASK; + + /* Setup Endpoint Control Register */ + + if (privep->isin) + { + ret = n32_epin_configure(privep, eptype, maxpacket); + } + else + { + ret = n32_epout_configure(privep, eptype, maxpacket); + } + + return ret; +} + +/**************************************************************************** + * Name: n32_ep0_configure + * + * Description: + * Reset Usb engine + * + ****************************************************************************/ + +static void n32_ep0_configure(struct n32_usbdev_s *priv) +{ + /* Enable EP0 IN and OUT */ + + n32_epin_configure(&priv->epin[EP0], USB_EP_ATTR_XFER_CONTROL, + CONFIG_USBDEV_EP0_MAXSIZE); + n32_epout_configure(&priv->epout[EP0], USB_EP_ATTR_XFER_CONTROL, + CONFIG_USBDEV_EP0_MAXSIZE); +} + +/**************************************************************************** + * Name: n32_epout_disable + * + * Description: + * Disable an OUT endpoint will no longer be used + * + ****************************************************************************/ + +static void n32_epout_disable(struct n32_ep_s *privep) +{ + uint32_t regaddr; + uint32_t regval; + irqstate_t flags; + + usbtrace(TRACE_EPDISABLE, privep->epphy); + + /* Is this an IN or an OUT endpoint */ + + /* Before disabling any OUT endpoint, the application must enable + * Global OUT NAK mode in the core. + */ + + flags = enter_critical_section(); + n32_enablegonak(privep); + + /* Disable the required OUT endpoint by setting the EPDIS and SNAK bits + * int DOECPTL register. + */ + + regaddr = N32_USBHS_DOUTEPCTRL(privep->epphy); + regval = n32_getreg(regaddr); + regval &= ~N32_USBHS_DOUTEPCTRL_EPACT; + regval |= (N32_USBHS_DOUTEPCTRL_EPDIS | N32_USBHS_DOUTEPCTRL_SNAK); + n32_putreg(regval, regaddr); + + /* Wait for the EPDISD interrupt which indicates that the OUT + * endpoint is completely disabled. + */ + +#if 0 /* Doesn't happen */ + regaddr = N32_USBHS_DOUTEPINTSTS(privep->epphy); + while ((n32_getreg(regaddr) & N32_USBHS_DOUTEPINTSTS_EPDISIF) == 0); +#else + /* REVISIT: */ + + up_udelay(10); +#endif + + /* Clear the EPDISD interrupt indication */ + + n32_putreg(N32_USBHS_DOUTEPINTSTS_EPDISIF, + N32_USBHS_DOUTEPINTSTS(privep->epphy)); + + /* Then disable the Global OUT NAK mode to continue receiving data + * from other non-disabled OUT endpoints. + */ + + n32_disablegonak(privep); + + /* Disable endpoint interrupts */ + + regval = n32_getreg(N32_USBHS_DAEPINTEN); + regval &= ~N32_USBHS_DAINT_OEP(privep->epphy); + n32_putreg(regval, N32_USBHS_DAEPINTEN); + + /* Cancel any queued read requests */ + + n32_req_cancel(privep, -ESHUTDOWN); + + leave_critical_section(flags); +} + +/**************************************************************************** + * Name: n32_epin_disable + * + * Description: + * Disable an IN endpoint when it will no longer be used + * + ****************************************************************************/ + +static void n32_epin_disable(struct n32_ep_s *privep) +{ + uint32_t regaddr; + uint32_t regval; + irqstate_t flags; + + usbtrace(TRACE_EPDISABLE, privep->epphy); + + /* After USB reset, the endpoint will already be deactivated by the + * hardware. Trying to disable again will just hang in the wait. + */ + + regaddr = N32_USBHS_DINEPCTRL(privep->epphy); + regval = n32_getreg(regaddr); + if ((regval & N32_USBHS_DINEPCTRL_EPACT) == 0) + { + return; + } + + /* This INEPNE wait logic is suggested by reference manual, but seems + * to get stuck to infinite loop. + */ + +#if 0 + /* Make sure that there is no pending IPEPNE interrupt (because we are + * to poll this bit below). + */ + + n32_putreg(N32_USBHS_DINEPINTSTS_INEPNAKEIF, + N32_USBHS_DINEPINTSTS(privep->epphy)); + + /* Set the endpoint in NAK mode */ + + regaddr = N32_USBHS_DINEPCTRL(privep->epphy); + regval = n32_getreg(regaddr); + regval &= ~N32_USBHS_DINEPCTRL_EPACT; + regval |= (N32_USBHS_DINEPCTRL_EPDIS | N32_USBHS_DINEPCTRL_SNAK); + n32_putreg(regval, regaddr); + + /* Wait for the INEPNE interrupt that indicates that we are now in + * NAK mode + */ + + regaddr = N32_USBHS_DINEPINTSTS(privep->epphy); + while ((n32_getreg(regaddr) & N32_USBHS_DINEPINTSTS_INEPNAKEIF) == 0); + + /* Clear the INEPNE interrupt indication */ + + n32_putreg(N32_USBHS_DINEPINTSTS_INEPNAKEIF, regaddr); +#endif + + /* Deactivate and disable the endpoint by setting the EPDIS and SNAK bits + * the DIEPCTLx register. + */ + + flags = enter_critical_section(); + regaddr = N32_USBHS_DINEPCTRL(privep->epphy); + regval = n32_getreg(regaddr); + regval &= ~N32_USBHS_DINEPCTRL_EPACT; + regval |= (N32_USBHS_DINEPCTRL_EPDIS | N32_USBHS_DINEPCTRL_SNAK); + n32_putreg(regval, regaddr); + + /* Wait for the EPDISD interrupt which indicates that the IN + * endpoint is completely disabled. + */ + + regaddr = N32_USBHS_DINEPINTSTS(privep->epphy); + while ((n32_getreg(regaddr) & N32_USBHS_DINEPINTSTS_EPDISIF) == 0); + + /* Clear the EPDISD interrupt indication */ + + regval = n32_getreg(regaddr); + regval |= N32_USBHS_DINEPINTSTS_EPDISIF; + n32_putreg(regval, regaddr); + + /* Flush any data remaining in the TxFIFO */ + + n32_txfifo_flush(N32_USBHS_GRSTCTRL_TXFNUM_D(privep->epphy)); + + /* Disable endpoint interrupts */ + + regval = n32_getreg(N32_USBHS_DAEPINTEN); + regval &= ~N32_USBHS_DAINT_IEP(privep->epphy); + n32_putreg(regval, N32_USBHS_DAEPINTEN); + + /* Cancel any queued write requests */ + + n32_req_cancel(privep, -ESHUTDOWN); + leave_critical_section(flags); +} + +/**************************************************************************** + * Name: n32_ep_disable + * + * Description: + * The endpoint will no longer be used + * + ****************************************************************************/ + +static int n32_ep_disable(struct usbdev_ep_s *ep) +{ + struct n32_ep_s *privep = (struct n32_ep_s *)ep; + +#ifdef CONFIG_DEBUG_FEATURES + if (!ep) + { + usbtrace(TRACE_DEVERROR(N32_TRACEERR_INVALIDPARMS), 0); + return -EINVAL; + } +#endif + + usbtrace(TRACE_EPDISABLE, privep->epphy); + + /* Is this an IN or an OUT endpoint */ + + if (privep->isin) + { + /* Disable the IN endpoint */ + + n32_epin_disable(privep); + } + else + { + /* Disable the OUT endpoint */ + + n32_epout_disable(privep); + } + + return OK; +} + +/**************************************************************************** + * Name: n32_ep_allocreq + * + * Description: + * Allocate an I/O request + * + ****************************************************************************/ + +static struct usbdev_req_s *n32_ep_allocreq(struct usbdev_ep_s *ep) +{ + struct n32_req_s *privreq; + +#ifdef CONFIG_DEBUG_FEATURES + if (!ep) + { + usbtrace(TRACE_DEVERROR(N32_TRACEERR_INVALIDPARMS), 0); + return NULL; + } +#endif + + usbtrace(TRACE_EPALLOCREQ, ((struct n32_ep_s *)ep)->epphy); + + privreq = kmm_malloc(sizeof(struct n32_req_s)); + if (!privreq) + { + usbtrace(TRACE_DEVERROR(N32_TRACEERR_ALLOCFAIL), 0); + return NULL; + } + + memset(privreq, 0, sizeof(struct n32_req_s)); + return &privreq->req; +} + +/**************************************************************************** + * Name: n32_ep_freereq + * + * Description: + * Free an I/O request + * + ****************************************************************************/ + +static void n32_ep_freereq(struct usbdev_ep_s *ep, + struct usbdev_req_s *req) +{ + struct n32_req_s *privreq = (struct n32_req_s *)req; + +#ifdef CONFIG_DEBUG_FEATURES + if (!ep || !req) + { + usbtrace(TRACE_DEVERROR(N32_TRACEERR_INVALIDPARMS), 0); + return; + } +#endif + + usbtrace(TRACE_EPFREEREQ, ((struct n32_ep_s *)ep)->epphy); + kmm_free(privreq); +} + +/**************************************************************************** + * Name: n32_ep_allocbuffer + * + * Description: + * Allocate an I/O buffer + * + ****************************************************************************/ + +#ifdef CONFIG_USBDEV_DMA +static void *n32_ep_allocbuffer(struct usbdev_ep_s *ep, unsigned bytes) +{ + usbtrace(TRACE_EPALLOCBUFFER, ((struct n32_ep_s *)ep)->epphy); + +#ifdef CONFIG_USBDEV_DMAMEMORY + return usbdev_dma_alloc(bytes); +#else + return kmm_malloc(bytes); +#endif +} +#endif + +/**************************************************************************** + * Name: n32_ep_freebuffer + * + * Description: + * Free an I/O buffer + * + ****************************************************************************/ + +#ifdef CONFIG_USBDEV_DMA +static void n32_ep_freebuffer(struct usbdev_ep_s *ep, void *buf) +{ + usbtrace(TRACE_EPALLOCBUFFER, ((struct n32_ep_s *)ep)->epphy); + +#ifdef CONFIG_USBDEV_DMAMEMORY + usbdev_dma_free(buf); +#else + kmm_free(buf); +#endif +} +#endif + +/**************************************************************************** + * Name: n32_ep_submit + * + * Description: + * Submit an I/O request to the endpoint + * + ****************************************************************************/ + +static int n32_ep_submit(struct usbdev_ep_s *ep, + struct usbdev_req_s *req) +{ + struct n32_req_s *privreq = (struct n32_req_s *)req; + struct n32_ep_s *privep = (struct n32_ep_s *)ep; + struct n32_usbdev_s *priv; + irqstate_t flags; + int ret = OK; + + /* Some sanity checking */ + +#ifdef CONFIG_DEBUG_FEATURES + if (!req || !req->callback || !req->buf || !ep) + { + usbtrace(TRACE_DEVERROR(N32_TRACEERR_INVALIDPARMS), 0); + uinfo("req=%p callback=%p buf=%p ep=%p\n", + req, req->callback, req->buf, ep); + return -EINVAL; + } +#endif + + usbtrace(TRACE_EPSUBMIT, privep->epphy); + priv = privep->dev; + +#ifdef CONFIG_DEBUG_FEATURES + if (!priv->driver) + { + usbtrace(TRACE_DEVERROR(N32_TRACEERR_NOTCONFIGURED), + priv->usbdev.speed); + return -ESHUTDOWN; + } +#endif + + /* Handle the request from the class driver */ + + req->result = -EINPROGRESS; + req->xfrd = 0; + + /* Disable Interrupts */ + + flags = enter_critical_section(); + + /* If we are stalled, then drop all requests on the floor */ + + if (privep->stalled) + { + ret = -EBUSY; + } + else + { + /* Add the new request to the request queue for the endpoint. */ + + if (n32_req_addlast(privep, privreq) && !privep->active) + { + /* If a request was added to an IN endpoint, then attempt to send + * the request data buffer now. + */ + + if (privep->isin) + { + usbtrace(TRACE_INREQQUEUED(privep->epphy), privreq->req.len); + + /* If the endpoint is not busy with another write request, + * then process the newly received write request now. + */ + + if (!privep->active) + { + n32_epin_request(priv, privep); + } + } + + /* If the request was added to an OUT endpoint, then attempt to + * setup a read into the request data buffer now (this will, of + * course, fail if there is already a read in place). + */ + + else + { + usbtrace(TRACE_OUTREQQUEUED(privep->epphy), privreq->req.len); + n32_epout_request(priv, privep); + } + } + } + + leave_critical_section(flags); + return ret; +} + +/**************************************************************************** + * Name: n32_ep_cancel + * + * Description: + * Cancel an I/O request previously sent to an endpoint + * + ****************************************************************************/ + +static int n32_ep_cancel(struct usbdev_ep_s *ep, + struct usbdev_req_s *req) +{ + struct n32_ep_s *privep = (struct n32_ep_s *)ep; + irqstate_t flags; + +#ifdef CONFIG_DEBUG_FEATURES + if (!ep || !req) + { + usbtrace(TRACE_DEVERROR(N32_TRACEERR_INVALIDPARMS), 0); + return -EINVAL; + } +#endif + + usbtrace(TRACE_EPCANCEL, privep->epphy); + + flags = enter_critical_section(); + + /* FIXME: if the request is the first, then we need to flush the EP + * otherwise just remove it from the list + * + * but ... all other implementations cancel all requests ... + */ + + n32_req_cancel(privep, -ESHUTDOWN); + leave_critical_section(flags); + return OK; +} + +/**************************************************************************** + * Name: n32_epout_setstall + * + * Description: + * Stall an OUT endpoint + * + ****************************************************************************/ + +static int n32_epout_setstall(struct n32_ep_s *privep) +{ +#if 1 + /* This implementation follows the requirements from the USB OTG core + * reference manual. + */ + + uint32_t regaddr; + uint32_t regval; + + /* Put the core in the Global OUT NAK mode */ + + n32_enablegonak(privep); + + /* Disable and STALL the OUT endpoint by setting the EPDIS and STALL bits + * in the DOECPTL register. + */ + + regaddr = N32_USBHS_DOUTEPCTRL(privep->epphy); + regval = n32_getreg(regaddr); + regval |= (N32_USBHS_DOUTEPCTRL_EPDIS | N32_USBHS_DOUTEPCTRL_STALL); + n32_putreg(regval, regaddr); + + /* Wait for the EPDISD interrupt which indicates that the OUT + * endpoint is completely disabled. + */ + +#if 0 /* Doesn't happen */ + regaddr = N32_USBHS_DOUTEPINTSTS(privep->epphy); + while ((n32_getreg(regaddr) & N32_USBHS_DOUTEPINTSTS_EPDISIF) == 0); +#else + /* REVISIT: */ + + up_udelay(10); +#endif + + /* Disable Global OUT NAK mode */ + + n32_disablegonak(privep); + + /* The endpoint is now stalled */ + + privep->stalled = true; + return OK; +#else + /* This implementation follows the STMicro code example. */ + + /* REVISIT: */ + + uint32_t regaddr; + uint32_t regval; + + /* Stall the OUT endpoint by setting the STALL bit in the + * DOECPTL register. + */ + + regaddr = N32_USBHS_DOUTEPCTRL(privep->epphy); + regval = n32_getreg(regaddr); + regval |= N32_USBHS_DOUTEPCTRL_STALL; + n32_putreg(regval, regaddr); + + /* The endpoint is now stalled */ + + privep->stalled = true; + return OK; +#endif +} + +/**************************************************************************** + * Name: n32_epin_setstall + * + * Description: + * Stall an IN endpoint + * + ****************************************************************************/ + +static int n32_epin_setstall(struct n32_ep_s *privep) +{ + uint32_t regaddr; + uint32_t regval; + + /* Get the IN endpoint device control register */ + + regaddr = N32_USBHS_DINEPCTRL(privep->epphy); + regval = n32_getreg(regaddr); + + /* Then stall the endpoint */ + + regval |= N32_USBHS_DINEPCTRL_STALL; + n32_putreg(regval, regaddr); + + /* The endpoint is now stalled */ + + privep->stalled = true; + return OK; +} + +/**************************************************************************** + * Name: n32_ep_setstall + * + * Description: + * Stall an endpoint + * + ****************************************************************************/ + +static int n32_ep_setstall(struct n32_ep_s *privep) +{ + usbtrace(TRACE_EPSTALL, privep->epphy); + + /* Is this an IN endpoint? */ + + if (privep->isin == 1) + { + return n32_epin_setstall(privep); + } + else + { + return n32_epout_setstall(privep); + } +} + +/**************************************************************************** + * Name: n32_ep_clrstall + * + * Description: + * Resume a stalled endpoint + * + ****************************************************************************/ + +static int n32_ep_clrstall(struct n32_ep_s *privep) +{ + uint32_t regaddr; + uint32_t regval; + uint32_t stallbit; + uint32_t data0bit; + + usbtrace(TRACE_EPRESUME, privep->epphy); + + /* Is this an IN endpoint? */ + + if (privep->isin == 1) + { + /* Clear the stall bit in the IN endpoint device control register */ + + regaddr = N32_USBHS_DINEPCTRL(privep->epphy); + stallbit = N32_USBHS_DINEPCTRL_STALL; + data0bit = N32_USBHS_DINEPCTRL_SD0PID_SEVNFRM; + } + else + { + /* Clear the stall bit in the IN endpoint device control register */ + + regaddr = N32_USBHS_DOUTEPCTRL(privep->epphy); + stallbit = N32_USBHS_DOUTEPCTRL_STALL; + data0bit = N32_USBHS_DOUTEPCTRL_SD0PID_SEVNFRM; + } + + /* Clear the stall bit */ + + regval = n32_getreg(regaddr); + regval &= ~stallbit; + + /* Set the DATA0 pid for interrupt and bulk endpoints */ + + if (privep->eptype == USB_EP_ATTR_XFER_INT || + privep->eptype == USB_EP_ATTR_XFER_BULK) + { + /* Writing this bit sets the DATA0 PID */ + + regval |= data0bit; + } + + n32_putreg(regval, regaddr); + + /* The endpoint is no longer stalled */ + + privep->stalled = false; + return OK; +} + +/**************************************************************************** + * Name: n32_ep_stall + * + * Description: + * Stall or resume an endpoint + * + ****************************************************************************/ + +static int n32_ep_stall(struct usbdev_ep_s *ep, bool resume) +{ + struct n32_ep_s *privep = (struct n32_ep_s *)ep; + irqstate_t flags; + int ret; + + /* Set or clear the stall condition as requested */ + + flags = enter_critical_section(); + if (resume) + { + ret = n32_ep_clrstall(privep); + } + else + { + ret = n32_ep_setstall(privep); + } + + leave_critical_section(flags); + + return ret; +} + +/**************************************************************************** + * Name: n32_ep0_stall + * + * Description: + * Stall endpoint 0 + * + ****************************************************************************/ + +static void n32_ep0_stall(struct n32_usbdev_s *priv) +{ + n32_epin_setstall(&priv->epin[EP0]); + n32_epout_setstall(&priv->epout[EP0]); + priv->stalled = true; + n32_ep0out_ctrlsetup(priv); +} + +/**************************************************************************** + * Device operations + ****************************************************************************/ + +/**************************************************************************** + * Name: n32_ep_alloc + * + * Description: + * Allocate an endpoint matching the parameters. + * + * Input Parameters: + * eplog - 7-bit logical endpoint number (direction bit ignored). + * Zero means that any endpoint matching the other requirements + * will suffice. + * The assigned endpoint can be found in the eplog field. + * in - true: IN (device-to-host) endpoint requested + * eptype - Endpoint type. One of {USB_EP_ATTR_XFER_ISOC, + * USB_EP_ATTR_XFER_BULK, USB_EP_ATTR_XFER_INT} + * + ****************************************************************************/ + +static struct usbdev_ep_s *n32_ep_alloc(struct usbdev_s *dev, + uint8_t eplog, bool in, + uint8_t eptype) +{ + struct n32_usbdev_s *priv = (struct n32_usbdev_s *)dev; + uint8_t epavail; + irqstate_t flags; + int epphy; + int epno = 0; + + usbtrace(TRACE_DEVALLOCEP, (uint16_t)eplog); + + /* Ignore any direction bits in the logical address */ + + epphy = USB_EPNO(eplog); + + /* Get the set of available endpoints depending on the direction */ + + flags = enter_critical_section(); + epavail = priv->epavail[in]; + + /* A physical address of 0 means that any endpoint will do */ + + if (epphy > 0) + { + /* Otherwise, we will return the endpoint structure only for the + * requested 'logical' endpoint. All of the other checks will + * still be performed. + * + * First, verify that the logical endpoint is in the range supported + * by by the hardware. + */ + + if (epphy >= N32_USBHS_NENDPOINTS) + { + usbtrace(TRACE_DEVERROR(N32_TRACEERR_BADEPNO), (uint16_t)epphy); + return NULL; + } + + /* Remove all of the candidate endpoints from the bitset except for the + * this physical endpoint number. + */ + + epavail &= (1 << epphy); + } + + /* Is there an available endpoint? */ + + if (epavail) + { + /* Yes.. Select the lowest numbered endpoint in the set of available + * endpoints. + */ + + for (epno = 1; epno < N32_USBHS_NENDPOINTS; epno++) + { + uint8_t bit = 1 << epno; + + if ((epavail & bit) != 0) + { + /* Mark the endpoint no longer available */ + + priv->epavail[in] &= ~(1 << epno); + + /* And return the pointer to the standard endpoint structure */ + + leave_critical_section(flags); + return in ? &priv->epin[epno].ep : &priv->epout[epno].ep; + } + } + + /* We should not get here */ + } + + usbtrace(TRACE_DEVERROR(N32_TRACEERR_NOEP), (uint16_t)eplog); + leave_critical_section(flags); + return NULL; +} + +/**************************************************************************** + * Name: n32_ep_free + * + * Description: + * Free the previously allocated endpoint + * + ****************************************************************************/ + +static void n32_ep_free(struct usbdev_s *dev, + struct usbdev_ep_s *ep) +{ + struct n32_usbdev_s *priv = (struct n32_usbdev_s *)dev; + struct n32_ep_s *privep = (struct n32_ep_s *)ep; + irqstate_t flags; + + usbtrace(TRACE_DEVFREEEP, (uint16_t)privep->epphy); + + if (priv && privep) + { + /* Mark the endpoint as available */ + + flags = enter_critical_section(); + priv->epavail[privep->isin] |= (1 << privep->epphy); + leave_critical_section(flags); + } +} + +/**************************************************************************** + * Name: n32_getframe + * + * Description: + * Returns the current frame number + * + ****************************************************************************/ + +static int n32_getframe(struct usbdev_s *dev) +{ + uint32_t regval; + + usbtrace(TRACE_DEVGETFRAME, 0); + + /* Return the last frame number of the last SOF detected by the hardware */ + + regval = n32_getreg(N32_USBHS_DSTS); + return (int)((regval & N32_USBHS_DSTS_SOFFN_MASK) >> + N32_USBHS_DSTS_SOFFN_SHIFT); +} + +/**************************************************************************** + * Name: n32_wakeup + * + * Description: + * Exit suspend mode. + * + ****************************************************************************/ + +static int n32_wakeup(struct usbdev_s *dev) +{ + struct n32_usbdev_s *priv = (struct n32_usbdev_s *)dev; + uint32_t regval; + irqstate_t flags; + + usbtrace(TRACE_DEVWAKEUP, 0); + + /* Is wakeup enabled? */ + + flags = enter_critical_section(); + if (priv->wakeup) + { + /* Yes... is the core suspended? */ + + regval = n32_getreg(N32_USBHS_DSTS); + if ((regval & N32_USBHS_DSTS_SUSPF) != 0) + { + /* Re-start the PHY clock and un-gate USB core clock (HCLK) */ + +#ifdef CONFIG_USBDEV_LOWPOWER + regval = n32_getreg(N32_USBHS_PWRCTRL); + regval &= ~(N32_USBHS_PWRCTRL_PHYSTP | N32_USBHS_PWRCTRL_GATEHCLK); + n32_putreg(regval, N32_USBHS_PWRCTRL); +#endif + /* Activate Remote wakeup signaling */ + + regval = n32_getreg(N32_USBHS_DCTRL); + regval |= N32_USBHS_DCTRL_RMWKUP; + n32_putreg(regval, N32_USBHS_DCTRL); + up_mdelay(5); + regval &= ~N32_USBHS_DCTRL_RMWKUP; + n32_putreg(regval, N32_USBHS_DCTRL); + } + } + + leave_critical_section(flags); + return OK; +} + +/**************************************************************************** + * Name: n32_selfpowered + * + * Description: + * Sets/clears the device self-powered feature + * + ****************************************************************************/ + +static int n32_selfpowered(struct usbdev_s *dev, bool selfpowered) +{ + struct n32_usbdev_s *priv = (struct n32_usbdev_s *)dev; + + usbtrace(TRACE_DEVSELFPOWERED, (uint16_t)selfpowered); + +#ifdef CONFIG_DEBUG_FEATURES + if (!dev) + { + usbtrace(TRACE_DEVERROR(N32_TRACEERR_INVALIDPARMS), 0); + return -ENODEV; + } +#endif + + priv->selfpowered = selfpowered; + return OK; +} + +/**************************************************************************** + * Name: n32_pullup + * + * Description: + * Software-controlled connect to/disconnect from USB host + * + ****************************************************************************/ + +static int n32_pullup(struct usbdev_s *dev, bool enable) +{ + uint32_t regval; + + usbtrace(TRACE_DEVPULLUP, (uint16_t)enable); + + irqstate_t flags = enter_critical_section(); + + regval = n32_getreg(N32_USBHS_DCTRL); + if (enable) + { + /* Connect the device by clearing the soft disconnect bit in the DCTL + * register. + */ + + regval &= ~N32_USBHS_DCTRL_SFTDIS; + } + else + { + /* Disconnect the device by setting the soft disconnect bit in the DCTL + * register. + */ + + regval |= N32_USBHS_DCTRL_SFTDIS; + } + + n32_putreg(regval, N32_USBHS_DCTRL); + leave_critical_section(flags); + return OK; +} + +/**************************************************************************** + * Name: n32_setaddress + * + * Description: + * Set the devices USB address + * + ****************************************************************************/ + +static void n32_setaddress(struct n32_usbdev_s *priv, uint16_t address) +{ + uint32_t regval; + + /* Set the device address in the DCFG register */ + + regval = n32_getreg(N32_USBHS_DCFG); + regval &= ~N32_USBHS_DCFG_DEVARR_MASK; + regval |= ((uint32_t)address << N32_USBHS_DCFG_DEVARR_SHIFT); + n32_putreg(regval, N32_USBHS_DCFG); + + /* Are we now addressed? (i.e., do we have a non-NULL device + * address?) + */ + + if (address != 0) + { + priv->devstate = DEVSTATE_ADDRESSED; + priv->addressed = true; + } + else + { + priv->devstate = DEVSTATE_DEFAULT; + priv->addressed = false; + } +} + +/**************************************************************************** + * Name: n32_txfifo_flush + * + * Description: + * Flush the specific TX fifo. + * + ****************************************************************************/ + +static int n32_txfifo_flush(uint32_t txfnum) +{ + uint32_t regval; + uint32_t timeout; + + /* Initiate the TX FIFO flush operation */ + + regval = N32_USBHS_GRSTCTRL_TXFFLSH | txfnum; + n32_putreg(regval, N32_USBHS_GRSTCTRL); + + /* Wait for the FLUSH to complete */ + + for (timeout = 0; timeout < N32_FLUSH_DELAY; timeout++) + { + regval = n32_getreg(N32_USBHS_GRSTCTRL); + if ((regval & N32_USBHS_GRSTCTRL_TXFFLSH) == 0) + { + break; + } + } + + /* Wait for 3 PHY Clocks */ + + up_udelay(3); + return OK; +} + +/**************************************************************************** + * Name: n32_rxfifo_flush + * + * Description: + * Flush the RX fifo. + * + ****************************************************************************/ + +static int n32_rxfifo_flush(void) +{ + uint32_t regval; + uint32_t timeout; + + /* Initiate the RX FIFO flush operation */ + + n32_putreg(N32_USBHS_GRSTCTRL_RXFFLSH, N32_USBHS_GRSTCTRL); + + /* Wait for the FLUSH to complete */ + + for (timeout = 0; timeout < N32_FLUSH_DELAY; timeout++) + { + regval = n32_getreg(N32_USBHS_GRSTCTRL); + if ((regval & N32_USBHS_GRSTCTRL_RXFFLSH) == 0) + { + break; + } + } + + /* Wait for 3 PHY Clocks */ + + up_udelay(3); + return OK; +} + +/**************************************************************************** + * Name: n32_swinitialize + * + * Description: + * Initialize all driver data structures. + * + ****************************************************************************/ + +static void n32_swinitialize(struct n32_usbdev_s *priv) +{ + struct n32_ep_s *privep; + int i; + + /* Initialize the device state structure */ + + memset(priv, 0, sizeof(struct n32_usbdev_s)); + + priv->usbdev.ops = &g_devops; + priv->usbdev.ep0 = &priv->epin[EP0].ep; + + priv->epavail[0] = N32_EP_AVAILABLE; + priv->epavail[1] = N32_EP_AVAILABLE; + + /* Initialize the endpoint lists */ + + for (i = 0; i < N32_USBHS_NENDPOINTS; i++) + { + /* Set endpoint operations, reference to driver structure (not + * really necessary because there is only one controller), and + * the physical endpoint number (which is just the index to the + * endpoint). + */ + + privep = &priv->epin[i]; + privep->ep.ops = &g_epops; + privep->dev = priv; + privep->isin = 1; + + /* The index, i, is the physical endpoint address; Map this + * to a logical endpoint address usable by the class driver. + */ + + privep->epphy = i; + privep->ep.eplog = N32_EPPHYIN2LOG(i); + + /* Control until endpoint is activated */ + + privep->eptype = USB_EP_ATTR_XFER_CONTROL; + privep->ep.maxpacket = CONFIG_USBDEV_EP0_MAXSIZE; + } + + /* Initialize the endpoint lists */ + + for (i = 0; i < N32_USBHS_NENDPOINTS; i++) + { + /* Set endpoint operations, reference to driver structure (not + * really necessary because there is only one controller), and + * the physical endpoint number (which is just the index to the + * endpoint). + */ + + privep = &priv->epout[i]; + privep->ep.ops = &g_epops; + privep->dev = priv; + + /* The index, i, is the physical endpoint address; Map this + * to a logical endpoint address usable by the class driver. + */ + + privep->epphy = i; + privep->ep.eplog = N32_EPPHYOUT2LOG(i); + + /* Control until endpoint is activated */ + + privep->eptype = USB_EP_ATTR_XFER_CONTROL; + privep->ep.maxpacket = CONFIG_USBDEV_EP0_MAXSIZE; + } +} + +/**************************************************************************** + * Name: n32_hwinitialize + * + * Description: + * Configure the OTG core for operation. + * + ****************************************************************************/ + +static void n32_hwinitialize(struct n32_usbdev_s *priv) +{ + uint32_t regval; + uint32_t timeout; + uint32_t address; + + /* Setup PHY PLL */ + + regval = n32_getreg(N32_USBHS_WRPCFG); + regval &= ~N32_USBHS_WRPCFG_PHYCLKSEL_MASK; + regval |= N32_USBHS_WRPCFG_PHYCLKSEL; + regval |= N32_USBHS_WRPCFG_PLLEN; + n32_putreg(regval, N32_USBHS_WRPCFG); + + /* Enable Host Pending */ + + regval = n32_getreg(N32_USBHS_WRPCTRL); + regval |= N32_USBHS_WRPCTRL_PINDETEN; + n32_putreg(regval, N32_USBHS_WRPCTRL); + + /* Reset the USBHS core */ + + if (N32_USBHS_BASE == N32_USBCTRL1_BASE) + { + /* Reset the USBHS1 core */ + + regval = n32_getreg(N32_RCC_AHB2RST1); + regval |= RCC_AHB2RST1_USB1PORRST; + n32_putreg(regval, N32_RCC_AHB2RST1); + regval &= ~RCC_AHB2RST1_USB1PORRST; + n32_putreg(regval, N32_RCC_AHB2RST1); + } + else + { + /* Reset the USBHS2 core */ + + regval = n32_getreg(N32_RCC_AHB1RST1); + regval |= RCC_AHB1RST1_USB2PORRST; + n32_putreg(regval, N32_RCC_AHB1RST1); + regval &= ~RCC_AHB1RST1_USB2PORRST; + n32_putreg(regval, N32_RCC_AHB1RST1); + } + + up_mdelay(1); + + n32_putreg(N32_USBHS_GAHBCFG_NPTXFETH, N32_USBHS_GAHBCFG); + + /* Disable global interrupts. */ + + regval = n32_getreg(N32_USBHS_GAHBCFG); + regval &= ~N32_USBHS_GAHBCFG_GINTEN; + n32_putreg(regval, N32_USBHS_GAHBCFG); + + /* At start-up the core is in FS/HS mode. */ + + regval = n32_getreg(N32_USBHS_GCFG); +#ifdef CONFIG_N32H7_USBHS_FS + /* Full speed serial transceiver select */ + + regval |= N32_USBHS_GCFG_PHYSEL; +#endif + regval |= N32_USBHS_GCFG_PHYIF; + n32_putreg(regval, N32_USBHS_GCFG); + + /* Common USB OTG core initialization */ + + /* Wait for AHB master IDLE state */ + + for (timeout = 0; timeout < N32_READY_DELAY; timeout++) + { + up_udelay(3); + regval = n32_getreg(N32_USBHS_GRSTCTRL); + if ((regval & N32_USBHS_GRSTCTRL_AHBIDLE) != 0) + { + break; + } + } + + /* Then perform the core soft reset. */ + + regval = n32_getreg(N32_USBHS_GRSTCTRL); + regval |= N32_USBHS_GRSTCTRL_CSRST; + n32_putreg(regval, N32_USBHS_GRSTCTRL); + for (timeout = 0; timeout < N32_READY_DELAY; timeout++) + { + regval = n32_getreg(N32_USBHS_GRSTCTRL); + if ((regval & N32_USBHS_GRSTCTRL_SRSTDNE) != 0) + { + break; + } + } + + regval = n32_getreg(N32_USBHS_GRSTCTRL); + regval &= ~N32_USBHS_GRSTCTRL_CSRST; + n32_putreg(regval, N32_USBHS_GRSTCTRL); + + /* Wait for the PHY to settle */ + + up_udelay(3); + + /* Wait for the PHY to settle */ + + up_mdelay(20); + +#ifndef CONFIG_N32H7_USBHS_FS + regval = n32_getreg(N32_USBHS_DCFG); + regval |= N32_USBHS_DCFG_XCVDRLY; + n32_putreg(regval, N32_USBHS_DCFG); +#endif + + /* Force Device Mode */ + + regval = n32_getreg(N32_USBHS_GCFG); + regval &= ~N32_USBHS_GCFG_FHMODE; + regval |= N32_USBHS_GCFG_FDMODE; + n32_putreg(regval, N32_USBHS_GCFG); + up_mdelay(50); + + /* Initialize device mode */ + + n32_putreg(0, N32_USBHS_PWRCTRL); + + /* Device configuration register */ + + regval = n32_getreg(N32_USBHS_DCFG); + regval &= ~N32_USBHS_DCFG_PFRITVL_MASK; + regval |= N32_USBHS_DCFG_PFRITVL_80; + n32_putreg(regval, N32_USBHS_DCFG); + + /* Set device high or full speed */ + + regval = n32_getreg(N32_USBHS_DCFG); + regval &= ~N32_USBHS_DCFG_DEVSPD_MASK; +#ifdef CONFIG_N32H7_USBHS_FS + regval |= N32_USBHS_DCFG_DEVSPD_FS; +#else + regval |= N32_USBHS_DCFG_DEVSPD_HS; +#endif + n32_putreg(regval, N32_USBHS_DCFG); + + /* Set Rx FIFO size */ + + n32_putreg(N32_RXFIFO_WORDS, N32_USBHS_GRXFSIZ); + + address = N32_RXFIFO_WORDS; + regval = (address << N32_USBHS_GNPTXFSIZ_IEP0TXFRSADD_SHIFT) | + (N32_EP0_TXFIFO_WORDS << N32_USBHS_GNPTXFSIZ_IEP0TXFDEP_SHIFT); + n32_putreg(regval, N32_USBHS_DINEPTXF0); + + address += N32_EP0_TXFIFO_WORDS; + regval = (address << N32_USBHS_DINEPPTXFSIZ_INEPTXSADD_SHIFT) | + (N32_EP1_TXFIFO_WORDS << N32_USBHS_DINEPPTXFSIZ_INEPTXFDEP_SHIFT); + n32_putreg(regval, N32_USBHS_DINEPPTXFSIZ(1)); + + address += N32_EP1_TXFIFO_WORDS; + regval = (address << N32_USBHS_DINEPPTXFSIZ_INEPTXSADD_SHIFT) | + (N32_EP2_TXFIFO_WORDS << N32_USBHS_DINEPPTXFSIZ_INEPTXFDEP_SHIFT); + n32_putreg(regval, N32_USBHS_DINEPPTXFSIZ(2)); + + address += N32_EP2_TXFIFO_WORDS; + regval = (address << N32_USBHS_DINEPPTXFSIZ_INEPTXSADD_SHIFT) | + (N32_EP3_TXFIFO_WORDS << N32_USBHS_DINEPPTXFSIZ_INEPTXFDEP_SHIFT); + n32_putreg(regval, N32_USBHS_DINEPPTXFSIZ(3)); + + address += N32_EP3_TXFIFO_WORDS; + regval = (address << N32_USBHS_DINEPPTXFSIZ_INEPTXSADD_SHIFT) | + (N32_EP4_TXFIFO_WORDS << N32_USBHS_DINEPPTXFSIZ_INEPTXFDEP_SHIFT); + n32_putreg(regval, N32_USBHS_DINEPPTXFSIZ(4)); + + address += N32_EP4_TXFIFO_WORDS; + regval = (address << N32_USBHS_DINEPPTXFSIZ_INEPTXSADD_SHIFT) | + (N32_EP5_TXFIFO_WORDS << N32_USBHS_DINEPPTXFSIZ_INEPTXFDEP_SHIFT); + n32_putreg(regval, N32_USBHS_DINEPPTXFSIZ(5)); + + address += N32_EP5_TXFIFO_WORDS; + regval = (address << N32_USBHS_DINEPPTXFSIZ_INEPTXSADD_SHIFT) | + (N32_EP6_TXFIFO_WORDS << N32_USBHS_DINEPPTXFSIZ_INEPTXFDEP_SHIFT); + n32_putreg(regval, N32_USBHS_DINEPPTXFSIZ(6)); + + address += N32_EP6_TXFIFO_WORDS; + regval = (address << N32_USBHS_DINEPPTXFSIZ_INEPTXSADD_SHIFT) | + (N32_EP7_TXFIFO_WORDS << N32_USBHS_DINEPPTXFSIZ_INEPTXFDEP_SHIFT); + n32_putreg(regval, N32_USBHS_DINEPPTXFSIZ(7)); + + address += N32_EP7_TXFIFO_WORDS; + regval = (address << N32_USBHS_DINEPPTXFSIZ_INEPTXSADD_SHIFT) | + (N32_EP8_TXFIFO_WORDS << N32_USBHS_DINEPPTXFSIZ_INEPTXFDEP_SHIFT); + n32_putreg(regval, N32_USBHS_DINEPPTXFSIZ(8)); + + /* Flush the FIFOs */ + + n32_txfifo_flush(N32_USBHS_GRSTCTRL_TXFNUM_DALL); + n32_rxfifo_flush(); + + /* Clear all pending Device Interrupts */ + + n32_putreg(0, N32_USBHS_DINEPINTEN); + n32_putreg(0, N32_USBHS_DOUTEPINTEN); + n32_putreg(0, N32_USBHS_DINEPFEINTEN); + n32_putreg(0xffffffff, N32_USBHS_DAEPINTSTS); + n32_putreg(0, N32_USBHS_DAEPINTEN); + + /* Configure all IN endpoints */ + + for (uint8_t i = 0; i < N32_USBHS_NENDPOINTS; i++) + { + regval = n32_getreg(N32_USBHS_DINEPCTRL(i)); + if ((regval & N32_USBHS_DINEPCTRL_EPEN) != 0) + { + /* The endpoint is already enabled */ + + regval = N32_USBHS_DINEPCTRL_EPDIS | N32_USBHS_DINEPCTRL_SNAK; + } + else + { + regval = 0; + } + + n32_putreg(regval, N32_USBHS_DINEPCTRL(i)); + n32_putreg(0, N32_USBHS_DINEPTXSIZ(i)); + n32_putreg(0xff, N32_USBHS_DINEPINTSTS(i)); + } + + /* Configure all OUT endpoints */ + + for (uint8_t i = 0; i < N32_USBHS_NENDPOINTS; i++) + { + regval = n32_getreg(N32_USBHS_DOUTEPCTRL(i)); + if ((regval & N32_USBHS_DOUTEPCTRL_EPEN) != 0) + { + /* The endpoint is already enabled */ + + regval = N32_USBHS_DOUTEPCTRL_EPDIS | N32_USBHS_DOUTEPCTRL_SNAK; + } + else + { + regval = 0; + } + + n32_putreg(regval, N32_USBHS_DOUTEPCTRL(i)); + n32_putreg(0, N32_USBHS_DOUTEPTXSIZ(i)); + n32_putreg(0xff, N32_USBHS_DOUTEPINTSTS(i)); + } + + /* Enable the Tx FIFO underrun interrupt */ + + regval = n32_getreg(N32_USBHS_DINEPINTEN); + regval |= N32_USBHS_DINEPINTEN_TXFUDIEN; + n32_putreg(regval, N32_USBHS_DINEPINTEN); + + /* Disable all interrupts. */ + + n32_putreg(0, N32_USBHS_GINTEN); + + /* Clear any pending interrupts */ + + regval = n32_getreg(N32_USBHS_GINTSTS); + regval &= N32_USBHS_GINT_RESERVED; + regval |= N32_USBHS_GINT_RC_W1; + n32_putreg(regval, N32_USBHS_GINTSTS); + + /* Enable the interrupts in the INTMSK */ + + regval = (N32_USBHS_GINTEN_RXFNEIEN | N32_USBHS_GINTEN_USBSUSPIEN | + N32_USBHS_GINTEN_ENUMDIEN | N32_USBHS_GINTEN_INEPIEN | + N32_USBHS_GINTEN_OUTEPIEN | N32_USBHS_GINTEN_USBRSTIEN | + N32_USBHS_GINTEN_WKUPIEN); + +#ifdef CONFIG_USBDEV_ISOCHRONOUS + regval |= (N32_USBHS_GINTEN_ISOINCIEN | + N32_USBHS_GINTEN_PTNCIEN_ISOUTNCIEN); +#endif + +#ifdef CONFIG_USBDEV_SOFINTERRUPT + regval |= N32_USBHS_GINTEN_SOFIEN; +#endif + +#ifdef CONFIG_USBDEV_VBUSSENSING + /* N32H7 MOD: bit 30 (VBUS valid/session request) + * are named only on the enable side in hardware/n32h7_usbhs.h. + */ + + regval |= N32_USBHS_GINTEN_VBUSVIF; +#endif + +#ifdef CONFIG_DEBUG_USB + regval |= N32_USBHS_GINTEN_MODMISIEN; +#endif + + /* Enable interrupts. */ + + n32_putreg(regval, N32_USBHS_GINTEN); + + /* Enable global interrupts. */ + + regval = n32_getreg(N32_USBHS_GAHBCFG); + regval |= N32_USBHS_GAHBCFG_GINTEN; + regval |= N32_USBHS_GAHBCFG_NPTXFETH; + n32_putreg(regval, N32_USBHS_GAHBCFG); +} + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: arm_usbinitialize + * + * Description: + * Initialize USB hardware. + * + * Assumptions: + * - This function is called very early in the initialization sequence + * - PLL and GIO pin initialization is not performed here but should been in + * the low-level boot logic: PLL1 must be configured for operation at + * 48MHz and P0.23 and PO.31 in PINSEL1 must be configured for Vbus and USB + * connect LED. + * + ****************************************************************************/ + +void arm_usbinitialize(void) +{ + /* At present, there is only a single OTG device support. Hence it is + * pre-allocated as g_usbhsdev. However, in most code, the private data + * structure will be referenced using the 'priv' pointer (rather than the + * global data) in order to simplify any future support for multiple + * devices. + */ + + struct n32_usbdev_s *priv = &g_usbhsdev; + int ret; + + usbtrace(TRACE_DEVINIT, 0); + + n32_usbhs_enableclock(); + n32_usbhs_phy_initialize(); + + /* Here we assume that: + * + * 1. GPIOA and OTG peripheral clocking has already been enabled as part + * of the boot sequence. + * 2. Board-specific logic has already enabled other board specific GPIOs + * for things like soft pull-up, VBUS sensing, power controls, and over- + * current detection. + */ + + /* Configure USBHS FS alternate function pins */ + + n32_configgpio(GPIO_USBHS_DM); + n32_configgpio(GPIO_USBHS_DP); + + /* Only needed for USBHS */ +#ifndef CONFIG_N32H7_USBHS_ID_DISABLE + n32_configgpio(GPIO_USBHS_ID); +#endif + + /* SOF output pin configuration is configurable. */ + +#ifdef CONFIG_N32H7_USBHS_SOFOUTPUT + n32_configgpio(GPIO_USBHS_SOF); +#endif + + /* Uninitialize the hardware so that we know that we are starting from a + * known state. + */ + + arm_usbuninitialize(); + + /* Initialize the driver data structure */ + + n32_swinitialize(priv); + + /* Initialize the USB OTG core */ + + n32_hwinitialize(priv); + + /* Attach the OTG interrupt handler */ + + ret = irq_attach(N32_IRQ_USBHS, n32_usbinterrupt, NULL); + if (ret < 0) + { + uerr("ERROR: irq_attach failed: %d\n", ret); + goto errout; + } + + /* Disconnect device */ + + n32_pullup(&priv->usbdev, false); + + /* Reset/Re-initialize the USB hardware */ + + n32_usbreset(priv); + + /* Enable USB controller interrupts at the NVIC */ + + up_enable_irq(N32_IRQ_USBHS); + return; + +errout: + arm_usbuninitialize(); +} + +/**************************************************************************** + * Name: arm_usbuninitialize + ****************************************************************************/ + +void arm_usbuninitialize(void) +{ + /* At present, there is only a single OTG device support. Hence it is + * pre-allocated as g_usbhsdev. However, in most code, the private data + * structure will be referenced using the 'priv' pointer (rather than the + * global data) in order to simplify any future support for multiple + * devices. + */ + + struct n32_usbdev_s *priv = &g_usbhsdev; + irqstate_t flags; + int i; + + usbtrace(TRACE_DEVUNINIT, 0); + + if (priv->driver) + { + usbtrace(TRACE_DEVERROR(N32_TRACEERR_DRIVERREGISTERED), 0); + usbdev_unregister(priv->driver); + } + + /* Disconnect device */ + + flags = enter_critical_section(); + n32_pullup(&priv->usbdev, false); + priv->usbdev.speed = USB_SPEED_UNKNOWN; + + /* Disable and detach IRQs */ + + up_disable_irq(N32_IRQ_USBHS); + irq_detach(N32_IRQ_USBHS); + + /* Disable all endpoint interrupts */ + + for (i = 0; i < N32_USBHS_NENDPOINTS; i++) + { + n32_putreg(0xff, N32_USBHS_DINEPINTSTS(i)); + n32_putreg(0xff, N32_USBHS_DOUTEPINTSTS(i)); + } + + n32_putreg(0, N32_USBHS_DINEPINTEN); + n32_putreg(0, N32_USBHS_DOUTEPINTEN); + n32_putreg(0, N32_USBHS_DINEPFEINTEN); + n32_putreg(0, N32_USBHS_DAEPINTEN); + n32_putreg(0xffffffff, N32_USBHS_DAEPINTSTS); + + /* Flush the FIFOs */ + + n32_txfifo_flush(N32_USBHS_GRSTCTRL_TXFNUM_DALL); + n32_rxfifo_flush(); + + /* TODO: Turn off USB power and clocking */ + + priv->devstate = DEVSTATE_DEFAULT; + leave_critical_section(flags); +} + +/**************************************************************************** + * Name: usbdev_register + * + * Description: + * Register a USB device class driver. The class driver's bind() method + * will be called to bind it to a USB device driver. + * + ****************************************************************************/ + +int usbdev_register(struct usbdevclass_driver_s *driver) +{ + /* At present, there is only a single OTG device support. Hence it is + * pre-allocated as g_usbhsdev. However, in most code, the private data + * structure will be referenced using the 'priv' pointer (rather than the + * global data) in order to simplify any future support for multiple + * devices. + */ + + struct n32_usbdev_s *priv = &g_usbhsdev; + int ret; + + usbtrace(TRACE_DEVREGISTER, 0); + +#ifdef CONFIG_DEBUG_FEATURES + if (!driver || !driver->ops->bind || !driver->ops->unbind || + !driver->ops->disconnect || !driver->ops->setup) + { + usbtrace(TRACE_DEVERROR(N32_TRACEERR_INVALIDPARMS), 0); + return -EINVAL; + } + + if (priv->driver) + { + usbtrace(TRACE_DEVERROR(N32_TRACEERR_DRIVER), 0); + return -EBUSY; + } +#endif + + /* First hook up the driver */ + + priv->driver = driver; + + /* Then bind the class driver */ + + ret = CLASS_BIND(driver, &priv->usbdev); + if (ret) + { + usbtrace(TRACE_DEVERROR(N32_TRACEERR_BINDFAILED), (uint16_t)-ret); + priv->driver = NULL; + } + else + { + /* Enable USB controller interrupts */ + + up_enable_irq(N32_IRQ_USBHS); + + /* FIXME: nothing seems to call DEV_CONNECT(), but we need to set + * the RS bit to enable the controller. It kind of makes sense + * to do this after the class has bound to us... + * GEN: This bug is really in the class driver. It should make the + * soft connect when it is ready to be enumerated. I have added + * that logic to the class drivers but left this logic here. + */ + + n32_pullup(&priv->usbdev, true); + +#ifndef CONFIG_N32H7_USBHS_FS + priv->usbdev.speed = USB_SPEED_HIGH; +#else + priv->usbdev.speed = USB_SPEED_FULL; +#endif + } + + return ret; +} + +/**************************************************************************** + * Name: usbdev_unregister + * + * Description: + * Un-register usbdev class driver.If the USB device is connected to a USB + * host, it will first disconnect(). The driver is also requested to + * unbind() and clean up any device state, before this procedure finally + * returns. + * + ****************************************************************************/ + +int usbdev_unregister(struct usbdevclass_driver_s *driver) +{ + /* At present, there is only a single OTG device support. Hence it is + * pre-allocated as g_usbhsdev. However, in most code, the private data + * structure will be referenced using the 'priv' pointer (rather than the + * global data) in order to simplify any future support for multiple + * devices. + */ + + struct n32_usbdev_s *priv = &g_usbhsdev; + irqstate_t flags; + + usbtrace(TRACE_DEVUNREGISTER, 0); + +#ifdef CONFIG_DEBUG_FEATURES + if (driver != priv->driver) + { + usbtrace(TRACE_DEVERROR(N32_TRACEERR_INVALIDPARMS), 0); + return -EINVAL; + } +#endif + + /* Reset the hardware and cancel all requests. All requests must be + * canceled while the class driver is still bound. + */ + + flags = enter_critical_section(); + n32_usbreset(priv); + leave_critical_section(flags); + + /* Unbind the class driver */ + + CLASS_UNBIND(driver, &priv->usbdev); + + /* Disable USB controller interrupts */ + + flags = enter_critical_section(); + up_disable_irq(N32_IRQ_USBHS); + + /* Disconnect device */ + + n32_pullup(&priv->usbdev, false); + + /* Unhook the driver */ + + priv->driver = NULL; + leave_critical_section(flags); + + return OK; +} + +#endif /* CONFIG_USBDEV && (CONFIG_N32H7_USBHS1_DEV || CONFIG_N32H7_USBHS2_DEV) */ diff --git a/arch/arm/src/n32h7/n32_usbhshost.c b/arch/arm/src/n32h7/n32_usbhshost.c new file mode 100644 index 0000000000000..4997eb8ce092c --- /dev/null +++ b/arch/arm/src/n32h7/n32_usbhshost.c @@ -0,0 +1,5800 @@ +/**************************************************************************** + * arch/arm/src/n32h7/n32_usbhshost.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "chip.h" +#include + +#include "arm_internal.h" +#include "n32_gpio.h" + +#if defined(CONFIG_USBHOST) && (defined(CONFIG_N32H7_USBHS1_HOST) || \ + defined(CONFIG_N32H7_USBHS2_HOST)) + +/* N32_USBHS_BASE and N32_IRQ_USBHS are defined before n32_usbhs.h is + * included so that the register address macros and the static inline + * clock/PHY helpers in that header expand for the correct instance. + * The USBHS GPIO pin definitions (GPIO_USBHS_*) are provided by board.h. + */ + +#if defined(CONFIG_N32H7_USBHS1_HOST) +# define N32_IRQ_USBHS N32_IRQ_USBHS1_HS +# define N32_USBHS_BASE N32_USBCTRL1_BASE +# define N32_USBHS_WRAPPER_BASE N32_USBCTRL1_WRAPPER_BASE +# define GPIO_USBHS_DM GPIO_USBHS1_DM +# define GPIO_USBHS_DP GPIO_USBHS1_DP +#elif defined(CONFIG_N32H7_USBHS2_HOST) +# define N32_IRQ_USBHS N32_IRQ_USBHS2_HS +# define N32_USBHS_BASE N32_USBCTRL2_BASE +# define N32_USBHS_WRAPPER_BASE N32_USBCTRL2_WRAPPER_BASE +# define GPIO_USBHS_DM GPIO_USBHS2_DM +# define GPIO_USBHS_DP GPIO_USBHS2_DP +#else +# error Not selected USBHOST peripheral +#endif + +#if defined(CONFIG_N32H7_USBHS1_HOST) && defined(CONFIG_N32H7_USBHS2_HOST) +# error Only one HOST role supported +#endif + +/* N32H7 MOD: + * The N32H76x USBHS core has no on-chip HS PHY; an external ULPI PHY is + * the default configuration. Define CONFIG_N32H7_USBHS_FS to select the + * FS serial transceiver (GCFG.PHYSEL) instead. + */ + +#include "n32_usbhs.h" + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* Configuration ************************************************************/ + +/* N32 USBHS Host Driver Support + * + * Pre-requisites + * + * CONFIG_USBHOST - Enable general USB host support + * CONFIG_N32H7_USBHS1_HOST or + * CONFIG_N32H7_USBHS2_HOST - Select the N32H7 USBHS instance + * + * Options: + * + * CONFIG_N32H7_USBHS_RXFIFO_SIZE - Size of the RX FIFO in 32-bit words. + * Default 128 (512 bytes) + * CONFIG_N32H7_USBHS_NPTXFIFO_SIZE - Size of the non-periodic Tx FIFO + * in 32-bit words. Default 96 (384 bytes) + * CONFIG_N32H7_USBHS_PTXFIFO_SIZE - Size of the periodic Tx FIFO in 32-bit + * words. Default 96 (384 bytes) + * CONFIG_N32H7_USBHS_DESCSIZE - Maximum size of a descriptor. Default: 128 + * CONFIG_N32H7_USBHS_SOFINTR - Enable SOF interrupts. Why would you ever + * want to do that? + * CONFIG_N32_USBHOST_REGDEBUG - Enable very low-level register access + * debug. Depends on CONFIG_DEBUG_FEATURES. + * CONFIG_N32_USBHOST_PKTDUMP - Dump all incoming and outgoing USB + * packets. Depends on CONFIG_DEBUG_FEATURES. + */ + +/* Default RxFIFO size */ + +#ifndef CONFIG_N32H7_USBHS_RXFIFO_SIZE +# define CONFIG_N32H7_USBHS_RXFIFO_SIZE 512 +#endif + +/* Default host non-periodic Tx FIFO size */ + +#ifndef CONFIG_N32H7_USBHS_NPTXFIFO_SIZE +# define CONFIG_N32H7_USBHS_NPTXFIFO_SIZE 256 +#endif + +/* Default host periodic Tx fifo size register */ + +#ifndef CONFIG_N32H7_USBHS_PTXFIFO_SIZE +# define CONFIG_N32H7_USBHS_PTXFIFO_SIZE 256 +#endif + +/* Maximum size of a descriptor */ + +#ifndef CONFIG_N32H7_USBHS_DESCSIZE +# define CONFIG_N32H7_USBHS_DESCSIZE 128 +#endif + +/* Register/packet debug depends on CONFIG_DEBUG_FEATURES */ + +#ifndef CONFIG_DEBUG_FEATURES +# undef CONFIG_N32_USBHOST_REGDEBUG +# undef CONFIG_N32_USBHOST_PKTDUMP +#endif + +/* Driver-private constants ************************************************ + * + * N32H7 MOD: + * The following constants have no counterpart in hardware/n32h7_usbhs.h + * (the hardware header provides only the field SHIFT/MASK). They are + * driver-internal encodings used by the ported core logic, private to + * this file. + */ + +/* Endpoint type values (unshifted, driver-internal encoding; matches the + * HCHCTRL EPTYPE field encoding) + */ + +#define N32_USBHS_EPTYPE_CTRL 0 +#define N32_USBHS_EPTYPE_ISOC 1 +#define N32_USBHS_EPTYPE_BULK 2 +#define N32_USBHS_EPTYPE_INTR 3 + +/* Data PID values (unshifted; matches the HCHTXSIZ PID field encoding) */ + +#define N32_USBHS_PID_DATA0 0 +#define N32_USBHS_PID_DATA1 2 +#define N32_USBHS_PID_SETUP 3 + +/* GRSTCTRL TxFIFO number helper (flush all host TxFIFOs) */ + +#define N32_USBHS_GRSTCTRL_TXFNUM_HALL \ + (0x10UL << N32_USBHS_GRSTCTRL_TXFNUM_SHIFT) + +/* Host all-channels interrupt helper (HACHINT/HACHINTEN) */ + +#define N32_USBHS_HACHINT_CH(n) (1UL << (n)) + +/**************************************************************************** + * Debug Trace Instrumentation + ****************************************************************************/ + +#ifdef HAVE_USBHOST_TRACE +enum usbhost_trace1codes_e +{ + __TRACE1_BASEVALUE = 0, /* This will force the first value to be 1 */ + + N32_USBHS_TRACE1_DEVDISCONN, /* USBHS ERROR: Host Port Device disconnected */ + N32_USBHS_TRACE1_IRQATTACH, /* USBHS ERROR: Failed to attach IRQ */ + N32_USBHS_TRACE1_TRNSFRFAILED, /* USBHS ERROR: Host Port Transfer Failed */ + N32_USBHS_TRACE1_SENDSETUP, /* USBHS ERROR: sendsetup() failed with: */ + N32_USBHS_TRACE1_SENDDATA, /* USBHS ERROR: senddata() failed with: */ + N32_USBHS_TRACE1_RECVDATA, /* USBHS ERROR: recvdata() failed with: */ + +#ifdef HAVE_USBHOST_TRACE_VERBOSE + + N32_USBHS_VTRACE1_CONNECTED, /* USBHS Host Port connected */ + N32_USBHS_VTRACE1_DISCONNECTED, /* USBHS Host Port disconnected */ + N32_USBHS_VTRACE1_GINT, /* USBHS Handling Interrupt. Entry Point */ + N32_USBHS_VTRACE1_GINT_SOF, /* USBHS Handle the start of frame interrupt */ + N32_USBHS_VTRACE1_GINT_RXFLVL, /* USBHS Handle the RxFIFO non-empty interrupt */ + N32_USBHS_VTRACE1_GINT_NPTXFE, /* USBHS Handle the non-periodic TxFIFO empty interrupt */ + N32_USBHS_VTRACE1_GINT_PTXFE, /* USBHS Handle the periodic TxFIFO empty interrupt */ + N32_USBHS_VTRACE1_GINT_HC, /* USBHS Handle the host channels interrupt */ + N32_USBHS_VTRACE1_GINT_HPRT, /* USBHS Handle the host port interrupt */ + N32_USBHS_VTRACE1_GINT_HPRT_POCCHNG, /* USBHS HPRT: Port Over-Current Change */ + N32_USBHS_VTRACE1_GINT_HPRT_PCDET, /* USBHS HPRT: Port Connect Detect */ + N32_USBHS_VTRACE1_GINT_HPRT_PENCHNG, /* USBHS HPRT: Port Enable Changed */ + N32_USBHS_VTRACE1_GINT_HPRT_LSDEV, /* USBHS HPRT: Low Speed Device Connected */ + N32_USBHS_VTRACE1_GINT_HPRT_FSDEV, /* USBHS HPRT: Full Speed Device Connected */ + N32_USBHS_VTRACE1_GINT_HPRT_LSFSSW, /* USBHS HPRT: Host Switch: LS -> FS */ + N32_USBHS_VTRACE1_GINT_HPRT_FSLSSW, /* USBHS HPRT: Host Switch: FS -> LS */ + N32_USBHS_VTRACE1_GINT_DISC, /* USBHS Handle the disconnect detected interrupt */ + N32_USBHS_VTRACE1_GINT_IPXFR, /* USBHS Handle the incomplete periodic transfer */ + +#endif + + __TRACE1_NSTRINGS, /* Separates the format 1 from the format 2 strings */ + + N32_USBHS_TRACE2_CLIP, /* USBHS CLIP: chidx: buflen: */ + +#ifdef HAVE_USBHOST_TRACE_VERBOSE + + N32_USBHS_VTRACE2_CHANWAKEUP_IN, /* USBHS IN Channel wake up with result */ + N32_USBHS_VTRACE2_CHANWAKEUP_OUT, /* USBHS OUT Channel wake up with result */ + N32_USBHS_VTRACE2_CTRLIN, /* USBHS CTRLIN */ + N32_USBHS_VTRACE2_CTRLOUT, /* USBHS CTRLOUT */ + N32_USBHS_VTRACE2_INTRIN, /* USBHS INTRIN */ + N32_USBHS_VTRACE2_INTROUT, /* USBHS INTROUT */ + N32_USBHS_VTRACE2_BULKIN, /* USBHS BULKIN */ + N32_USBHS_VTRACE2_BULKOUT, /* USBHS BULKOUT */ + N32_USBHS_VTRACE2_ISOCIN, /* USBHS ISOCIN */ + N32_USBHS_VTRACE2_ISOCOUT, /* USBHS ISOCOUT */ + N32_USBHS_VTRACE2_STARTTRANSFER, /* USBHS EP buflen */ + N32_USBHS_VTRACE2_CHANCONF_CTRL_IN, + N32_USBHS_VTRACE2_CHANCONF_CTRL_OUT, + N32_USBHS_VTRACE2_CHANCONF_INTR_IN, + N32_USBHS_VTRACE2_CHANCONF_INTR_OUT, + N32_USBHS_VTRACE2_CHANCONF_BULK_IN, + N32_USBHS_VTRACE2_CHANCONF_BULK_OUT, + N32_USBHS_VTRACE2_CHANCONF_ISOC_IN, + N32_USBHS_VTRACE2_CHANCONF_ISOC_OUT, + N32_USBHS_VTRACE2_CHANHALT, /* Channel halted. chidx: , reason: */ + +#endif + + __TRACE2_NSTRINGS /* Total number of enumeration values */ +}; + +# define TRACE1_FIRST ((int)__TRACE1_BASEVALUE + 1) +# define TRACE1_INDEX(id) ((int)(id) - TRACE1_FIRST) +# define TRACE1_NSTRINGS TRACE1_INDEX(__TRACE1_NSTRINGS + 1) + +# define TRACE2_FIRST ((int)__TRACE1_NSTRINGS + 1) +# define TRACE2_INDEX(id) ((int)(id) - TRACE2_FIRST) +# define TRACE2_NSTRINGS TRACE2_INDEX(__TRACE2_NSTRINGS) + +#endif /* HAVE_USBHOST_TRACE */ + +/* HCD Setup ****************************************************************/ + +/* Hardware capabilities */ + +#define N32_NHOST_CHANNELS 8 /* Number of host channels */ +#define N32_MAX_PACKET_SIZE 64 /* Full speed max packet size */ +#define N32_EP0_DEF_PACKET_SIZE 8 /* EP0 default packet size */ +#define N32_EP0_MAX_PACKET_SIZE 64 /* EP0 FS max packet size */ +#define N32_MAX_TX_FIFOS 15 /* Max number of TX FIFOs */ +#define N32_MAX_PKTCOUNT 256 /* Max packet count */ +#define N32_RETRY_COUNT 3 /* Number of ctrl transfer retries */ + +/* Delays *******************************************************************/ + +#define N32_READY_DELAY 200000 /* In loop counts */ +#define N32_FLUSH_DELAY 200000 /* In loop counts */ +#define N32_SETUP_DELAY SEC2TICK(5) /* 5 seconds in system ticks */ +#define N32_DATANAK_DELAY SEC2TICK(5) /* 5 seconds in system ticks */ + +/**************************************************************************** + * Private Types + ****************************************************************************/ + +/* The following enumeration represents the various states of the USB host + * state machine (for debug purposes only) + */ + +enum n32_smstate_e +{ + SMSTATE_DETACHED = 0, /* Not attached to a device */ + SMSTATE_ATTACHED, /* Attached to a device */ + SMSTATE_ENUM, /* Attached, enumerating */ + SMSTATE_CLASS_BOUND, /* Enumeration complete, class bound */ +}; + +/* This enumeration provides the reason for the channel halt. */ + +enum n32_chreason_e +{ + CHREASON_IDLE = 0, /* Inactive (initial state) */ + CHREASON_FREED, /* Channel is no longer in use */ + CHREASON_XFRC, /* Transfer complete */ + CHREASON_NAK, /* NAK received */ + CHREASON_NYET, /* NotYet received */ + CHREASON_STALL, /* Endpoint stalled */ + CHREASON_TXERR, /* Transfer error received */ + CHREASON_DTERR, /* Data toggle error received */ + CHREASON_FRMOR, /* Frame overrun */ + CHREASON_CANCELLED /* Transfer cancelled */ +}; + +/* This structure retains the state of one host channel. NOTE: Since there + * is only one channel operation active at a time, some of the fields in + * in the structure could be moved in struct n32_ubhost_s to achieve + * some memory savings. + */ + +struct n32_chan_s +{ + sem_t waitsem; /* Channel wait semaphore */ + volatile uint8_t result; /* The result of the transfer */ + volatile uint8_t chreason; /* Channel halt reason. See enum n32_chreason_e */ + uint8_t chidx; /* Channel index */ + uint8_t epno; /* Device endpoint number (0-127) */ + uint8_t eptype; /* See N32_USBHS_EPTYPE_* definitions */ + uint8_t funcaddr; /* Device function address */ + uint8_t speed; /* Device speed */ + uint8_t interval; /* Interrupt/isochronous EP polling interval */ + uint8_t pid; /* Data PID */ + uint8_t npackets; /* Number of packets (for data toggle) */ + bool inuse; /* True: This channel is "in use" */ + volatile bool indata1; /* IN data toggle. True: DATA01 (Bulk and INTR only) */ + volatile bool outdata1; /* OUT data toggle. True: DATA01 */ + bool in; /* True: IN endpoint */ + volatile bool waiter; /* True: Thread is waiting for a channel event */ + uint16_t maxpacket; /* Max packet size */ + uint16_t buflen; /* Buffer length (at start of transfer) */ + volatile uint16_t xfrd; /* Bytes transferred (at end of transfer) */ + volatile uint16_t inflight; /* Number of Tx bytes "in-flight" */ + uint8_t *buffer; /* Transfer buffer pointer */ +#ifdef CONFIG_USBHOST_ASYNCH + usbhost_asynch_t callback; /* Transfer complete callback */ + void *arg; /* Argument that accompanies the callback */ +#endif +}; + +/* A channel represents on uni-directional endpoint. So, in the case of the + * bi-directional, control endpoint, there must be two channels to represent + * the endpoint. + */ + +struct n32_ctrlinfo_s +{ + uint8_t inndx; /* EP0 IN control channel index */ + uint8_t outndx; /* EP0 OUT control channel index */ +}; + +/* This structure retains the state of the USB host controller */ + +struct n32_usbhost_s +{ + /* Common device fields. This must be the first thing defined in the + * structure so that it is possible to simply cast from struct usbhost_s + * to struct n32_usbhost_s. + */ + + struct usbhost_driver_s drvr; + + /* This is the hub port description understood by class drivers */ + + struct usbhost_roothubport_s rhport; + + /* Overall driver status */ + + volatile uint8_t smstate; /* The state of the USB host state machine */ + uint8_t chidx; /* ID of channel waiting for space in Tx FIFO */ + volatile bool connected; /* Connected to device */ + volatile bool change; /* Connection change */ + volatile bool pscwait; /* True: Thread is waiting for a port event */ + mutex_t lock; /* Support mutually exclusive access */ + sem_t pscsem; /* Semaphore to wait for a port event */ + struct n32_ctrlinfo_s ep0; /* Root hub port EP0 description */ + +#ifdef CONFIG_USBHOST_HUB + /* Used to pass external hub port events */ + + volatile struct usbhost_hubport_s *hport; +#endif + + struct usbhost_devaddr_s devgen; /* Address generation data */ + + /* The state of each host channel */ + + struct n32_chan_s chan[N32_MAX_TX_FIFOS]; +}; + +/**************************************************************************** + * Private Function Prototypes + ****************************************************************************/ + +/* Register operations ******************************************************/ + +#ifdef CONFIG_N32_USBHOST_REGDEBUG +static void n32_printreg(uint32_t addr, uint32_t val, bool iswrite); +static void n32_checkreg(uint32_t addr, uint32_t val, bool iswrite); +static uint32_t n32_getreg(uint32_t addr); +static void n32_putreg(uint32_t addr, uint32_t value); +#else +# define n32_getreg(addr) getreg32(addr) +# define n32_putreg(addr,val) putreg32(val,addr) +#endif + +static inline void n32_modifyreg(uint32_t addr, uint32_t clrbits, + uint32_t setbits); + +#ifdef CONFIG_N32_USBHOST_PKTDUMP +# define n32_pktdump(m,b,n) lib_dumpbuffer(m,b,n) +#else +# define n32_pktdump(m,b,n) +#endif + +/* Byte stream access helper functions **************************************/ + +static inline uint16_t n32_getle16(const uint8_t *val); + +/* Channel management *******************************************************/ + +static int n32_chan_alloc(struct n32_usbhost_s *priv); +static inline void n32_chan_free(struct n32_usbhost_s *priv, + int chidx); +static inline void n32_chan_freeall(struct n32_usbhost_s *priv); +static void n32_chan_configure(struct n32_usbhost_s *priv, + int chidx); +static void n32_chan_halt(struct n32_usbhost_s *priv, int chidx, + enum n32_chreason_e chreason); +static int n32_chan_waitsetup(struct n32_usbhost_s *priv, + struct n32_chan_s *chan); +#ifdef CONFIG_USBHOST_ASYNCH +static int n32_chan_asynchsetup(struct n32_usbhost_s *priv, + struct n32_chan_s *chan, + usbhost_asynch_t callback, void *arg); +#endif +static int n32_chan_wait(struct n32_usbhost_s *priv, + struct n32_chan_s *chan); +static void n32_chan_wakeup(struct n32_usbhost_s *priv, + struct n32_chan_s *chan); +static int n32_ctrlchan_alloc(struct n32_usbhost_s *priv, + uint8_t epno, uint8_t funcaddr, + uint8_t speed, + struct n32_ctrlinfo_s *ctrlep); +static int n32_ctrlep_alloc(struct n32_usbhost_s *priv, + const struct usbhost_epdesc_s *epdesc, + usbhost_ep_t *ep); +static int n32_xfrep_alloc(struct n32_usbhost_s *priv, + const struct usbhost_epdesc_s *epdesc, + usbhost_ep_t *ep); + +/* Control/data transfer logic **********************************************/ + +static void n32_transfer_start(struct n32_usbhost_s *priv, + int chidx); +#if 0 /* Not used */ +static inline uint16_t n32_getframe(void); +#endif +static int n32_ctrl_sendsetup(struct n32_usbhost_s *priv, + struct n32_ctrlinfo_s *ep0, + const struct usb_ctrlreq_s *req); +static int n32_ctrl_senddata(struct n32_usbhost_s *priv, + struct n32_ctrlinfo_s *ep0, + uint8_t *buffer, unsigned int buflen); +static int n32_ctrl_recvdata(struct n32_usbhost_s *priv, + struct n32_ctrlinfo_s *ep0, + uint8_t *buffer, unsigned int buflen); +static int n32_in_setup(struct n32_usbhost_s *priv, int chidx); +static ssize_t n32_in_transfer(struct n32_usbhost_s *priv, int chidx, + uint8_t *buffer, size_t buflen); +#ifdef CONFIG_USBHOST_ASYNCH +static void n32_in_next(struct n32_usbhost_s *priv, + struct n32_chan_s *chan); +static int n32_in_asynch(struct n32_usbhost_s *priv, int chidx, + uint8_t *buffer, size_t buflen, + usbhost_asynch_t callback, void *arg); +#endif +static int n32_out_setup(struct n32_usbhost_s *priv, int chidx); +static ssize_t n32_out_transfer(struct n32_usbhost_s *priv, + int chidx, uint8_t *buffer, + size_t buflen); +#ifdef CONFIG_USBHOST_ASYNCH +static void n32_out_next(struct n32_usbhost_s *priv, + struct n32_chan_s *chan); +static int n32_out_asynch(struct n32_usbhost_s *priv, int chidx, + uint8_t *buffer, size_t buflen, + usbhost_asynch_t callback, void *arg); +#endif + +/* Interrupt handling *******************************************************/ + +/* Lower level interrupt handlers */ + +static void n32_gint_wrpacket(struct n32_usbhost_s *priv, + uint8_t *buffer, int chidx, int buflen); +static inline void n32_gint_hcinisr(struct n32_usbhost_s *priv, + int chidx); +static inline void n32_gint_hcoutisr(struct n32_usbhost_s *priv, + int chidx); +static void n32_gint_connected(struct n32_usbhost_s *priv); +static void n32_gint_disconnected(struct n32_usbhost_s *priv); + +/* Second level interrupt handlers */ + +#ifdef CONFIG_N32H7_USBHS_SOFINTR +static inline void n32_gint_sofisr(struct n32_usbhost_s *priv); +#endif +static inline void n32_gint_rxflvlisr(struct n32_usbhost_s *priv); +static inline void n32_gint_nptxfeisr(struct n32_usbhost_s *priv); +static inline void n32_gint_ptxfeisr(struct n32_usbhost_s *priv); +static inline void n32_gint_hcisr(struct n32_usbhost_s *priv); +static inline void n32_gint_hprtisr(struct n32_usbhost_s *priv); +static inline void n32_gint_discisr(struct n32_usbhost_s *priv); +static inline void n32_gint_ipxfrisr(struct n32_usbhost_s *priv); + +/* First level, global interrupt handler */ + +static int n32_gint_isr(int irq, void *context, void *arg); + +/* Interrupt controls */ + +static void n32_gint_enable(void); +static void n32_gint_disable(void); +static inline void n32_hostinit_enable(void); +static void n32_txfe_enable(struct n32_usbhost_s *priv, int chidx); + +/* USB host controller operations *******************************************/ + +static int n32_wait(struct usbhost_connection_s *conn, + struct usbhost_hubport_s **hport); +static int n32_rh_enumerate(struct n32_usbhost_s *priv, + struct usbhost_connection_s *conn, + struct usbhost_hubport_s *hport); +static int n32_enumerate(struct usbhost_connection_s *conn, + struct usbhost_hubport_s *hport); + +static int n32_ep0configure(struct usbhost_driver_s *drvr, + usbhost_ep_t ep0, uint8_t funcaddr, + uint8_t speed, uint16_t maxpacketsize); +static int n32_epalloc(struct usbhost_driver_s *drvr, + const struct usbhost_epdesc_s *epdesc, + usbhost_ep_t *ep); +static int n32_epfree(struct usbhost_driver_s *drvr, usbhost_ep_t ep); +static int n32_alloc(struct usbhost_driver_s *drvr, + uint8_t **buffer, size_t *maxlen); +static int n32_free(struct usbhost_driver_s *drvr, + uint8_t *buffer); +static int n32_ioalloc(struct usbhost_driver_s *drvr, + uint8_t **buffer, size_t buflen); +static int n32_iofree(struct usbhost_driver_s *drvr, + uint8_t *buffer); +static int n32_ctrlin(struct usbhost_driver_s *drvr, usbhost_ep_t ep0, + const struct usb_ctrlreq_s *req, + uint8_t *buffer); +static int n32_ctrlout(struct usbhost_driver_s *drvr, usbhost_ep_t ep0, + const struct usb_ctrlreq_s *req, + const uint8_t *buffer); +static ssize_t n32_transfer(struct usbhost_driver_s *drvr, + usbhost_ep_t ep, uint8_t *buffer, + size_t buflen); +#ifdef CONFIG_USBHOST_ASYNCH +static int n32_asynch(struct usbhost_driver_s *drvr, usbhost_ep_t ep, + uint8_t *buffer, size_t buflen, + usbhost_asynch_t callback, void *arg); +#endif +static int n32_cancel(struct usbhost_driver_s *drvr, usbhost_ep_t ep); +#ifdef CONFIG_USBHOST_HUB +static int n32_connect(struct usbhost_driver_s *drvr, + struct usbhost_hubport_s *hport, + bool connected); +#endif +static void n32_disconnect(struct usbhost_driver_s *drvr, + struct usbhost_hubport_s *hport); + +/* Initialization ***********************************************************/ + +static void n32_portreset(struct n32_usbhost_s *priv); +static void n32_flush_txfifos(uint32_t txfnum); +static void n32_flush_rxfifo(void); +static void n32_vbusdrive(struct n32_usbhost_s *priv, bool state); +static void n32_host_initialize(struct n32_usbhost_s *priv); + +static inline void n32_sw_initialize(struct n32_usbhost_s *priv); +static inline int n32_hw_initialize(struct n32_usbhost_s *priv); + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +/* In this driver implementation, support is provided for only a single a + * single USB device. All status information can be simply retained in a + * single global instance. + */ + +static struct n32_usbhost_s g_usbhost = +{ + .lock = NXMUTEX_INITIALIZER, + .pscsem = SEM_INITIALIZER(0), +}; + +/* This is the connection/enumeration interface */ + +static struct usbhost_connection_s g_usbconn = +{ + .wait = n32_wait, + .enumerate = n32_enumerate, +}; + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: n32_printreg + * + * Description: + * Print the contents of an N32 register operation + * + ****************************************************************************/ + +#ifdef CONFIG_N32_USBHOST_REGDEBUG +static void n32_printreg(uint32_t addr, uint32_t val, bool iswrite) +{ + uinfo("%08" PRIx32 "%s%08" PRIx32 "\n", addr, iswrite ? "<-" : "->", val); +} +#endif + +/**************************************************************************** + * Name: n32_checkreg + * + * Description: + * Get the contents of an N32 register + * + ****************************************************************************/ + +#ifdef CONFIG_N32_USBHOST_REGDEBUG +static void n32_checkreg(uint32_t addr, uint32_t val, bool iswrite) +{ + static uint32_t prevaddr = 0; + static uint32_t preval = 0; + static uint32_t count = 0; + static bool prevwrite = false; + + /* Is this the same value that we read from/wrote to the same register + * last time? Are we polling the register? If so, suppress the output. + */ + + if (addr == prevaddr && val == preval && prevwrite == iswrite) + { + /* Yes.. Just increment the count */ + + count++; + } + else + { + /* No this is a new address or value or operation. Were there any + * duplicate accesses before this one? + */ + + if (count > 0) + { + /* Yes.. Just one? */ + + if (count == 1) + { + /* Yes.. Just one */ + + n32_printreg(prevaddr, preval, prevwrite); + } + else + { + /* No.. More than one. */ + + uinfo("[repeats %d more times]\n", count); + } + } + + /* Save the new address, value, count, and operation for next time */ + + prevaddr = addr; + preval = val; + count = 0; + prevwrite = iswrite; + + /* Show the new regisgter access */ + + n32_printreg(addr, val, iswrite); + } +} +#endif + +/**************************************************************************** + * Name: n32_getreg + * + * Description: + * Get the contents of an N32 register + * + ****************************************************************************/ + +#ifdef CONFIG_N32_USBHOST_REGDEBUG +static uint32_t n32_getreg(uint32_t addr) +{ + /* Read the value from the register */ + + uint32_t val = getreg32(addr); + + /* Check if we need to print this value */ + + n32_checkreg(addr, val, false); + return val; +} +#endif + +/**************************************************************************** + * Name: n32_putreg + * + * Description: + * Set the contents of an N32 register to a value + * + ****************************************************************************/ + +#ifdef CONFIG_N32_USBHOST_REGDEBUG +static void n32_putreg(uint32_t addr, uint32_t val) +{ + /* Check if we need to print this value */ + + n32_checkreg(addr, val, true); + + /* Write the value */ + + putreg32(val, addr); +} +#endif + +/**************************************************************************** + * Name: n32_modifyreg + * + * Description: + * Modify selected bits of an N32 register. + * + ****************************************************************************/ + +static inline void n32_modifyreg(uint32_t addr, uint32_t clrbits, + uint32_t setbits) +{ + n32_putreg(addr, (((n32_getreg(addr)) & ~clrbits) | setbits)); +} + +/**************************************************************************** + * Name: n32_getle16 + * + * Description: + * Get a (possibly unaligned) 16-bit little endian value. + * + ****************************************************************************/ + +static inline uint16_t n32_getle16(const uint8_t *val) +{ + return (uint16_t)val[1] << 8 | (uint16_t)val[0]; +} + +/**************************************************************************** + * Name: n32_chan_alloc + * + * Description: + * Allocate a channel. + * + ****************************************************************************/ + +static int n32_chan_alloc(struct n32_usbhost_s *priv) +{ + int chidx; + + /* Search the table of channels */ + + for (chidx = 0; chidx < N32_NHOST_CHANNELS; chidx++) + { + /* Is this channel available? */ + + if (!priv->chan[chidx].inuse) + { + /* Yes... make it "in use" and return the index */ + + priv->chan[chidx].inuse = true; + return chidx; + } + } + + /* All of the channels are "in-use" */ + + return -EBUSY; +} + +/**************************************************************************** + * Name: n32_chan_free + * + * Description: + * Free a previoiusly allocated channel. + * + ****************************************************************************/ + +static void n32_chan_free(struct n32_usbhost_s *priv, int chidx) +{ + DEBUGASSERT((unsigned)chidx < N32_NHOST_CHANNELS); + + /* Halt the channel */ + + n32_chan_halt(priv, chidx, CHREASON_FREED); + + /* Mark the channel available */ + + priv->chan[chidx].inuse = false; +} + +/**************************************************************************** + * Name: n32_chan_freeall + * + * Description: + * Free all channels. + * + ****************************************************************************/ + +static inline void n32_chan_freeall(struct n32_usbhost_s *priv) +{ + uint8_t chidx; + + /* Free all host channels */ + + for (chidx = 2; chidx < N32_NHOST_CHANNELS; chidx++) + { + n32_chan_free(priv, chidx); + } +} + +/**************************************************************************** + * Name: n32_chan_configure + * + * Description: + * Configure or re-configure a host channel. Host channels are configured + * when endpoint is allocated and EP0 (only) is re-configured with the + * max packet size or device address changes. + * + ****************************************************************************/ + +static void n32_chan_configure(struct n32_usbhost_s *priv, int chidx) +{ + struct n32_chan_s *chan = &priv->chan[chidx]; + uint32_t regval; + + /* Clear any old pending interrupts for this host channel. */ + + n32_putreg(N32_USBHS_HCHINTSTS(chidx), 0xffffffff); + + /* Enable channel interrupts required for transfers on this channel. */ + + regval = 0; + + switch (chan->eptype) + { + case N32_USBHS_EPTYPE_CTRL: + case N32_USBHS_EPTYPE_BULK: + { + #ifdef HAVE_USBHOST_TRACE_VERBOSE + uint16_t intrace; + uint16_t outtrace; + + /* Determine the definitive trace ID to use below */ + + if (chan->eptype == N32_USBHS_EPTYPE_CTRL) + { + intrace = N32_USBHS_VTRACE2_CHANCONF_CTRL_IN; + outtrace = N32_USBHS_VTRACE2_CHANCONF_CTRL_OUT; + } + else + { + intrace = N32_USBHS_VTRACE2_CHANCONF_BULK_IN; + outtrace = N32_USBHS_VTRACE2_CHANCONF_BULK_OUT; + } + #endif + + /* Interrupts required for CTRL and BULK endpoints */ + + regval |= (N32_USBHS_HCHINTEN_TXCIEN | + N32_USBHS_HCHINTEN_STALLIEN | + N32_USBHS_HCHINTEN_NAKIEN | + N32_USBHS_HCHINTEN_TXERRIEN | + N32_USBHS_HCHINTEN_DTERRIEN); + + /* Additional setting for IN/OUT endpoints */ + + if (chan->in) + { + usbhost_vtrace2(intrace, chidx, chan->epno); + regval |= N32_USBHS_HCHINTEN_BBERRIEN; + } + else + { + usbhost_vtrace2(outtrace, chidx, chan->epno); + regval |= N32_USBHS_HCHINTEN_NYETIEN; + } + } + break; + + case N32_USBHS_EPTYPE_INTR: + { + /* Interrupts required for INTR endpoints */ + + regval |= (N32_USBHS_HCHINTEN_TXCIEN | + N32_USBHS_HCHINTEN_STALLIEN | + N32_USBHS_HCHINTEN_NAKIEN | + N32_USBHS_HCHINTEN_TXERRIEN | + N32_USBHS_HCHINTEN_FOVRIEN | + N32_USBHS_HCHINTEN_DTERRIEN); + + /* Additional setting for IN endpoints */ + + if (chan->in) + { + usbhost_vtrace2(N32_USBHS_VTRACE2_CHANCONF_INTR_IN, chidx, + chan->epno); + regval |= N32_USBHS_HCHINTEN_BBERRIEN; + } + #ifdef HAVE_USBHOST_TRACE_VERBOSE + else + { + usbhost_vtrace2(N32_USBHS_VTRACE2_CHANCONF_INTR_OUT, chidx, + chan->epno); + } + #endif + } + break; + + case N32_USBHS_EPTYPE_ISOC: + { + /* Interrupts required for ISOC endpoints */ + + regval |= (N32_USBHS_HCHINTEN_TXCIEN | + N32_USBHS_HCHINTEN_ACKIEN | + N32_USBHS_HCHINTEN_FOVRIEN); + + /* Additional setting for IN endpoints */ + + if (chan->in) + { + usbhost_vtrace2(N32_USBHS_VTRACE2_CHANCONF_ISOC_IN, chidx, + chan->epno); + regval |= (N32_USBHS_HCHINTEN_TXERRIEN | + N32_USBHS_HCHINTEN_BBERRIEN); + } + #ifdef HAVE_USBHOST_TRACE_VERBOSE + else + { + usbhost_vtrace2(N32_USBHS_VTRACE2_CHANCONF_ISOC_OUT, chidx, + chan->epno); + } + #endif + } + break; + } + + n32_putreg(N32_USBHS_HCHINTEN(chidx), regval); + + /* Enable the top level host channel interrupt. */ + + n32_modifyreg(N32_USBHS_HACHINTEN, 0, N32_USBHS_HACHINT_CH(chidx)); + + /* Make sure host channel interrupts are enabled. */ + + n32_modifyreg(N32_USBHS_GINTEN, 0, N32_USBHS_GINTEN_HCHIEN); + + /* Program the HCCHAR register */ + + regval = ((uint32_t)chan->maxpacket << N32_USBHS_HCHCTRL_MPS_SHIFT) | + ((uint32_t)chan->epno << N32_USBHS_HCHCTRL_EPNUM_SHIFT) | + ((uint32_t)chan->eptype << N32_USBHS_HCHCTRL_EPTYPE_SHIFT) | + ((uint32_t)chan->funcaddr << N32_USBHS_HCHCTRL_DEVADDR_SHIFT); + + /* Special case settings for low speed devices */ + + if (chan->speed == USB_SPEED_LOW) + { + regval |= N32_USBHS_HCHCTRL_LSPDDEV; + } + + /* Special case settings for IN endpoints */ + + if (chan->in) + { + regval |= N32_USBHS_HCHCTRL_EPDIR; + } + + /* Special case settings for INTR endpoints */ + + if (chan->eptype == N32_USBHS_EPTYPE_INTR) + { + regval |= N32_USBHS_HCHCTRL_ODDFRM; + } + + /* Write the channel configuration */ + + n32_putreg(N32_USBHS_HCHCTRL(chidx), regval); +} + +/**************************************************************************** + * Name: n32_chan_halt + * + * Description: + * Halt the channel associated with 'chidx' by setting the CHannel DISable + * (CHDIS) bit in in the HCCHAR register. + * + ****************************************************************************/ + +static void n32_chan_halt(struct n32_usbhost_s *priv, int chidx, + enum n32_chreason_e chreason) +{ + uint32_t hcchar; + uint32_t intmsk; + uint32_t eptype; + unsigned int avail; + + /* Save the reason for the halt. We need this in the channel halt + * interrupt handling logic to know what to do next. + */ + + usbhost_vtrace2(N32_USBHS_VTRACE2_CHANHALT, chidx, chreason); + + priv->chan[chidx].chreason = (uint8_t)chreason; + + /* "The application can disable any channel by programming the + * N32_USBHS_HCHCTRLx register with the CHDIS and CHENA bits set to 1. + * This enables the USBHS host to flush the posted requests (if any) + * and generates a channel halted interrupt. The application must wait + * for the CHH interrupt in N32_USBHS_HCHINTSTSx before reallocating + * the channel for other transactions. + * The USBHS host does not interrupt the transaction that has already + * been started on the USB." + */ + + hcchar = n32_getreg(N32_USBHS_HCHCTRL(chidx)); + hcchar |= (N32_USBHS_HCHCTRL_CHDIS | N32_USBHS_HCHCTRL_CHEN); + + /* Get the endpoint type from the HCCHAR register */ + + eptype = hcchar & N32_USBHS_HCHCTRL_EPTYPE_MASK; + + /* Check for space in the Tx FIFO to issue the halt. + * + * "Before disabling a channel, the application must ensure that there is + * at least one free space available in the non-periodic request queue + * (when disabling a non-periodic channel) or the periodic request queue + * (when disabling a periodic channel). The application can simply flush + * the posted requests when the Request queue is full (before disabling + * the channel), by programming the N32_USBHS_HCHCTRLx register with the + * CHDIS bit set to 1, and the CHENA bit cleared to 0. + */ + + if (eptype == N32_USBHS_HCHCTRL_EPTYPE_CTRL || + eptype == N32_USBHS_HCHCTRL_EPTYPE_BULK) + { + /* Get the number of words available in the non-periodic Tx FIFO. */ + + avail = n32_getreg(N32_USBHS_GNPTXFSTS) & + N32_USBHS_GNPTXFSTS_NPTXFSAV_MASK; + } + else + { + /* if (eptype == N32_USBHS_HCHCTRL_EPTYPE_ISOC || + * eptype == N32_USBHS_HCHCTRL_EPTYPE_INTR) + */ + + /* Get the number of words available in the non-periodic Tx FIFO. */ + + avail = n32_getreg(N32_USBHS_HPTXFQSTS) & + N32_USBHS_HPTXFQSTS_PTXFSAVL_MASK; + } + + /* Check if there is any space available in the Tx FIFO. */ + + if (avail == 0) + { + /* The Tx FIFO is full... disable the channel to flush the requests */ + + hcchar &= ~N32_USBHS_HCHCTRL_CHEN; + } + + /* Unmask the CHannel Halted (CHH) interrupt */ + + intmsk = n32_getreg(N32_USBHS_HCHINTEN(chidx)); + intmsk |= N32_USBHS_HCHINTEN_CHHTDIEN; + n32_putreg(N32_USBHS_HCHINTEN(chidx), intmsk); + + /* Halt the channel by setting CHDIS (and maybe CHENA) in the HCCHAR */ + + n32_putreg(N32_USBHS_HCHCTRL(chidx), hcchar); +} + +/**************************************************************************** + * Name: n32_chan_waitsetup + * + * Description: + * Set the request for the transfer complete event well BEFORE enabling + * the transfer (as soon as we are absolutely committed to the transfer). + * We do this to minimize race conditions. This logic would have to be + * expanded if we want to have more than one packet in flight at a time! + * + * Assumptions: + * Called from a normal thread context BEFORE the transfer has been + * started. + * + ****************************************************************************/ + +static int n32_chan_waitsetup(struct n32_usbhost_s *priv, + struct n32_chan_s *chan) +{ + irqstate_t flags = enter_critical_section(); + int ret = -ENODEV; + + /* Is the device still connected? */ + + if (priv->connected) + { + /* Yes.. then set waiter to indicate that we expect to be informed + * when either (1) the device is disconnected, or (2) the transfer + * completed. + */ + + chan->waiter = true; +#ifdef CONFIG_USBHOST_ASYNCH + chan->callback = NULL; + chan->arg = NULL; +#endif + ret = OK; + } + + leave_critical_section(flags); + return ret; +} + +/**************************************************************************** + * Name: n32_chan_asynchsetup + * + * Description: + * Set the request for the transfer complete event well BEFORE enabling + * the transfer (as soon as we are absolutely committed to the to avoid + * transfer). We do this to minimize race conditions. This logic would + * have to be expanded if we want to have more than one packet in flight + * at a time! + * + * Assumptions: + * Might be called from the level of an interrupt handler + * + ****************************************************************************/ + +#ifdef CONFIG_USBHOST_ASYNCH +static int n32_chan_asynchsetup(struct n32_usbhost_s *priv, + struct n32_chan_s *chan, + usbhost_asynch_t callback, void *arg) +{ + irqstate_t flags = enter_critical_section(); + int ret = -ENODEV; + + /* Is the device still connected? */ + + if (priv->connected) + { + /* Yes.. then set waiter to indicate that we expect to be informed + * when either (1) the device is disconnected, or (2) the transfer + * completed. + */ + + chan->waiter = false; + chan->callback = callback; + chan->arg = arg; + ret = OK; + } + + leave_critical_section(flags); + return ret; +} +#endif + +/**************************************************************************** + * Name: n32_chan_wait + * + * Description: + * Wait for a transfer on a channel to complete. + * + * Assumptions: + * Called from a normal thread context + * + ****************************************************************************/ + +static int n32_chan_wait(struct n32_usbhost_s *priv, + struct n32_chan_s *chan) +{ + irqstate_t flags; + int ret; + + /* Disable interrupts so that the following operations will be atomic. On + * the OTG FS global interrupt needs to be disabled. However, here we + * disable all interrupts to exploit that fact that interrupts will be re- + * enabled while we wait. + */ + + flags = enter_critical_section(); + + /* Loop, testing for an end of transfer condition. The channel 'result' + * was set to EBUSY and 'waiter' was set to true before the transfer; + * 'waiter' will be set to false and 'result' will be set appropriately + * when the transfer is completed. + */ + + do + { + /* Wait for the transfer to complete. NOTE the transfer may already + * completed before we get here or the transfer may complete while we + * wait here. + */ + + nxsem_wait_uninterruptible(&chan->waitsem); + } + while (chan->waiter); + + /* The transfer is complete re-enable interrupts and return the result */ + + ret = -(int)chan->result; + leave_critical_section(flags); + return ret; +} + +/**************************************************************************** + * Name: n32_chan_wakeup + * + * Description: + * A channel transfer has completed... wakeup any threads waiting for the + * transfer to complete. + * + * Assumptions: + * This function is called from the transfer complete interrupt handler for + * the channel. Interrupts are disabled. + * + ****************************************************************************/ + +static void n32_chan_wakeup(struct n32_usbhost_s *priv, + struct n32_chan_s *chan) +{ + /* Is the transfer complete? */ + + if (chan->result != EBUSY) + { + /* Is there a thread waiting for this transfer to complete? */ + + if (chan->waiter) + { +#ifdef CONFIG_USBHOST_ASYNCH + /* Yes.. there should not also be a callback scheduled */ + + DEBUGASSERT(chan->callback == NULL); +#endif + /* Wake'em up! */ + + usbhost_vtrace2(chan->in ? N32_USBHS_VTRACE2_CHANWAKEUP_IN : + N32_USBHS_VTRACE2_CHANWAKEUP_OUT, + chan->epno, chan->result); + + nxsem_post(&chan->waitsem); + chan->waiter = false; + } + +#ifdef CONFIG_USBHOST_ASYNCH + /* No.. is an asynchronous callback expected when the transfer + * completes? + */ + + else if (chan->callback) + { + /* Handle continuation of IN/OUT pipes */ + + if (chan->in) + { + n32_in_next(priv, chan); + } + else + { + n32_out_next(priv, chan); + } + } +#endif + } +} + +/**************************************************************************** + * Name: n32_ctrlchan_alloc + * + * Description: + * Allocate and configured channels for a control pipe. + * + ****************************************************************************/ + +static int n32_ctrlchan_alloc(struct n32_usbhost_s *priv, + uint8_t epno, uint8_t funcaddr, + uint8_t speed, + struct n32_ctrlinfo_s *ctrlep) +{ + struct n32_chan_s *chan; + int inndx; + int outndx; + + outndx = n32_chan_alloc(priv); + if (outndx < 0) + { + return -ENOMEM; + } + + ctrlep->outndx = outndx; + chan = &priv->chan[outndx]; + chan->epno = epno; + chan->in = false; + chan->eptype = N32_USBHS_EPTYPE_CTRL; + chan->funcaddr = funcaddr; + chan->speed = speed; + chan->interval = 0; + chan->maxpacket = N32_EP0_DEF_PACKET_SIZE; + chan->indata1 = false; + chan->outdata1 = false; + + /* Configure control OUT channels */ + + n32_chan_configure(priv, outndx); + + /* Allocate and initialize the control IN channel */ + + inndx = n32_chan_alloc(priv); + if (inndx < 0) + { + n32_chan_free(priv, outndx); + return -ENOMEM; + } + + ctrlep->inndx = inndx; + chan = &priv->chan[inndx]; + chan->epno = epno; + chan->in = true; + chan->eptype = N32_USBHS_EPTYPE_CTRL; + chan->funcaddr = funcaddr; + chan->speed = speed; + chan->interval = 0; + chan->maxpacket = N32_EP0_DEF_PACKET_SIZE; + chan->indata1 = false; + chan->outdata1 = false; + + /* Configure control IN channels */ + + n32_chan_configure(priv, inndx); + return OK; +} + +/**************************************************************************** + * Name: n32_ctrlep_alloc + * + * Description: + * Allocate a container and channels for control pipe. + * + * Input Parameters: + * priv - The private USB host driver state. + * epdesc - Describes the endpoint to be allocated. + * ep - A memory location provided by the caller in which to receive the + * allocated endpoint descriptor. + * + * Returned Value: + * On success, zero (OK) is returned. On a failure, a negated errno value + * is returned indicating the nature of the failure + * + * Assumptions: + * This function will *not* be called from an interrupt handler. + * + ****************************************************************************/ + +static int n32_ctrlep_alloc(struct n32_usbhost_s *priv, + const struct usbhost_epdesc_s *epdesc, + usbhost_ep_t *ep) +{ + struct usbhost_hubport_s *hport; + struct n32_ctrlinfo_s *ctrlep; + int ret; + + /* Sanity check. NOTE that this method should only be called if a device + * is connected (because we need a valid low speed indication). + */ + + DEBUGASSERT(epdesc->hport != NULL); + hport = epdesc->hport; + + /* Allocate a container for the control endpoint */ + + ctrlep = (struct n32_ctrlinfo_s *) + kmm_malloc(sizeof(struct n32_ctrlinfo_s)); + if (ctrlep == NULL) + { + uerr("ERROR: Failed to allocate control endpoint container\n"); + return -ENOMEM; + } + + /* Then allocate and configure the IN/OUT channels */ + + ret = n32_ctrlchan_alloc(priv, epdesc->addr & USB_EPNO_MASK, + hport->funcaddr, hport->speed, ctrlep); + if (ret < 0) + { + uerr("ERROR: n32_ctrlchan_alloc failed: %d\n", ret); + kmm_free(ctrlep); + return ret; + } + + /* Return a pointer to the control pipe container as the pipe "handle" */ + + *ep = (usbhost_ep_t)ctrlep; + return OK; +} + +/**************************************************************************** + * Name: n32_xfrep_alloc + * + * Description: + * Allocate and configure one unidirectional endpoint. + * + * Input Parameters: + * priv - The private USB host driver state. + * epdesc - Describes the endpoint to be allocated. + * ep - A memory location provided by the caller in which to receive the + * allocated endpoint descriptor. + * + * Returned Value: + * On success, zero (OK) is returned. On a failure, a negated errno value + * is returned indicating the nature of the failure + * + * Assumptions: + * This function will *not* be called from an interrupt handler. + * + ****************************************************************************/ + +static int n32_xfrep_alloc(struct n32_usbhost_s *priv, + const struct usbhost_epdesc_s *epdesc, + usbhost_ep_t *ep) +{ + struct usbhost_hubport_s *hport; + struct n32_chan_s *chan; + int chidx; + + /* Sanity check. NOTE that this method should only be called if a device + * is connected (because we need a valid low speed indication). + */ + + DEBUGASSERT(epdesc->hport != NULL); + hport = epdesc->hport; + + /* Allocate a host channel for the endpoint */ + + chidx = n32_chan_alloc(priv); + if (chidx < 0) + { + uerr("ERROR: Failed to allocate a host channel\n"); + return -ENOMEM; + } + + /* Decode the endpoint descriptor to initialize the channel data + * structures. Note: Here we depend on the fact that the endpoint point + * type is encoded in the same way in the endpoint descriptor as it is in + * the OTG HS hardware. + */ + + chan = &priv->chan[chidx]; + chan->epno = epdesc->addr & USB_EPNO_MASK; + chan->in = epdesc->in; + chan->eptype = epdesc->xfrtype; + chan->funcaddr = hport->funcaddr; + chan->speed = hport->speed; + chan->interval = epdesc->interval; + chan->maxpacket = epdesc->mxpacketsize; + chan->indata1 = false; + chan->outdata1 = false; + + /* Then configure the endpoint */ + + n32_chan_configure(priv, chidx); + + /* Return the index to the allocated channel as the endpoint "handle" */ + + *ep = (usbhost_ep_t)chidx; + return OK; +} + +/**************************************************************************** + * Name: n32_transfer_start + * + * Description: + * Start at transfer on the select IN or OUT channel. + * + ****************************************************************************/ + +static void n32_transfer_start(struct n32_usbhost_s *priv, int chidx) +{ + struct n32_chan_s *chan; + uint32_t regval; + unsigned int npackets; + unsigned int maxpacket; + unsigned int avail; + unsigned int wrsize; + unsigned int minsize; + + /* Set up the initial state of the transfer */ + + chan = &priv->chan[chidx]; + + usbhost_vtrace2(N32_USBHS_VTRACE2_STARTTRANSFER, chidx, chan->buflen); + + chan->result = EBUSY; + chan->inflight = 0; + chan->xfrd = 0; + priv->chidx = chidx; + + /* Compute the expected number of packets associated to the transfer. + * If the transfer length is zero (or less than the size of one maximum + * size packet), then one packet is expected. + */ + + /* If the transfer size is greater than one packet, then calculate the + * number of packets that will be received/sent, including any partial + * final packet. + */ + + maxpacket = chan->maxpacket; + + if (chan->buflen > maxpacket) + { + npackets = (chan->buflen + maxpacket - 1) / maxpacket; + + /* Clip if the buffer length if it exceeds the maximum number of + * packets that can be transferred (this should not happen). + */ + + if (npackets > N32_MAX_PKTCOUNT) + { + npackets = N32_MAX_PKTCOUNT; + chan->buflen = N32_MAX_PKTCOUNT * maxpacket; + usbhost_trace2(N32_USBHS_TRACE2_CLIP, chidx, chan->buflen); + } + } + else + { + /* One packet will be sent/received (might be a zero length packet) */ + + npackets = 1; + } + + /* If it is an IN transfer, then adjust the size of the buffer UP to + * a full number of packets. Hmmm... couldn't this cause an overrun + * into unallocated memory? + */ + +#if 0 /* Think about this */ + if (chan->in) + { + /* Force the buffer length to an even multiple of maxpacket */ + + chan->buflen = npackets * maxpacket; + } +#endif + + /* Save the number of packets in the transfer. We will need this in + * order to set the next data toggle correctly when the transfer + * completes. + */ + + chan->npackets = (uint8_t)npackets; + + /* Setup the HCTSIZn register */ + + regval = ((uint32_t)chan->buflen << N32_USBHS_HCHTXSIZ_TXSIZ_SHIFT) | + ((uint32_t)npackets << N32_USBHS_HCHTXSIZ_PKCNT_SHIFT) | + ((uint32_t)chan->pid << N32_USBHS_HCHTXSIZ_PID_SHIFT); + n32_putreg(N32_USBHS_HCHTXSIZ(chidx), regval); + + /* Setup the HCCHAR register: Frame oddness and host channel enable */ + + regval = n32_getreg(N32_USBHS_HCHCTRL(chidx)); + + /* Set/clear the Odd Frame bit. Check for an even frame; if so set Odd + * Frame. This field is applicable for only periodic (isochronous and + * interrupt) channels. + */ + + if ((n32_getreg(N32_USBHS_HFNUM) & 1) == 0) + { + regval |= N32_USBHS_HCHCTRL_ODDFRM; + } + else + { + regval &= ~N32_USBHS_HCHCTRL_ODDFRM; + } + + regval &= ~N32_USBHS_HCHCTRL_CHDIS; + regval |= N32_USBHS_HCHCTRL_CHEN; + n32_putreg(N32_USBHS_HCHCTRL(chidx), regval); + + /* If this is an out transfer, then we need to do more.. we need to copy + * the outgoing data into the correct TxFIFO. + */ + + if (!chan->in && chan->buflen > 0) + { + /* Handle non-periodic (CTRL and BULK) OUT transfers differently than + * periodic (INTR and ISOC) OUT transfers. + */ + + minsize = MIN(chan->buflen, chan->maxpacket); + + switch (chan->eptype) + { + case N32_USBHS_EPTYPE_CTRL: /* Non periodic transfer */ + case N32_USBHS_EPTYPE_BULK: + { + /* Read the Non-periodic Tx FIFO status register */ + + regval = n32_getreg(N32_USBHS_GNPTXFSTS); + avail = ((regval & N32_USBHS_GNPTXFSTS_NPTXFSAV_MASK) >> + N32_USBHS_GNPTXFSTS_NPTXFSAV_SHIFT) << 2; + } + break; + + /* Periodic transfer */ + + case N32_USBHS_EPTYPE_INTR: + case N32_USBHS_EPTYPE_ISOC: + { + /* Read the Non-periodic Tx FIFO status register */ + + regval = n32_getreg(N32_USBHS_HPTXFQSTS); + avail = ((regval & N32_USBHS_HPTXFQSTS_PTXFSAVL_MASK) >> + N32_USBHS_HPTXFQSTS_PTXFSAVL_SHIFT) << 2; + } + break; + + default: + DEBUGPANIC(); + return; + } + + /* Is there space in the TxFIFO to hold the minimum size packet? */ + + if (minsize <= avail) + { + /* Yes.. Get the size of the biggest thing that we can put + * in the Tx FIFO now + */ + + wrsize = chan->buflen; + if (wrsize > avail) + { + /* Clip the write size to the number of full, max sized packets + * that will fit in the Tx FIFO. + */ + + unsigned int wrpackets = avail / chan->maxpacket; + + wrsize = wrpackets * chan->maxpacket; + } + + /* Write packet into the Tx FIFO. */ + + n32_gint_wrpacket(priv, chan->buffer, chidx, wrsize); + } + + /* Did we put the entire buffer into the Tx FIFO? */ + + if (chan->buflen > avail) + { + /* No, there was insufficient space to hold the entire transfer ... + * Enable the Tx FIFO interrupt to handle the transfer when the Tx + * FIFO becomes empty. + */ + + n32_txfe_enable(priv, chidx); + } + } +} + +/**************************************************************************** + * Name: n32_getframe + * + * Description: + * Get the current frame number. The frame number (FRNUM) field increments + * when a new SOF is transmitted on the USB, and is cleared to 0 when it + * reaches 0x3fff. + * + ****************************************************************************/ + +#if 0 /* Not used */ +static inline uint16_t n32_getframe(void) +{ + return (uint16_t)(n32_getreg(N32_USBHS_HFNUM) & + N32_USBHS_HFNUM_FRNUM_MASK); +} +#endif + +/**************************************************************************** + * Name: n32_ctrl_sendsetup + * + * Description: + * Send an IN/OUT SETUP packet. + * + ****************************************************************************/ + +static int n32_ctrl_sendsetup(struct n32_usbhost_s *priv, + struct n32_ctrlinfo_s *ep0, + const struct usb_ctrlreq_s *req) +{ + struct n32_chan_s *chan; + clock_t start; + clock_t elapsed; + int ret; + + /* Loop while the device reports NAK (and a timeout is not exceeded */ + + chan = &priv->chan[ep0->outndx]; + start = clock_systime_ticks(); + + do + { + /* Send the SETUP packet */ + + chan->pid = N32_USBHS_PID_SETUP; + chan->buffer = (uint8_t *)req; + chan->buflen = USB_SIZEOF_CTRLREQ; + chan->xfrd = 0; + + /* Set up for the wait BEFORE starting the transfer */ + + ret = n32_chan_waitsetup(priv, chan); + if (ret < 0) + { + usbhost_trace1(N32_USBHS_TRACE1_DEVDISCONN, 0); + return ret; + } + + /* Start the transfer */ + + n32_transfer_start(priv, ep0->outndx); + + /* Wait for the transfer to complete */ + + ret = n32_chan_wait(priv, chan); + + /* Return on success and for all failures other than EAGAIN. EAGAIN + * means that the device NAKed the SETUP command and that we should + * try a few more times. + */ + + if (ret != -EAGAIN) + { + /* Output some debug information if the transfer failed */ + + if (ret < 0) + { + usbhost_trace1(N32_USBHS_TRACE1_TRNSFRFAILED, ret); + } + + /* Return the result in any event */ + + return ret; + } + + /* Get the elapsed time (in frames) */ + + elapsed = clock_systime_ticks() - start; + } + while (elapsed < N32_SETUP_DELAY); + + return -ETIMEDOUT; +} + +/**************************************************************************** + * Name: n32_ctrl_senddata + * + * Description: + * Send data in the data phase of an OUT control transfer. Or send status + * in the status phase of an IN control transfer + * + ****************************************************************************/ + +static int n32_ctrl_senddata(struct n32_usbhost_s *priv, + struct n32_ctrlinfo_s *ep0, + uint8_t *buffer, unsigned int buflen) +{ + struct n32_chan_s *chan = &priv->chan[ep0->outndx]; + int ret; + + /* Save buffer information */ + + chan->buffer = buffer; + chan->buflen = buflen; + chan->xfrd = 0; + + /* Set the DATA PID */ + + if (buflen == 0) + { + /* For status OUT stage with buflen == 0, set PID DATA1 */ + + chan->outdata1 = true; + } + + /* Set the Data PID as per the outdata1 boolean */ + + chan->pid = chan->outdata1 ? N32_USBHS_PID_DATA1 : N32_USBHS_PID_DATA0; + + /* Set up for the wait BEFORE starting the transfer */ + + ret = n32_chan_waitsetup(priv, chan); + if (ret < 0) + { + usbhost_trace1(N32_USBHS_TRACE1_DEVDISCONN, 0); + return ret; + } + + /* Start the transfer */ + + n32_transfer_start(priv, ep0->outndx); + + /* Wait for the transfer to complete and return the result */ + + return n32_chan_wait(priv, chan); +} + +/**************************************************************************** + * Name: n32_ctrl_recvdata + * + * Description: + * Receive data in the data phase of an IN control transfer. Or receive + * status in the status phase of an OUT control transfer + * + ****************************************************************************/ + +static int n32_ctrl_recvdata(struct n32_usbhost_s *priv, + struct n32_ctrlinfo_s *ep0, + uint8_t *buffer, unsigned int buflen) +{ + struct n32_chan_s *chan = &priv->chan[ep0->inndx]; + int ret; + + /* Save buffer information */ + + chan->pid = N32_USBHS_PID_DATA1; + chan->buffer = buffer; + chan->buflen = buflen; + chan->xfrd = 0; + + /* Set up for the wait BEFORE starting the transfer */ + + ret = n32_chan_waitsetup(priv, chan); + if (ret < 0) + { + usbhost_trace1(N32_USBHS_TRACE1_DEVDISCONN, 0); + return ret; + } + + /* Start the transfer */ + + n32_transfer_start(priv, ep0->inndx); + + /* Wait for the transfer to complete and return the result */ + + return n32_chan_wait(priv, chan); +} + +/**************************************************************************** + * Name: n32_in_setup + * + * Description: + * Initiate an IN transfer on an bulk, interrupt, or isochronous pipe. + * + ****************************************************************************/ + +static int n32_in_setup(struct n32_usbhost_s *priv, int chidx) +{ + struct n32_chan_s *chan; + + /* Set up for the transfer based on the direction and the endpoint type */ + + chan = &priv->chan[chidx]; + switch (chan->eptype) + { + default: + case N32_USBHS_EPTYPE_CTRL: /* Control */ + { + /* This kind of transfer on control endpoints other than EP0 are + * not currently supported + */ + + return -ENOSYS; + } + + case N32_USBHS_EPTYPE_ISOC: /* Isochronous */ + { + /* Set up the IN data PID */ + + usbhost_vtrace2(N32_USBHS_VTRACE2_ISOCIN, chidx, chan->buflen); + chan->pid = N32_USBHS_PID_DATA0; + } + break; + + case N32_USBHS_EPTYPE_BULK: /* Bulk */ + { + /* Setup the IN data PID */ + + usbhost_vtrace2(N32_USBHS_VTRACE2_BULKIN, chidx, chan->buflen); + chan->pid = chan->indata1 ? N32_USBHS_PID_DATA1 : + N32_USBHS_PID_DATA0; + } + break; + + case N32_USBHS_EPTYPE_INTR: /* Interrupt */ + { + /* Setup the IN data PID */ + + usbhost_vtrace2(N32_USBHS_VTRACE2_INTRIN, chidx, chan->buflen); + chan->pid = chan->indata1 ? N32_USBHS_PID_DATA1 : + N32_USBHS_PID_DATA0; + } + break; + } + + /* Start the transfer */ + + n32_transfer_start(priv, chidx); + return OK; +} + +/**************************************************************************** + * Name: n32_in_transfer + * + * Description: + * Transfer 'buflen' bytes into 'buffer' from an IN channel. + * + ****************************************************************************/ + +static ssize_t n32_in_transfer(struct n32_usbhost_s *priv, int chidx, + uint8_t *buffer, size_t buflen) +{ + struct n32_chan_s *chan; + clock_t start; + ssize_t xfrd; + int ret; + + /* Loop until the transfer completes (i.e., buflen is decremented to zero) + * or a fatal error occurs any error other than a simple NAK. NAK would + * simply indicate the end of the transfer (short-transfer). + */ + + chan = &priv->chan[chidx]; + chan->buffer = buffer; + chan->buflen = buflen; + chan->xfrd = 0; + xfrd = 0; + + start = clock_systime_ticks(); + while (chan->xfrd < chan->buflen) + { + /* Set up for the wait BEFORE starting the transfer */ + + ret = n32_chan_waitsetup(priv, chan); + if (ret < 0) + { + usbhost_trace1(N32_USBHS_TRACE1_DEVDISCONN, 0); + return (ssize_t)ret; + } + + /* Set up for the transfer based on the direction and the endpoint */ + + ret = n32_in_setup(priv, chidx); + if (ret < 0) + { + uerr("ERROR: n32_in_setup failed: %d\n", ret); + return (ssize_t)ret; + } + + /* Wait for the transfer to complete and get the result */ + + ret = n32_chan_wait(priv, chan); + + /* EAGAIN indicates that the device NAKed the transfer. */ + + if (ret < 0) + { + /* The transfer failed. If we received a NAK, return all data + * buffered so far (if any). + */ + + if (ret == -EAGAIN) + { + /* Was data buffered prior to the NAK? */ + + if (xfrd > 0) + { + /* Yes, return the amount of data received. + * + * REVISIT: This behavior is clearly correct for CDC/ACM + * bulk transfers and HID interrupt transfers. But I am + * not so certain for MSC bulk transfers which, I think, + * could have NAKed packets in the middle of a transfer. + */ + + return xfrd; + } + else + { + useconds_t delay; + + /* Get the elapsed time. Has the timeout elapsed? + * if not then try again. + */ + + clock_t elapsed = clock_systime_ticks() - start; + + if (elapsed >= N32_DATANAK_DELAY) + { + /* Timeout out... break out returning the NAK as + * as a failure. + */ + + return (ssize_t)ret; + } + + /* Wait a bit before retrying after a NAK. */ + + if (chan->eptype == N32_USBHS_EPTYPE_INTR) + { + /* For interrupt (and isochronous) endpoints, the + * polling rate is determined by the bInterval field + * of the endpoint descriptor (in units of frames + * which we treat as milliseconds here). + */ + + if (chan->interval > 0) + { + /* Convert the delay to units of microseconds */ + + delay = (useconds_t)chan->interval * 1000; + } + else + { + /* Out of range! For interrupt endpoints, the valid + * range is 1-255 frames. Assume one frame. + */ + + delay = 1000; + } + } + else + { + /* For Isochronous endpoints, bInterval must be 1. + * Bulk endpoints do not have a polling interval. + * Rather, the should wait until data is received. + * + * REVISIT: For bulk endpoints this 1 msec delay is + * only intended to give the CPU a break from the bulk + * EP tight polling loop. But are there performance + * issues? + */ + + delay = 1000; + } + + /* Wait for the next polling interval. For interrupt and + * isochronous endpoints, this is necessary to assure the + * polling interval. It is used in other cases only to + * prevent the polling from consuming too much CPU + * bandwidth. + * + * Small delays could require more resolution than is + * provided by the system timer. For example, if the + * system timer resolution is 10MS, then + * nxsched_usleep(1000) will actually request a delay 20MS + * (due to both quantization and rounding). + * + * REVISIT: So which is better? To ignore tiny delays and + * hog the system bandwidth? Or to wait for an excessive + * amount and destroy system throughput? + */ + + if (delay > CONFIG_USEC_PER_TICK) + { + nxsched_usleep(delay - CONFIG_USEC_PER_TICK); + } + } + } + else + { + /* Some unexpected, fatal error occurred. */ + + usbhost_trace1(N32_USBHS_TRACE1_TRNSFRFAILED, ret); + + /* Break out and return the error */ + + uerr("ERROR: n32_chan_wait failed: %d\n", ret); + return (ssize_t)ret; + } + } + else + { + /* Successfully received another chunk of data... add that to the + * running total. Then continue reading until we read 'buflen' + * bytes of data or until the devices NAKs (implying a short + * packet). + */ + + xfrd += chan->xfrd; + } + } + + return xfrd; +} + +/**************************************************************************** + * Name: n32_in_next + * + * Description: + * Initiate the next of a sequence of asynchronous transfers. + * + * Assumptions: + * This function is always called from an interrupt handler + * + ****************************************************************************/ + +#ifdef CONFIG_USBHOST_ASYNCH +static void n32_in_next(struct n32_usbhost_s *priv, + struct n32_chan_s *chan) +{ + usbhost_asynch_t callback; + void *arg; + ssize_t nbytes; + int result; + int ret; + + /* Is the full transfer complete? Did the last chunk transfer OK? */ + + result = -(int)chan->result; + if (chan->xfrd < chan->buflen && result == OK) + { + /* Yes.. Set up for the next transfer based on the direction and the + * endpoint type + */ + + ret = n32_in_setup(priv, chan->chidx); + if (ret >= 0) + { + return; + } + + uerr("ERROR: n32_in_setup failed: %d\n", ret); + result = ret; + } + + /* The transfer is complete, with or without an error */ + + uinfo("Transfer complete: %d\n", result); + + /* Extract the callback information */ + + callback = chan->callback; + arg = chan->arg; + nbytes = chan->xfrd; + + chan->callback = NULL; + chan->arg = NULL; + chan->xfrd = 0; + + /* Then perform the callback */ + + if (result < 0) + { + nbytes = (ssize_t)result; + } + + callback(arg, nbytes); +} +#endif + +/**************************************************************************** + * Name: n32_in_asynch + * + * Description: + * Initiate the first of a sequence of asynchronous transfers. + * + * Assumptions: + * This function is never called from an interrupt handler + * + ****************************************************************************/ + +#ifdef CONFIG_USBHOST_ASYNCH +static int n32_in_asynch(struct n32_usbhost_s *priv, int chidx, + uint8_t *buffer, size_t buflen, + usbhost_asynch_t callback, void *arg) +{ + struct n32_chan_s *chan; + int ret; + + /* Set up for the transfer BEFORE starting the first transfer */ + + chan = &priv->chan[chidx]; + chan->buffer = buffer; + chan->buflen = buflen; + chan->xfrd = 0; + + ret = n32_chan_asynchsetup(priv, chan, callback, arg); + if (ret < 0) + { + uerr("ERROR: n32_chan_asynchsetup failed: %d\n", ret); + return ret; + } + + /* Set up for the transfer based on the direction and the endpoint type */ + + ret = n32_in_setup(priv, chidx); + if (ret < 0) + { + uerr("ERROR: n32_in_setup failed: %d\n", ret); + } + + /* And return with the transfer pending */ + + return ret; +} +#endif + +/**************************************************************************** + * Name: n32_out_setup + * + * Description: + * Initiate an OUT transfer on an bulk, interrupt, or isochronous pipe. + * + ****************************************************************************/ + +static int n32_out_setup(struct n32_usbhost_s *priv, int chidx) +{ + struct n32_chan_s *chan; + + /* Set up for the transfer based on the direction and the endpoint type */ + + chan = &priv->chan[chidx]; + switch (chan->eptype) + { + default: + case N32_USBHS_EPTYPE_CTRL: /* Control */ + { + /* This kind of transfer on control endpoints other than EP0 are + * not currently supported + */ + + return -ENOSYS; + } + + case N32_USBHS_EPTYPE_ISOC: /* Isochronous */ + { + /* Set up the OUT data PID */ + + usbhost_vtrace2(N32_USBHS_VTRACE2_ISOCOUT, chidx, chan->buflen); + chan->pid = N32_USBHS_PID_DATA0; + } + break; + + case N32_USBHS_EPTYPE_BULK: /* Bulk */ + { + /* Setup the OUT data PID */ + + usbhost_vtrace2(N32_USBHS_VTRACE2_BULKOUT, chidx, chan->buflen); + chan->pid = chan->outdata1 ? N32_USBHS_PID_DATA1 : + N32_USBHS_PID_DATA0; + } + break; + + case N32_USBHS_EPTYPE_INTR: /* Interrupt */ + { + /* Setup the OUT data PID */ + + usbhost_vtrace2(N32_USBHS_VTRACE2_INTROUT, chidx, chan->buflen); + chan->pid = chan->outdata1 ? N32_USBHS_PID_DATA1 : + N32_USBHS_PID_DATA0; + + /* Toggle the OUT data PID for the next transfer */ + + chan->outdata1 ^= true; + } + break; + } + + /* Start the transfer */ + + n32_transfer_start(priv, chidx); + return OK; +} + +/**************************************************************************** + * Name: n32_out_transfer + * + * Description: + * Transfer the 'buflen' bytes in 'buffer' through an OUT channel. + * + ****************************************************************************/ + +static ssize_t n32_out_transfer(struct n32_usbhost_s *priv, + int chidx, uint8_t *buffer, + size_t buflen) +{ + struct n32_chan_s *chan; + clock_t start; + clock_t elapsed; + size_t xfrlen; + ssize_t xfrd; + int ret; + bool zlp; + + /* Loop until the transfer completes (i.e., buflen is decremented to zero) + * or a fatal error occurs (any error other than a simple NAK) + */ + + chan = &priv->chan[chidx]; + start = clock_systime_ticks(); + xfrd = 0; + zlp = (buflen == 0); + + while (buflen > 0 || zlp) + { + /* Transfer one packet at a time. The hardware is capable of queueing + * multiple OUT packets, but I just haven't figured out how to handle + * the case where a single OUT packet in the group is NAKed. + */ + + xfrlen = MIN(chan->maxpacket, buflen); + chan->buffer = buffer; + chan->buflen = xfrlen; + chan->xfrd = 0; + + /* Set up for the wait BEFORE starting the transfer */ + + ret = n32_chan_waitsetup(priv, chan); + if (ret < 0) + { + usbhost_trace1(N32_USBHS_TRACE1_DEVDISCONN, 0); + return (ssize_t)ret; + } + + /* Set up for the transfer based on the direction and the endpoint */ + + ret = n32_out_setup(priv, chidx); + if (ret < 0) + { + uerr("ERROR: n32_out_setup failed: %d\n", ret); + return (ssize_t)ret; + } + + /* Wait for the transfer to complete and get the result */ + + ret = n32_chan_wait(priv, chan); + + /* Handle transfer failures */ + + if (ret < 0) + { + usbhost_trace1(N32_USBHS_TRACE1_TRNSFRFAILED, ret); + + /* Check for a special case: If (1) the transfer was NAKed and (2) + * no Tx FIFO empty or Rx FIFO not-empty event occurred, then we + * should be able to just flush the Rx and Tx FIFOs and try again. + * We can detect this latter case because then the transfer buffer + * pointer and buffer size will be unaltered. + */ + + elapsed = clock_systime_ticks() - start; + if (ret != -EAGAIN || /* Not a NAK condition OR */ + elapsed >= N32_DATANAK_DELAY || /* Timeout has elapsed OR */ + chan->xfrd > 0) /* Data has been partially transferred */ + { + /* Break out and return the error */ + + uerr("ERROR: n32_chan_wait failed: %d\n", ret); + return (ssize_t)ret; + } + + /* Is this flush really necessary? What does the hardware do with + * the data in the FIFO when the NAK occurs? Does it discard it? + */ + + n32_flush_txfifos(N32_USBHS_GRSTCTRL_TXFNUM_HALL); + + /* Get the device a little time to catch up. Then retry the + * transfer using the same buffer pointer and length. + */ + + nxsched_usleep(20 * 1000); + } + else + { + /* Successfully transferred. Update the buffer pointe/length */ + + buffer += xfrlen; + buflen -= xfrlen; + xfrd += chan->xfrd; + zlp = false; + } + } + + return xfrd; +} + +/**************************************************************************** + * Name: n32_out_next + * + * Description: + * Initiate the next of a sequence of asynchronous transfers. + * + * Assumptions: + * This function is always called from an interrupt handler + * + ****************************************************************************/ + +#ifdef CONFIG_USBHOST_ASYNCH +static void n32_out_next(struct n32_usbhost_s *priv, + struct n32_chan_s *chan) +{ + usbhost_asynch_t callback; + void *arg; + ssize_t nbytes; + int result; + int ret; + + /* Is the full transfer complete? Did the last chunk transfer OK? */ + + result = -(int)chan->result; + if (chan->xfrd < chan->buflen && result == OK) + { + /* Yes.. Set up for the next transfer based on the direction and the + * endpoint type + */ + + ret = n32_out_setup(priv, chan->chidx); + if (ret >= 0) + { + return; + } + + uerr("ERROR: n32_out_setup failed: %d\n", ret); + result = ret; + } + + /* The transfer is complete, with or without an error */ + + uinfo("Transfer complete: %d\n", result); + + /* Extract the callback information */ + + callback = chan->callback; + arg = chan->arg; + nbytes = chan->xfrd; + + chan->callback = NULL; + chan->arg = NULL; + chan->xfrd = 0; + + /* Then perform the callback */ + + if (result < 0) + { + nbytes = (ssize_t)result; + } + + callback(arg, nbytes); +} +#endif + +/**************************************************************************** + * Name: n32_out_asynch + * + * Description: + * Initiate the first of a sequence of asynchronous transfers. + * + * Assumptions: + * This function is never called from an interrupt handler + * + ****************************************************************************/ + +#ifdef CONFIG_USBHOST_ASYNCH +static int n32_out_asynch(struct n32_usbhost_s *priv, int chidx, + uint8_t *buffer, size_t buflen, + usbhost_asynch_t callback, void *arg) +{ + struct n32_chan_s *chan; + int ret; + + /* Set up for the transfer BEFORE starting the first transfer */ + + chan = &priv->chan[chidx]; + chan->buffer = buffer; + chan->buflen = buflen; + chan->xfrd = 0; + + ret = n32_chan_asynchsetup(priv, chan, callback, arg); + if (ret < 0) + { + uerr("ERROR: n32_chan_asynchsetup failed: %d\n", ret); + return ret; + } + + /* Set up for the transfer based on the direction and the endpoint type */ + + ret = n32_out_setup(priv, chidx); + if (ret < 0) + { + uerr("ERROR: n32_out_setup failed: %d\n", ret); + } + + /* And return with the transfer pending */ + + return ret; +} +#endif + +/**************************************************************************** + * Name: n32_gint_wrpacket + * + * Description: + * Transfer the 'buflen' bytes in 'buffer' to the Tx FIFO associated with + * 'chidx' (non-DMA). + * + ****************************************************************************/ + +static void n32_gint_wrpacket(struct n32_usbhost_s *priv, + uint8_t *buffer, int chidx, int buflen) +{ + uint32_t *src; + uint32_t fifo; + int buflen32; + + n32_pktdump("Sending", buffer, buflen); + + /* Get the number of 32-byte words associated with this byte size */ + + buflen32 = (buflen + 3) >> 2; + + /* Get the address of the Tx FIFO associated with this channel */ + + fifo = N32_USBHS_DFIFO_HCH(chidx); + + /* Transfer all of the data into the Tx FIFO */ + + src = (uint32_t *)buffer; + for (; buflen32 > 0; buflen32--) + { + uint32_t data = *src++; + + n32_putreg(fifo, data); + } + + /* Increment the count of bytes "in-flight" in the Tx FIFO */ + + priv->chan[chidx].inflight += buflen; +} + +/**************************************************************************** + * Name: n32_gint_hcinisr + * + * Description: + * USB OTG FS host IN channels interrupt handler + * + * One the completion of the transfer, the channel result byte may be set + * as follows: + * + * OK - Transfer completed successfully + * EAGAIN - If devices NAKs the transfer or NYET occurs + * EPERM - If the endpoint stalls + * EIO - On a TX or data toggle error + * EPIPE - Frame overrun + * + * EBUSY in the result field indicates that the transfer has not completed. + * + ****************************************************************************/ + +static inline void n32_gint_hcinisr(struct n32_usbhost_s *priv, + int chidx) +{ + struct n32_chan_s *chan = &priv->chan[chidx]; + uint32_t regval; + uint32_t pending; + + /* Read the HCINT register to get the pending HC interrupts. Read the + * HCINTMSK register to get the set of enabled HC interrupts. + */ + + pending = n32_getreg(N32_USBHS_HCHINTSTS(chidx)); + regval = n32_getreg(N32_USBHS_HCHINTEN(chidx)); + + /* AND the two to get the set of enabled, pending HC interrupts */ + + pending &= regval; + uinfo("HCINTMSK%d: %08" PRIx32 " pending: %08" PRIx32 "\n", + chidx, regval, pending); + + /* Check for a pending ACK response received/transmitted interrupt */ + + if ((pending & N32_USBHS_HCHINTSTS_ACKIF) != 0) + { + /* Clear the pending the ACK response received/transmitted interrupt */ + + n32_putreg(N32_USBHS_HCHINTSTS(chidx), N32_USBHS_HCHINTSTS_ACKIF); + } + + /* Check for a pending STALL response receive (STALL) interrupt */ + + else if ((pending & N32_USBHS_HCHINTSTS_STALLIF) != 0) + { + /* Clear the NAK and STALL Conditions. */ + + n32_putreg(N32_USBHS_HCHINTSTS(chidx), + N32_USBHS_HCHINTSTS_NAKIF | N32_USBHS_HCHINTSTS_STALLIF); + + /* Halt the channel when a STALL, TXERR, BBERR or DTERR interrupt is + * received on the channel. + */ + + n32_chan_halt(priv, chidx, CHREASON_STALL); + + /* When there is a STALL, clear any pending NAK so that it is not + * processed below. + */ + + pending &= ~N32_USBHS_HCHINTSTS_NAKIF; + } + + /* Check for a pending Data Toggle ERRor (DTERR) interrupt */ + + else if ((pending & N32_USBHS_HCHINTSTS_DTERRIF) != 0) + { + /* Halt the channel when a STALL, TXERR, BBERR or DTERR interrupt is + * received on the channel. + */ + + n32_chan_halt(priv, chidx, CHREASON_DTERR); + + /* Clear the NAK and data toggle error conditions */ + + n32_putreg(N32_USBHS_HCHINTSTS(chidx), + N32_USBHS_HCHINTSTS_NAKIF | N32_USBHS_HCHINTSTS_DTERRIF); + } + + /* Check for a pending FRaMe OverRun (FRMOR) interrupt */ + + if ((pending & N32_USBHS_HCHINTSTS_FOVRIF) != 0) + { + /* Halt the channel -- the CHH interrupt is expected next */ + + n32_chan_halt(priv, chidx, CHREASON_FRMOR); + + /* Clear the FRaMe OverRun (FRMOR) condition */ + + n32_putreg(N32_USBHS_HCHINTSTS(chidx), N32_USBHS_HCHINTSTS_FOVRIF); + } + + /* Check for a pending TransFeR Completed (XFRC) interrupt */ + + else if ((pending & N32_USBHS_HCHINTSTS_TXCFIF) != 0) + { + /* Clear the TransFeR Completed (XFRC) condition */ + + n32_putreg(N32_USBHS_HCHINTSTS(chidx), N32_USBHS_HCHINTSTS_TXCFIF); + + /* Then handle the transfer completion event based on the endpoint */ + + if (chan->eptype == N32_USBHS_EPTYPE_CTRL || + chan->eptype == N32_USBHS_EPTYPE_BULK) + { + /* Halt the channel -- the CHH interrupt is expected next */ + + n32_chan_halt(priv, chidx, CHREASON_XFRC); + + /* Clear any pending NAK condition. The 'indata1' data toggle + * should have been appropriately updated by the RxFIFO + * logic as each packet was received. + */ + + n32_putreg(N32_USBHS_HCHINTSTS(chidx), N32_USBHS_HCHINTSTS_NAKIF); + } + else if (chan->eptype == N32_USBHS_EPTYPE_INTR) + { + /* Force the next transfer on an ODD frame */ + + regval = n32_getreg(N32_USBHS_HCHCTRL(chidx)); + regval |= N32_USBHS_HCHCTRL_ODDFRM; + n32_putreg(N32_USBHS_HCHCTRL(chidx), regval); + + /* Set the request done state */ + + chan->result = OK; + } + } + + /* Check for a pending CHannel Halted (CHH) interrupt */ + + else if ((pending & N32_USBHS_HCHINTSTS_CHHTDIF) != 0) + { + /* Mask the CHannel Halted (CHH) interrupt */ + + regval = n32_getreg(N32_USBHS_HCHINTEN(chidx)); + regval &= ~N32_USBHS_HCHINTEN_CHHTDIEN; + n32_putreg(N32_USBHS_HCHINTEN(chidx), regval); + + /* Update the request state based on the host state machine state */ + + if (chan->chreason == CHREASON_XFRC) + { + /* Set the request done result */ + + chan->result = OK; + } + else if (chan->chreason == CHREASON_STALL) + { + /* Set the request stall result */ + + chan->result = EPERM; + } + else if ((chan->chreason == CHREASON_TXERR) || + (chan->chreason == CHREASON_DTERR)) + { + /* Set the request I/O error result */ + + chan->result = EIO; + } + else if (chan->chreason == CHREASON_NAK) + { + /* Set the NAK error result */ + + chan->result = EAGAIN; + } + else /* if (chan->chreason == CHREASON_FRMOR) */ + { + /* Set the frame overrun error result */ + + chan->result = EPIPE; + } + + /* Clear the CHannel Halted (CHH) condition */ + + n32_putreg(N32_USBHS_HCHINTSTS(chidx), N32_USBHS_HCHINTSTS_CHHTDIF); + } + + /* Check for a pending Transaction ERror (TXERR) interrupt */ + + else if ((pending & N32_USBHS_HCHINTSTS_TXERRIF) != 0) + { + /* Halt the channel when a STALL, TXERR, BBERR or DTERR interrupt is + * received on the channel. + */ + + n32_chan_halt(priv, chidx, CHREASON_TXERR); + + /* Clear the Transaction ERror (TXERR) condition */ + + n32_putreg(N32_USBHS_HCHINTSTS(chidx), N32_USBHS_HCHINTSTS_TXERRIF); + } + + /* Check for a pending NAK response received (NAK) interrupt */ + + else if ((pending & N32_USBHS_HCHINTSTS_NAKIF) != 0) + { + /* For a BULK transfer, the hardware is capable of retrying + * automatically on a NAK. However, this is not always + * what we need to do. So we always halt the transfer and + * return control to high level logic in the event of a NAK. + */ + +#if 1 + /* Halt the interrupt channel */ + + if (chan->eptype == N32_USBHS_EPTYPE_INTR || + chan->eptype == N32_USBHS_EPTYPE_BULK) + { + /* Halt the channel -- the CHH interrupt is expected next */ + + n32_chan_halt(priv, chidx, CHREASON_NAK); + } + + /* Re-activate CTRL and BULK channels. + * REVISIT: This can cause a lot of interrupts! + * REVISIT: BULK channel is not re-activated. + */ + + else if (chan->eptype == N32_USBHS_EPTYPE_CTRL) + { + /* Re-activate the channel by clearing CHDIS and assuring that + * CHENA is set + * + * TODO: set channel reason to NACK? + */ + + regval = n32_getreg(N32_USBHS_HCHCTRL(chidx)); + regval |= N32_USBHS_HCHCTRL_CHEN; + regval &= ~N32_USBHS_HCHCTRL_CHDIS; + n32_putreg(N32_USBHS_HCHCTRL(chidx), regval); + } + +#else + /* Halt all transfers on the NAK -- CHH interrupt is expected next */ + + n32_chan_halt(priv, chidx, CHREASON_NAK); +#endif + + /* Clear the NAK condition */ + + n32_putreg(N32_USBHS_HCHINTSTS(chidx), N32_USBHS_HCHINTSTS_NAKIF); + } + + /* Check for a transfer complete event */ + + n32_chan_wakeup(priv, chan); +} + +/**************************************************************************** + * Name: n32_gint_hcoutisr + * + * Description: + * USB OTG FS host OUT channels interrupt handler + * + * One the completion of the transfer, the channel result byte may be set + * as follows: + * + * OK - Transfer completed successfully + * EAGAIN - If devices NAKs the transfer or NYET occurs + * EPERM - If the endpoint stalls + * EIO - On a TX or data toggle error + * EPIPE - Frame overrun + * + * EBUSY in the result field indicates that the transfer has not completed. + * + ****************************************************************************/ + +static inline void n32_gint_hcoutisr(struct n32_usbhost_s *priv, + int chidx) +{ + struct n32_chan_s *chan = &priv->chan[chidx]; + uint32_t regval; + uint32_t pending; + + /* Read the HCINT register to get the pending HC interrupts. Read the + * HCINTMSK register to get the set of enabled HC interrupts. + */ + + pending = n32_getreg(N32_USBHS_HCHINTSTS(chidx)); + regval = n32_getreg(N32_USBHS_HCHINTEN(chidx)); + + /* AND the two to get the set of enabled, pending HC interrupts */ + + pending &= regval; + uinfo("HCINTMSK%d: %08" PRIx32 " pending: %08" PRIx32 "\n", + chidx, regval, pending); + + /* Check for a pending ACK response received/transmitted interrupt */ + + if ((pending & N32_USBHS_HCHINTSTS_ACKIF) != 0) + { + /* Clear the pending the ACK response received/transmitted interrupt */ + + n32_putreg(N32_USBHS_HCHINTSTS(chidx), N32_USBHS_HCHINTSTS_ACKIF); + } + + /* Check for a pending FRaMe OverRun (FRMOR) interrupt */ + + else if ((pending & N32_USBHS_HCHINTSTS_FOVRIF) != 0) + { + /* Halt the channel (probably not necessary for FRMOR) */ + + n32_chan_halt(priv, chidx, CHREASON_FRMOR); + + /* Clear the pending the FRaMe OverRun (FRMOR) interrupt */ + + n32_putreg(N32_USBHS_HCHINTSTS(chidx), N32_USBHS_HCHINTSTS_FOVRIF); + } + + /* Check for a pending TransFeR Completed (XFRC) interrupt */ + + else if ((pending & N32_USBHS_HCHINTSTS_TXCFIF) != 0) + { + /* Decrement the number of bytes remaining by the number of + * bytes that were "in-flight". + */ + + priv->chan[chidx].buffer += priv->chan[chidx].inflight; + priv->chan[chidx].xfrd += priv->chan[chidx].inflight; + priv->chan[chidx].inflight = 0; + + /* Halt the channel -- the CHH interrupt is expected next */ + + n32_chan_halt(priv, chidx, CHREASON_XFRC); + + /* Clear the pending the TransFeR Completed (XFRC) interrupt */ + + n32_putreg(N32_USBHS_HCHINTSTS(chidx), N32_USBHS_HCHINTSTS_TXCFIF); + } + + /* Check for a pending STALL response receive (STALL) interrupt */ + + else if ((pending & N32_USBHS_HCHINTSTS_STALLIF) != 0) + { + /* Clear the pending STALL response receive (STALL) interrupt */ + + n32_putreg(N32_USBHS_HCHINTSTS(chidx), N32_USBHS_HCHINTSTS_STALLIF); + + /* Halt the channel when a STALL, TXERR, BBERR or DTERR interrupt is + * received on the channel. + */ + + n32_chan_halt(priv, chidx, CHREASON_STALL); + } + + /* Check for a pending NAK response received (NAK) interrupt */ + + else if ((pending & N32_USBHS_HCHINTSTS_NAKIF) != 0) + { + /* Halt the channel -- the CHH interrupt is expected next */ + + n32_chan_halt(priv, chidx, CHREASON_NAK); + + /* Clear the pending the NAK response received (NAK) interrupt */ + + n32_putreg(N32_USBHS_HCHINTSTS(chidx), N32_USBHS_HCHINTSTS_NAKIF); + } + + /* Check for a pending Transaction ERror (TXERR) interrupt */ + + else if ((pending & N32_USBHS_HCHINTSTS_TXERRIF) != 0) + { + /* Halt the channel when a STALL, TXERR, BBERR or DTERR interrupt is + * received on the channel. + */ + + n32_chan_halt(priv, chidx, CHREASON_TXERR); + + /* Clear the pending the Transaction ERror (TXERR) interrupt */ + + n32_putreg(N32_USBHS_HCHINTSTS(chidx), N32_USBHS_HCHINTSTS_TXERRIF); + } + + /* Check for a NYET interrupt */ + +#if 0 /* NYET is a reserved bit in the HCINT register */ + else if ((pending & N32_USBHS_HCHINTSTS_NYETIF) != 0) + { + /* Halt the channel */ + + n32_chan_halt(priv, chidx, CHREASON_NYET); + + /* Clear the pending the NYET interrupt */ + + n32_putreg(N32_USBHS_HCHINTSTS(chidx), N32_USBHS_HCHINTSTS_NYETIF); + } +#endif + + /* Check for a pending Data Toggle ERRor (DTERR) interrupt */ + + else if (pending & N32_USBHS_HCHINTSTS_DTERRIF) + { + /* Halt the channel when a STALL, TXERR, BBERR or DTERR interrupt is + * received on the channel. + */ + + n32_chan_halt(priv, chidx, CHREASON_DTERR); + + /* Clear the pending the Data Toggle ERRor (DTERR) and NAK interrupts */ + + n32_putreg(N32_USBHS_HCHINTSTS(chidx), + N32_USBHS_HCHINTSTS_DTERRIF | N32_USBHS_HCHINTSTS_NAKIF); + } + + /* Check for a pending CHannel Halted (CHH) interrupt */ + + else if ((pending & N32_USBHS_HCHINTSTS_CHHTDIF) != 0) + { + /* Mask the CHannel Halted (CHH) interrupt */ + + regval = n32_getreg(N32_USBHS_HCHINTEN(chidx)); + regval &= ~N32_USBHS_HCHINTEN_CHHTDIEN; + n32_putreg(N32_USBHS_HCHINTEN(chidx), regval); + + if (chan->chreason == CHREASON_XFRC) + { + /* Set the request done result */ + + chan->result = OK; + + /* Read the HCCHAR register to get the HCCHAR register to get + * the endpoint type. + */ + + regval = n32_getreg(N32_USBHS_HCHCTRL(chidx)); + + /* Is it a bulk endpoint? Were an odd number of packets + * transferred? + */ + + if ((regval & N32_USBHS_HCHCTRL_EPTYPE_MASK) == + N32_USBHS_HCHCTRL_EPTYPE_BULK && (chan->npackets & 1) != 0) + { + /* Yes to both... toggle the data out PID */ + + chan->outdata1 ^= true; + } + } + else if (chan->chreason == CHREASON_NAK || + chan->chreason == CHREASON_NYET) + { + /* Set the try again later result */ + + chan->result = EAGAIN; + } + else if (chan->chreason == CHREASON_STALL) + { + /* Set the request stall result */ + + chan->result = EPERM; + } + else if ((chan->chreason == CHREASON_TXERR) || + (chan->chreason == CHREASON_DTERR)) + { + /* Set the I/O failure result */ + + chan->result = EIO; + } + else /* if (chan->chreason == CHREASON_FRMOR) */ + { + /* Set the frame error result */ + + chan->result = EPIPE; + } + + /* Clear the pending the CHannel Halted (CHH) interrupt */ + + n32_putreg(N32_USBHS_HCHINTSTS(chidx), N32_USBHS_HCHINTSTS_CHHTDIF); + } + + /* Check for a transfer complete event */ + + n32_chan_wakeup(priv, chan); +} + +/**************************************************************************** + * Name: n32_gint_connected + * + * Description: + * Handle a connection event. + * + ****************************************************************************/ + +static void n32_gint_connected(struct n32_usbhost_s *priv) +{ + /* We we previously disconnected? */ + + if (!priv->connected) + { + /* Yes.. then now we are connected */ + + usbhost_vtrace1(N32_USBHS_VTRACE1_CONNECTED, 0); + priv->connected = true; + priv->change = true; + DEBUGASSERT(priv->smstate == SMSTATE_DETACHED); + + /* Notify any waiters */ + + priv->smstate = SMSTATE_ATTACHED; + if (priv->pscwait) + { + nxsem_post(&priv->pscsem); + priv->pscwait = false; + } + } +} + +/**************************************************************************** + * Name: n32_gint_disconnected + * + * Description: + * Handle a disconnection event. + * + ****************************************************************************/ + +static void n32_gint_disconnected(struct n32_usbhost_s *priv) +{ + /* Were we previously connected? */ + + if (priv->connected) + { + /* Yes.. then we no longer connected */ + + usbhost_vtrace1(N32_USBHS_VTRACE1_DISCONNECTED, 0); + + /* Are we bound to a class driver? */ + + if (priv->rhport.hport.devclass) + { + /* Yes.. Disconnect the class driver */ + + CLASS_DISCONNECTED(priv->rhport.hport.devclass); + priv->rhport.hport.devclass = NULL; + } + + /* Re-Initialize Host for new Enumeration */ + + priv->smstate = SMSTATE_DETACHED; + priv->connected = false; + priv->change = true; + n32_chan_freeall(priv); + + priv->rhport.hport.speed = USB_SPEED_FULL; + priv->rhport.hport.funcaddr = 0; + + /* Notify any waiters that there is a change in the connection state */ + + if (priv->pscwait) + { + nxsem_post(&priv->pscsem); + priv->pscwait = false; + } + } +} + +/**************************************************************************** + * Name: n32_gint_sofisr + * + * Description: + * USB OTG FS start-of-frame interrupt handler + * + ****************************************************************************/ + +#ifdef CONFIG_N32H7_USBHS_SOFINTR +static inline void n32_gint_sofisr(struct n32_usbhost_s *priv) +{ + /* Handle SOF interrupt */ + +#warning "Do what?" + + /* Clear pending SOF interrupt */ + + n32_putreg(N32_USBHS_GINTSTS, N32_USBHS_GINTSTS_SOFIF); +} +#endif + +/**************************************************************************** + * Name: n32_gint_rxflvlisr + * + * Description: + * USB OTG FS RxFIFO non-empty interrupt handler + * + ****************************************************************************/ + +static inline void n32_gint_rxflvlisr(struct n32_usbhost_s *priv) +{ + uint32_t *dest; + uint32_t grxsts; + uint32_t intmsk; + uint32_t hcchar; + uint32_t hctsiz; + uint32_t fifo; + int bcnt; + int bcnt32; + int chidx; + int i; + + /* Disable the RxFIFO non-empty interrupt */ + + intmsk = n32_getreg(N32_USBHS_GINTEN); + intmsk &= ~N32_USBHS_GINTEN_RXFNEIEN; + n32_putreg(N32_USBHS_GINTEN, intmsk); + + /* Read and pop the next status from the Rx FIFO */ + + grxsts = n32_getreg(N32_USBHS_GRXSTSP); + uinfo("GRXSTS: %08" PRIx32 "\n", grxsts); + + /* Isolate the channel number/index in the status word */ + + chidx = (grxsts & N32_USBHS_GRXSTS_CHEPNUM_MASK) >> + N32_USBHS_GRXSTS_CHEPNUM_SHIFT; + + /* Get the host channel characteristics register (HCCHAR) */ + + hcchar = n32_getreg(N32_USBHS_HCHCTRL(chidx)); + + /* Then process the interrupt according to the packet status */ + + switch (grxsts & N32_USBHS_GRXSTS_PKTSTS_MASK) + { + case N32_USBHS_GRXSTS_IN_RCVD: /* IN data packet received */ + { + /* Read the data into the host buffer. */ + + bcnt = (grxsts & N32_USBHS_GRXSTS_BCNT_MASK) >> + N32_USBHS_GRXSTS_BCNT_SHIFT; + if (bcnt > 0 && priv->chan[chidx].buffer != NULL) + { + /* Transfer the packet from the Rx FIFO into the user buffer */ + + dest = (uint32_t *)priv->chan[chidx].buffer; + fifo = N32_USBHS_DFIFO_HCH(0); + bcnt32 = (bcnt + 3) >> 2; + + for (i = 0; i < bcnt32; i++) + { + *dest++ = n32_getreg(fifo); + } + + n32_pktdump("Received", priv->chan[chidx].buffer, bcnt); + + /* Toggle the IN data pid (Used by Bulk and INTR only) */ + + priv->chan[chidx].indata1 ^= true; + + /* Manage multiple packet transfers */ + + priv->chan[chidx].buffer += bcnt; + priv->chan[chidx].xfrd += bcnt; + + /* Check if more packets are expected */ + + hctsiz = n32_getreg(N32_USBHS_HCHTXSIZ(chidx)); + if ((hctsiz & N32_USBHS_HCHTXSIZ_PKCNT_MASK) != 0) + { + /* Re-activate the channel when more packets are expected */ + + hcchar |= N32_USBHS_HCHCTRL_CHEN; + hcchar &= ~N32_USBHS_HCHCTRL_CHDIS; + n32_putreg(N32_USBHS_HCHCTRL(chidx), hcchar); + } + } + } + break; + + case N32_USBHS_GRXSTS_IN_CPLT: /* IN transfer completed */ + case N32_USBHS_GRXSTS_DATA_TOGERR: /* Data toggle error */ + case N32_USBHS_GRXSTS_CHAN_TERMIN: /* Channel halted */ + default: + break; + } + + /* Re-enable the RxFIFO non-empty interrupt */ + + intmsk |= N32_USBHS_GINTEN_RXFNEIEN; + n32_putreg(N32_USBHS_GINTEN, intmsk); +} + +/**************************************************************************** + * Name: n32_gint_nptxfeisr + * + * Description: + * USB OTG FS non-periodic TxFIFO empty interrupt handler + * + ****************************************************************************/ + +static inline void n32_gint_nptxfeisr(struct n32_usbhost_s *priv) +{ + struct n32_chan_s *chan; + uint32_t regval; + unsigned int wrsize; + unsigned int avail; + unsigned int chidx; + + /* Recover the index of the channel that is waiting for space in the Tx + * FIFO. + */ + + chidx = priv->chidx; + chan = &priv->chan[chidx]; + + /* Reduce the buffer size by the number of bytes that were previously + * placed in the Tx FIFO. + */ + + chan->buffer += chan->inflight; + chan->xfrd += chan->inflight; + chan->inflight = 0; + + /* If we have now transferred the entire buffer, then this transfer is + * complete (this case really should never happen because we disable + * the NPTXFE interrupt on the final packet). + */ + + if (chan->xfrd >= chan->buflen) + { + /* Disable further Tx FIFO empty interrupts and bail. */ + + n32_modifyreg(N32_USBHS_GINTEN, N32_USBHS_GINTEN_NPTXFEIEN, 0); + return; + } + + /* Read the status from the top of the non-periodic TxFIFO */ + + regval = n32_getreg(N32_USBHS_GNPTXFSTS); + + /* Extract the number of bytes available in the non-periodic Tx FIFO. */ + + avail = ((regval & N32_USBHS_GNPTXFSTS_NPTXFSAV_MASK) >> + N32_USBHS_GNPTXFSTS_NPTXFSAV_SHIFT) << 2; + + /* Get the size to put in the Tx FIFO now */ + + wrsize = chan->buflen - chan->xfrd; + + /* Get minimal size packet that can be sent. Something is seriously + * configured wrong if one packet will not fit into the empty Tx FIFO. + */ + + DEBUGASSERT(wrsize > 0 && avail >= MIN(wrsize, chan->maxpacket)); + if (wrsize > avail) + { + /* Clip the write size to the number of full, max sized packets + * that will fit in the Tx FIFO. + */ + + unsigned int wrpackets = avail / chan->maxpacket; + + wrsize = wrpackets * chan->maxpacket; + } + + /* Otherwise, this will be the last packet to be sent in this transaction. + * We now need to disable further NPTXFE interrupts. + */ + + else + { + n32_modifyreg(N32_USBHS_GINTEN, N32_USBHS_GINTEN_NPTXFEIEN, 0); + } + + /* Write the next group of packets into the Tx FIFO */ + + uinfo("HNPTXSTS: %08" PRIx32 " chidx: %d avail: %d buflen: %d xfrd: %d " + "wrsize: %d\n", + regval, chidx, avail, chan->buflen, chan->xfrd, wrsize); + + n32_gint_wrpacket(priv, chan->buffer, chidx, wrsize); +} + +/**************************************************************************** + * Name: n32_gint_ptxfeisr + * + * Description: + * USB OTG FS periodic TxFIFO empty interrupt handler + * + ****************************************************************************/ + +static inline void n32_gint_ptxfeisr(struct n32_usbhost_s *priv) +{ + struct n32_chan_s *chan; + uint32_t regval; + unsigned int wrsize; + unsigned int avail; + unsigned int chidx; + + /* Recover the index of the channel that is waiting for space in the Tx + * FIFO. + */ + + chidx = priv->chidx; + chan = &priv->chan[chidx]; + + /* Reduce the buffer size by the number of bytes that were previously + * placed in the Tx FIFO. + */ + + chan->buffer += chan->inflight; + chan->xfrd += chan->inflight; + chan->inflight = 0; + + /* If we have now transferred the entire buffer, then this transfer is + * complete (this case really should never happen because we disable + * the PTXFE interrupt on the final packet). + */ + + if (chan->xfrd >= chan->buflen) + { + /* Disable further Tx FIFO empty interrupts and bail. */ + + n32_modifyreg(N32_USBHS_GINTEN, N32_USBHS_GINTEN_PTXFEIEN, 0); + return; + } + + /* Read the status from the top of the periodic TxFIFO */ + + regval = n32_getreg(N32_USBHS_HPTXFQSTS); + + /* Extract the number of bytes available in the periodic Tx FIFO. */ + + avail = ((regval & N32_USBHS_HPTXFQSTS_PTXFSAVL_MASK) >> + N32_USBHS_HPTXFQSTS_PTXFSAVL_SHIFT) << 2; + + /* Get the size to put in the Tx FIFO now */ + + wrsize = chan->buflen - chan->xfrd; + + /* Get minimal size packet that can be sent. Something is seriously + * configured wrong if one packet will not fit into the empty Tx FIFO. + */ + + DEBUGASSERT(wrsize && avail >= MIN(wrsize, chan->maxpacket)); + if (wrsize > avail) + { + /* Clip the write size to the number of full, max sized packets + * that will fit in the Tx FIFO. + */ + + unsigned int wrpackets = avail / chan->maxpacket; + + wrsize = wrpackets * chan->maxpacket; + } + + /* Otherwise, this will be the last packet to be sent in this transaction. + * We now need to disable further PTXFE interrupts. + */ + + else + { + n32_modifyreg(N32_USBHS_GINTEN, N32_USBHS_GINTEN_PTXFEIEN, 0); + } + + /* Write the next group of packets into the Tx FIFO */ + + uinfo("HPTXSTS: %08" PRIx32 + " chidx: %d avail: %d buflen: %d xfrd: %d wrsize: %d\n", + regval, chidx, avail, chan->buflen, chan->xfrd, wrsize); + + n32_gint_wrpacket(priv, chan->buffer, chidx, wrsize); +} + +/**************************************************************************** + * Name: n32_gint_hcisr + * + * Description: + * USB OTG FS host channels interrupt handler + * + ****************************************************************************/ + +static inline void n32_gint_hcisr(struct n32_usbhost_s *priv) +{ + uint32_t haint; + uint32_t hcchar; + int i = 0; + + /* Read the Host all channels interrupt register and test each bit in the + * register. Each bit i, i=0...(N32_NHOST_CHANNELS-1), corresponds to + * a pending interrupt on channel i. + */ + + haint = n32_getreg(N32_USBHS_HACHINT); + for (i = 0; i < N32_NHOST_CHANNELS; i++) + { + /* Is an interrupt pending on this channel? */ + + if ((haint & N32_USBHS_HACHINT_CH(i)) != 0) + { + /* Yes... read the HCCHAR register to get the direction bit */ + + hcchar = n32_getreg(N32_USBHS_HCHCTRL(i)); + + /* Was this an interrupt on an IN or an OUT channel? */ + + if ((hcchar & N32_USBHS_HCHCTRL_EPDIR) != 0) + { + /* Handle the HC IN channel interrupt */ + + n32_gint_hcinisr(priv, i); + } + else + { + /* Handle the HC OUT channel interrupt */ + + n32_gint_hcoutisr(priv, i); + } + } + } +} + +/**************************************************************************** + * Name: n32_gint_hprtisr + * + * Description: + * USB OTG FS host port interrupt handler + * + ****************************************************************************/ + +static inline void n32_gint_hprtisr(struct n32_usbhost_s *priv) +{ + uint32_t hprt; + uint32_t newhprt; + + usbhost_vtrace1(N32_USBHS_VTRACE1_GINT_HPRT, 0); + + /* Read the port status and control register (HPRT) */ + + hprt = n32_getreg(N32_USBHS_HPCS); + + /* Setup to clear the interrupt bits in GINTSTS by setting the + * corresponding bits in the HPRT. The HCINT interrupt bit is cleared + * when the appropriate status bits in the HPRT register are cleared. + */ + + newhprt = hprt & ~(N32_USBHS_HPCS_PEN | N32_USBHS_HPCS_PCDET | + N32_USBHS_HPCS_PENC | N32_USBHS_HPCS_POCC); + + /* Check for Port Overcurrent CHaNGe (POCCHNG) */ + + if ((hprt & N32_USBHS_HPCS_POCC) != 0) + { + /* Set up to clear the POCCHNG status in the new HPRT contents. */ + + usbhost_vtrace1(N32_USBHS_VTRACE1_GINT_HPRT_POCCHNG, 0); + newhprt |= N32_USBHS_HPCS_POCC; + } + + /* Check for Port Connect DETected (PCDET). The core sets this bit when a + * device connection is detected. + */ + + if ((hprt & N32_USBHS_HPCS_PCDET) != 0) + { + /* Set up to clear the PCDET status in the new HPRT contents. Then + * process the new connection event. + */ + + usbhost_vtrace1(N32_USBHS_VTRACE1_GINT_HPRT_PCDET, 0); + newhprt |= N32_USBHS_HPCS_PCDET; + n32_portreset(priv); + n32_gint_connected(priv); + } + + /* Check for Port Enable CHaNGed (PENCHNG) */ + + if ((hprt & N32_USBHS_HPCS_PENC) != 0) + { + /* Set up to clear the PENCHNG status in the new HPRT contents. */ + + usbhost_vtrace1(N32_USBHS_VTRACE1_GINT_HPRT_PENCHNG, 0); + newhprt |= N32_USBHS_HPCS_PENC; + + /* Was the port enabled? */ + + if ((hprt & N32_USBHS_HPCS_PEN) != 0) + { + /* Yes.. handle the new connection event */ + + n32_gint_connected(priv); + + /* Is this a low speed or full speed connection? */ + + if ((hprt & N32_USBHS_HPCS_PSPD_MASK) == N32_USBHS_HPCS_PSPD_LS) + { + /* Set the Host Frame Interval Register for the 6KHz speed */ + + usbhost_vtrace1(N32_USBHS_VTRACE1_GINT_HPRT_LSDEV, 0); + n32_putreg(N32_USBHS_HFRI, 6000); + } + else + { + /* if ((hprt & N32_USBHS_HPCS_PSPD_MASK) == + * N32_USBHS_HPCS_PSPD_FS) + */ + + /* Set the Host Frame Interval Register for the 48MHz speed */ + + usbhost_vtrace1(N32_USBHS_VTRACE1_GINT_HPRT_FSDEV, 0); + n32_putreg(N32_USBHS_HFRI, 48000); + } + } + } + + /* Clear port interrupts by setting bits in the HPRT */ + + n32_putreg(N32_USBHS_HPCS, newhprt); +} + +/**************************************************************************** + * Name: n32_gint_discisr + * + * Description: + * USB OTG FS disconnect detected interrupt handler + * + ****************************************************************************/ + +static inline void n32_gint_discisr(struct n32_usbhost_s *priv) +{ + /* Handle the disconnection event */ + + n32_gint_disconnected(priv); + + /* Clear the dicsonnect interrupt */ + + n32_putreg(N32_USBHS_GINTSTS, N32_USBHS_GINTSTS_DISCIF); +} + +/**************************************************************************** + * Name: n32_gint_ipxfrisr + * + * Description: + * USB OTG FS incomplete periodic interrupt handler + * + ****************************************************************************/ + +static inline void n32_gint_ipxfrisr(struct n32_usbhost_s *priv) +{ + uint32_t regval; + + /* CHENA : Set to enable the channel + * CHDIS : Set to stop transmitting/receiving data on a channel + */ + + regval = n32_getreg(N32_USBHS_HCHCTRL(0)); + regval |= (N32_USBHS_HCHCTRL_CHDIS | N32_USBHS_HCHCTRL_CHEN); + n32_putreg(N32_USBHS_HCHCTRL(0), regval); + + /* Clear the incomplete isochronous OUT interrupt */ + + n32_putreg(N32_USBHS_GINTSTS, N32_USBHS_GINTSTS_PTNCIF_ISOUTNCIF); +} + +/**************************************************************************** + * Name: n32_gint_isr + * + * Description: + * USB OTG global interrupt handler + * + ****************************************************************************/ + +static int n32_gint_isr(int irq, void *context, void *arg) +{ + /* At present, there is only support for a single OTG host. Hence it is + * pre-allocated as g_usbhost. However, in most code, the private data + * structure will be referenced using the 'priv' pointer (rather than the + * global data) in order to simplify any future support for multiple + * devices. + */ + + struct n32_usbhost_s *priv = &g_usbhost; + uint32_t pending; + + /* If OTG were supported, we would need to check if we are in host or + * device mode when the global interrupt occurs. Here we support only + * host mode + */ + + /* Loop while there are pending interrupts to process. This loop may save + * a little interrupt handling overhead. + */ + + for (; ; ) + { + /* Get the unmasked bits in the GINT status */ + + pending = n32_getreg(N32_USBHS_GINTSTS); + pending &= n32_getreg(N32_USBHS_GINTEN); + + /* Return from the interrupt when there are no further pending + * interrupts. + */ + + if (pending == 0) + { + return OK; + } + + /* Otherwise, process each pending, unmasked GINT interrupts */ + + /* Handle the start of frame interrupt */ + +#ifdef CONFIG_N32H7_USBHS_SOFINTR + if ((pending & N32_USBHS_GINTSTS_SOFIF) != 0) + { + usbhost_vtrace1(N32_USBHS_VTRACE1_GINT_SOF, 0); + n32_gint_sofisr(priv); + } +#endif + + /* Handle the RxFIFO non-empty interrupt */ + + if ((pending & N32_USBHS_GINTSTS_RXFNEIF) != 0) + { + usbhost_vtrace1(N32_USBHS_VTRACE1_GINT_RXFLVL, 0); + n32_gint_rxflvlisr(priv); + } + + /* Handle the non-periodic TxFIFO empty interrupt */ + + if ((pending & N32_USBHS_GINTSTS_NPTXFEIF) != 0) + { + usbhost_vtrace1(N32_USBHS_VTRACE1_GINT_NPTXFE, 0); + n32_gint_nptxfeisr(priv); + } + + /* Handle the periodic TxFIFO empty interrupt */ + + if ((pending & N32_USBHS_GINTSTS_PTXFEIF) != 0) + { + usbhost_vtrace1(N32_USBHS_VTRACE1_GINT_PTXFE, 0); + n32_gint_ptxfeisr(priv); + } + + /* Handle the host channels interrupt */ + + if ((pending & N32_USBHS_GINTSTS_HCHIF) != 0) + { + usbhost_vtrace1(N32_USBHS_VTRACE1_GINT_HC, 0); + n32_gint_hcisr(priv); + } + + /* Handle the host port interrupt */ + + if ((pending & N32_USBHS_GINTSTS_HPIF) != 0) + { + n32_gint_hprtisr(priv); + } + + /* Handle the disconnect detected interrupt */ + + if ((pending & N32_USBHS_GINTSTS_DISCIF) != 0) + { + usbhost_vtrace1(N32_USBHS_VTRACE1_GINT_DISC, 0); + n32_gint_discisr(priv); + } + + /* Handle the incomplete periodic transfer */ + + if ((pending & N32_USBHS_GINTSTS_PTNCIF_ISOUTNCIF) != 0) + { + usbhost_vtrace1(N32_USBHS_VTRACE1_GINT_IPXFR, 0); + n32_gint_ipxfrisr(priv); + } + } + + /* We won't get here */ + + return OK; +} + +/**************************************************************************** + * Name: n32_gint_enable and n32_gint_disable + * + * Description: + * Respectively enable or disable the global OTG FS interrupt. + * + * Input Parameters: + * None + * + * Returned Value: + * None + * + ****************************************************************************/ + +static void n32_gint_enable(void) +{ + uint32_t regval; + + /* Set the GINTMSK bit to unmask the interrupt */ + + regval = n32_getreg(N32_USBHS_GAHBCFG); + regval |= N32_USBHS_GAHBCFG_GINTEN; + n32_putreg(N32_USBHS_GAHBCFG, regval); +} + +static void n32_gint_disable(void) +{ + uint32_t regval; + + /* Clear the GINTMSK bit to mask the interrupt */ + + regval = n32_getreg(N32_USBHS_GAHBCFG); + regval &= ~N32_USBHS_GAHBCFG_GINTEN; + n32_putreg(N32_USBHS_GAHBCFG, regval); +} + +/**************************************************************************** + * Name: n32_hostinit_enable + * + * Description: + * Enable host interrupts. + * + * Input Parameters: + * None + * + * Returned Value: + * None + * + ****************************************************************************/ + +static inline void n32_hostinit_enable(void) +{ + uint32_t regval; + + /* Disable all interrupts. */ + + n32_putreg(N32_USBHS_GINTEN, 0); + + /* Clear any pending interrupts. */ + + n32_putreg(N32_USBHS_GINTSTS, 0xffffffff); + + /* Enable the host interrupts */ + + /* Common interrupts: + * + * N32_USBHS_GINTEN_WKUPIEN : Resume/remote wakeup detected interrupt + * N32_USBHS_GINTEN_USBSUSPIEN : USB suspend + */ + + regval = (N32_USBHS_GINTEN_WKUPIEN | N32_USBHS_GINTEN_USBSUSPIEN); + + /* If OTG were supported, we would need to enable the following as well: + * + * N32_USBHS_GINTEN_USBHSIEN : OTG interrupt + * N32_USBHS_GINTEN_VBUSVIF : Session request/new session detected + * interrupt + * N32_USBHS_GINTEN_IDSTSCIEN : Connector ID status change + */ + + /* Host-specific interrupts + * + * N32_USBHS_GINTEN_SOFIEN : Start of frame + * N32_USBHS_GINTEN_RXFNEIEN : RxFIFO non-empty + * N32_USBHS_GINTEN_PTNCIEN_ISOUTNCIEN : Incomplete isochronous OUT + * transfer interrupt + * N32_USBHS_GINTEN_HPIEN : Host port interrupt + * N32_USBHS_GINTEN_HCHIEN : Host channels interrupt + * N32_USBHS_GINTEN_DISCIEN : Disconnect detected interrupt + */ + +#ifdef CONFIG_N32H7_USBHS_SOFINTR + regval |= (N32_USBHS_GINTEN_SOFIEN | + N32_USBHS_GINTEN_RXFNEIEN | + N32_USBHS_GINTEN_PTNCIEN_ISOUTNCIEN | + N32_USBHS_GINTEN_HPIEN | + N32_USBHS_GINTEN_HCHIEN | + N32_USBHS_GINTEN_DISCIEN); +#else + regval |= (N32_USBHS_GINTEN_RXFNEIEN | + N32_USBHS_GINTEN_PTNCIEN_ISOUTNCIEN | + N32_USBHS_GINTEN_HPIEN | + N32_USBHS_GINTEN_HCHIEN | + N32_USBHS_GINTEN_DISCIEN); +#endif + n32_putreg(N32_USBHS_GINTEN, regval); +} + +/**************************************************************************** + * Name: n32_txfe_enable + * + * Description: + * Enable Tx FIFO empty interrupts. This is necessary when the entire + * transfer will not fit into Tx FIFO. The transfer will then be completed + * when the Tx FIFO is empty. NOTE: The Tx FIFO interrupt is disabled + * the fifo empty interrupt handler when the transfer is complete. + * + * Input Parameters: + * priv - Driver state structure reference + * chidx - The channel that requires the Tx FIFO empty interrupt + * + * Returned Value: + * None + * + * Assumptions: + * Called from user task context. Interrupts must be disabled to assure + * exclusive access to the GINTMSK register. + * + ****************************************************************************/ + +static void n32_txfe_enable(struct n32_usbhost_s *priv, int chidx) +{ + struct n32_chan_s *chan = &priv->chan[chidx]; + irqstate_t flags; + uint32_t regval; + + /* Disable all interrupts so that we have exclusive access to the GINTMSK + * (it would be sufficient just to disable the GINT interrupt). + */ + + flags = enter_critical_section(); + + /* Should we enable the periodic or non-peridic Tx FIFO empty interrupts */ + + regval = n32_getreg(N32_USBHS_GINTEN); + switch (chan->eptype) + { + default: + case N32_USBHS_EPTYPE_CTRL: /* Non periodic transfer */ + case N32_USBHS_EPTYPE_BULK: + regval |= N32_USBHS_GINTEN_NPTXFEIEN; + break; + + case N32_USBHS_EPTYPE_INTR: /* Periodic transfer */ + case N32_USBHS_EPTYPE_ISOC: + regval |= N32_USBHS_GINTEN_PTXFEIEN; + break; + } + + /* Enable interrupts */ + + n32_putreg(N32_USBHS_GINTEN, regval); + leave_critical_section(flags); +} + +/**************************************************************************** + * Name: n32_wait + * + * Description: + * Wait for a device to be connected or disconnected to/from a hub port. + * + * Input Parameters: + * conn - The USB host connection instance obtained as a parameter from + * the call to the USB driver initialization logic. + * hport - The location to return the hub port descriptor that detected + * the connection related event. + * + * Returned Value: + * Zero (OK) is returned on success when a device is connected or + * disconnected. This function will not return until either (1) a device is + * connected or disconnect to/from any hub port or until (2) some failure + * occurs. On a failure, a negated errno value is returned indicating the + * nature of the failure + * + * Assumptions: + * - Called from a single thread so no mutual exclusion is required. + * - Never called from an interrupt handler. + * + ****************************************************************************/ + +static int n32_wait(struct usbhost_connection_s *conn, + struct usbhost_hubport_s **hport) +{ + struct n32_usbhost_s *priv = &g_usbhost; + struct usbhost_hubport_s *connport; + irqstate_t flags; + int ret; + + /* Loop until a change in connection state is detected */ + + flags = enter_critical_section(); + for (; ; ) + { + /* Is there a change in the connection state of the single root hub + * port? + */ + + if (priv->change) + { + connport = &priv->rhport.hport; + + /* Yes. Remember the new state */ + + connport->connected = priv->connected; + priv->change = false; + + /* And return the root hub port */ + + *hport = connport; + leave_critical_section(flags); + + uinfo("RHport Connected: %s\n", + connport->connected ? "YES" : "NO"); + return OK; + } + +#ifdef CONFIG_USBHOST_HUB + /* Is a device connected to an external hub? */ + + if (priv->hport) + { + /* Yes.. return the external hub port */ + + connport = (struct usbhost_hubport_s *)priv->hport; + priv->hport = NULL; + + *hport = connport; + leave_critical_section(flags); + + uinfo("Hub port Connected: %s\n", + connport->connected ? "YES" : "NO"); + return OK; + } +#endif + + /* Wait for the next connection event */ + + priv->pscwait = true; + ret = nxsem_wait_uninterruptible(&priv->pscsem); + if (ret < 0) + { + return ret; + } + } +} + +/**************************************************************************** + * Name: n32_enumerate + * + * Description: + * Enumerate the connected device. As part of this enumeration process, + * the driver will (1) get the device's configuration descriptor, (2) + * extract the class ID info from the configuration descriptor, (3) call + * usbhost_findclass() to find the class that supports this device, (4) + * call the create() method on the struct usbhost_registry_s interface + * to get a class instance, and finally (5) call the connect() method + * of the struct usbhost_class_s interface. After that, the class is in + * charge of the sequence of operations. + * + * Input Parameters: + * conn - The USB host connection instance obtained as a parameter from + * the call to the USB driver initialization logic. + * hport - The descriptor of the hub port that has the newly connected + * device. + * + * Returned Value: + * On success, zero (OK) is returned. On a failure, a negated errno value + * is returned indicating the nature of the failure. + * + * Assumptions: + * This function will *not* be called from an interrupt handler. + * + ****************************************************************************/ + +static int n32_rh_enumerate(struct n32_usbhost_s *priv, + struct usbhost_connection_s *conn, + struct usbhost_hubport_s *hport) +{ + uint32_t regval; + int ret; + + DEBUGASSERT(conn != NULL && hport != NULL && hport->port == 0); + + /* Are we connected to a device? The caller should have called the wait() + * method first to be assured that a device is connected. + */ + + while (!priv->connected) + { + /* No, return an error */ + + usbhost_trace1(N32_USBHS_TRACE1_DEVDISCONN, 0); + return -ENODEV; + } + + DEBUGASSERT(priv->smstate == SMSTATE_ATTACHED); + + /* USB 2.0 spec says at least 50ms delay before port reset. We wait + * 100ms. + */ + + nxsched_usleep(100 * 1000); + + /* Reset the host port */ + + n32_portreset(priv); + + /* Get the current device speed */ + + regval = n32_getreg(N32_USBHS_HPCS); + if ((regval & N32_USBHS_HPCS_PSPD_MASK) == N32_USBHS_HPCS_PSPD_LS) + { + priv->rhport.hport.speed = USB_SPEED_LOW; + } + else + { + priv->rhport.hport.speed = USB_SPEED_FULL; + } + + /* Allocate and initialize the root hub port EP0 channels */ + + ret = n32_ctrlchan_alloc(priv, 0, 0, priv->rhport.hport.speed, + &priv->ep0); + if (ret < 0) + { + uerr("ERROR: Failed to allocate a control endpoint: %d\n", ret); + } + + return ret; +} + +static int n32_enumerate(struct usbhost_connection_s *conn, + struct usbhost_hubport_s *hport) +{ + struct n32_usbhost_s *priv = &g_usbhost; + int ret; + + DEBUGASSERT(hport); + + /* If this is a connection on the root hub, then we need to go to + * little more effort to get the device speed. If it is a connection + * on an external hub, then we already have that information. + */ + +#ifdef CONFIG_USBHOST_HUB + if (ROOTHUB(hport)) +#endif + { + ret = n32_rh_enumerate(priv, conn, hport); + if (ret < 0) + { + return ret; + } + } + + /* Then let the common usbhost_enumerate do the real enumeration. */ + + uinfo("Enumerate the device\n"); + priv->smstate = SMSTATE_ENUM; + ret = usbhost_enumerate(hport, &hport->devclass); + + /* The enumeration may fail either because of some HCD interfaces failure + * or because the device class is not supported. In either case, we just + * need to perform the disconnection operation and make ready for a new + * enumeration. + */ + + if (ret < 0) + { + /* Return to the disconnected state */ + + uerr("ERROR: Enumeration failed: %d\n", ret); + n32_gint_disconnected(priv); + } + + return ret; +} + +/**************************************************************************** + * Name: n32_ep0configure + * + * Description: + * Configure endpoint 0. This method is normally used internally by the + * enumerate() method but is made available at the interface to support an + * external implementation of the enumeration logic. + * + * Input Parameters: + * drvr - The USB host driver instance obtained as a parameter from the + * call to the class create() method. + * ep0 - The (opaque) EP0 endpoint instance + * funcaddr - The USB address of the function containing the endpoint that + * EP0 controls + * speed - The speed of the port USB_SPEED_LOW, _FULL, or _HIGH + * maxpacketsize - The maximum number of bytes that can be sent to or + * received from the endpoint in a single data packet + * + * Returned Value: + * On success, zero (OK) is returned. On a failure, a negated errno value + * is returned indicating the nature of the failure. + * + * Assumptions: + * This function will *not* be called from an interrupt handler. + * + ****************************************************************************/ + +static int n32_ep0configure(struct usbhost_driver_s *drvr, + usbhost_ep_t ep0, + uint8_t funcaddr, uint8_t speed, + uint16_t maxpacketsize) +{ + struct n32_usbhost_s *priv = (struct n32_usbhost_s *)drvr; + struct n32_ctrlinfo_s *ep0info = (struct n32_ctrlinfo_s *)ep0; + struct n32_chan_s *chan; + int ret; + + DEBUGASSERT(drvr != NULL && ep0info != NULL && funcaddr < 128 && + maxpacketsize <= 64); + + /* We must have exclusive access to the USB host hardware and structures */ + + ret = nxmutex_lock(&priv->lock); + if (ret < 0) + { + return ret; + } + + /* Configure the EP0 OUT channel */ + + chan = &priv->chan[ep0info->outndx]; + chan->funcaddr = funcaddr; + chan->speed = speed; + chan->maxpacket = maxpacketsize; + + n32_chan_configure(priv, ep0info->outndx); + + /* Configure the EP0 IN channel */ + + chan = &priv->chan[ep0info->inndx]; + chan->funcaddr = funcaddr; + chan->speed = speed; + chan->maxpacket = maxpacketsize; + + n32_chan_configure(priv, ep0info->inndx); + + nxmutex_unlock(&priv->lock); + return OK; +} + +/**************************************************************************** + * Name: n32_epalloc + * + * Description: + * Allocate and configure one endpoint. + * + * Input Parameters: + * drvr - The USB host driver instance obtained as a parameter from the + * call to the class create() method. + * epdesc - Describes the endpoint to be allocated. + * ep - A memory location provided by the caller in which to receive the + * allocated endpoint descriptor. + * + * Returned Value: + * On success, zero (OK) is returned. On a failure, a negated errno value + * is returned indicating the nature of the failure. + * + * Assumptions: + * This function will *not* be called from an interrupt handler. + * + ****************************************************************************/ + +static int n32_epalloc(struct usbhost_driver_s *drvr, + const struct usbhost_epdesc_s *epdesc, + usbhost_ep_t *ep) +{ + struct n32_usbhost_s *priv = (struct n32_usbhost_s *)drvr; + int ret; + + /* Sanity check. NOTE that this method should only be called if a device + * is connected (because we need a valid low speed indication). + */ + + DEBUGASSERT(drvr != 0 && epdesc != NULL && ep != NULL); + + /* We must have exclusive access to the USB host hardware and state + * structures. + */ + + ret = nxmutex_lock(&priv->lock); + if (ret < 0) + { + return ret; + } + + /* Handler control pipes differently from other endpoint types. This is + * because the normal, "transfer" endpoints are unidirectional an require + * only a single channel. Control endpoints, however, are bi-directional + * and require two channels, one for the IN and one for the OUT direction. + */ + + if (epdesc->xfrtype == N32_USBHS_EPTYPE_CTRL) + { + ret = n32_ctrlep_alloc(priv, epdesc, ep); + } + else + { + ret = n32_xfrep_alloc(priv, epdesc, ep); + } + + nxmutex_unlock(&priv->lock); + return ret; +} + +/**************************************************************************** + * Name: n32_epfree + * + * Description: + * Free and endpoint previously allocated by DRVR_EPALLOC. + * + * Input Parameters: + * drvr - The USB host driver instance obtained as a parameter from the + * call to the class create() method. + * ep - The endpoint to be freed. + * + * Returned Value: + * On success, zero (OK) is returned. On a failure, a negated errno value + * is returned indicating the nature of the failure. + * + * Assumptions: + * This function will *not* be called from an interrupt handler. + * + ****************************************************************************/ + +static int n32_epfree(struct usbhost_driver_s *drvr, usbhost_ep_t ep) +{ + struct n32_usbhost_s *priv = (struct n32_usbhost_s *)drvr; + int ret; + + DEBUGASSERT(priv); + + /* We must have exclusive access to the USB host hardware and structures */ + + ret = nxmutex_lock(&priv->lock); + + /* A single channel is represent by an index in the range of 0 to + * N32_MAX_TX_FIFOS. Otherwise, the ep must be a pointer to an allocated + * control endpoint structure. + */ + + if ((uintptr_t)ep < N32_MAX_TX_FIFOS) + { + /* Halt the channel and mark the channel available */ + + n32_chan_free(priv, (int)ep); + } + else + { + /* Halt both control channel and mark the channels available */ + + struct n32_ctrlinfo_s *ctrlep = + (struct n32_ctrlinfo_s *)ep; + + n32_chan_free(priv, ctrlep->inndx); + n32_chan_free(priv, ctrlep->outndx); + + /* And free the control endpoint container */ + + kmm_free(ctrlep); + } + + nxmutex_unlock(&priv->lock); + return ret; +} + +/**************************************************************************** + * Name: n32_alloc + * + * Description: + * Some hardware supports special memory in which request and descriptor + * data can be accessed more efficiently. This method provides a + * mechanism to allocate the request/descriptor memory. If the underlying + * hardware does not support such "special" memory, this functions may + * simply map to kmm_malloc. + * + * This interface was optimized under a particular assumption. It was + * assumed that the driver maintains a pool of small, pre-allocated + * buffers for descriptor traffic. NOTE that size is not an input, but + * an output: The size of the pre-allocated buffer is returned. + * + * Input Parameters: + * drvr - The USB host driver instance obtained as a parameter from the + * call to the class create() method. + * buffer - The address of a memory location provided by the caller in + * which to return the allocated buffer memory address. + * maxlen - The address of a memory location provided by the caller in + * which to return the maximum size of the allocated buffer memory. + * + * Returned Value: + * On success, zero (OK) is returned. On a failure, a negated errno value + * is returned indicating the nature of the failure. + * + * Assumptions: + * - Called from a single thread so no mutual exclusion is required. + * - Never called from an interrupt handler. + * + ****************************************************************************/ + +static int n32_alloc(struct usbhost_driver_s *drvr, + uint8_t **buffer, size_t *maxlen) +{ + uint8_t *alloc; + + DEBUGASSERT(drvr && buffer && maxlen); + + /* There is no special memory requirement for the N32. */ + + alloc = kmm_malloc(CONFIG_N32H7_USBHS_DESCSIZE); + if (!alloc) + { + return -ENOMEM; + } + + /* Return the allocated address and size of the descriptor buffer */ + + *buffer = alloc; + *maxlen = CONFIG_N32H7_USBHS_DESCSIZE; + return OK; +} + +/**************************************************************************** + * Name: n32_free + * + * Description: + * Some hardware supports special memory in which request and descriptor + * data can be accessed more efficiently. This method provides a + * mechanism to free that request/descriptor memory. If the underlying + * hardware does not support such "special" memory, this functions may + * simply map to kmm_free(). + * + * Input Parameters: + * drvr - The USB host driver instance obtained as a parameter from the + * call to the class create() method. + * buffer - The address of the allocated buffer memory to be freed. + * + * Returned Value: + * On success, zero (OK) is returned. On a failure, a negated errno value + * is returned indicating the nature of the failure. + * + * Assumptions: + * - Never called from an interrupt handler. + * + ****************************************************************************/ + +static int n32_free(struct usbhost_driver_s *drvr, uint8_t *buffer) +{ + /* There is no special memory requirement */ + + DEBUGASSERT(drvr && buffer); + kmm_free(buffer); + return OK; +} + +/**************************************************************************** + * Name: n32_ioalloc + * + * Description: + * Some hardware supports special memory in which larger IO buffers can + * be accessed more efficiently. This method provides a mechanism to + * allocate the request/descriptor memory. If the underlying hardware + * does not support such "special" memory, this functions may simply map + * to kmm_malloc. + * + * This interface differs from DRVR_ALLOC in that the buffers are + * variable-sized. + * + * Input Parameters: + * drvr - The USB host driver instance obtained as a parameter from the + * call to the class create() method. + * buffer - The address of a memory location provided by the caller in + * which to return the allocated buffer memory address. + * buflen - The size of the buffer required. + * + * Returned Value: + * On success, zero (OK) is returned. On a failure, a negated errno value + * is returned indicating the nature of the failure. + * + * Assumptions: + * This function will *not* be called from an interrupt handler. + * + ****************************************************************************/ + +static int n32_ioalloc(struct usbhost_driver_s *drvr, + uint8_t **buffer, size_t buflen) +{ + uint8_t *alloc; + + DEBUGASSERT(drvr && buffer && buflen > 0); + + /* There is no special memory requirement */ + + alloc = kmm_malloc(buflen); + if (!alloc) + { + return -ENOMEM; + } + + /* Return the allocated buffer */ + + *buffer = alloc; + return OK; +} + +/**************************************************************************** + * Name: n32_iofree + * + * Description: + * Some hardware supports special memory in which IO data can be accessed + * more efficiently. This method provides a mechanism to free that IO + * buffer memory. If the underlying hardware does not support such + * "special" memory, this functions may simply map to kmm_free(). + * + * Input Parameters: + * drvr - The USB host driver instance obtained as a parameter from the + * call to the class create() method. + * buffer - The address of the allocated buffer memory to be freed. + * + * Returned Value: + * On success, zero (OK) is returned. On a failure, a negated errno value + * is returned indicating the nature of the failure. + * + * Assumptions: + * This function will *not* be called from an interrupt handler. + * + ****************************************************************************/ + +static int n32_iofree(struct usbhost_driver_s *drvr, + uint8_t *buffer) +{ + /* There is no special memory requirement */ + + DEBUGASSERT(drvr && buffer); + kmm_free(buffer); + return OK; +} + +/**************************************************************************** + * Name: n32_ctrlin and n32_ctrlout + * + * Description: + * Process a IN or OUT request on the control endpoint. These methods + * will enqueue the request and wait for it to complete. Only one + * transfer may be queued; Neither these methods nor the transfer() + * method can be called again until the control transfer functions + * returns. + * + * These are blocking methods; these functions will not return until the + * control transfer has completed. + * + * Input Parameters: + * drvr - The USB host driver instance obtained as a parameter from the + * call to the class create() method. + * ep0 - The control endpoint to send/receive the control request. + * req - Describes the request to be sent. This request must lie in + * memory created by DRVR_ALLOC. + * buffer - A buffer used for sending the request and for returning any + * responses. This buffer must be large enough to hold the length value + * in the request description. buffer must have been allocated using + * DRVR_ALLOC. + * + * NOTE: On an IN transaction, req and buffer may refer to the same + * allocated memory. + * + * Returned Value: + * On success, zero (OK) is returned. On a failure, a negated errno value + * is returned indicating the nature of the failure. + * + * Assumptions: + * - Called from a single thread so no mutual exclusion is required. + * - Never called from an interrupt handler. + * + ****************************************************************************/ + +static int n32_ctrlin(struct usbhost_driver_s *drvr, usbhost_ep_t ep0, + const struct usb_ctrlreq_s *req, + uint8_t *buffer) +{ + struct n32_usbhost_s *priv = (struct n32_usbhost_s *)drvr; + struct n32_ctrlinfo_s *ep0info = (struct n32_ctrlinfo_s *)ep0; + uint16_t buflen; + clock_t start; + clock_t elapsed; + int retries; + int ret; + + DEBUGASSERT(priv != NULL && ep0info != NULL && req != NULL); + usbhost_vtrace2(N32_USBHS_VTRACE2_CTRLIN, req->type, req->req); + uinfo("type:%02x req:%02x value:%02x%02x index:%02x%02x len:%02x%02x\n", + req->type, req->req, req->value[1], req->value[0], + req->index[1], req->index[0], req->len[1], req->len[0]); + + /* Extract values from the request */ + + buflen = n32_getle16(req->len); + + /* We must have exclusive access to the USB host hardware and structures */ + + ret = nxmutex_lock(&priv->lock); + if (ret < 0) + { + return ret; + } + + /* Loop, retrying until the retry time expires */ + + for (retries = 0; retries < N32_RETRY_COUNT; retries++) + { + /* Send the SETUP request */ + + ret = n32_ctrl_sendsetup(priv, ep0info, req); + if (ret < 0) + { + usbhost_trace1(N32_USBHS_TRACE1_SENDSETUP, -ret); + continue; + } + + /* Handle the IN data phase (if any) */ + + if (buflen > 0) + { + ret = n32_ctrl_recvdata(priv, ep0info, buffer, buflen); + if (ret < 0) + { + usbhost_trace1(N32_USBHS_TRACE1_RECVDATA, -ret); + continue; + } + } + + /* Get the start time. Loop again until the timeout expires */ + + start = clock_systime_ticks(); + do + { + /* Handle the status OUT phase */ + + priv->chan[ep0info->outndx].outdata1 ^= true; + ret = n32_ctrl_senddata(priv, ep0info, NULL, 0); + if (ret == OK) + { + /* All success transactions exit here */ + + nxmutex_unlock(&priv->lock); + return OK; + } + + usbhost_trace1(N32_USBHS_TRACE1_SENDDATA, ret < 0 ? -ret : ret); + + /* Get the elapsed time (in frames) */ + + elapsed = clock_systime_ticks() - start; + } + while (elapsed < N32_DATANAK_DELAY); + } + + /* All failures exit here after all retries and timeouts are exhausted */ + + nxmutex_unlock(&priv->lock); + return -ETIMEDOUT; +} + +static int n32_ctrlout(struct usbhost_driver_s *drvr, usbhost_ep_t ep0, + const struct usb_ctrlreq_s *req, + const uint8_t *buffer) +{ + struct n32_usbhost_s *priv = (struct n32_usbhost_s *)drvr; + struct n32_ctrlinfo_s *ep0info = (struct n32_ctrlinfo_s *)ep0; + uint16_t buflen; + clock_t start; + clock_t elapsed; + int retries; + int ret; + + DEBUGASSERT(priv != NULL && ep0info != NULL && req != NULL); + usbhost_vtrace2(N32_USBHS_VTRACE2_CTRLOUT, req->type, req->req); + uinfo("type:%02x req:%02x value:%02x%02x index:%02x%02x len:%02x%02x\n", + req->type, req->req, req->value[1], req->value[0], + req->index[1], req->index[0], req->len[1], req->len[0]); + + /* Extract values from the request */ + + buflen = n32_getle16(req->len); + + /* We must have exclusive access to the USB host hardware and structures */ + + ret = nxmutex_lock(&priv->lock); + if (ret < 0) + { + return ret; + } + + /* Loop, retrying until the retry time expires */ + + for (retries = 0; retries < N32_RETRY_COUNT; retries++) + { + /* Send the SETUP request */ + + ret = n32_ctrl_sendsetup(priv, ep0info, req); + if (ret < 0) + { + usbhost_trace1(N32_USBHS_TRACE1_SENDSETUP, -ret); + continue; + } + + /* Get the start time. Loop again until the timeout expires */ + + start = clock_systime_ticks(); + do + { + /* Handle the data OUT phase (if any) */ + + if (buflen > 0) + { + /* Start DATA out transfer (only one DATA packet) */ + + priv->chan[ep0info->outndx].outdata1 = true; + ret = n32_ctrl_senddata(priv, ep0info, (uint8_t *)buffer, + buflen); + if (ret < 0) + { + usbhost_trace1(N32_USBHS_TRACE1_SENDDATA, -ret); + } + } + + /* Handle the status IN phase */ + + if (ret == OK) + { + ret = n32_ctrl_recvdata(priv, ep0info, NULL, 0); + if (ret == OK) + { + /* All success transactins exit here */ + + nxmutex_unlock(&priv->lock); + return OK; + } + + usbhost_trace1(N32_USBHS_TRACE1_RECVDATA, + ret < 0 ? -ret : ret); + } + + /* Get the elapsed time (in frames) */ + + elapsed = clock_systime_ticks() - start; + } + while (elapsed < N32_DATANAK_DELAY); + } + + /* All failures exit here after all retries and timeouts are exhausted */ + + nxmutex_unlock(&priv->lock); + return -ETIMEDOUT; +} + +/**************************************************************************** + * Name: n32_transfer + * + * Description: + * Process a request to handle a transfer descriptor. This method will + * enqueue the transfer request, blocking until the transfer completes. + * Only one transfer may be queued; Neither this method nor the ctrlin + * or ctrlout methods can be called again until this function returns. + * + * This is a blocking method; this functions will not return until the + * transfer has completed. + * + * Input Parameters: + * drvr - The USB host driver instance obtained as a parameter from the + * call to the class create() method. + * ep - The IN or OUT endpoint descriptor for the device endpoint on which + * to perform the transfer. + * buffer - A buffer containing the data to be sent (OUT endpoint) or + * received (IN endpoint). buffer must have been allocated using + * DRVR_ALLOC + * buflen - The length of the data to be sent or received. + * + * Returned Value: + * On success, a non-negative value is returned that indicates the number + * of bytes successfully transferred. On a failure, a negated errno value + * is returned that indicates the nature of the failure: + * + * EAGAIN - If devices NAKs the transfer (or NYET or other error where + * it may be appropriate to restart the entire transaction). + * EPERM - If the endpoint stalls + * EIO - On a TX or data toggle error + * EPIPE - Overrun errors + * + * Assumptions: + * - Called from a single thread so no mutual exclusion is required. + * - Never called from an interrupt handler. + * + ****************************************************************************/ + +static ssize_t n32_transfer(struct usbhost_driver_s *drvr, + usbhost_ep_t ep, uint8_t *buffer, + size_t buflen) +{ + struct n32_usbhost_s *priv = (struct n32_usbhost_s *)drvr; + unsigned int chidx = (unsigned int)ep; + ssize_t nbytes; + int ret; + + uinfo("chidx: %d buflen: %d\n", (unsigned int)ep, buflen); + + DEBUGASSERT(priv && buffer && chidx < N32_MAX_TX_FIFOS && buflen > 0); + + /* We must have exclusive access to the USB host hardware and structures */ + + ret = nxmutex_lock(&priv->lock); + if (ret < 0) + { + return (ssize_t)ret; + } + + /* Handle IN and OUT transfer slightly differently */ + + if (priv->chan[chidx].in) + { + nbytes = n32_in_transfer(priv, chidx, buffer, buflen); + } + else + { + nbytes = n32_out_transfer(priv, chidx, buffer, buflen); + } + + nxmutex_unlock(&priv->lock); + return nbytes; +} + +/**************************************************************************** + * Name: n32_asynch + * + * Description: + * Process a request to handle a transfer descriptor. This method will + * enqueue the transfer request and return immediately. When the transfer + * completes, the callback will be invoked with the provided transfer. + * This method is useful for receiving interrupt transfers which may come + * infrequently. + * + * Only one transfer may be queued; Neither this method nor the ctrlin or + * ctrlout methods can be called again until the transfer completes. + * + * Input Parameters: + * drvr - The USB host driver instance obtained as a parameter from the + * call to the class create() method. + * ep - The IN or OUT endpoint descriptor for the device endpoint on + * which to perform the transfer. + * buffer - A buffer containing the data to be sent (OUT endpoint) or + * received (IN endpoint). buffer must have been allocated using + * DRVR_ALLOC + * buflen - The length of the data to be sent or received. + * callback - This function will be called when the transfer completes. + * arg - The arbitrary parameter that will be passed to the callback + * function when the transfer completes. + * + * Returned Value: + * On success, zero (OK) is returned. On a failure, a negated errno value + * is returned indicating the nature of the failure. + * + * Assumptions: + * - Called from a single thread so no mutual exclusion is required. + * - Never called from an interrupt handler. + * + ****************************************************************************/ + +#ifdef CONFIG_USBHOST_ASYNCH +static int n32_asynch(struct usbhost_driver_s *drvr, usbhost_ep_t ep, + uint8_t *buffer, size_t buflen, + usbhost_asynch_t callback, void *arg) +{ + struct n32_usbhost_s *priv = (struct n32_usbhost_s *)drvr; + unsigned int chidx = (unsigned int)ep; + int ret; + + uinfo("chidx: %d buflen: %d\n", (unsigned int)ep, buflen); + + DEBUGASSERT(priv && buffer && chidx < N32_MAX_TX_FIFOS && buflen > 0); + + /* We must have exclusive access to the USB host hardware and structures */ + + ret = nxmutex_lock(&priv->lock); + if (ret < 0) + { + return ret; + } + + /* Handle IN and OUT transfer slightly differently */ + + if (priv->chan[chidx].in) + { + ret = n32_in_asynch(priv, chidx, buffer, buflen, callback, arg); + } + else + { + ret = n32_out_asynch(priv, chidx, buffer, buflen, callback, arg); + } + + nxmutex_unlock(&priv->lock); + return ret; +} +#endif /* CONFIG_USBHOST_ASYNCH */ + +/**************************************************************************** + * Name: n32_cancel + * + * Description: + * Cancel a pending transfer on an endpoint. Cancelled synchronous or + * asynchronous transfer will complete normally with the error -ESHUTDOWN. + * + * Input Parameters: + * drvr - The USB host driver instance obtained as a parameter from the + * call to the class create() method. + * ep - The IN or OUT endpoint descriptor for the device endpoint on + * which an asynchronous transfer should be transferred. + * + * Returned Value: + * On success, zero (OK) is returned. On a failure, a negated errno value + * is returned indicating the nature of the failure. + * + ****************************************************************************/ + +static int n32_cancel(struct usbhost_driver_s *drvr, usbhost_ep_t ep) +{ + struct n32_usbhost_s *priv = (struct n32_usbhost_s *)drvr; + struct n32_chan_s *chan; + unsigned int chidx = (unsigned int)ep; + irqstate_t flags; + + uinfo("chidx: %u\n", chidx); + + DEBUGASSERT(priv && chidx < N32_MAX_TX_FIFOS); + chan = &priv->chan[chidx]; + + /* We need to disable interrupts to avoid race conditions with the + * asynchronous completion of the transfer being canceled. + */ + + flags = enter_critical_section(); + + /* Halt the channel */ + + n32_chan_halt(priv, chidx, CHREASON_CANCELLED); + chan->result = -ESHUTDOWN; + + /* Is there a thread waiting for this transfer to complete? */ + + if (chan->waiter) + { +#ifdef CONFIG_USBHOST_ASYNCH + /* Yes.. there should not also be a callback scheduled */ + + DEBUGASSERT(chan->callback == NULL); +#endif + + /* Wake'em up! */ + + nxsem_post(&chan->waitsem); + chan->waiter = false; + } + +#ifdef CONFIG_USBHOST_ASYNCH + /* No.. is an asynchronous callback expected when the transfer + * completes? + */ + + else if (chan->callback) + { + usbhost_asynch_t callback; + void *arg; + + /* Extract the callback information */ + + callback = chan->callback; + arg = chan->arg; + + chan->callback = NULL; + chan->arg = NULL; + chan->xfrd = 0; + + /* Then perform the callback */ + + callback(arg, -ESHUTDOWN); + } +#endif + + leave_critical_section(flags); + return OK; +} + +/**************************************************************************** + * Name: n32_connect + * + * Description: + * New connections may be detected by an attached hub. This method is the + * mechanism that is used by the hub class to introduce a new connection + * and port description to the system. + * + * Input Parameters: + * drvr - The USB host driver instance obtained as a parameter from the + * call to the class create() method. + * hport - The descriptor of the hub port that detected the connection + * related event + * connected - True: device connected; false: device disconnected + * + * Returned Value: + * On success, zero (OK) is returned. On a failure, a negated errno value + * is returned indicating the nature of the failure. + * + ****************************************************************************/ + +#ifdef CONFIG_USBHOST_HUB +static int n32_connect(struct usbhost_driver_s *drvr, + struct usbhost_hubport_s *hport, + bool connected) +{ + struct n32_usbhost_s *priv = (struct n32_usbhost_s *)drvr; + irqstate_t flags; + + DEBUGASSERT(priv != NULL && hport != NULL); + + /* Set the connected/disconnected flag */ + + hport->connected = connected; + uinfo("Hub port %d connected: %s\n", + hport->port, connected ? "YES" : "NO"); + + /* Report the connection event */ + + flags = enter_critical_section(); + priv->hport = hport; + if (priv->pscwait) + { + priv->pscwait = false; + nxsem_post(&priv->pscsem); + } + + leave_critical_section(flags); + return OK; +} +#endif + +/**************************************************************************** + * Name: n32_disconnect + * + * Description: + * Called by the class when an error occurs and driver has been + * disconnected. The USB host driver should discard the handle to the + * class instance (it is stale) and not attempt any further interaction + * with the class driver instance (until a new instance is received from + * the create() method). The driver should not called the class' + * disconnected() method. + * + * Input Parameters: + * drvr - The USB host driver instance obtained as a parameter from the + * call to the class create() method. + * hport - The port from which the device is being disconnected. Might be + * a port on a hub. + * + * Returned Value: + * None + * + * Assumptions: + * - Only a single class bound to a single device is supported. + * - Never called from an interrupt handler. + * + ****************************************************************************/ + +static void n32_disconnect(struct usbhost_driver_s *drvr, + struct usbhost_hubport_s *hport) +{ + DEBUGASSERT(hport != NULL); + hport->devclass = NULL; +} + +/**************************************************************************** + * Name: n32_portreset + * + * Description: + * Reset the USB host port. + * + * NOTE: "Before starting to drive a USB reset, the application waits for + * the OTG interrupt triggered by the debounce done bit (DBCDNE bit in + * N32_USBHS_GPD), which indicates that the bus is stable again after + * the electrical debounce caused by the attachment of a pull-up resistor + * on DP (FS) or DM (LS). + * + * Input Parameters: + * priv -- USB host driver private data structure. + * + * Returned Value: + * None + * + ****************************************************************************/ + +static void n32_portreset(struct n32_usbhost_s *priv) +{ + uint32_t regval; + + regval = n32_getreg(N32_USBHS_HPCS); + regval &= ~(N32_USBHS_HPCS_PEN | + N32_USBHS_HPCS_PCDET | + N32_USBHS_HPCS_PENC | + N32_USBHS_HPCS_POCC); + regval |= N32_USBHS_HPCS_PRST; + n32_putreg(N32_USBHS_HPCS, regval); + + up_mdelay(100); + + regval &= ~N32_USBHS_HPCS_PRST; + n32_putreg(N32_USBHS_HPCS, regval); + + up_mdelay(20); +} + +/**************************************************************************** + * Name: n32_flush_txfifos + * + * Description: + * Flush the selected Tx FIFO. + * + * Input Parameters: + * txfnum -- USB host driver private data structure. + * + * Returned Value: + * None. + * + ****************************************************************************/ + +static void n32_flush_txfifos(uint32_t txfnum) +{ + uint32_t regval; + uint32_t timeout; + + /* Initiate the TX FIFO flush operation */ + + regval = N32_USBHS_GRSTCTRL_TXFFLSH | txfnum; + n32_putreg(N32_USBHS_GRSTCTRL, regval); + + /* Wait for the FLUSH to complete */ + + for (timeout = 0; timeout < N32_FLUSH_DELAY; timeout++) + { + regval = n32_getreg(N32_USBHS_GRSTCTRL); + if ((regval & N32_USBHS_GRSTCTRL_TXFFLSH) == 0) + { + break; + } + } + + /* Wait for 3 PHY Clocks */ + + up_udelay(3); +} + +/**************************************************************************** + * Name: n32_flush_rxfifo + * + * Description: + * Flush the Rx FIFO. + * + * Input Parameters: + * priv -- USB host driver private data structure. + * + * Returned Value: + * None. + * + ****************************************************************************/ + +static void n32_flush_rxfifo(void) +{ + uint32_t regval; + uint32_t timeout; + + /* Initiate the RX FIFO flush operation */ + + n32_putreg(N32_USBHS_GRSTCTRL, N32_USBHS_GRSTCTRL_RXFFLSH); + + /* Wait for the FLUSH to complete */ + + for (timeout = 0; timeout < N32_FLUSH_DELAY; timeout++) + { + regval = n32_getreg(N32_USBHS_GRSTCTRL); + if ((regval & N32_USBHS_GRSTCTRL_RXFFLSH) == 0) + { + break; + } + } + + /* Wait for 3 PHY Clocks */ + + up_udelay(3); +} + +/**************************************************************************** + * Name: n32_vbusdrive + * + * Description: + * Drive the Vbus +5V. + * + * Input Parameters: + * priv - USB host driver private data structure. + * state - True: Drive, False: Don't drive + * + * Returned Value: + * None. + * + ****************************************************************************/ + +static void n32_vbusdrive(struct n32_usbhost_s *priv, bool state) +{ + uint32_t regval; + + /* Enable/disable the external charge pump */ + + n32_usbhs_vbusdrive(0, state); + + /* Turn on the Host port power. */ + + regval = n32_getreg(N32_USBHS_HPCS); + regval &= ~(N32_USBHS_HPCS_PEN | + N32_USBHS_HPCS_PCDET | + N32_USBHS_HPCS_PENC | + N32_USBHS_HPCS_POCC); + + if (((regval & N32_USBHS_HPCS_PPWR) == 0) && state) + { + regval |= N32_USBHS_HPCS_PPWR; + n32_putreg(N32_USBHS_HPCS, regval); + } + + if (((regval & N32_USBHS_HPCS_PPWR) != 0) && !state) + { + regval &= ~N32_USBHS_HPCS_PPWR; + n32_putreg(N32_USBHS_HPCS, regval); + } + + up_mdelay(200); +} + +/**************************************************************************** + * Name: n32_host_initialize + * + * Description: + * Initialize/re-initialize hardware for host mode operation. At present, + * this function is called only from n32_hw_initialize(). But if OTG + * mode were supported, this function would also be called to switch + * between host and device modes on a connector ID change interrupt. + * + * Input Parameters: + * priv -- USB host driver private data structure. + * + * Returned Value: + * None. + * + ****************************************************************************/ + +static void n32_host_initialize(struct n32_usbhost_s *priv) +{ + uint32_t regval; + uint32_t offset; + int i; + + /* Restart the PHY Clock */ + + n32_putreg(N32_USBHS_PWRCTRL, 0); + + /* Reset the host port */ + + n32_portreset(priv); + + regval = n32_getreg(N32_USBHS_HPCS); + regval &= ~N32_USBHS_HCFG_SPSEL; + n32_putreg(N32_USBHS_HPCS, regval); + + /* Carve up FIFO memory for the Rx FIFO and the periodic and non-periodic + * Tx FIFOs + */ + + /* Configure Rx FIFO size (GRXFSIZ) */ + + n32_putreg(N32_USBHS_GRXFSIZ, CONFIG_N32H7_USBHS_RXFIFO_SIZE); + offset = CONFIG_N32H7_USBHS_RXFIFO_SIZE; + + /* Setup the host non-periodic Tx FIFO size (HNPTXFSIZ) */ + + regval = (offset | + (CONFIG_N32H7_USBHS_NPTXFIFO_SIZE << + N32_USBHS_GNPTXFSIZ_NPTXFDEP_SHIFT)); + n32_putreg(N32_USBHS_GNPTXFSIZ, regval); + offset += CONFIG_N32H7_USBHS_NPTXFIFO_SIZE; + + /* Set up the host periodic Tx fifo size register (HPTXFSIZ) */ + + regval = (offset | + (CONFIG_N32H7_USBHS_PTXFIFO_SIZE << + N32_USBHS_HPTXFSIZ_HPTXFDEP_SHIFT)); + n32_putreg(N32_USBHS_HPTXFSIZ, regval); + + /* If OTG were supported, we should need to clear HNP enable bit in the + * USB_OTG control register about here. + */ + + /* Flush all FIFOs */ + + n32_flush_txfifos(N32_USBHS_GRSTCTRL_TXFNUM_HALL); + n32_flush_rxfifo(); + + /* Clear all pending HC Interrupts */ + + for (i = 0; i < N32_NHOST_CHANNELS; i++) + { + n32_putreg(N32_USBHS_HCHINTSTS(i), 0xffffffff); + n32_putreg(N32_USBHS_HCHINTEN(i), 0); + } + + /* Driver Vbus +5V (the smoke test). Should be done elsewhere in OTG + * mode. + */ + + n32_vbusdrive(priv, true); + + /* Enable host interrupts */ + + n32_hostinit_enable(); +} + +/**************************************************************************** + * Name: n32_sw_initialize + * + * Description: + * One-time setup of the host driver state structure. + * + * Input Parameters: + * priv -- USB host driver private data structure. + * + * Returned Value: + * None. + * + ****************************************************************************/ + +static inline void n32_sw_initialize(struct n32_usbhost_s *priv) +{ + struct usbhost_driver_s *drvr; + struct usbhost_hubport_s *hport; + int i; + + /* Initialize the device operations */ + + drvr = &priv->drvr; + drvr->ep0configure = n32_ep0configure; + drvr->epalloc = n32_epalloc; + drvr->epfree = n32_epfree; + drvr->alloc = n32_alloc; + drvr->free = n32_free; + drvr->ioalloc = n32_ioalloc; + drvr->iofree = n32_iofree; + drvr->ctrlin = n32_ctrlin; + drvr->ctrlout = n32_ctrlout; + drvr->transfer = n32_transfer; +#ifdef CONFIG_USBHOST_ASYNCH + drvr->asynch = n32_asynch; +#endif + drvr->cancel = n32_cancel; +#ifdef CONFIG_USBHOST_HUB + drvr->connect = n32_connect; +#endif + drvr->disconnect = n32_disconnect; + + /* Initialize the public port representation */ + + hport = &priv->rhport.hport; + hport->drvr = drvr; +#ifdef CONFIG_USBHOST_HUB + hport->parent = NULL; +#endif + hport->ep0 = (usbhost_ep_t)&priv->ep0; + hport->speed = USB_SPEED_FULL; + + /* Initialize function address generation logic */ + + usbhost_devaddr_initialize(&priv->devgen); + priv->rhport.pdevgen = &priv->devgen; + + /* Initialize the driver state data */ + + priv->smstate = SMSTATE_DETACHED; + priv->connected = false; + priv->change = false; + + /* Put all of the channels back in their initial, allocated state */ + + memset(priv->chan, 0, N32_MAX_TX_FIFOS * sizeof(struct n32_chan_s)); + + /* Initialize each channel */ + + for (i = 0; i < N32_MAX_TX_FIFOS; i++) + { + struct n32_chan_s *chan = &priv->chan[i]; + + chan->chidx = i; + nxsem_init(&chan->waitsem, 0, 0); + } +} + +/**************************************************************************** + * Name: n32_hw_initialize + * + * Description: + * One-time setup of the host controller hardware for normal operations. + * + * Input Parameters: + * priv -- USB host driver private data structure. + * + * Returned Value: + * Zero on success; a negated errno value on failure. + * + ****************************************************************************/ + +static inline int n32_hw_initialize(struct n32_usbhost_s *priv) +{ + uint32_t regval; + unsigned long timeout; + + /* Setup PHY PLL */ + + regval = getreg32(N32_USBHS_WRPCFG); + regval &= ~N32_USBHS_WRPCFG_PHYCLKSEL_MASK; + regval |= N32_USBHS_WRPCFG_PHYCLKSEL; + regval |= N32_USBHS_WRPCFG_PLLEN; + regval &= ~N32_USBHS_WRPCFG_IDSIG; + n32_putreg(N32_USBHS_WRPCFG, regval); + + /* Enable Host Pending */ + + regval = n32_getreg(N32_USBHS_WRPCTRL); + regval |= N32_USBHS_WRPCTRL_PINDETEN; + n32_putreg(N32_USBHS_WRPCTRL, regval); + + /* Reset the USBHS core */ + + if (N32_USBHS_BASE == N32_USBCTRL1_BASE) + { + /* Reset the USBHS1 core */ + + regval = n32_getreg(N32_RCC_AHB2RST1); + regval |= RCC_AHB2RST1_USB1PORRST; + n32_putreg(N32_RCC_AHB2RST1, regval); + regval &= ~RCC_AHB2RST1_USB1PORRST; + n32_putreg(N32_RCC_AHB2RST1, regval); + } + else + { + /* Reset the USBHS2 core */ + + regval = n32_getreg(N32_RCC_AHB1RST1); + regval |= RCC_AHB1RST1_USB2PORRST; + n32_putreg(N32_RCC_AHB1RST1, regval); + regval &= ~RCC_AHB1RST1_USB2PORRST; + n32_putreg(N32_RCC_AHB1RST1, regval); + } + + up_mdelay(1); + + regval = n32_getreg(N32_USBHS_GCFG); +#ifdef CONFIG_N32H7_USBHS_FS + /* N32H7 MOD: Set the PHYSEL bit in the GCFG register only when the FS + * serial transceiver is used. The N32H76x has no on-chip HS PHY; with + * the default external ULPI PHY PHYSEL must stay cleared. + */ + + regval |= N32_USBHS_GCFG_PHYSEL; +#endif + regval |= N32_USBHS_GCFG_PHYIF; + n32_putreg(N32_USBHS_GCFG, regval); + + /* Reset after a PHY select and set Host mode. First, wait for AHB master + * IDLE state. + */ + + for (timeout = 0; timeout < N32_READY_DELAY; timeout++) + { + up_udelay(3); + regval = n32_getreg(N32_USBHS_GRSTCTRL); + if ((regval & N32_USBHS_GRSTCTRL_AHBIDLE) != 0) + { + break; + } + } + + /* Then perform the core soft reset. */ + + regval = n32_getreg(N32_USBHS_GRSTCTRL); + regval |= N32_USBHS_GRSTCTRL_CSRST; + n32_putreg(N32_USBHS_GRSTCTRL, regval); + + for (timeout = 0; timeout < N32_READY_DELAY; timeout++) + { + regval = n32_getreg(N32_USBHS_GRSTCTRL); + if ((regval & N32_USBHS_GRSTCTRL_SRSTDNE) != 0) + { + break; + } + } + + regval = n32_getreg(N32_USBHS_GRSTCTRL); + regval &= ~N32_USBHS_GRSTCTRL_CSRST; + n32_putreg(N32_USBHS_GRSTCTRL, regval); + + /* Wait for 3 PHY Clocks */ + + up_udelay(3); + + up_mdelay(20); + + /* Initialize OTG features: In order to support OTP, the HNPCAP and SRPCAP + * bits would need to be set in the GUSBCFG register about here. + */ + + /* Force Host Mode */ + + regval = n32_getreg(N32_USBHS_GCFG); + regval &= ~N32_USBHS_GCFG_FDMODE; + regval |= N32_USBHS_GCFG_FHMODE; + n32_putreg(N32_USBHS_GCFG, regval); + up_mdelay(50); + + /* Initialize host mode and return success */ + + n32_host_initialize(priv); + return OK; +} + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: n32_usbhshost_initialize + * + * Description: + * Initialize USB host device controller hardware. + * + * Input Parameters: + * controller -- If the device supports more than USB host controller, then + * this identifies which controller is being initialized. Normally, this + * is just zero. + * + * Returned Value: + * And instance of the USB host interface. The controlling task should + * use this interface to (1) call the wait() method to wait for a device + * to be connected, and (2) call the enumerate() method to bind the device + * to a class driver. + * + * Assumptions: + * - This function should called in the initialization sequence in order + * to initialize the USB device functionality. + * - Class drivers should be initialized prior to calling this function. + * Otherwise, there is a race condition if the device is already connected. + * + ****************************************************************************/ + +struct usbhost_connection_s *n32_usbhshost_initialize(int controller) +{ + /* At present, there is only support for a single OTG FS host. Hence it is + * pre-allocated as g_usbhost. However, in most code, the private data + * structure will be referenced using the 'priv' pointer (rather than the + * global data) in order to simplify any future support for multiple + * devices. + */ + + struct n32_usbhost_s *priv = &g_usbhost; + + /* Sanity checks */ + + DEBUGASSERT(controller == 0); + + /* Make sure that interrupts from the OTG FS core are disabled */ + + n32_gint_disable(); + + /* Reset the state of the host driver */ + + n32_sw_initialize(priv); + + /* N32H7 MOD: The N32H76x has no PWR_CR3 USB33DEN / USBREGEN bits. + * USB power-domain enable and the USBHS peripheral clock are handled + * by n32_usbhs_enableclock() (PWR IPMEM control + RCC AHB enable); + * the external ULPI PHY needs no internal HS PHY PLL setup. + */ + + n32_usbhs_enableclock(); + n32_usbhs_phy_initialize(); + + /* Alternate function pin configuration. Here we assume that: + * + * 1. GPIO and USBHS peripheral clocking have already been enabled as + * part of the boot sequence (see n32_usbhs_enableclock() above). + * 2. Board-specific logic has already enabled other board specific GPIOs + * for things like soft pull-up, VBUS sensing, power controls, and over- + * current detection. + */ + + /* N32H7 MOD: Configure the USBHS pins. The GPIO_USBHS_* pin macros + * are provided by board.h. With the default external ULPI PHY, the + * ULPI interface pins are configured; with CONFIG_N32H7_USBHS_FS only + * the FS serial transceiver DM/DP pins are needed. + */ + + n32_configgpio(GPIO_USBHS_DM); + n32_configgpio(GPIO_USBHS_DP); + + /* Initialize the USBHS core */ + + n32_hw_initialize(priv); + + /* Attach USB host controller interrupt handler */ + + if (irq_attach(N32_IRQ_USBHS, n32_gint_isr, NULL) != 0) + { + usbhost_trace1(N32_USBHS_TRACE1_IRQATTACH, 0); + return NULL; + } + + /* Enable USBHS global interrupts */ + + n32_gint_enable(); + + /* Enable interrupts at the interrupt controller */ + + up_enable_irq(N32_IRQ_USBHS); + return &g_usbconn; +} + +/**************************************************************************** + * Debug Trace String Tables + ****************************************************************************/ + +#ifdef HAVE_USBHOST_TRACE + +#define TR_FMT1 false +#define TR_FMT2 true + +#define TRENTRY(id,fmt1,string) {string} + +/**************************************************************************** + * Private Types + ****************************************************************************/ + +struct n32_usbhost_trace_s +{ + const char *string; +}; + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +static const struct n32_usbhost_trace_s g_trace1[TRACE1_NSTRINGS] = +{ +#ifdef HAVE_USBHOST_TRACE + + TRENTRY(N32_USBHS_TRACE1_DEVDISCONN, TR_FMT1, + "USBHS ERROR: Host Port %d. Device disconnected\n"), + TRENTRY(N32_USBHS_TRACE1_IRQATTACH, TR_FMT1, + "USBHS ERROR: Failed to attach IRQ\n"), + TRENTRY(N32_USBHS_TRACE1_TRNSFRFAILED, TR_FMT1, + "USBHS ERROR: Transfer Failed. ret=%d\n"), + TRENTRY(N32_USBHS_TRACE1_SENDSETUP, TR_FMT1, + "USBHS ERROR: ctrl_sendsetup() failed with: %d\n"), + TRENTRY(N32_USBHS_TRACE1_SENDDATA, TR_FMT1, + "USBHS ERROR: ctrl_senddata() failed with: %d\n"), + TRENTRY(N32_USBHS_TRACE1_RECVDATA, TR_FMT1, + "USBHS ERROR: ctrl_recvdata() failed with: %d\n"), + +# ifdef HAVE_USBHOST_TRACE_VERBOSE + + TRENTRY(N32_USBHS_VTRACE1_CONNECTED, TR_FMT1, + "USBHS Host Port %d connected.\n"), + TRENTRY(N32_USBHS_VTRACE1_DISCONNECTED, TR_FMT1, + "USBHS Host Port %d disconnected.\n"), + TRENTRY(N32_USBHS_VTRACE1_GINT, TR_FMT1, + "USBHS Handling Interrupt. Entry Point.\n"), + TRENTRY(N32_USBHS_VTRACE1_GINT_SOF, TR_FMT1, + "USBHS Handle the start of frame interrupt.\n"), + TRENTRY(N32_USBHS_VTRACE1_GINT_RXFLVL, TR_FMT1, + "USBHS Handle the RxFIFO non-empty interrupt.\n"), + TRENTRY(N32_USBHS_VTRACE1_GINT_NPTXFE, TR_FMT1, + "USBHS Handle the non-periodic TxFIFO empty interrupt.\n"), + TRENTRY(N32_USBHS_VTRACE1_GINT_PTXFE, TR_FMT1, + "USBHS Handle the periodic TxFIFO empty interrupt.\n"), + TRENTRY(N32_USBHS_VTRACE1_GINT_HC, TR_FMT1, + "USBHS Handle the host channels interrupt.\n"), + TRENTRY(N32_USBHS_VTRACE1_GINT_HPRT, TR_FMT1, + "USBHS Handle the host port interrupt.\n"), + TRENTRY(N32_USBHS_VTRACE1_GINT_HPRT_POCCHNG, TR_FMT1, + "USBHS HPRT: Port Over-Current Change.\n"), + TRENTRY(N32_USBHS_VTRACE1_GINT_HPRT_PCDET, TR_FMT1, + "USBHS HPRT: Port Connect Detect.\n"), + TRENTRY(N32_USBHS_VTRACE1_GINT_HPRT_PENCHNG, TR_FMT1, + "USBHS HPRT: Port Enable Changed.\n"), + TRENTRY(N32_USBHS_VTRACE1_GINT_HPRT_LSDEV, TR_FMT1, + "USBHS HPRT: Low Speed Device Connected.\n"), + TRENTRY(N32_USBHS_VTRACE1_GINT_HPRT_FSDEV, TR_FMT1, + "USBHS HPRT: Full Speed Device Connected.\n"), + TRENTRY(N32_USBHS_VTRACE1_GINT_HPRT_LSFSSW, TR_FMT1, + "USBHS HPRT: Host Switch: LS -> FS.\n"), + TRENTRY(N32_USBHS_VTRACE1_GINT_HPRT_FSLSSW, TR_FMT1, + "USBHS HPRT: Host Switch: FS -> LS.\n"), + TRENTRY(N32_USBHS_VTRACE1_GINT_DISC, TR_FMT1, + "USBHS Handle the disconnect detected interrupt.\n"), + TRENTRY(N32_USBHS_VTRACE1_GINT_IPXFR, TR_FMT1, + "USBHS Handle the incomplete periodic transfer.\n"), + +# endif +#endif +}; + +static const struct n32_usbhost_trace_s g_trace2[TRACE2_NSTRINGS] = +{ +#ifdef HAVE_USBHOST_TRACE + + TRENTRY(N32_USBHS_TRACE2_CLIP, TR_FMT2, + "USBHS CLIP: chidx: %d buflen: %d\n"), + +# ifdef HAVE_USBHOST_TRACE_VERBOSE + + TRENTRY(N32_USBHS_VTRACE2_CHANWAKEUP_IN, TR_FMT2, + "USBHS EP%d(IN) wake up with result: %d\n"), + TRENTRY(N32_USBHS_VTRACE2_CHANWAKEUP_OUT, TR_FMT2, + "USBHS EP%d(OUT) wake up with result: %d\n"), + TRENTRY(N32_USBHS_VTRACE2_CTRLIN, TR_FMT2, + "USBHS CTRL_IN type: %02x req: %02x\n"), + TRENTRY(N32_USBHS_VTRACE2_CTRLOUT, TR_FMT2, + "USBHS CTRL_OUT type: %02x req: %02x\n"), + TRENTRY(N32_USBHS_VTRACE2_INTRIN, TR_FMT2, + "USBHS INTR_IN chidx: %02x len: %02x\n"), + TRENTRY(N32_USBHS_VTRACE2_INTROUT, TR_FMT2, + "USBHS INTR_OUT chidx: %02x len: %02x\n"), + TRENTRY(N32_USBHS_VTRACE2_BULKIN, TR_FMT2, + "USBHS BULK_IN chidx: %02x len: %02x\n"), + TRENTRY(N32_USBHS_VTRACE2_BULKOUT, TR_FMT2, + "USBHS BULK_OUT chidx: %02x len: %02x\n"), + TRENTRY(N32_USBHS_VTRACE2_ISOCIN, TR_FMT2, + "USBHS ISOC_IN chidx: %02x len: %04d\n"), + TRENTRY(N32_USBHS_VTRACE2_ISOCOUT, TR_FMT2, + "USBHS ISOC_OUT chidx: %02x req: %02x\n"), + TRENTRY(N32_USBHS_VTRACE2_STARTTRANSFER, TR_FMT2, + "USBHS Transfer chidx: %d buflen: %d\n"), + TRENTRY(N32_USBHS_VTRACE2_CHANCONF_CTRL_IN, TR_FMT2, + "USBHS Channel configured. chidx: %d: (EP%d,IN ,CTRL)\n"), + TRENTRY(N32_USBHS_VTRACE2_CHANCONF_CTRL_OUT, TR_FMT2, + "USBHS Channel configured. chidx: %d: (EP%d,OUT,CTRL)\n"), + TRENTRY(N32_USBHS_VTRACE2_CHANCONF_INTR_IN, TR_FMT2, + "USBHS Channel configured. chidx: %d: (EP%d,IN ,INTR)\n"), + TRENTRY(N32_USBHS_VTRACE2_CHANCONF_INTR_OUT, TR_FMT2, + "USBHS Channel configured. chidx: %d: (EP%d,OUT,INTR)\n"), + TRENTRY(N32_USBHS_VTRACE2_CHANCONF_BULK_IN, TR_FMT2, + "USBHS Channel configured. chidx: %d: (EP%d,IN ,BULK)\n"), + TRENTRY(N32_USBHS_VTRACE2_CHANCONF_BULK_OUT, TR_FMT2, + "USBHS Channel configured. chidx: %d: (EP%d,OUT,BULK)\n"), + TRENTRY(N32_USBHS_VTRACE2_CHANCONF_ISOC_IN, TR_FMT2, + "USBHS Channel configured. chidx: %d: (EP%d,IN ,ISOC)\n"), + TRENTRY(N32_USBHS_VTRACE2_CHANCONF_ISOC_OUT, TR_FMT2, + "USBHS Channel configured. chidx: %d: (EP%d,OUT,ISOC)\n"), + TRENTRY(N32_USBHS_VTRACE2_CHANHALT, TR_FMT2, + "USBHS Channel halted. chidx: %d, reason: %d\n"), + +# endif +#endif +}; + +/**************************************************************************** + * Private Function Prototypes + ****************************************************************************/ + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: usbhost_trformat1 and usbhost_trformat2 + * + * Description: + * This interface must be provided by platform specific logic that knows + * the HCDs encoding of USB trace data. + * + * Given an 9-bit index, return a format string suitable for use with, say, + * printf. The returned format is expected to handle two unsigned integer + * values. + * + ****************************************************************************/ + +const char *usbhost_trformat1(uint16_t id) +{ + int ndx = TRACE1_INDEX(id); + + if (ndx < TRACE1_NSTRINGS) + { + return g_trace1[ndx].string; + } + + return NULL; +} + +const char *usbhost_trformat2(uint16_t id) +{ + int ndx = TRACE2_INDEX(id); + + if (ndx < TRACE2_NSTRINGS) + { + return g_trace2[ndx].string; + } + + return NULL; +} + +#endif /* HAVE_USBHOST_TRACE */ + +#endif /* CONFIG_USBHOST && (CONFIG_N32H7_USBHS1_HOST || CONFIG_N32H7_USBHS2_HOST) */ diff --git a/arch/arm/src/n32h7/n32h76x_rcc.c b/arch/arm/src/n32h7/n32h76x_rcc.c new file mode 100644 index 0000000000000..0345d5d03c5a3 --- /dev/null +++ b/arch/arm/src/n32h7/n32h76x_rcc.c @@ -0,0 +1,1349 @@ +/**************************************************************************** + * arch/arm/src/n32h7/n32h76x_rcc.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include +#include +#include + +#include +#include + +#include "arm_internal.h" +#include "n32_gpio.h" +#include "n32_rcc.h" +#include "n32_pwr.h" + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* Allow up to 100 milliseconds for the high speed clock to become ready. + * that is a very long delay, but if the clock does not become ready we are + * hosed anyway. Normally this is very fast, but I have seen at least one + * board that required this long, long timeout for the HSE to be ready. + */ + +#define HSERDY_TIMEOUT (100 * CONFIG_BOARD_LOOPSPERMSEC) + +/* Same for HSI */ + +#define HSIRDY_TIMEOUT HSERDY_TIMEOUT + +/* HSE divisor to yield ~1MHz RTC clock */ + +#define HSE_DIVISOR (N32_HSE_FREQUENCY + 500000) / 1000000 + +/* PLL are only enabled if the P,Q or R outputs are enabled. */ + +#undef USE_PLL1 +#ifdef N32_PLL1_VCO_FREQUENCY +# define USE_PLL1 +#endif + +#undef USE_PLL2 +#ifdef N32_PLL2_VCO_FREQUENCY +# define USE_PLL2 +#endif + +#undef USE_PLL3 +#ifdef N32_PLL3_VCO_FREQUENCY +# define USE_PLL3 +#endif + +#if defined(N32_BOARD_USEHSI) && !defined(N32_BOARD_HSIDIV) +#error When HSI is used, you have to define N32_BOARD_HSIDIV in board/include/board.h +#endif + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: rcc_reset + * + * Description: + * Reset the RCC clock configuration to the default reset state + * + ****************************************************************************/ + +static inline void rcc_reset(void) +{ + uint32_t regval; + + /* Config PWR */ + + n32_pwr_setcorepwrsrc(PWR_VCORESRC_LDO); + + /* Set HSIEN bit */ + + regval = getreg32(N32_RCC_SRCCTRL1); + regval |= RCC_SRCCTRL1_HSIEN; + + /* Reset SCLKSW, MSIEN ,HSEBP, HSEEN bits */ + + regval &= ~(RCC_SRCCTRL1_SCLKSW_MASK | RCC_SRCCTRL1_MSIEN | + RCC_SRCCTRL1_HSEBP | RCC_SRCCTRL1_HSEEN); + putreg32(regval, N32_RCC_SRCCTRL1); + + /* Reset M7HYPSEL, AXIHYPSEL */ + + regval = getreg32(N32_RCC_SRCCTRL2); + regval &= ~(RCC_SRCCTRL2_M7HYPSEL_MASK | RCC_SRCCTRL2_AXIHYPSEL_MASK); + putreg32(regval, N32_RCC_SRCCTRL2); + + /* Reset SYSBUSDIV1, SYSBUSDIV2 */ + + putreg32(0x00000000, N32_RCC_SYSBUSDIV1); + putreg32(0x00000000, N32_RCC_SYSBUSDIV2); + + /* Reset PLL1CTRL1, PLL2CTRL1, PLL3CTRL1 */ + + regval = 0x09000000; + regval |= RCC_PLL1CTRL1_PLL1SRC_NONE | RCC_PLL1CTRL1_PLL1RST | + RCC_PLL1CTRL1_PLL1PD | RCC_PLL1CTRL1_PLL1BWAJ(4); + putreg32(regval, N32_RCC_PLL1CTRL1); + putreg32(regval, N32_RCC_PLL2CTRL1); + putreg32(regval, N32_RCC_PLL3CTRL1); + + /* Reset CFG2 register */ + + regval = RCC_CFG2_M4CAHIEN | RCC_CFG2_M4CAHIPCLKEN | + RCC_CFG2_M4CAHDEN | RCC_CFG2_M4CAHDPCLKEN | + RCC_CFG2_M7MMUEN | RCC_CFG2_M4MMUEN | + RCC_CFG2_M7SRAMBKPEN | RCC_CFG2_M4SRAMBKPEN | + RCC_CFG2_M7SRAM1EN | RCC_CFG2_M4SRAM1EN | + RCC_CFG2_M7SRAM2EN | RCC_CFG2_M4SRAM2EN | + RCC_CFG2_M7SRAM3EN | RCC_CFG2_M4SRAM3EN | + RCC_CFG2_M7SRAM4EN | RCC_CFG2_M4SRAM4EN; + putreg32(regval, N32_RCC_CFG2); + + /* Reset CFG3 register */ + + regval = RCC_CFG3_M7STCLKDIV_DIV8 | RCC_CFG3_M4STCLKDIV_DIV8; + putreg32(regval, N32_RCC_CFG3); + + /* Reset CFG4 register */ + + regval = ~(RCC_CFG4_RSVD | RCC_CFG4_DCMURST); + putreg32(regval, N32_RCC_CFG4); + + /* Reset CFG5 register */ + + regval = RCC_CFG5_RTCHSEDIV(2) | RCC_CFG5_M7SRAM5EN | + RCC_CFG5_M4SRAM5EN | RCC_CFG5_DCDCLKEN; + putreg32(regval, N32_RCC_CFG5); + + /* Disable all interrupts and clear pending bits */ + + putreg32(0x00000000, N32_RCC_CLKINT1); + putreg32(0x00000000, N32_RCC_CLKINT2); + putreg32(0x00000000, N32_RCC_CLKINT3); +} + +/**************************************************************************** + * Name: rcc_enableahb1 + * + * Description: + * Enable selected AHB1 peripherals + * + ****************************************************************************/ + +static inline void rcc_enableahb1(void) +{ + uint32_t regval; + + /* Set the appropriate bits in the RCC_AHB1ENx register to enabled the + * selected AHB1 peripherals. + */ + + regval = getreg32(N32_RCC_AHB1EN1); + +#if defined(CONFIG_N32H7_EMMC) + /* eMMC clock enable */ + + regval |= RCC_AHB1EN1_M7SDMMC2EN; +#endif + +#if defined(CONFIG_N32H7_USB2) + /* USB OTG FS clock enable */ + + regval |= RCC_AHB1EN1_M7USB2EN; +#endif + +#if defined(CONFIG_N32H7_DMA) + /* DMA MUX1 clock enable */ + + regval |= RCC_AHB1EN1_M7DMAMUX1EN; +#endif + +#if defined(CONFIG_N32H7_ADC1) + /* ADC1 clock enable */ + + regval |= RCC_AHB1EN1_M7ADC1PLLEN; + regval |= RCC_AHB1EN1_M7ADC1SYSEN; + regval |= RCC_AHB1EN1_M7ADC1BUSEN; +#endif + putreg32(regval, N32_RCC_AHB1EN1); /* Enable peripherals */ + regval = getreg32(N32_RCC_AHB1EN2); + +#if defined(CONFIG_N32H7_ETH2) + /* ETH2 clock enable */ + + regval |= RCC_AHB1EN2_M7ETH2TXEN; + regval |= RCC_AHB1EN2_M7ETH2RXEN; + regval |= RCC_AHB1EN2_M7ETH2MACEN; +#endif + putreg32(regval, N32_RCC_AHB1EN2); /* Enable peripherals */ + regval = getreg32(N32_RCC_AHB1EN3); + +#if defined(CONFIG_N32H7_ECCMAC) + /* ECCMAC clock enable */ + + regval |= RCC_AHB1EN3_M7ECCMACEN; +#endif + +#if defined(CONFIG_N32H7_DMA) + /* DMA clock enable */ + + regval |= RCC_AHB1EN3_M7DMA1EN; + regval |= RCC_AHB1EN3_M7DMA2EN; + regval |= RCC_AHB1EN3_M7DMA3EN; +#endif + putreg32(regval, N32_RCC_AHB1EN3); /* Enable peripherals */ + regval = getreg32(N32_RCC_AHB1EN4); + +#if defined(CONFIG_N32H7_ADC2) + /* ADC2 clock enable */ + + regval |= RCC_AHB1EN4_M7ADC2PLLEN; + regval |= RCC_AHB1EN4_M7ADC2SYSEN; + regval |= RCC_AHB1EN4_M7ADC2BUSEN; +#endif +#if defined(CONFIG_N32H7_ADC3) + /* ADC3 clock enable */ + + regval |= RCC_AHB1EN4_M7ADC3PLLEN; + regval |= RCC_AHB1EN4_M7ADC3SYSEN; + regval |= RCC_AHB1EN4_M7ADC3BUSEN; +#endif + putreg32(regval, N32_RCC_AHB1EN4); /* Enable peripherals */ +} + +/**************************************************************************** + * Name: rcc_enableapb1 + * + * Description: + * Enable selected APB1 peripherals + * + ****************************************************************************/ + +static inline void rcc_enableapb1(void) +{ + uint32_t regval; + + /* Set the appropriate bits in the RCC_APB1ENx register to enable the + * selected APB1 peripherals. + */ + + regval = getreg32(N32_RCC_APB1EN1); + +#ifdef CONFIG_N32H7_SPI3 + /* SPI3 clock enable */ + + regval |= RCC_APB1EN2_M7SPI3EN; +#endif + +#ifdef CONFIG_N32H7_DAC12 + /* DAC12 clock enable */ + + regval |= RCC_APB1EN2_M7DAC12EN; +#endif + +#ifdef CONFIG_N32H7_WWDG2 + /* WWDG2 clock enable */ + + regval |= RCC_APB1EN2_M7WWDG2EN; +#endif + putreg32(regval, N32_RCC_APB1EN2); /* Enable peripherals */ + regval = getreg32(N32_RCC_APB1EN3); + +#ifdef CONFIG_N32H7_USART1 + /* USART1 clock enable */ + + regval |= RCC_APB1EN3_M7USART1EN; +#endif + +#ifdef CONFIG_N32H7_USART2 + /* USART2 clock enable */ + + regval |= RCC_APB1EN3_M7USART2EN; +#endif + +#ifdef CONFIG_N32H7_USART3 + /* USART3 clock enable */ + + regval |= RCC_APB1EN3_M7USART3EN; +#endif + +#ifdef CONFIG_N32H7_USART4 + /* USART4 clock enable */ + + regval |= RCC_APB1EN3_M7USART4EN; +#endif + +#ifdef CONFIG_N32H7_UART9 + /* UART9 clock enable */ + + regval |= RCC_APB1EN3_M7UART9EN; +#endif + +#ifdef CONFIG_N32H7_UART10 + /* UART10 clock enable */ + + regval |= RCC_APB1EN3_M7UART10EN; +#endif + +#ifdef CONFIG_N32H7_UART11 + /* UART11 clock enable */ + + regval |= RCC_APB1EN3_M7UART11EN; +#endif + +#ifdef CONFIG_N32H7_UART12 + /* UART12 clock enable */ + + regval |= RCC_APB1EN3_M7UART12EN; +#endif + putreg32(regval, N32_RCC_APB1EN3); /* Enable peripherals */ + regval = getreg32(N32_RCC_APB1EN4); + +#ifdef CONFIG_N32H7_I2S3 + /* I2S3 clock enable */ + + regval |= RCC_APB1EN4_M7I2S3EN; +#endif + +#ifdef CONFIG_N32H7_I2S4 + /* I2S4 clock enable */ + + regval |= RCC_APB1EN4_M7I2S4EN; +#endif + +#ifdef CONFIG_N32H7_I2C1 + /* I2C1 clock enable */ + + regval |= RCC_APB1EN4_M7I2C1EN; +#endif + +#ifdef CONFIG_N32H7_I2C2 + /* I2C2 clock enable */ + + regval |= RCC_APB1EN4_M7I2C2EN; +#endif + +#ifdef CONFIG_N32H7_I2C3 + /* I2C3 clock enable */ + + regval |= RCC_APB1EN4_M7I2C3EN; +#endif + putreg32(regval, N32_RCC_APB1EN4); /* Enable peripherals */ + regval = getreg32(N32_RCC_APB1EN5); + +#ifdef CONFIG_N32H7_FDCAN1 + /* FDCAN1 clock enable */ + + regval |= RCC_APB1EN5_M7FDCAN1EN; +#endif + +#ifdef CONFIG_N32H7_FDCAN2 + /* FDCAN2 clock enable */ + + regval |= RCC_APB1EN5_M7FDCAN2EN; +#endif + +#ifdef CONFIG_N32H7_FDCAN5 + /* FDCAN5 clock enable */ + + regval |= RCC_APB1EN5_M7FDCAN5EN; +#endif + +#ifdef CONFIG_N32H7_FDCAN6 + /* FDCAN6 clock enable */ + + regval |= RCC_APB1EN5_M7FDCAN6EN; +#endif + putreg32(regval, N32_RCC_APB1EN5); /* Enable peripherals */ +} + +/**************************************************************************** + * Name: rcc_enableahb2 + * + * Description: + * Enable selected AHB2 peripherals + * + ****************************************************************************/ + +static inline void rcc_enableahb2(void) +{ + uint32_t regval; + + /* Set the appropriate bits in the RCC_AHB2EN register to enable the + * selected AHB2 peripherals. + */ + + regval = getreg32(N32_RCC_AHB2EN1); + +#ifdef CONFIG_N32H7_USB1 + /* USB1 clock enable */ + + regval |= RCC_AHB2EN1_M7USB1EN; +#endif + +#ifdef CONFIG_N32H7_ECCM2 + /* ECCM2 clock enable */ + + regval |= RCC_AHB2EN1_M7ECCM2EN; +#endif + +#ifdef CONFIG_N32H7_CORDIC + /* CORDIC clock enable */ + + regval |= RCC_AHB2EN1_M7CORDICEN; +#endif + +#ifdef CONFIG_N32H7_SDP + /* SDP clock enable */ + + regval |= RCC_AHB2EN1_M7SDPUEN; +#endif + +#ifdef CONFIG_N32H7_FMAC + /* FMAC clock enable */ + + regval |= RCC_AHB2EN1_M7FMACEN; +#endif + putreg32(regval, N32_RCC_AHB2EN1); /* Enable peripherals */ + regval = getreg32(N32_RCC_AHB2EN2); + +#ifdef CONFIG_N32H7_DAC56 + /* DAC56 clock enable */ + + regval |= RCC_AHB2EN2_M7DAC56EN; +#endif + +#ifdef CONFIG_N32H7_DAC34 + /* DAC34 clock enable */ + + regval |= RCC_AHB2EN2_M7DAC34EN; +#endif + +#ifdef CONFIG_N32H7_ETH1 + /* ETH1 clock enable */ + + regval |= RCC_AHB2EN2_M7ETH1TEN; + regval |= RCC_AHB2EN2_M7ETH1REN; + regval |= RCC_AHB2EN2_M7ETH1MEN; +#endif + putreg32(regval, N32_RCC_AHB2EN2); /* Enable peripherals */ +} + +/**************************************************************************** + * Name: rcc_enableapb2 + * + * Description: + * Enable selected APB2 peripherals + * + ****************************************************************************/ + +static inline void rcc_enableapb2(void) +{ + uint32_t regval; + + /* Set the appropriate bits in the RCC_APB2ENx register to enable the + * selected APB2 peripherals. + */ + + regval = getreg32(N32_RCC_APB2EN1); + +#ifdef CONFIG_N32H7_SHRTIM1 + /* SHRTIM1 clock enable */ + + regval |= RCC_APB2EN1_M7SHRTIM1EN; +#endif + +#ifdef CONFIG_N32H7_SHRTIM2 + /* SHRTIM2 clock enable */ + + regval |= RCC_APB2EN1_M7SHRTIM2EN; +#endif + putreg32(regval, N32_RCC_APB2EN1); /* Enable peripherals */ + regval = getreg32(N32_RCC_APB2EN2); + +#ifdef CONFIG_N32H7_I2S1 + /* I2S1 clock enable */ + + regval |= RCC_APB2EN2_M7I2S1EN; +#endif + +#ifdef CONFIG_N32H7_I2S2 + /* I2S2 clock enable */ + + regval |= RCC_APB2EN2_M7I2S2EN; +#endif + +#ifdef CONFIG_N32H7_SPI1 + /* SPI1 clock enable */ + + regval |= RCC_APB2EN2_M7SPI1EN; +#endif + +#ifdef CONFIG_N32H7_SPI2 + /* SPI2 clock enable */ + + regval |= RCC_APB2EN2_M7SPI2EN; +#endif + +#ifdef CONFIG_N32H7_DSMU + /* DSMU clock enable */ + + regval |= RCC_APB2EN2_M7DSMUEN; +#endif + +#ifdef CONFIG_N32H7_I2C4 + /* I2C4 clock enable */ + + regval |= RCC_APB2EN2_M7I2C4EN; +#endif + +#ifdef CONFIG_N32H7_I2C5 + /* I2C5 clock enable */ + + regval |= RCC_APB2EN2_M7I2C5EN; +#endif + +#ifdef CONFIG_N32H7_I2C6 + /* I2C6 clock enable */ + + regval |= RCC_APB2EN2_M7I2C6EN; +#endif + putreg32(regval, N32_RCC_APB2EN2); /* Enable peripherals */ + regval = getreg32(N32_RCC_APB2EN3); + +#ifdef CONFIG_N32H7_USART5 + /* USART5 clock enable */ + + regval |= RCC_APB2EN3_M7USART5EN; +#endif + +#ifdef CONFIG_N32H7_USART6 + /* USART6 clock enable */ + + regval |= RCC_APB2EN3_M7USART6EN; +#endif + +#ifdef CONFIG_N32H7_USART7 + /* USART7 clock enable */ + + regval |= RCC_APB2EN3_M7USART7EN; +#endif + +#ifdef CONFIG_N32H7_USART8 + /* USART8 clock enable */ + + regval |= RCC_APB2EN3_M7USART8EN; +#endif + +#ifdef CONFIG_N32H7_UART13 + /* UART13 clock enable */ + + regval |= RCC_APB2EN3_M7UART13EN; +#endif + +#ifdef CONFIG_N32H7_UART14 + /* UART14 clock enable */ + + regval |= RCC_APB2EN3_M7UART14EN; +#endif + +#ifdef CONFIG_N32H7_UART15 + /* UART15 clock enable */ + + regval |= RCC_APB2EN3_M7UART15EN; +#endif + putreg32(regval, N32_RCC_APB2EN3); /* Enable peripherals */ + regval = getreg32(N32_RCC_APB2EN4); + +#ifdef CONFIG_N32H7_FDCAN3 + /* FDCAN3 clock enable */ + + regval |= RCC_APB2EN4_M7FDCAN3EN; +#endif + +#ifdef CONFIG_N32H7_FDCAN4 + /* FDCAN4 clock enable */ + + regval |= RCC_APB2EN4_M7FDCAN4EN; +#endif + +#ifdef CONFIG_N32H7_FDCAN7 + /* FDCAN7 clock enable */ + + regval |= RCC_APB2EN4_M7FDCAN7EN; +#endif + +#ifdef CONFIG_N32H7_FDCAN8 + /* FDCAN8 clock enable */ + + regval |= RCC_APB2EN4_M7FDCAN8EN; +#endif + putreg32(regval, N32_RCC_APB2EN4); /* Enable peripherals */ +} + +/**************************************************************************** + * Name: rcc_enableahb5 + * + * Description: + * Enable selected AHB5 peripherals + * + ****************************************************************************/ + +static inline void rcc_enableahb5(void) +{ + uint32_t regval; + + /* Set the appropriate bits in the RCC_AHB5ENx register to enable the + * selected AHB5 peripherals. + */ + + regval = getreg32(N32_RCC_AHB5EN1); + + /* GPIOA clock enable */ + + regval |= RCC_AHB5EN1_M7GPIOAEN; + + /* GPIOB clock enable */ + + regval |= RCC_AHB5EN1_M7GPIOBEN; + + /* GPIOC clock enable */ + + regval |= RCC_AHB5EN1_M7GPIOCEN; + + /* GPIOD clock enable */ + + regval |= RCC_AHB5EN1_M7GPIODEN; + +#if N32H7_NGPIO > 4 + /* GPIOE clock enable */ + + regval |= RCC_AHB5EN1_M7GPIOEEN; +#endif + +#if N32H7_NGPIO > 5 + /* GPIOF clock enable */ + + regval |= RCC_AHB5EN1_M7GPIOFEN; +#endif + +#if N32H7_NGPIO > 6 + /* GPIOG clock enable */ + + regval |= RCC_AHB5EN1_M7GPIOGEN; +#endif + +#if N32H7_NGPIO > 7 + /* GPIOH clock enable */ + + regval |= RCC_AHB5EN1_M7GPIOHEN; +#endif + putreg32(regval, N32_RCC_AHB5EN1); /* Enable peripherals */ + regval = getreg32(N32_RCC_AHB5EN2); + +#if N32H7_NGPIO > 8 + /* GPIOI clock enable */ + + regval |= RCC_AHB5EN2_M7GPIOIEN; +#endif + +#if N32H7_NGPIO > 9 + /* GPIOJ clock enable */ + + regval |= RCC_AHB5EN2_M7GPIOJEN; +#endif + +#if N32H7_NGPIO > 10 + /* GPIOK clock enable */ + + regval |= RCC_AHB5EN2_M7GPIOKEN; +#endif + +#ifdef CONFIG_N32H7_ECCM3 + /* ECCM3 clock enable */ + + regval |= RCC_AHB5EN2_M7ECCM3EN; +#endif + + /* PWR clock enable */ + + regval |= RCC_AHB5EN2_PWREN; + +#ifdef CONFIG_N32H7_CRC + /* CRC clock enable */ + + regval |= RCC_AHB5EN2_M7CRCEN; +#endif + +#ifdef CONFIG_N32H7_SEMA4 + /* SEMA4 clock enable */ + + regval |= RCC_AHB5EN2_M7SEMA4EN; +#endif + + /* AFIO clock enable */ + + regval |= RCC_AHB5EN2_M7AFIOEN; + + putreg32(regval, N32_RCC_AHB5EN2); /* Enable peripherals */ +} + +/**************************************************************************** + * Name: rcc_enableapb5 + * + * Description: + * Enable selected APB5 peripherals + * + ****************************************************************************/ + +static inline void rcc_enableapb5(void) +{ + uint32_t regval; + + /* Set the appropriate bits in the RCC_APB5ENx register to enable the + * selected APB5 peripherals. + */ + + regval = getreg32(N32_RCC_APB5EN1); + +#ifdef CONFIG_N32H7_AFEC + /* AFEC clock enable */ + + regval |= RCC_APB5EN1_M7AFECEN; +#endif + +#ifdef CONFIG_N32H7_SPI4 + /* SPI4 clock enable */ + + regval |= RCC_APB5EN1_M7SPI4EN; +#endif + +#ifdef CONFIG_N32H7_SPI5 + /* SPI5 clock enable */ + + regval |= RCC_APB5EN1_M7SPI5EN; +#endif + +#ifdef CONFIG_N32H7_SPI6 + /* SPI6 clock enable */ + + regval |= RCC_APB5EN1_M7SPI6EN; +#endif + +#ifdef CONFIG_N32H7_SPI7 + /* SPI7 clock enable */ + + regval |= RCC_APB5EN1_M7SPI7EN; +#endif + putreg32(regval, N32_RCC_APB5EN1); /* Enable peripherals */ + regval = getreg32(N32_RCC_APB5EN2); + +#ifdef CONFIG_N32H7_I2C7 + /* I2C7 clock enable */ + + regval |= RCC_APB5EN2_M7I2C7EN; +#endif + +#ifdef CONFIG_N32H7_I2C8 + /* I2C8 clock enable */ + + regval |= RCC_APB5EN2_M7I2C8EN; +#endif + +#ifdef CONFIG_N32H7_I2C9 + /* I2C9 clock enable */ + + regval |= RCC_APB5EN2_M7I2C9EN; +#endif + +#ifdef CONFIG_N32H7_I2C10 + /* I2C10 clock enable */ + + regval |= RCC_APB5EN2_M7I2C10EN; +#endif + +#ifdef CONFIG_N32H7_EXTI + /* EXTI clock enable */ + + regval |= RCC_APB5EN2_EXTIEN; +#endif + +#ifdef CONFIG_N32H7_RTC + /* RTC clock enable */ + + regval |= RCC_APB5EN2_M7RTCPCLKEN; +#endif + +#ifdef CONFIG_N32H7_IWDG1 + /* IWDG1 clock enable */ + + regval |= RCC_APB5EN2_IWDG1PCLKEN; +#endif + +#ifdef CONFIG_N32H7_IWDG2 + /* IWDG2 clock enable */ + + regval |= RCC_APB5EN2_IWDG2PCLKEN; +#endif + putreg32(regval, N32_RCC_APB5EN2); /* Enable peripherals */ +} + +/**************************************************************************** + * Name: rcc_enableahb9 + * + * Description: + * Enable selected APB3 peripherals + * + ****************************************************************************/ + +static inline void rcc_enableahb9(void) +{ + uint32_t regval; + + /* Set the appropriate bits in the RCC_AHB9EN1 register to enable the + * selected AHB9 peripherals. + */ + + regval = getreg32(N32_RCC_AHB9EN1); + +#ifdef CONFIG_N32H7_ESC + /* ESC clock enable */ + + regval |= RCC_AHB9EN1_M7ESCEN; +#endif + putreg32(regval, N32_RCC_AHB9EN1); /* Enable peripherals */ +} + +/**************************************************************************** + * Name: rcc_enablerd + * + * Description: + * Enable selected Retention Domain peripherals + * + ****************************************************************************/ + +static inline void rcc_enablerd(void) +{ + uint32_t regval; + + /* Set the appropriate bits in the RCC_RDENx register to enable the + * selected low-power peripherals. + */ + + regval = getreg32(N32_RCC_RDEN1); + +#ifdef CONFIG_N32H7_LPUART1 + /* LPUART1 clock enable */ + + regval |= RCC_RDEN1_M7LPUART1EN; +#endif + +#ifdef CONFIG_N32H7_LPUART2 + /* LPUART2 clock enable */ + + regval |= RCC_RDEN1_M7LPUART2EN; +#endif + putreg32(regval, N32_RCC_RDEN1); /* Enable peripherals */ + regval = getreg32(N32_RCC_RDEN2); + +#ifdef CONFIG_N32H7_COMP + /* COMP clock enable */ + + regval |= RCC_RDEN2_M7COMPEN; +#endif + putreg32(regval, N32_RCC_RDEN2); /* Enable peripherals */ +} + +/**************************************************************************** + * Name: rcc_enableaxi + * + * Description: + * Enable selected AXI peripherals + * + ****************************************************************************/ + +static inline void rcc_enableaxi(void) +{ + uint32_t regval; + + /* Set the appropriate bits in the RCC_AXIENx register to enable the + * selected AXI peripherals. + */ + + regval = getreg32(N32_RCC_AXIEN1); + +#ifdef CONFIG_N32H7_JPEGD + /* JPEGD clock enable */ + + regval |= RCC_AXIEN1_M7JPEGDEN; +#endif + +#ifdef CONFIG_N32H7_JPEGE + /* JPEGE clock enable */ + + regval |= RCC_AXIEN1_M7JPEGEEN; +#endif + +#ifdef CONFIG_N32H7_DMA + /* DMA MUX2 clock enable */ + + regval |= RCC_AXIEN1_M7DMAMUX2EN; +#endif + +#ifdef CONFIG_N32H7_MDMA + /* MDMA clock enable */ + + regval |= RCC_AXIEN1_M7MDMAEN; +#endif + +#ifdef CONFIG_N32H7_SDMMC1 + /* SDMMC1 clock enable */ + + regval |= RCC_AXIEN1_M7SDMMC1EN; +#endif + +#ifdef CONFIG_N32H7_ECCM1 + /* ECCM1 clock enable */ + + regval |= RCC_AXIEN1_M7ECCM1EN; +#endif + +#ifdef CONFIG_N32H7_OTPC + /* OTPC clock enable */ + + regval |= RCC_AXIEN1_M7OTPCEN; +#endif + putreg32(regval, N32_RCC_AXIEN1); /* Enable peripherals */ + regval = getreg32(N32_RCC_AXIEN2); + +#ifdef CONFIG_N32H7_DSI + /* DSI clock enable */ + + regval |= RCC_AXIEN2_M7DSIEN; +#endif + +#ifdef CONFIG_N32H7_LCD + /* LCD clock enable */ + + regval |= RCC_AXIEN2_M7LCDEN; +#endif + +#ifdef CONFIG_N32H7_DVP1 + /* DVP1 clock enable */ + + regval |= RCC_AXIEN2_M7DVP1EN; +#endif + +#ifdef CONFIG_N32H7_DVP2 + /* DVP2 clock enable */ + + regval |= RCC_AXIEN2_M7DVP2EN; +#endif + +#ifdef CONFIG_N32H7_WWDG1 + /* WWDG1 clock enable */ + + regval |= RCC_AXIEN2_M7WWDG1EN; +#endif + putreg32(regval, N32_RCC_AXIEN2); /* Enable peripherals */ + regval = getreg32(N32_RCC_AXIEN3); + +#ifdef CONFIG_N32H7_TASRAM2 + /* TASRAM2 clock enable */ + + regval |= RCC_AXIEN3_M7TASRAM2EN; +#endif + +#ifdef CONFIG_N32H7_TASRAM3 + /* TASRAM3 clock enable */ + + regval |= RCC_AXIEN3_M7TASRAM3EN; +#endif + +#ifdef CONFIG_N32H7_TCM + /* TCM clock enable */ + + regval |= RCC_AXIEN3_M7TCMEN; +#endif + +#ifdef CONFIG_N32H7_TCMAXI + /* TCMAXI clock enable */ + + regval |= RCC_AXIEN3_M7TCMAXIEN; +#endif + +#ifdef CONFIG_N32H7_TCMAPB + /* TCMAPB clock enable */ + + regval |= RCC_AXIEN3_M7TCMAPBEN; +#endif + +#ifdef CONFIG_N32H7_ASRAM1 + /* ASRAM1 clock enable */ + + regval |= RCC_AXIEN3_M7ASRAM1EN; +#endif + +#ifdef CONFIG_N32H7_AXIROM + /* AXIROM clock enable */ + + regval |= RCC_AXIEN3_M7AXIROMEN; +#endif + +#ifdef CONFIG_N32H7_GPU + /* GPU clock enable */ + + regval |= RCC_AXIEN3_M7GPUEN; +#endif + putreg32(regval, N32_RCC_AXIEN3); /* Enable peripherals */ + regval = getreg32(N32_RCC_AXIEN4); + +#ifdef CONFIG_N32H7_XSPI1 + /* XSPI1 clock enable */ + + regval |= RCC_AXIEN4_M7XSPI1EN; +#endif + +#ifdef CONFIG_N32H7_XSPI2 + /* XSPI2 clock enable */ + + regval |= RCC_AXIEN4_M7XSPI2EN; +#endif + +#ifdef CONFIG_N32H7_FEMC + /* FEMC clock enable */ + + regval |= RCC_AXIEN4_M7FEMCEN; +#endif + +#ifdef CONFIG_N32H7_SDRAM + /* SDRAM clock enable */ + + regval |= RCC_AXIEN4_M7SDRAMEN; +#endif + putreg32(regval, N32_RCC_AXIEN4); /* Enable peripherals */ +} + +/**************************************************************************** + * Name: rcc_enable_rtc + * + * Description: + * Enable RTC + * + ****************************************************************************/ + +static inline void rcc_enable_rtc(void) +{ + uint32_t regval; + + regval = getreg32(N32_RCC_BDCTRL); + +#ifdef CONFIG_N32H7_RTC + /* RTC clock enable */ + + regval |= RCC_BDCTRL_RTCEN; +#endif + putreg32(regval, N32_RCC_BDCTRL); +} + +/**************************************************************************** + * Name: rcc_enableperiphals + ****************************************************************************/ + +static inline void rcc_enableperipherals(void) +{ + rcc_enableahb1(); + rcc_enableapb1(); + rcc_enableahb2(); + rcc_enableapb2(); + rcc_enableahb5(); + rcc_enableapb5(); + rcc_enableahb9(); + rcc_enablerd(); + rcc_enableaxi(); + rcc_enable_rtc(); +} + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: n32_stdclockconfig + * + * Description: + * Called to change to new clock based on settings in board.h + * + * NOTE: This logic would need to be extended if you need to select low- + * power clocking modes! + ****************************************************************************/ + +void n32_stdclockconfig(void) +{ + uint32_t regval; + volatile int32_t timeout; + +#ifdef N32_BOARD_USEHSI + /* Enable Internal High-Speed Clock (HSI) */ + + regval = getreg32(N32_RCC_SRCCTRL1); + regval |= RCC_SRCCTRL1_HSIEN; /* Enable HSI */ + putreg32(regval, N32_RCC_SRCCTRL1); + + /* Set HSI predivider to board specific value */ + + regval = getreg32(N32_RCC_SYSBUSDIV1); + regval &= ~RCC_SYSBUSDIV1_HSIDIV_MASK; + regval |= N32_BOARD_HSIDIV; + putreg32(regval, N32_RCC_SYSBUSDIV1); + + /* Wait until the HSI is ready (or until a timeout elapsed) */ + + for (timeout = HSIRDY_TIMEOUT; timeout > 0; timeout--) + { + /* Check if the HSIRDF flag is the set in the SRCCTRL1 */ + + if ((getreg32(N32_RCC_SRCCTRL1) & RCC_SRCCTRL1_HSIRDF) != 0) + { + /* If so, then break-out with timeout > 0 */ + + break; + } + } + +#else /* if N32_BOARD_USEHSE */ + /* Enable External High-Speed Clock (HSE) */ + + regval = getreg32(N32_RCC_SRCCTRL1); + regval |= RCC_SRCCTRL1_HSEEN; /* Enable HSE */ + putreg32(regval, N32_RCC_SRCCTRL1); + + /* Wait until the HSE is ready (or until a timeout elapsed) */ + + for (timeout = HSERDY_TIMEOUT; timeout > 0; timeout--) + { + /* Check if the HSERDY flag is the set in the SRCCTRL1 */ + + if ((getreg32(N32_RCC_SRCCTRL1) & RCC_SRCCTRL1_HSERDF) != 0) + { + /* If so, then break-out with timeout > 0 */ + + break; + } + } +#endif + +#ifdef CONFIG_N32H7_MSI + /* Enable MSI */ + + regval = getreg32(N32_RCC_SRCCTRL1); + regval |= RCC_SRCCTRL1_MSIEN; + putreg32(regval, N32_RCC_SRCCTRL1); + + /* Wait until the MSI is ready */ + + while ((getreg32(N32_RCC_SRCCTRL1) & RCC_SRCCTRL1_MSIRDF) == 0); +#endif + + /* Check for a timeout. If this timeout occurs, then we are hosed. We + * have no real back-up plan, although the following logic makes it look + * as though we do. + */ + + if (timeout > 0) + { + /* Configure sys_div_clk is sys_clk(PLL1A) = 600M = M7 clock */ + + regval = getreg32(N32_RCC_SYSBUSDIV1); + regval &= ~RCC_SYSBUSDIV1_SYSCLKDIV_MASK; + regval |= RCC_SYSBUSDIV1_SYSCLKDIV_DIV(1); + + /* Configure sys_bus_div_clk is sys_div_clk/2 = 300M = M4 clock + * = AHB1\2\5\9 + */ + + regval &= ~RCC_SYSBUSDIV1_BUSDIV_MASK; + regval |= RCC_SYSBUSDIV1_BUSDIV_DIV(2); + + /* Configure AXI clock is sys_div_clk/2 = 300M = AHB6 */ + + regval &= ~RCC_SYSBUSDIV1_AXIDIV_MASK; + regval |= RCC_SYSBUSDIV1_AXIDIV_DIV(2); + regval &= ~RCC_SYSBUSDIV1_AXIHYPDIV_MASK; + regval |= RCC_SYSBUSDIV1_AXIHYPDIV_DIV(2); + + /* Configure m7_hyp_div_clk is PLLxA = 600M */ + + regval &= ~RCC_SYSBUSDIV1_M7HYPDIV_MASK; + regval |= RCC_SYSBUSDIV1_M7HYPDIV_DIV(1); + + putreg32(regval, N32_RCC_SYSBUSDIV1); + __RCC_DELAY_US(1); + + /* Configure M7 sysTick is sys_div_clk/2 = 300M */ + + regval = getreg32(N32_RCC_CFG3); + regval &= ~RCC_CFG3_M7STCLKDIV_MASK; + regval |= RCC_CFG3_M7STCLKDIV_DIV1; + putreg32(regval, N32_RCC_CFG3); + + regval = getreg32(N32_RCC_SYSBUSDIV2); + + /* Configure APB1 clock is AHB1/2 = 150M */ + + regval &= ~RCC_SYSBUSDIV2_APB1DIV_MASK; + regval |= RCC_SYSBUSDIV2_APB1DIV_DIV(2); + + /* Configure APB2 clock is AHB2/2 = 150M */ + + regval &= ~RCC_SYSBUSDIV2_APB2DIV_MASK; + regval |= RCC_SYSBUSDIV2_APB2DIV_DIV(2); + + /* Configure APB5 clock is AHB5/2 = 150M */ + + regval &= ~RCC_SYSBUSDIV2_APB5DIV_MASK; + regval |= RCC_SYSBUSDIV2_APB5DIV_DIV(2); + + /* Configure APB6 clock is AHB6/2 = 150M */ + + regval &= ~RCC_SYSBUSDIV2_APB6DIV_MASK; + regval |= RCC_SYSBUSDIV2_APB6DIV_DIV(2); + + putreg32(regval, N32_RCC_SYSBUSDIV2); + + /* configure PLL1_VCOx frequency 600M */ + + regval = getreg32(N32_RCC_PLL1CTRL1); + regval &= ~RCC_PLL1CTRL1_PLL1BWAJ_MASK; + regval |= RCC_PLL1CTRL1_PLL1BWAJ(PLL_BWAJ); + putreg32(regval, N32_RCC_PLL1CTRL1); + + regval = getreg32(N32_RCC_PLL1CTRL2); + regval &= ~(RCC_PLL1CTRL2_PLL1CLKF_MASK | RCC_PLL1CTRL2_PLL1CLKR_MASK); + regval |= (RCC_PLL1CTRL2_PLL1CLKF(PLL_PLLF) | + RCC_PLL1CTRL2_PLL1CLKR(PLL_PLLR)); + putreg32(regval, N32_RCC_PLL1CTRL2); + + /* Enable PLL module power */ + + regval = getreg32(N32_RCC_PLL1CTRL1); + regval |= RCC_PLL1CTRL1_PLL1LDOEN; + putreg32(regval, N32_RCC_PLL1CTRL1); + __RCC_DELAY_US(10); + + /* Enable power to analog circuitry in PLL */ + + regval = getreg32(N32_RCC_PLL1CTRL1); + regval &= ~RCC_PLL1CTRL1_PLL1PD; + putreg32(regval, N32_RCC_PLL1CTRL1); + + /* Select Clock Source */ + + regval = getreg32(N32_RCC_PLL1CTRL1); + regval &= ~RCC_PLL1CTRL1_PLL1SRC_MASK; + regval |= PLL_SRC; + putreg32(regval, N32_RCC_PLL1CTRL1); + __RCC_DELAY_US(10); + + /* Clear PLL reset */ + + regval = getreg32(N32_RCC_PLL1CTRL1); + regval &= ~RCC_PLL1CTRL1_PLL1RST; + putreg32(regval, N32_RCC_PLL1CTRL1); + + /* Check if PLL1 is locked */ + + while ((getreg32(N32_RCC_PLL1CTRL1)&RCC_PLL1CTRL1_PLL1PHLK) != + RCC_PLL1CTRL1_PLL1PHLK); + + /* Enable PLL */ + + regval = getreg32(N32_RCC_PLL1CTRL1); + regval |= RCC_PLL1CTRL1_PLL1EN; + putreg32(regval, N32_RCC_PLL1CTRL1); + __RCC_DELAY_US(1); + + /* Configure PLL1A is 600M */ + + regval = getreg32(N32_RCC_PLL1DIV); + regval &= ~RCC_PLL1DIV_PLL1ADIV_MASK; + regval |= RCC_PLL1DIV_PLL1ADIV_DIV(1); + putreg32(regval, N32_RCC_PLL1DIV); + + /* Configure PLL1B is 100M */ + + regval = getreg32(N32_RCC_PLL1DIV); + regval &= ~RCC_PLL1DIV_PLL1BDIV_MASK; + regval |= RCC_PLL1DIV_PLL1BDIV_DIV(6); + putreg32(regval, N32_RCC_PLL1DIV); + + /* Configure sys_clk source is PLL1A */ + + regval = getreg32(N32_RCC_SRCCTRL1); + regval &= ~RCC_SRCCTRL1_SCLKSW_MASK; + regval |= RCC_SRCCTRL1_SCLKSW_PLL1A; + putreg32(regval, N32_RCC_SRCCTRL1); + + /* Check if sys_clk source is PLL1A */ + + while ((getreg32(N32_RCC_SRCCTRL1)&RCC_SRCCTRL1_SCLKSTS_MASK) != + RCC_SRCCTRL1_SCLKSTS_PLL1A); + + /* configure AXI clock source is PLL1A */ + + regval = getreg32(N32_RCC_SRCCTRL2); + regval &= ~RCC_SRCCTRL2_AXIHYPSEL_MASK; + regval |= RCC_SRCCTRL2_AXIHYPSEL_PLL1A; + putreg32(regval, N32_RCC_SRCCTRL2); + + /* configure M7 clock source is PLL1A */ + + regval &= ~RCC_SRCCTRL2_M7HYPSEL_MASK; + regval |= RCC_SRCCTRL2_M7HYPSEL_PLL1A; + putreg32(regval, N32_RCC_SRCCTRL2); + } +} diff --git a/boards/Kconfig b/boards/Kconfig index 07dd1583209fc..a589eaf2922bf 100644 --- a/boards/Kconfig +++ b/boards/Kconfig @@ -1364,6 +1364,15 @@ config ARCH_BOARD_MOXA ---help--- Moxa +config ARCH_BOARD_N32H762IIL7 + bool "Nation Tech N32H762IIL7 DevKit" + depends on ARCH_CHIP_N32H762II + select ARCH_HAVE_LEDS + select ARCH_HAVE_BUTTONS + select ARCH_HAVE_IRQBUTTONS + ---help--- + This is the board configuration for the port of NuttX to the + config ARCH_BOARD_NE64BADGE bool "FEG NE64 /PoE Badge board" depends on ARCH_CHIP_MCS92S12NEC64 @@ -4258,6 +4267,7 @@ config ARCH_BOARD default "phy6222" if ARCH_BOARD_PHY6222 default "sim" if ARCH_BOARD_SIM default "moxa" if ARCH_BOARD_MOXA + default "n32h762iil7" if ARCH_BOARD_N32H762IIL7 default "spresense" if ARCH_BOARD_SPRESENSE default "xx3803" if ARCH_BOARD_XX3803 default "xx3823" if ARCH_BOARD_XX3823 diff --git a/boards/arm/n32h7/n32h762iil7/CMakeLists.txt b/boards/arm/n32h7/n32h762iil7/CMakeLists.txt new file mode 100644 index 0000000000000..39854855c2fcb --- /dev/null +++ b/boards/arm/n32h7/n32h762iil7/CMakeLists.txt @@ -0,0 +1,23 @@ +# ############################################################################## +# boards/arm/n32h7/n32h762iil7/CMakeLists.txt +# +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed to the Apache Software Foundation (ASF) under one or more contributor +# license agreements. See the NOTICE file distributed with this work for +# additional information regarding copyright ownership. The ASF licenses this +# file to you under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. +# +# ############################################################################## + +add_subdirectory(src) diff --git a/boards/arm/n32h7/n32h762iil7/Kconfig b/boards/arm/n32h7/n32h762iil7/Kconfig new file mode 100644 index 0000000000000..56ec045c8ec25 --- /dev/null +++ b/boards/arm/n32h7/n32h762iil7/Kconfig @@ -0,0 +1,35 @@ +# +# For a description of the syntax of this configuration file, +# see the file kconfig-language.txt in the NuttX tools repository. +# + +if ARCH_BOARD_N32H762IIL7 + +config N32_ROMFS + bool "Automount baked-in ROMFS image" + default n + depends on FS_ROMFS + ---help--- + Select N32_ROMFS_IMAGEFILE, N32_ROMFS_DEV_MINOR, N32_ROMFS_MOUNTPOINT + +config N32_ROMFS_DEV_MINOR + int "Minor for the block device backing the data" + depends on N32_ROMFS + default 64 + +config N32_ROMFS_MOUNTPOINT + string "Mountpoint of the custom romfs image" + depends on N32_ROMFS + default "/rom" + +config N32_ROMFS_IMAGEFILE + string "ROMFS image file to include into build" + depends on N32_ROMFS + default "../../../rom.img" + +config N32_BOARDCTL_RESET + bool "Board control reset support" + select BOARDCTL_RESET + default n + +endif # ARCH_BOARD_N32H762IIL7 diff --git a/boards/arm/n32h7/n32h762iil7/configs/nsh/defconfig b/boards/arm/n32h7/n32h762iil7/configs/nsh/defconfig new file mode 100644 index 0000000000000..52efdc07b454b --- /dev/null +++ b/boards/arm/n32h7/n32h762iil7/configs/nsh/defconfig @@ -0,0 +1,198 @@ +# +# This file is autogenerated: PLEASE DO NOT EDIT IT. +# +# You can use "make menuconfig" to make any modifications to the installed .config file. +# You can then do "make savedefconfig" to generate a new defconfig file that includes your +# modifications. +# +# CONFIG_ARCH_LEDS is not set +# CONFIG_NDEBUG is not set +# CONFIG_NSH_DISABLE_MW is not set +# CONFIG_STANDARD_SERIAL is not set +# CONFIG_SYSTEM_DD is not set +CONFIG_ALLOW_BSD_COMPONENTS=y +CONFIG_ARCH="arm" +CONFIG_ARCH_BOARD="n32h762iil7" +CONFIG_ARCH_BOARD_N32H762IIL7=y +CONFIG_ARCH_BUTTONS=y +CONFIG_ARCH_CHIP="n32h7" +CONFIG_ARCH_CHIP_N32H762II=y +CONFIG_ARCH_CHIP_N32H7=y +CONFIG_ARCH_CHIP_N32H7_CORTEXM7=y +CONFIG_ARCH_CPUINFO_FREQ_KHZ=600000 +CONFIG_ARCH_IDLE_CUSTOM=y +CONFIG_ARCH_IRQBUTTONS=y +CONFIG_ARCH_IRQPRIO=y +CONFIG_ARCH_STACKDUMP=y +CONFIG_ARCH_STDARG_H=y +CONFIG_ARMV7M_DCACHE=y +CONFIG_ARMV7M_DCACHE_WRITETHROUGH=y +CONFIG_ARMV7M_DTCM=y +CONFIG_ARMV7M_ICACHE=y +CONFIG_ARMV7M_ITCM=y +CONFIG_ARMV7M_STRING_FUNCTION=y +CONFIG_ARM_MPU=y +CONFIG_ARM_MPU_EARLY_RESET=y +CONFIG_BENCHMARK_COREMARK=y +CONFIG_BENCHMARK_MTD=y +CONFIG_BENCHMARK_OSPERF=y +CONFIG_BENCHMARK_RAMSPEED=y +CONFIG_BENCHMARK_SD_BENCH=y +CONFIG_BENCHMARK_SUPERPI=y +CONFIG_BOARDCTL_RESET=y +CONFIG_BOARDCTL_RESET_CAUSE=y +CONFIG_BOARDCTL_UNIQUEID=y +CONFIG_BOARD_LOOPSPERMSEC=74953 +CONFIG_BUILTIN=y +CONFIG_CDCACM=y +CONFIG_CDCACM_COMPOSITE=y +CONFIG_COMPOSITE_IAD=y +CONFIG_COMPOSITE_MSFT_OS_DESCRIPTORS=y +CONFIG_COMPOSITE_PRODUCTID=0x5740 +CONFIG_COMPOSITE_VENDORID=0x19F5 +CONFIG_DEBUG_CUSTOMOPT=y +CONFIG_DEBUG_FEATURES=y +CONFIG_DEBUG_FS=y +CONFIG_DEBUG_FS_ERROR=y +CONFIG_DEBUG_FS_WARN=y +CONFIG_DEBUG_INPUT=y +CONFIG_DEBUG_INPUT_ERROR=y +CONFIG_DEBUG_INPUT_WARN=y +CONFIG_DEBUG_LEDS=y +CONFIG_DEBUG_LEDS_ERROR=y +CONFIG_DEBUG_LEDS_WARN=y +CONFIG_DEBUG_MEMCARD=y +CONFIG_DEBUG_MEMCARD_ERROR=y +CONFIG_DEBUG_MEMCARD_WARN=y +CONFIG_DEBUG_MM=y +CONFIG_DEBUG_MM_ERROR=y +CONFIG_DEBUG_MM_WARN=y +CONFIG_DEBUG_SCHED=y +CONFIG_DEBUG_SCHED_ERROR=y +CONFIG_DEBUG_SCHED_WARN=y +CONFIG_DEBUG_SYMBOLS=y +CONFIG_DEBUG_TIMER=y +CONFIG_DEBUG_TIMER_ERROR=y +CONFIG_DEBUG_TIMER_WARN=y +CONFIG_DEFAULT_TASK_STACKSIZE=8192 +CONFIG_EXAMPLES_BUTTONS=y +CONFIG_EXAMPLES_BUTTONS_NAME0="WKUP" +CONFIG_EXAMPLES_BUTTONS_NAME1="KEY1" +CONFIG_EXAMPLES_BUTTONS_NAME2="KEY2" +CONFIG_EXAMPLES_BUTTONS_NAME3="KEY3" +CONFIG_EXAMPLES_BUTTONS_NAMES=y +CONFIG_EXAMPLES_CAPTURE=y +CONFIG_EXAMPLES_CORDIC=y +CONFIG_EXAMPLES_LEDS=y +CONFIG_EXAMPLES_ONESHOT=y +CONFIG_EXAMPLES_ONESHOT_DELAY=500000 +CONFIG_EXAMPLES_PWM=y +CONFIG_EXAMPLES_TERMIOS=y +CONFIG_EXAMPLES_TIMER=y +CONFIG_EXAMPLES_USBSERIAL=y +CONFIG_EXPERIMENTAL=y +CONFIG_FS_FAT=y +CONFIG_FS_LARGEFILE=y +CONFIG_FS_LITTLEFS=y +CONFIG_FS_LITTLEFS_PROGRAM_SIZE_FACTOR=1 +CONFIG_FS_PROCFS=y +CONFIG_FS_PROCFS_REGISTER=y +CONFIG_HAVE_CXX=y +CONFIG_HAVE_CXXINITIALIZE=y +CONFIG_IDLETHREAD_STACKSIZE=4096 +CONFIG_INIT_ENTRYPOINT="nsh_main" +CONFIG_INPUT=y +CONFIG_INPUT_BUTTONS=y +CONFIG_INPUT_BUTTONS_LOWER=y +CONFIG_INTELHEX_BINARY=y +CONFIG_LINE_MAX=64 +CONFIG_MMCSD_MULTIBLOCK_LIMIT=8 +CONFIG_MMCSD_SDIO=y +CONFIG_MM_REGIONS=3 +CONFIG_N32H7_ATIM1=y +CONFIG_N32H7_ATIM1_CHANNEL1=y +CONFIG_N32H7_ATIM1_CHANNEL2=y +CONFIG_N32H7_ATIM1_CHANNEL3=y +CONFIG_N32H7_ATIM1_CHANNEL4=y +CONFIG_N32H7_ATIM1_PWM=y +CONFIG_N32H7_ATIM4=y +CONFIG_N32H7_BTIM1=y +CONFIG_N32H7_BTIM2=y +CONFIG_N32H7_BTIM3=y +CONFIG_N32H7_BTIM4=y +CONFIG_N32H7_CAPTURE=y +CONFIG_N32H7_CORDIC=y +CONFIG_N32H7_DMA1=y +CONFIG_N32H7_DMA2=y +CONFIG_N32H7_DMA3=y +CONFIG_N32H7_DMA=y +CONFIG_N32H7_GTIMA1=y +CONFIG_N32H7_GTIMA2=y +CONFIG_N32H7_GTIMA2_CAP=y +CONFIG_N32H7_GTIMB1=y +CONFIG_N32H7_GTIMB1_CHANNEL1=y +CONFIG_N32H7_GTIMB1_CHANNEL2=y +CONFIG_N32H7_GTIMB1_CHANNEL3=y +CONFIG_N32H7_GTIMB1_CHANNEL4=y +CONFIG_N32H7_GTIMB1_PWM=y +CONFIG_N32H7_ONESHOT=y +CONFIG_N32H7_ONESHOT_MAXCHANNELS=8 +CONFIG_N32H7_PROGMEM=y +CONFIG_N32H7_PWM=y +CONFIG_N32H7_PWM_MULTICHAN=y +CONFIG_N32H7_PWR=y +CONFIG_N32H7_SDMMC1=y +CONFIG_N32H7_SDMMC_ADMA=y +CONFIG_N32H7_SERIAL=y +CONFIG_N32H7_TIMER=y +CONFIG_N32H7_TIMER_ADVANCED=y +CONFIG_N32H7_TIMER_BASIC=y +CONFIG_N32H7_TIMER_GTIMA=y +CONFIG_N32H7_TIMER_GTIMB=y +CONFIG_N32H7_USART1=y +CONFIG_N32H7_USART3=y +CONFIG_N32H7_USBHS1_DEV=y +CONFIG_N32H7_USBHS2_HOST=y +CONFIG_NSH_BUILTIN_APPS=y +CONFIG_NSH_FILEIOSIZE=512 +CONFIG_PIPES=y +CONFIG_PREALLOC_TIMERS=4 +CONFIG_PWM_NCHANNELS=4 +CONFIG_RAM_SIZE=131072 +CONFIG_RAM_START=0x20000000 +CONFIG_RAW_BINARY=y +CONFIG_RR_INTERVAL=200 +CONFIG_SCHED_CPULOAD_SYSCLK=y +CONFIG_SCHED_HPWORK=y +CONFIG_SCHED_IRQMONITOR=y +CONFIG_SCHED_WAITPID=y +CONFIG_SERIAL_TERMIOS=y +CONFIG_STACK_COLORATION=y +CONFIG_START_DAY=21 +CONFIG_START_MONTH=2 +CONFIG_START_YEAR=2006 +CONFIG_SYSTEM_CLE_CMD_HISTORY=y +CONFIG_SYSTEM_COLOR_CLE=y +CONFIG_SYSTEM_COMPOSITE=y +CONFIG_SYSTEM_NSH=y +CONFIG_SYSTEM_NSH_STACKSIZE=4096 +CONFIG_SYSTEM_UNIQUEID=y +CONFIG_TESTING_OSTEST=y +CONFIG_TTY_SIGINT=y +CONFIG_TTY_SIGTSTP=y +CONFIG_USART1_BAUD=921600 +CONFIG_USART1_RXBUFSIZE=128 +CONFIG_USART1_RXDMA=y +CONFIG_USART1_SERIAL_CONSOLE=y +CONFIG_USART1_TXBUFSIZE=128 +CONFIG_USART1_TXDMA=y +CONFIG_USART3_RXBUFSIZE=128 +CONFIG_USART3_RXDMA=y +CONFIG_USART3_TXBUFSIZE=128 +CONFIG_USART3_TXDMA=y +CONFIG_USBDEV_COMPOSITE=y +CONFIG_USBHOST_MSC=y +CONFIG_USBHOST_MSC_NOTIFIER=y +CONFIG_USERLED=y +CONFIG_USERLED_LOWER=y +CONFIG_USERLED_LOWER_READSTATE=y diff --git a/boards/arm/n32h7/n32h762iil7/include/board.h b/boards/arm/n32h7/n32h762iil7/include/board.h new file mode 100644 index 0000000000000..fbc019c04d2bc --- /dev/null +++ b/boards/arm/n32h7/n32h762iil7/include/board.h @@ -0,0 +1,328 @@ +/**************************************************************************** + * boards/arm/n32h7/n32h762iil7/include/board.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + + #ifndef __BOARDS_ARM_N32H7_N32H762IIL7_INCLUDE_BOARD_H + #define __BOARDS_ARM_N32H7_N32H762IIL7_INCLUDE_BOARD_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + + #include + + #ifndef __ASSEMBLY__ + # include + #endif + +/* Do not include N32H7 header files here */ + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* Clocking *****************************************************************/ + +/* The N32H762IIL7 board provides the following clock sources: + * + * X1: 25 MHz crystal oscillator + * X2: 32.768 KHz crystal oscillator + * + * So we have these clock source available within the N32H7 + * + * HSI: 64 MHz RC factory-trimmed + * MSI: 16 MHz RC factory-trimmed + * LSI: 32 KHz RC + * HSE: 25 MHz crystal oscillator + * LSE: 32.768 KHz crystal oscillator + */ + + #define N32_BOARD_XTAL 25000000ul + + #define N32_HSI_FREQUENCY 64000000ul + #define N32_MSI_FREQUENCY 16000000ul + #define N32_LSI_FREQUENCY 32000ul + #define N32_HSE_FREQUENCY N32_BOARD_XTAL + #define N32_LSE_FREQUENCY 32768ul + +/* Main PLL Configuration. + * + * PLL source is HSE = 25,000,000 + * + * PLL_VCOx = N32_HSE_FREQUENCY*(PLLF/16384)/(PLLR+1) + * PLL_BWAJx = PLLF/32768 - 1 + * Subject to: + * + * 1 <= PLLF <= 67,108,863 + * 0 <= PLLR <= 63 + * 438 MHz <= PLL_VCO <= 800MHz + * + * Use SysClkMode0: M7 from PLL1A, AXI from PLL1A, M4 from PLL1A. + * + * Configure the M7 clock is 600MHz, + * M4, AXI, AHB(1,2,5,6,9) clock is 300MHz, APB(1,2,5,6) clock is 150MHz. + * + * 0010_11 00_0100_1000_0000_0000_0000_0000 + * Target PLL_VCOx: 600 MHz PLL1CTRL1.BWAJ[11:0] = 0x08F + * PLLF[25:0]: 4718592 PLL1CTRL2 = 0x2C480000 + * PLLR[5:0]: 11 + * PLL_BWAJx: 143 + * Actual PLL_VCOx: 600000000 Hz + * + * *************!!!WARNING!!!*************** + * * * + * *!!!OVERCLOCK CAN DAMAGE YOU HARDWARE!!!* + * * * + * *************!!!WARNING!!!*************** + * + * 0010_11 00_0110_0000_0000_0000_0000_0000 + * Target PLL_VCOx: 800 MHz PLL1CTRL1.BWAJ[11:0] = 0x0C7 + * PLLF[25:0]: 6291456 PLL1CTRL2 = 0x2C600000 + * PLLR[5:0]: 11 + * PLL_BWAJx: 191 + * Actual PLL_VCOx: 800000000 Hz + */ + +#define TCM_SIZE_VALUE N32H7_TCM_CFG(896, 128, 0) +#define CLK_TCK 1000 + +#define N32_BOARD_USEHSE +/* #define N32_BOARD_USEHSI */ + +#ifdef N32_BOARD_USEHSI +# define N32_BOARD_HSIDIV RCC_SYSBUSDIV1_HSIDIV_DIV(1) +# define PLL_PLLF 153600U +# define PLL_PLLR 0U +# define PLL_BWAJ 3U +# define PLL_SRC RCC_PLL1CTRL1_PLL1SRC_HSI +#elif defined(N32_BOARD_USEHSE) +# define N32_BOARD_HSEDIV RCC_SYSBUSDIV1_HSEDIV_DIV(1) +# define PLL_PLLF 4718592U +# define PLL_PLLR 11U +# define PLL_BWAJ 143U +# define PLL_SRC RCC_PLL1CTRL1_PLL1SRC_HSE +#else +# error "PLL configuration not supported" +#endif + +#define N32_BOARD_SYSCLKMODE 0 +/* #define N32_BOARD_SYSCLKMODE 1 + * #define N32_BOARD_SYSCLKMODE 2 + */ + +#define N32_PLL1_VCO_FREQUENCY 600000000ul +#define N32_PLL1A_FREQUENCY N32_PLL1_VCO_FREQUENCY/1 +#define N32_PLL1B_FREQUENCY N32_PLL1_VCO_FREQUENCY/6 +#if N32_BOARD_SYSCLKMODE != 0 +# define N32_PLL2_VCO_FREQUENCY 600000000ul +# define N32_PLL2A_FREQUENCY N32_PLL2_VCO_FREQUENCY/1 +#endif + +#if N32_BOARD_SYSCLKMODE == 2 +# define N32_M7CPU_FREQUENCY (N32_PLL2A_FREQUENCY/1) +# define N32_M4CPU_FREQUENCY (N32_PLL1A_FREQUENCY/2) +# define N32_AXI_FREQUENCY (N32_PLL1A_FREQUENCY/2) +# define N32_AHB_FREQUENCY (N32_PLL1A_FREQUENCY/2) +# define N32_APB_FREQUENCY (N32_AHB_FREQUENCY/2) +#elif N32_BOARD_SYSCLKMODE == 1 +# define N32_M7CPU_FREQUENCY (N32_PLL2A_FREQUENCY/1) +# define N32_M4CPU_FREQUENCY (N32_PLL1A_FREQUENCY/2) +# define N32_AXI_FREQUENCY (N32_PLL2A_FREQUENCY/2) +# define N32_AHB_FREQUENCY (N32_PLL1A_FREQUENCY/2) +# define N32_APB_FREQUENCY (N32_AHB_FREQUENCY/2) +#else +# define N32_M7CPU_FREQUENCY (N32_PLL1A_FREQUENCY/1) +# define N32_M4CPU_FREQUENCY (N32_PLL1A_FREQUENCY/2) +# define N32_AXI_FREQUENCY (N32_PLL1A_FREQUENCY/2) +# define N32_AHB_FREQUENCY (N32_PLL1A_FREQUENCY/2) +# define N32_APB_FREQUENCY (N32_AHB_FREQUENCY/2) +#endif + +/* LED definitions **********************************************************/ + +/* The Nucleo-144 board has numerous LEDs but only three, LD1 a Green LED, + * LD2 a Blue LED and LD3 a Red LED, that can be controlled by software. + * The following definitions assume the default Solder Bridges are installed. + * + * If CONFIG_ARCH_LEDS is not defined, then the user can control the LEDs in + * any way. + * The following definitions are used to access individual LEDs. + */ + +/* LED index values for use with board_userled() */ + +#define BOARD_LED1 0 /* PA1 */ +#define BOARD_LED2 1 /* PA2 */ +#define BOARD_LED3 2 /* PA3 */ +#define BOARD_NLEDS 3 + +#define BOARD_LED_GREEN BOARD_LED1 +#define BOARD_LED_BLUE BOARD_LED2 +#define BOARD_LED_RED BOARD_LED3 + +/* LED bits for use with board_userled_all() */ + +#define BOARD_LED1_BIT (1 << BOARD_LED1) +#define BOARD_LED2_BIT (1 << BOARD_LED2) +#define BOARD_LED3_BIT (1 << BOARD_LED3) + +#ifdef CONFIG_ARCH_LEDS +# define CONFIG_N32H7_GPIOA +#endif + +/* If CONFIG_ARCH_LEDS is defined, the usage by the board port is defined in + * include/board.h and src/stm32_leds.c. + * The LEDs are used to encode OS-related events as follows: + * + * + * SYMBOL Meaning LED state + * Red Green Blue + * ---------------------- -------------------------- ------ ------ --- + */ + +#define LED_STARTED 0 /* NuttX has been started OFF OFF OFF */ +#define LED_HEAPALLOCATE 1 /* Heap has been allocated OFF OFF ON */ +#define LED_IRQSENABLED 2 /* Interrupts enabled OFF ON OFF */ +#define LED_STACKCREATED 3 /* Idle stack created OFF ON ON */ +#define LED_INIRQ 4 /* In an interrupt N/C N/C GLOW */ +#define LED_SIGNAL 5 /* In a signal handler N/C GLOW N/C */ +#define LED_ASSERTION 6 /* An assertion failed GLOW N/C GLOW */ +#define LED_PANIC 7 /* The system has crashed Blink OFF N/C */ +#define LED_IDLE 8 /* MCU is is sleep mode ON OFF OFF */ + +/* Thus if the Green LED is statically on, NuttX has successfully booted and + * is, apparently, running normally. If the Red LED is flashing at + * approximately 2Hz, then a fatal error has been detected and the system + * has halted. + */ + +/* Button definitions *******************************************************/ + +/* The NUCLEO board supports four button: Pushbutton B1, labeled "User", is + * connected to GPIO PC0. + * A high value will be sensed when the button is depressed. + */ + +#define BUTTON_WKUP 0 +#define BUTTON_KEY1 1 +#define BUTTON_KEY2 2 +#define BUTTON_KEY3 3 +#define NUM_BUTTONS 4 +#define BUTTON_WKUP_BIT (1 << BUTTON_WKUP) +#define BUTTON_KEY1_BIT (1 << BUTTON_KEY1) +#define BUTTON_KEY2_BIT (1 << BUTTON_KEY2) +#define BUTTON_KEY3_BIT (1 << BUTTON_KEY3) + +/* Alternate function pin selections ****************************************/ + +/* SDMMC GPIO pin definitions */ +#define GPIO_SDMMC1_CMD (GPIO_SDMMC1_CMD_0 | GPIO_DRIVE_12mA) /* PD2 */ +#define GPIO_SDMMC1_D0 (GPIO_SDMMC1_D0_1 | GPIO_DRIVE_12mA) /* PC8 */ +#define GPIO_SDMMC1_D1 (GPIO_SDMMC1_D1_0 | GPIO_DRIVE_12mA) /* PC9 */ +#define GPIO_SDMMC1_D2 (GPIO_SDMMC1_D2_0 | GPIO_DRIVE_12mA) /* PC10 */ +#define GPIO_SDMMC1_D3 (GPIO_SDMMC1_D3_0 | GPIO_DRIVE_12mA) /* PC11 */ +#define GPIO_SDMMC1_CK (GPIO_SDMMC1_CK_0 | GPIO_DRIVE_12mA) /* PC12 */ + +#define GPIO_SDIO_NCD (GPIO_INPUT | GPIO_PULLUP | GPIO_SLEW_RATE_SLOW | GPIO_PORTC |GPIO_PIN13) /* PC13 */ + +/* USBHS GPIO pin definitions */ +#define GPIO_USBHS1_DM (GPIO_USBHS1_DM_0) /* PA11 */ +#define GPIO_USBHS1_DP (GPIO_USBHS1_DP_0) /* PA12 */ + +#define GPIO_USBHS1_PWRON (GPIO_OUTPUT | GPIO_PUSHPULL | GPIO_SLEW_RATE_SLOW | GPIO_PORTC |GPIO_PIN6) /* PC6 */ + +#define GPIO_USBHS2_DM (GPIO_USBHS2_DM_0) /* PB14 */ +#define GPIO_USBHS2_DP (GPIO_USBHS2_DP_0) /* PB15 */ + +#define GPIO_USBHS2_PWRON (GPIO_OUTPUT | GPIO_PUSHPULL | GPIO_SLEW_RATE_SLOW | GPIO_PORTD |GPIO_PIN12) /* PD12 */ + +/* USBHS configuration */ +#define N32_USBHS_WRPCFG_PHYCLKSEL N32_USBHS_WRPCFG_PHYCLKSEL_25 + +/* ep0-8 x 2 for IN and OUT but driver internals use byte to map + one + * bit for direction + */ +#define N32_USBHS_NENDPOINTS (9) + +/* There is 4Kb of FIFO memory in the USBHS core */ +#define N32_USBHS_FIFO_SIZE 4096 + +/* USART1 (Serial Shield) */ +#define GPIO_USART1_RX (GPIO_USART1_RX_2) /* PA10 */ +#define GPIO_USART1_TX (GPIO_USART1_TX_2) /* PA9 */ + +/* USART3 (Serial Shield) */ +#define GPIO_USART3_RX (GPIO_USART3_RX_0) /* PB10 */ +#define GPIO_USART3_TX (GPIO_USART3_TX_0) /* PB11 */ + +/* DMA mappings */ +#define DMAMAP_USART1_TX (DMAMAP_DMA1_USART1_TX) +#define DMAMAP_USART1_RX (DMAMAP_DMA1_USART1_RX) +#define DMAMAP_USART3_TX (DMAMAP_DMA1_USART3_TX) +#define DMAMAP_USART3_RX (DMAMAP_DMA1_USART3_RX) + +/* ATIM1 (CH Output) */ +#define PWM_ATIM1_NCHANNELS 4 +#define GPIO_ATIM1_CH1OUT (GPIO_ATIM1_CH1OUT_1) /* PE9 */ +#define GPIO_ATIM1_CH2OUT (GPIO_ATIM1_CH2OUT_1) /* PE11 */ +#define GPIO_ATIM1_CH3OUT (GPIO_ATIM1_CH3OUT_1) /* PE13 */ +#define GPIO_ATIM1_CH4OUT (GPIO_ATIM1_CH4OUT_1) /* PE14 */ + +/* GTIMB1 (CH Output) */ +#define PWM_GTIMB1_NCHANNELS 4 +#define GPIO_GTIMB1_CH1OUT (GPIO_GTIMB1_CH1POUT_0) /* PE5 */ +#define GPIO_GTIMB1_CH2OUT (GPIO_GTIMB1_CH2OUT_0) /* PE6 */ +#define GPIO_GTIMB1_CH3OUT (GPIO_GTIMB1_CH3OUT_0) /* PE0 */ +#define GPIO_GTIMB1_CH4OUT (GPIO_GTIMB1_CH4OUT_0) /* PE1 */ + +/* GTIMA2 (CH Input) */ +#define GPIO_GTIMA2_CH1IN (GPIO_GTIMA2_CH1IN_0) /* PA6 */ +#define GPIO_GTIMA2_CH2IN (GPIO_GTIMA2_CH1IN_0) /* PA6 */ + +/**************************************************************************** + * Public Types + ****************************************************************************/ + +#ifndef __ASSEMBLY__ + +/**************************************************************************** + * Public Data + ****************************************************************************/ + +#undef EXTERN +#if defined(__cplusplus) +#define EXTERN extern "C" +extern "C" +{ +#else +#define EXTERN extern +#endif + +/**************************************************************************** + * Public Function Prototypes + ****************************************************************************/ + +#undef EXTERN +#if defined(__cplusplus) +} +#endif +#endif /* __ASSEMBLY__ */ +#endif /* __BOARDS_ARM_N32H7_N32H762IIL7_INCLUDE_BOARD_H */ diff --git a/boards/arm/n32h7/n32h762iil7/scripts/Make.defs b/boards/arm/n32h7/n32h762iil7/scripts/Make.defs new file mode 100644 index 0000000000000..47ea46078473c --- /dev/null +++ b/boards/arm/n32h7/n32h762iil7/scripts/Make.defs @@ -0,0 +1,38 @@ +############################################################################ +# boards/arm/n32h7/n32h762iil7/scripts/Make.defs +# +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. The +# ASF licenses this file to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance with the +# License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +# +############################################################################ + +include $(TOPDIR)/.config +include $(TOPDIR)/tools/Config.mk +include $(TOPDIR)/arch/arm/src/armv7-m/Toolchain.defs + +LDSCRIPT = flash.ld + +ARCHSCRIPT += $(BOARD_DIR)$(DELIM)scripts$(DELIM)$(LDSCRIPT) + +CFLAGS := $(ARCHCFLAGS) $(ARCHOPTIMIZATION) $(ARCHCPUFLAGS) $(ARCHINCLUDES) $(ARCHDEFINES) $(EXTRAFLAGS) +CXXFLAGS := $(ARCHCXXFLAGS) $(ARCHOPTIMIZATION) $(ARCHCPUFLAGS) $(ARCHXXINCLUDES) $(ARCHDEFINES) $(EXTRAFLAGS) +CPPFLAGS := $(ARCHINCLUDES) $(ARCHDEFINES) $(EXTRAFLAGS) +AFLAGS := $(CFLAGS) -D__ASSEMBLY__ + +NXFLATLDFLAGS1 = -r -d -warn-common +NXFLATLDFLAGS2 = $(NXFLATLDFLAGS1) -T$(TOPDIR)/binfmt/libnxflat/gnu-nxflat-pcrel.ld -no-check-sections +LDNXFLATFLAGS = -e main -s 2048 diff --git a/boards/arm/n32h7/n32h762iil7/scripts/flash.ld b/boards/arm/n32h7/n32h762iil7/scripts/flash.ld new file mode 100644 index 0000000000000..2a2e840b2a985 --- /dev/null +++ b/boards/arm/n32h7/n32h762iil7/scripts/flash.ld @@ -0,0 +1,134 @@ +/* Specify the memory areas */ +MEMORY +{ +ITCMRAM (xrw) : ORIGIN = 0x00000000, LENGTH = 896K +DTCMRAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K +AXI_RAM (xrw) : ORIGIN = 0x24000000, LENGTH = 128K +AHB_RAM (xrw) : ORIGIN = 0x30000000, LENGTH = 352K +FLASH (rx ) : ORIGIN = 0x15000000, LENGTH = 896K /* 896K for code, 1024K for mtd */ +} + +/* Entry Point */ +OUTPUT_ARCH(arm) +EXTERN(_vectors) +ENTRY(_stext) + +/* Define output sections */ +SECTIONS +{ + _sivectors = LOADADDR(.vectors); + + .vectors : + { + _svectors = ABSOLUTE(.); + *(.vectors) + _evectors = ABSOLUTE(.); + } > ITCMRAM AT > FLASH + + .startup : + { + *(.rodata.g_idle_topstack) + *(.text.start) + *(.text.__start) + *(.text.n32_tcmenable) + *(.text.n32_tcm_init) + } > FLASH + + _sitext = LOADADDR(.text); + + .text : + { + _stext = ABSOLUTE(.); + *(.text .text.*) + *(.fixup) + *(.gnu.warning) + *(.rodata .rodata.*) + *(.gnu.linkonce.t.*) + *(.glue_7) + *(.glue_7t) + *(.got) + *(.gcc_except_table) + *(.gnu.linkonce.r.*) + _etext = ABSOLUTE(.); + } > ITCMRAM AT > FLASH + + .init_section : + { + _sinit = ABSOLUTE(.); + KEEP(*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) + KEEP(*(.init_array EXCLUDE_FILE(*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o) .ctors)) + _einit = ABSOLUTE(.); + } > ITCMRAM AT > FLASH + + .ARM.extab : + { + __extab_start = ABSOLUTE(.); + *(.ARM.extab*) + __extab_end = ABSOLUTE(.); + } > ITCMRAM AT > FLASH + + .ARM.exidx : + { + __exidx_start = ABSOLUTE(.); + *(.ARM.exidx*) + __exidx_end = ABSOLUTE(.); + } > ITCMRAM AT > FLASH + + .data : + { + _sdata = ABSOLUTE(.); + *(.data .data.*) + *(.gnu.linkonce.d.*) + CONSTRUCTORS + . = ALIGN(4); + _edata = ABSOLUTE(.); + } > DTCMRAM AT > FLASH + + _eronly = LOADADDR(.data); + + .bss (NOLOAD) : + { + _sbss_rel = ABSOLUTE(.); + *(.bss .bss.*) + *(.gnu.linkonce.b.*) + *(COMMON) + . = ALIGN(4); + _ebss_rel = ABSOLUTE(.); + } > DTCMRAM + + /* Emit the the D3 power domain section for locating BDMA data + * + * Static data with locate_data(".axi_ram") will be located + * at start of AXI_RAM; the rest of AXI_RAM will be added to the heap. + */ + .ahb_ram_reserve (NOLOAD) : + { + *(.ahb_ram) + . = ALIGN(4); + _ahbram_heap_start = ABSOLUTE(.); + } > AHB_RAM + + .axi_ram_reserve (NOLOAD) : + { + _sbss = ABSOLUTE(.); + *(.axi_ram) + . = ALIGN(4); + _ebss = ABSOLUTE(.); + _axiram_heap_start = ABSOLUTE(.); + } > AXI_RAM + + /* Stabs debugging sections. */ + + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_info 0 : { *(.debug_info) } + .debug_line 0 : { *(.debug_line) } + .debug_pubnames 0 : { *(.debug_pubnames) } + .debug_aranges 0 : { *(.debug_aranges) } +} diff --git a/boards/arm/n32h7/n32h762iil7/src/CMakeLists.txt b/boards/arm/n32h7/n32h762iil7/src/CMakeLists.txt new file mode 100644 index 0000000000000..3908333960f78 --- /dev/null +++ b/boards/arm/n32h7/n32h762iil7/src/CMakeLists.txt @@ -0,0 +1,72 @@ +# ############################################################################## +# boards/arm/n32h7/n32h762iil7/src/CMakeLists.txt +# +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed to the Apache Software Foundation (ASF) under one or more contributor +# license agreements. See the NOTICE file distributed with this work for +# additional information regarding copyright ownership. The ASF licenses this +# file to you under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. +# +# ############################################################################## +set(SRCS n32_boot.c n32_bringup.c) + +if(CONFIG_BOARDCTL) + list(APPEND SRCS n32_appinitialize.c) +endif() + +if(CONFIG_ARCH_LEDS) + list(APPEND SRCS n32_autoleds.c) +else() + list(APPEND SRCS n32_userleds.c) +endif() + +if(CONFIG_ARCH_BUTTONS) + list(APPEND SRCS n32_buttons.c) +endif() + +if(CONFIG_BOARDCTL_RESET) + list(APPEND SRCS n32_reset.c) +endif() + +if(CONFIG_BOARDCTL_UNIQUEID) + list(APPEND SRCS n32_uid.c) +endif() + +if(CONFIG_PWM) + list(APPEND SRCS n32_pwm.c) +endif() + +if(CONFIG_N32H7_PROGMEM) + list(APPEND SRCS n32_progmem.c) +endif() + +if(CONFIG_N32H7_SDMMC) + list(APPEND SRCS n32_sdmmc.c) +endif() + +if(CONFIG_N32H7_USBHS) + list(APPEND SRCS n32_usb.c) +endif() + +if(CONFIG_USBDEV_COMPOSITE) + list(APPEND SRCS n32_composite.c) +endif() + +if(CONFIG_MATH_CORDIC) + list(APPEND SRCS n32_cordic.c) +endif() + +target_sources(board PRIVATE ${SRCS}) + +set_property(GLOBAL PROPERTY LD_SCRIPT "${NUTTX_BOARD_DIR}/scripts/flash.ld") diff --git a/boards/arm/n32h7/n32h762iil7/src/Make.defs b/boards/arm/n32h7/n32h762iil7/src/Make.defs new file mode 100644 index 0000000000000..df47567ff8e53 --- /dev/null +++ b/boards/arm/n32h7/n32h762iil7/src/Make.defs @@ -0,0 +1,75 @@ +############################################################################ +# boards/arm/n32h7/n32h762iil7/src/Make.defs +# +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. The +# ASF licenses this file to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance with the +# License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +# +############################################################################ + +include $(TOPDIR)/Make.defs + +CSRCS = n32_boot.c n32_bringup.c + +ifeq ($(CONFIG_BOARDCTL),y) +CSRCS += n32_appinitialize.c +endif + +ifeq ($(CONFIG_ARCH_LEDS),y) +CSRCS += n32_autoleds.c +else +CSRCS += n32_userleds.c +endif + +ifeq ($(CONFIG_ARCH_BUTTONS),y) +CSRCS += n32_buttons.c +endif + +ifeq ($(CONFIG_BOARDCTL_RESET),y) +CSRCS += n32_reset.c +endif + +ifeq ($(CONFIG_BOARDCTL_UNIQUEID),y) +CSRCS += n32_uid.c +endif + +ifeq ($(CONFIG_PWM),y) +CSRCS += n32_pwm.c +endif + +ifeq ($(CONFIG_N32H7_PROGMEM),y) +CSRCS += n32_progmem.c +endif + +ifeq ($(CONFIG_N32H7_SDMMC),y) +CSRCS += n32_sdmmc.c +endif + +ifeq ($(CONFIG_N32H7_USBHS),y) +CSRCS += n32_usb.c +endif + +ifeq ($(CONFIG_USBDEV_COMPOSITE),y) +CSRCS += n32_composite.c +endif + +ifeq ($(CONFIG_MATH_CORDIC),y) +CSRCS += n32_cordic.c +endif + +DEPPATH += --dep-path board +VPATH += :board +CFLAGS += ${INCDIR_PREFIX}$(TOPDIR)$(DELIM)arch$(DELIM)$(CONFIG_ARCH)$(DELIM)src$(DELIM)board$(DELIM)board diff --git a/boards/arm/n32h7/n32h762iil7/src/Makefile b/boards/arm/n32h7/n32h762iil7/src/Makefile new file mode 100644 index 0000000000000..c64a6c8bd43c4 --- /dev/null +++ b/boards/arm/n32h7/n32h762iil7/src/Makefile @@ -0,0 +1,25 @@ +############################################################################ +# boards/arm/n32h7/n32h762iil7/src/Makefile +# +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. The +# ASF licenses this file to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance with the +# License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +# +############################################################################ + +-include $(TOPDIR)/Make.defs +include Make.defs +include $(TOPDIR)/boards/Board.mk diff --git a/boards/arm/n32h7/n32h762iil7/src/n32_appinitialize.c b/boards/arm/n32h7/n32h762iil7/src/n32_appinitialize.c new file mode 100644 index 0000000000000..049c8641f3afa --- /dev/null +++ b/boards/arm/n32h7/n32h762iil7/src/n32_appinitialize.c @@ -0,0 +1,78 @@ +/**************************************************************************** + * boards/arm/n32h7/n32h762iil7/src/n32_appinitialize.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include + +#include "n32h762iil7.h" + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: board_app_initialize + * + * Description: + * Perform application specific initialization. This function is never + * called directly from application code, but only indirectly via the + * (non-standard) boardctl() interface using the command BOARDIOC_INIT. + * + * Input Parameters: + * arg - The boardctl() argument is passed to the board_app_initialize() + * implementation without modification. The argument has no + * meaning to NuttX; the meaning of the argument is a contract + * between the board-specific initialization logic and the + * matching application logic. The value could be such things as a + * mode enumeration value, a set of DIP switch switch settings, a + * pointer to configuration data read from a file or serial FLASH, + * or whatever you would like to do with it. Every implementation + * should accept zero/NULL as a default configuration. + * + * Returned Value: + * Zero (OK) is returned on success; a negated errno value is returned on + * any failure to indicate the nature of the failure. + * + ****************************************************************************/ + +int board_app_initialize(uintptr_t arg) +{ +#ifdef CONFIG_BOARD_LATE_INITIALIZE + /* Board initialization already performed by board_late_initialize() */ + + return OK; +#else + /* Perform board-specific initialization */ + + return n32_bringup(); +#endif +} diff --git a/boards/arm/n32h7/n32h762iil7/src/n32_autoleds.c b/boards/arm/n32h7/n32h762iil7/src/n32_autoleds.c new file mode 100644 index 0000000000000..e25d37b66f2a3 --- /dev/null +++ b/boards/arm/n32h7/n32h762iil7/src/n32_autoleds.c @@ -0,0 +1,172 @@ +/**************************************************************************** + * boards/arm/n32h7/n32h762iil7/src/n32_autoleds.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include + +#include + +#include +#include + +#include "n32_gpio.h" +#include "n32h762iil7.h" + +#ifdef CONFIG_ARCH_LEDS + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +/* Indexed by BOARD_LED_ */ + +static const uint32_t g_ledmap[BOARD_NLEDS] = +{ + GPIO_LED_BLUE, + GPIO_LED_GREEN, + GPIO_LED_RED, +}; + +static bool g_initialized; + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +static void phy_set_led(int led, bool state) +{ + /* Active High */ + + n32_gpiowrite(g_ledmap[led], state); +} + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: board_autoled_initialize + ****************************************************************************/ + +void board_autoled_initialize(void) +{ + int i; + + /* Configure the LD1 GPIO for output. Initial state is OFF */ + + for (i = 0; i < nitems(g_ledmap); i++) + { + n32_configgpio(GPIO_OUTPUT | GPIO_PUSHPULL | GPIO_SLEW_RATE_SLOW | + g_ledmap[i]); + } +} + +/**************************************************************************** + * Name: board_autoled_on + ****************************************************************************/ + +void board_autoled_on(int led) +{ + switch (led) + { + default: + break; + + case LED_HEAPALLOCATE: + phy_set_led(BOARD_LED_BLUE, true); + break; + + case LED_IRQSENABLED: + phy_set_led(BOARD_LED_BLUE, false); + phy_set_led(BOARD_LED_GREEN, true); + break; + + case LED_STACKCREATED: + phy_set_led(BOARD_LED_GREEN, true); + phy_set_led(BOARD_LED_BLUE, true); + g_initialized = true; + break; + + case LED_INIRQ: + phy_set_led(BOARD_LED_BLUE, true); + break; + + case LED_SIGNAL: + phy_set_led(BOARD_LED_GREEN, true); + break; + + case LED_ASSERTION: + phy_set_led(BOARD_LED_RED, true); + phy_set_led(BOARD_LED_BLUE, true); + break; + + case LED_PANIC: + phy_set_led(BOARD_LED_RED, true); + break; + + case LED_IDLE : /* IDLE */ + phy_set_led(BOARD_LED_RED, true); + break; + } +} + +/**************************************************************************** + * Name: board_autoled_off + ****************************************************************************/ + +void board_autoled_off(int led) +{ + switch (led) + { + default: + break; + + case LED_SIGNAL: + phy_set_led(BOARD_LED_GREEN, false); + break; + + case LED_INIRQ: + phy_set_led(BOARD_LED_BLUE, false); + break; + + case LED_ASSERTION: + phy_set_led(BOARD_LED_RED, false); + phy_set_led(BOARD_LED_BLUE, false); + break; + + case LED_PANIC: + phy_set_led(BOARD_LED_RED, false); + break; + + case LED_IDLE : /* IDLE */ + phy_set_led(BOARD_LED_RED, false); + break; + } +} + +#endif /* CONFIG_ARCH_LEDS */ diff --git a/boards/arm/n32h7/n32h762iil7/src/n32_boot.c b/boards/arm/n32h7/n32h762iil7/src/n32_boot.c new file mode 100644 index 0000000000000..f5c2017b15936 --- /dev/null +++ b/boards/arm/n32h7/n32h762iil7/src/n32_boot.c @@ -0,0 +1,92 @@ +/**************************************************************************** + * boards/arm/n32h7/n32h762iil7/src/n32_boot.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include + +#include +#include + +#include "arm_internal.h" +#include "n32h762iil7.h" + +#include "n32_dma.h" +#include "n32_systemreset.h" + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: n32_boardinitialize + * + * Description: + * All N32 architectures must provide the following entry point. + * This entry point is called early in the initialization -- after all + * memory has been configured and mapped but before any devices have been + * initialized. + * + ****************************************************************************/ + +void n32_boardinitialize(void) +{ +#ifdef CONFIG_ARCH_LEDS + board_autoled_initialize(); +#endif +#ifdef CONFIG_N32H7_DMA + modifyreg32(N32_DMA1_CFG, 0, DMA_CFG_EN); + modifyreg32(N32_DMA2_CFG, 0, DMA_CFG_EN); + modifyreg32(N32_DMA3_CFG, 0, DMA_CFG_EN); +#endif +#if (defined(CONFIG_N32H7_USBHS1_HOST) || defined(CONFIG_N32H7_USBHS2_HOST)) && defined(CONFIG_USBHOST) + n32_usbinitialize(); +#endif +} + +/**************************************************************************** + * Name: board_late_initialize + * + * Description: + * If CONFIG_BOARD_LATE_INITIALIZE is selected, then an additional + * initialization call will be performed in the boot-up sequence to a + * function called board_late_initialize(). board_late_initialize() + * will be called immediately after up_initialize() is called and just + * before the initial application is started. This additional + * initialization phase may be used, for example, to initialize board- + * specific device drivers. + * + ****************************************************************************/ + +#ifdef CONFIG_BOARD_LATE_INITIALIZE +void board_late_initialize(void) +{ +#ifdef CONFIG_BOARDCTL_RESET_CAUSE + n32_get_reset_cause(); +#endif + n32_bringup(); +} +#endif diff --git a/boards/arm/n32h7/n32h762iil7/src/n32_bringup.c b/boards/arm/n32h7/n32h762iil7/src/n32_bringup.c new file mode 100644 index 0000000000000..2c432024fdeb2 --- /dev/null +++ b/boards/arm/n32h7/n32h762iil7/src/n32_bringup.c @@ -0,0 +1,386 @@ +/**************************************************************************** + * boards/arm/n32h7/n32h762iil7/src/n32_bringup.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include +#include + +#include + +#include +#include + +#include "n32h762iil7.h" + +#ifdef CONFIG_USERLED +# include +#endif + +#ifdef CONFIG_INPUT_BUTTONS +# include +#endif + +#if CONFIG_ONESHOT +#include +#endif + +#ifdef CONFIG_CAPTURE +#include +#endif + +#ifdef CONFIG_USBMONITOR +# include +#endif + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/* Forward declarations */ + +#ifdef CONFIG_TIMER +extern int n32_timer_initialize(const char *devpath, int timer); +#endif + +#ifdef CONFIG_CAPTURE +extern struct cap_lowerhalf_s *n32_cap_initialize(int timer); +#endif + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: n32_bringup + * + * Description: + * Perform architecture-specific initialization + * + * CONFIG_BOARD_LATE_INITIALIZE=y : + * Called from board_late_initialize(). + * + * CONFIG_BOARD_LATE_INITIALIZE=n && CONFIG_BOARDCTL=y && + * CONFIG_NSH_ARCHINIT: + * Called from the NSH library + * + ****************************************************************************/ + +int n32_bringup(void) +{ + int ret = OK; + + UNUSED(ret); + +#ifdef CONFIG_FS_PROCFS + /* Mount the procfs file system */ + + ret = nx_mount(NULL, N32_PROCFS_MOUNTPOINT, "procfs", 0, NULL); + if (ret < 0) + { + syslog(LOG_ERR, + "ERROR: Failed to mount the PROC filesystem: %d\n", ret); + } +#endif /* CONFIG_FS_PROCFS */ + +#if !defined(CONFIG_ARCH_LEDS) && defined(CONFIG_USERLED_LOWER) + /* Register the LED driver */ + + ret = userled_lower_initialize(LED_DRIVER_PATH); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: userled_lower_initialize() failed: %d\n", ret); + } +#endif /* !CONFIG_ARCH_LEDS && CONFIG_USERLED_LOWER */ + +#ifdef CONFIG_INPUT_BUTTONS_LOWER + /* Register the BUTTON driver */ + + ret = btn_lower_initialize(BTN_DRIVER_PATH); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: btn_lower_initialize() failed: %d\n", ret); + } +#endif /* CONFIG_INPUT_BUTTONS */ + +#ifdef CONFIG_MATH_CORDIC + /* Initialize CORDIC and register the CORDIC driver. */ + + ret = n32_cordic_setup(); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: n32_cordic_setup failed: %d\n", ret); + } +#endif + +#ifdef HAVE_USBHOST + /* Initialize USB host operation. n32_usbhost_initialize() + * starts a thread will monitor for USB connection and + * disconnection events. + */ + + ret = n32_usbhost_initialize(); + if (ret != OK) + { + syslog(LOG_ERR, + "ERROR: Failed to initialize USB host: %d\n", + ret); + } +#endif + +#ifdef HAVE_USBMONITOR + /* Start the USB Monitor */ + + ret = usbmonitor_start(); + if (ret != OK) + { + syslog(LOG_ERR, + "ERROR: Failed to start USB monitor: %d\n", + ret); + } +#endif + +#if defined(CONFIG_CDCACM) && !defined(CONFIG_CDCACM_CONSOLE) && \ + !defined(CONFIG_CDCACM_COMPOSITE) + /* Initialize CDCACM */ + + syslog(LOG_INFO, "Initialize CDCACM device\n"); + + ret = cdcacm_initialize(0, NULL); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: cdcacm_initialize failed: %d\n", ret); + } +#endif /* CONFIG_CDCACM & !CONFIG_CDCACM_CONSOLE */ + + /* ======================================================================== + * Timer driver initialization + * ======================================================================== + * Register timer devices for each enabled timer. + * Timer number mapping (see n32_tim_lowerhalf.c): + * 1..4 = ATIM1-4 + * 3..11 = GTIMA1-7 (3=GTIMA1, 4=GTIMA2, ..., 11=GTIMA7) + * 12..14= GTIMB1-3 + * 15..18= BTIM1-4 + * ======================================================================== + */ + +#ifdef CONFIG_TIMER + + mkdir("/dev/timer", 0666); + +#ifdef CONFIG_N32H7_BTIM1 + /* Register BTIM1 as /dev/timer0 (timer number 15) */ + + ret = n32_timer_initialize("/dev/timer/0", 15); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: Failed to register /dev/timer0: %d\n", ret); + } +#endif + +#ifdef CONFIG_N32H7_BTIM2 + ret = n32_timer_initialize("/dev/timer/1", 16); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: Failed to register /dev/timer/1: %d\n", ret); + } +#endif + +#ifdef CONFIG_N32H7_BTIM3 + ret = n32_timer_initialize("/dev/timer/2", 17); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: Failed to register /dev/timer/2: %d\n", ret); + } +#endif + +#ifdef CONFIG_N32H7_BTIM4 + ret = n32_timer_initialize("/dev/timer/3", 18); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: Failed to register /dev/timer/3: %d\n", ret); + } +#endif + +#ifdef CONFIG_N32H7_GTIMA1 + ret = n32_timer_initialize("/dev/timer/4", 3); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: Failed to register /dev/timer/4: %d\n", ret); + } +#endif + +#endif /* CONFIG_TIMER */ + + /* ======================================================================== + * Oneshot driver initialization + * ======================================================================== + * Register oneshot devices as /dev/oneshotX using NuttX oneshot_register() + * + * oneshot_initialize() returns a struct oneshot_lowerhalf_s * + * oneshot_register() registers it as a device node. + * ======================================================================== + */ + +#ifdef CONFIG_N32H7_ONESHOT + + mkdir("/dev/oneshot", 0666); + +# ifdef CONFIG_N32H7_GTIMA1 + struct oneshot_lowerhalf_s *oneshot; + int chan; + + /* Use GTIMA1 (timer 3) with channel 1, 20us resolution */ + + chan = (3 << 4) | 1; /* timer=3, channel=1 */ + oneshot = oneshot_initialize(chan, 20); + if (oneshot == NULL) + { + syslog(LOG_ERR, "ERROR: Failed to initialize oneshot (GTIMA1)\n"); + } + else + { + ret = oneshot_register("/dev/oneshot/0", oneshot); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: Failed to register /dev/oneshot/1/0: %d\n", + ret); + } + } + + /* Use GTIMA1 (timer 3) with channel 2, 20us resolution */ + + chan = (3 << 4) | 2; /* timer=3, channel=2 */ + oneshot = oneshot_initialize(chan, 20); + if (oneshot == NULL) + { + syslog(LOG_ERR, "ERROR: Failed to initialize oneshot (GTIMA1)\n"); + } + else + { + ret = oneshot_register("/dev/oneshot/1", oneshot); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: Failed to register /dev/oneshot/1: %d\n", + ret); + } + } + + /* Use GTIMA1 (timer 3) with channel 3, 20us resolution */ + + chan = (3 << 4) | 3; /* timer=3, channel=3 */ + oneshot = oneshot_initialize(chan, 20); + if (oneshot == NULL) + { + syslog(LOG_ERR, "ERROR: Failed to initialize oneshot (GTIMA1)\n"); + } + else + { + ret = oneshot_register("/dev/oneshot/2", oneshot); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: Failed to register /dev/oneshot/2: %d\n", + ret); + } + } + + /* Use GTIMA1 (timer 3) with channel 4, 20us resolution */ + + chan = (3 << 4) | 4; /* timer=3, channel=4 */ + oneshot = oneshot_initialize(chan, 20); + if (oneshot == NULL) + { + syslog(LOG_ERR, "ERROR: Failed to initialize oneshot (GTIMA1)\n"); + } + else + { + ret = oneshot_register("/dev/oneshot/3", oneshot); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: Failed to register /dev/oneshot/3: %d\n", + ret); + } + } +# endif /* CONFIG_N32H7_GTIMA1 */ + +#endif /* CONFIG_N32H7_ONESHOT */ + +#ifdef CONFIG_MMCSD + /* Initialize the MMC/SD driver */ + + ret = n32_sdmmc_initialize(CONFIG_NSH_MMCSDMINOR); + if (ret < 0) + { + syslog(LOG_ERR, "Failed to initialize SD slot %d: %d\n", + CONFIG_NSH_MMCSDMINOR, ret); + } +#endif + +#ifdef CONFIG_PWM + /* Initialize PWM and register the PWM device. */ + + ret = n32_pwm_setup(); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: n32_pwm_setup() failed: %d\n", ret); + } +#endif + +#ifdef CONFIG_CAPTURE +# ifdef CONFIG_N32H7_GTIMA2_CAP + struct cap_lowerhalf_s *cap = n32_cap_initialize(4); + + if (cap == NULL) + { + syslog(LOG_ERR, "ERROR: Failed to initialize capture (GTIMA2)\n"); + } + else + { + ret = cap_register("/dev/capture0", cap); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: Failed to register /dev/capture0: %d\n", + ret); + } + } +# endif /* CONFIG_N32H7_GTIMA2_CAP */ +#endif /* CONFIG_CAPTURE */ + +#ifdef CONFIG_MTD +#ifdef HAVE_PROGMEM_CHARDEV + ret = n32_progmem_init(); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: Failed to initialize MTD progmem: %d\n", + ret); + } +#endif /* HAVE_PROGMEM_CHARDEV */ +#endif /* CONFIG_MTD */ + + return OK; +} diff --git a/boards/arm/n32h7/n32h762iil7/src/n32_buttons.c b/boards/arm/n32h7/n32h762iil7/src/n32_buttons.c new file mode 100644 index 0000000000000..f7864b6f1a2ce --- /dev/null +++ b/boards/arm/n32h7/n32h762iil7/src/n32_buttons.c @@ -0,0 +1,150 @@ +/**************************************************************************** + * boards/arm/n32h7/n32h762iil7/src/n32_buttons.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include + +#include + +#include +#include + +#include "n32_gpio.h" +#include "n32h762iil7.h" +#include + +#ifdef CONFIG_ARCH_BUTTONS + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +static const uint32_t g_btncfg[NUM_BUTTONS] = +{ + GPIO_BTN_WKUP, + GPIO_BTN_KEY1, + GPIO_BTN_KEY2, + GPIO_BTN_KEY3, +}; + +static const bool g_btnactive[NUM_BUTTONS] = +{ + true, + false, + false, + false, +}; + +/**************************************************************************** + * Name: board_button_initialize + * + * Description: + * board_button_initialize() must be called to initialize button resources. + * After that, board_buttons() may be called to collect the current state + * of all buttons or board_button_irq() may be called to register button + * interrupt handlers. + * + ****************************************************************************/ + +uint32_t board_button_initialize(void) +{ + int i; + + /* Configure button GPIOs for input */ + + for (i = 0; i < nitems(g_btncfg); i++) + { + n32_configgpio(g_btncfg[i]); + } + + return NUM_BUTTONS; +} + +/**************************************************************************** + * Name: board_buttons + ****************************************************************************/ + +uint32_t board_buttons(void) +{ + uint32_t ret = 0; + int i; + + for (i = 0; i < nitems(g_btncfg); i++) + { + ret |= ((n32_gpioread(g_btncfg[i]) == g_btnactive[i] ? 1 : 0) ? + (1 << i) : 0); + } + + return ret; +} + +/**************************************************************************** + * Button support. + * + * Description: + * board_button_initialize() must be called to initialize button resources. + * After that, board_buttons() may be called to collect the current state + * of all buttons or board_button_irq() may be called to register button + * interrupt handlers. + * + * After board_button_initialize() has been called, board_buttons() may be + * called to collect the state of all buttons. board_buttons() returns a + * 32-bit bit set with each bit associated with a button. See the + * BUTTON_*_BIT definitions in board.h for the meaning of each bit. + * + * board_button_irq() may be called to register an interrupt handler that + * will be called when a button is depressed or released. The ID value is + * a button enumeration value that uniquely identifies a button resource. + * See the BUTTON_* definitions in board.h for the meaning of enumeration + * value. + * + ****************************************************************************/ + +#ifdef CONFIG_ARCH_IRQBUTTONS +int board_button_irq(int id, xcpt_t irqhandler, void *arg) +{ + int ret = -EINVAL; + + if (id >= 0 && id < nitems(g_btncfg)) + { + if (irqhandler != NULL) + { + ret = n32_gpiosetevent(g_btncfg[id], true, true, true, + irqhandler, arg); + } + else + { + ret = n32_gpiosetevent(g_btncfg[id], false, false, false, + irqhandler, arg); + } + } + + return ret; +} +#endif +#endif /* CONFIG_ARCH_BUTTONS */ diff --git a/boards/arm/n32h7/n32h762iil7/src/n32_composite.c b/boards/arm/n32h7/n32h762iil7/src/n32_composite.c new file mode 100644 index 0000000000000..5dc09eb400d32 --- /dev/null +++ b/boards/arm/n32h7/n32h762iil7/src/n32_composite.c @@ -0,0 +1,349 @@ +/**************************************************************************** + * boards/arm/n32h7/n32h762iil7/src/n32_composite.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +#define COMPOSITE0_DEV (3) + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +#ifdef CONFIG_USBMSC_COMPOSITE +static void *g_mschandle; +#endif + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: board_mscclassobject + * + * Description: + * If the mass storage class driver is part of composite device, then + * its instantiation and configuration is a multi-step, board-specific, + * process (See comments for usbmsc_configure below). In this case, + * board-specific logic must provide board_mscclassobject(). + * + * board_mscclassobject() is called from the composite driver. It must + * encapsulate the instantiation and configuration of the mass storage + * class and the return the mass storage device's class driver instance + * to the composite driver. + * + * Input Parameters: + * classdev - The location to return the mass storage class' device + * instance. + * + * Returned Value: + * 0 on success; a negated errno on failure + * + ****************************************************************************/ + +#ifdef CONFIG_USBMSC_COMPOSITE +static int board_mscclassobject(int minor, + struct usbdev_devinfo_s *devinfo, + struct usbdevclass_driver_s **classdev) +{ + int ret; + + DEBUGASSERT(g_mschandle == NULL); + + /* Configure the mass storage device */ + + uinfo("Configuring with NLUNS=1\n"); + ret = usbmsc_configure(1, &g_mschandle); + if (ret < 0) + { + uerr("ERROR: usbmsc_configure failed: %d\n", -ret); + return ret; + } + + uinfo("MSC handle=%p\n", g_mschandle); + + /* Bind the LUN(s) */ + + uinfo("Bind LUN=0 to /dev/mmcsd0\n"); + ret = usbmsc_bindlun(g_mschandle, "/dev/mmcsd0", 0, 0, 0, false); + if (ret < 0) + { + uerr("ERROR: usbmsc_bindlun failed for LUN 1 at /dev/mmcsd0: %d\n", + ret); + usbmsc_uninitialize(g_mschandle); + g_mschandle = NULL; + return ret; + } + + /* Get the mass storage device's class object */ + + ret = usbmsc_classobject(g_mschandle, devinfo, classdev); + if (ret < 0) + { + uerr("ERROR: usbmsc_classobject failed: %d\n", -ret); + usbmsc_uninitialize(g_mschandle); + g_mschandle = NULL; + } + + return ret; +} +#endif + +/**************************************************************************** + * Name: board_mscuninitialize + * + * Description: + * Un-initialize the USB storage class driver. + * This is just an application specific wrapper for usbmsc_unitialize() + * that is called form the composite device logic. + * + * Input Parameters: + * classdev - The class driver instance previously given to the composite + * driver by board_mscclassobject(). + * + * Returned Value: + * None + * + ****************************************************************************/ + +#ifdef CONFIG_USBMSC_COMPOSITE +static void board_mscuninitialize(struct usbdevclass_driver_s *classdev) +{ + if (g_mschandle) + { + usbmsc_uninitialize(g_mschandle); + } + + g_mschandle = NULL; +} +#endif + +/**************************************************************************** + * Name: board_composite_connect + * + * Description: + * Connect the USB composite device on the specified USB device port for + * configuration 0. + * + * Input Parameters: + * port - The USB device port. + * + * Returned Value: + * A non-NULL handle value is returned on success. NULL is returned on + * any failure. + * + ****************************************************************************/ + +static void *board_composite0_connect(int port) +{ + struct composite_devdesc_s dev[COMPOSITE0_DEV]; + int ifnobase = 0; + int strbase = COMPOSITE_NSTRIDS; + int dev_idx = 0; + int epin = 1; + int epout = 1; + +#ifdef CONFIG_RNDIS_COMPOSITE + /* Configure the RNDIS USB device */ + + /* Ask the rndis driver to fill in the constants we didn't + * know here. + */ + + usbdev_rndis_get_composite_devdesc(&dev[dev_idx]); + + /* Interfaces */ + + dev[dev_idx].devinfo.ifnobase = ifnobase; + dev[dev_idx].minor = 0; + + /* Strings */ + + dev[dev_idx].devinfo.strbase = strbase; + + /* Endpoints */ + + dev[dev_idx].devinfo.epno[RNDIS_EP_INTIN_IDX] = epin++; + dev[dev_idx].devinfo.epno[RNDIS_EP_BULKIN_IDX] = epin++; + dev[dev_idx].devinfo.epno[RNDIS_EP_BULKOUT_IDX] = epout++; + + /* Count up the base numbers */ + + ifnobase += dev[dev_idx].devinfo.ninterfaces; + strbase += dev[dev_idx].devinfo.nstrings; + + dev_idx += 1; +#endif + +#ifdef CONFIG_CDCACM_COMPOSITE + /* Configure the CDC/ACM device */ + + /* Ask the cdcacm driver to fill in the constants we didn't + * know here. + */ + + cdcacm_get_composite_devdesc(&dev[dev_idx]); + + /* Overwrite and correct some values... */ + + /* The callback functions for the CDC/ACM class */ + + dev[dev_idx].classobject = cdcacm_classobject; + dev[dev_idx].uninitialize = cdcacm_uninitialize; + + /* Interfaces */ + + dev[dev_idx].devinfo.ifnobase = ifnobase; /* Offset to Interface-IDs */ + dev[dev_idx].minor = 0; /* The minor interface number */ + + /* Strings */ + + dev[dev_idx].devinfo.strbase = strbase; /* Offset to String Numbers */ + + /* Endpoints */ + + dev[dev_idx].devinfo.epno[CDCACM_EP_INTIN_IDX] = epin++; + dev[dev_idx].devinfo.epno[CDCACM_EP_BULKIN_IDX] = epin++; + dev[dev_idx].devinfo.epno[CDCACM_EP_BULKOUT_IDX] = epout++; + + /* Count up the base numbers */ + + ifnobase += dev[dev_idx].devinfo.ninterfaces; + strbase += dev[dev_idx].devinfo.nstrings; + + dev_idx += 1; +#endif + +#ifdef CONFIG_USBMSC_COMPOSITE + /* Configure the mass storage device device */ + + /* Ask the usbmsc driver to fill in the constants we didn't + * know here. + */ + + usbmsc_get_composite_devdesc(&dev[dev_idx]); + + /* Overwrite and correct some values... */ + + /* The callback functions for the USBMSC class */ + + dev[dev_idx].classobject = board_mscclassobject; + dev[dev_idx].uninitialize = board_mscuninitialize; + + /* Interfaces */ + + dev[dev_idx].devinfo.ifnobase = ifnobase; /* Offset to Interface-IDs */ + dev[dev_idx].minor = 0; /* The minor interface number */ + + /* Strings */ + + dev[dev_idx].devinfo.strbase = strbase; /* Offset to String Numbers */ + + /* Endpoints */ + + dev[dev_idx].devinfo.epno[USBMSC_EP_BULKIN_IDX] = epin++; + dev[dev_idx].devinfo.epno[USBMSC_EP_BULKOUT_IDX] = epout++; + + /* Count up the base numbers */ + + ifnobase += dev[dev_idx].devinfo.ninterfaces; + strbase += dev[dev_idx].devinfo.nstrings; + + dev_idx += 1; +#endif + + /* Sanity checks */ + + DEBUGASSERT(epin < N32_USBHS_NENDPOINTS); + DEBUGASSERT(epout < N32_USBHS_NENDPOINTS); + + return composite_initialize(composite_getdevdescs(), dev, dev_idx); +} + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: board_composite_initialize + * + * Description: + * Perform architecture specific initialization of a composite USB device. + * + ****************************************************************************/ + +int board_composite_initialize(int port) +{ + return OK; +} + +/**************************************************************************** + * Name: board_composite_connect + * + * Description: + * Connect the USB composite device on the specified USB device port using + * the specified configuration. The interpretation of the configid is + * board specific. + * + * Input Parameters: + * port - The USB device port. + * configid - The USB composite configuration + * + * Returned Value: + * A non-NULL handle value is returned on success. NULL is returned on + * any failure. + * + ****************************************************************************/ + +void *board_composite_connect(int port, int configid) +{ + if (configid == 0) + { + return board_composite0_connect(port); + } + else + { + return NULL; + } +} diff --git a/boards/arm/n32h7/n32h762iil7/src/n32_cordic.c b/boards/arm/n32h7/n32h762iil7/src/n32_cordic.c new file mode 100644 index 0000000000000..91a923ef4a23d --- /dev/null +++ b/boards/arm/n32h7/n32h762iil7/src/n32_cordic.c @@ -0,0 +1,89 @@ +/**************************************************************************** + * boards/arm/n32h7/n32h762iil7/src/n32_cordic.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include + +#include +#include + +#include "n32_cordic.h" + +#include "n32h762iil7.h" + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: n32_cordic_setup + * + * Description: + * Initialize CORDIC and register the CORDIC device. + * + ****************************************************************************/ + +int n32_cordic_setup(void) +{ + struct cordic_lowerhalf_s *cordic = NULL; + static bool initialized = false; + int ret = OK; + + /* Have we already initialized? */ + + if (!initialized) + { + /* Call n32_cordicinitialize() to get an instance of the CORDIC + * interface + */ + + cordic = n32_cordicinitialize(); + if (!cordic) + { + tmrerr("Failed to get the N32 CORDIC lower half\n"); + ret = -ENODEV; + goto errout; + } + + /* Register the CORDIC driver at "/dev/cordic0" */ + + ret = cordic_register("/dev/cordic0", cordic); + if (ret < 0) + { + tmrerr("cordic_register failed: %d\n", ret); + goto errout; + } + + /* Now we are initialized */ + + initialized = true; + } + +errout: + return ret; +} diff --git a/boards/arm/n32h7/n32h762iil7/src/n32_progmem.c b/boards/arm/n32h7/n32h762iil7/src/n32_progmem.c new file mode 100644 index 0000000000000..930c180e229e5 --- /dev/null +++ b/boards/arm/n32h7/n32h762iil7/src/n32_progmem.c @@ -0,0 +1,109 @@ +/**************************************************************************** + * boards/arm/n32h7/n32h762iil7/src/n32_progmem.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "n32_flash.h" +#include "n32h762iil7.h" +#include + +#ifdef HAVE_PROGMEM_CHARDEV + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +static struct mtd_dev_s *g_progmem_mtd; + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: n32_progmem_init + * + * Initialize Progmem partition. Read partition information, and use + * these data for creating MTD. + * + * Input Parameters: + * None + * + * Returned Value: + * 0 if success or a negative value if fail. + * + ****************************************************************************/ + +int n32_progmem_init(void) +{ + int ret = 0; + + g_progmem_mtd = progmem_initialize(); + if (g_progmem_mtd == NULL) + { + ferr("ERROR: Failed to get progmem flash MTD\n"); + ret = -EIO; + } + else + { + ret = register_mtddriver("/dev/mtd0", g_progmem_mtd, 0775, NULL); + if (ret < 0) + { + ferr("ERROR: Failed to register progmem flash MTD driver\n"); + } + } + +#ifdef CONFIG_FS_LITTLEFS + /* Mount the LittleFS file system */ + + ret = nx_mount("/dev/mtd0", "/flash", "littlefs", 0, "autoformat"); + if (ret < 0) + { + syslog(LOG_ERR, + "ERROR: Failed to mount LittleFS at /flash: %d\n", ret); + return ret; + } +#endif /* CONFIG_FS_LITTLEFS */ + + return ret; +} + +#endif /* HAVE_PROGMEM_CHARDEV */ diff --git a/boards/arm/n32h7/n32h762iil7/src/n32_pwm.c b/boards/arm/n32h7/n32h762iil7/src/n32_pwm.c new file mode 100644 index 0000000000000..3e48306b6e593 --- /dev/null +++ b/boards/arm/n32h7/n32h762iil7/src/n32_pwm.c @@ -0,0 +1,131 @@ +/**************************************************************************** + * boards/arm/n32h7/n32h762iil7/src/n32_pwm.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include + +#include +#include +#include + +#include "chip.h" +#include "arm_internal.h" +#include "n32_pwm.h" +#include "n32h762iil7.h" + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* Configuration ************************************************************/ + +#define HAVE_PWM 1 + +#ifndef CONFIG_PWM +# undef HAVE_PWM +#endif + +#ifndef CONFIG_N32H7_ATIM1 +# undef HAVE_PWM +#endif + +#ifndef CONFIG_N32H7_ATIM1_PWM +# undef HAVE_PWM +#endif + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: n32_pwm_setup + * + * Description: + * Initialize PWM and register the PWM device. + * + ****************************************************************************/ + +int n32_pwm_setup(void) +{ +#ifdef HAVE_PWM + static bool initialized = false; + struct pwm_lowerhalf_s *pwm; + int ret; + + /* Have we already initialized? */ + + if (!initialized) + { + mkdir("/dev/pwm", 0666); + + /* Get an instance of the PWM interface */ + + pwm = n32_pwminitialize(N32H762IIL7_PWM0TIMER); + if (!pwm) + { + tmrerr("ERROR: Failed to get the N32H7 PWM lower half\n"); + return -ENODEV; + } + + /* Register the PWM driver at "/dev/pwm/0" */ + + ret = pwm_register("/dev/pwm/0", pwm); + if (ret < 0) + { + tmrerr("ERROR: pwm_register failed: %d\n", ret); + return ret; + } + + /* Get an instance of the PWM interface */ + + pwm = n32_pwminitialize(N32H762IIL7_PWM1TIMER); + if (!pwm) + { + tmrerr("ERROR: Failed to get the N32H7 PWM lower half\n"); + return -ENODEV; + } + + /* Register the PWM driver at "/dev/pwm/1" */ + + ret = pwm_register("/dev/pwm/1", pwm); + if (ret < 0) + { + tmrerr("ERROR: pwm_register failed: %d\n", ret); + return ret; + } + + /* Now we are initialized */ + + initialized = true; + } + + return OK; +#else + return -ENODEV; +#endif +} diff --git a/boards/arm/n32h7/n32h762iil7/src/n32_reset.c b/boards/arm/n32h7/n32h762iil7/src/n32_reset.c new file mode 100644 index 0000000000000..93360e2c79a10 --- /dev/null +++ b/boards/arm/n32h7/n32h762iil7/src/n32_reset.c @@ -0,0 +1,136 @@ +/**************************************************************************** + * boards/arm/n32h7/n32h762iil7/src/n32_reset.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include + +#include "n32_systemreset.h" + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: board_reset_cause + * + * Description: + * Get the cause of last board reset. This should call architecture + * specific logic to handle the register read. + * + * Input Parameters: + * cause - Pointer to boardioc_reset_cause_s structure to which the + * reason (and potentially subreason) is saved. + * + * Returned Value: + * This functions should always return succesfully with 0. We save + * BOARDIOC_RESETCAUSE_UNKOWN in cause structure if we are + * not able to get last reset cause from HW (which is unlikely). + * + ****************************************************************************/ + +#ifdef CONFIG_BOARDCTL_RESET_CAUSE +int board_reset_cause(struct boardioc_reset_cause_s *cause) +{ + int rst_cause; + + /* Get the reset cause from hardware */ + + rst_cause = n32_get_reset_cause(); + + switch (rst_cause) + { + case N32H7_RESET_PWRUP: + + /* Power up */ + + cause->cause = BOARDIOC_RESETCAUSE_SYS_CHIPPOR; + break; + case N32H7_RESET_BOR: + + /* Brown-out reset (BOR) error */ + + cause->cause = BOARDIOC_RESETCAUSE_SYS_BOR; + break; + case N32H7_RESET_WDOG: + + /* Watchdog error */ + + cause->cause = BOARDIOC_RESETCAUSE_CPU_MWDT; + break; + case N32H7_RESET_SWRST: + + /* SW reset */ + + cause->cause = BOARDIOC_RESETCAUSE_CPU_SOFT; + break; + case N32H7_RESET_NRST: + + /* Reset from user by pressing reset button */ + + cause->cause = BOARDIOC_RESETCAUSE_PIN; + break; + default: + + /* Unknown cause returned from HW */ + + cause->cause = BOARDIOC_RESETCAUSE_UNKOWN; + break; + } + + return 0; +} +#endif /* CONFIG_BOARDCTL_RESET_CAUSE */ + +/**************************************************************************** + * Name: board_reset + * + * Description: + * Reset board. Support for this function is required by board-level + * logic if CONFIG_BOARDCTL_RESET is selected. + * + * Input Parameters: + * status - Status information provided with the reset event. This + * meaning of this status information is board-specific. If not + * used by a board, the value zero may be provided in calls to + * board_reset(). + * + * Returned Value: + * If this function returns, then it was not possible to power-off the + * board due to some constraints. The return value int this case is a + * board-specific reason for the failure to shutdown. + * + ****************************************************************************/ +#ifdef CONFIG_BOARDCTL_RESET + +int board_reset(int status) +{ + up_systemreset(); + return 0; +} + +#endif /* CONFIG_BOARDCTL_RESET */ diff --git a/boards/arm/n32h7/n32h762iil7/src/n32_sdmmc.c b/boards/arm/n32h7/n32h762iil7/src/n32_sdmmc.c new file mode 100644 index 0000000000000..b378d0d1ed138 --- /dev/null +++ b/boards/arm/n32h7/n32h762iil7/src/n32_sdmmc.c @@ -0,0 +1,159 @@ +/**************************************************************************** + * boards/arm/n32h7/n32h762iil7/src/n32_sdmmc.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include +#include +#include +#include + +#include +#include + +#include "n32_gpio.h" +#include "n32_sdmmc.h" +#include "n32h762iil7.h" + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* Configuration ************************************************************/ + +/* Card detections requires card support and a card detection GPIO */ + +#define HAVE_NCD 1 +#if !defined(HAVE_SDIO) || !defined(GPIO_SDIO_NCD) +# undef HAVE_NCD +#endif + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +static struct sdio_dev_s *g_sdio_dev; +#ifdef HAVE_NCD +static bool g_sd_inserted; +#endif + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: n32_ncd_interrupt + * + * Description: + * Card detect interrupt handler. + * + ****************************************************************************/ + +#ifdef HAVE_NCD +static int n32_ncd_interrupt(int irq, void *context, void *param) +{ + bool present; + + present = !n32_gpioread(GPIO_SDIO_NCD); + if (present != g_sd_inserted) + { + sdio_mediachange(g_sdio_dev, present); + g_sd_inserted = present; + } + + return OK; +} +#endif + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: n32_sdmmc_initialize + * + * Description: + * Initialize SDMMC-based MMC/SD card support + * + ****************************************************************************/ + +int n32_sdmmc_initialize(int minor) +{ + int ret; + +#ifdef HAVE_NCD + /* Configure the card detect GPIO */ + + n32_configgpio(GPIO_SDIO_NCD); + + /* Register an interrupt handler for the card detect pin */ + + n32_gpiosetevent(GPIO_SDIO_NCD, true, true, true, + n32_ncd_interrupt, NULL); +#endif + + /* Mount the SDIO-based MMC/SD block driver */ + + /* First, get an instance of the SDIO interface */ + + finfo("Initializing SDIO slot %d\n", SDIO_SLOTNO); + + g_sdio_dev = sdio_initialize(SDIO_SLOTNO); + if (!g_sdio_dev) + { + ferr("ERROR: Failed to initialize SDIO slot %d\n", SDIO_SLOTNO); + return -ENODEV; + } + + /* Now bind the SDIO interface to the MMC/SD driver */ + + finfo("Bind SDIO to the MMC/SD driver, minor=%d\n", minor); + + ret = mmcsd_slotinitialize(minor, g_sdio_dev); + if (ret != OK) + { + ferr("ERROR: Failed to bind SDIO to the MMC/SD driver: %d\n", ret); + return ret; + } + + finfo("Successfully bound SDIO to the MMC/SD driver\n"); + +#ifdef HAVE_NCD + /* Use SD card detect pin to check if a card is g_sd_inserted */ + + g_sd_inserted = !n32_gpioread(GPIO_SDIO_NCD); + finfo("Card detect : %d\n", g_sd_inserted); + + sdio_mediachange(g_sdio_dev, g_sd_inserted); +#else + /* Assume that the SD card is inserted. What choice do we have? */ + + sdio_mediachange(g_sdio_dev, true); +#endif + + return OK; +} diff --git a/boards/arm/n32h7/n32h762iil7/src/n32_uid.c b/boards/arm/n32h7/n32h762iil7/src/n32_uid.c new file mode 100644 index 0000000000000..f53b65e0e9859 --- /dev/null +++ b/boards/arm/n32h7/n32h762iil7/src/n32_uid.c @@ -0,0 +1,69 @@ +/**************************************************************************** + * boards/arm/n32h7/n32h762iil7/src/n32_uid.c + * + * SPDX-License-Identifier: BSD-3-Clause + * SPDX-FileCopyrightText: 2015 Marawan Ragab. All rights reserved. + * SPDX-FileContributor: Marawan Ragab + * SPDX-FileContributor: David Sidrane + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include +#include "n32_uid.h" + +#include + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +#if defined(CONFIG_BOARDCTL_UNIQUEID) +int board_uniqueid(uint8_t *uniqueid) +{ + if (uniqueid == NULL) + { + return -EINVAL; + } + + n32_get_uniqueid(uniqueid); + return OK; +} +#endif diff --git a/boards/arm/n32h7/n32h762iil7/src/n32_usb.c b/boards/arm/n32h7/n32h762iil7/src/n32_usb.c new file mode 100644 index 0000000000000..5d77c55070222 --- /dev/null +++ b/boards/arm/n32h7/n32h762iil7/src/n32_usb.c @@ -0,0 +1,305 @@ +/**************************************************************************** + * boards/arm/n32h7/n32h762iil7/src/n32_usb.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include "arm_internal.h" +#include "chip.h" +#include "n32_gpio.h" +#include "n32h762iil7.h" + +#ifdef CONFIG_N32H7_USBHS + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +#if defined(CONFIG_USBDEV) || defined(CONFIG_USBHOST) +# define HAVE_USB 1 +#else +# warning "CONFIG_N32H7_USBHS is enabled but neither CONFIG_USBDEV nor CONFIG_USBHOST" +# undef HAVE_USB +#endif + +#ifndef CONFIG_N32H762IIL7_USBHOST_PRIO +# define CONFIG_N32H762IIL7_USBHOST_PRIO 100 +#endif + +#ifndef CONFIG_N32H762IIL7_USBHOST_STACKSIZE +# define CONFIG_N32H762IIL7_USBHOST_STACKSIZE 2048 +#endif + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +#ifdef CONFIG_USBHOST +static struct usbhost_connection_s *g_usbconn; +extern struct usbhost_connection_s *n32_usbhshost_initialize(int controller); +#endif + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: usbhost_waiter + * + * Description: + * Wait for USB devices to be connected. + * + ****************************************************************************/ + +#ifdef CONFIG_USBHOST +static int usbhost_waiter(int argc, char *argv[]) +{ + struct usbhost_hubport_s *hport; + + uinfo("Running\n"); + for (; ; ) + { + /* Wait for the device to change state */ + + DEBUGVERIFY(CONN_WAIT(g_usbconn, &hport)); + uinfo("%s\n", hport->connected ? "connected" : "disconnected"); + + /* Did we just become connected? */ + + if (hport->connected) + { + /* Yes.. enumerate the newly connected device */ + + CONN_ENUMERATE(g_usbconn, hport); + } + } + + /* Keep the compiler from complaining */ + + return 0; +} +#endif + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: n32_usbinitialize + * + * Description: + * Called from n32_usbinitialize very early in initialization to setup + * USB-related GPIO pins for the n32h762iil7 board. + * + ****************************************************************************/ + +void n32_usbinitialize(void) +{ + /* The OTG FS has an internal soft pull-up. + * No GPIO configuration is required + */ + + /* Configure the OTG FS Power On GPIOs + */ + +#ifdef CONFIG_N32H7_USBHS +# ifdef CONFIG_USBHOST +# if defined(CONFIG_N32H7_USBHS1_HOST) +# define GPIO_USBHS_PWRON GPIO_USBHS1_PWRON + n32_configgpio(GPIO_USBHS1_PWRON); +# endif +# if defined(CONFIG_N32H7_USBHS2_HOST) +# define GPIO_USBHS_PWRON GPIO_USBHS2_PWRON + n32_configgpio(GPIO_USBHS2_PWRON); +# endif +# endif +#endif +} + +/**************************************************************************** + * Name: n32_usbhost_initialize + * + * Description: + * Called at application startup time to initialize the USB host + * functionality. + * This function will start a thread that will monitor for device + * connection/disconnection events. + * + ****************************************************************************/ + +#ifdef CONFIG_USBHOST +int n32_usbhost_initialize(void) +{ + int ret; + + /* First, register all of the class drivers needed to support the drivers + * that we care about: + */ + + uinfo("Register class drivers\n"); + +#ifdef CONFIG_USBHOST_HUB + /* Initialize USB hub class support */ + + ret = usbhost_hub_initialize(); + if (ret < 0) + { + uerr("ERROR: usbhost_hub_initialize failed: %d\n", ret); + } +#endif + +#ifdef CONFIG_USBHOST_MSC + /* Register the USB mass storage class class */ + + ret = usbhost_msc_initialize(); + if (ret != OK) + { + uerr("ERROR: Failed to register the mass storage class: %d\n", ret); + } +#endif + +#ifdef CONFIG_USBHOST_CDCACM + /* Register the CDC/ACM serial class */ + + ret = usbhost_cdcacm_initialize(); + if (ret != OK) + { + uerr("ERROR: Failed to register the CDC/ACM serial class: %d\n", ret); + } +#endif + +#ifdef CONFIG_USBHOST_HIDKBD + /* Initialize the HID keyboard class */ + + ret = usbhost_kbdinit(); + if (ret != OK) + { + uerr("ERROR: Failed to register the HID keyboard class\n"); + } +#endif + +#ifdef CONFIG_USBHOST_HIDMOUSE + /* Initialize the HID mouse class */ + + ret = usbhost_mouse_init(); + if (ret != OK) + { + uerr("ERROR: Failed to register the HID mouse class\n"); + } +#endif + + /* Then get an instance of the USB host interface */ + + uinfo("Initialize USB host\n"); + g_usbconn = n32_usbhshost_initialize(0); + if (g_usbconn) + { + /* Start a thread to handle device connection. */ + + uinfo("Start usbhost_waiter\n"); + + ret = kthread_create("usbhost", CONFIG_N32H762IIL7_USBHOST_PRIO, + CONFIG_N32H762IIL7_USBHOST_STACKSIZE, + usbhost_waiter, NULL); + return ret < 0 ? -ENOEXEC : OK; + } + + return -ENODEV; +} +#endif + +/**************************************************************************** + * Name: n32_usbhs_vbusdrive + * + * Description: + * Enable/disable driving of VBUS 5V output. This function must be + * provided be each platform that implements the N32H7 USBHS host + * interface + * + * "On-chip 5 V VBUS generation is not supported. For this reason, a + * charge pump or, if 5 V are available on the application board, a + * basic power switch, must be added externally to drive the 5 V VBUS + * line. The external charge pump can be driven by any GPIO output. + * When the application decides to power on VBUS using the chosen GPIO, + * it must also set the port power bit in the host port control and status + * register (PPWR bit in OTG_FS_HPRT). + * + * "The application uses this field to control power to this port, and + * the core clears this bit on an overcurrent condition." + * + * Input Parameters: + * iface - For future growth to handle multiple USB host interface. + * Should be zero. + * enable - true: enable VBUS power; false: disable VBUS power + * + * Returned Value: + * None + * + ****************************************************************************/ + +#ifdef CONFIG_USBHOST +void n32_usbhs_vbusdrive(int iface, bool enable) +{ + DEBUGASSERT(iface == 0); + + /* Set the Power Switch by driving the active high enable pin */ + + n32_gpiowrite(GPIO_USBHS_PWRON, enable); +} +#endif + +/**************************************************************************** + * Name: stm32_usbsuspend + * + * Description: + * Board logic must provide the stm32_usbsuspend logic if the USBDEV + * driver is used. This function is called whenever the USB enters or + * leaves suspend mode. This is an opportunity for the board logic to + * shutdown clocks, power, etc. while the USB is suspended. + * + ****************************************************************************/ + +#ifdef CONFIG_USBDEV +void n32_usbsuspend(struct usbdev_s *dev, bool resume) +{ + uinfo("resume: %d\n", resume); +} +#endif + +#endif /* CONFIG_STM32_OTGFS */ diff --git a/boards/arm/n32h7/n32h762iil7/src/n32_userleds.c b/boards/arm/n32h7/n32h762iil7/src/n32_userleds.c new file mode 100644 index 0000000000000..a96576a84203a --- /dev/null +++ b/boards/arm/n32h7/n32h762iil7/src/n32_userleds.c @@ -0,0 +1,159 @@ +/**************************************************************************** + * boards/arm/n32h7/n32h762iil7/src/n32_userleds.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include + +#include + +#include +#include + +#include "n32_gpio.h" +#include "n32h762iil7.h" + +#ifndef CONFIG_ARCH_LEDS + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +/* This array maps an LED number to GPIO pin configuration and is indexed by + * BOARD_LED_ + */ + +static const uint32_t g_ledcfg[BOARD_NLEDS] = +{ + GPIO_LED_BLUE, + GPIO_LED_GREEN, + GPIO_LED_RED, +}; + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: board_userled_initialize + * + * Description: + * If CONFIG_ARCH_LEDS is defined, then NuttX will control the on-board + * LEDs. If CONFIG_ARCH_LEDS is not defined, then the + * board_userled_initialize() is available to initialize the LED from user + * application logic. + * + ****************************************************************************/ + +uint32_t board_userled_initialize(void) +{ + int i; + + /* Configure LED1-3 GPIOs for output */ + + for (i = 0; i < nitems(g_ledcfg); i++) + { + n32_configgpio(GPIO_OUTPUT | GPIO_PUSHPULL | GPIO_SLEW_RATE_SLOW | + g_ledcfg[i]); + } + + return BOARD_NLEDS; +} + +/**************************************************************************** + * Name: board_userled + * + * Description: + * If CONFIG_ARCH_LEDS is defined, then NuttX will control the on-board + * LEDs. If CONFIG_ARCH_LEDS is not defined, then the board_userled() is + * available to control the LED from user application logic. + * + ****************************************************************************/ + +void board_userled(int led, bool ledon) +{ + if ((unsigned)led < nitems(g_ledcfg)) + { + n32_gpiowrite(g_ledcfg[led], ledon); + } +} + +/**************************************************************************** + * Name: board_userled_all + * + * Description: + * If CONFIG_ARCH_LEDS is defined, then NuttX will control the on-board + * LEDs. If CONFIG_ARCH_LEDS is not defined, then the board_userled_all() + * is available to control the LED from user application logic. NOTE: since + * there is only a single LED on-board, this is function is not very useful. + * + ****************************************************************************/ + +void board_userled_all(uint32_t ledset) +{ + int i; + + /* Configure LED1-3 GPIOs for output */ + + for (i = 0; i < nitems(g_ledcfg); i++) + { + n32_gpiowrite(g_ledcfg[i], (ledset & (1 << i)) != 0); + } +} + +/**************************************************************************** + * Name: board_userled_getall + * + * Description: + * This interface may be used by application specific logic to read the + * state of all board LEDs. Definitions for the led set member + * identification is provided in the board-specific board.h header file + * that may be included like: + * + * #included + * + * If CONFIG_ARCH_LEDS is defined, then NuttX will control the on-board + * LEDs. If CONFIG_ARCH_LEDS is not defined, then this interfaces may be + * available to check the LEDs directly from user board logic or indirectly + * user applications (via the common LED character driver). + * + ****************************************************************************/ + +#if defined(CONFIG_USERLED_LOWER_READSTATE) +void board_userled_getall(uint32_t *ledset) +{ + int i; + + *ledset = 0; + for (i = 0; i < nitems(g_ledcfg); i++) + { + *ledset |= (n32_gpioread(g_ledcfg[i]) << i); + } +} +#endif + +#endif /* !CONFIG_ARCH_LEDS */ diff --git a/boards/arm/n32h7/n32h762iil7/src/n32h762iil7.h b/boards/arm/n32h7/n32h762iil7/src/n32h762iil7.h new file mode 100644 index 0000000000000..fe2d8953462f7 --- /dev/null +++ b/boards/arm/n32h7/n32h762iil7/src/n32h762iil7.h @@ -0,0 +1,306 @@ +/**************************************************************************** + * boards/arm/n32h7/n32h762iil7/src/n32h762iil7.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __BOARDS_ARM_N32H7_N32H762IIL7_SRC_N32H762IIL7_H +#define __BOARDS_ARM_N32H7_N32H762IIL7_SRC_N32H762IIL7_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include + +#include + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* Configuration ************************************************************/ + +#define HAVE_PROC 1 +#define HAVE_SDIO 1 +#define HAVE_USBDEV 1 +#define HAVE_USBHOST 1 +#define HAVE_USBMONITOR 1 +#define HAVE_MTDCONFIG 1 +#define HAVE_PROGMEM_CHARDEV 1 + +/* Can't support USB host or device features if USB OTG FS is not enabled */ + +#ifndef CONFIG_N32H7_USBHS +# undef HAVE_USBDEV +# undef HAVE_USBHOST +#endif + +/* Can't support USB device if USB device is not enabled */ + +#ifndef CONFIG_USBDEV +# undef HAVE_USBDEV +#endif + +/* Can't support USB host is USB host is not enabled */ + +#ifndef CONFIG_USBHOST +# undef HAVE_USBHOST +#endif + +/* Check if we should enable the USB monitor before starting NSH */ + +#ifndef CONFIG_USBMONITOR +# undef HAVE_USBMONITOR +#endif + +#ifndef HAVE_USBDEV +# undef CONFIG_USBDEV_TRACE +#endif + +#ifndef HAVE_USBHOST +# undef CONFIG_USBHOST_TRACE +#endif + +#if !defined(CONFIG_USBDEV_TRACE) && !defined(CONFIG_USBHOST_TRACE) +# undef HAVE_USBMONITOR +#endif + +#if !defined(CONFIG_N32H7_PROGMEM) || !defined(CONFIG_MTD_PROGMEM) +# undef HAVE_PROGMEM_CHARDEV +#endif + +/* This is the on-chip progmem memory driver minor number */ + +#define PROGMEM_MTD_MINOR 0 + +/* Can't support MMC/SD features if mountpoints are disabled or if SDIO + * support is not enabled. + */ + +#if defined(CONFIG_DISABLE_MOUNTPOINT) || !defined(CONFIG_N32H7_SDMMC) +# undef HAVE_SDIO +#endif + +#define SDIO_SLOTNO 0 /* Only one slot */ + +#ifdef HAVE_SDIO +# if !defined(CONFIG_NSH_MMCSDSLOTNO) +# define CONFIG_NSH_MMCSDSLOTNO SDIO_SLOTNO +# elif CONFIG_NSH_MMCSDSLOTNO != 0 +# warning "Only one MMC/SD slot, slot 0" +# undef CONFIG_NSH_MMCSDSLOTNO +# define CONFIG_NSH_MMCSDSLOTNO SDIO_SLOTNO +# endif +#endif + +/* procfs File System */ + +#ifdef CONFIG_FS_PROCFS +# ifdef CONFIG_NSH_PROC_MOUNTPOINT +# define N32_PROCFS_MOUNTPOINT CONFIG_NSH_PROC_MOUNTPOINT +# else +# define N32_PROCFS_MOUNTPOINT "/proc" +# endif +#endif + +/* Check if we can support the RTC driver */ + +#define HAVE_RTC_DRIVER 0 +#if !defined(CONFIG_RTC) || !defined(CONFIG_RTC_DRIVER) +# undef HAVE_RTC_DRIVER +#endif + +/* LED + * + * The N32H762IIL7 board has numerous LEDs but only three, LD1 a Green LED, + * LD2 a Blue LED and LD3 a Red LED, that can be controlled by software. The + * following definitions assume the default Solder Bridges are installed. + */ + +#define GPIO_LD1 (GPIO_PORTA | GPIO_PIN1) +#define GPIO_LD2 (GPIO_PORTA | GPIO_PIN2) +#define GPIO_LD3 (GPIO_PORTA | GPIO_PIN3) + +#define GPIO_LED_RED GPIO_LD1 +#define GPIO_LED_GREEN GPIO_LD2 +#define GPIO_LED_BLUE GPIO_LD3 + +#define LED_DRIVER_PATH "/dev/userleds" + +/* BUTTONS + * + * The Blue pushbutton B1, labeled "User", is connected to GPIO PC13. + * A high value will be sensed when the button is depressed. + * Note: + * 1) That the EXTI is included in the definition to enable an interrupt + * on this IO. + * 2) The following definitions assume the default Solder Bridges are + * installed. + */ + +#define GPIO_BTN_WKUP (GPIO_PORTA | GPIO_PIN0 | GPIO_INPUT | GPIO_FLOAT) +#define GPIO_BTN_KEY1 (GPIO_PORTC | GPIO_PIN0 | GPIO_INPUT | GPIO_PULLUP) +#define GPIO_BTN_KEY2 (GPIO_PORTC | GPIO_PIN1 | GPIO_INPUT | GPIO_PULLUP) +#define GPIO_BTN_KEY3 (GPIO_PORTC | GPIO_PIN4 | GPIO_INPUT | GPIO_PULLUP) + +#define BTN_DRIVER_PATH "/dev/buttons" + +/* PWM */ + +#define N32H762IIL7_PWM0TIMER 1 +#define N32H762IIL7_PWM1TIMER 12 + +/**************************************************************************** + * Public Function Prototypes + ****************************************************************************/ + +/**************************************************************************** + * Name: n32_bringup + * + * Description: + * Perform architecture-specific initialization + * + * CONFIG_BOARD_LATE_INITIALIZE=y : + * Called from board_late_initialize(). + * + * CONFIG_BOARD_LATE_INITIALIZE=n && CONFIG_BOARDCTL=y && + * CONFIG_NSH_ARCHINIT: + * Called from the NSH library + * + ****************************************************************************/ + +int n32_bringup(void); + +/**************************************************************************** + * Name: n32_spidev_initialize + * + * Description: + * Called to configure SPI chip select GPIO pins for the + * Nucleo-H743ZI board. + * + ****************************************************************************/ + +#ifdef CONFIG_N32H7_SPI +void n32_spidev_initialize(void); +#endif + +/**************************************************************************** + * Name: n32_adc_setup + * + * Description: + * Initialize ADC and register the ADC driver. + * + ****************************************************************************/ + +#ifdef CONFIG_ADC +int n32_adc_setup(void); +#endif + +/**************************************************************************** + * Name: n32_gpio_initialize + * + * Description: + * Initialize GPIO-Driver. + * + ****************************************************************************/ + +#if defined(CONFIG_DEV_GPIO) && !defined(CONFIG_GPIO_LOWER_HALF) +int n32_gpio_initialize(void); +#endif + +/**************************************************************************** + * Name: n32_usbinitialize + * + * Description: + * Called from n32_usbinitialize very early in inialization to setup + * USB-related GPIO pins for the NUCLEO-H743ZI board. + * + ****************************************************************************/ + +#ifdef CONFIG_N32H7_USBHS +void weak_function n32_usbinitialize(void); +#endif + +/**************************************************************************** + * Name: n32_usbhost_initialize + * + * Description: + * Called at application startup time to initialize the USB host + * functionality. This function will start a thread that will monitor for + * device connection/disconnection events. + * + ****************************************************************************/ + +#if (defined(CONFIG_N32H7_USBHS1_HOST) || defined(CONFIG_N32H7_USBHS2_HOST)) && defined(CONFIG_USBHOST) +int n32_usbhost_initialize(void); +#endif + +/**************************************************************************** + * Name: n32_pwm_setup + * + * Description: + * Initialize PWM and register the PWM device. + * + ****************************************************************************/ + +#ifdef CONFIG_PWM +int n32_pwm_setup(void); +#endif + +/**************************************************************************** + * Name: n32_mtd_initialize + * + * Description: + * Initialize MTD drivers. + * + ****************************************************************************/ +#ifdef CONFIG_MTD + +#ifdef HAVE_PROGMEM_CHARDEV +int n32_progmem_init(void); +#endif /* HAVE_PROGMEM_CHARDEV */ +#endif + +/**************************************************************************** + * Name: n32_cordic_setup + * + * Description: + * Initialize CORDIC peripheral for the board. + * + ****************************************************************************/ + +#ifdef CONFIG_MATH_CORDIC +int n32_cordic_setup(void); +#endif + +/**************************************************************************** + * Name: n32_sdmmc_initialize + * + * Description: + * Initialize SDMMC-based MMC/SD card support + * + ****************************************************************************/ + +#ifdef CONFIG_MMCSD_SDIO +int n32_sdmmc_initialize(int minor); +#endif + +#endif /* __BOARDS_ARM_N32H7_N32H762IIL7_SRC_N32H762IIL7_H */ diff --git a/tools/generate_cmake_presets.py b/tools/generate_cmake_presets.py new file mode 100644 index 0000000000000..17cbfcc4f3917 --- /dev/null +++ b/tools/generate_cmake_presets.py @@ -0,0 +1,60 @@ +#!/usr/bin/env python3 +""" +generate_cmake_presets.py - Generate CMake User Presets for all NuttX boards/configs. +Run from NuttX root directory, or as a Git hook. +""" + +import json +import os +import subprocess +import sys + +# --- Locate NuttX root (parent of the tools/ directory) --- +SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) +NUTTX_ROOT = os.path.dirname(SCRIPT_DIR) # since script is under tools/ + +os.chdir(NUTTX_ROOT) + +GENERATED_PRESETS_FILE = "CMakeUserPresets.json" +USER_PRESETS_FILE = "" + +print(f"[generate_cmake_presets] NuttX root: {NUTTX_ROOT}") + +# --- Run ./tools/configure.sh -L to get all board configs --- +try: + output = subprocess.check_output( + ["./tools/configure.sh", "-L"], text=True, stderr=subprocess.DEVNULL + ) +except FileNotFoundError: + print("Error: ./tools/configure.sh not found. Are you in the NuttX root directory?") + sys.exit(1) +except subprocess.CalledProcessError as e: + print(f"Error running configure.sh: {e}") + sys.exit(1) + +configs = [] +for line in output.strip().splitlines(): + line = line.strip() + if line and ":" in line and not line.startswith("Board Configurations:"): + configs.append(line) + +if not configs: + print("Warning: No board configurations found.") + # Keep empty list + +presets = [] +for config in configs: + board, conf = config.split(":", 1) + preset_name = f"{board}_{conf}".replace("-", "_").replace(".", "_") + presets.append( + { + "name": preset_name, + "inherits": "default", + "cacheVariables": {"BOARD_CONFIG": config}, + } + ) + +with open(GENERATED_PRESETS_FILE, "w") as f: + json.dump({"version": 3, "configurePresets": presets}, f, indent=2) + +print(f"Generated {len(presets)} board presets in '{GENERATED_PRESETS_FILE}'")