From dcf85835544166598a4ebcae87fa7959ae45c8ec Mon Sep 17 00:00:00 2001 From: maartin0 Date: Fri, 27 Jun 2025 21:24:38 +0100 Subject: [PATCH 1/2] add Arduino LED and Wi-Fi SDKs Adds two esp32 example projects using the espressif/arduino-esp32 library to demonstrate Wi-Fi scanning and a simple LED blink example --- .github/workflows/build-arduino-esp.yml | 46 ++++++++++++ README.md | 2 + arduino-esp32-led-blink-sdk/CMakeLists.txt | 6 ++ arduino-esp32-led-blink-sdk/README.md | 57 +++++++++++++++ arduino-esp32-led-blink-sdk/diagram.json | 36 +++++++++ .../main/BridgingHeader.h | 27 +++++++ .../main/CMakeLists.txt | 73 +++++++++++++++++++ .../main/Kconfig.projbuild | 8 ++ arduino-esp32-led-blink-sdk/main/Led.swift | 23 ++++++ arduino-esp32-led-blink-sdk/main/Main.swift | 28 +++++++ arduino-esp32-led-blink-sdk/main/component.mk | 8 ++ .../main/idf_component.yml | 19 +++++ .../sdkconfig.defaults | 4 + arduino-esp32-led-blink-sdk/wokwi.toml | 8 ++ arduino-esp32-wifi-scan-sdk/CMakeLists.txt | 6 ++ arduino-esp32-wifi-scan-sdk/README.md | 48 ++++++++++++ .../main/ArduinoString.swift | 23 ++++++ .../main/BridgingHeader.h | 31 ++++++++ .../main/CMakeLists.txt | 73 +++++++++++++++++++ .../main/Kconfig.projbuild | 8 ++ arduino-esp32-wifi-scan-sdk/main/Main.swift | 26 +++++++ arduino-esp32-wifi-scan-sdk/main/component.mk | 8 ++ .../main/idf_component.yml | 19 +++++ .../sdkconfig.defaults | 4 + 24 files changed, 591 insertions(+) create mode 100644 .github/workflows/build-arduino-esp.yml create mode 100644 arduino-esp32-led-blink-sdk/CMakeLists.txt create mode 100644 arduino-esp32-led-blink-sdk/README.md create mode 100644 arduino-esp32-led-blink-sdk/diagram.json create mode 100644 arduino-esp32-led-blink-sdk/main/BridgingHeader.h create mode 100644 arduino-esp32-led-blink-sdk/main/CMakeLists.txt create mode 100644 arduino-esp32-led-blink-sdk/main/Kconfig.projbuild create mode 100644 arduino-esp32-led-blink-sdk/main/Led.swift create mode 100644 arduino-esp32-led-blink-sdk/main/Main.swift create mode 100644 arduino-esp32-led-blink-sdk/main/component.mk create mode 100644 arduino-esp32-led-blink-sdk/main/idf_component.yml create mode 100644 arduino-esp32-led-blink-sdk/sdkconfig.defaults create mode 100644 arduino-esp32-led-blink-sdk/wokwi.toml create mode 100644 arduino-esp32-wifi-scan-sdk/CMakeLists.txt create mode 100644 arduino-esp32-wifi-scan-sdk/README.md create mode 100644 arduino-esp32-wifi-scan-sdk/main/ArduinoString.swift create mode 100644 arduino-esp32-wifi-scan-sdk/main/BridgingHeader.h create mode 100644 arduino-esp32-wifi-scan-sdk/main/CMakeLists.txt create mode 100644 arduino-esp32-wifi-scan-sdk/main/Kconfig.projbuild create mode 100644 arduino-esp32-wifi-scan-sdk/main/Main.swift create mode 100644 arduino-esp32-wifi-scan-sdk/main/component.mk create mode 100644 arduino-esp32-wifi-scan-sdk/main/idf_component.yml create mode 100644 arduino-esp32-wifi-scan-sdk/sdkconfig.defaults diff --git a/.github/workflows/build-arduino-esp.yml b/.github/workflows/build-arduino-esp.yml new file mode 100644 index 00000000..c9b49ee6 --- /dev/null +++ b/.github/workflows/build-arduino-esp.yml @@ -0,0 +1,46 @@ +name: Build Arduino ESP Examples + +on: + push: + branches: ["main"] + pull_request: + branches: ["main"] + schedule: + # Build on Mondays at 9am PST every week + - cron: '0 17 * * 1' + +jobs: + build-arduino-esp: + runs-on: ubuntu-24.04 + container: espressif/idf:v5.4 + strategy: + fail-fast: false + matrix: + example: [arduino-esp32-led-blink-sdk, arduino-esp32-wifi-scan-sdk] + swift: [swift-DEVELOPMENT-SNAPSHOT-2025-03-17-a] + + steps: + - name: Checkout repo + uses: actions/checkout@v4 + + - name: Install apt dependencies + run: | + apt-get -qq update + apt-get -qq -y install pkg-config libstdc++6 + + - name: Install ${{ matrix.swift }} + run: | + wget -q https://download.swift.org/development/ubuntu2404/${{ matrix.swift }}/${{ matrix.swift }}-ubuntu24.04.tar.gz + tar xzf ${{ matrix.swift }}-ubuntu24.04.tar.gz + export PATH="`pwd`/${{ matrix.swift }}-ubuntu24.04/usr/bin/:$PATH" + echo "PATH=$PATH" >> $GITHUB_ENV + swiftc --version + + - name: Build ${{ matrix.example }} + run: | + cd $IDF_PATH + . ./export.sh + cd - + cd ${{ matrix.example }} + idf.py set-target esp32c6 + idf.py build diff --git a/README.md b/README.md index 22199d9a..cb7805b1 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,8 @@ Each example in this repository contains build and deployment instructions, howe | Name | Platform | SDK | Description | Photo | | ---- | -------- | --- | ----------- | ----- | +| [arduino-esp32-led-blink-sdk](./arduino-esp32-led-blink-sdk) | ESP32-C6-DevKitC-1 | ESP-IDF SDK | Blink an LED repeatedly with Swift, the ESP-IDF and the Arduino libraries. | | +| [arduino-esp32-wifi-scan-sdk](./arduino-esp32-wifi-scan-sdk) | ESP32-C6-DevKitC-1 | ESP-IDF SDK | Scan for WiFi networks using Swift, the ESP-IDF and the Arduino libraries. | | | [esp32-led-blink-sdk](./esp32-led-blink-sdk) | ESP32-C6-Bug | ESP-IDF SDK | Blink an LED repeatedly with Swift & the ESP-IDF. | | | [esp32-led-strip-sdk](./esp32-led-strip-sdk) | ESP32-C6-DevKitC-1 | ESP-IDF SDK | Control NeoPixel LEDs with Swift & the ESP-IDF. | | | [harmony](./harmony) | Raspberry Pi Pico W | Pico SDK | A bluetooth speaker and ferrofluidic music visualizer. Firmware, Electrical, and Mechanical designs fully available. | | diff --git a/arduino-esp32-led-blink-sdk/CMakeLists.txt b/arduino-esp32-led-blink-sdk/CMakeLists.txt new file mode 100644 index 00000000..bda69778 --- /dev/null +++ b/arduino-esp32-led-blink-sdk/CMakeLists.txt @@ -0,0 +1,6 @@ +# The following lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.5) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(app-template) diff --git a/arduino-esp32-led-blink-sdk/README.md b/arduino-esp32-led-blink-sdk/README.md new file mode 100644 index 00000000..1ad5e52c --- /dev/null +++ b/arduino-esp32-led-blink-sdk/README.md @@ -0,0 +1,57 @@ +# arduino-esp32-led-blink-sdk + +This example demonstrates how to integrate with the ESP-IDF SDK via CMake and how to use the Arduino GPIO library to control an LED from Swift. This example is specifically made for the RISC-V MCUs from ESP32 (the Xtensa MCUs are not currently supported by Swift). + +## Requirements + +- Set up **version v5.4** (required for this `arduino-esp32` version) of the [ESP-IDF](https://docs.espressif.com/projects/esp-idf/en/v5.4/esp32/) development environment. Follow the steps in the [ESP32-C6 "Get Started" guide](https://docs.espressif.com/projects/esp-idf/en/v5.4/esp32c6/get-started/index.html). + - Make sure you specifically set up development for the RISC-V ESP32-C6, and not the Xtensa based products. + - If you have a different version of ESP-IDF installed, make sure to also delete `~/.espressif` before running `install.sh` + +```sh +rm -rf ~/esp-idf ~/.espressif # Remove old installation files +git clone --recurse-submodules https://github.com/espressif/esp-idf.git ~/esp-idf +cd ~/esp-idf +git checkout release/v5.4 +git submodule update --init --recursive +./install.sh +idf_tools.py install-python-env +. ./export.sh +``` + +- Before trying to use Swift with the ESP-IDF SDK, make sure your environment works and can build the provided C/C++ sample projects, in particular: + - Try building and running the "get-started/blink" example from ESP-IDF written in C. + +## Building + +- Make sure you have a recent nightly Swift toolchain that has Embedded Swift support. +- If needed, run export.sh to get access to the idf.py script from ESP-IDF. +- Specify the nightly toolchain to be used via the `TOOLCHAINS` environment variable and the target board type by using `idf.py set-target`. +```sh +cd arduino-esp32-led-blink-sdk +export TOOLCHAINS=... +. /export.sh +idf.py set-target esp32c6 +idf.py build +``` + +## Running + +- Connect the Esp32-C6-Bug board (or any other board with integrated LED on GPIO pin 8) over a USB cable to your Mac. Alternatively you can just connect external LED to GPIO pin 8 on any other board. +- Connect RX pin of USB-UART converter to TX0 pin of your board if you need serial output. You may also need to connect GND converter pin to the GND pin of the board. +- Use `idf.py` to upload the firmware and to run it: + +```sh +idf.py flash +``` + +- The LED should be blinking now. + +### Simulating in VS Code + +- Build the project, to generate binaries for simulation +- Install [Wokwi for VS Code](https://docs.wokwi.com/vscode/getting-started/). +- Open the `diagram.json` file. +- Click the Play button to start simulation. +- Click the Pause button to freeze simulation and display states of GPIOs. + diff --git a/arduino-esp32-led-blink-sdk/diagram.json b/arduino-esp32-led-blink-sdk/diagram.json new file mode 100644 index 00000000..7d76a534 --- /dev/null +++ b/arduino-esp32-led-blink-sdk/diagram.json @@ -0,0 +1,36 @@ +{ + "version": 1, + "author": "", + "editor": "wokwi", + "parts": [ + { + "type": "board-esp32-c6-devkitc-1", + "id": "esp", + "top": 0, + "left": 0, + "attrs": { "builder": "esp-idf" } + }, + { + "type": "wokwi-resistor", + "id": "r1", + "top": 119.15, + "left": -76.8, + "attrs": { "value": "1000" } + }, + { + "type": "wokwi-led", + "id": "led1", + "top": 25.2, + "left": -111.4, + "attrs": { "color": "red" } + } + ], + "connections": [ + [ "esp:TX", "$serialMonitor:RX", "", [] ], + [ "esp:RX", "$serialMonitor:TX", "", [] ], + [ "r1:2", "esp:8", "red", [ "v0" ] ], + [ "r1:1", "led1:A", "red", [ "h0" ] ], + [ "led1:C", "esp:GND.1", "black", [ "v0" ] ] + ], + "dependencies": {} +} diff --git a/arduino-esp32-led-blink-sdk/main/BridgingHeader.h b/arduino-esp32-led-blink-sdk/main/BridgingHeader.h new file mode 100644 index 00000000..c0a19063 --- /dev/null +++ b/arduino-esp32-led-blink-sdk/main/BridgingHeader.h @@ -0,0 +1,27 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift open source project +// +// Copyright (c) 2025 Apple Inc. and the Swift project authors. +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +// For some reason swiftc's clang++ defines `__UINT32_TYPE__` as `unsigned int` (g++'s x86 behaviour) not `long unsigned int` (g++'s riscv32 behaviour) +#undef __UINT32_TYPE__ +#undef uint32_t +#define __UINT32_TYPE__ long unsigned int +#define uint32_t __UINT32_TYPE__ +#define _UINT32_T_DECLARED + +#include +#include + +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "driver/gpio.h" +#include "sdkconfig.h" + +#include diff --git a/arduino-esp32-led-blink-sdk/main/CMakeLists.txt b/arduino-esp32-led-blink-sdk/main/CMakeLists.txt new file mode 100644 index 00000000..a1314a17 --- /dev/null +++ b/arduino-esp32-led-blink-sdk/main/CMakeLists.txt @@ -0,0 +1,73 @@ +# Register the app as an IDF component +idf_component_register( + SRCS /dev/null # We don't have any C++ sources + PRIV_INCLUDE_DIRS "." + REQUIRES arduino +) + +idf_build_get_property(target IDF_TARGET) +idf_build_get_property(arch IDF_TARGET_ARCH) + +if("${arch}" STREQUAL "xtensa") + message(FATAL_ERROR "Not supported target: ${target}") +endif() + +# Extract the -march flag and remove any vendor-specific extensions (_x*) +string(REGEX MATCH "-march=[^ ]+" march_flag "${CMAKE_C_FLAGS}") +string(REGEX REPLACE "_x[^ ]*" "" march_flag "${march_flag}") + +# Extract the -mabi flag or set a default value if not present +string(REGEX MATCH "-mabi=[^ ]+" mabi_flag "${CMAKE_C_FLAGS}") +if("${mabi_flag}" STREQUAL "") + set(mabi_flag "-mabi=ilp32") +endif() + +# Clear the default COMPILE_OPTIONS which include a lot of C/C++ specific compiler flags that the Swift compiler will not accept +get_target_property(var ${COMPONENT_LIB} COMPILE_OPTIONS) +set_target_properties(${COMPONENT_LIB} PROPERTIES COMPILE_OPTIONS "") + +# Compute -Xcc flags to set up the C and C++ header search paths for Swift (for bridging header). +set(SWIFT_INCLUDES) +foreach(dir ${CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES}) + string(CONCAT SWIFT_INCLUDES ${SWIFT_INCLUDES} "-Xcc ") + string(CONCAT SWIFT_INCLUDES ${SWIFT_INCLUDES} "-I${dir} ") +endforeach() +foreach(dir ${CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES}) + string(CONCAT SWIFT_INCLUDES ${SWIFT_INCLUDES} "-Xcc ") + string(CONCAT SWIFT_INCLUDES ${SWIFT_INCLUDES} "-I${dir} ") +endforeach() + +# Swift compiler flags to build in Embedded Swift mode, optimize for size, choose the right ISA, ABI, etc. +target_compile_options(${COMPONENT_LIB} PUBLIC "$<$:SHELL: + -target riscv32-none-none-eabi + -Xfrontend -function-sections -enable-experimental-feature Embedded -wmo -parse-as-library -Osize -cxx-interoperability-mode=default + -Xcc ${march_flag} -Xcc ${mabi_flag} -Xcc -fno-pic -Xcc -fno-pie -Xcc -fno-exceptions + + -pch-output-dir /tmp + -Xfrontend -enable-single-module-llvm-emission + + ${SWIFT_INCLUDES} + + -import-bridging-header ${CMAKE_CURRENT_LIST_DIR}/BridgingHeader.h + >") + +# Enable Swift support in CMake, force Whole Module builds (required by Embedded Swift), and use "CMAKE_Swift_COMPILER_WORKS" to +# skip the trial compilations which don't (yet) correctly work when cross-compiling. +set(CMAKE_Swift_COMPILER_WORKS YES) +set(CMAKE_Swift_COMPILATION_MODE_DEFAULT wholemodule) +set(CMAKE_Swift_COMPILATION_MODE wholemodule) +enable_language(Swift) + +# List of Swift source files to build. +target_sources(${COMPONENT_LIB} + PRIVATE + Main.swift + Led.swift +) + +add_custom_command( + TARGET ${COMPONENT_LIB} + POST_BUILD + COMMAND ${CMAKE_OBJCOPY} --remove-section .swift_modhash + $ $ +) diff --git a/arduino-esp32-led-blink-sdk/main/Kconfig.projbuild b/arduino-esp32-led-blink-sdk/main/Kconfig.projbuild new file mode 100644 index 00000000..94f2f0e1 --- /dev/null +++ b/arduino-esp32-led-blink-sdk/main/Kconfig.projbuild @@ -0,0 +1,8 @@ +# put here your custom config value +menu "Example Configuration" +config LED_BLINK_INTERVAL_MS + int "LED blinking interval / ms" + default 500 + help + Interval in milliseconds between turning the LED on/off +endmenu diff --git a/arduino-esp32-led-blink-sdk/main/Led.swift b/arduino-esp32-led-blink-sdk/main/Led.swift new file mode 100644 index 00000000..8a504146 --- /dev/null +++ b/arduino-esp32-led-blink-sdk/main/Led.swift @@ -0,0 +1,23 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift open source project +// +// Copyright (c) 2025 Apple Inc. and the Swift project authors. +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +// A simple "overlay" to provide nicer APIs in Swift +struct Led { + var ledPin: UInt8 + init(gpioPin: gpio_num_t) { + ledPin = UInt8(gpioPin.rawValue) + pinMode(ledPin, UInt8(OUTPUT)) + } + + func setLed(value: Bool) { + digitalWrite(ledPin, value ? 1 : 0) + } +} diff --git a/arduino-esp32-led-blink-sdk/main/Main.swift b/arduino-esp32-led-blink-sdk/main/Main.swift new file mode 100644 index 00000000..7509e935 --- /dev/null +++ b/arduino-esp32-led-blink-sdk/main/Main.swift @@ -0,0 +1,28 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift open source project +// +// Copyright (c) 2025 Apple Inc. and the Swift project authors. +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +// The code will blink an LED on GPIO8. To change the pin, modify Led(gpioPin: GPIO_NUM_8) + +var ledValue: Bool = false +var led: Led? + +@_cdecl("_Z5setupv") +func setup() { + print("Hello from Swift on ESP32-C6!") + led = Led(gpioPin: GPIO_NUM_8) +} + +@_cdecl("_Z4loopv") +func loop() { + led?.setLed(value: ledValue) + ledValue.toggle() // Toggle the boolean value + delay(UInt(CONFIG_LED_BLINK_INTERVAL_MS)) +} diff --git a/arduino-esp32-led-blink-sdk/main/component.mk b/arduino-esp32-led-blink-sdk/main/component.mk new file mode 100644 index 00000000..61f8990c --- /dev/null +++ b/arduino-esp32-led-blink-sdk/main/component.mk @@ -0,0 +1,8 @@ +# +# Main component makefile. +# +# This Makefile can be left empty. By default, it will take the sources in the +# src/ directory, compile them and link them into lib(subdirectory_name).a +# in the build directory. This behaviour is entirely configurable, +# please read the ESP-IDF documents if you need to do this. +# diff --git a/arduino-esp32-led-blink-sdk/main/idf_component.yml b/arduino-esp32-led-blink-sdk/main/idf_component.yml new file mode 100644 index 00000000..cdf6c3da --- /dev/null +++ b/arduino-esp32-led-blink-sdk/main/idf_component.yml @@ -0,0 +1,19 @@ +## IDF Component Manager Manifest File +dependencies: + # # Put list of dependencies here + # # For components maintained by Espressif: + # component: "~1.0.0" + # # For 3rd party components: + # username/component: ">=1.0.0,<2.0.0" + # username2/component2: + # version: "~1.0.0" + # # For transient dependencies `public` flag can be set. + # # `public` flag doesn't have an effect dependencies of the `main` component. + # # All dependencies of `main` are public by default. + # public: true + + ## Required IDF version + idf: ">=5.3,<5.5" + arduino: # Can't be defined as the espressif/arduino-esp32 shorthand since the library name must be 'arduino' for libraries that depend on it + git: https://github.com/espressif/arduino-esp32.git + version: 3.2.0 diff --git a/arduino-esp32-led-blink-sdk/sdkconfig.defaults b/arduino-esp32-led-blink-sdk/sdkconfig.defaults new file mode 100644 index 00000000..d4f9762e --- /dev/null +++ b/arduino-esp32-led-blink-sdk/sdkconfig.defaults @@ -0,0 +1,4 @@ +CONFIG_FREERTOS_HZ=1000 +CONFIG_MBEDTLS_PSK_MODES=y +CONFIG_MBEDTLS_KEY_EXCHANGE_PSK=y +CONFIG_AUTOSTART_ARDUINO=y diff --git a/arduino-esp32-led-blink-sdk/wokwi.toml b/arduino-esp32-led-blink-sdk/wokwi.toml new file mode 100644 index 00000000..ab73f47b --- /dev/null +++ b/arduino-esp32-led-blink-sdk/wokwi.toml @@ -0,0 +1,8 @@ +# Wokwi Configuration File +# Reference: https://docs.wokwi.com/vscode/project-config +[wokwi] +version = 1 +firmware = 'build/flasher_args.json' +elf = 'build/main.elf' +# gdbServerPort=3333 + diff --git a/arduino-esp32-wifi-scan-sdk/CMakeLists.txt b/arduino-esp32-wifi-scan-sdk/CMakeLists.txt new file mode 100644 index 00000000..bda69778 --- /dev/null +++ b/arduino-esp32-wifi-scan-sdk/CMakeLists.txt @@ -0,0 +1,6 @@ +# The following lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.5) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(app-template) diff --git a/arduino-esp32-wifi-scan-sdk/README.md b/arduino-esp32-wifi-scan-sdk/README.md new file mode 100644 index 00000000..b7f3389d --- /dev/null +++ b/arduino-esp32-wifi-scan-sdk/README.md @@ -0,0 +1,48 @@ +# arduino-esp32-wifi-scan-sdk + +This example demonstrates how to integrate with the ESP-IDF SDK via CMake and how to use the Arduino Wi-Fi library to scan for nearby networks from Swift. This example is specifically made for the RISC-V MCUs from ESP32 (the Xtensa MCUs are not currently supported by Swift). + +## Requirements + +- Set up **version v5.4** (required for this `arduino-esp32` version) of the [ESP-IDF](https://docs.espressif.com/projects/esp-idf/en/v5.4/esp32/) development environment. Follow the steps in the [ESP32-C6 "Get Started" guide](https://docs.espressif.com/projects/esp-idf/en/v5.4/esp32c6/get-started/index.html). + - Make sure you specifically set up development for the RISC-V ESP32-C6, and not the Xtensa based products. + - If you have a different version of ESP-IDF installed, make sure to also delete `~/.espressif` before running `install.sh` + +```sh +rm -rf ~/esp-idf ~/.espressif # Remove old installation files +git clone --recurse-submodules https://github.com/espressif/esp-idf.git ~/esp-idf +cd ~/esp-idf +git checkout release/v5.4 +git submodule update --init --recursive +./install.sh +idf_tools.py install-python-env +. ./export.sh +``` + +- Before trying to use Swift with the ESP-IDF SDK, make sure your environment works and can build the provided C/C++ sample projects, in particular: + - Try building and running the "get-started/blink" example from ESP-IDF written in C. + +## Building + +- Make sure you have a recent nightly Swift toolchain that has Embedded Swift support. +- If needed, run export.sh to get access to the idf.py script from ESP-IDF. +- Specify the nightly toolchain to be used via the `TOOLCHAINS` environment variable and the target board type by using `idf.py set-target`. +```sh +cd arduino-esp32-wifi-scan-sdk +export TOOLCHAINS=... +. /export.sh +idf.py set-target esp32c6 +idf.py build +``` + +## Running + +- Connect any board with an ESP32-C6 +- Connect the RX and TX pins of your USB-UART converter to the TX0 and RX0 respective pins of your board. You may also need to connect the GND converter pin to the GND pin of the board. +- Use `idf.py` to upload the firmware and to run it: + +```sh +idf.py flash monitor +``` + +- You should see a list of discovered Wi-Fi APs being printed every 5 seconds diff --git a/arduino-esp32-wifi-scan-sdk/main/ArduinoString.swift b/arduino-esp32-wifi-scan-sdk/main/ArduinoString.swift new file mode 100644 index 00000000..a3610a63 --- /dev/null +++ b/arduino-esp32-wifi-scan-sdk/main/ArduinoString.swift @@ -0,0 +1,23 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift open source project +// +// Copyright (c) 2025 Apple Inc. and the Swift project authors. +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +public typealias ArduinoString = String + +extension ArduinoString: CustomStringConvertible { + public var description: Swift.String { + let size = self.length() + 1 + let buffer = UnsafeMutablePointer.allocate(capacity: Int(size)) + self.getBytes(buffer, size) + let result = Swift.String(cString: UnsafePointer(buffer)) + buffer.deallocate() + return result + } +} diff --git a/arduino-esp32-wifi-scan-sdk/main/BridgingHeader.h b/arduino-esp32-wifi-scan-sdk/main/BridgingHeader.h new file mode 100644 index 00000000..3d6ac7e7 --- /dev/null +++ b/arduino-esp32-wifi-scan-sdk/main/BridgingHeader.h @@ -0,0 +1,31 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift open source project +// +// Copyright (c) 2025 Apple Inc. and the Swift project authors. +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +// For some reason swiftc's clang++ defines `__UINT32_TYPE__` as `unsigned int` (g++'s x86 behaviour) not `long unsigned int` (g++'s riscv32 behaviour) +#undef __UINT32_TYPE__ +#undef uint32_t +#define __UINT32_TYPE__ long unsigned int +#define uint32_t __UINT32_TYPE__ +#define _UINT32_T_DECLARED + +#include +#include +#include +#include + +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "driver/gpio.h" +#include "sdkconfig.h" + +#include +#include +#include diff --git a/arduino-esp32-wifi-scan-sdk/main/CMakeLists.txt b/arduino-esp32-wifi-scan-sdk/main/CMakeLists.txt new file mode 100644 index 00000000..a50a389f --- /dev/null +++ b/arduino-esp32-wifi-scan-sdk/main/CMakeLists.txt @@ -0,0 +1,73 @@ +# Register the app as an IDF component +idf_component_register( + SRCS /dev/null # We don't have any C++ sources + PRIV_INCLUDE_DIRS "." + REQUIRES arduino +) + +idf_build_get_property(target IDF_TARGET) +idf_build_get_property(arch IDF_TARGET_ARCH) + +if("${arch}" STREQUAL "xtensa") + message(FATAL_ERROR "Not supported target: ${target}") +endif() + +# Extract the -march flag and remove any vendor-specific extensions (_x*) +string(REGEX MATCH "-march=[^ ]+" march_flag "${CMAKE_C_FLAGS}") +string(REGEX REPLACE "_x[^ ]*" "" march_flag "${march_flag}") + +# Extract the -mabi flag or set a default value if not present +string(REGEX MATCH "-mabi=[^ ]+" mabi_flag "${CMAKE_C_FLAGS}") +if("${mabi_flag}" STREQUAL "") + set(mabi_flag "-mabi=ilp32") +endif() + +# Clear the default COMPILE_OPTIONS which include a lot of C/C++ specific compiler flags that the Swift compiler will not accept +get_target_property(var ${COMPONENT_LIB} COMPILE_OPTIONS) +set_target_properties(${COMPONENT_LIB} PROPERTIES COMPILE_OPTIONS "") + +# Compute -Xcc flags to set up the C and C++ header search paths for Swift (for bridging header). +set(SWIFT_INCLUDES) +foreach(dir ${CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES}) + string(CONCAT SWIFT_INCLUDES ${SWIFT_INCLUDES} "-Xcc ") + string(CONCAT SWIFT_INCLUDES ${SWIFT_INCLUDES} "-I${dir} ") +endforeach() +foreach(dir ${CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES}) + string(CONCAT SWIFT_INCLUDES ${SWIFT_INCLUDES} "-Xcc ") + string(CONCAT SWIFT_INCLUDES ${SWIFT_INCLUDES} "-I${dir} ") +endforeach() + +# Swift compiler flags to build in Embedded Swift mode, optimize for size, choose the right ISA, ABI, etc. +target_compile_options(${COMPONENT_LIB} PUBLIC "$<$:SHELL: + -target riscv32-none-none-eabi + -Xfrontend -function-sections -enable-experimental-feature Embedded -wmo -parse-as-library -Osize -cxx-interoperability-mode=default + -Xcc ${march_flag} -Xcc ${mabi_flag} -Xcc -fno-pic -Xcc -fno-pie -Xcc -fno-exceptions + + -pch-output-dir /tmp + -Xfrontend -enable-single-module-llvm-emission + + ${SWIFT_INCLUDES} + + -import-bridging-header ${CMAKE_CURRENT_LIST_DIR}/BridgingHeader.h + >") + +# Enable Swift support in CMake, force Whole Module builds (required by Embedded Swift), and use "CMAKE_Swift_COMPILER_WORKS" to +# skip the trial compilations which don't (yet) correctly work when cross-compiling. +set(CMAKE_Swift_COMPILER_WORKS YES) +set(CMAKE_Swift_COMPILATION_MODE_DEFAULT wholemodule) +set(CMAKE_Swift_COMPILATION_MODE wholemodule) +enable_language(Swift) + +# List of Swift source files to build. +target_sources(${COMPONENT_LIB} + PRIVATE + Main.swift + ArduinoString.swift +) + +add_custom_command( + TARGET ${COMPONENT_LIB} + POST_BUILD + COMMAND ${CMAKE_OBJCOPY} --remove-section .swift_modhash + $ $ +) diff --git a/arduino-esp32-wifi-scan-sdk/main/Kconfig.projbuild b/arduino-esp32-wifi-scan-sdk/main/Kconfig.projbuild new file mode 100644 index 00000000..befc4efa --- /dev/null +++ b/arduino-esp32-wifi-scan-sdk/main/Kconfig.projbuild @@ -0,0 +1,8 @@ +# put here your custom config value +menu "Example Configuration" +config WIFI_SCAN_INTERVAL_MS + int "WiFi network scanning interval / ms" + default 5000 + help + Interval in milliseconds between scanning for networks +endmenu diff --git a/arduino-esp32-wifi-scan-sdk/main/Main.swift b/arduino-esp32-wifi-scan-sdk/main/Main.swift new file mode 100644 index 00000000..6326eca3 --- /dev/null +++ b/arduino-esp32-wifi-scan-sdk/main/Main.swift @@ -0,0 +1,26 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift open source project +// +// Copyright (c) 2025 Apple Inc. and the Swift project authors. +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +@_cdecl("_Z5setupv") +func setup() { + print("Hello from Swift on a ESP32-C6!") +} + +@_cdecl("_Z4loopv") +func loop() { + print("Scanning...") + let count = WiFi.scanNetworks(false, true) + print("Found \(count) networks:") + for i in 0..=1.0.0,<2.0.0" + # username2/component2: + # version: "~1.0.0" + # # For transient dependencies `public` flag can be set. + # # `public` flag doesn't have an effect dependencies of the `main` component. + # # All dependencies of `main` are public by default. + # public: true + + ## Required IDF version + idf: ">=5.3,<5.5" + arduino: # Can't be defined as the espressif/arduino-esp32 shorthand since the library name must be 'arduino' for libraries that depend on it + git: https://github.com/espressif/arduino-esp32.git + version: 3.2.0 diff --git a/arduino-esp32-wifi-scan-sdk/sdkconfig.defaults b/arduino-esp32-wifi-scan-sdk/sdkconfig.defaults new file mode 100644 index 00000000..d4f9762e --- /dev/null +++ b/arduino-esp32-wifi-scan-sdk/sdkconfig.defaults @@ -0,0 +1,4 @@ +CONFIG_FREERTOS_HZ=1000 +CONFIG_MBEDTLS_PSK_MODES=y +CONFIG_MBEDTLS_KEY_EXCHANGE_PSK=y +CONFIG_AUTOSTART_ARDUINO=y From 1dab7a9bf3be182b806549d89817f541d7f1ec73 Mon Sep 17 00:00:00 2001 From: maartin0 Date: Fri, 1 Aug 2025 20:34:51 +0100 Subject: [PATCH 2/2] strip fork down to just arduino examples --- .github/workflows/build-esp.yml | 38 - .github/workflows/build-nuttx.yml | 58 - .github/workflows/build-rpi-baremetal.yml | 32 - .github/workflows/build-rpi-pico-sdk.yml | 77 - .github/workflows/build-stm.yml | 56 - .github/workflows/build-zephyr.yml | 41 - .swiftformatignore | 6 - CODEOWNERS | 19 - Documentation/README.md | 6 - Package.resolved | 24 - Package.swift | 16 - README.md | 80 +- .../IntegrateWithBazel.md-wip | 3 - .../IntegrateWithCMake.md-wip | 3 - .../IntegrateWithMake.md-wip | 3 - .../IntegrateWithSwiftPM.md-wip | 3 - .../IntegrateWithXcode.md-wip | 6 - .../Documentation.docc/CompilerDetails/ABI.md | 54 - .../CompilerDetails/Status.md | 73 - .../Documentation.docc/Documentation.md | 53 - .../GettingStarted/InstallEmbeddedSwift.md | 30 - .../GettingStarted/Introduction.md | 62 - .../GettingStarted/LanguageSubset.md | 30 - .../GettingStarted/WaysToGetStarted.md | 40 - .../GuidedExamples/PicoGuide.md | 169 - .../GuidedExamples/STM32BaremetalGuide.md | 495 - .../GuidedExamples/macOSGuide.md | 72 - .../SDKSupport/Baremetal.md | 244 - .../SDKSupport/IntegrateWithESP.md-wip | 3 - .../SDKSupport/IntegrateWithPico.md | 104 - .../SDKSupport/IntegrateWithZephyr.md | 425 - .../SDKSupport/IntegratingWithPlatforms.md | 106 - .../UsingEmbeddedSwift/Basics.md | 76 - .../ConditionalCompilation.md | 27 - .../UsingEmbeddedSwift/Existentials.md | 104 - .../ExternalDependencies.md | 37 - .../UsingEmbeddedSwift/Libraries.md | 19 - .../NonFinalGenericMethods.md | 125 - .../UsingEmbeddedSwift/Strings.md | 53 - Sources/EmbeddedSwift/Empty.swift | 12 - Tools/SVDs/README.md | 8 - Tools/SVDs/rp2040.patched.svd | 22267 ------ Tools/SVDs/rp235x.patched.svd | 64929 ---------------- Tools/SVDs/stm32f7x6.patched.svd | 54193 ------------- Tools/Toolsets/pico.json | 24 - Tools/Toolsets/pico2.json | 23 - Tools/Toolsets/rpi-5-elf.json | 19 - Tools/Toolsets/stm32f74x-lcd.json | 22 - Tools/Toolsets/stm32f74x.json | 22 - Tools/elf2hex.py | 139 - Tools/macho2bin.py | 111 - Tools/macho2uf2.py | 139 - esp32-led-blink-sdk/CMakeLists.txt | 3 - esp32-led-blink-sdk/README.md | 47 - esp32-led-blink-sdk/assets/images/ledoff.jpg | Bin 213181 -> 0 bytes esp32-led-blink-sdk/assets/images/ledon.jpg | Bin 209879 -> 0 bytes esp32-led-blink-sdk/diagram.json | 36 - esp32-led-blink-sdk/main/BridgingHeader.h | 17 - esp32-led-blink-sdk/main/CMakeLists.txt | 72 - esp32-led-blink-sdk/main/Led.swift | 30 - esp32-led-blink-sdk/main/Main.swift | 26 - esp32-led-blink-sdk/main/idf_component.yml | 0 esp32-led-blink-sdk/wokwi.toml | 8 - esp32-led-strip-sdk/CMakeLists.txt | 3 - esp32-led-strip-sdk/README.md | 46 - esp32-led-strip-sdk/diagram.json | 44 - esp32-led-strip-sdk/main/BridgingHeader.h | 17 - esp32-led-strip-sdk/main/CMakeLists.txt | 72 - esp32-led-strip-sdk/main/LedStrip.swift | 56 - esp32-led-strip-sdk/main/Main.swift | 33 - esp32-led-strip-sdk/main/idf_component.yml | 2 - esp32-led-strip-sdk/wokwi.toml | 8 - harmony/.vscode/settings.json | 16 - harmony/.vscode/tasks.json | 34 - harmony/3DModels/Assembly.step | 35875 --------- harmony/ACKNOWLEDGEMENTS.md | 277 - harmony/BillOfMaterials.md | 20 - harmony/CMakeLists.txt | 212 - harmony/README.md | 113 - harmony/Sources/Application/BridgingHeader.h | 69 - harmony/Sources/Application/Button.swift | 29 - harmony/Sources/Application/ButtonTimes.swift | 42 - harmony/Sources/Application/LEDStrip.swift | 92 - harmony/Sources/Application/Logging.swift | 412 - harmony/Sources/Application/Main.swift | 387 - .../Application/QuadratureEncoder.swift | 77 - harmony/Sources/Application/Stubs.swift | 39 - harmony/Sources/Audio/AudioAnalyzer.swift | 94 - harmony/Sources/Audio/AudioBuffer.swift | 28 - .../Sources/Audio/AudioBufferTransport.swift | 54 - harmony/Sources/Audio/AudioEngine.swift | 120 - harmony/Sources/Audio/AudioI2S.swift | 174 - harmony/Sources/Audio/AudioPico.swift | 181 - harmony/Sources/Audio/MAX9744.swift | 105 - harmony/Sources/Audio/Resampler.swift | 52 - harmony/Sources/Audio/Ring.swift | 52 - harmony/Sources/Audio/RingBuffer.swift | 126 - harmony/Sources/Audio/SpinLock.swift | 38 - harmony/Sources/Audio/TPA2016D2.swift | 118 - harmony/Sources/Audio/Timer.swift | 20 - harmony/Sources/Bluetooth/A2DP.swift | 300 - harmony/Sources/Bluetooth/AVRCP.swift | 286 - harmony/Sources/Bluetooth/HCI.swift | 30 - harmony/Sources/Bluetooth/SBC.swift | 61 - harmony/Sources/Bluetooth/SDP.swift | 50 - harmony/Sources/PIOPrograms/I2S.pio | 64 - .../Sources/PIOPrograms/QuadratureEncoder.pio | 148 - harmony/Sources/PIOPrograms/WS2812.pio | 49 - .../Tests/AudioTests/RingBufferTests.swift | 177 - harmony/assets/hero.jpg | Bin 868393 -> 0 bytes harmony/include/btstack_config.h | 89 - harmony/include/lwipopts.h | 24 - nrfx-blink-sdk/BridgingHeader.h | 18 - nrfx-blink-sdk/CMakeLists.txt | 73 - nrfx-blink-sdk/Main.swift | 24 - nrfx-blink-sdk/README.md | 42 - nrfx-blink-sdk/Stubs.c | 30 - nrfx-blink-sdk/prj.conf | 2 - nrfx-blink-sdk/west.yml | 13 - nuttx-riscv-blink/CMakeLists.txt | 134 - nuttx-riscv-blink/README.md | 71 - nuttx-riscv-blink/defconfig | 76 - nuttx-riscv-blink/leds_swift/BridgingHeader.h | 124 - nuttx-riscv-blink/leds_swift/Kconfig | 30 - nuttx-riscv-blink/leds_swift/Make.defs | 24 - nuttx-riscv-blink/leds_swift/Makefile | 38 - nuttx-riscv-blink/leds_swift/leds_swift.swift | 30 - rpi-4b-blink/Makefile | 46 - rpi-4b-blink/Package.resolved | 33 - rpi-4b-blink/Package.swift | 21 - rpi-4b-blink/README.md | 21 - .../Sources/Application/Application.swift | 85 - rpi-4b-blink/Sources/Support/boot.S | 41 - .../Sources/Support/include/Support.h | 16 - rpi-4b-blink/Sources/Support/linkerscript.ld | 27 - rpi-4b-blink/assets/hero.jpg | Bin 531343 -> 0 bytes rpi-5-blink/Makefile | 46 - rpi-5-blink/Package.resolved | 33 - rpi-5-blink/Package.swift | 21 - rpi-5-blink/README.md | 22 - .../Sources/Application/Application.swift | 70 - rpi-5-blink/Sources/Support/boot.S | 41 - rpi-5-blink/Sources/Support/include/Support.h | 16 - rpi-5-blink/Sources/Support/linkerscript.ld | 27 - rpi-5-blink/assets/hero.jpg | Bin 552044 -> 0 bytes rpi-pico-blink-sdk/BridgingHeader.h | 14 - rpi-pico-blink-sdk/CMakeLists.txt | 113 - rpi-pico-blink-sdk/Main.swift | 25 - rpi-pico-blink-sdk/README.md | 43 - rpi-pico-blink/Makefile | 60 - rpi-pico-blink/Package.swift | 15 - rpi-pico-blink/README.md | 21 - .../Sources/Application/Application.swift | 367 - .../Sources/RP2040/HAL/Digital.swift | 131 - rpi-pico-blink/Sources/RP2040/HAL/Pins.swift | 502 - .../Sources/RP2040/HAL/RP2040.swift | 16 - rpi-pico-blink/Sources/RP2040/HAL/Time.swift | 59 - .../Sources/RP2040/Hardware/Clocks.swift | 342 - .../Sources/RP2040/Hardware/IOBank.swift | 170 - .../Sources/RP2040/Hardware/PLL.swift | 87 - .../Sources/RP2040/Hardware/PPB.swift | 71 - .../Sources/RP2040/Hardware/PadsBank.swift | 307 - .../RP2040/Hardware/RP2040Hardware.swift | 229 - .../Sources/RP2040/Hardware/Resets.swift | 142 - .../Sources/RP2040/Hardware/SIO.swift | 42 - .../Sources/RP2040/Hardware/Timer.swift | 34 - .../Sources/RP2040/Hardware/Watchdog.swift | 67 - .../Sources/RP2040/Hardware/XOSC.swift | 206 - rpi-pico-blink/Sources/Support/Support.c | 41 - rpi-pico-blink/Sources/Support/crt0.S | 31 - .../Sources/Support/include/Support.h | 44 - rpi-pico2-neopixel/.sourcekit-lsp/config.json | 5 - rpi-pico2-neopixel/Makefile | 58 - rpi-pico2-neopixel/Package.resolved | 33 - rpi-pico2-neopixel/Package.swift | 27 - rpi-pico2-neopixel/README.md | 43 - .../Sources/Application/Application.swift | 171 - .../Sources/Application/HSV8Pixel.swift | 16 - .../Sources/Application/RGB8Pixel.swift | 75 - .../Sources/Application/WS2812.swift | 23 - rpi-pico2-neopixel/Sources/RP2350/Empty.swift | 13 - .../Sources/RP2350/rp235x.patched.svd | 1 - .../Sources/RP2350/svd2swift.json | 9 - rpi-pico2-neopixel/Sources/Support/Support.c | 72 - rpi-pico2-neopixel/Sources/Support/crt0.S | 31 - .../Sources/Support/include/Support.h | 12 - rpi-pico2-neopixel/assets/images/example.jpg | Bin 528680 -> 0 bytes rpi-picow-blink-sdk/BridgingHeader.h | 15 - rpi-picow-blink-sdk/CMakeLists.txt | 97 - rpi-picow-blink-sdk/Main.swift | 46 - rpi-picow-blink-sdk/README.md | 41 - rpi-picow-blink-sdk/include/lwipopts.h | 18 - stm32-blink/Board.swift | 115 - stm32-blink/BridgingHeader.h | 16 - stm32-blink/Main.swift | 42 - stm32-blink/README.md | 56 - stm32-blink/Registers.swift | 178 - stm32-blink/Startup.c | 44 - stm32-blink/build-elf.sh | 52 - stm32-blink/build-macho.sh | 56 - stm32-blink/elf-linkerscript.ld | 13 - stm32-lcd-logo/Makefile | 57 - stm32-lcd-logo/Package.resolved | 33 - stm32-lcd-logo/Package.swift | 38 - stm32-lcd-logo/README.md | 34 - .../Sources/Application/Application.swift | 80 - .../Sources/Application/Geometry/Color.swift | 18 - .../Sources/Application/Geometry/Point.swift | 15 - .../Sources/Application/Geometry/Size.swift | 11 - .../Application/HAL/GPIOA+Helpers.swift | 124 - .../Application/HAL/LTDC+Helpers.swift | 654 - .../Sources/Application/HAL/RCC+Helpers.swift | 66 - stm32-lcd-logo/Sources/STM32F7X6/Device.swift | 45 - stm32-lcd-logo/Sources/STM32F7X6/Empty.swift | 13 - stm32-lcd-logo/Sources/STM32F7X6/FLASH.swift | 469 - stm32-lcd-logo/Sources/STM32F7X6/GPIOA.swift | 1075 - stm32-lcd-logo/Sources/STM32F7X6/GPIOB.swift | 7 - stm32-lcd-logo/Sources/STM32F7X6/GPIOC.swift | 7 - stm32-lcd-logo/Sources/STM32F7X6/GPIOD.swift | 7 - stm32-lcd-logo/Sources/STM32F7X6/GPIOE.swift | 7 - stm32-lcd-logo/Sources/STM32F7X6/GPIOF.swift | 7 - stm32-lcd-logo/Sources/STM32F7X6/GPIOG.swift | 7 - stm32-lcd-logo/Sources/STM32F7X6/GPIOH.swift | 7 - stm32-lcd-logo/Sources/STM32F7X6/GPIOI.swift | 7 - stm32-lcd-logo/Sources/STM32F7X6/GPIOJ.swift | 7 - stm32-lcd-logo/Sources/STM32F7X6/GPIOK.swift | 7 - stm32-lcd-logo/Sources/STM32F7X6/LTDC.swift | 847 - stm32-lcd-logo/Sources/STM32F7X6/RCC.swift | 2833 - .../Sources/STM32F7X6/stm32f7x6.patched.svd | 1 - .../Sources/STM32F7X6/svd2swift.json | 19 - stm32-lcd-logo/Sources/Support/Startup.c | 51 - .../Sources/Support/include/Support.h | 16 - stm32-lvgl/.gitignore | 2 - stm32-lvgl/.sourcekit-lsp/config.json | 11 - stm32-lvgl/Makefile | 94 - stm32-lvgl/Package.resolved | 42 - stm32-lvgl/Package.swift | 59 - stm32-lvgl/README.md | 49 - stm32-lvgl/Sources/Application/Clocks.swift | 423 - stm32-lvgl/Sources/Application/Debug.swift | 67 - stm32-lvgl/Sources/Application/I2C.swift | 156 - .../Sources/Application/Interrupts.swift | 81 - stm32-lvgl/Sources/Application/Lcd.swift | 128 - stm32-lvgl/Sources/Application/Main.swift | 163 - stm32-lvgl/Sources/Application/Pins.swift | 882 - stm32-lvgl/Sources/Application/Sdram.swift | 109 - .../Sources/Application/TouchPanel.swift | 61 - .../Sources/Application/UIAppLogic.swift | 139 - stm32-lvgl/Sources/CLVGL/include/CLVGL.h | 12 - stm32-lvgl/Sources/CLVGL/include/lv_conf.h | 1273 - .../Sources/CLVGL/include/module.modulemap | 15 - stm32-lvgl/Sources/HostSDLApp/Main.swift | 127 - .../Sources/HostSDLApp/UIAppLogic.swift | 1 - stm32-lvgl/Sources/Registers/DBGMCU.swift | 153 - stm32-lvgl/Sources/Registers/Device.swift | 81 - stm32-lvgl/Sources/Registers/FLASH.swift | 469 - stm32-lvgl/Sources/Registers/FMC.swift | 1611 - stm32-lvgl/Sources/Registers/GPIOA.swift | 1075 - stm32-lvgl/Sources/Registers/GPIOB.swift | 7 - stm32-lvgl/Sources/Registers/GPIOC.swift | 7 - stm32-lvgl/Sources/Registers/GPIOD.swift | 7 - stm32-lvgl/Sources/Registers/GPIOE.swift | 7 - stm32-lvgl/Sources/Registers/GPIOF.swift | 7 - stm32-lvgl/Sources/Registers/GPIOG.swift | 7 - stm32-lvgl/Sources/Registers/GPIOH.swift | 7 - stm32-lvgl/Sources/Registers/GPIOI.swift | 7 - stm32-lvgl/Sources/Registers/GPIOJ.swift | 7 - stm32-lvgl/Sources/Registers/GPIOK.swift | 7 - stm32-lvgl/Sources/Registers/I2C1.swift | 1069 - stm32-lvgl/Sources/Registers/I2C2.swift | 7 - stm32-lvgl/Sources/Registers/I2C3.swift | 7 - stm32-lvgl/Sources/Registers/I2C4.swift | 7 - stm32-lvgl/Sources/Registers/LTDC.swift | 847 - stm32-lvgl/Sources/Registers/NVIC.swift | 813 - stm32-lvgl/Sources/Registers/PWR.swift | 270 - stm32-lvgl/Sources/Registers/RCC.swift | 2833 - stm32-lvgl/Sources/Registers/SCB.swift | 429 - stm32-lvgl/Sources/Registers/STK.swift | 77 - stm32-lvgl/Sources/Registers/SYSCFG.swift | 161 - stm32-lvgl/Sources/Registers/USART1.swift | 1554 - stm32-lvgl/Sources/Support/Startup.c | 163 - stm32-lvgl/Sources/Support/Stubs.c | 27 - stm32-lvgl/Sources/Support/include/Support.h | 43 - stm32-lvgl/Sources/Support/linkerscript.ld | 103 - stm32-lvgl/clang-arm-toolchain.cmake | 21 - stm32-lvgl/fetch-dependencies.sh | 63 - stm32-lvgl/toolset.json | 44 - stm32-neopixel/Makefile | 57 - stm32-neopixel/Package.resolved | 33 - stm32-neopixel/Package.swift | 34 - stm32-neopixel/README.md | 30 - .../Sources/Application/Application.swift | 139 - stm32-neopixel/Sources/Application/GPIO.swift | 111 - .../Application/Neopixel/HSV8Pixel.swift | 16 - .../Application/Neopixel/RGB8Pixel.swift | 118 - .../Application/Neopixel/SPINeoPixel.swift | 204 - .../Application/Neopixel/SPINeoPixelBit.swift | 16 - .../Neopixel/SPINeoPixelGRB64Pixel.swift | 63 - stm32-neopixel/Sources/STM32F7X6/DMA1.swift | 7 - stm32-neopixel/Sources/STM32F7X6/DMA2.swift | 893 - stm32-neopixel/Sources/STM32F7X6/Device.swift | 30 - stm32-neopixel/Sources/STM32F7X6/Empty.swift | 13 - stm32-neopixel/Sources/STM32F7X6/GPIOA.swift | 1075 - stm32-neopixel/Sources/STM32F7X6/GPIOB.swift | 7 - stm32-neopixel/Sources/STM32F7X6/GPIOI.swift | 7 - stm32-neopixel/Sources/STM32F7X6/RCC.swift | 2833 - stm32-neopixel/Sources/STM32F7X6/SPI1.swift | 1043 - stm32-neopixel/Sources/STM32F7X6/SPI2.swift | 7 - stm32-neopixel/Sources/STM32F7X6/USART1.swift | 1554 - .../Sources/STM32F7X6/stm32f7x6.patched.svd | 1 - .../Sources/STM32F7X6/svd2swift.json | 14 - stm32-neopixel/Sources/Support/Support.c | 96 - .../Sources/Support/include/Support.h | 15 - stm32-neopixel/Sources/Support/startup.S | 45 - stm32-neopixel/schematic.png | Bin 168913 -> 0 bytes stm32-uart-echo/Makefile | 57 - stm32-uart-echo/Package.resolved | 33 - stm32-uart-echo/Package.swift | 34 - stm32-uart-echo/README.md | 20 - .../Sources/Application/Application.swift | 117 - .../Sources/Application/GPIO.swift | 111 - .../Sources/STM32F7X6/Device.swift | 15 - stm32-uart-echo/Sources/STM32F7X6/Empty.swift | 13 - stm32-uart-echo/Sources/STM32F7X6/GPIOA.swift | 1075 - stm32-uart-echo/Sources/STM32F7X6/GPIOB.swift | 7 - stm32-uart-echo/Sources/STM32F7X6/RCC.swift | 2833 - .../Sources/STM32F7X6/USART1.swift | 1554 - .../Sources/STM32F7X6/stm32f7x6.patched.svd | 1 - .../Sources/STM32F7X6/svd2swift.json | 9 - stm32-uart-echo/Sources/Support/Support.c | 51 - .../Sources/Support/include/Support.h | 12 - stm32-uart-echo/Sources/Support/startup.S | 45 - 332 files changed, 7 insertions(+), 228187 deletions(-) delete mode 100644 .github/workflows/build-esp.yml delete mode 100644 .github/workflows/build-nuttx.yml delete mode 100644 .github/workflows/build-rpi-baremetal.yml delete mode 100644 .github/workflows/build-rpi-pico-sdk.yml delete mode 100644 .github/workflows/build-stm.yml delete mode 100644 .github/workflows/build-zephyr.yml delete mode 100644 .swiftformatignore delete mode 100644 CODEOWNERS delete mode 100644 Documentation/README.md delete mode 100644 Package.resolved delete mode 100644 Package.swift delete mode 100644 Sources/EmbeddedSwift/Documentation.docc/BuildSystemSupport/IntegrateWithBazel.md-wip delete mode 100644 Sources/EmbeddedSwift/Documentation.docc/BuildSystemSupport/IntegrateWithCMake.md-wip delete mode 100644 Sources/EmbeddedSwift/Documentation.docc/BuildSystemSupport/IntegrateWithMake.md-wip delete mode 100644 Sources/EmbeddedSwift/Documentation.docc/BuildSystemSupport/IntegrateWithSwiftPM.md-wip delete mode 100644 Sources/EmbeddedSwift/Documentation.docc/BuildSystemSupport/IntegrateWithXcode.md-wip delete mode 100644 Sources/EmbeddedSwift/Documentation.docc/CompilerDetails/ABI.md delete mode 100644 Sources/EmbeddedSwift/Documentation.docc/CompilerDetails/Status.md delete mode 100644 Sources/EmbeddedSwift/Documentation.docc/Documentation.md delete mode 100644 Sources/EmbeddedSwift/Documentation.docc/GettingStarted/InstallEmbeddedSwift.md delete mode 100644 Sources/EmbeddedSwift/Documentation.docc/GettingStarted/Introduction.md delete mode 100644 Sources/EmbeddedSwift/Documentation.docc/GettingStarted/LanguageSubset.md delete mode 100644 Sources/EmbeddedSwift/Documentation.docc/GettingStarted/WaysToGetStarted.md delete mode 100644 Sources/EmbeddedSwift/Documentation.docc/GuidedExamples/PicoGuide.md delete mode 100644 Sources/EmbeddedSwift/Documentation.docc/GuidedExamples/STM32BaremetalGuide.md delete mode 100644 Sources/EmbeddedSwift/Documentation.docc/GuidedExamples/macOSGuide.md delete mode 100644 Sources/EmbeddedSwift/Documentation.docc/SDKSupport/Baremetal.md delete mode 100644 Sources/EmbeddedSwift/Documentation.docc/SDKSupport/IntegrateWithESP.md-wip delete mode 100644 Sources/EmbeddedSwift/Documentation.docc/SDKSupport/IntegrateWithPico.md delete mode 100644 Sources/EmbeddedSwift/Documentation.docc/SDKSupport/IntegrateWithZephyr.md delete mode 100644 Sources/EmbeddedSwift/Documentation.docc/SDKSupport/IntegratingWithPlatforms.md delete mode 100644 Sources/EmbeddedSwift/Documentation.docc/UsingEmbeddedSwift/Basics.md delete mode 100644 Sources/EmbeddedSwift/Documentation.docc/UsingEmbeddedSwift/ConditionalCompilation.md delete mode 100644 Sources/EmbeddedSwift/Documentation.docc/UsingEmbeddedSwift/Existentials.md delete mode 100644 Sources/EmbeddedSwift/Documentation.docc/UsingEmbeddedSwift/ExternalDependencies.md delete mode 100644 Sources/EmbeddedSwift/Documentation.docc/UsingEmbeddedSwift/Libraries.md delete mode 100644 Sources/EmbeddedSwift/Documentation.docc/UsingEmbeddedSwift/NonFinalGenericMethods.md delete mode 100644 Sources/EmbeddedSwift/Documentation.docc/UsingEmbeddedSwift/Strings.md delete mode 100644 Sources/EmbeddedSwift/Empty.swift delete mode 100644 Tools/SVDs/README.md delete mode 100644 Tools/SVDs/rp2040.patched.svd delete mode 100644 Tools/SVDs/rp235x.patched.svd delete mode 100644 Tools/SVDs/stm32f7x6.patched.svd delete mode 100644 Tools/Toolsets/pico.json delete mode 100644 Tools/Toolsets/pico2.json delete mode 100644 Tools/Toolsets/rpi-5-elf.json delete mode 100644 Tools/Toolsets/stm32f74x-lcd.json delete mode 100644 Tools/Toolsets/stm32f74x.json delete mode 100755 Tools/elf2hex.py delete mode 100755 Tools/macho2bin.py delete mode 100755 Tools/macho2uf2.py delete mode 100644 esp32-led-blink-sdk/CMakeLists.txt delete mode 100644 esp32-led-blink-sdk/README.md delete mode 100644 esp32-led-blink-sdk/assets/images/ledoff.jpg delete mode 100644 esp32-led-blink-sdk/assets/images/ledon.jpg delete mode 100644 esp32-led-blink-sdk/diagram.json delete mode 100644 esp32-led-blink-sdk/main/BridgingHeader.h delete mode 100644 esp32-led-blink-sdk/main/CMakeLists.txt delete mode 100644 esp32-led-blink-sdk/main/Led.swift delete mode 100644 esp32-led-blink-sdk/main/Main.swift delete mode 100644 esp32-led-blink-sdk/main/idf_component.yml delete mode 100644 esp32-led-blink-sdk/wokwi.toml delete mode 100644 esp32-led-strip-sdk/CMakeLists.txt delete mode 100644 esp32-led-strip-sdk/README.md delete mode 100644 esp32-led-strip-sdk/diagram.json delete mode 100644 esp32-led-strip-sdk/main/BridgingHeader.h delete mode 100644 esp32-led-strip-sdk/main/CMakeLists.txt delete mode 100644 esp32-led-strip-sdk/main/LedStrip.swift delete mode 100644 esp32-led-strip-sdk/main/Main.swift delete mode 100644 esp32-led-strip-sdk/main/idf_component.yml delete mode 100644 esp32-led-strip-sdk/wokwi.toml delete mode 100644 harmony/.vscode/settings.json delete mode 100644 harmony/.vscode/tasks.json delete mode 100644 harmony/3DModels/Assembly.step delete mode 100644 harmony/ACKNOWLEDGEMENTS.md delete mode 100644 harmony/BillOfMaterials.md delete mode 100644 harmony/CMakeLists.txt delete mode 100644 harmony/README.md delete mode 100644 harmony/Sources/Application/BridgingHeader.h delete mode 100644 harmony/Sources/Application/Button.swift delete mode 100644 harmony/Sources/Application/ButtonTimes.swift delete mode 100644 harmony/Sources/Application/LEDStrip.swift delete mode 100644 harmony/Sources/Application/Logging.swift delete mode 100644 harmony/Sources/Application/Main.swift delete mode 100644 harmony/Sources/Application/QuadratureEncoder.swift delete mode 100644 harmony/Sources/Application/Stubs.swift delete mode 100644 harmony/Sources/Audio/AudioAnalyzer.swift delete mode 100644 harmony/Sources/Audio/AudioBuffer.swift delete mode 100644 harmony/Sources/Audio/AudioBufferTransport.swift delete mode 100644 harmony/Sources/Audio/AudioEngine.swift delete mode 100644 harmony/Sources/Audio/AudioI2S.swift delete mode 100644 harmony/Sources/Audio/AudioPico.swift delete mode 100644 harmony/Sources/Audio/MAX9744.swift delete mode 100644 harmony/Sources/Audio/Resampler.swift delete mode 100644 harmony/Sources/Audio/Ring.swift delete mode 100644 harmony/Sources/Audio/RingBuffer.swift delete mode 100644 harmony/Sources/Audio/SpinLock.swift delete mode 100644 harmony/Sources/Audio/TPA2016D2.swift delete mode 100644 harmony/Sources/Audio/Timer.swift delete mode 100644 harmony/Sources/Bluetooth/A2DP.swift delete mode 100644 harmony/Sources/Bluetooth/AVRCP.swift delete mode 100644 harmony/Sources/Bluetooth/HCI.swift delete mode 100644 harmony/Sources/Bluetooth/SBC.swift delete mode 100644 harmony/Sources/Bluetooth/SDP.swift delete mode 100644 harmony/Sources/PIOPrograms/I2S.pio delete mode 100644 harmony/Sources/PIOPrograms/QuadratureEncoder.pio delete mode 100644 harmony/Sources/PIOPrograms/WS2812.pio delete mode 100644 harmony/Tests/AudioTests/RingBufferTests.swift delete mode 100644 harmony/assets/hero.jpg delete mode 100644 harmony/include/btstack_config.h delete mode 100644 harmony/include/lwipopts.h delete mode 100644 nrfx-blink-sdk/BridgingHeader.h delete mode 100644 nrfx-blink-sdk/CMakeLists.txt delete mode 100644 nrfx-blink-sdk/Main.swift delete mode 100644 nrfx-blink-sdk/README.md delete mode 100644 nrfx-blink-sdk/Stubs.c delete mode 100644 nrfx-blink-sdk/prj.conf delete mode 100644 nrfx-blink-sdk/west.yml delete mode 100644 nuttx-riscv-blink/CMakeLists.txt delete mode 100644 nuttx-riscv-blink/README.md delete mode 100644 nuttx-riscv-blink/defconfig delete mode 100644 nuttx-riscv-blink/leds_swift/BridgingHeader.h delete mode 100644 nuttx-riscv-blink/leds_swift/Kconfig delete mode 100644 nuttx-riscv-blink/leds_swift/Make.defs delete mode 100644 nuttx-riscv-blink/leds_swift/Makefile delete mode 100644 nuttx-riscv-blink/leds_swift/leds_swift.swift delete mode 100644 rpi-4b-blink/Makefile delete mode 100644 rpi-4b-blink/Package.resolved delete mode 100644 rpi-4b-blink/Package.swift delete mode 100644 rpi-4b-blink/README.md delete mode 100644 rpi-4b-blink/Sources/Application/Application.swift delete mode 100644 rpi-4b-blink/Sources/Support/boot.S delete mode 100644 rpi-4b-blink/Sources/Support/include/Support.h delete mode 100644 rpi-4b-blink/Sources/Support/linkerscript.ld delete mode 100644 rpi-4b-blink/assets/hero.jpg delete mode 100644 rpi-5-blink/Makefile delete mode 100644 rpi-5-blink/Package.resolved delete mode 100644 rpi-5-blink/Package.swift delete mode 100644 rpi-5-blink/README.md delete mode 100644 rpi-5-blink/Sources/Application/Application.swift delete mode 100644 rpi-5-blink/Sources/Support/boot.S delete mode 100644 rpi-5-blink/Sources/Support/include/Support.h delete mode 100644 rpi-5-blink/Sources/Support/linkerscript.ld delete mode 100644 rpi-5-blink/assets/hero.jpg delete mode 100644 rpi-pico-blink-sdk/BridgingHeader.h delete mode 100644 rpi-pico-blink-sdk/CMakeLists.txt delete mode 100644 rpi-pico-blink-sdk/Main.swift delete mode 100644 rpi-pico-blink-sdk/README.md delete mode 100755 rpi-pico-blink/Makefile delete mode 100644 rpi-pico-blink/Package.swift delete mode 100644 rpi-pico-blink/README.md delete mode 100644 rpi-pico-blink/Sources/Application/Application.swift delete mode 100644 rpi-pico-blink/Sources/RP2040/HAL/Digital.swift delete mode 100644 rpi-pico-blink/Sources/RP2040/HAL/Pins.swift delete mode 100644 rpi-pico-blink/Sources/RP2040/HAL/RP2040.swift delete mode 100644 rpi-pico-blink/Sources/RP2040/HAL/Time.swift delete mode 100644 rpi-pico-blink/Sources/RP2040/Hardware/Clocks.swift delete mode 100644 rpi-pico-blink/Sources/RP2040/Hardware/IOBank.swift delete mode 100644 rpi-pico-blink/Sources/RP2040/Hardware/PLL.swift delete mode 100644 rpi-pico-blink/Sources/RP2040/Hardware/PPB.swift delete mode 100644 rpi-pico-blink/Sources/RP2040/Hardware/PadsBank.swift delete mode 100644 rpi-pico-blink/Sources/RP2040/Hardware/RP2040Hardware.swift delete mode 100644 rpi-pico-blink/Sources/RP2040/Hardware/Resets.swift delete mode 100644 rpi-pico-blink/Sources/RP2040/Hardware/SIO.swift delete mode 100644 rpi-pico-blink/Sources/RP2040/Hardware/Timer.swift delete mode 100644 rpi-pico-blink/Sources/RP2040/Hardware/Watchdog.swift delete mode 100644 rpi-pico-blink/Sources/RP2040/Hardware/XOSC.swift delete mode 100644 rpi-pico-blink/Sources/Support/Support.c delete mode 100644 rpi-pico-blink/Sources/Support/crt0.S delete mode 100644 rpi-pico-blink/Sources/Support/include/Support.h delete mode 100644 rpi-pico2-neopixel/.sourcekit-lsp/config.json delete mode 100644 rpi-pico2-neopixel/Makefile delete mode 100644 rpi-pico2-neopixel/Package.resolved delete mode 100644 rpi-pico2-neopixel/Package.swift delete mode 100644 rpi-pico2-neopixel/README.md delete mode 100644 rpi-pico2-neopixel/Sources/Application/Application.swift delete mode 100644 rpi-pico2-neopixel/Sources/Application/HSV8Pixel.swift delete mode 100644 rpi-pico2-neopixel/Sources/Application/RGB8Pixel.swift delete mode 100644 rpi-pico2-neopixel/Sources/Application/WS2812.swift delete mode 100644 rpi-pico2-neopixel/Sources/RP2350/Empty.swift delete mode 120000 rpi-pico2-neopixel/Sources/RP2350/rp235x.patched.svd delete mode 100644 rpi-pico2-neopixel/Sources/RP2350/svd2swift.json delete mode 100644 rpi-pico2-neopixel/Sources/Support/Support.c delete mode 100644 rpi-pico2-neopixel/Sources/Support/crt0.S delete mode 100644 rpi-pico2-neopixel/Sources/Support/include/Support.h delete mode 100644 rpi-pico2-neopixel/assets/images/example.jpg delete mode 100644 rpi-picow-blink-sdk/BridgingHeader.h delete mode 100644 rpi-picow-blink-sdk/CMakeLists.txt delete mode 100644 rpi-picow-blink-sdk/Main.swift delete mode 100644 rpi-picow-blink-sdk/README.md delete mode 100644 rpi-picow-blink-sdk/include/lwipopts.h delete mode 100644 stm32-blink/Board.swift delete mode 100644 stm32-blink/BridgingHeader.h delete mode 100644 stm32-blink/Main.swift delete mode 100644 stm32-blink/README.md delete mode 100644 stm32-blink/Registers.swift delete mode 100644 stm32-blink/Startup.c delete mode 100755 stm32-blink/build-elf.sh delete mode 100755 stm32-blink/build-macho.sh delete mode 100644 stm32-blink/elf-linkerscript.ld delete mode 100644 stm32-lcd-logo/Makefile delete mode 100644 stm32-lcd-logo/Package.resolved delete mode 100644 stm32-lcd-logo/Package.swift delete mode 100644 stm32-lcd-logo/README.md delete mode 100644 stm32-lcd-logo/Sources/Application/Application.swift delete mode 100644 stm32-lcd-logo/Sources/Application/Geometry/Color.swift delete mode 100644 stm32-lcd-logo/Sources/Application/Geometry/Point.swift delete mode 100644 stm32-lcd-logo/Sources/Application/Geometry/Size.swift delete mode 100644 stm32-lcd-logo/Sources/Application/HAL/GPIOA+Helpers.swift delete mode 100644 stm32-lcd-logo/Sources/Application/HAL/LTDC+Helpers.swift delete mode 100644 stm32-lcd-logo/Sources/Application/HAL/RCC+Helpers.swift delete mode 100644 stm32-lcd-logo/Sources/STM32F7X6/Device.swift delete mode 100644 stm32-lcd-logo/Sources/STM32F7X6/Empty.swift delete mode 100644 stm32-lcd-logo/Sources/STM32F7X6/FLASH.swift delete mode 100644 stm32-lcd-logo/Sources/STM32F7X6/GPIOA.swift delete mode 100644 stm32-lcd-logo/Sources/STM32F7X6/GPIOB.swift delete mode 100644 stm32-lcd-logo/Sources/STM32F7X6/GPIOC.swift delete mode 100644 stm32-lcd-logo/Sources/STM32F7X6/GPIOD.swift delete mode 100644 stm32-lcd-logo/Sources/STM32F7X6/GPIOE.swift delete mode 100644 stm32-lcd-logo/Sources/STM32F7X6/GPIOF.swift delete mode 100644 stm32-lcd-logo/Sources/STM32F7X6/GPIOG.swift delete mode 100644 stm32-lcd-logo/Sources/STM32F7X6/GPIOH.swift delete mode 100644 stm32-lcd-logo/Sources/STM32F7X6/GPIOI.swift delete mode 100644 stm32-lcd-logo/Sources/STM32F7X6/GPIOJ.swift delete mode 100644 stm32-lcd-logo/Sources/STM32F7X6/GPIOK.swift delete mode 100644 stm32-lcd-logo/Sources/STM32F7X6/LTDC.swift delete mode 100644 stm32-lcd-logo/Sources/STM32F7X6/RCC.swift delete mode 120000 stm32-lcd-logo/Sources/STM32F7X6/stm32f7x6.patched.svd delete mode 100644 stm32-lcd-logo/Sources/STM32F7X6/svd2swift.json delete mode 100644 stm32-lcd-logo/Sources/Support/Startup.c delete mode 100644 stm32-lcd-logo/Sources/Support/include/Support.h delete mode 100644 stm32-lvgl/.gitignore delete mode 100644 stm32-lvgl/.sourcekit-lsp/config.json delete mode 100644 stm32-lvgl/Makefile delete mode 100644 stm32-lvgl/Package.resolved delete mode 100644 stm32-lvgl/Package.swift delete mode 100644 stm32-lvgl/README.md delete mode 100644 stm32-lvgl/Sources/Application/Clocks.swift delete mode 100644 stm32-lvgl/Sources/Application/Debug.swift delete mode 100644 stm32-lvgl/Sources/Application/I2C.swift delete mode 100644 stm32-lvgl/Sources/Application/Interrupts.swift delete mode 100644 stm32-lvgl/Sources/Application/Lcd.swift delete mode 100644 stm32-lvgl/Sources/Application/Main.swift delete mode 100644 stm32-lvgl/Sources/Application/Pins.swift delete mode 100644 stm32-lvgl/Sources/Application/Sdram.swift delete mode 100644 stm32-lvgl/Sources/Application/TouchPanel.swift delete mode 100644 stm32-lvgl/Sources/Application/UIAppLogic.swift delete mode 100644 stm32-lvgl/Sources/CLVGL/include/CLVGL.h delete mode 100644 stm32-lvgl/Sources/CLVGL/include/lv_conf.h delete mode 100644 stm32-lvgl/Sources/CLVGL/include/module.modulemap delete mode 100644 stm32-lvgl/Sources/HostSDLApp/Main.swift delete mode 120000 stm32-lvgl/Sources/HostSDLApp/UIAppLogic.swift delete mode 100644 stm32-lvgl/Sources/Registers/DBGMCU.swift delete mode 100644 stm32-lvgl/Sources/Registers/Device.swift delete mode 100644 stm32-lvgl/Sources/Registers/FLASH.swift delete mode 100644 stm32-lvgl/Sources/Registers/FMC.swift delete mode 100644 stm32-lvgl/Sources/Registers/GPIOA.swift delete mode 100644 stm32-lvgl/Sources/Registers/GPIOB.swift delete mode 100644 stm32-lvgl/Sources/Registers/GPIOC.swift delete mode 100644 stm32-lvgl/Sources/Registers/GPIOD.swift delete mode 100644 stm32-lvgl/Sources/Registers/GPIOE.swift delete mode 100644 stm32-lvgl/Sources/Registers/GPIOF.swift delete mode 100644 stm32-lvgl/Sources/Registers/GPIOG.swift delete mode 100644 stm32-lvgl/Sources/Registers/GPIOH.swift delete mode 100644 stm32-lvgl/Sources/Registers/GPIOI.swift delete mode 100644 stm32-lvgl/Sources/Registers/GPIOJ.swift delete mode 100644 stm32-lvgl/Sources/Registers/GPIOK.swift delete mode 100644 stm32-lvgl/Sources/Registers/I2C1.swift delete mode 100644 stm32-lvgl/Sources/Registers/I2C2.swift delete mode 100644 stm32-lvgl/Sources/Registers/I2C3.swift delete mode 100644 stm32-lvgl/Sources/Registers/I2C4.swift delete mode 100644 stm32-lvgl/Sources/Registers/LTDC.swift delete mode 100644 stm32-lvgl/Sources/Registers/NVIC.swift delete mode 100644 stm32-lvgl/Sources/Registers/PWR.swift delete mode 100644 stm32-lvgl/Sources/Registers/RCC.swift delete mode 100644 stm32-lvgl/Sources/Registers/SCB.swift delete mode 100644 stm32-lvgl/Sources/Registers/STK.swift delete mode 100644 stm32-lvgl/Sources/Registers/SYSCFG.swift delete mode 100644 stm32-lvgl/Sources/Registers/USART1.swift delete mode 100644 stm32-lvgl/Sources/Support/Startup.c delete mode 100644 stm32-lvgl/Sources/Support/Stubs.c delete mode 100644 stm32-lvgl/Sources/Support/include/Support.h delete mode 100644 stm32-lvgl/Sources/Support/linkerscript.ld delete mode 100644 stm32-lvgl/clang-arm-toolchain.cmake delete mode 100755 stm32-lvgl/fetch-dependencies.sh delete mode 100644 stm32-lvgl/toolset.json delete mode 100755 stm32-neopixel/Makefile delete mode 100644 stm32-neopixel/Package.resolved delete mode 100644 stm32-neopixel/Package.swift delete mode 100644 stm32-neopixel/README.md delete mode 100644 stm32-neopixel/Sources/Application/Application.swift delete mode 100644 stm32-neopixel/Sources/Application/GPIO.swift delete mode 100644 stm32-neopixel/Sources/Application/Neopixel/HSV8Pixel.swift delete mode 100644 stm32-neopixel/Sources/Application/Neopixel/RGB8Pixel.swift delete mode 100644 stm32-neopixel/Sources/Application/Neopixel/SPINeoPixel.swift delete mode 100644 stm32-neopixel/Sources/Application/Neopixel/SPINeoPixelBit.swift delete mode 100644 stm32-neopixel/Sources/Application/Neopixel/SPINeoPixelGRB64Pixel.swift delete mode 100644 stm32-neopixel/Sources/STM32F7X6/DMA1.swift delete mode 100644 stm32-neopixel/Sources/STM32F7X6/DMA2.swift delete mode 100644 stm32-neopixel/Sources/STM32F7X6/Device.swift delete mode 100644 stm32-neopixel/Sources/STM32F7X6/Empty.swift delete mode 100644 stm32-neopixel/Sources/STM32F7X6/GPIOA.swift delete mode 100644 stm32-neopixel/Sources/STM32F7X6/GPIOB.swift delete mode 100644 stm32-neopixel/Sources/STM32F7X6/GPIOI.swift delete mode 100644 stm32-neopixel/Sources/STM32F7X6/RCC.swift delete mode 100644 stm32-neopixel/Sources/STM32F7X6/SPI1.swift delete mode 100644 stm32-neopixel/Sources/STM32F7X6/SPI2.swift delete mode 100644 stm32-neopixel/Sources/STM32F7X6/USART1.swift delete mode 120000 stm32-neopixel/Sources/STM32F7X6/stm32f7x6.patched.svd delete mode 100644 stm32-neopixel/Sources/STM32F7X6/svd2swift.json delete mode 100644 stm32-neopixel/Sources/Support/Support.c delete mode 100644 stm32-neopixel/Sources/Support/include/Support.h delete mode 100644 stm32-neopixel/Sources/Support/startup.S delete mode 100644 stm32-neopixel/schematic.png delete mode 100755 stm32-uart-echo/Makefile delete mode 100644 stm32-uart-echo/Package.resolved delete mode 100644 stm32-uart-echo/Package.swift delete mode 100644 stm32-uart-echo/README.md delete mode 100644 stm32-uart-echo/Sources/Application/Application.swift delete mode 100644 stm32-uart-echo/Sources/Application/GPIO.swift delete mode 100644 stm32-uart-echo/Sources/STM32F7X6/Device.swift delete mode 100644 stm32-uart-echo/Sources/STM32F7X6/Empty.swift delete mode 100644 stm32-uart-echo/Sources/STM32F7X6/GPIOA.swift delete mode 100644 stm32-uart-echo/Sources/STM32F7X6/GPIOB.swift delete mode 100644 stm32-uart-echo/Sources/STM32F7X6/RCC.swift delete mode 100644 stm32-uart-echo/Sources/STM32F7X6/USART1.swift delete mode 120000 stm32-uart-echo/Sources/STM32F7X6/stm32f7x6.patched.svd delete mode 100644 stm32-uart-echo/Sources/STM32F7X6/svd2swift.json delete mode 100644 stm32-uart-echo/Sources/Support/Support.c delete mode 100644 stm32-uart-echo/Sources/Support/include/Support.h delete mode 100644 stm32-uart-echo/Sources/Support/startup.S diff --git a/.github/workflows/build-esp.yml b/.github/workflows/build-esp.yml deleted file mode 100644 index 34325add..00000000 --- a/.github/workflows/build-esp.yml +++ /dev/null @@ -1,38 +0,0 @@ -name: ESP - -on: - push: - branches: ["main"] - pull_request: - types: [opened, reopened, synchronize, ready_for_review] - workflow_dispatch: - -jobs: - build: - name: Build - runs-on: ubuntu-24.04 - container: espressif/idf:latest - - strategy: - fail-fast: false - matrix: - example: [esp32-led-blink-sdk, esp32-led-strip-sdk] - - steps: - - name: Checkout repo - uses: actions/checkout@v4 - - - name: Install apt dependencies - run: apt-get -qq update && apt-get -qq -y install pkg-config - - - name: Install Swift - uses: ./.github/actions/install-swift - - - name: Build ${{ matrix.example }} - run: | - cd $IDF_PATH - . ./export.sh - cd - - cd ${{ matrix.example }} - idf.py set-target esp32c6 - idf.py build diff --git a/.github/workflows/build-nuttx.yml b/.github/workflows/build-nuttx.yml deleted file mode 100644 index 554cd5f7..00000000 --- a/.github/workflows/build-nuttx.yml +++ /dev/null @@ -1,58 +0,0 @@ -name: NuttX - -on: - push: - branches: ["main"] - pull_request: - types: [opened, reopened, synchronize, ready_for_review] - workflow_dispatch: - -jobs: - build: - name: Build - runs-on: ubuntu-24.04 - - strategy: - fail-fast: false - matrix: - example: [nuttx-riscv-blink] - - steps: - - name: Checkout repo - uses: actions/checkout@v4 - - - name: Install apt dependencies - run: | - sudo apt-get -qq update && sudo apt-get -qq -y install \ - bison flex gettext texinfo libncurses5-dev libncursesw5-dev \ - gperf automake libtool pkg-config build-essential gperf genromfs \ - libgmp-dev libmpc-dev libmpfr-dev libisl-dev binutils-dev libelf-dev \ - libexpat-dev gcc-multilib g++-multilib u-boot-tools util-linux \ - kconfig-frontends ninja-build - - - name: Install CMake 3.30.2 - run: | - ARCH=`uname -m` - curl -sL https://github.com/Kitware/CMake/releases/download/v3.30.2/cmake-3.30.2-linux-$ARCH.tar.gz -O - tar xzf cmake-3.30.2-linux-$ARCH.tar.gz - export PATH="`pwd`/cmake-3.30.2-linux-$ARCH/bin:$PATH" - echo "PATH=$PATH" >> $GITHUB_ENV - cmake --version - - - name: Install RISC-V toolchain - run: | - mkdir -p riscv-none-elf-gcc && \ - curl -s -L "https://github.com/xpack-dev-tools/riscv-none-elf-gcc-xpack/releases/download/v13.2.0-2/xpack-riscv-none-elf-gcc-13.2.0-2-linux-x64.tar.gz" \ - | tar -C riscv-none-elf-gcc --strip-components 1 -xz - export PATH="$PATH:`pwd`/riscv-none-elf-gcc/bin/" - echo "PATH=$PATH" >> $GITHUB_ENV - riscv-none-elf-gcc --version - - - name: Install Swift - uses: ./.github/actions/install-swift - - - name: Build ${{ matrix.example }} - working-directory: ${{ matrix.example }} - run: | - cmake -B build -GNinja -DBOARD_CONFIG=rv-virt:leds_swift -DENABLE_NUTTX_TRACE=ON - cmake --build build diff --git a/.github/workflows/build-rpi-baremetal.yml b/.github/workflows/build-rpi-baremetal.yml deleted file mode 100644 index eadc725d..00000000 --- a/.github/workflows/build-rpi-baremetal.yml +++ /dev/null @@ -1,32 +0,0 @@ -name: Raspberry Pi Baremetal - -on: - push: - branches: ["main"] - pull_request: - types: [opened, reopened, synchronize, ready_for_review] - workflow_dispatch: - -jobs: - build: - name: Build - runs-on: ubuntu-24.04 - - strategy: - fail-fast: false - matrix: - example: [rpi-4b-blink, rpi-5-blink] - - steps: - - name: Checkout repo - uses: actions/checkout@v4 - - - name: Install apt dependencies - run: sudo apt-get -qq update && sudo apt-get -qq -y install make llvm - - - name: Install Swift - uses: ./.github/actions/install-swift - - - name: Build ${{ matrix.example }} - working-directory: ${{ matrix.example }} - run: make diff --git a/.github/workflows/build-rpi-pico-sdk.yml b/.github/workflows/build-rpi-pico-sdk.yml deleted file mode 100644 index 258c65c3..00000000 --- a/.github/workflows/build-rpi-pico-sdk.yml +++ /dev/null @@ -1,77 +0,0 @@ -name: Raspberry Pi Pico SDK - -on: - push: - branches: ["main"] - pull_request: - types: [opened, reopened, synchronize, ready_for_review] - workflow_dispatch: - -jobs: - build: - name: Build - runs-on: ubuntu-24.04 - - strategy: - fail-fast: false - matrix: - example: - - name: rpi-pico-blink-sdk - board: pico - - name: rpi-picow-blink-sdk - board: pico_w - - name: harmony - board: pico_w - - steps: - - name: Checkout repo - uses: actions/checkout@v4 - - - name: Install apt dependencies - run: sudo apt-get -qq update && sudo apt-get -qq -y install curl ninja-build python3 - - - name: Install CMake 3.30.2 - run: | - ARCH=`uname -m` - curl -sL https://github.com/Kitware/CMake/releases/download/v3.30.2/cmake-3.30.2-linux-$ARCH.tar.gz -O - tar xzf cmake-3.30.2-linux-$ARCH.tar.gz - export PATH="`pwd`/cmake-3.30.2-linux-$ARCH/bin:$PATH" - echo "PATH=$PATH" >> $GITHUB_ENV - cmake --version - - - name: Install GNU ARM toolchain - run: | - ARCH=`uname -m` - curl -sL https://developer.arm.com/-/media/Files/downloads/gnu/14.2.rel1/binrel/arm-gnu-toolchain-14.2.rel1-$ARCH-arm-none-eabi.tar.xz -O - tar xf arm-gnu-toolchain-14.2.rel1-$ARCH-arm-none-eabi.tar.xz - - - name: Install Swift - uses: ./.github/actions/install-swift - - - name: Clone Pico SDK - run: | - git clone https://github.com/raspberrypi/pico-sdk.git - cd pico-sdk - git submodule update --init --recursive - cd .. - - - name: Clone Pico Extras - run: | - git clone https://github.com/raspberrypi/pico-extras.git - cd pico-extras - git submodule update --init --recursive - cd .. - - - name: Set Pico environment variables - run: | - ARCH=`uname -m` - echo "PICO_BOARD=${{ matrix.example.board }}" >> $GITHUB_ENV - echo "PICO_SDK_PATH=`pwd`/pico-sdk" >> $GITHUB_ENV - echo "PICO_EXTRAS_PATH=`pwd`/pico-extras" >> $GITHUB_ENV - echo "PICO_TOOLCHAIN_PATH=`pwd`/arm-gnu-toolchain-14.2.rel1-$ARCH-arm-none-eabi" >> $GITHUB_ENV - - - name: Build ${{ matrix.example.name }} - working-directory: ${{ matrix.example.name }} - run: | - cmake -B build -G Ninja . - cmake --build build diff --git a/.github/workflows/build-stm.yml b/.github/workflows/build-stm.yml deleted file mode 100644 index 57afd2c0..00000000 --- a/.github/workflows/build-stm.yml +++ /dev/null @@ -1,56 +0,0 @@ -name: STM32 - -on: - push: - branches: ["main"] - pull_request: - types: [opened, reopened, synchronize, ready_for_review] - workflow_dispatch: - -jobs: - build: - name: Build - runs-on: ubuntu-24.04 - - strategy: - fail-fast: false - matrix: - example: [stm32-blink, stm32-lvgl] - - steps: - - name: Checkout repo - uses: actions/checkout@v4 - - - name: Fixup for running locally in act - if: ${{ env.ACT }} - run: echo /opt/acttoolcache/node/18.20.8/x64/bin >> $GITHUB_PATH - - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: 3.11 - - - name: Install uv - uses: astral-sh/setup-uv@v5 - - - name: Install Swift - uses: ./.github/actions/install-swift - - - name: Set environment variables - run: | - echo "STM_BOARD=STM32F746G_DISCOVERY" >> $GITHUB_ENV - - - name: Build ${{ matrix.example }} - working-directory: ${{ matrix.example }} - run: | - if [[ -f ./fetch-dependencies.sh ]]; then - ./fetch-dependencies.sh - fi - - if [[ -f ./build-elf.sh ]]; then - ./build-elf.sh - fi - - if [[ -f Makefile ]]; then - make - fi diff --git a/.github/workflows/build-zephyr.yml b/.github/workflows/build-zephyr.yml deleted file mode 100644 index 96c83b1c..00000000 --- a/.github/workflows/build-zephyr.yml +++ /dev/null @@ -1,41 +0,0 @@ -name: Zephyr - -on: - push: - branches: ["main"] - pull_request: - types: [opened, reopened, synchronize, ready_for_review] - workflow_dispatch: - -jobs: - build: - name: Build - runs-on: ubuntu-24.04 - - strategy: - fail-fast: false - matrix: - example: [nrfx-blink-sdk] - - steps: - - name: Checkout repo - uses: actions/checkout@v4 - - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: 3.11 - - - name: Setup Zephyr project - uses: zephyrproject-rtos/action-zephyr-setup@v1 - with: - app-path: ${{ matrix.example }} - toolchains: arm-zephyr-eabi - sdk-version: 0.17.0 - - - name: Install Swift - uses: ./.github/actions/install-swift - - - name: Build ${{ matrix.example }} - working-directory: ${{ matrix.example }} - run: west build -b nrf52840dk/nrf52840 diff --git a/.swiftformatignore b/.swiftformatignore deleted file mode 100644 index cec22c76..00000000 --- a/.swiftformatignore +++ /dev/null @@ -1,6 +0,0 @@ -./harmony/* -./stm32-lvgl/* -./stm32-lcd-logo/Sources/STM32F7X6/* -./stm32-lvgl/Sources/Registers/* -./stm32-neopixel/Sources/STM32F7X6/* -./stm32-uart-echo/Sources/STM32F7X6/* diff --git a/CODEOWNERS b/CODEOWNERS deleted file mode 100644 index e0985355..00000000 --- a/CODEOWNERS +++ /dev/null @@ -1,19 +0,0 @@ -# This file is a list of the people responsible for ensuring that patches for a -# particular part of Swift are reviewed, either by themselves or by someone else. -# They are also the gatekeepers for their part of Swift, with the final word on -# what goes in or not. -# -# The list is sorted by surname and formatted to allow easy grepping and -# beautification by scripts. The fields are: name (N), email (E), web-address -# (W), PGP key ID and fingerprint (P), description (D), and snail-mail address -# (S). - -# N: Kuba Mracek -# E: mracek@apple.com -# D: Everything in swift-embedded-examples not covered by someone else - -### - -# The following lines are used by GitHub to automatically recommend reviewers. - -* @kubamracek @rauhul diff --git a/Documentation/README.md b/Documentation/README.md deleted file mode 100644 index 76b87d28..00000000 --- a/Documentation/README.md +++ /dev/null @@ -1,6 +0,0 @@ -Documentation for Embedded Swift -================================ - -Documentation for Embedded Swift can be found at these locations: -- [in rendered form at docs.swift.org](https://docs.swift.org/embedded/documentation/embedded/) -- [DocC source code](/Sources/EmbeddedSwift/Documentation.docc) diff --git a/Package.resolved b/Package.resolved deleted file mode 100644 index 034f2da3..00000000 --- a/Package.resolved +++ /dev/null @@ -1,24 +0,0 @@ -{ - "originHash" : "ffbd64644921de7b1a9cb8b17d9ecb480b14c4b6487677314b16730c1b12221b", - "pins" : [ - { - "identity" : "swift-docc-plugin", - "kind" : "remoteSourceControl", - "location" : "https://github.com/swiftlang/swift-docc-plugin", - "state" : { - "revision" : "85e4bb4e1cd62cec64a4b8e769dcefdf0c5b9d64", - "version" : "1.4.3" - } - }, - { - "identity" : "swift-docc-symbolkit", - "kind" : "remoteSourceControl", - "location" : "https://github.com/swiftlang/swift-docc-symbolkit", - "state" : { - "revision" : "b45d1f2ed151d057b54504d653e0da5552844e34", - "version" : "1.0.0" - } - } - ], - "version" : 3 -} diff --git a/Package.swift b/Package.swift deleted file mode 100644 index ab3b65ab..00000000 --- a/Package.swift +++ /dev/null @@ -1,16 +0,0 @@ -// swift-tools-version: 6.0 - -import PackageDescription - -let package = Package( - name: "swift-embedded-examples", - products: [ - .library(name: "EmbeddedSwift", targets: ["EmbeddedSwift"]) - ], - dependencies: [ - .package( - url: "https://github.com/swiftlang/swift-docc-plugin", from: "1.1.0") - ], - targets: [ - .target(name: "EmbeddedSwift") - ]) diff --git a/README.md b/README.md index cb7805b1..6915d325 100644 --- a/README.md +++ b/README.md @@ -1,78 +1,12 @@ -# Embedded Swift Example Projects +# Arduino Embedded Swift Example Projects -This repository is a set of demonstration projects of **Embedded Swift**. Embedded Swift is a compilation and language mode that enables development of baremetal, embedded and standalone software in Swift. To learn more, see: +This repository is a set of demonstration projects that use the [Arduino libraries](https://github.com/espressif/arduino-esp32/) and Embedded Swift. To learn more, see [swiftlang/swift-embedded-examples](https://github.com/swiftlang/swift-embedded-examples). -- [Blog post introducing this repository](https://www.swift.org/blog/embedded-swift-examples/) -- [Swift forums thread about this repository](https://forums.swift.org/t/embedded-swift-example-projects-for-arm-and-risc-v-microcontrollers/71066) -- [Discussions about Embedded Swift on the Swift forums](https://forums.swift.org/t/embedded-swift/67057) -- [Embedded Swift Vision Document](https://github.com/swiftlang/swift-evolution/blob/main/visions/embedded-swift.md) -- [Documentation for Embedded Swift](https://github.com/swiftlang/swift/tree/main/docs/EmbeddedSwift) +## Examples -## Building the examples +| Name | Platform | SDK | Description | +| ------------------------------------------------------------ | ------------------ | ----------- | -------------------------------------------------------------------------- | +| [arduino-esp32-led-blink-sdk](./arduino-esp32-led-blink-sdk) | ESP32-C6-DevKitC-1 | ESP-IDF SDK | Blink an LED repeatedly with Swift, the ESP-IDF and the Arduino libraries. | +| [arduino-esp32-wifi-scan-sdk](./arduino-esp32-wifi-scan-sdk) | ESP32-C6-DevKitC-1 | ESP-IDF SDK | Scan for WiFi networks using Swift, the ESP-IDF and the Arduino libraries. | -Each example in this repository contains build and deployment instructions, however there are a couple common steps needed for many of the examples included below: -1. Install [`swift`](https://swift.org) using the [instructions here](https://swiftpackageindex.com/swiftlang/swift-embedded-examples/main/documentation/embeddedswift/installembeddedswift). - -2. Install [`uv`](https://github.com/astral-sh/uv), "an extremely fast Python package and project manager", using the [instructions here](https://docs.astral.sh/uv/getting-started/installation/). - -## Catalog of Examples - -| Name | Platform | SDK | Description | Photo | -| ---- | -------- | --- | ----------- | ----- | -| [arduino-esp32-led-blink-sdk](./arduino-esp32-led-blink-sdk) | ESP32-C6-DevKitC-1 | ESP-IDF SDK | Blink an LED repeatedly with Swift, the ESP-IDF and the Arduino libraries. | | -| [arduino-esp32-wifi-scan-sdk](./arduino-esp32-wifi-scan-sdk) | ESP32-C6-DevKitC-1 | ESP-IDF SDK | Scan for WiFi networks using Swift, the ESP-IDF and the Arduino libraries. | | -| [esp32-led-blink-sdk](./esp32-led-blink-sdk) | ESP32-C6-Bug | ESP-IDF SDK | Blink an LED repeatedly with Swift & the ESP-IDF. | | -| [esp32-led-strip-sdk](./esp32-led-strip-sdk) | ESP32-C6-DevKitC-1 | ESP-IDF SDK | Control NeoPixel LEDs with Swift & the ESP-IDF. | | -| [harmony](./harmony) | Raspberry Pi Pico W | Pico SDK | A bluetooth speaker and ferrofluidic music visualizer. Firmware, Electrical, and Mechanical designs fully available. | | -| [nrfx-blink-sdk](./nrfx-blink-sdk) | nRF52840-DK | Zephyr SDK | Blink an LED repeatedly with Swift & Zephyr. | | -| [nuttx-riscv-blink](./nuttx-riscv-blink) | QEMU | NuttX | Blink a virualized led in QEMU using the Apache NuttX RTOS | | -| [rpi-4b-blink](./rpi-4b-blink) | Raspberry Pi 4B | None | Blink the Pi's status green LED repeatedly using Swift MMIO. | | -| [rpi-5-blink](./rpi-5-blink) | Raspberry Pi 5 | None | Blink the Pi's status green LED repeatedly with Swift MMIO. | | -| [rpi-pico-blink-sdk](./rpi-pico-blink-sdk) | Raspberry Pi Pico, Pico 2 | Pico SDK | Blink an LED repeatedly with Swift & the Pico SDK. | | -| [rpi-pico-blink](./rpi-pico-blink) | Raspberry Pi Pico | None | Blink an LED repeatedly. | | -| [rpi-pico2-neopixel](./rpi-pico2-neopixel) | Raspberry Pi Pico 2 | None | Control Neopixel LEDs using the RP2350 PIO. | | -| [rpi-picow-blink-sdk](./rpi-picow-blink-sdk) | Raspberry Pi Pico W, Pico 2W | Pico SDK | Blink an LED to signal 'SOS' in Morse code repeatedly with Swift & the Pico SDK. | | -| [stm32-blink](./stm32-blink) | STM32F746G-DISCO | None | Blink an LED repeatedly. | | -| [stm32-lcd-logo](./stm32-lcd-logo) | STM32F746G-DISCO | None | Animate the Swift Logo on the built-in LCD. | | -| [stm32-lvgl](./stm32-lvgl) | STM32F746G-DISCO | – | Baremetal setup of LCD, touch panel, DRAM, using the LLVM Embedded toolchain for ARM. Renders graphics, animations, and reacts to user input via LVGL. Includes a macOS/Linux SDL based host simulation app. | | -| [stm32-neopixel](./stm32-neopixel) | STM32F746G-DISCO | None | Control NeoPixel LEDs using SPI. | | -| [stm32-uart-echo](./stm32-uart-echo) | STM32F746G-DISCO | None | Echo user input using UART. | | - -Note that the SDK integration examples (Pico SDK, Zephyr SDK, etc.) are not recommendations or endorsement, the same is true for build system choice (Make, CMake, SwiftPM, shell scripts). Embedded Swift aims to be versatile and allowing integration into existing SDKs and build systems, and the example projects show some of the possibilities. - -## Community Examples - -> [!WARNING] -> Community projects linked here are not officially supported by our team. They may not always be compatible with the latest nightly Swift toolchain builds. - - - -| Name | Platform | Description | -| ---- | -------- | ----------- | -| [swift-matter-examples](https://github.com/swiftlang/swift-matter-examples) | ESP32 | An Embedded Swift Matter application running on ESP32-C6. | -| [swift-flipperzero-hello](https://github.com/Sameesunkaria/swift-flipperzero-hello) | Flipper Zero | A demonstration of running Swift apps on the Flipper Zero. | -| [EmbeddedSwift nRF52 Examples](https://github.com/nelcea/EmbeddedSwift-nRF52-Examples) | nRF52840 (Development Kit) | A collection of examples using Embedded Swift on top of nRF Connect SDK (Zephyr). | -| [Swatak](https://github.com/nelcea/EmbeddedSwift-nRF52-Swatak) | nRF52840 (Seeed Studio XIAO) | A reaction time game inspired by BATAK© boards, implemented in Embedded Swift using nRF Connect SDK. | -| [swift-picosystem-example](https://github.com/jerrodputman/swift-picosystem-example) | PicoSystem | An Embedded Swift demo running on the Pimoroni PicoSystem | -| [PlaydateKit](https://github.com/finnvoor/PlaydateKit) | Playdate | A full featured framework for building Playdate games using Embedded Swift. | -| [swift-playdate-examples](https://github.com/swiftlang/swift-playdate-examples) | Playdate | An Embedded Swift game running on Playdate by Panic. | -| [swift-stm32c011-examples](https://github.com/xtremekforever/swift-stm32c011-examples) | STM32 | Examples of running Embedded Swift on the STM32C011, which is a tiny MCU with only 6KB of SRAM and 32KB of flash. | -| [flappy-swift](https://github.com/sliemeobn/flappy-swift) | Web | A WebAssembly game written in Swift in ~100 KB. | -| [swift-for-wasm-examples](https://github.com/swiftlang/swift-for-wasm-examples) | Web | A "Swift Audio Workstation" example built with Swift for WebAssembly running in the browser using Embedded Swift. | - -Please note that the presence of community repositories and devices in this list does not constitute a recommendation or endorsement. If there's a project you'd like to see included here, please [submit an issue](https://github.com/swiftlang/swift-embedded-examples/issues/new) with the details. - -## Contributing to this repository - -This repository contains code that is not continuously developed, instead it's presented "as is" for educational and demonstrational purposes. Making major improvements to existing examples is discouraged, but additions of new examples is welcome. - -### Code of Conduct - -Like all Swift.org projects, we would like these Embedded Swift example projects to foster a diverse and friendly community. We expect contributors to adhere to the [Swift.org Code of Conduct](https://swift.org/code-of-conduct/). - -### Contact information - -The current code owners of this repository are Kuba Mracek ([@kubamracek](https://github.com/kubamracek)) and Rauhul Varma ([@rauhul](https://github.com/rauhul)). You can contact them on the Swift forums via the handles [@kubamracek](https://forums.swift.org/u/kubamracek/summary) and [@rauhul](https://forums.swift.org/u/rauhul/summary). - -In case of moderation issues, you can also directly contact a member of the [Swift Core Team](https://swift.org/community/#community-structure). diff --git a/Sources/EmbeddedSwift/Documentation.docc/BuildSystemSupport/IntegrateWithBazel.md-wip b/Sources/EmbeddedSwift/Documentation.docc/BuildSystemSupport/IntegrateWithBazel.md-wip deleted file mode 100644 index 44298f61..00000000 --- a/Sources/EmbeddedSwift/Documentation.docc/BuildSystemSupport/IntegrateWithBazel.md-wip +++ /dev/null @@ -1,3 +0,0 @@ -# Integrate with Bazel - -🚧 Under construction... diff --git a/Sources/EmbeddedSwift/Documentation.docc/BuildSystemSupport/IntegrateWithCMake.md-wip b/Sources/EmbeddedSwift/Documentation.docc/BuildSystemSupport/IntegrateWithCMake.md-wip deleted file mode 100644 index a4b1ade8..00000000 --- a/Sources/EmbeddedSwift/Documentation.docc/BuildSystemSupport/IntegrateWithCMake.md-wip +++ /dev/null @@ -1,3 +0,0 @@ -# Integrate with CMake - -🚧 Under construction... diff --git a/Sources/EmbeddedSwift/Documentation.docc/BuildSystemSupport/IntegrateWithMake.md-wip b/Sources/EmbeddedSwift/Documentation.docc/BuildSystemSupport/IntegrateWithMake.md-wip deleted file mode 100644 index 9cd03df9..00000000 --- a/Sources/EmbeddedSwift/Documentation.docc/BuildSystemSupport/IntegrateWithMake.md-wip +++ /dev/null @@ -1,3 +0,0 @@ -# Integrate with Make - -🚧 Under construction... diff --git a/Sources/EmbeddedSwift/Documentation.docc/BuildSystemSupport/IntegrateWithSwiftPM.md-wip b/Sources/EmbeddedSwift/Documentation.docc/BuildSystemSupport/IntegrateWithSwiftPM.md-wip deleted file mode 100644 index 9c01a760..00000000 --- a/Sources/EmbeddedSwift/Documentation.docc/BuildSystemSupport/IntegrateWithSwiftPM.md-wip +++ /dev/null @@ -1,3 +0,0 @@ -# Integrate with SwiftPM - -🚧 Under construction... diff --git a/Sources/EmbeddedSwift/Documentation.docc/BuildSystemSupport/IntegrateWithXcode.md-wip b/Sources/EmbeddedSwift/Documentation.docc/BuildSystemSupport/IntegrateWithXcode.md-wip deleted file mode 100644 index e1b79af7..00000000 --- a/Sources/EmbeddedSwift/Documentation.docc/BuildSystemSupport/IntegrateWithXcode.md-wip +++ /dev/null @@ -1,6 +0,0 @@ -# Integrate with Xcode - -🚧 Under construction... - -> Warning: Embedded Swift integration with Xcode is still under development and -> subject to change. diff --git a/Sources/EmbeddedSwift/Documentation.docc/CompilerDetails/ABI.md b/Sources/EmbeddedSwift/Documentation.docc/CompilerDetails/ABI.md deleted file mode 100644 index 54aee6ac..00000000 --- a/Sources/EmbeddedSwift/Documentation.docc/CompilerDetails/ABI.md +++ /dev/null @@ -1,54 +0,0 @@ -# ABI of Embedded Swift - -Understanding the different ABI (Application Binary Interface) for Embedded Swift - -## ABI stability - -The ABI of code generated by Embedded Swift is not currently stable. For a concrete compiler version, it will be consistent, but do not mix code built with different compiler versions. - -Similarly, do not mix Embedded Swift code with full Swift code, as the ABIs are different. Details are described in the following sections. - -## Symbol mangling under Embedded Swift - -Since Swift 5.0, the stable ABI mangling scheme uses the `$s` prefix on all Swift symbols. Because Embedded Swift's ABI differs from the stable ABI, and furthermore because it's not expected to be stable, Embedded Swift uses a `$e` mangling prefix. The logic and structure of the mangling stays the same, the only difference is the prefix. - -## Calling convention of Embedded Swift - -As of today, Embedded Swift has identical calling convention to full Swift. However, this does not need to continue in the future, and there should not be expectations that the ABI of Embedded Swift is compatible with full Swift. - -The compiler respects the ABIs and calling conventions of C and C++ when interoperating with code in those languages. Calling C/C++ functions from Embedded Swift code is supported, and similarly exporting Swift code via `@_extern`, `@_cdecl` or `@_expose` will match the right calling conventions that C/C++ expects. - -## Metadata ABI of Embedded Swift - -Embedded Swift eliminates almost all metadata compared to full Swift. However, class and existential metadata are still used, because those serve as vtables and witness tables for dynamic dispatch of methods to implement runtime polymorphism with classes and existentials. - -### Class Metadata ABI - -The layout of Embedded Swift's class metadata is *different* from full Swift: - -- The **super pointer** pointing to the class metadata record for the superclass is stored at **offset 0**. If the class is a root class, it is null. -- The **destructor pointer** is stored at **offset 1**. This function is invoked by Swift's deallocator when the class instance is destroyed. -- The **ivar destroyer** is stored at **offset 2**. This function is invoked to destroy instance members when creation of the object is cancelled (e.g. in a failable initializer). -- Lastly, the **vtable** is stored at **offset 3**: For each Swift class in the class's inheritance hierarchy, in order starting - from the root class and working down to the most derived class, the function pointers to the implementation of every method of the class in declaration order is stored. - -### Witness Tables ABI - -The layout of Embedded Swift's witness tables is *different* from full Swift: - -- The first word is always a null pointer (TODO: it can be eliminated) -- The following words are witness table entries which can be one of the following: - - A method witness: a pointer to the witness function. - - An associated conformance witness: a pointer to the witness table of the associated conformance - -Note that witness tables in Embedded Swift do not contain associated type entries. - -Witness functions are always specialized for concrete types. This also means that parameters and return values are passed directly (if possible). - -## Heap object layout in Embedded Swift - -Heap objects have the following layout in Embedded Swift: - -- The **isa pointer** (pointer to the class metadata) is stored at **offset 0**. -- The **refcount** is stored inline at **offset 1**. -- Normal stored properties follow. diff --git a/Sources/EmbeddedSwift/Documentation.docc/CompilerDetails/Status.md b/Sources/EmbeddedSwift/Documentation.docc/CompilerDetails/Status.md deleted file mode 100644 index a1d156f7..00000000 --- a/Sources/EmbeddedSwift/Documentation.docc/CompilerDetails/Status.md +++ /dev/null @@ -1,73 +0,0 @@ -# Implementation Status - -Implementation status of compiler and language features in Embedded Swift, comparison to standard Swift - -## Embedded Swift Language Features - -| **Language Feature** | **Currently Supported In Embedded Swift** | -|-------------------------------------------------------|------------------------------------------------------------------------------------| -| *Anything not listed below* | Yes | -| Library Evolution (resilience) | No, intentionally unsupported long-term | -| Objective-C interoperability | No, intentionally unsupported long-term | -| Non-WMO builds | No, intentionally unsupported long-term (WMO should be used) | -| Existentials (values of protocol types) | Only class-bound existentials (for protocols derived from AnyObject) are supported | -| Any | No, currently disallowed | -| AnyObject | Yes | -| Metatypes | No, currently only allowed as unused arguments (type hints) | -| Untyped throwing | No, intentionally unsupported long-term (typed throwing should be used instead) | -| Weak references, unowned references | No | -| Non-final generic class methods | No, intentionally unsupported long-term, see | -| Parameter packs (variadic generics) | No, not yet supported | - -## Embedded Standard Library Breakdown - -This status table describes which of the following standard library features can be used in Embedded Swift: - -| **Swift Standard Library Feature** | **Currently Supported In Embedded Swift?** | -|------------------------------------------------------------|-----------------------------------------------------| -| Array (dynamic heap-allocated container) | Yes | -| Array slices | Yes | -| assert, precondition, fatalError | Partial, only StaticStrings can be used as a failure message | -| Bool, Integer types, Float types | Yes | -| Codable, Encodable, Decodable | No | -| Collection + related protocols | Yes | -| Collection algorithms (sort, reverse) | Yes | -| CustomStringConvertible, CustomDebugStringConvertible | Yes, except those that require reflection (e.g. Array's .description) | -| Dictionary (dynamic heap-allocated container) | Yes | -| Floating-point conversion to string | No | -| Floating-point parsing | No | -| FixedWidthInteger + related protocols | Yes | -| Hashable, Equatable, Comparable protocols | Yes | -| InputStream, OutputStream | No | -| Integer conversion to string | Yes | -| Integer parsing | Yes | -| KeyPaths | Partial (only compile-time constant key paths to stored properties supported, only usable in MemoryLayout and UnsafePointer APIs) | -| Lazy collections | Yes | -| ManagedBuffer | Yes | -| Mirror (runtime reflection) | No, intentionally unsupported long-term | -| Objective-C bridging | No, intentionally unsupported long-term | -| Optional | Yes | -| print / debugPrint | Partial (only String, string interpolation, StaticStrings, integers, pointers and booleans, and custom types that are CustomStringConvertible) | -| Range, ClosedRange, Stride | Yes | -| Result | Yes | -| Set (dynamic heap-allocated container) | Yes | -| SIMD types | Yes | -| StaticString | Yes | -| String (dynamic) | Yes | -| String interpolations | Partial (only strings, integers, booleans, and custom types that are CustomStringConvertible can be interpolated) | -| Unicode | Yes | -| Unsafe\[Mutable\]\[Raw\]\[Buffer\]Pointer | Yes | -| VarArgs | No | - -## Non-stdlib Features - -This status table describes which of the following Swift features can be used in Embedded Swift: - -| **Swift Feature** | **Currently Supported In Embedded Swift?** | -|------------------------------------------------------------|-----------------------------------------------------| -| Synchronization module | Partial (only Atomic types, no Mutex) | -| Swift Concurrency | Partial, experimental (basics of actors and tasks work in single-threaded concurrency mode) | -| C interop | Yes | -| C++ interop | Yes | -| ObjC interop | No, intentionally unsupported long-term | -| Library Evolution | No, intentionally unsupported long-term | diff --git a/Sources/EmbeddedSwift/Documentation.docc/Documentation.md b/Sources/EmbeddedSwift/Documentation.docc/Documentation.md deleted file mode 100644 index 2439abb7..00000000 --- a/Sources/EmbeddedSwift/Documentation.docc/Documentation.md +++ /dev/null @@ -1,53 +0,0 @@ -# Embedded Swift - -Embedded Swift is a compilation and language mode that enables development of baremetal, embedded and standalone software in Swift - -@Metadata { - @TechnologyRoot -} - -## Topics - -### Getting Started - -- -- -- - -### Guided Examples - -- -- -- -- - -### Using Embedded Swift - -- -- -- -- -- -- -- - -### Build System Support - -- -- -- -- -- - -### SDK Support - -- -- -- -- -- - -### Compiler Development and Details - -- -- diff --git a/Sources/EmbeddedSwift/Documentation.docc/GettingStarted/InstallEmbeddedSwift.md b/Sources/EmbeddedSwift/Documentation.docc/GettingStarted/InstallEmbeddedSwift.md deleted file mode 100644 index efb26272..00000000 --- a/Sources/EmbeddedSwift/Documentation.docc/GettingStarted/InstallEmbeddedSwift.md +++ /dev/null @@ -1,30 +0,0 @@ -# Install Embedded Swift - -Get the tools needed to use Embedded Swift - -## Overview - -The best way to install Swift for embedded development is using [`swiftly`](http://github.com/swiftlang/swiftly), the official Swift toolchain installer and manager. Since Embedded Swift is still experimental and not yet supported in public Swift releases, you'll need to use a development toolchain. - -For instructions on how to install `swiftly`, check out the [Getting Started](https://www.swift.org/swiftly/documentation/swiftly/getting-started) guide. - -> Note: Swiftly installs the latest release toolchain during `swiftly init`, if you only plan on using Embedded Swift, you can avoid downloading this toolchain by using the `swiftly init --skip-install` option. - -After installing Swiftly, install the latest main "Development Snapshot" toolchain available for your platform by running: - -```shell -$ swiftly install main-snapshot -... -main-snapshot-2025-04-12 installed successfully! -``` - -To test that you have Swift installed, run `swift --version` from your shell or terminal app. It should say "6.2-dev", meaning you have a "Development Snapshot" toolchain. - -```shell -$ swift --version -Apple Swift version 6.2-dev (LLVM 81ab6d9f7e4810f, Swift 9cc1947527bacea) -Target: arm64-apple-macosx15.0 -Build config: +assertions -``` - -> Warning: When using other shells, like one integrated into an IDE, be careful to verify that the version of Swift reported matches that of the shell you used to install Swift. diff --git a/Sources/EmbeddedSwift/Documentation.docc/GettingStarted/Introduction.md b/Sources/EmbeddedSwift/Documentation.docc/GettingStarted/Introduction.md deleted file mode 100644 index 4344ec63..00000000 --- a/Sources/EmbeddedSwift/Documentation.docc/GettingStarted/Introduction.md +++ /dev/null @@ -1,62 +0,0 @@ -# Introduction to Embedded Swift - -Write Swift code for microcontrollers, embedded systems, and bare-metal applications - -## Overview - -Embedded Swift is an experimental and rapidly developing feature of the Swift language that enables development of baremetal, embedded and standalone software. It's a subset of the Swift language designed for producing small, efficient binaries with minimal dependencies, making it suitable for resource-constrained environments. - -> Note: Embedded Swift is experimental. Public releases of Swift do not support Embedded Swift, yet. See for details. - -## How does Embedded Swift differ from regular Swift? - -Regular Swift is not a good fit for small constrained environments like microcontrollers, mainly due to codesize and memory footprint. Regular Swift typically requires at least a few megabytes of code and data to support dynamic language features like reflection, and separately compiled generics with ABI stability. Embedded Swift, on the other hand, can be deployed to environments with as little as kilobytes of available memory. This is achieved by: - -- Eliminating runtime type metadata where possible -- Removing reflection capabilities -- Using compile-time specialization (monomorphization) for generic code -- Minimizing dependencies on external libraries - -It's also a good mental model to think of the Swift compiler in Embedded Swift mode as operating on a way a *traditional C compiler* does — specifically in the sense that the compiler produces an object file that does not call into or depend on symbols that are not explicitly used in the source code. This is achieved even for code that uses generics, protocols, tuples, arrays, and more — all the higher-level language features are "compiled out" (e.g. generics are specialized), and standard library code is pulled into the object file as needed (e.g. array implementation). - -This results in properties that are a great fit for embedded software development: - -- **Small binaries** that can be as tiny as a few hundred bytes for "Hello World"-like programs (fully self-contained). -- **No hidden runtime costs** – Embedded Swift's runtime library does not manage any data structures behind your back, is itself less than a kilobyte in size, and is eligible to be removed if unused. -- **No hidden allocations** which would cause unpredictable performance cliffs. -- **Full C/C++ interoperability** to directly interact with existing C libraries and hardware-specific code, making it easy to integrate with vendor SDKs. -- **Modern language features** like optionals, generics, and strong type safety are all available in Embedded Swift. -- **Full safety of Swift** is retained in Embedded Swift. - -For a detailed introduction and motivation into Embedded Swift, please see "[A Vision for Embedded Swift](https://github.com/swiftlang/swift-evolution/blob/main/visions/embedded-swift.md)", a Swift Evolution document highlighting the main goals and approaches. Note that this is a historical document and does not capture latest development and further evolution. For an up-to-date in-depth breakdown of the language features of Embedded Swift, please see . - -## What Embedded Swift is and isn't - -- Embedded Swift **is** a way to produce small and freestanding binaries (with no, or trivial dependencies). -- Embedded Swift **is not** a complete one-click solution to program all embedded boards and MCUs. -- Embedded Swift **is** a compilation model that's analogous to a traditional C compiler in the sense that the compiler produces an object file (.o) that can be simply linked with your existing code, and it's not going to require you to port any libraries or runtimes. -- Embedded Swift **is not** a HAL, it's not an SDK for development, it's not a set of libraries to program peripherals using high-level APIs. It's instead a compilation mode that's suitable for creating these components. - -## Platform support - -The Swift toolchain has the ability to produce code for almost any standard ARM and RISC-V platform, and that makes Embedded Swift versatile and not limited to specific platforms or hardware devices. This way, Embedded Swift can potentially target many different microcontroller families and embedded devices. - -Boards with active community support include the Raspberry Pi Pico, various STM32 development boards, various nRF52840 based boards and several ESP32 variants, with more platforms being regularly added as the community grows. - -## Interoperability with existing SDKs - -Software projects using Embedded Swift are typically developed in one of the following ways: - -1. Integrating with an existing SDK (typically in C, or C++) that provides either an embedded OS, or OS-like facilities, hardware drivers, and overall functionality that's needed for embedded software. - -2. Writing fully "bare-metal" code, without any pre-existing setup or SDK. This is typically done for extremely constrained environments and/or when full control of every piece of code is needed. - -Both the approaches are readily available in Embedded Swift, and the choice of which approach to use depends on your specific project requirements, hardware constraints, and development preferences. For integrating with existing SDKs, Swift's C/C++ interoperability makes it straightforward to call native SDK functions, while the bare-metal approach gives you complete control over every aspect of your code's execution environment. - -## Getting Started - -To start using Embedded Swift, please see the page for installation instructions. - -Once you've set up the toolchain, we recommend exploring the page which provides various paths for getting started, including the to try Embedded Swift on your development machine, and more advanced guides such as for programming an actual embedded device. - -For details about using Embedded Swift, consult the documentation, which explains how to build code with Embedded Swift and shows integration patterns with embedded SDKs and build systems. diff --git a/Sources/EmbeddedSwift/Documentation.docc/GettingStarted/LanguageSubset.md b/Sources/EmbeddedSwift/Documentation.docc/GettingStarted/LanguageSubset.md deleted file mode 100644 index 1120fbb1..00000000 --- a/Sources/EmbeddedSwift/Documentation.docc/GettingStarted/LanguageSubset.md +++ /dev/null @@ -1,30 +0,0 @@ -# Language subset - -Details of the Embedded Swift language subset compared to full Swift - -Embedded Swift is a subset of the Swift language, and some features are not available in Embedded Swift. This is necessary in order to achieve small binaries with effective dead-code elimination and minimized system dependencies. - -That said, *the vast majority* of the Swift language works exactly the same in Embedded Swift. This includes generics, protocols, enums with associated values, tuples, optionals, classes (instances are allocated on the heap and refcounted just like in regular Swift), inheritance, runtime polymorphism, arrays (heap-allocated copy-on-write just like in regular Swift) and much more. - -Note that there are no behavior changes in Embedded Swift compared to full Swift, and Embedded Swift is strictly a *subset* and not a *dialect*. Any code compatible with Embedded Swift will also compile and have the same semantics in full Swift. - -## Code-level features that are not available - -- **Not available**: Runtime reflection (`Mirror` APIs). -- **Not available**: Values of protocol types ("existentials"), unless the protocol is restricted to be class-bound (derived from AnyObject). E.g. `let a: Hashable = ...` is not allowed. `Any` is also not allowed. See for details and alternatives of existentials. -- **Not available**: Throwing errors or `any Error` type (in contrast with "typed throws", which *is* supported in Embedded Swift). -- **Not available**: Metatypes, e.g. `let t = SomeClass.Type` or `type(of: value)` are not allowed. -- **Not available**: Standard library types that rely on the above, for example `Codable` and `KeyPath`, are not allowed. -- **Not available**: Printing and stringification of arbitrary types (which is achieved via reflection in desktop Swift). -- **Not available**: Using non-final generic class methods. See for details on this. -- **Not available**: Weak and unowned references are not allowed (unsafe unowned references *are* available). - -## Compilation facilities that are not available - -- **Not available**: Library Evolution (stable ABI), and facilities that requires Library Evolution (e.g. internal module imports) -- **Not available**: Objective-C interoperability -- **Not available**: Builds without WMO (whole module optimization) - -## Further resources - -The above lists are describing features that are removed from Embedded Swift *by design*. Since Embedded Swift is currently an experimental preview, there might also be features that are not yet implemented. See the in-development status at . diff --git a/Sources/EmbeddedSwift/Documentation.docc/GettingStarted/WaysToGetStarted.md b/Sources/EmbeddedSwift/Documentation.docc/GettingStarted/WaysToGetStarted.md deleted file mode 100644 index 22d189ba..00000000 --- a/Sources/EmbeddedSwift/Documentation.docc/GettingStarted/WaysToGetStarted.md +++ /dev/null @@ -1,40 +0,0 @@ -# Getting started with Embedded Swift - -Possible directions to explore to start using Embedded Swift - -## Introduction - -Embedded Swift is a way to write code for embedded systems using the Swift programming language. Depending on the use case, there are different ways of using it, different ways of integrating with existing ecosystems, and different setups for different hardware devices. This guide will help you explore various paths to get started with embedded development using Swift. - -Before diving into Embedded Swift development, you should have: - -- Basic knowledge of the Swift programming language -- A Swift toolchain installed on your development host -- A target embedded platform in mind (e.g. a Raspberry Pi Pico) - - this can also be a simulated hardware platform (e.g. in QEMU), or even a full desktop OS environment in case you're not interested in controlling low-level hardware or custom electronic peripherals - -> Note: Embedded Swift is experimental. Public releases of Swift do not support Embedded Swift, yet. See for details. - -## Guided Tutorials - -To help you get started with Embedded Swift, we've prepared several step-by-step guides that cover different platforms and use cases: - -- - Try out Embedded Swift on your development machine -- - Build and run Swift code on a Raspberry Pi Pico -- - Set up a baremetal Swift project for STM32 microcontrollers - -These guides provide a practical introduction to Embedded Swift development with specific hardware targets, showing you how to build, upload, and run your first Swift programs on embedded systems. - -## Other Resources - -For a deeper understanding of Embedded Swift concepts and philosophy, check out these resources: - -- - Learn about the core concepts and philosophy of Embedded Swift -- - Understand which Swift language features are available in Embedded Swift -- - Detailed instructions for installing the required toolchain - -For developers coming from embedded C/C++ backgrounds or those integrating Swift into existing projects: - -- - Essential knowledge for using Embedded Swift effectively -- - How to share code between Embedded Swift and standard Swift -- - Understanding how libraries work in Embedded Swift diff --git a/Sources/EmbeddedSwift/Documentation.docc/GuidedExamples/PicoGuide.md b/Sources/EmbeddedSwift/Documentation.docc/GuidedExamples/PicoGuide.md deleted file mode 100644 index d4480e2a..00000000 --- a/Sources/EmbeddedSwift/Documentation.docc/GuidedExamples/PicoGuide.md +++ /dev/null @@ -1,169 +0,0 @@ -# Raspberry Pi Pico Blink (Pico SDK) - -Tutorial for targetting a Raspberry Pi Pico as an embedded device that runs a simple Swift program - -In this guide we'll be targeting a Raspberry Pi Pico as the embedded device that our Swift application will run on. If you don't physically have one, don't worry! You can still run the application in an online emulator. - -## Installing Swift - -> Note: Embedded Swift is experimental. Public releases of Swift do not support Embedded Swift, yet. See for details. - -To install Swift for embedded development, follow the instructions in , which guides you through using `swiftly` to install the latest development snapshot with Embedded Swift support. - -To test that you have Swift installed, run `swift --version` from your shell or terminal app. It should say "6.2-dev" or similar, confirming you have a "Development Snapshot" toolchain. - -## Installing dependencies for embedded development - -Install the Raspberry Pi Pico SDK, and the Arm Embedded Toolchain by following the [Getting Started With Pico guide](https://datasheets.raspberrypi.com/pico/getting-started-with-pico.pdf). -Export three environment variables to match your setup and hardware: - -```shell -$ export PICO_BOARD=pico -$ export PICO_SDK_PATH=... # location to your Pico SDK -$ export PICO_TOOLCHAIN_PATH=... # location to the Arm Embedded Toolchain -``` - -If you have the Wi-Fi enabled Pico W / Pico 2W board instead of the regular Pico, note that you will need a slightly different setup described in the [Pico W example project](https://github.com/swiftlang/swift-embedded-examples/tree/main/rpi-picow-blink-sdk), and just specifying `PICO_BOARD=pico_w` is not going to work. - -Install [CMake 3.29](https://cmake.org/) or newer. - -To test that you have all the necessary parts installed, you can run the following commands in a terminal: - -```shell -$ swift --version -Apple Swift version 6.2-dev (LLVM 81ab6d9f7e4810f, Swift 9cc1947527bacea) -$ cmake --version -cmake version 3.29.2 -$ echo $PICO_BOARD -pico -$ ls $PICO_SDK_PATH -CMakeLists.txt README.md external/ pico_sdk_version.cmake tools/ -CONTRIBUTING.md cmake/ lib/ src/ -LICENSE.TXT docs/ pico_sdk_init.cmake test/ -$ ls $PICO_TOOLCHAIN_PATH -13.2.Rel1-darwin-arm64-arm-none-eabi-manifest.txt include/ share/ -arm-none-eabi/ lib/ -bin/ libexec/ -``` - -## Building a "blinky" embedded app - -The standard "Hello, World" in embedded development is a program that repeatedly blinks an LED. Let's build one. The following setup can be also found in [swift-embedded-examples](https://github.com/swiftlang/swift-embedded-examples/blob/main/rpi-pico-blink-sdk/README.md), but we're going to show below that all you need is just three files. -Let's create a new empty directory and prepare a simple structure for a CMake-based project that can be used on top of the Pico SDK: - -``` -embedded-swift-tutorial -├── BridgingHeader.h -├── CMakeLists.txt -└── Main.swift -``` - -The Main.swift and BridgingHeader.h files can initially have the following basic content: - -```swift -// Main.swift -let led = UInt32(PICO_DEFAULT_LED_PIN) -gpio_init(led) -gpio_set_dir(led, /*out*/true) -while true { - gpio_put(led, true) - sleep_ms(250) - gpio_put(led, false) - sleep_ms(250) -} -``` - -```c -// BridgingHeader.h -#include "pico/stdlib.h" -``` - -To build on top of the Pico SDK's CMake support, we need a bit more CMake logic in the CMakeLists.txt file: - -```cmake -# CMakeLists.txt -cmake_minimum_required(VERSION 3.29) -include($ENV{PICO_SDK_PATH}/external/pico_sdk_import.cmake) - -set(CMAKE_Swift_COMPILATION_MODE wholemodule) -set(CMAKE_Swift_COMPILER_WORKS YES) - -project(blinky) -pico_sdk_init() -enable_language(Swift) - -add_executable(blinky Main.swift) -set_target_properties(blinky PROPERTIES LINKER_LANGUAGE CXX) - -# Clear the default COMPILE_OPTIONS which include C specific compiler flags that the Swift compiler will not accept -# Instead, set those options to only apply when compiling C code. -set_target_properties(pico_standard_link PROPERTIES INTERFACE_COMPILE_OPTIONS "") -target_compile_options(pico_standard_link INTERFACE "$<$:SHELL: -ffunction-sections -fdata-sections>") - -set(SWIFT_INCLUDES) -foreach(dir ${CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES}) - string(CONCAT SWIFT_INCLUDES ${SWIFT_INCLUDES} "-Xcc ") - string(CONCAT SWIFT_INCLUDES ${SWIFT_INCLUDES} "-I${dir} ") -endforeach() - -target_compile_options(blinky PUBLIC "$<$:SHELL: - -enable-experimental-feature Embedded - -target armv6m-none-none-eabi -Xcc -mfloat-abi=soft -Xcc -fshort-enums -Xfrontend -function-sections - -import-bridging-header ${CMAKE_CURRENT_LIST_DIR}/BridgingHeader.h - ${SWIFT_INCLUDES} - >") - -target_link_libraries(blinky pico_stdlib hardware_uart hardware_gpio) -pico_add_extra_outputs(blinky) -``` - -Now we're ready to configure and build this firmware for the Pico. Run the following commands: - -```shell -$ cmake -B build -G Ninja . # configure step -$ cmake --build build # build step -``` - -The build should succeed and produce the firmware in several formats (ELF, HEX, UF2), including some information dump files (DIS, ELF.MAP): - -```shell -$ ls -al build/blinky* --rwxr-xr-x 1 kuba staff 8.0K Jan 1 12:00 build/blinky.bin* --rw-r--r-- 1 kuba staff 145K Jan 1 12:00 build/blinky.dis --rwxr-xr-x 1 kuba staff 30K Jan 1 12:00 build/blinky.elf* --rw-r--r-- 1 kuba staff 222K Jan 1 12:00 build/blinky.elf.map --rw-r--r-- 1 kuba staff 23K Jan 1 12:00 build/blinky.hex --rw-r--r-- 1 kuba staff 16K Jan 1 12:00 build/blinky.uf2 -``` - -## Running the firmware on a device - -If you have a Raspberry Pi Pico, we're now going to upload the built firmware and run it. If you don't have one, skip to the next section and run the exact same firmware file **in an emulator instead**. - -Connect the Raspberry Pi Pico board via a USB cable to your Mac, and make sure it's in the USB Mass Storage firmware upload mode. This is normally the case if you have never uploaded any firmware yet – the Pico boots to the firmware upload mode if its memory doesn't contain any valid firmware. Once a valid firmware is uploaded, the device will run that firmware after plugging in. To go back to the firmware upload mode, *hold the BOOTSEL button while plugging in the board*. - -The Pico should then show up as a mounted volume in /Volumes (as RPI-RP2 in this case): - -```shell -$ ls -al /Volumes -lrwxr-xr-x 1 root wheel 1B Jan 1 12:00 Macintosh HD@ -> / -drwx------ 1 kuba staff 16K Dec 31 1969 RPI-RP2/ -``` - -Copy the UF2 file to this volume: - -```shell -$ cp build/blinky.uf2 /Volumes/RPI-RP2 -``` - -This will make the Pico automatically install the firmware, reboot itself, and run the firmware. - -The green LED should now be blinking repeatedly. Hooray! Our first Embedded Swift program is running on an embedded device! - -## Running the firmware in an emulator - -If you don't have a physical Pico, or if you want to iterate quickly, [Wokwi](https://wokwi.com/) is free online emulator of various embedded microcontrollers, including a Raspberry Pi Pico. It executes the same firmware binary that you would normally upload to a physical device, and emulates one instruction at a time. - -Open a [new Pico project in Wokwi](https://wokwi.com/projects/new/pi-pico). Instead of using the code editor to write C code, press F1 and choose "Upload Firmware and Start Simulation". Then select the UF2 file that our build process produced. - -Once you upload the UF2 file to Wokwi, the simulation will start, and the LED should begin blinking repeatedly. Hooray! Our first Embedded Swift program is running in an emulator! diff --git a/Sources/EmbeddedSwift/Documentation.docc/GuidedExamples/STM32BaremetalGuide.md b/Sources/EmbeddedSwift/Documentation.docc/GuidedExamples/STM32BaremetalGuide.md deleted file mode 100644 index fa3e4691..00000000 --- a/Sources/EmbeddedSwift/Documentation.docc/GuidedExamples/STM32BaremetalGuide.md +++ /dev/null @@ -1,495 +0,0 @@ -# Baremetal Setup for STM32 with Embedded Swift - -Program a STM32 microcontroller directly with low-level Swift code - -This tutorial will guide you through setting up a baremetal STM32 project with Embedded Swift to create a simple LED blinking application with text output to UART, the "Hello World" of embedded systems. Concretely, we'll be using the STM32F746G-DISCO (discovery) development board, but the setup will work (with only small tweaks) on most other STM32 devices. - -We will be writing a full firmware from scratch including low-level boot code, direct hardware register configuration, a custom linker script and more. Besides educational purposes, this level of control is typically only needed in specialized setups because it involves more work and more complexity. If you want a simpler path to get started, you can integrate with an existing embedded SDK (like STCube or BSPs) instead, which offers higher-level APIs and hardware abstraction. Check out for guidance on common integration patterns. - -## Overall plan - -The entire baremetal project will consist of: -- A Package.swift file describing the overall structure of the project -- Register definitions for GPIO registers generated by Swift MMIO -- A toolset.json file defining compilation and linking flags -- A Makefile that will serve as a simple shortcut for building and flashing -- A simple linker script -- An interrupt vector and a reset function implementing basic startup code -- Finally, the application logic in Embedded Swift that will set up UART and print "Hello World" - -Let's get started! - -## Prerequisites - -- Mac or Linux -- STM32F746G-DISCO board connected over a USB cable -- Swift toolchain installed using swiftly - -## Step 1: Create a New Swift Package - -Create a new directory for your project and initialize a Swift package: - -```bash -mkdir STM32BlinkLED -cd STM32BlinkLED -swift package init --type executable -``` - -The initial Swift code that this generates will be in `Sources/STM32BlinkLED/STM32BlinkLED.swift` and we can keep its current content for now: - -```swift -// The Swift Programming Language -// https://docs.swift.org/swift-book - -@main -struct STM32BlinkLED { - static func main() { - print("Hello, world!") - } -} -``` - -Let's work on getting this print to actually work and produce text into UART. - -## Step 2: Download Arm Toolchain for Embedded - -We're going to use the [Arm Toolchain for Embedded](https://github.com/arm/arm-toolchain/tree/arm-software/arm-software/embedded) (formerly called "LLVM Toolchain for ARM") to provide us with basic C-level helper code, concretely memset, memcpy, and an allocator (malloc, free). - -Go to [https://github.com/arm/arm-toolchain/releases](https://github.com/arm/arm-toolchain/releases) and download the latest released version of "ATfe" for your host OS: -- On macOS, download e.g. `ATfE-20.1.0-Darwin-universal.dmg`. -- On x86_64 Linux, download e.g. `ATfE-20.1.0-Linux-x86_64.tar.xz`. - -Expand and copy out the contents of the toolchain into a subdirectory `llvm-toolchain` of our project. We should end up with a structure of: -```shell -STM32BlinkLED -|- llvm-toolchain - |- bin/ - |- CHANGELOG.md - |- docs/ - |- include/ - |- lib/ - |- README.md - |- ... -|- Sources -|- Package.swift -``` - -## Step 3: Configure the Package - -Edit the `Package.swift` file to configure your project for embedded development, specifically let's use Swift MMIO as a dependency, and let's create two helper targets "Registers" and "Support": - -```swift -// swift-tools-version: 5.10 -import PackageDescription - -let package = Package( - name: "STM32BlinkLED", - platforms: [.macOS(.v11)], - products: [ - .executable(name: "STM32BlinkLED", targets: ["STM32BlinkLED"]) - ], - dependencies: [ - .package(url: "https://github.com/swiftlang/swift-mmio", branch: "main"), - ], - targets: [ - .executableTarget( - name: "STM32BlinkLED", - dependencies: ["Registers", "Support"]), - .target( - name: "Registers", - dependencies: [.product(name: "MMIO", package: "swift-mmio")]), - .target( - name: "Support"), - ]) -``` - -Then let's create the respective source directories for the new targets (empty for now): - -```shell -$ mkdir Sources/Registers -$ mkdir Sources/Support -$ mkdir Sources/Support/include -``` - -## Step 4: Generate MMIO register descriptions using SVD2Swift - -SVD2Swift is a tool provided by Swift MMIO that automatically generates Swift code from SVD (System View Description) files. SVD files contain detailed descriptions of all the memory-mapped registers in a microcontroller, making them invaluable for embedded development. Using this generated code gives us type-safe access to the hardware registers of the STM32F7 microcontroller. - -First, we'll build the SVD2Swift tool from the swift-mmio package we added as a dependency, then download an SVD file for our specific microcontroller, and finally generate the register definitions we need: - -```shell -$ swift build --product SVD2Swift -$ curl -L "https://github.com/swiftlang/swift-embedded-examples/raw/refs/heads/main/Tools/SVDs/stm32f7x6.patched.svd" -O -$ .build/debug/SVD2Swift --input stm32f7x6.patched.svd --output Sources/Registers --access-level public \ - --peripherals RCC USART1 GPIOA GPIOB GPIOC GPIOD GPIOE GPIOF GPIOG GPIOH GPIOI GPIOJ GPIOK -``` - -Tip: If a build fails for any reason, it's often useful to add the `--verbose` flag to `swift build` to see a full list of commands the build system runs. - -## Step 5: Create a toolset.json file - -Create a `toolset.json` file in the project directory to configure the build with essential settings for ARMv7-based STM32 microcontrollers. This file defines options for the Swift compiler, C compiler, and linker: - -```json -{ - "schemaVersion": "1.0", - "swiftCompiler": { - "extraCLIOptions": [ - "-enable-experimental-feature", "Embedded", - "-Xfrontend", "-mergeable-symbols" - ] - } -} -``` - -After this is done, let's attempt a build using `swift build`. We have to specify the path to the toolset file, and also the right target triple: - -```shell -$ swift build --configuration release --triple armv7em-none-none-eabi --toolset toolset.json -``` - -Currently, this should succeed during compilation, but fail to link (because we haven't yet defined a valid linker script for embedded usage): - -```shell -$ swift build --configuration release --triple armv7em-none-none-eabi --toolset toolset.json -... -error: link command failed with exit code 1 (use -v to see invocation) -ld.lld: error: unable to find library -lc -ld.lld: error: unable to find library -lm -ld.lld: error: libclang_rt.builtins.a: No such file or directory -clang: error: ld.lld command failed with exit code 1 (use -v to see invocation) -``` - -## Step 6: Create a Linker Script and Startup Code - -Let's now create a linker script, an interrupt vector and startup code. - -Create a linker script file named `stm32f4.ld` in the project root directory: - -``` -MEMORY -{ - flash (rx) : ORIGIN = 0x08000000, LENGTH = 1024K /* end: 0x08100000 */ - sram_stack (rw) : ORIGIN = 0x20000000, LENGTH = 32K /* end: 0x20008000 */ - sram_data (rw) : ORIGIN = 0x20008000, LENGTH = 160K /* end: 0x20030000 */ - sram_heap (rw) : ORIGIN = 0x20030000, LENGTH = 128K /* end: 0x20050000 */ -} - -SECTIONS -{ - .text : { *(.vectors*) ; *(.text*) } > flash - .rodata : { *(.rodata*) ; *(.got*) } > flash - - __flash_data_start = (. + 3) & ~ 3; /* 4-byte aligned end of text is where data is going to be placed (by elf2hex) */ - - .bss : { *(.bss*) } > sram_data - .tbss : { *(.tbss*) } > sram_data - .data : { *(.data*) } > sram_data - - __flash_data_len = . - ORIGIN(sram_data); - - /DISCARD/ : { *(.swift_modhash*) } - /* ARM metadata sections */ - /DISCARD/ : { *(.ARM.attributes*) *(.ARM.exidx) } - /* ELF metadata sections */ - .symtab : { *(.symtab) } - .strtab : { *(.strtab) } - .shstrtab : { *(.shstrtab) } - .debug : { *(.debug*) } - .comment : { *(.comment) } -} - -__stack_start = ORIGIN(sram_stack); -__stack_end = ORIGIN(sram_stack) + LENGTH(sram_stack); - -__data_start = ORIGIN(sram_data); -__data_end = ORIGIN(sram_data) + LENGTH(sram_data); - -__heap_start = ORIGIN(sram_heap); -__heap_end = ORIGIN(sram_heap) + LENGTH(sram_heap); -``` - -Create startup code in C that defines the interrupt table and reset handler, in `Sources/Support/Startup.c`: - -```c -#include -#include - -void enable_fpu(void) { - *(volatile uint32_t *)0xE000ED88 |= (0xF << 20); // set CP10 and CP11 Full Access -} - -// Reset entrypoint -__attribute__((naked)) __attribute__((noreturn)) void ResetISR(void) { - asm volatile("bl enable_fpu"); - asm volatile("ldr r0, =__data_start // dst"); - asm volatile("ldr r1, =__flash_data_start // src"); - asm volatile("ldr r2, =__flash_data_len // size"); - asm volatile("bl memcpy"); // Relocate data section to RAM - asm volatile("bl main"); - - // If main returns, spin. - asm volatile("b ."); -} - -void IntDefaultHandlerISR() { __builtin_trap(); } - -// These are provided by the linker script -extern void *__stack_start; -extern void *__stack_end; - -// Primary interrupt vector table -__attribute__((section(".vectors"))) const void *Vectors[120] = { - (void *)(((uintptr_t)&__stack_end) - 4), // initial SP - ResetISR, // 1 0x04 The reset handler - IntDefaultHandlerISR, // 2 0x08 The NMI handler - // All other interrupts are not handled -}; - -// ELF entrypoint, not actually called at runtime, but it's a GC root -void *_start_elf(void) { return (void *)&Vectors; } -``` - -Finally, let's update `toolset.json` to configure the linker settings for our embedded target. We'll need to add several important options: -1. The `-T` flag to specify our custom linker script -2. Library paths to the ARM toolchain we downloaded -3. Standard C library and runtime library linkage -4. Disable standard library and stack protector features that aren't appropriate for baremetal code. - -```json -{ - "schemaVersion": "1.0", - "swiftCompiler": { - "extraCLIOptions": [ - "-enable-experimental-feature", "Embedded", - "-Xfrontend", "-mergeable-symbols", - "-Xfrontend", "-disable-stack-protector", - "-Xclang-linker", "-nostdlib", - ] - }, - "linker": { - "extraCLIOptions": [ - "-T", "stm32f4.ld", - "-e", "_start_elf", - "-Lllvm-toolchain/lib/clang-runtimes/arm-none-eabi/armv7m_soft_fpv4_sp_d16_exn_rtti/lib", - "-lc", - "-lclang_rt.builtins", - ] - } -} -``` - -At this point, linking will *almost* succeed, the only unresolved reference should be stdout/putchar: - -```shell -$ swift build --configuration release --triple armv7em-none-none-eabi --toolset toolset.json -ld.lld: error: undefined symbol: stdout ->>> referenced by putchar.c ->>> libc_tinystdio_putchar.c.o:(putchar) in archive llvm-toolchain/lib/clang-runtimes/arm-none-eabi/armv7m_soft_fpv4_sp_d16_exn_rtti/lib/libc.a -``` - -We're not going to actually try to provide the `stdout` symbol, instead let's provide our own custom `putchar` that will be routed to the UART. - -## Step 7: Add UART code - -Create a new file at `Sources/STM32BlinkLED/UART.swift`: - -```swift -import Registers - -extension STM32BlinkLED { - static func initUartOutput() { - // A9 is UART1 TX, which is relayed by ST-LINK over USB - - // Clock configuration - rcc.ahb1enr.modify { $0.raw.gpioaen = 1 } // Enable AHB clock to port A - rcc.apb2enr.modify { $0.raw.usart1en = 1 } // Enable APB clock to usart 1 - - // Configure A9 as UART1 TX - gpioa.moder.modify { $0.raw.moder9 = 0b10 } // Put Pin A9 into alternate function mode - gpioa.otyper.modify { $0.raw.ot9 = 0b0 } // Put Pin A9 into push pull - gpioa.ospeedr.modify { $0.raw.ospeedr9 = 0b00 } // Put Pin A9 into low speed - gpioa.pupdr.modify { $0.raw.pupdr9 = 0b00 } // Disable pull up/down on Pin A9 - gpioa.afrh.modify { $0.raw.afrh9 = 0b0111 } // Set alternate function usart1 on Pin A9 - - // Configure UART1, set the baud rate to 115200 (we boot at 16 MHz) - usart1.brr.modify { $0.raw.storage = 16_000_000 / 115_200 } - - usart1.cr1.modify { - $0.raw.ue = 1 // Enable USART 1 - $0.raw.te = 1 // Enable TX - } - } -} - -func waitTxBufferEmpty() { - // Spin while tx buffer not empty - while usart1.isr.read().raw.txe == 0 {} -} - -func tx(value: UInt8) { - usart1.tdr.write { $0.raw.tdr_field = UInt32(value) } -} - -@_cdecl("putchar") -public func putchar(_ value: CInt) -> CInt { - waitTxBufferEmpty() - tx(value: UInt8(value)) - waitTxBufferEmpty() - return 0 -} -``` - -## Step 8: Package up and Boot the Firmware - -The firmware should now build successfully, and we are finally ready to boot the firmware! We're going to use the `elf2hex` script to convert the ELF file that `swift build` produced into a format that's suitable for flashing, and then we'll use the `st-flash` tool from the opensource stlink package to actually run the firmware. We'll also use the `minicom` program to receive the text over UART, which will be presented on the host system as a serial port (also known as "COM port"). - -First let's make sure we have st-link and minicom installed: -```shell -$ brew install stlink -$ st-info --probe -... TODO -$ brew install minicom -$ minicom --version -minicom version 2.10 (compiled Feb 22 2025) -Copyright (C) Miquel van Smoorenburg. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version -2 of the License, or (at your option) any later version. -``` - -Then let's fetch the elf2hex tool: - -```shell -$ curl -L "https://raw.githubusercontent.com/swiftlang/swift-embedded-examples/refs/heads/main/Tools/elf2hex.py" -O -$ chmod +x elf2hex.py -``` - -Next, let's build, package, and flash the firmware: - -```shell -$ swift build --configuration release --triple armv7em-none-none-eabi --toolset toolset.json -$ ./elf2hex.py .build/release/STM32BlinkLED .build/release/STM32BlinkLED.hex -``` - -```shell -$ ls -al .build/release/STM32BlinkLED.hex --rw-r--r-- 1 kuba staff 13K May 18 10:12 .build/release/STM32BlinkLED.hex -$ st-flash --connect-under-reset --format ihex write .build/release/STM32BlinkLED.hex -... TODO -``` - -Flashing should succeed and the firmware will run, but at this point, you won't see any UART output yet, and that's expected. While we've created the functions to initialize UART and transmit data, we haven't actually called the initialization routine from our main application. The LED won't blink either since we haven't configured the GPIO pins for it. In the next step, we'll update our main application file to call our UART initialization function and configure the LED pin properly. - -## Step 9: Configuring pins for UART and LED - -Now let's update the main application file to actually use our UART setup and blink an LED. Open the `Sources/STM32BlinkLED/STM32BlinkLED.swift` file and replace its contents with: - -```swift -import Registers - -@main -struct STM32BlinkLED { - static func main() { - // Initialize UART for output - initUartOutput() - - // Initialize LED (Pin I1 on STM32F746G-DISCO) - let ledPin: UInt32 = 1 - - // Enable clock for GPIO port I - rcc.ahb1enr.modify { $0.raw.gpioien = 1 } - - // Configure I1 as output - gpioi.moder.modify { $0.raw.moder1 = 0b01 } // Output mode - gpioi.otyper.modify { $0.raw.ot1 = 0b0 } // Push-pull mode - gpioi.ospeedr.modify { $0.raw.ospeedr1 = 0b00 } // Low speed - - print("Hello from Embedded Swift on STM32F7!") - - // Main loop - toggle LED and print message - var count = 0 - while true { - // Toggle the LED - let ledState = count % 2 == 0 - gpioi.bsrr.write { - if ledState { - $0.raw.bs1 = 1 // Set pin (LED on) - } else { - $0.raw.br1 = 1 // Reset pin (LED off) - } - } - - // Print status message every iteration - print("LED is now \(ledState ? "ON" : "OFF") - count: \(count)") - - // Delay using a simple counter - for _ in 0..<500_000 { - // Empty loop to create delay - // This is not accurate timing, just a busy-wait - } - - count += 1 - } - } -} -``` - -Now we need to create a Makefile to simplify the build and flash process. Create a file named `Makefile` in the project root: - -```makefile -.PHONY: build flash clean - -# Serial port for UART output viewing (change to match your system) -SERIAL_PORT ?= /dev/tty.usbmodem14203 - -build: - swift build --configuration release --triple armv7em-none-none-eabi --toolset toolset.json - ./elf2hex.py .build/release/STM32BlinkLED .build/release/STM32BlinkLED.hex - -flash: build - st-flash --connect-under-reset --format ihex write .build/release/STM32BlinkLED.hex - -monitor: - minicom -D $(SERIAL_PORT) -b 115200 - -clean: - swift package clean - rm -f .build/release/STM32BlinkLED.hex -``` - -Now you can build and flash your firmware with a single command: - -```shell -$ make flash -``` - -To view the UART output, determine which serial port your STM32F7 board appears as on your system. The ST-Link on the discovery board presents itself as a USB-to-Serial device. Once you've identified the correct port (update the SERIAL_PORT variable in the Makefile if needed), run: - -```shell -$ make monitor -``` - -You should now see "Hello from Embedded Swift on STM32F7!" followed by LED status messages in the minicom terminal, and the LED on your board should be blinking. - -## Conclusion - -Congratulations! You've successfully set up and programmed an STM32 microcontroller in baremetal mode using Embedded Swift. This simple LED blinking project demonstrates the fundamental concepts of embedded programming: - -1. Setting up hardware registers -2. Configuring GPIO pins -3. Creating delay functions -4. Implementing a main loop - -From here, you can expand the project to include more complex functionality like interfacing with sensors, implementing communication protocols, or adding user input. - -## Next Steps - -- Add button input to control the LED patterns -- Implement proper timer-based delays instead of the busy-wait approach -- Add UART communication to send debug messages to your computer -- Explore other peripherals like ADC, I2C, or SPI - -Happy embedded programming with Swift! diff --git a/Sources/EmbeddedSwift/Documentation.docc/GuidedExamples/macOSGuide.md b/Sources/EmbeddedSwift/Documentation.docc/GuidedExamples/macOSGuide.md deleted file mode 100644 index cc604e8d..00000000 --- a/Sources/EmbeddedSwift/Documentation.docc/GuidedExamples/macOSGuide.md +++ /dev/null @@ -1,72 +0,0 @@ -# Try out Embedded Swift on macOS - -Tutorial for building a simple program for your host OS with Embedded Swift - -## Overview - -While desktop operating systems like macOS and Linux are not the typical targets for Embedded Swift, you **absolutely can** build code for them using the Embedded Swift mode. This is useful for experimentation, trying out Embedded Swift, or to be able to iterate fast on an idea for some code that doesn't really need the physical device to work. - -The simplest program in Embedded Swift can just be a regular "Hello, World": - -```swift -// HelloEmbedded.swift -print("Hello, Embedded Swift 😊") -``` - -And building it into an executable can be done by calling the `swiftc` compiler directly, but we'll want to add flags to enable Embedded Swift, and also Whole Module Optimization. - -```shell -$ swiftc HelloEmbedded.swift -o HelloEmbedded -enable-experimental-feature Embedded -wmo -``` - -This will produce a regular executable binary, and we can execute it right away: - -```shell -$ ./HelloEmbedded -Hello, Embedded Swift 😊 -``` -Hooray! Our first *host-side* Embedded Swift program is working! - -## Details - -Looking closer, this binary *does not actually depend on the Swift runtime in the OS* (all Embedded Swift binaries carry their runtime+stdlib dependencies within), but it is still a *dynamically-linked executable*, so it's not fully standalone in the embedded sense: - -```shell -$ otool -L HelloEmbedded -HelloEmbedded: - /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1000.0.0) -``` - -However, the singular object file that was used to build this executable was produced by the compiler in the same fashion that a real embedded build would. If we ask the compiler and linker to minimize the size of the outputs and to remove any unused code, we can observe that the binary has no dependencies other than `putchar` from `libSystem` and that the machine code section is very small (176 bytes in the `__text` section): - -```shell -$ swiftc HelloEmbedded.swift -o HelloEmbedded -enable-experimental-feature Embedded -wmo -Osize -Xlinker -dead_strip - -$ nm -um HelloEmbedded - (undefined) external _putchar (from libSystem) - -$ size -m HelloEmbedded -Segment __TEXT: 16384 - Section __text: 176 -... -``` - -In contrast, if compiled without the Embedded Swift flags, we can see the dependencies on the Swift runtime in the OS: - -```shell -$ swiftc HelloEmbedded.swift -o HelloEmbedded - -$ otool -L HelloEmbedded -HelloEmbedded: - /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1000.0.0) - /usr/lib/swift/libswiftCore.dylib (compatibility version 1.0.0, current version 0.0.0) - /usr/lib/swift/libswiftSwiftOnoneSupport.dylib (compatibility version 1.0.0, current version 0.0.0) -``` - -## Where to go next - -- The [Embedded Swift Vision Document](https://github.com/swiftlang/swift-evolution/blob/main/visions/embedded-swift.md) will give you an overview of the approaches and goals of Embedded Swift, and also what exactly is in the Embedded Swift language subset. -- The [collection of Embedded Swift example projects](https://github.com/swiftlang/swift-embedded-examples) on GitHub shows on which embedded devices can Swift work today, and the examples can also be used as templates for your own projects. -- The [Embedded Swift User Manual](https://github.com/swiftlang/swift/blob/main/docs/EmbeddedSwift/UserManual.md) describes how to use the Embedded Swift compilation mode and how to interact with the compiler. -- The [Tools page](https://www.swift.org/tools/#editors) has guides for setting up Swift integration in your editor to enable features like indexing, autocomplete, jump-to-definition, and others. -- The [Swift forums](https://forums.swift.org/) are the best place to ask questions, give feedback or share your cool projects. diff --git a/Sources/EmbeddedSwift/Documentation.docc/SDKSupport/Baremetal.md b/Sources/EmbeddedSwift/Documentation.docc/SDKSupport/Baremetal.md deleted file mode 100644 index 0956b359..00000000 --- a/Sources/EmbeddedSwift/Documentation.docc/SDKSupport/Baremetal.md +++ /dev/null @@ -1,244 +0,0 @@ -# Baremetal use of Embedded Swift - -Programming without an SDK for maximum control and minimal size - -## Overview - -Developing in "baremetal mode" means programming directly for the hardware without any operating system or SDK abstractions. This provides maximum control and minimum codesize, but requires deeper understanding of the hardware. - -Embedded Swift supports true baremetal development, where you directly program hardware peripherals by manipulating memory-mapped registers. This approach is suitable for: - -- Extremely resource-constrained environments -- Safety-critical applications that need deterministic behavior -- Projects requiring full control over every aspect of the hardware -- Educational purposes to understand how hardware and software interact - -## Key components of a baremetal project - -A complete baremetal project typically includes: - -1. **Startup code** - Sets up the initial environment before `main()` runs -2. **Interrupt vector table** - Maps hardware events to handler functions -3. **Linker script** - Defines memory layout and sections -4. **Hardware register definition code** - To interface with peripherals -5. **Runtime support** - E.g. implementations of functions like `memcpy` and `malloc` -6. **Application logic** - Your actual embedded application code - -For a full working example of all these components, see . The rest of this document provides general platform-independent guidance when working in baremetal mode. However, much of the problem space of baremetal development is outside of the scope of this documentation, and requires deeper familiary with your specific setup. This information is typically provided by your board vendor, the spec of the MCU, the ISA spec of the execution core, the C toolchain documentation, ELF file format spec, and other similar sources. - -## Hardware access patterns - -### 1. Direct memory access using pointers - -Note that using UnsafePointers to directly access registers at known addresses is not recommended in almost any situation because doing that correctly is tricky, it's inherently unsafe (and shifts the safety responsibility to the user) and can easily cause very hard to debug runtime problems. However, sometimes it might be neccessary to use this method. - -One common issue when directly accessing hardware registers is that the compiler may optimize away repeated reads or writes, thinking they're redundant. This is a problem that's inherent to pointers in most programming languages (including C and C++). - -```swift -// Accessing a register at address 0x40010000 -let gpioBase = 0x40010000 - -// ❌ Do not do this - the memory write might be optimized out -let gpioDataRegister = UnsafeMutablePointer(bitPattern: gpioBase)! -gpioDataRegister.pointee |= (1 << 5) // Set bit 5 -``` - -Hardware registers are volatile - their values can change independently of your program's execution (due to hardware events, interrupts, or peripheral operation). To ensure correct behavior, you must inform the compiler that these memory locations are volatile, preventing unwanted optimizations: - -```swift -// Need to use these flags: -enable-experimental-feature Volatile -import _Volatile - -// ✅ Use VolatileMappedRegister for volatile semantics -let gpioBase: UInt = 0x40010000 -let gpioDataRegister = VolatileMappedRegister(unsafeBitPattern: gpioBase) -... = gpioDataRegister.load() -gpioDataRegister.store(1 << 5) -``` - -Whenever possible, consider using Swift MMIO (see below) which does also provide proper volatile semantics, but more importantly provides type safety on individual registers and their fields. - -### 2. Using Swift MMIO for type-safe register access - -Swift MMIO provides strongly-typed access to memory-mapped hardware and can automatically generate register definitions from SVD files. It can provide a higher-level type-safe access to hardware registers, for example: - -```swift -// Type-safe register access -gpioa.odr.write { $0.odr5 = true } // Set pin 5 high -``` - -See [Swift MMIO](https://github.com/swiftlang/swift-mmio/) for details and for a guided example of using it. - -## Creating a linker script and data segment relocation - -A baremetal project requires a custom linker script to properly place code and data in memory. This is a relatively complex task to get right, and requires understanding of the memory map, flash and RAM setup of your target device, as well as understanding the ELF file format and what code/data sections do you expect your entire program to use. - -Besides just defining the position of code at runtime, a linker script needs to also: -- Handle and coordinate the initialization of "zero-fill" global variables (aka the BSS section) -- Handle and coordinate the initialization of non-zero writable global variables (copying initial values from flash to RAM) - -Here's an incomplete sketch of an example linker script: - -``` -MEMORY -{ - flash (rx) : ORIGIN = 0x08000000, LENGTH = 1024K - sram (rwx) : ORIGIN = 0x20000000, LENGTH = 320K -} - -SECTIONS -{ - .text : { *(.vectors*) ; *(.text*) } > flash - .rodata : { *(.rodata*) ; *(.got*) } > flash - .bss : { *(.bss*) } > sram ; needs runtime handling - .data : { *(.data*) } > sram AT>flash ; needs runtime handling - - ... -} -``` - -A sketch of an example corresponding startup code (in C): - -```c -void ResetISR(void) { - // Initialize bss section - uint8_t *bss = &__bss_start; - while (bss < &__bss_end) *bss = 0; - - // Initialize read-write data section - extern uint8_t __data_start_flash, __data_start, __data_end; - uint8_t *src = &__data_start_flash; - uint8_t *dst = &__data_start; - while (dst < &__data_end) *dst++ = *src++; - - // Call main - extern int main(void); - main(); - - // If main returns, loop forever - while(1); -} -``` - -Both these code snippets are not fully functional, they are only demonstrating the complexity of what the linker script and startup code need to do to initialize global variables. - -Tip: If this handling is not done correctly, a typical symptom is that global variables "don't work", i.e. reading from them doesn't yield the right value, and writing to them doesn't persist. A good way to double check this is by using a debugger, dumping memory at runtime and checking if it matches the virtual memory layout of the ELF file. - -## Vector table and interrupts - -The vector table is a critical component that maps hardware interrupts and exceptions to specific handler functions in your code. It's typically placed at the beginning of flash memory and contains function pointers that the processor uses when responding to various events. - -The processor automatically jumps to the appropriate handler when an interrupt occurs by indexing into this table. If you don't provide a specific handler, it's common to point to a default handler that can help with debugging. - -Example vector table structure: - -```c -// Vector table for ARM Cortex-M -__attribute__((section(".vectors"))) const void *VectorTable[] = { - (void*)0x20008000, // Initial stack pointer - ResetISR, // Reset handler - DefaultHandler, // NMI handler - DefaultHandler, // Hard fault handler - // Additional vectors as needed -}; -``` - -If you want to actually handle an interrupt (e.g. a GPIO or UART interrupt) in your Swift code, you can forward declare the function in C, and define it using `@cdecl` in Swift: - -```c -// In startup.c or header file -void UART1_IRQHandler(void); -``` - -```swift -// In Swift code -@_cdecl("UART1_IRQHandler") -func uartInterruptHandler() { - // Handle UART interrupt in Swift - // Clear interrupt flags, process received data, etc. -} -``` - -However, note that Swift currently does not provide any form of synchronization or "interrupt safety" for the code that executes the interrupt. Namely, if your interrupt handler modifies global variables that are also accessed by your main program, you need to be careful about data races and ensure proper synchronization (such as using atomic operations or disabling interrupts during critical sections). Additionally, interrupt handlers should be kept short and fast to avoid blocking other important system events. - -## Building a minimal project - -To build an Embedded Swift baremetal project with SwiftPM, you will need a setup like this: - -- Your main application target defined in Package.swift. -- A helper C code helper target defined in Package.swift - this will contain your C startup code, vector table and possibly an assembly file. -- Invoke `swift build` with a `--triple` argument that specifies the target CPU architecture and output object file format. -- Use a `toolset.json` file that defines the common Swift and C compilation flags, and linking flags. This will e.g. enable the Embedded Swift mode when compiling Swift code, and point the linker at the right linker script. - -Example file structure: - -``` -MyBaremetalProject/ -├── Package.swift -├── toolset.json -├── Sources/ -│ ├── MyApp/ -│ │ └── main.swift -│ └── CStartup/ -│ ├── startup.c -│ ├── linker.ld -│ └── include/ -│ └── startup.h -└── README.md -``` - -Example toolset.json file: - -```json -{ - "schemaVersion": "1.0", - "swiftCompiler": { - "extraCLIOptions": [ - "-enable-experimental-feature", "Embedded", - "-Xclang-linker", "-nostdlib", - ] - }, - "linker": { - "extraCLIOptions": [ - "-T", "Sources/CStartup/linker.ld", - "--gc-sections", - ] - } -} -``` - -Example Package.swift file: - -```swift -// swift-tools-version: 5.9 -import PackageDescription - -let package = Package( - name: "MyBaremetalProject", - products: [ - .executable( - name: "MyBaremetalApp", - targets: ["MyApp"] - ) - ], - targets: [ - .executableTarget( - name: "MyApp", - dependencies: ["CStartup"], - swiftSettings: [ - .enableExperimentalFeature("Embedded") - ] - ), - .target( - name: "CStartup", - publicHeadersPath: "include" - ) - ] -) -``` - -Example compilation invocation: - -```bash -swift build --triple armv7em-none-eabi --toolset toolset.json -``` diff --git a/Sources/EmbeddedSwift/Documentation.docc/SDKSupport/IntegrateWithESP.md-wip b/Sources/EmbeddedSwift/Documentation.docc/SDKSupport/IntegrateWithESP.md-wip deleted file mode 100644 index e45c7af6..00000000 --- a/Sources/EmbeddedSwift/Documentation.docc/SDKSupport/IntegrateWithESP.md-wip +++ /dev/null @@ -1,3 +0,0 @@ -# ESP IDF - -🚧 Under construction... diff --git a/Sources/EmbeddedSwift/Documentation.docc/SDKSupport/IntegrateWithPico.md b/Sources/EmbeddedSwift/Documentation.docc/SDKSupport/IntegrateWithPico.md deleted file mode 100644 index 2087de6a..00000000 --- a/Sources/EmbeddedSwift/Documentation.docc/SDKSupport/IntegrateWithPico.md +++ /dev/null @@ -1,104 +0,0 @@ -# Raspberry Pi Pico SDK - -Setting up a project that can seamlessly use C APIs from the Pico SDK. - -> Note: Embedded Swift is experimental. Public releases of Swift do not support Embedded Swift, yet. See for details. - -Development for [Raspberry Pi Pico and Pico W](https://www.raspberrypi.com/products/raspberry-pi-pico/) normally uses the [Pico SDK](https://github.com/raspberrypi/pico-sdk) and the vendor provides several [sample projects in the pico-examples repository](https://github.com/raspberrypi/pico-examples). The SDK and sample project setup is described in: - -- [https://www.raspberrypi.com/documentation/microcontrollers/c_sdk.html#sdk-setup](https://www.raspberrypi.com/documentation/microcontrollers/c_sdk.html#sdk-setup) -- [https://datasheets.raspberrypi.com/pico/getting-started-with-pico.pdf](https://datasheets.raspberrypi.com/pico/getting-started-with-pico.pdf) - -Before trying to use Swift with the Pico SDK, make sure your environment works and can build the provided C/C++ sample projects. - -## CMake setup with a bridging header - -The Pico SDK is using CMake as its build system, and so the simplest way to integrate with it is to also use CMake to build a Swift firmware application on top of the SDK and the libraries from it. The following describes an example set up of that on a "blinky" example (code that just blinks the built-in LED). - -Let's create a directory with a Swift source file, a bridging header, and a CMake definition file: - -``` -./SwiftPicoBlinky/Main.swift -./SwiftPicoBlinky/BridgingHeader.h -./SwiftPicoBlinky/CMakeLists.txt -``` - -In `Main.swift`, let's add basic logic to initialize the GPIO port for the Pico's built-in LED, and then turn it on and off in a loop: - -```swift -@main -struct Main { - static func main() { - let led = UInt32(PICO_DEFAULT_LED_PIN) - gpio_init(led) - gpio_set_dir(led, /*out*/true) - while true { - gpio_put(led, true) - sleep_ms(250) - gpio_put(led, false) - sleep_ms(250) - } - } -} -``` - -Notice that we're using functions and variables defined in C in the Pico SDK. For that to be possible, the Swift compiler needs to have access to the C header files that define these functions and variables. The cleanest option would be to define a modulemap, but for simplicity let's just use a bridging header to make declarations visible in Swift without a module. `BridgingHeader.h` should contain: - -```c -#pragma once - -#include "pico/stdlib.h" -``` - -Finally, we need to define the application's build rules in CMake that will be using CMake logic from the Pico SDK. The following content of `CMakeLists.txt` leverages CMake 3.29's native Swift language support: - -```cmake -cmake_minimum_required(VERSION 3.29) -include($ENV{PICO_SDK_PATH}/external/pico_sdk_import.cmake) - -project(swift-blinky) -pico_sdk_init() - -# Enable Swift language support -enable_language(Swift) - -# Set Swift compilation mode to whole module optimization -set(CMAKE_Swift_COMPILATION_MODE wholemodule) - -add_executable(swift-blinky Main.swift) -set_target_properties(swift-blinky PROPERTIES - LINKER_LANGUAGE CXX) - -target_compile_options(swift-blinky PUBLIC "$<$:SHELL: - -enable-experimental-feature Embedded - -target armv6m-none-none-eabi -Xcc -mfloat-abi=soft -Xcc -fshort-enums - -Xfrontend -function-sections - -import-bridging-header ${CMAKE_CURRENT_LIST_DIR}/BridgingHeader.h ->") - -target_link_libraries(swift-blinky - pico_stdlib hardware_uart hardware_gpio -) - -pico_add_extra_outputs(swift-blinky) -``` - -## Configure and build - -With these three files, we can now configure and build a Swift firmware for the Pico: - -```bash -$ export PICO_BOARD=pico -$ export PICO_SDK_PATH= -$ export PICO_TOOLCHAIN_PATH= -$ ls -al --rw-r--r-- 1 kuba staff 39B Feb 2 22:08 BridgingHeader.h --rw-r--r-- 1 kuba staff 650B Feb 2 22:08 CMakeLists.txt --rw-r--r-- 1 kuba staff 262B Feb 2 22:08 Main.swift -$ mkdir build -$ cd build -$ cmake -S ../ -B . -G Ninja -$ ninja -v -``` - -This should produce several build artifacts in the `build/` subdirectory, include `swift-blinky.uf2`, which can be directly uploaded to the Pico by copying it into the fake Mass Storage Volume that the device presents when plugged over USB in BOOTSEL mode. diff --git a/Sources/EmbeddedSwift/Documentation.docc/SDKSupport/IntegrateWithZephyr.md b/Sources/EmbeddedSwift/Documentation.docc/SDKSupport/IntegrateWithZephyr.md deleted file mode 100644 index 2e03b401..00000000 --- a/Sources/EmbeddedSwift/Documentation.docc/SDKSupport/IntegrateWithZephyr.md +++ /dev/null @@ -1,425 +0,0 @@ -# Zephyr RTOS SDK - -Integrating Swift with Zephyr RTOS for embedded systems development - -[Zephyr](https://www.zephyrproject.org/) is an open-source RTOS for embedded systems that is sponsored by the Linux Foundation. Since it depends on CMake primarily for its build system, it can easily be integrated to be used with Embedded Swift. - -The following document outlines how to setup a Swift to Zephyr project for an emulated ARM Cortex M0, explaining a few key concepts along the way. For a complete working example on real hardware, however, refer to the [nrfx-blink-sdk](https://github.com/swiftlang/swift-embedded-examples/tree/main/nrfx-blink-sdk) project that is compatible with nRF or other boards. - -> Note: Embedded Swift is experimental. Public releases of Swift do not support Embedded Swift, yet. See for details. - -## Target Architecture Compatibility - -Zephyr [supports quite a few target architectures](https://docs.zephyrproject.org/latest/introduction/index.html), but not all are supported by Embedded Swift. Please refer to the following table for an overview of Zephyr-supported architectures that are supported by Swift, along with the correct target triple to use: - -| Architecture | Details | Swift Triple | -|--------------|---------------------|-------------------------| -| ARMv6-M | Cortex M0, M0+, M1 | armv6m-none-none-eabi | -| ARMv7-M | Cortex M3 | armv7-none-none-eabi | -| ARMv7-EM | Cortex M4/M4F, M7 | armv7em-none-none-eabi | -| ARMv8-M | Cortex M23-85 | aarch64-none-none-elf | -| Intel | 32-bit (i686) | i686-unknown-none-elf | -| Intel | 64-bit (x86_64) | x86_64-unknown-none-elf | -| RISC-V | 32-bit | riscv32-none-none-eabi | -| RISC-V | 64-bit | riscv64-none-none-eabi | - -## Zephyr Setup - -Before setting up a Swift project that works with Zephyr, you need to setup dependencies and a Zephyr workspace as per the [Getting Started Guide](https://docs.zephyrproject.org/latest/develop/getting_started/index.html). Regardless of your platform (macOS or Linux), ensure that you can build the blinky example without errors before starting with Swift integration: - -```bash -cd ~/zephyrproject/zephyr -west build -p always -b reel_board samples/basic/blinky -``` - -By default, the `main` revision of the Zephyr sources are checked out when calling `west init`, which contains pre-release and development changes that may cause instability and changing APIs that are not desirable. To checkout a specific release version of Zephyr, use the following commands: - -```bash -cd ~/zephyrproject/zephyr -git checkout v4.1.0 -west update -west packages pip --install - -# For older versions of Zephyr (pre 4.1.0), use: -pip install -r ~/zephyrproject/zephyr/scripts/requirements.txt -``` - -Refer to the [Zephyr Releases](https://docs.zephyrproject.org/latest/releases/index.html) page for more information on current and LTS releases. - -## Project Setup - -Once Zephyr is setup, the next step is to setup a project with the following files included: - -```plain -SwiftZephyrProject/src/BridgingHeader.h -SwiftZephyrProject/src/Main.swift -SwiftZephyrProject/src/Stubs.c -SwiftZephyrProject/CMakeLists.txt -SwiftZephyrProject/prj.conf -``` - -These are the minimum required files in order to build a Zephyr project. By convention, source files should be placed in the src/ subdirectory, but this is not a hard requirement. Also, `prj.conf` is required even if it is empty, or the project will not build. - -Inside of `src/BridgingHeader.h`, add the following content: - -```c -#pragma once - -#include -#include -``` - -The `src/Main.swift` file must contain a `static func main()` as follows: - -```swift -@main -struct Main { - static func main() { - print("Hello Zephyr from Swift!") - - while true { - k_msleep(1000) - print("Loop") - } - } -} -``` - -Since Embedded Swift requires `posix_memalign` to be defined, add the following to `src/Stubs.c` to define it: - -```c -#include -#include - -void *aligned_alloc(size_t alignment, size_t size); - -// Embedded Swift currently requires posix_memalign, but the C libraries in the -// Zephyr SDK do not provide it. Let's implement it and forward the calls to -// aligned_alloc(3). -int -posix_memalign(void **memptr, size_t alignment, size_t size) -{ - void *p = aligned_alloc(alignment, size); - if (p) { - *memptr = p; - return 0; - } - - return errno; -} -``` - -Finally, add the following line to `prj.conf` so that the output of `print()` statements is sent to stdout: - -```conf -CONFIG_STDOUT_CONSOLE=y -``` - -### CMakeLists.txt Setup - -The `CMakeLists.txt` setup is more involved and complex since target, compilation flags, and library linking must be specified for Swift. First, some initial setup and flags: - -```cmake -cmake_minimum_required(VERSION 3.29) -find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE}) - -# Enable "wmo" as needed by Embedded Swift -set(CMAKE_Swift_COMPILATION_MODE wholemodule) - -# Create a new project called "SwiftZephyrProject" and enable "Swift" as a supported language -project(SwiftZephyrProject Swift) -``` - -Next, set the compiler target to the arch you are building for. For this example we use `armv6m-none-none-eabi` which is compatible with the [Cortex-M0](https://docs.zephyrproject.org/latest/boards/qemu/cortex_m0/doc/index.html) which we will compile for in a later step. If you are targeting a different architecture, see the [Zephyr Target Architecture Compatibility](#zephyr-target-architecture-compatibility) to see which target triple to use. - -```cmake -# Use the armv6m-none-none-eabi target triple for Swift -set(CMAKE_Swift_COMPILER_TARGET armv6m-none-none-eabi) -``` - -After setting the target triple, some additional additional Swift compiler flags need to be defined. - -```cmake -# Set global Swift compiler flags -add_compile_options( - # Enable Embedded Swift - "$<$:SHELL:-enable-experimental-feature Embedded>" - - # Enable function sections to enable dead code stripping on elf - "$<$:SHELL:-Xfrontend -function-sections>" - - # Use software floating point operations matching GCC - "$<$:SHELL:-Xcc -mfloat-abi=soft>" - - # Use compacted C enums matching GCC - "$<$:SHELL:-Xcc -fshort-enums>" - - # Disable PIC - "$<$:SHELL:-Xcc -fno-pic>" - - # Disable PIE - "$<$:SHELL:-Xcc -fno-pie>" - - # Add Libc include paths - "$<$:SHELL:-Xcc -I -Xcc ${ZEPHYR_SDK_INSTALL_DIR}/arm-zephyr-eabi/picolibc/include>" -) -``` - -- NOTE: The `-mfloat-abi=soft` flag may need to change to `-mfloat-abi=hard` for ARM CPUs that support hard-float, such as the Cortex-M4F and Cortex-M7. This and the `-fshort-enums` flags are not required for non-ARM architectures such as Intel and RISC-V. - -There are quite a few other Zephyr flags that can also be imported (optional) in order to get Zephyr include paths and flags such `-mcpu`, `mthumb`, `-mabi`, and so on: - -```cmake -# Import TOOLCHAIN_C_FLAGS from Zephyr as -Xcc flags -foreach(flag ${TOOLCHAIN_C_FLAGS}) - # Skip flags that are not known to swiftc - string(FIND "${flag}" "-imacro" is_imacro) - string(FIND "${flag}" "-mfp16-format" is_mfp16) - if(NOT is_imacro EQUAL -1 OR NOT is_mfp16 EQUAL -1) - continue() - endif() - - add_compile_options("$<$:SHELL:-Xcc ${flag}>") -endforeach() -``` - -Next, add the following block to automatically grab Zephyr compilation flags (such as `-D__ZEPHYR__=1` and `-DKERNEL`) and set them as Swift compiler definitions. This is required to successfully build Swift code that works with Zephyr: - -```cmake -# Add definitions from Zephyr to -Xcc flags -get_target_property(ZEPHYR_DEFINES zephyr_interface INTERFACE_COMPILE_DEFINITIONS) -if(ZEPHYR_DEFINES) - foreach(flag ${ZEPHYR_DEFINES}) - # Ignore expressions like "$" - string(FIND "${flag}" "$<" start_of_expression) - if(NOT start_of_expression EQUAL -1) - continue() - endif() - - add_compile_options("$<$:SHELL:-Xcc -D${flag}>") - endforeach() -endif() -``` - -Finally, setup targets, libraries, and additional compile options: - -```cmake -target_sources(app PRIVATE src/Stubs.c) - -# The Swift code providing "main" needs to be in an OBJECT library (instead of STATIC library) to make sure it actually gets linker. -# A STATIC library would get dropped from linking because Zephyr provides a default weak empty main definition. -add_library(app_swift OBJECT src/Main.swift) - -add_dependencies(app_swift syscall_list_h_target) -target_compile_options(app_swift PRIVATE - -parse-as-library - - -Osize - - -Xfrontend -disable-stack-protector - - # FIXME: add dependency on BridgingHeader.h - -import-bridging-header ${CMAKE_CURRENT_LIST_DIR}/src/BridgingHeader.h -) - -# Copy include paths from C target to Swift target -target_include_directories(app_swift PRIVATE - "$" -) - -# Link the Swift target into the primary target -target_link_libraries(app PRIVATE app_swift) -``` - -### Building and Running - -To build the project, ensure that the Zephyr workspace is sourced first: - -```bash -source ~/zephyrproject/.venv/bin/activate -``` - -Run the following command to configure the project with CMake: - -```console -(.venv)> cmake -B build -G Ninja -DBOARD=qemu_cortex_m0 -DUSE_CCACHE=0 . -Loading Zephyr default modules (Zephyr base (cached)). -... --- Configuring done (7.6s) --- Generating done (0.2s) --- Build files have been written to: ~/SwiftZephyrProject/build -``` - -Then, the project can be built using `cmake --build`: - -```console -(.venv)> cmake --build build -[1/135] Preparing syscall dependency handling - -[2/135] Generating include/generated/zephyr/version.h --- Zephyr version: 4.1.0 (~/zephyrproject/zephyr), build: v4.1.0 -[130/135] Linking C executable zephyr/zephyr_pre0.elf -~/zephyr-sdk-0.17.0/arm-zephyr-eabi/bin/../lib/gcc/arm-zephyr-eabi/12.2.0/../../../../arm-zephyr-eabi/bin/ld.bfd: warning: orphan section `.swift_modhash' from `app/libapp.a(Main.swift.obj)' being placed in section `.swift_modhash' -[135/135] Linking C executable zephyr/zephyr.elf -~/zephyr-sdk-0.17.0/arm-zephyr-eabi/bin/../lib/gcc/arm-zephyr-eabi/12.2.0/../../../../arm-zephyr-eabi/bin/ld.bfd: warning: orphan section `.swift_modhash' from `app/libapp.a(Main.swift.obj)' being placed in section `.swift_modhash' -Memory region Used Size Region Size %age Used - FLASH: 14674 B 256 KB 5.60% - RAM: 4032 B 16 KB 24.61% - IDT_LIST: 0 GB 32 KB 0.00% -Generating files from ~/SwiftZephyrProject/build/zephyr/zephyr.elf for board: qemu_cortex_m0 -``` - -Finally, to run the example in the qemu emulator, use `ninja run`: - -```console -(.venv)> ninja -C build run -ninja: Entering directory `build' -[0/1] To exit from QEMU enter: 'CTRL+a, x'[QEMU] CPU: cortex-m0 -*** Booting Zephyr OS build v4.1.0 *** -Hello Zephyr from Swift! -Loop -Loop -Loop -``` - -Congrats, you now have a Swift project running using Zephyr! - -## West Integration - -Up to now we have setup a project that works perfectly fine when used with just CMake and Ninja. However, projects can also be integrated with West, which is the official CLI tool used for Zephyr projects. To use `west`, start by adding a `west.yml` file to the root of the project: - -```yml -manifest: - remotes: - - name: zephyrproject-rtos - url-base: https://github.com/zephyrproject-rtos - - projects: - - name: zephyr - remote: zephyrproject-rtos - revision: v4.1.0 - import: - name-allowlist: - - cmsis # required by the ARM port -``` - -- It is recommended to set the `revision` to a tagged version of Zephyr instead of always getting the main revision, which could have changing APIs. -- Also, please note that depending on what architecture you are targeting, you may need to add more/different targets to the `name-allowlist`, which is useful to get needed dependencies when compiling a project from a CI. See the [Zephyr workflow from swift-embedded-examples](https://github.com/swiftlang/swift-embedded-examples/blob/main/.github/workflows/build-zephyr.yml) for an example of setting up a CI for Zephyr. - -Next, set the `ZEPHYR_BASE` environment variable to tell `west` where the Zephyr workspace is located: - -```bash -(.venv)> export ZEPHYR_BASE=~/zephyrproject/zephyr -``` - -This could even be set as a global env variable for the user in `~/.bashrc` or `~/.zshrc` if desired. - -With this, `west` commands now can be run instead of having to use `cmake` and `ninja` to build and run: - -```bash -(.venv)> west build -b qemu_cortex_m0 . -p always -... -(.venv)> west build -t run --- west build: running target run -[0/1] To exit from QEMU enter: 'CTRL+a, x'[QEMU] CPU: cortex-m0 -*** Booting Zephyr OS build v4.1.0 *** -Hello Zephyr from Swift! -Loop -Loop -Loop -Loop -``` - -This setup may also be desirable since `west flash` is also available and can be used instead of invoking the flashing tools manually. - -If compiling a firmware for a real/physical board such as the `nrf52840dk/nrf52840`, `west flash` will work if the SEGGER J-Link host tools are installed. As an example, with the [nrfx-blink-sdk](../../../../nrfx-blink-sdk/) project: - -```console -> cd nrfx-blink-sdk -> source ~/zephyrproject/.venv/bin/activate -(.venv)> export ZEPHYR_BASE=~/zephyrproject/zephyr -(.venv)> west build -b nrf52840dk/nrf52840 . -p always -... -(.venv)> west flash -r jlink --- west flash: rebuilding -ninja: no work to do. --- west flash: using runner jlink --- runners.jlink: reset after flashing requested --- runners.jlink: JLink version: 8.26 --- runners.jlink: Flashing file: ~/swift-embedded-examples/nrfx-blink-sdk/build/zephyr/zephyr.hex -``` - -The `-r jlink` param is needed for this example to use the J-Link tools instead of using `nrfjprog`, which is the default for this board and also [deprecated](https://www.nordicsemi.com/Products/Development-tools/nRF-Command-Line-Tools). - -## Customizing the Linker - -The default linker configuration for building a Zephyr project from CMake works well for simple projects, but it can be customized as needed. The following sections show off some useful ways to customize linking Zephyr projects for Swift. - -### Stripping Out Unused Sections - -When compiling Swift to Zephyr projects, you may see some warnings about orphaned sections from the linker, like `.swift_modhash`: - -```console -~/zephyr-sdk-0.17.0/arm-zephyr-eabi/bin/../lib/gcc/arm-zephyr-eabi/12.2.0/../../../../arm-zephyr-eabi/bin/ld.bfd: warning: orphan section `.swift_modhash' from `app/libapp.a(Main.swift.obj)' being placed in section `.swift_modhash' -[135/135] Linking C executable zephyr/zephyr.elf -~/zephyr-sdk-0.17.0/arm-zephyr-eabi/bin/../lib/gcc/arm-zephyr-eabi/12.2.0/../../../../arm-zephyr-eabi/bin/ld.bfd: warning: orphan section `.swift_modhash' from `app/libapp.a(Main.swift.obj)' being placed in section `.swift_modhash -``` - -These types of warnings can be suppressed by passing a custom linker script to Zephyr that discards the sections, especially if they are not needed. For example, a script called `sections.ld` can be created at the root of the project with the following contents: - -```ld -/DISCARD/ : { *(.swift_modhash*) } -/DISCARD/ : { *(.ARM.attributes*) *(.ARM.exidx) } -``` - -Then, in `CMakeLists.txt`, add the following line: - -```cmake -# Remove unused sections -zephyr_linker_sources(SECTIONS "sections.ld") -``` - -This can also help to reduce the size of the output elf/binary since unused sections are stripped out. Be careful what sections you strip out, however, as some sections may be required. - -### Linking Swift Libraries - -This example adds the `swiftUnicodeDataTables` library from Swift to be linked into the Zephyr project. This is useful for linking unicode symbols when using strings. See for more information on this. - -In order to add additional linker params, the CMake `target_link_libraries` invocation can be used against `zephyr_pre0` and `zephyr_final`, like this: - -```cmake -# The code is using a String as a Dictionary key and thus require linking with libswiftUnicodeDataTables.a -# We compute the path where this file reside, taking into accout how the toolchain is referenced (Swiftly or TOOLCHAINS env variable). -find_program(SWIFTLY "swiftly") -IF(SWIFTLY) - execute_process(COMMAND swiftly use --print-location OUTPUT_VARIABLE toolchain_path) - cmake_path(SET additional_lib_path NORMALIZE "${toolchain_path}/usr/lib/swift/embedded/${CMAKE_Swift_COMPILER_TARGET}") -ELSE() - get_filename_component(compiler_bin_dir ${CMAKE_Swift_COMPILER} DIRECTORY) - cmake_path(SET additional_lib_path NORMALIZE "${compiler_bin_dir}/../lib/swift/embedded/${CMAKE_Swift_COMPILER_TARGET}") -ENDIF() - -target_link_directories(zephyr_pre0 PRIVATE "${additional_lib_path}") -target_link_libraries(zephyr_pre0 - -Wl,--whole-archive - swiftUnicodeDataTables - -Wl,--no-whole-archive - ) - -target_link_directories(zephyr_final PRIVATE "${additional_lib_path}") -target_link_libraries(zephyr_final - -Wl,--whole-archive - swiftUnicodeDataTables - -Wl,--no-whole-archive - ) -``` - -Extra code is required to find the right paths where the `swiftUnicodeDataTables.a` file is located, depending on how Swift is installed. - -When this is built, depending on the target architecture, warnings may then be printed about 32-bit enums, like this: - -```console -~/zephyr-sdk-0.17.0/arm-zephyr-eabi/bin/../lib/gcc/arm-zephyr-eabi/12.2.0/../../../../arm-zephyr-eabi/bin/ld.bfd: warning: ~/.local/share/swiftly/toolchains/6.1.0/usr/lib/swift/embedded/armv6m-none-none-eabi/libswiftUnicodeDataTables.a(UnicodeWord.cpp.o) uses 32-bit enums yet the output is to use variable-size enums; use of enum values across objects may fail -``` - -To suppress these, simply add `-Wl,--no-enum-size-warning` to the `target_link_libraries` invocations. diff --git a/Sources/EmbeddedSwift/Documentation.docc/SDKSupport/IntegratingWithPlatforms.md b/Sources/EmbeddedSwift/Documentation.docc/SDKSupport/IntegratingWithPlatforms.md deleted file mode 100644 index 25163351..00000000 --- a/Sources/EmbeddedSwift/Documentation.docc/SDKSupport/IntegratingWithPlatforms.md +++ /dev/null @@ -1,106 +0,0 @@ -# Integrating with embedded platforms - -Understand the common patterns and approaches for integrating Swift with existing embedded systems - -## Overview - -Most embedded platforms provide SDKs consisting of drivers, libraries, and HAL (Hardware Abstraction Layer) components, typically written in the C language. Embedded Swift's C interoperability makes it possible to seamlessly integrate with these existing SDKs. - -This will enable using the entire API surface of an SDK directly from Swift, and is usually the easiest way to get started — because all functionality from the SDK will simply be available in your Swift code. Additionally, you could build Swift wrappers around the C SDK to provide a more idiomatic Swift API. This approach requires a bit more work but can result in a more ergonomic and type-safe interface, leveraging Swift's strong type system and safety features to prevent common errors when interacting with low-level hardware. - -Alternatively, for the most constrained environments or when you need complete control over the hardware, you can develop baremetal Swift applications without relying on any SDK. This approach requires implementing your own hardware initialization code and peripheral drivers directly in Swift or in C with Swift wrappers. Baremetal development gives you the maximum flexibility but requires deeper understanding of the target hardware. - -## Common Integration Patterns - -### Using a Bridging Header - -The simplest method for integrating with an embedded platform SDK is using a bridging header that imports the necessary C headers: - -```c -// BridgingHeader.h -#include "platform_specific_header.h" -#include "hardware_drivers.h" -``` - -When compiling Swift code, include this header: - -```bash -swiftc -enable-experimental-feature Embedded -wmo \ - -import-bridging-header BridgingHeader.h \ - -target \ - YourSwiftCode.swift -c -o output.o -``` - -Using a bridging header is discouraged when building an entire set of Swift libraries, but it's a very simple approach when the goal is to simply add a single Swift module into an existing software ecosystem. - -### Integrating with Build Systems - -Most embedded platforms use one of these build systems: - -1. **CMake**. -2. **Make**. -3. **Platform-specific build tools** - These usually allow integration of custom build steps. - -For (1) and (2), articles will be added to this documentation in the future. -For (3), it is always possible to manually invoke the Swift compiler (`swiftc`) with the right flags to produce a .o file that can be further used in the build system. Follow the article for details. - -### Matching platform's ISA and ABI - -When integrating Swift code with embedded platforms, it's crucial to properly match the Instruction Set Architecture (ISA) and Application Binary Interface (ABI) of the target system. The Swift compiler needs specific arguments to generate code that's compatible with the target microcontroller's architecture and calling conventions. Mismatches in these settings can lead to hard-to-debug issues or even complete failure to execute. - -Different microcontrollers require specific target triples and compiler flags to generate appropriate machine code. Here are common configurations you'll need: - -- **ARM Cortex-M0/M0+**: `-target armv6m-none-none-eabi` - For low-power, minimal ARM cores -- **ARM Cortex-M3/M4**: `-target armv7m-none-none-eabi` - For more capable 32-bit ARM cores -- **ARM Cortex-M4F** (with FPU): `-target armv7em-none-none-eabi -Xcc -mfloat-abi=hard -Xcc -mfpu=fpv4-sp-d16` - For cores with hardware floating-point -- **RISC-V**: `-target riscv32-none-none-elf` - For RISC-V based microcontrollers - -Additional important compiler flags to consider include: -- `-Xcc -mfloat-abi=[soft|hard]` - Determines whether floating-point arguments are passed in integer registers (soft) or floating-point registers (hard) -- `-Xcc -fshort-enums` - Makes enums use the smallest possible integer type, important for ABI compatibility with C code -- `-Xcc -mcpu=specific-cpu` - Specifies the exact CPU model for more optimized code generation -- `-Xfrontend -function-sections` - Places each function in its own section, enabling better dead code elimination during linking (this is a recommended setting for ELF targets) - -## Platform Examples - -### Raspberry Pi Pico - -For detailed instructions on integrating with the Raspberry Pi Pico SDK, see . - -### ESP32 - -Note that only chips based on RISC-V architecture (e.g. ESP32-C3, ESP32-C6, ESP32-P4) are supported with Embedded Swift. The Xtensa ISA (used in e.g. ESP8266 or ESP32-S2 and ESP32-S3) is not supported. - -For ESP microcontrollers using the ESP-IDF framework, an article will be added to this documentation in the future. - -### STM32 - -STM32 microcontrollers can be programmed with Embedded Swift in two ways: - -1. Using the STM32Cube HAL/LL libraries - This requires proper integration with the STM32Cube build system -2. Bare-metal approach - See for details - -### Zephyr - -For detailed documentation on how to integrate Embedded Swift with Zephyr, see . - -### Bare-metal Development - -For completely bare-metal development without any SDK, see for guidance on implementing the necessary startup code and hardware initialization. - -## Tips & tricks - -- Using `print()` in your Swift code creates a dependency on `putchar`, which must be provided by your platform. Make sure your embedded environment has this C standard library function available if you plan to use Swift's printing functionality. - -- For debugging, consider implementing a custom print handler by implementing a C function called `putchar` that redirects output to your debug channel (UART, SWO, RTT, etc.). Many embedded platforms already do that by default. - -- Use the `-g` compiler flag during development to include debug information, making it easier to trace issues with a debugger like GDB or OpenOCD. - -- Use optimization flags to control code size and performance: - - Use `-Onone` during development for faster compilation and better debugging - - Use `-O` or `-Osize` for release builds to minimize code size and maximize performance - - Consider `-Osize` specifically for extremely constrained memory environments - -- When you cannot use `-Onone` (e.g. because the resulting binary size exceeds the platform limits), but you still want to maximize debuggability, use the `-assert-config=Debug` flag. This enables assertions, and also extra debug prints on failures. - -Remember that Embedded Swift is designed to have minimal impact on the overall system architecture, allowing you to start with small Swift components and gradually expand your Swift codebase as you become more comfortable with the language in embedded contexts. diff --git a/Sources/EmbeddedSwift/Documentation.docc/UsingEmbeddedSwift/Basics.md b/Sources/EmbeddedSwift/Documentation.docc/UsingEmbeddedSwift/Basics.md deleted file mode 100644 index ad18f8c5..00000000 --- a/Sources/EmbeddedSwift/Documentation.docc/UsingEmbeddedSwift/Basics.md +++ /dev/null @@ -1,76 +0,0 @@ -# Basics of using Embedded Swift - -Basic information for using Embedded Swift in typical embedded projects - -## Using Embedded Swift - -A typical setup and build and run cycle for an embedded development board involves: - -1. Getting an SDK with the C compilers, headers and libraries for the target -2. Building the C source code, and Swift source code into object files. -3. Linking all the libraries, C object files, and Swift object files. -4. Post-processing the linked firmware into a flashable format (UF2, BIN, HEX, or bespoke formats) -5. Uploading the flashable binary to the board over a USB cable using some vendor-provided JTAG/SWD tool, by copying it to a fake USB Mass Storage volume presented by the board or a custom platform bootloader. -6. Restarting the board, observing physical effects of the firmware (LEDs light up) or UART output over USB, or presence on network, etc. - -Many of these steps are out of scope for this document, because they are unrelated to Swift, and need to be set up and achieved independently of using Embedded Swift. For that, refer to your hardware vendor provided documentation. - -This document only focuses on (2) from the list above, and it's important that you first get familiar with the details of firmware development for your board without Swift in the mix. Even if you want to build a completely pure Swift firmware, you are still going to need the vendor provided tooling for linking, post-processing, uploading, etc. - -## Building code using Embedded Swift - -A basic way to build a set of Swift source files in Embedded Swift mode, is to simply give the compiler the following: -1. a target triple -2. the `-enable-experimental-feature Embedded` flag -3. the set of source files that form the input module: - -```shell -$ swiftc -target -enable-experimental-feature Embedded -wmo \ - input1.swift input2.swift ... -c -o output.o -``` - -On macOS, it's common to have Xcode installed, which comes with a toolchain that does not support Embedded Swift yet. Unless you download, install, and activate a swift.org toolchain, you'll see this error: - -```shell -$ swiftc input1.swift -enable-experimental-feature Embedded -wmo -:0: error: unable to load standard library for target 'arm64-apple-macosx15.0' -``` - -To resolve that, install a nightly Swift toolchain using Swiftly. You can follow the guide at for full instructions on that. - -## Building Swift firmware for a concrete embedded target - -To build Swift firmware (for now ignoring integration with SDKs, libraries and other pre-existing C code), we can use the `-target` argument to specify the CPU architecture. The target triple also decides whether the output object file will be an ELF file, or a Mach-O. For example: - -```bash -# To build an ARMv7 Mach-O object file: -$ swiftc -target armv7-apple-none-macho -enable-experimental-feature Embedded -wmo \ - input1.swift input2.swift ... -c -o output.o - -# To build an ARMv7 ELF object file: -$ swiftc -target armv7-none-none-eabi -enable-experimental-feature Embedded -wmo \ - input1.swift input2.swift ... -c -o output.o -``` - -Additionally, you probably want to specify additional Clang and/or LLVM flags to get the compiler to produce code for the exact ISA and ABI you need for your target. - -For example, a Raspberry Pi Pico / Pico W should target the ARMv6-M architecture via the `armv6m-*` target triple, but the `-mfloat-abi=soft` Clang option should also be used, and if you want to match ABI with libraries built with the GNU toolchain, you might also need `-fshort-enums`. To pass those to Swift, use the `-Xcc` prefix: - -```bash -# To build an ELF object file for ARMv6-M with soft float ABI (floating-point arguments passed in integer registers) and "short enums": -$ swiftc -target armv6m-none-none-eabi -enable-experimental-feature Embedded -wmo \ - -Xcc -mfloat-abi=soft -Xcc -fshort-enums \ - input1.swift input2.swift ... -c -o output.o -``` - -This might not be obvious: `-Xcc` flags are typically only used to alter behavior of the Clang importer, but passing flags to Clang this way also works to specify LLVM target options like selecting a specific CPU architecture (`-march`, `-mcpu`, `-mmcu`), FPU unit availability (`-mfpu`), which registers are used to pass floating-point values (`-mfloat-abi`), and others. - -## Integrating with existing embedded SDKs and build systems - -It's very common to integrate with existing SDKs in embedded development. This typically involves: - -1. **Setting up the build environment** with the right compiler flags, include paths, and linker settings to match the SDK's requirements. -2. **Creating a bridging header** that exposes the C functions and types from the SDK to Swift. -3. **Configuring the build system** to compile Swift code with the right flags and link it with the SDK's libraries. - -Most embedded SDKs provide a build system integration, commonly with CMake, Make, or their own custom build scripts. For details and concrete examples of how to integrate with more common platforms, SDKs and build systems, see . diff --git a/Sources/EmbeddedSwift/Documentation.docc/UsingEmbeddedSwift/ConditionalCompilation.md b/Sources/EmbeddedSwift/Documentation.docc/UsingEmbeddedSwift/ConditionalCompilation.md deleted file mode 100644 index d5407187..00000000 --- a/Sources/EmbeddedSwift/Documentation.docc/UsingEmbeddedSwift/ConditionalCompilation.md +++ /dev/null @@ -1,27 +0,0 @@ -# Conditionalizing compilation for Embedded Swift - -How to share code between Embedded Swift and full Swift using conditional compilation - -It's often useful to have source code be compilable under both regular Swift and Embedded Swift. The following syntax is available for that (but note that as the rest of Embedded Swift, it's experimental, subject to change and not considered source stable): - -```swift -func sayHello() { - #if hasFeature(Embedded) - print("I'm Embedded Swift") - #else - print("I'm regular Swift") - #endif -} -``` - -Additionally, you can also use an attribute (also experimental, and not source stable) to make entire functions, types and other declarations unavailable in Embedded Swift. This can be particularly useful to explicitly mark your own code (and also entire types and conformances) that relies on features unavailable in Embedded Swift, e.g. the Any type or Codable -- it is explicitly allowed to use those in unavailable contexts: - -```swift -@_unavailableInEmbedded -func useAny(_: Any) { ... } - -@_unavailableInEmbedded -extension MyStruct: Codable { - ... -} -``` diff --git a/Sources/EmbeddedSwift/Documentation.docc/UsingEmbeddedSwift/Existentials.md b/Sources/EmbeddedSwift/Documentation.docc/UsingEmbeddedSwift/Existentials.md deleted file mode 100644 index 716e009f..00000000 --- a/Sources/EmbeddedSwift/Documentation.docc/UsingEmbeddedSwift/Existentials.md +++ /dev/null @@ -1,104 +0,0 @@ -# Existentials - -Restrictions on existentials ("any" types) that apply in Embedded Swift - -## Background - -Existentials (also known as "any" types) in Swift are a way to express a type-erased value, where the actual type is not known statically, and at runtime it can be any type that conforms to the specified protocol. Because the possible types can vary in size, the representation of such a value is an "existential container" and the actual represented value is stored either inline (when it fits) or indirectly as a pointer to a heap allocation. There are also multiple concrete representations of the existential container that are optimized for different constraints (e.g. for class-bound existentials, the value does not make sense to ever store inline, so the size of the container is matched to hold exactly one pointer). - -Existentials are restricted in Embedded Swift in multiple ways, for multiple reasons: - -- Value existentials are not allowed. This prevents the optimization barriers and heap allocation indirections that come with those existentials in regular Swift. -- Class-bound protocols can be used as an existential. This still circumvents the often undesired behavior of existentials where they allocate (and deallocate) storage on the heap for the inner value if it cannot fit in the inline buffer, because class references are always refcounted and references are shared. -- Unbounded generic methods cannot be called through an existential. - -## Class-bound existentials - -Embedded Swift allows and supports class-bound existentials: - -```swift -protocol ClassBoundProtocol: AnyObject { // ✅, this means any type that wants to conform to ClassBoundProtocol must be a class type - func foo() -} - -class Base: ClassBoundProtocol { ... } -class Derived: Base { ... } // also conforms to ClassBoundProtocol -class Other: ClassBoundProtocol { ... } - -let existential: any ClassBoundProtocol = ... // ✅ -existential.foo() // ✅ -``` - -Note that protocols that are not class-bound cannot form existentials (in Embedded Swift): - -```swift -let existential: any Equatable = ... // ❌ - -class MyClass: Equatable { ... } -let existential: any Equatable = MyClass // ❌, not enough that the actual type is a class, the protocol itself must be class-bound -``` - -Class-bound existentials in Embedded Swift allow the "is" and "as!" / "as?" operators: - -```swift -let existential: any ClassBoundProtocol = ... -if existential is Base { ... } // ✅ -guard let concrete = existential as? Derived else { ... } // ✅ -let concrete = existential as! Derived // ✅, and will trap at runtime if a different type is inside the existential -``` - -## Restrictions on class-bound existentials - -Class-bound existentials in Embedded Swift do come with some restrictions compared to class-bound existentials in regular Swift: - -- You cannot use an existential to call a unbounded generic method from the protocol. This is described in depth in [Embedded Swift -- Non-final generic methods](NonFinalGenericMethods.md). For example: -```swift -protocol ClassBoundProtocol: AnyObject { - func foo(t: T) -} - -let ex: any ClassBoundProtocol = ... // ✅ -ex.foo(t: 42) // ❌ -``` - -- You cannot use an existential composition of a class-bound protocol with a non-class-bound protocol. For example: -```swift -let ex: any ClassBoundProtocol & OtherClassBound = ... // ✅ -let ex: any ClassBoundProtocol & Equatable = ... // ❌ -``` - -## Alternatives to existentials - -When existentials are not possible (e.g. because you need struct types in an existential), or not desirable (e.g. because the indirection on a class-bound existential causes an observation performance degradation), consider one of the following alternatives (which all have different tradeoffs and code structure implications): - -**(1) Avoid using an existential, use generics instead** - -```swift -protocol MyProtocol { - func write(t: T) -} - -func usingProtocolAsGeneric(p: some MyProtocol) { - p.write(t: 42) // ✅ -} -``` - -**(2) If you only need a different type based on compile-time configuration (e.g. mocking for unit testing), use #if and typealiases:** -```swift -#if UNIT_TESTING -typealias HWAccess = MMIOBasedHWAccess -#else -typealias HWAccess = MockHWAccess -#endif - -let v = HWAccess() -``` - -**(3) If you only have a handful of tightly-coupled types that need to participate in an existential, use an enum instead:** -```swift -enum E { - case type1(Type1) - case type2(Type2) - case type3(Type3) -} -``` diff --git a/Sources/EmbeddedSwift/Documentation.docc/UsingEmbeddedSwift/ExternalDependencies.md b/Sources/EmbeddedSwift/Documentation.docc/UsingEmbeddedSwift/ExternalDependencies.md deleted file mode 100644 index cf075059..00000000 --- a/Sources/EmbeddedSwift/Documentation.docc/UsingEmbeddedSwift/ExternalDependencies.md +++ /dev/null @@ -1,37 +0,0 @@ -# External dependencies - -What external system dependencies should you expect from Embedded Swift compilations - -Embedded Swift minimizes external dependencies (i.e. functions that need to be available at link-time), but they still exist. There are generally two categories of dependencies: (1) functions that the Swift standard library or Embedded Swift runtime need to call, and (2) functions/symbols that are implicitly added by LLVM and the compiler pipeline. - -For (1), external dependencies are only used based on actual usage of the program under compilation: - -- instantiating a class, or using UnsafeMutablePointer.allocate() - - dependency: `int posix_memalign(void **, size_t, size_t);` - - dependency: `void free(void *);` -- using print() - - dependency: `int putchar(int);` -- using Hashable, Set, Dictionary, or random-number generating APIs - - dependency: `void arc4random_buf(void *, size_t);` - -For (2), external dependencies are also triggered by specific code needing them, but they are somewhat lower-level patterns where it might not be obvious that such patterns should cause external dependencies: - -- **basic memory copying and zeroing functions** - - usage added for a variety of reasons (e.g. using structs on the stack) - - dependency: `void *memset(void *, int, size_t);` - - dependency: `void *memcpy(void *, const void *, size_t);` -- **stack protectors** (aka stack cookies or stack canaries) - - dependency: `void *__stack_chk_guard;` - - dependency: `void __stack_chk_fail(void);` - - stack protectors can be disabled with `-disable-stack-protector` swiftc flag -- **atomics intrinsics** - - on CPU architectures that don't have direct load-acquire/store-release support in the ISA, LLVM calls helper functions for atomic operations - - needed by refcounting in the Embedded Swift runtime (so any class usage will trigger this dependency) - - also needed when using atomics from the Synchronization module -- **multiplication/division/modulo intrinsics** - - on CPU architectures that don't have direct support for the math operations in the ISA - - dependency (on Mach-O): `__divti3` - - dependency (on Mach-O): `__modti3` - - dependency (with EABI): `__aeabi_ldivmod` - -The user and/or the platform (via basic libraries like libc or compiler builtins) is expected to provide these well-known APIs. diff --git a/Sources/EmbeddedSwift/Documentation.docc/UsingEmbeddedSwift/Libraries.md b/Sources/EmbeddedSwift/Documentation.docc/UsingEmbeddedSwift/Libraries.md deleted file mode 100644 index 22f5d2c3..00000000 --- a/Sources/EmbeddedSwift/Documentation.docc/UsingEmbeddedSwift/Libraries.md +++ /dev/null @@ -1,19 +0,0 @@ -# Libraries and modules in Embedded Swift - -Understand the library setup and linkage model of Embedded Swift - -Traditional library build and use model of Swift is that library code is compiled into a .swiftmodule, containing the interfaces, and a compiled library with binary code, either a .a static library or a .dylib/.so dynamic library. A client's build then uses the .swiftmodule at compile-time, and the static/dynamic library at link-time. - -The library model in Embedded Swift works slightly differently: All Swift source code of a library is promoted into being inlinable and visible to client builds (this is necessary for generic code, and beneficial for optimizations for non-generic code), and ends up serialized into the .swiftmodule, the interface of the library. Therefore, the compiled code of a library is never needed, and doesn't even need to be produced. For example: - -```bash -# Build the library, only as a .swiftmodule. Notice that we never build the .o or .a for the library. -$ swiftc -target -enable-experimental-feature Embedded -wmo \ - a.swift b.swift -module-name MyLibrary -emit-module -emit-module-path ./MyLibrary.swiftmodule - -# Build the client, "-I ." add the current directory to the module search path list -$ swiftc -target -enable-experimental-feature Embedded -wmo \ - client.swift -I . -c -o client.o -``` - -The Embedded Swift standard library is distributed in the toolchain the same way: It's strictly a .swiftmodule without any compiled code present anywhere. All the compiling into machine code is performed as part of the client's build. This has the major benefit that the client's build can provide additional ABI and ISA defining flags, such as the above-mentioned `-mfloat-abi`, `-fshort-enums`, `-mcpu`, `-march` flags, and these flags in the client's build will apply to all the library code (including standard library code) as well. diff --git a/Sources/EmbeddedSwift/Documentation.docc/UsingEmbeddedSwift/NonFinalGenericMethods.md b/Sources/EmbeddedSwift/Documentation.docc/UsingEmbeddedSwift/NonFinalGenericMethods.md deleted file mode 100644 index c1fe357e..00000000 --- a/Sources/EmbeddedSwift/Documentation.docc/UsingEmbeddedSwift/NonFinalGenericMethods.md +++ /dev/null @@ -1,125 +0,0 @@ -# Non-final generic methods - -Restrictions on unbound generic methods that apply in Embedded Swift - -## Background - -Embedded Swift relies on monomorphization to achieve its properties like not requiring type metadata. Monomorphization is mandatory specialization of all compiled code -- all function bodies get their concrete types substituted and all generics are "compiled out". This is based on passing type information top-down, i.e. from callers to callees, and specializing callees based on the concrete type provided by the caller. - -This type information passing from the caller is crucial. If it cannot happen for some reason, then monomorphization cannot happen. This is why Embedded Swift imposes restrictions on non-final generic methods on classes. - -## Non-final generic methods on classes (for subclassing-based dispatch) - -A non-final generic method on a class where the generic type does not come from the class context itself, is disallowed in Embedded Swift. This is because conservatively, the compiler must assume there could be subclasses with the method overridden. Monomorphization of a function call then cannot know the concrete target type. For example: - -```swift -class MyClass { - func write(t: T) { /* implementation */ } -} - -let instance: MyClass = ... // could be MyClass, or a subclass -instance.write(t: 42) // ❌ -``` - -Alternatives (which all have different tradeoffs and code structure implications): - -**(1) Make the class final (disallow subclassing):** - -```swift -final class MyClass { - func write(t: T) { /* implementation */ } -} - -let instance: MyClass = ... // can only be MyClass -instance.write(t: 42) // ✅ -``` - -**(2) Make the individual method final (disallow overriding in subclasses):** - -```swift -class MyClass { - final func write(t: T) { /* implementation */ } -} - -let instance: MyClass = ... // could be MyClass, or a subclass -instance.write(t: 42) // ✅ -``` - -**(3) Make the class generic instead of the method:** - -```swift -class MyClass { - func write(t: T) { /* implementation */ } -} - -let instance: MyClass = ... // can only be MyClass -instance.write(t: 42) // ✅ -``` - -**(4) Use overloading to support a set of concrete types:** - -```swift -class MyClass { - func write(t: Int) { /* implementation */ } - func write(t: Double) { /* implementation */ } -} - -let instance: MyClass = ... // could be MyClass, or a subclass -instance.write(t: 42) // ✅ -``` - -## Non-final generic methods on classes (for existential-based dispatch) - -A similar restriction applies to using class-bound existentials for dispatch method calls. Because at compile-time the target type is not statically known, monomorphization is not possible. For example: - -```swift -protocol MyProtocol: AnyObject { - func write(t: T) -} - -// existential ("any") is a runtime type-erasing box, we cannot specialize the target -// function for T == Int.self because we don't know the concrete type of "p" -func usingProtocolAsExistential(p: any MyProtocol) { - p.write(t: 42) // ❌ -} -``` - -Alternatives: - -**(1) Avoid using an existential, use generics instead** - -```swift -protocol MyProtocol: AnyObject { - func write(t: T) -} - -func usingProtocolAsGeneric(p: some MyProtocol) { - p.write(t: 42) // ✅ -} -``` - -**(2) Use a primary associated type** - -```swift -protocol MyProtocol: AnyObject { - associatedtype T - func write(t: T) -} - -func usingProtocolAsExistential(p: any MyProtocol) { - p.write(t: 42) // ✅ -} -``` - -**(3) Use overloading to support a set of concrete types:** - -```swift -protocol MyProtocol: AnyObject { - func write(t: Int) - func write(t: Double) -} - -func usingProtocolAsExistential(p: any MyProtocol) { - p.write(t: 42) // ✅ -} -``` diff --git a/Sources/EmbeddedSwift/Documentation.docc/UsingEmbeddedSwift/Strings.md b/Sources/EmbeddedSwift/Documentation.docc/UsingEmbeddedSwift/Strings.md deleted file mode 100644 index f1e23bda..00000000 --- a/Sources/EmbeddedSwift/Documentation.docc/UsingEmbeddedSwift/Strings.md +++ /dev/null @@ -1,53 +0,0 @@ -# Strings - -How to enable full Unicode-compliant string support in Embedded Swift - -Both StaticString and String types are available in Embedded Swift. As is the case in desktop Swift, certain operations on strings require Unicode data tables for strict Unicode compliance. In Embedded Swift these data tables are provided as a separate static library (libUnicodeDataTables.a) that users need to link in manually – if they need to use these string operations. If the library is required, linking will fail due to missing on one or more of the following symbols: - -``` -_swift_stdlib_getAge -_swift_stdlib_getBinaryProperties -_swift_stdlib_getCaseMapping -_swift_stdlib_getComposition -_swift_stdlib_getDecompositionEntry -_swift_stdlib_getGeneralCategory -_swift_stdlib_getGraphemeBreakProperty -_swift_stdlib_getMapping -_swift_stdlib_getMphIdx -_swift_stdlib_getNameAlias -_swift_stdlib_getNormData -_swift_stdlib_getNumericType -_swift_stdlib_getNumericValue -_swift_stdlib_getScalarBitArrayIdx -_swift_stdlib_getScalarName -_swift_stdlib_getScript -_swift_stdlib_getScriptExtensions -_swift_stdlib_getSpecialMapping -_swift_stdlib_getWordBreakProperty -_swift_stdlib_isLinkingConsonant -_swift_stdlib_nfd_decompositions -``` - -To resolve this, link in the `libswiftUnicodeDataTables.a` that's in Swift toolchain's resource directory (`lib/swift/`) under the target triple that you're using: - -```bash -$ swiftc -target armv6m-none-none-eabi -enable-experimental-feature Embedded -wmo -c -o output.o -$ ld ... -o binary output.o $(dirname `which swiftc`)/../lib/swift/embedded/armv6m-none-none-eabi/libswiftUnicodeDataTables.a -``` - -**Unicode data tables are required for (list not exhaustive):** - -- Comparing String objects for equality -- Sorting Strings -- Using String's hash values, and in particular using String as dictionary keys -- Using String's `.count` property -- Using Unicode-aware string processing APIs (`.split()`, iterating characters, indexing) -- Using Unicode-aware conversion String APIs (`.uppercased()`, `.lowercased()`, etc.) - -**For contrast, unicode data tables are *not required for* (list not exhaustive):** - -- Using StaticString -- Creating, concatenating, string interpolating, and printing String objects -- Using `.utf8`, `.utf16`, and `.unicodeScalars` views of strings, including their .count property, using them as dictionary keys - -Manually linking `libswiftUnicodeDataTables.a` is required for several reasons, including acknowledging that the data tables are desirable: Since they have a non-negligible size, it's useful to be aware that you are using them. diff --git a/Sources/EmbeddedSwift/Empty.swift b/Sources/EmbeddedSwift/Empty.swift deleted file mode 100644 index 24ae0cad..00000000 --- a/Sources/EmbeddedSwift/Empty.swift +++ /dev/null @@ -1,12 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2025 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -// This file is included so SwiftPM considers the target to be a Swift target. diff --git a/Tools/SVDs/README.md b/Tools/SVDs/README.md deleted file mode 100644 index 9186aa9e..00000000 --- a/Tools/SVDs/README.md +++ /dev/null @@ -1,8 +0,0 @@ -# SVDs - -The SVDs used in this repo have been copied from the following sources. - -| file | source | -|----------------------|----------------------------------------------------------------------| -| `rp2040.patched.svd` | https://github.com/rp-rs/rp2040-pac/blob/main/svd/rp2040.svd.patched | -| `rp2350.patched.svd` | https://github.com/rp-rs/rp235x-pac/blob/main/svd/RP2350.svd.patched | diff --git a/Tools/SVDs/rp2040.patched.svd b/Tools/SVDs/rp2040.patched.svd deleted file mode 100644 index a57dfd30..00000000 --- a/Tools/SVDs/rp2040.patched.svd +++ /dev/null @@ -1,22267 +0,0 @@ - - - Raspberry Pi - RP2040 - 0.1 - Dual-core Arm Cortex-M0+ processor, flexible clock running up to 133 MHz\n - 264KB on-chip SRAM\n - 2 x UART, 2 x SPI controllers, 2 x I2C controllers, 16 x PWM channels\n - 1 x USB 1.1 controller and PHY, with host and device support\n - 8 x Programmable I/O (PIO) state machines for custom peripheral support\n - Supported input power 1.8-5.5V DC\n - Operating temperature -20C to +85C\n - Drag-and-drop programming using mass storage over USB\n - Low-power sleep and dormant modes\n - Accurate on-chip clock\n - Temperature sensor\n - Accelerated integer and floating-point libraries on-chip - Copyright (c) 2020 Raspberry Pi (Trading) Ltd.\n - \n - SPDX-License-Identifier: BSD-3-Clause - - CM0PLUS - r0p1 - little - true - false - true - 2 - false - 26 - - 8 - 32 - - - XIP_CTRL - 1 - QSPI flash execute-in-place block - 0x14000000 - 0x20 - - 0x0 - 0x20 - registers - - - XIP_IRQ - 6 - - - - CTRL - Cache control - 0x0 - 0x00000003 - - - POWER_DOWN - When 1, the cache memories are powered down. They retain state,\n - but can not be accessed. This reduces static power dissipation.\n - Writing 1 to this bit forces CTRL_EN to 0, i.e. the cache cannot\n - be enabled when powered down.\n - Cache-as-SRAM accesses will produce a bus error response when\n - the cache is powered down. - [3:3] - read-write - - - ERR_BADWRITE - When 1, writes to any alias other than 0x0 (caching, allocating)\n - will produce a bus fault. When 0, these writes are silently ignored.\n - In either case, writes to the 0x0 alias will deallocate on tag match,\n - as usual. - [1:1] - read-write - - - EN - When 1, enable the cache. When the cache is disabled, all XIP accesses\n - will go straight to the flash, without querying the cache. When enabled,\n - cacheable XIP accesses will query the cache, and the flash will\n - not be accessed if the tag matches and the valid bit is set.\n\n - If the cache is enabled, cache-as-SRAM accesses have no effect on the\n - cache data RAM, and will produce a bus error response. - [0:0] - read-write - - - - - FLUSH - Cache Flush control - 0x4 - 0x00000000 - - - FLUSH - Write 1 to flush the cache. This clears the tag memory, but\n - the data memory retains its contents. (This means cache-as-SRAM\n - contents is not affected by flush or reset.)\n - Reading will hold the bus (stall the processor) until the flush\n - completes. Alternatively STAT can be polled until completion. - [0:0] - read-write - clear - - - - - STAT - Cache Status - 0x8 - 0x00000002 - - - FIFO_FULL - When 1, indicates the XIP streaming FIFO is completely full.\n - The streaming FIFO is 2 entries deep, so the full and empty\n - flag allow its level to be ascertained. - [2:2] - read-only - - - FIFO_EMPTY - When 1, indicates the XIP streaming FIFO is completely empty. - [1:1] - read-only - - - FLUSH_READY - Reads as 0 while a cache flush is in progress, and 1 otherwise.\n - The cache is flushed whenever the XIP block is reset, and also\n - when requested via the FLUSH register. - [0:0] - read-only - - - - - CTR_HIT - Cache Hit counter\n - A 32 bit saturating counter that increments upon each cache hit,\n - i.e. when an XIP access is serviced directly from cached data.\n - Write any value to clear. - 0xC - read-write - 0x00000000 - oneToClear - - - CTR_ACC - Cache Access counter\n - A 32 bit saturating counter that increments upon each XIP access,\n - whether the cache is hit or not. This includes noncacheable accesses.\n - Write any value to clear. - 0x10 - read-write - 0x00000000 - oneToClear - - - STREAM_ADDR - FIFO stream address - 0x14 - 0x00000000 - - - STREAM_ADDR - The address of the next word to be streamed from flash to the streaming FIFO.\n - Increments automatically after each flash access.\n - Write the initial access address here before starting a streaming read. - [31:2] - read-write - - - - - STREAM_CTR - FIFO stream control - 0x18 - 0x00000000 - - - STREAM_CTR - Write a nonzero value to start a streaming read. This will then\n - progress in the background, using flash idle cycles to transfer\n - a linear data block from flash to the streaming FIFO.\n - Decrements automatically (1 at a time) as the stream\n - progresses, and halts on reaching 0.\n - Write 0 to halt an in-progress stream, and discard any in-flight\n - read, so that a new stream can immediately be started (after\n - draining the FIFO and reinitialising STREAM_ADDR) - [21:0] - read-write - - - - - STREAM_FIFO - FIFO stream data\n - Streamed data is buffered here, for retrieval by the system DMA.\n - This FIFO can also be accessed via the XIP_AUX slave, to avoid exposing\n - the DMA to bus stalls caused by other XIP traffic. - 0x1C - read-only - 0x00000000 - - - - - XIP_SSI - 1 - DW_apb_ssi has the following features:\n - * APB interface - Allows for easy integration into a DesignWare Synthesizable Components for AMBA 2 implementation.\n - * APB3 and APB4 protocol support.\n - * Scalable APB data bus width - Supports APB data bus widths of 8, 16, and 32 bits.\n - * Serial-master or serial-slave operation - Enables serial communication with serial-master or serial-slave peripheral devices.\n - * Programmable Dual/Quad/Octal SPI support in Master Mode.\n - * Dual Data Rate (DDR) and Read Data Strobe (RDS) Support - Enables the DW_apb_ssi master to perform operations with the device in DDR and RDS modes when working in Dual/Quad/Octal mode of operation.\n - * Data Mask Support - Enables the DW_apb_ssi to selectively update the bytes in the device. This feature is applicable only in enhanced SPI modes.\n - * eXecute-In-Place (XIP) support - Enables the DW_apb_ssi master to behave as a memory mapped I/O and fetches the data from the device based on the APB read request. This feature is applicable only in enhanced SPI modes.\n - * DMA Controller Interface - Enables the DW_apb_ssi to interface to a DMA controller over the bus using a handshaking interface for transfer requests.\n - * Independent masking of interrupts - Master collision, transmit FIFO overflow, transmit FIFO empty, receive FIFO full, receive FIFO underflow, and receive FIFO overflow interrupts can all be masked independently.\n - * Multi-master contention detection - Informs the processor of multiple serial-master accesses on the serial bus.\n - * Bypass of meta-stability flip-flops for synchronous clocks - When the APB clock (pclk) and the DW_apb_ssi serial clock (ssi_clk) are synchronous, meta-stable flip-flops are not used when transferring control signals across these clock domains.\n - * Programmable delay on the sample time of the received serial data bit (rxd); enables programmable control of routing delays resulting in higher serial data-bit rates.\n - * Programmable features:\n - - Serial interface operation - Choice of Motorola SPI, Texas Instruments Synchronous Serial Protocol or National Semiconductor Microwire.\n - - Clock bit-rate - Dynamic control of the serial bit rate of the data transfer; used in only serial-master mode of operation.\n - - Data Item size (4 to 32 bits) - Item size of each data transfer under the control of the programmer.\n - * Configured features:\n - - FIFO depth - 16 words deep. The FIFO width is fixed at 32 bits.\n - - 1 slave select output.\n - - Hardware slave-select - Dedicated hardware slave-select line.\n - - Combined interrupt line - one combined interrupt line from the DW_apb_ssi to the interrupt controller.\n - - Interrupt polarity - active high interrupt lines.\n - - Serial clock polarity - low serial-clock polarity directly after reset.\n - - Serial clock phase - capture on first edge of serial-clock directly after reset. - 0x18000000 - 0x20 - - 0x0 - 0x100 - registers - - - - CTRLR0 - Control register 0 - 0x0 - 0x00000000 - - - SSTE - Slave select toggle enable - [24:24] - read-write - - - SPI_FRF - SPI frame format - [22:21] - read-write - - - STD - Standard 1-bit SPI frame format; 1 bit per SCK, full-duplex - 0 - - - DUAL - Dual-SPI frame format; two bits per SCK, half-duplex - 1 - - - QUAD - Quad-SPI frame format; four bits per SCK, half-duplex - 2 - - - - - DFS_32 - Data frame size in 32b transfer mode\n - Value of n -> n+1 clocks per frame. - [20:16] - read-write - - - CFS - Control frame size\n - Value of n -> n+1 clocks per frame. - [15:12] - read-write - - - SRL - Shift register loop (test mode) - [11:11] - read-write - - - SLV_OE - Slave output enable - [10:10] - read-write - - - TMOD - Transfer mode - [9:8] - read-write - - - TX_AND_RX - Both transmit and receive - 0 - - - TX_ONLY - Transmit only (not for FRF == 0, standard SPI mode) - 1 - - - RX_ONLY - Receive only (not for FRF == 0, standard SPI mode) - 2 - - - EEPROM_READ - EEPROM read mode (TX then RX; RX starts after control data TX'd) - 3 - - - - - SCPOL - Serial clock polarity - [7:7] - read-write - - - SCPH - Serial clock phase - [6:6] - read-write - - - FRF - Frame format - [5:4] - read-write - - - DFS - Data frame size - [3:0] - read-write - - - - - CTRLR1 - Master Control register 1 - 0x4 - 0x00000000 - - - NDF - Number of data frames - [15:0] - read-write - - - - - SSIENR - SSI Enable - 0x8 - 0x00000000 - - - SSI_EN - SSI enable - [0:0] - read-write - - - - - MWCR - Microwire Control - 0xC - 0x00000000 - - - MHS - Microwire handshaking - [2:2] - read-write - - - MDD - Microwire control - [1:1] - read-write - - - MWMOD - Microwire transfer mode - [0:0] - read-write - - - - - SER - Slave enable - 0x10 - 0x00000000 - - - SER - For each bit:\n - 0 -> slave not selected\n - 1 -> slave selected - [0:0] - read-write - - - - - BAUDR - Baud rate - 0x14 - 0x00000000 - - - SCKDV - SSI clock divider - [15:0] - read-write - - - - - TXFTLR - TX FIFO threshold level - 0x18 - 0x00000000 - - - TFT - Transmit FIFO threshold - [7:0] - read-write - - - - - RXFTLR - RX FIFO threshold level - 0x1C - 0x00000000 - - - RFT - Receive FIFO threshold - [7:0] - read-write - - - - - TXFLR - TX FIFO level - 0x20 - 0x00000000 - - - TFTFL - Transmit FIFO level - [7:0] - read-only - - - - - RXFLR - RX FIFO level - 0x24 - 0x00000000 - - - RXTFL - Receive FIFO level - [7:0] - read-only - - - - - SR - Status register - 0x28 - 0x00000000 - - - DCOL - Data collision error - [6:6] - read-only - - - TXE - Transmission error - [5:5] - read-only - - - RFF - Receive FIFO full - [4:4] - read-only - - - RFNE - Receive FIFO not empty - [3:3] - read-only - - - TFE - Transmit FIFO empty - [2:2] - read-only - - - TFNF - Transmit FIFO not full - [1:1] - read-only - - - BUSY - SSI busy flag - [0:0] - read-only - - - - - IMR - Interrupt mask - 0x2C - 0x00000000 - - - MSTIM - Multi-master contention interrupt mask - [5:5] - read-write - - - RXFIM - Receive FIFO full interrupt mask - [4:4] - read-write - - - RXOIM - Receive FIFO overflow interrupt mask - [3:3] - read-write - - - RXUIM - Receive FIFO underflow interrupt mask - [2:2] - read-write - - - TXOIM - Transmit FIFO overflow interrupt mask - [1:1] - read-write - - - TXEIM - Transmit FIFO empty interrupt mask - [0:0] - read-write - - - - - ISR - Interrupt status - 0x30 - 0x00000000 - - - MSTIS - Multi-master contention interrupt status - [5:5] - read-only - - - RXFIS - Receive FIFO full interrupt status - [4:4] - read-only - - - RXOIS - Receive FIFO overflow interrupt status - [3:3] - read-only - - - RXUIS - Receive FIFO underflow interrupt status - [2:2] - read-only - - - TXOIS - Transmit FIFO overflow interrupt status - [1:1] - read-only - - - TXEIS - Transmit FIFO empty interrupt status - [0:0] - read-only - - - - - RISR - Raw interrupt status - 0x34 - 0x00000000 - - - MSTIR - Multi-master contention raw interrupt status - [5:5] - read-only - - - RXFIR - Receive FIFO full raw interrupt status - [4:4] - read-only - - - RXOIR - Receive FIFO overflow raw interrupt status - [3:3] - read-only - - - RXUIR - Receive FIFO underflow raw interrupt status - [2:2] - read-only - - - TXOIR - Transmit FIFO overflow raw interrupt status - [1:1] - read-only - - - TXEIR - Transmit FIFO empty raw interrupt status - [0:0] - read-only - - - - - TXOICR - TX FIFO overflow interrupt clear - 0x38 - 0x00000000 - - - TXOICR - Clear-on-read transmit FIFO overflow interrupt - [0:0] - read-only - - - - - RXOICR - RX FIFO overflow interrupt clear - 0x3C - 0x00000000 - - - RXOICR - Clear-on-read receive FIFO overflow interrupt - [0:0] - read-only - - - - - RXUICR - RX FIFO underflow interrupt clear - 0x40 - 0x00000000 - - - RXUICR - Clear-on-read receive FIFO underflow interrupt - [0:0] - read-only - - - - - MSTICR - Multi-master interrupt clear - 0x44 - 0x00000000 - - - MSTICR - Clear-on-read multi-master contention interrupt - [0:0] - read-only - - - - - ICR - Interrupt clear - 0x48 - 0x00000000 - - - ICR - Clear-on-read all active interrupts - [0:0] - read-only - - - - - DMACR - DMA control - 0x4C - 0x00000000 - - - TDMAE - Transmit DMA enable - [1:1] - read-write - - - RDMAE - Receive DMA enable - [0:0] - read-write - - - - - DMATDLR - DMA TX data level - 0x50 - 0x00000000 - - - DMATDL - Transmit data watermark level - [7:0] - read-write - - - - - DMARDLR - DMA RX data level - 0x54 - 0x00000000 - - - DMARDL - Receive data watermark level (DMARDLR+1) - [7:0] - read-write - - - - - IDR - Identification register - 0x58 - 0x51535049 - - - IDCODE - Peripheral dentification code - [31:0] - read-only - - - - - SSI_VERSION_ID - Version ID - 0x5C - 0x3430312A - - - SSI_COMP_VERSION - SNPS component version (format X.YY) - [31:0] - read-only - - - - - DR0 - Data Register 0 (of 36) - 0x60 - 0x00000000 - - - DR - First data register of 36 - [31:0] - read-write - - - - - RX_SAMPLE_DLY - RX sample delay - 0xF0 - 0x00000000 - - - RSD - RXD sample delay (in SCLK cycles) - [7:0] - read-write - - - - - SPI_CTRLR0 - SPI control - 0xF4 - 0x03000000 - - - XIP_CMD - SPI Command to send in XIP mode (INST_L = 8-bit) or to append to Address (INST_L = 0-bit) - [31:24] - read-write - - - SPI_RXDS_EN - Read data strobe enable - [18:18] - read-write - - - INST_DDR_EN - Instruction DDR transfer enable - [17:17] - read-write - - - SPI_DDR_EN - SPI DDR transfer enable - [16:16] - read-write - - - WAIT_CYCLES - Wait cycles between control frame transmit and data reception (in SCLK cycles) - [15:11] - read-write - - - INST_L - Instruction length (0/4/8/16b) - [9:8] - read-write - - - NONE - No instruction - 0 - - - 4B - 4-bit instruction - 1 - - - 8B - 8-bit instruction - 2 - - - 16B - 16-bit instruction - 3 - - - - - ADDR_L - Address length (0b-60b in 4b increments) - [5:2] - read-write - - - TRANS_TYPE - Address and instruction transfer format - [1:0] - read-write - - - 1C1A - Command and address both in standard SPI frame format - 0 - - - 1C2A - Command in standard SPI format, address in format specified by FRF - 1 - - - 2C2A - Command and address both in format specified by FRF (e.g. Dual-SPI) - 2 - - - - - - - TXD_DRIVE_EDGE - TX drive edge - 0xF8 - 0x00000000 - - - TDE - TXD drive edge - [7:0] - read-write - - - - - - - SYSINFO - 1 - 0x40000000 - 0x20 - - 0x0 - 0x1000 - registers - - - - CHIP_ID - JEDEC JEP-106 compliant chip identifier. - 0x0 - 0x00000000 - - - REVISION - [31:28] - read-only - - - PART - [27:12] - read-only - - - MANUFACTURER - [11:0] - read-only - - - - - PLATFORM - Platform register. Allows software to know what environment it is running in. - 0x4 - 0x00000000 - - - ASIC - [1:1] - read-only - - - FPGA - [0:0] - read-only - - - - - GITREF_RP2040 - Git hash of the chip source. Used to identify chip version. - 0x40 - read-only - 0x00000000 - - - - - SYSCFG - 1 - Register block for various chip control signals - 0x40004000 - 0x20 - - 0x0 - 0x1000 - registers - - - - PROC0_NMI_MASK - Processor core 0 NMI source mask\n - Set a bit high to enable NMI from that IRQ - 0x0 - read-write - 0x00000000 - - - PROC1_NMI_MASK - Processor core 1 NMI source mask\n - Set a bit high to enable NMI from that IRQ - 0x4 - read-write - 0x00000000 - - - PROC_CONFIG - Configuration for processors - 0x8 - 0x10000000 - - - PROC1_DAP_INSTID - Configure proc1 DAP instance ID.\n - Recommend that this is NOT changed until you require debug access in multi-chip environment\n - WARNING: do not set to 15 as this is reserved for RescueDP - [31:28] - read-write - - - PROC0_DAP_INSTID - Configure proc0 DAP instance ID.\n - Recommend that this is NOT changed until you require debug access in multi-chip environment\n - WARNING: do not set to 15 as this is reserved for RescueDP - [27:24] - read-write - - - PROC1_HALTED - Indication that proc1 has halted - [1:1] - read-only - - - PROC0_HALTED - Indication that proc0 has halted - [0:0] - read-only - - - - - PROC_IN_SYNC_BYPASS - For each bit, if 1, bypass the input synchronizer between that GPIO\n - and the GPIO input register in the SIO. The input synchronizers should\n - generally be unbypassed, to avoid injecting metastabilities into processors.\n - If you're feeling brave, you can bypass to save two cycles of input\n - latency. This register applies to GPIO 0...29. - 0xC - 0x00000000 - - - PROC_IN_SYNC_BYPASS - [29:0] - read-write - - - - - PROC_IN_SYNC_BYPASS_HI - For each bit, if 1, bypass the input synchronizer between that GPIO\n - and the GPIO input register in the SIO. The input synchronizers should\n - generally be unbypassed, to avoid injecting metastabilities into processors.\n - If you're feeling brave, you can bypass to save two cycles of input\n - latency. This register applies to GPIO 30...35 (the QSPI IOs). - 0x10 - 0x00000000 - - - PROC_IN_SYNC_BYPASS_HI - [5:0] - read-write - - - - - DBGFORCE - Directly control the SWD debug port of either processor - 0x14 - 0x00000066 - - - PROC1_ATTACH - Attach processor 1 debug port to syscfg controls, and disconnect it from external SWD pads. - [7:7] - read-write - - - PROC1_SWCLK - Directly drive processor 1 SWCLK, if PROC1_ATTACH is set - [6:6] - read-write - - - PROC1_SWDI - Directly drive processor 1 SWDIO input, if PROC1_ATTACH is set - [5:5] - read-write - - - PROC1_SWDO - Observe the value of processor 1 SWDIO output. - [4:4] - read-only - - - PROC0_ATTACH - Attach processor 0 debug port to syscfg controls, and disconnect it from external SWD pads. - [3:3] - read-write - - - PROC0_SWCLK - Directly drive processor 0 SWCLK, if PROC0_ATTACH is set - [2:2] - read-write - - - PROC0_SWDI - Directly drive processor 0 SWDIO input, if PROC0_ATTACH is set - [1:1] - read-write - - - PROC0_SWDO - Observe the value of processor 0 SWDIO output. - [0:0] - read-only - - - - - MEMPOWERDOWN - Control power downs to memories. Set high to power down memories.\n - Use with extreme caution - 0x18 - 0x00000000 - - - ROM - [7:7] - read-write - - - USB - [6:6] - read-write - - - SRAM5 - [5:5] - read-write - - - SRAM4 - [4:4] - read-write - - - SRAM3 - [3:3] - read-write - - - SRAM2 - [2:2] - read-write - - - SRAM1 - [1:1] - read-write - - - SRAM0 - [0:0] - read-write - - - - - - - CLOCKS - 1 - 0x40008000 - 0x20 - - 0x0 - 0x1000 - registers - - - CLOCKS_IRQ - 17 - - - - CLK_GPOUT0_CTRL - Clock control, can be changed on-the-fly (except for auxsrc) - 0x0 - 0x00000000 - - - NUDGE - An edge on this signal shifts the phase of the output by 1 cycle of the input clock\n - This can be done at any time - [20:20] - read-write - - - PHASE - This delays the enable signal by up to 3 cycles of the input clock\n - This must be set before the clock is enabled to have any effect - [17:16] - read-write - - - DC50 - Enables duty cycle correction for odd divisors - [12:12] - read-write - - - ENABLE - Starts and stops the clock generator cleanly - [11:11] - read-write - - - KILL - Asynchronously kills the clock generator - [10:10] - read-write - - - AUXSRC - Selects the auxiliary clock source, will glitch when switching - [8:5] - read-write - - - clksrc_pll_sys - 0 - - - clksrc_gpin0 - 1 - - - clksrc_gpin1 - 2 - - - clksrc_pll_usb - 3 - - - rosc_clksrc - 4 - - - xosc_clksrc - 5 - - - clk_sys - 6 - - - clk_usb - 7 - - - clk_adc - 8 - - - clk_rtc - 9 - - - clk_ref - 10 - - - - - - - CLK_GPOUT0_DIV - Clock divisor, can be changed on-the-fly - 0x4 - 0x00000100 - - - INT - Integer component of the divisor, 0 -> divide by 2^16 - [31:8] - read-write - - - FRAC - Fractional component of the divisor - [7:0] - read-write - - - - - CLK_GPOUT0_SELECTED - Indicates which SRC is currently selected by the glitchless mux (one-hot).\n - This slice does not have a glitchless mux (only the AUX_SRC field is present, not SRC) so this register is hardwired to 0x1. - 0x8 - read-only - 0x00000001 - - - CLK_GPOUT1_CTRL - Clock control, can be changed on-the-fly (except for auxsrc) - 0xC - 0x00000000 - - - NUDGE - An edge on this signal shifts the phase of the output by 1 cycle of the input clock\n - This can be done at any time - [20:20] - read-write - - - PHASE - This delays the enable signal by up to 3 cycles of the input clock\n - This must be set before the clock is enabled to have any effect - [17:16] - read-write - - - DC50 - Enables duty cycle correction for odd divisors - [12:12] - read-write - - - ENABLE - Starts and stops the clock generator cleanly - [11:11] - read-write - - - KILL - Asynchronously kills the clock generator - [10:10] - read-write - - - AUXSRC - Selects the auxiliary clock source, will glitch when switching - [8:5] - read-write - - - clksrc_pll_sys - 0 - - - clksrc_gpin0 - 1 - - - clksrc_gpin1 - 2 - - - clksrc_pll_usb - 3 - - - rosc_clksrc - 4 - - - xosc_clksrc - 5 - - - clk_sys - 6 - - - clk_usb - 7 - - - clk_adc - 8 - - - clk_rtc - 9 - - - clk_ref - 10 - - - - - - - CLK_GPOUT1_DIV - Clock divisor, can be changed on-the-fly - 0x10 - 0x00000100 - - - INT - Integer component of the divisor, 0 -> divide by 2^16 - [31:8] - read-write - - - FRAC - Fractional component of the divisor - [7:0] - read-write - - - - - CLK_GPOUT1_SELECTED - Indicates which SRC is currently selected by the glitchless mux (one-hot).\n - This slice does not have a glitchless mux (only the AUX_SRC field is present, not SRC) so this register is hardwired to 0x1. - 0x14 - read-only - 0x00000001 - - - CLK_GPOUT2_CTRL - Clock control, can be changed on-the-fly (except for auxsrc) - 0x18 - 0x00000000 - - - NUDGE - An edge on this signal shifts the phase of the output by 1 cycle of the input clock\n - This can be done at any time - [20:20] - read-write - - - PHASE - This delays the enable signal by up to 3 cycles of the input clock\n - This must be set before the clock is enabled to have any effect - [17:16] - read-write - - - DC50 - Enables duty cycle correction for odd divisors - [12:12] - read-write - - - ENABLE - Starts and stops the clock generator cleanly - [11:11] - read-write - - - KILL - Asynchronously kills the clock generator - [10:10] - read-write - - - AUXSRC - Selects the auxiliary clock source, will glitch when switching - [8:5] - read-write - - - clksrc_pll_sys - 0 - - - clksrc_gpin0 - 1 - - - clksrc_gpin1 - 2 - - - clksrc_pll_usb - 3 - - - rosc_clksrc_ph - 4 - - - xosc_clksrc - 5 - - - clk_sys - 6 - - - clk_usb - 7 - - - clk_adc - 8 - - - clk_rtc - 9 - - - clk_ref - 10 - - - - - - - CLK_GPOUT2_DIV - Clock divisor, can be changed on-the-fly - 0x1C - 0x00000100 - - - INT - Integer component of the divisor, 0 -> divide by 2^16 - [31:8] - read-write - - - FRAC - Fractional component of the divisor - [7:0] - read-write - - - - - CLK_GPOUT2_SELECTED - Indicates which SRC is currently selected by the glitchless mux (one-hot).\n - This slice does not have a glitchless mux (only the AUX_SRC field is present, not SRC) so this register is hardwired to 0x1. - 0x20 - read-only - 0x00000001 - - - CLK_GPOUT3_CTRL - Clock control, can be changed on-the-fly (except for auxsrc) - 0x24 - 0x00000000 - - - NUDGE - An edge on this signal shifts the phase of the output by 1 cycle of the input clock\n - This can be done at any time - [20:20] - read-write - - - PHASE - This delays the enable signal by up to 3 cycles of the input clock\n - This must be set before the clock is enabled to have any effect - [17:16] - read-write - - - DC50 - Enables duty cycle correction for odd divisors - [12:12] - read-write - - - ENABLE - Starts and stops the clock generator cleanly - [11:11] - read-write - - - KILL - Asynchronously kills the clock generator - [10:10] - read-write - - - AUXSRC - Selects the auxiliary clock source, will glitch when switching - [8:5] - read-write - - - clksrc_pll_sys - 0 - - - clksrc_gpin0 - 1 - - - clksrc_gpin1 - 2 - - - clksrc_pll_usb - 3 - - - rosc_clksrc_ph - 4 - - - xosc_clksrc - 5 - - - clk_sys - 6 - - - clk_usb - 7 - - - clk_adc - 8 - - - clk_rtc - 9 - - - clk_ref - 10 - - - - - - - CLK_GPOUT3_DIV - Clock divisor, can be changed on-the-fly - 0x28 - 0x00000100 - - - INT - Integer component of the divisor, 0 -> divide by 2^16 - [31:8] - read-write - - - FRAC - Fractional component of the divisor - [7:0] - read-write - - - - - CLK_GPOUT3_SELECTED - Indicates which SRC is currently selected by the glitchless mux (one-hot).\n - This slice does not have a glitchless mux (only the AUX_SRC field is present, not SRC) so this register is hardwired to 0x1. - 0x2C - read-only - 0x00000001 - - - CLK_REF_CTRL - Clock control, can be changed on-the-fly (except for auxsrc) - 0x30 - 0x00000000 - - - AUXSRC - Selects the auxiliary clock source, will glitch when switching - [6:5] - read-write - - - clksrc_pll_usb - 0 - - - clksrc_gpin0 - 1 - - - clksrc_gpin1 - 2 - - - - - SRC - Selects the clock source glitchlessly, can be changed on-the-fly - [1:0] - read-write - - - rosc_clksrc_ph - 0 - - - clksrc_clk_ref_aux - 1 - - - xosc_clksrc - 2 - - - - - - - CLK_REF_DIV - Clock divisor, can be changed on-the-fly - 0x34 - 0x00000100 - - - INT - Integer component of the divisor, 0 -> divide by 2^16 - [9:8] - read-write - - - - - CLK_REF_SELECTED - Indicates which SRC is currently selected by the glitchless mux (one-hot).\n - The glitchless multiplexer does not switch instantaneously (to avoid glitches), so software should poll this register to wait for the switch to complete. This register contains one decoded bit for each of the clock sources enumerated in the CTRL SRC field. At most one of these bits will be set at any time, indicating that clock is currently present at the output of the glitchless mux. Whilst switching is in progress, this register may briefly show all-0s. - 0x38 - read-only - 0x00000001 - - - CLK_SYS_CTRL - Clock control, can be changed on-the-fly (except for auxsrc) - 0x3C - 0x00000000 - - - AUXSRC - Selects the auxiliary clock source, will glitch when switching - [7:5] - read-write - - - clksrc_pll_sys - 0 - - - clksrc_pll_usb - 1 - - - rosc_clksrc - 2 - - - xosc_clksrc - 3 - - - clksrc_gpin0 - 4 - - - clksrc_gpin1 - 5 - - - - - SRC - Selects the clock source glitchlessly, can be changed on-the-fly - [0:0] - read-write - - - clk_ref - 0 - - - clksrc_clk_sys_aux - 1 - - - - - - - CLK_SYS_DIV - Clock divisor, can be changed on-the-fly - 0x40 - 0x00000100 - - - INT - Integer component of the divisor, 0 -> divide by 2^16 - [31:8] - read-write - - - FRAC - Fractional component of the divisor - [7:0] - read-write - - - - - CLK_SYS_SELECTED - Indicates which SRC is currently selected by the glitchless mux (one-hot).\n - The glitchless multiplexer does not switch instantaneously (to avoid glitches), so software should poll this register to wait for the switch to complete. This register contains one decoded bit for each of the clock sources enumerated in the CTRL SRC field. At most one of these bits will be set at any time, indicating that clock is currently present at the output of the glitchless mux. Whilst switching is in progress, this register may briefly show all-0s. - 0x44 - read-only - 0x00000001 - - - CLK_PERI_CTRL - Clock control, can be changed on-the-fly (except for auxsrc) - 0x48 - 0x00000000 - - - ENABLE - Starts and stops the clock generator cleanly - [11:11] - read-write - - - KILL - Asynchronously kills the clock generator - [10:10] - read-write - - - AUXSRC - Selects the auxiliary clock source, will glitch when switching - [7:5] - read-write - - - clk_sys - 0 - - - clksrc_pll_sys - 1 - - - clksrc_pll_usb - 2 - - - rosc_clksrc_ph - 3 - - - xosc_clksrc - 4 - - - clksrc_gpin0 - 5 - - - clksrc_gpin1 - 6 - - - - - - - CLK_PERI_SELECTED - Indicates which SRC is currently selected by the glitchless mux (one-hot).\n - This slice does not have a glitchless mux (only the AUX_SRC field is present, not SRC) so this register is hardwired to 0x1. - 0x50 - read-only - 0x00000001 - - - CLK_USB_CTRL - Clock control, can be changed on-the-fly (except for auxsrc) - 0x54 - 0x00000000 - - - NUDGE - An edge on this signal shifts the phase of the output by 1 cycle of the input clock\n - This can be done at any time - [20:20] - read-write - - - PHASE - This delays the enable signal by up to 3 cycles of the input clock\n - This must be set before the clock is enabled to have any effect - [17:16] - read-write - - - ENABLE - Starts and stops the clock generator cleanly - [11:11] - read-write - - - KILL - Asynchronously kills the clock generator - [10:10] - read-write - - - AUXSRC - Selects the auxiliary clock source, will glitch when switching - [7:5] - read-write - - - clksrc_pll_usb - 0 - - - clksrc_pll_sys - 1 - - - rosc_clksrc_ph - 2 - - - xosc_clksrc - 3 - - - clksrc_gpin0 - 4 - - - clksrc_gpin1 - 5 - - - - - - - CLK_USB_DIV - Clock divisor, can be changed on-the-fly - 0x58 - 0x00000100 - - - INT - Integer component of the divisor, 0 -> divide by 2^16 - [9:8] - read-write - - - - - CLK_USB_SELECTED - Indicates which SRC is currently selected by the glitchless mux (one-hot).\n - This slice does not have a glitchless mux (only the AUX_SRC field is present, not SRC) so this register is hardwired to 0x1. - 0x5C - read-only - 0x00000001 - - - CLK_ADC_CTRL - Clock control, can be changed on-the-fly (except for auxsrc) - 0x60 - 0x00000000 - - - NUDGE - An edge on this signal shifts the phase of the output by 1 cycle of the input clock\n - This can be done at any time - [20:20] - read-write - - - PHASE - This delays the enable signal by up to 3 cycles of the input clock\n - This must be set before the clock is enabled to have any effect - [17:16] - read-write - - - ENABLE - Starts and stops the clock generator cleanly - [11:11] - read-write - - - KILL - Asynchronously kills the clock generator - [10:10] - read-write - - - AUXSRC - Selects the auxiliary clock source, will glitch when switching - [7:5] - read-write - - - clksrc_pll_usb - 0 - - - clksrc_pll_sys - 1 - - - rosc_clksrc_ph - 2 - - - xosc_clksrc - 3 - - - clksrc_gpin0 - 4 - - - clksrc_gpin1 - 5 - - - - - - - CLK_ADC_DIV - Clock divisor, can be changed on-the-fly - 0x64 - 0x00000100 - - - INT - Integer component of the divisor, 0 -> divide by 2^16 - [9:8] - read-write - - - - - CLK_ADC_SELECTED - Indicates which SRC is currently selected by the glitchless mux (one-hot).\n - This slice does not have a glitchless mux (only the AUX_SRC field is present, not SRC) so this register is hardwired to 0x1. - 0x68 - read-only - 0x00000001 - - - CLK_RTC_CTRL - Clock control, can be changed on-the-fly (except for auxsrc) - 0x6C - 0x00000000 - - - NUDGE - An edge on this signal shifts the phase of the output by 1 cycle of the input clock\n - This can be done at any time - [20:20] - read-write - - - PHASE - This delays the enable signal by up to 3 cycles of the input clock\n - This must be set before the clock is enabled to have any effect - [17:16] - read-write - - - ENABLE - Starts and stops the clock generator cleanly - [11:11] - read-write - - - KILL - Asynchronously kills the clock generator - [10:10] - read-write - - - AUXSRC - Selects the auxiliary clock source, will glitch when switching - [7:5] - read-write - - - clksrc_pll_usb - 0 - - - clksrc_pll_sys - 1 - - - rosc_clksrc_ph - 2 - - - xosc_clksrc - 3 - - - clksrc_gpin0 - 4 - - - clksrc_gpin1 - 5 - - - - - - - CLK_RTC_DIV - Clock divisor, can be changed on-the-fly - 0x70 - 0x00000100 - - - INT - Integer component of the divisor, 0 -> divide by 2^16 - [31:8] - read-write - - - FRAC - Fractional component of the divisor - [7:0] - read-write - - - - - CLK_RTC_SELECTED - Indicates which SRC is currently selected by the glitchless mux (one-hot).\n - This slice does not have a glitchless mux (only the AUX_SRC field is present, not SRC) so this register is hardwired to 0x1. - 0x74 - read-only - 0x00000001 - - - CLK_SYS_RESUS_CTRL - 0x78 - 0x000000FF - - - CLEAR - For clearing the resus after the fault that triggered it has been corrected - [16:16] - read-write - - - FRCE - Force a resus, for test purposes only - [12:12] - read-write - - - ENABLE - Enable resus - [8:8] - read-write - - - TIMEOUT - This is expressed as a number of clk_ref cycles\n - and must be >= 2x clk_ref_freq/min_clk_tst_freq - [7:0] - read-write - - - - - CLK_SYS_RESUS_STATUS - 0x7C - 0x00000000 - - - RESUSSED - Clock has been resuscitated, correct the error then send ctrl_clear=1 - [0:0] - read-only - - - - - FC0_REF_KHZ - Reference clock frequency in kHz - 0x80 - 0x00000000 - - - FC0_REF_KHZ - [19:0] - read-write - - - - - FC0_MIN_KHZ - Minimum pass frequency in kHz. This is optional. Set to 0 if you are not using the pass/fail flags - 0x84 - 0x00000000 - - - FC0_MIN_KHZ - [24:0] - read-write - - - - - FC0_MAX_KHZ - Maximum pass frequency in kHz. This is optional. Set to 0x1ffffff if you are not using the pass/fail flags - 0x88 - 0x01FFFFFF - - - FC0_MAX_KHZ - [24:0] - read-write - - - - - FC0_DELAY - Delays the start of frequency counting to allow the mux to settle\n - Delay is measured in multiples of the reference clock period - 0x8C - 0x00000001 - - - FC0_DELAY - [2:0] - read-write - - - - - FC0_INTERVAL - The test interval is 0.98us * 2**interval, but let's call it 1us * 2**interval\n - The default gives a test interval of 250us - 0x90 - 0x00000008 - - - FC0_INTERVAL - [3:0] - read-write - - - - - FC0_SRC - Clock sent to frequency counter, set to 0 when not required\n - Writing to this register initiates the frequency count - 0x94 - 0x00000000 - - - FC0_SRC - [7:0] - read-write - - - NULL - 0 - - - pll_sys_clksrc_primary - 1 - - - pll_usb_clksrc_primary - 2 - - - rosc_clksrc - 3 - - - rosc_clksrc_ph - 4 - - - xosc_clksrc - 5 - - - clksrc_gpin0 - 6 - - - clksrc_gpin1 - 7 - - - clk_ref - 8 - - - clk_sys - 9 - - - clk_peri - 10 - - - clk_usb - 11 - - - clk_adc - 12 - - - clk_rtc - 13 - - - - - - - FC0_STATUS - Frequency counter status - 0x98 - 0x00000000 - - - DIED - Test clock stopped during test - [28:28] - read-only - - - FAST - Test clock faster than expected, only valid when status_done=1 - [24:24] - read-only - - - SLOW - Test clock slower than expected, only valid when status_done=1 - [20:20] - read-only - - - FAIL - Test failed - [16:16] - read-only - - - WAITING - Waiting for test clock to start - [12:12] - read-only - - - RUNNING - Test running - [8:8] - read-only - - - DONE - Test complete - [4:4] - read-only - - - PASS - Test passed - [0:0] - read-only - - - - - FC0_RESULT - Result of frequency measurement, only valid when status_done=1 - 0x9C - 0x00000000 - - - KHZ - [29:5] - read-only - - - FRAC - [4:0] - read-only - - - - - WAKE_EN0 - enable clock in wake mode - 0xA0 - 0xFFFFFFFF - - - clk_sys_sram3 - [31:31] - read-write - - - clk_sys_sram2 - [30:30] - read-write - - - clk_sys_sram1 - [29:29] - read-write - - - clk_sys_sram0 - [28:28] - read-write - - - clk_sys_spi1 - [27:27] - read-write - - - clk_peri_spi1 - [26:26] - read-write - - - clk_sys_spi0 - [25:25] - read-write - - - clk_peri_spi0 - [24:24] - read-write - - - clk_sys_sio - [23:23] - read-write - - - clk_sys_rtc - [22:22] - read-write - - - clk_rtc_rtc - [21:21] - read-write - - - clk_sys_rosc - [20:20] - read-write - - - clk_sys_rom - [19:19] - read-write - - - clk_sys_resets - [18:18] - read-write - - - clk_sys_pwm - [17:17] - read-write - - - clk_sys_psm - [16:16] - read-write - - - clk_sys_pll_usb - [15:15] - read-write - - - clk_sys_pll_sys - [14:14] - read-write - - - clk_sys_pio1 - [13:13] - read-write - - - clk_sys_pio0 - [12:12] - read-write - - - clk_sys_pads - [11:11] - read-write - - - clk_sys_vreg_and_chip_reset - [10:10] - read-write - - - clk_sys_jtag - [9:9] - read-write - - - clk_sys_io - [8:8] - read-write - - - clk_sys_i2c1 - [7:7] - read-write - - - clk_sys_i2c0 - [6:6] - read-write - - - clk_sys_dma - [5:5] - read-write - - - clk_sys_busfabric - [4:4] - read-write - - - clk_sys_busctrl - [3:3] - read-write - - - clk_sys_adc - [2:2] - read-write - - - clk_adc_adc - [1:1] - read-write - - - clk_sys_clocks - [0:0] - read-write - - - - - WAKE_EN1 - enable clock in wake mode - 0xA4 - 0x00007FFF - - - clk_sys_xosc - [14:14] - read-write - - - clk_sys_xip - [13:13] - read-write - - - clk_sys_watchdog - [12:12] - read-write - - - clk_usb_usbctrl - [11:11] - read-write - - - clk_sys_usbctrl - [10:10] - read-write - - - clk_sys_uart1 - [9:9] - read-write - - - clk_peri_uart1 - [8:8] - read-write - - - clk_sys_uart0 - [7:7] - read-write - - - clk_peri_uart0 - [6:6] - read-write - - - clk_sys_timer - [5:5] - read-write - - - clk_sys_tbman - [4:4] - read-write - - - clk_sys_sysinfo - [3:3] - read-write - - - clk_sys_syscfg - [2:2] - read-write - - - clk_sys_sram5 - [1:1] - read-write - - - clk_sys_sram4 - [0:0] - read-write - - - - - SLEEP_EN0 - enable clock in sleep mode - 0xA8 - 0xFFFFFFFF - - - clk_sys_sram3 - [31:31] - read-write - - - clk_sys_sram2 - [30:30] - read-write - - - clk_sys_sram1 - [29:29] - read-write - - - clk_sys_sram0 - [28:28] - read-write - - - clk_sys_spi1 - [27:27] - read-write - - - clk_peri_spi1 - [26:26] - read-write - - - clk_sys_spi0 - [25:25] - read-write - - - clk_peri_spi0 - [24:24] - read-write - - - clk_sys_sio - [23:23] - read-write - - - clk_sys_rtc - [22:22] - read-write - - - clk_rtc_rtc - [21:21] - read-write - - - clk_sys_rosc - [20:20] - read-write - - - clk_sys_rom - [19:19] - read-write - - - clk_sys_resets - [18:18] - read-write - - - clk_sys_pwm - [17:17] - read-write - - - clk_sys_psm - [16:16] - read-write - - - clk_sys_pll_usb - [15:15] - read-write - - - clk_sys_pll_sys - [14:14] - read-write - - - clk_sys_pio1 - [13:13] - read-write - - - clk_sys_pio0 - [12:12] - read-write - - - clk_sys_pads - [11:11] - read-write - - - clk_sys_vreg_and_chip_reset - [10:10] - read-write - - - clk_sys_jtag - [9:9] - read-write - - - clk_sys_io - [8:8] - read-write - - - clk_sys_i2c1 - [7:7] - read-write - - - clk_sys_i2c0 - [6:6] - read-write - - - clk_sys_dma - [5:5] - read-write - - - clk_sys_busfabric - [4:4] - read-write - - - clk_sys_busctrl - [3:3] - read-write - - - clk_sys_adc - [2:2] - read-write - - - clk_adc_adc - [1:1] - read-write - - - clk_sys_clocks - [0:0] - read-write - - - - - SLEEP_EN1 - enable clock in sleep mode - 0xAC - 0x00007FFF - - - clk_sys_xosc - [14:14] - read-write - - - clk_sys_xip - [13:13] - read-write - - - clk_sys_watchdog - [12:12] - read-write - - - clk_usb_usbctrl - [11:11] - read-write - - - clk_sys_usbctrl - [10:10] - read-write - - - clk_sys_uart1 - [9:9] - read-write - - - clk_peri_uart1 - [8:8] - read-write - - - clk_sys_uart0 - [7:7] - read-write - - - clk_peri_uart0 - [6:6] - read-write - - - clk_sys_timer - [5:5] - read-write - - - clk_sys_tbman - [4:4] - read-write - - - clk_sys_sysinfo - [3:3] - read-write - - - clk_sys_syscfg - [2:2] - read-write - - - clk_sys_sram5 - [1:1] - read-write - - - clk_sys_sram4 - [0:0] - read-write - - - - - ENABLED0 - indicates the state of the clock enable - 0xB0 - 0x00000000 - - - clk_sys_sram3 - [31:31] - read-only - - - clk_sys_sram2 - [30:30] - read-only - - - clk_sys_sram1 - [29:29] - read-only - - - clk_sys_sram0 - [28:28] - read-only - - - clk_sys_spi1 - [27:27] - read-only - - - clk_peri_spi1 - [26:26] - read-only - - - clk_sys_spi0 - [25:25] - read-only - - - clk_peri_spi0 - [24:24] - read-only - - - clk_sys_sio - [23:23] - read-only - - - clk_sys_rtc - [22:22] - read-only - - - clk_rtc_rtc - [21:21] - read-only - - - clk_sys_rosc - [20:20] - read-only - - - clk_sys_rom - [19:19] - read-only - - - clk_sys_resets - [18:18] - read-only - - - clk_sys_pwm - [17:17] - read-only - - - clk_sys_psm - [16:16] - read-only - - - clk_sys_pll_usb - [15:15] - read-only - - - clk_sys_pll_sys - [14:14] - read-only - - - clk_sys_pio1 - [13:13] - read-only - - - clk_sys_pio0 - [12:12] - read-only - - - clk_sys_pads - [11:11] - read-only - - - clk_sys_vreg_and_chip_reset - [10:10] - read-only - - - clk_sys_jtag - [9:9] - read-only - - - clk_sys_io - [8:8] - read-only - - - clk_sys_i2c1 - [7:7] - read-only - - - clk_sys_i2c0 - [6:6] - read-only - - - clk_sys_dma - [5:5] - read-only - - - clk_sys_busfabric - [4:4] - read-only - - - clk_sys_busctrl - [3:3] - read-only - - - clk_sys_adc - [2:2] - read-only - - - clk_adc_adc - [1:1] - read-only - - - clk_sys_clocks - [0:0] - read-only - - - - - ENABLED1 - indicates the state of the clock enable - 0xB4 - 0x00000000 - - - clk_sys_xosc - [14:14] - read-only - - - clk_sys_xip - [13:13] - read-only - - - clk_sys_watchdog - [12:12] - read-only - - - clk_usb_usbctrl - [11:11] - read-only - - - clk_sys_usbctrl - [10:10] - read-only - - - clk_sys_uart1 - [9:9] - read-only - - - clk_peri_uart1 - [8:8] - read-only - - - clk_sys_uart0 - [7:7] - read-only - - - clk_peri_uart0 - [6:6] - read-only - - - clk_sys_timer - [5:5] - read-only - - - clk_sys_tbman - [4:4] - read-only - - - clk_sys_sysinfo - [3:3] - read-only - - - clk_sys_syscfg - [2:2] - read-only - - - clk_sys_sram5 - [1:1] - read-only - - - clk_sys_sram4 - [0:0] - read-only - - - - - INTR - Raw Interrupts - 0xB8 - 0x00000000 - - - CLK_SYS_RESUS - [0:0] - read-only - - - - - INTE - Interrupt Enable - 0xBC - 0x00000000 - - - CLK_SYS_RESUS - [0:0] - read-write - - - - - INTF - Interrupt Force - 0xC0 - 0x00000000 - - - CLK_SYS_RESUS - [0:0] - read-write - - - - - INTS - Interrupt status after masking & forcing - 0xC4 - 0x00000000 - - - CLK_SYS_RESUS - [0:0] - read-only - - - - - - - RESETS - 1 - 0x4000C000 - 0x20 - - 0x0 - 0x1000 - registers - - - - RESET - Reset control. If a bit is set it means the peripheral is in reset. 0 means the peripheral's reset is deasserted. - 0x0 - 0x01FFFFFF - - - usbctrl - [24:24] - read-write - - - uart1 - [23:23] - read-write - - - uart0 - [22:22] - read-write - - - timer - [21:21] - read-write - - - tbman - [20:20] - read-write - - - sysinfo - [19:19] - read-write - - - syscfg - [18:18] - read-write - - - spi1 - [17:17] - read-write - - - spi0 - [16:16] - read-write - - - rtc - [15:15] - read-write - - - pwm - [14:14] - read-write - - - pll_usb - [13:13] - read-write - - - pll_sys - [12:12] - read-write - - - pio1 - [11:11] - read-write - - - pio0 - [10:10] - read-write - - - pads_qspi - [9:9] - read-write - - - pads_bank0 - [8:8] - read-write - - - jtag - [7:7] - read-write - - - io_qspi - [6:6] - read-write - - - io_bank0 - [5:5] - read-write - - - i2c1 - [4:4] - read-write - - - i2c0 - [3:3] - read-write - - - dma - [2:2] - read-write - - - busctrl - [1:1] - read-write - - - adc - [0:0] - read-write - - - - - WDSEL - Watchdog select. If a bit is set then the watchdog will reset this peripheral when the watchdog fires. - 0x4 - 0x00000000 - - - usbctrl - [24:24] - read-write - - - uart1 - [23:23] - read-write - - - uart0 - [22:22] - read-write - - - timer - [21:21] - read-write - - - tbman - [20:20] - read-write - - - sysinfo - [19:19] - read-write - - - syscfg - [18:18] - read-write - - - spi1 - [17:17] - read-write - - - spi0 - [16:16] - read-write - - - rtc - [15:15] - read-write - - - pwm - [14:14] - read-write - - - pll_usb - [13:13] - read-write - - - pll_sys - [12:12] - read-write - - - pio1 - [11:11] - read-write - - - pio0 - [10:10] - read-write - - - pads_qspi - [9:9] - read-write - - - pads_bank0 - [8:8] - read-write - - - jtag - [7:7] - read-write - - - io_qspi - [6:6] - read-write - - - io_bank0 - [5:5] - read-write - - - i2c1 - [4:4] - read-write - - - i2c0 - [3:3] - read-write - - - dma - [2:2] - read-write - - - busctrl - [1:1] - read-write - - - adc - [0:0] - read-write - - - - - RESET_DONE - Reset done. If a bit is set then a reset done signal has been returned by the peripheral. This indicates that the peripheral's registers are ready to be accessed. - 0x8 - 0x00000000 - - - usbctrl - [24:24] - read-only - - - uart1 - [23:23] - read-only - - - uart0 - [22:22] - read-only - - - timer - [21:21] - read-only - - - tbman - [20:20] - read-only - - - sysinfo - [19:19] - read-only - - - syscfg - [18:18] - read-only - - - spi1 - [17:17] - read-only - - - spi0 - [16:16] - read-only - - - rtc - [15:15] - read-only - - - pwm - [14:14] - read-only - - - pll_usb - [13:13] - read-only - - - pll_sys - [12:12] - read-only - - - pio1 - [11:11] - read-only - - - pio0 - [10:10] - read-only - - - pads_qspi - [9:9] - read-only - - - pads_bank0 - [8:8] - read-only - - - jtag - [7:7] - read-only - - - io_qspi - [6:6] - read-only - - - io_bank0 - [5:5] - read-only - - - i2c1 - [4:4] - read-only - - - i2c0 - [3:3] - read-only - - - dma - [2:2] - read-only - - - busctrl - [1:1] - read-only - - - adc - [0:0] - read-only - - - - - - - PSM - 1 - 0x40010000 - 0x20 - - 0x0 - 0x1000 - registers - - - - FRCE_ON - Force block out of reset (i.e. power it on) - 0x0 - 0x00000000 - - - proc1 - [16:16] - read-write - - - proc0 - [15:15] - read-write - - - sio - [14:14] - read-write - - - vreg_and_chip_reset - [13:13] - read-write - - - xip - [12:12] - read-write - - - sram5 - [11:11] - read-write - - - sram4 - [10:10] - read-write - - - sram3 - [9:9] - read-write - - - sram2 - [8:8] - read-write - - - sram1 - [7:7] - read-write - - - sram0 - [6:6] - read-write - - - rom - [5:5] - read-write - - - busfabric - [4:4] - read-write - - - resets - [3:3] - read-write - - - clocks - [2:2] - read-write - - - xosc - [1:1] - read-write - - - rosc - [0:0] - read-write - - - - - FRCE_OFF - Force into reset (i.e. power it off) - 0x4 - 0x00000000 - - - proc1 - [16:16] - read-write - - - proc0 - [15:15] - read-write - - - sio - [14:14] - read-write - - - vreg_and_chip_reset - [13:13] - read-write - - - xip - [12:12] - read-write - - - sram5 - [11:11] - read-write - - - sram4 - [10:10] - read-write - - - sram3 - [9:9] - read-write - - - sram2 - [8:8] - read-write - - - sram1 - [7:7] - read-write - - - sram0 - [6:6] - read-write - - - rom - [5:5] - read-write - - - busfabric - [4:4] - read-write - - - resets - [3:3] - read-write - - - clocks - [2:2] - read-write - - - xosc - [1:1] - read-write - - - rosc - [0:0] - read-write - - - - - WDSEL - Set to 1 if this peripheral should be reset when the watchdog fires. - 0x8 - 0x00000000 - - - proc1 - [16:16] - read-write - - - proc0 - [15:15] - read-write - - - sio - [14:14] - read-write - - - vreg_and_chip_reset - [13:13] - read-write - - - xip - [12:12] - read-write - - - sram5 - [11:11] - read-write - - - sram4 - [10:10] - read-write - - - sram3 - [9:9] - read-write - - - sram2 - [8:8] - read-write - - - sram1 - [7:7] - read-write - - - sram0 - [6:6] - read-write - - - rom - [5:5] - read-write - - - busfabric - [4:4] - read-write - - - resets - [3:3] - read-write - - - clocks - [2:2] - read-write - - - xosc - [1:1] - read-write - - - rosc - [0:0] - read-write - - - - - DONE - Indicates the peripheral's registers are ready to access. - 0xC - 0x00000000 - - - proc1 - [16:16] - read-only - - - proc0 - [15:15] - read-only - - - sio - [14:14] - read-only - - - vreg_and_chip_reset - [13:13] - read-only - - - xip - [12:12] - read-only - - - sram5 - [11:11] - read-only - - - sram4 - [10:10] - read-only - - - sram3 - [9:9] - read-only - - - sram2 - [8:8] - read-only - - - sram1 - [7:7] - read-only - - - sram0 - [6:6] - read-only - - - rom - [5:5] - read-only - - - busfabric - [4:4] - read-only - - - resets - [3:3] - read-only - - - clocks - [2:2] - read-only - - - xosc - [1:1] - read-only - - - rosc - [0:0] - read-only - - - - - - - IO_BANK0 - 1 - 0x40014000 - 0x20 - - 0x0 - 0x1000 - registers - - - IO_IRQ_BANK0 - 13 - - - - 30 - 0x8 - 0-29 - GPIO%s - Cluster GPIO%s, containing GPIO*_STATUS, GPIO*_CTRL - 0x0 - - GPIO_STATUS - GPIO status - 0x0 - 0x00000000 - - - IRQTOPROC - interrupt to processors, after override is applied - [26:26] - read-only - - - IRQFROMPAD - interrupt from pad before override is applied - [24:24] - read-only - - - INTOPERI - input signal to peripheral, after override is applied - [19:19] - read-only - - - INFROMPAD - input signal from pad, before override is applied - [17:17] - read-only - - - OETOPAD - output enable to pad after register override is applied - [13:13] - read-only - - - OEFROMPERI - output enable from selected peripheral, before register override is applied - [12:12] - read-only - - - OUTTOPAD - output signal to pad after register override is applied - [9:9] - read-only - - - OUTFROMPERI - output signal from selected peripheral, before register override is applied - [8:8] - read-only - - - - - GPIO_CTRL - GPIO control including function select and overrides. - 0x4 - 0x0000001F - - - IRQOVER - [29:28] - read-write - - - NORMAL - don't invert the interrupt - 0 - - - INVERT - invert the interrupt - 1 - - - LOW - drive interrupt low - 2 - - - HIGH - drive interrupt high - 3 - - - - - INOVER - [17:16] - read-write - - - NORMAL - don't invert the peri input - 0 - - - INVERT - invert the peri input - 1 - - - LOW - drive peri input low - 2 - - - HIGH - drive peri input high - 3 - - - - - OEOVER - [13:12] - read-write - - - NORMAL - drive output enable from peripheral signal selected by funcsel - 0 - - - INVERT - drive output enable from inverse of peripheral signal selected by funcsel - 1 - - - DISABLE - disable output - 2 - - - ENABLE - enable output - 3 - - - - - OUTOVER - [9:8] - read-write - - - NORMAL - drive output from peripheral signal selected by funcsel - 0 - - - INVERT - drive output from inverse of peripheral signal selected by funcsel - 1 - - - LOW - drive output low - 2 - - - HIGH - drive output high - 3 - - - - - FUNCSEL - 0-31 -> selects pin function according to the GPIO table. Not all options are valid for all GPIO pins. - [4:0] - read-write - - FUNCSEL - - jtag - Connect to JTAG peripheral - 0 - - - spi - Connect to matching SPI peripheral - 1 - - - uart - Connect to matching UART peripheral - 2 - - - i2c - Connect to matching I2C peripheral - 3 - - - pwm - Connect to matching PWM peripheral - 4 - - - sio - Use as a GPIO pin (connect to SIO peripheral) - 5 - - - pio0 - Connect to PIO0 peripheral - 6 - - - pio1 - Connect to PIO1 peripheral - 7 - - - clock - Connect to Clock peripheral - 8 - - - usb - Connect to USB peripheral - 9 - - - null - Connect to nothing - 31 - - - - - - - - 4 - 0x4 - 0-3 - INTR%s - Raw Interrupts - 0xF0 - 0x00000000 - - - GPIO7_EDGE_HIGH - [31:31] - read-write - oneToClear - - - GPIO7_EDGE_LOW - [30:30] - read-write - oneToClear - - - GPIO7_LEVEL_HIGH - [29:29] - read-only - - - GPIO7_LEVEL_LOW - [28:28] - read-only - - - GPIO6_EDGE_HIGH - [27:27] - read-write - oneToClear - - - GPIO6_EDGE_LOW - [26:26] - read-write - oneToClear - - - GPIO6_LEVEL_HIGH - [25:25] - read-only - - - GPIO6_LEVEL_LOW - [24:24] - read-only - - - GPIO5_EDGE_HIGH - [23:23] - read-write - oneToClear - - - GPIO5_EDGE_LOW - [22:22] - read-write - oneToClear - - - GPIO5_LEVEL_HIGH - [21:21] - read-only - - - GPIO5_LEVEL_LOW - [20:20] - read-only - - - GPIO4_EDGE_HIGH - [19:19] - read-write - oneToClear - - - GPIO4_EDGE_LOW - [18:18] - read-write - oneToClear - - - GPIO4_LEVEL_HIGH - [17:17] - read-only - - - GPIO4_LEVEL_LOW - [16:16] - read-only - - - GPIO3_EDGE_HIGH - [15:15] - read-write - oneToClear - - - GPIO3_EDGE_LOW - [14:14] - read-write - oneToClear - - - GPIO3_LEVEL_HIGH - [13:13] - read-only - - - GPIO3_LEVEL_LOW - [12:12] - read-only - - - GPIO2_EDGE_HIGH - [11:11] - read-write - oneToClear - - - GPIO2_EDGE_LOW - [10:10] - read-write - oneToClear - - - GPIO2_LEVEL_HIGH - [9:9] - read-only - - - GPIO2_LEVEL_LOW - [8:8] - read-only - - - GPIO1_EDGE_HIGH - [7:7] - read-write - oneToClear - - - GPIO1_EDGE_LOW - [6:6] - read-write - oneToClear - - - GPIO1_LEVEL_HIGH - [5:5] - read-only - - - GPIO1_LEVEL_LOW - [4:4] - read-only - - - GPIO0_EDGE_HIGH - [3:3] - read-write - oneToClear - - - GPIO0_EDGE_LOW - [2:2] - read-write - oneToClear - - - GPIO0_LEVEL_HIGH - [1:1] - read-only - - - GPIO0_LEVEL_LOW - [0:0] - read-only - - - - - 4 - 0x4 - 0-3 - PROC0_INTE%s - Interrupt Enable for proc0 - 0x100 - 0x00000000 - - - GPIO7_EDGE_HIGH - [31:31] - read-write - - - GPIO7_EDGE_LOW - [30:30] - read-write - - - GPIO7_LEVEL_HIGH - [29:29] - read-write - - - GPIO7_LEVEL_LOW - [28:28] - read-write - - - GPIO6_EDGE_HIGH - [27:27] - read-write - - - GPIO6_EDGE_LOW - [26:26] - read-write - - - GPIO6_LEVEL_HIGH - [25:25] - read-write - - - GPIO6_LEVEL_LOW - [24:24] - read-write - - - GPIO5_EDGE_HIGH - [23:23] - read-write - - - GPIO5_EDGE_LOW - [22:22] - read-write - - - GPIO5_LEVEL_HIGH - [21:21] - read-write - - - GPIO5_LEVEL_LOW - [20:20] - read-write - - - GPIO4_EDGE_HIGH - [19:19] - read-write - - - GPIO4_EDGE_LOW - [18:18] - read-write - - - GPIO4_LEVEL_HIGH - [17:17] - read-write - - - GPIO4_LEVEL_LOW - [16:16] - read-write - - - GPIO3_EDGE_HIGH - [15:15] - read-write - - - GPIO3_EDGE_LOW - [14:14] - read-write - - - GPIO3_LEVEL_HIGH - [13:13] - read-write - - - GPIO3_LEVEL_LOW - [12:12] - read-write - - - GPIO2_EDGE_HIGH - [11:11] - read-write - - - GPIO2_EDGE_LOW - [10:10] - read-write - - - GPIO2_LEVEL_HIGH - [9:9] - read-write - - - GPIO2_LEVEL_LOW - [8:8] - read-write - - - GPIO1_EDGE_HIGH - [7:7] - read-write - - - GPIO1_EDGE_LOW - [6:6] - read-write - - - GPIO1_LEVEL_HIGH - [5:5] - read-write - - - GPIO1_LEVEL_LOW - [4:4] - read-write - - - GPIO0_EDGE_HIGH - [3:3] - read-write - - - GPIO0_EDGE_LOW - [2:2] - read-write - - - GPIO0_LEVEL_HIGH - [1:1] - read-write - - - GPIO0_LEVEL_LOW - [0:0] - read-write - - - - - 4 - 0x4 - 0-3 - PROC0_INTF%s - Interrupt Force for proc0 - 0x110 - 0x00000000 - - - GPIO7_EDGE_HIGH - [31:31] - read-write - - - GPIO7_EDGE_LOW - [30:30] - read-write - - - GPIO7_LEVEL_HIGH - [29:29] - read-write - - - GPIO7_LEVEL_LOW - [28:28] - read-write - - - GPIO6_EDGE_HIGH - [27:27] - read-write - - - GPIO6_EDGE_LOW - [26:26] - read-write - - - GPIO6_LEVEL_HIGH - [25:25] - read-write - - - GPIO6_LEVEL_LOW - [24:24] - read-write - - - GPIO5_EDGE_HIGH - [23:23] - read-write - - - GPIO5_EDGE_LOW - [22:22] - read-write - - - GPIO5_LEVEL_HIGH - [21:21] - read-write - - - GPIO5_LEVEL_LOW - [20:20] - read-write - - - GPIO4_EDGE_HIGH - [19:19] - read-write - - - GPIO4_EDGE_LOW - [18:18] - read-write - - - GPIO4_LEVEL_HIGH - [17:17] - read-write - - - GPIO4_LEVEL_LOW - [16:16] - read-write - - - GPIO3_EDGE_HIGH - [15:15] - read-write - - - GPIO3_EDGE_LOW - [14:14] - read-write - - - GPIO3_LEVEL_HIGH - [13:13] - read-write - - - GPIO3_LEVEL_LOW - [12:12] - read-write - - - GPIO2_EDGE_HIGH - [11:11] - read-write - - - GPIO2_EDGE_LOW - [10:10] - read-write - - - GPIO2_LEVEL_HIGH - [9:9] - read-write - - - GPIO2_LEVEL_LOW - [8:8] - read-write - - - GPIO1_EDGE_HIGH - [7:7] - read-write - - - GPIO1_EDGE_LOW - [6:6] - read-write - - - GPIO1_LEVEL_HIGH - [5:5] - read-write - - - GPIO1_LEVEL_LOW - [4:4] - read-write - - - GPIO0_EDGE_HIGH - [3:3] - read-write - - - GPIO0_EDGE_LOW - [2:2] - read-write - - - GPIO0_LEVEL_HIGH - [1:1] - read-write - - - GPIO0_LEVEL_LOW - [0:0] - read-write - - - - - 4 - 0x4 - 0-3 - PROC0_INTS%s - Interrupt status after masking & forcing for proc0 - 0x120 - 0x00000000 - - - GPIO7_EDGE_HIGH - [31:31] - read-only - - - GPIO7_EDGE_LOW - [30:30] - read-only - - - GPIO7_LEVEL_HIGH - [29:29] - read-only - - - GPIO7_LEVEL_LOW - [28:28] - read-only - - - GPIO6_EDGE_HIGH - [27:27] - read-only - - - GPIO6_EDGE_LOW - [26:26] - read-only - - - GPIO6_LEVEL_HIGH - [25:25] - read-only - - - GPIO6_LEVEL_LOW - [24:24] - read-only - - - GPIO5_EDGE_HIGH - [23:23] - read-only - - - GPIO5_EDGE_LOW - [22:22] - read-only - - - GPIO5_LEVEL_HIGH - [21:21] - read-only - - - GPIO5_LEVEL_LOW - [20:20] - read-only - - - GPIO4_EDGE_HIGH - [19:19] - read-only - - - GPIO4_EDGE_LOW - [18:18] - read-only - - - GPIO4_LEVEL_HIGH - [17:17] - read-only - - - GPIO4_LEVEL_LOW - [16:16] - read-only - - - GPIO3_EDGE_HIGH - [15:15] - read-only - - - GPIO3_EDGE_LOW - [14:14] - read-only - - - GPIO3_LEVEL_HIGH - [13:13] - read-only - - - GPIO3_LEVEL_LOW - [12:12] - read-only - - - GPIO2_EDGE_HIGH - [11:11] - read-only - - - GPIO2_EDGE_LOW - [10:10] - read-only - - - GPIO2_LEVEL_HIGH - [9:9] - read-only - - - GPIO2_LEVEL_LOW - [8:8] - read-only - - - GPIO1_EDGE_HIGH - [7:7] - read-only - - - GPIO1_EDGE_LOW - [6:6] - read-only - - - GPIO1_LEVEL_HIGH - [5:5] - read-only - - - GPIO1_LEVEL_LOW - [4:4] - read-only - - - GPIO0_EDGE_HIGH - [3:3] - read-only - - - GPIO0_EDGE_LOW - [2:2] - read-only - - - GPIO0_LEVEL_HIGH - [1:1] - read-only - - - GPIO0_LEVEL_LOW - [0:0] - read-only - - - - - 4 - 0x4 - 0-3 - PROC1_INTE%s - Interrupt Enable for proc1 - 0x130 - 0x00000000 - - - GPIO7_EDGE_HIGH - [31:31] - read-write - - - GPIO7_EDGE_LOW - [30:30] - read-write - - - GPIO7_LEVEL_HIGH - [29:29] - read-write - - - GPIO7_LEVEL_LOW - [28:28] - read-write - - - GPIO6_EDGE_HIGH - [27:27] - read-write - - - GPIO6_EDGE_LOW - [26:26] - read-write - - - GPIO6_LEVEL_HIGH - [25:25] - read-write - - - GPIO6_LEVEL_LOW - [24:24] - read-write - - - GPIO5_EDGE_HIGH - [23:23] - read-write - - - GPIO5_EDGE_LOW - [22:22] - read-write - - - GPIO5_LEVEL_HIGH - [21:21] - read-write - - - GPIO5_LEVEL_LOW - [20:20] - read-write - - - GPIO4_EDGE_HIGH - [19:19] - read-write - - - GPIO4_EDGE_LOW - [18:18] - read-write - - - GPIO4_LEVEL_HIGH - [17:17] - read-write - - - GPIO4_LEVEL_LOW - [16:16] - read-write - - - GPIO3_EDGE_HIGH - [15:15] - read-write - - - GPIO3_EDGE_LOW - [14:14] - read-write - - - GPIO3_LEVEL_HIGH - [13:13] - read-write - - - GPIO3_LEVEL_LOW - [12:12] - read-write - - - GPIO2_EDGE_HIGH - [11:11] - read-write - - - GPIO2_EDGE_LOW - [10:10] - read-write - - - GPIO2_LEVEL_HIGH - [9:9] - read-write - - - GPIO2_LEVEL_LOW - [8:8] - read-write - - - GPIO1_EDGE_HIGH - [7:7] - read-write - - - GPIO1_EDGE_LOW - [6:6] - read-write - - - GPIO1_LEVEL_HIGH - [5:5] - read-write - - - GPIO1_LEVEL_LOW - [4:4] - read-write - - - GPIO0_EDGE_HIGH - [3:3] - read-write - - - GPIO0_EDGE_LOW - [2:2] - read-write - - - GPIO0_LEVEL_HIGH - [1:1] - read-write - - - GPIO0_LEVEL_LOW - [0:0] - read-write - - - - - 4 - 0x4 - 0-3 - PROC1_INTF%s - Interrupt Force for proc1 - 0x140 - 0x00000000 - - - GPIO7_EDGE_HIGH - [31:31] - read-write - - - GPIO7_EDGE_LOW - [30:30] - read-write - - - GPIO7_LEVEL_HIGH - [29:29] - read-write - - - GPIO7_LEVEL_LOW - [28:28] - read-write - - - GPIO6_EDGE_HIGH - [27:27] - read-write - - - GPIO6_EDGE_LOW - [26:26] - read-write - - - GPIO6_LEVEL_HIGH - [25:25] - read-write - - - GPIO6_LEVEL_LOW - [24:24] - read-write - - - GPIO5_EDGE_HIGH - [23:23] - read-write - - - GPIO5_EDGE_LOW - [22:22] - read-write - - - GPIO5_LEVEL_HIGH - [21:21] - read-write - - - GPIO5_LEVEL_LOW - [20:20] - read-write - - - GPIO4_EDGE_HIGH - [19:19] - read-write - - - GPIO4_EDGE_LOW - [18:18] - read-write - - - GPIO4_LEVEL_HIGH - [17:17] - read-write - - - GPIO4_LEVEL_LOW - [16:16] - read-write - - - GPIO3_EDGE_HIGH - [15:15] - read-write - - - GPIO3_EDGE_LOW - [14:14] - read-write - - - GPIO3_LEVEL_HIGH - [13:13] - read-write - - - GPIO3_LEVEL_LOW - [12:12] - read-write - - - GPIO2_EDGE_HIGH - [11:11] - read-write - - - GPIO2_EDGE_LOW - [10:10] - read-write - - - GPIO2_LEVEL_HIGH - [9:9] - read-write - - - GPIO2_LEVEL_LOW - [8:8] - read-write - - - GPIO1_EDGE_HIGH - [7:7] - read-write - - - GPIO1_EDGE_LOW - [6:6] - read-write - - - GPIO1_LEVEL_HIGH - [5:5] - read-write - - - GPIO1_LEVEL_LOW - [4:4] - read-write - - - GPIO0_EDGE_HIGH - [3:3] - read-write - - - GPIO0_EDGE_LOW - [2:2] - read-write - - - GPIO0_LEVEL_HIGH - [1:1] - read-write - - - GPIO0_LEVEL_LOW - [0:0] - read-write - - - - - 4 - 0x4 - 0-3 - PROC1_INTS%s - Interrupt status after masking & forcing for proc1 - 0x150 - 0x00000000 - - - GPIO7_EDGE_HIGH - [31:31] - read-only - - - GPIO7_EDGE_LOW - [30:30] - read-only - - - GPIO7_LEVEL_HIGH - [29:29] - read-only - - - GPIO7_LEVEL_LOW - [28:28] - read-only - - - GPIO6_EDGE_HIGH - [27:27] - read-only - - - GPIO6_EDGE_LOW - [26:26] - read-only - - - GPIO6_LEVEL_HIGH - [25:25] - read-only - - - GPIO6_LEVEL_LOW - [24:24] - read-only - - - GPIO5_EDGE_HIGH - [23:23] - read-only - - - GPIO5_EDGE_LOW - [22:22] - read-only - - - GPIO5_LEVEL_HIGH - [21:21] - read-only - - - GPIO5_LEVEL_LOW - [20:20] - read-only - - - GPIO4_EDGE_HIGH - [19:19] - read-only - - - GPIO4_EDGE_LOW - [18:18] - read-only - - - GPIO4_LEVEL_HIGH - [17:17] - read-only - - - GPIO4_LEVEL_LOW - [16:16] - read-only - - - GPIO3_EDGE_HIGH - [15:15] - read-only - - - GPIO3_EDGE_LOW - [14:14] - read-only - - - GPIO3_LEVEL_HIGH - [13:13] - read-only - - - GPIO3_LEVEL_LOW - [12:12] - read-only - - - GPIO2_EDGE_HIGH - [11:11] - read-only - - - GPIO2_EDGE_LOW - [10:10] - read-only - - - GPIO2_LEVEL_HIGH - [9:9] - read-only - - - GPIO2_LEVEL_LOW - [8:8] - read-only - - - GPIO1_EDGE_HIGH - [7:7] - read-only - - - GPIO1_EDGE_LOW - [6:6] - read-only - - - GPIO1_LEVEL_HIGH - [5:5] - read-only - - - GPIO1_LEVEL_LOW - [4:4] - read-only - - - GPIO0_EDGE_HIGH - [3:3] - read-only - - - GPIO0_EDGE_LOW - [2:2] - read-only - - - GPIO0_LEVEL_HIGH - [1:1] - read-only - - - GPIO0_LEVEL_LOW - [0:0] - read-only - - - - - 4 - 0x4 - 0-3 - DORMANT_WAKE_INTE%s - Interrupt Enable for dormant_wake - 0x160 - 0x00000000 - - - GPIO7_EDGE_HIGH - [31:31] - read-write - - - GPIO7_EDGE_LOW - [30:30] - read-write - - - GPIO7_LEVEL_HIGH - [29:29] - read-write - - - GPIO7_LEVEL_LOW - [28:28] - read-write - - - GPIO6_EDGE_HIGH - [27:27] - read-write - - - GPIO6_EDGE_LOW - [26:26] - read-write - - - GPIO6_LEVEL_HIGH - [25:25] - read-write - - - GPIO6_LEVEL_LOW - [24:24] - read-write - - - GPIO5_EDGE_HIGH - [23:23] - read-write - - - GPIO5_EDGE_LOW - [22:22] - read-write - - - GPIO5_LEVEL_HIGH - [21:21] - read-write - - - GPIO5_LEVEL_LOW - [20:20] - read-write - - - GPIO4_EDGE_HIGH - [19:19] - read-write - - - GPIO4_EDGE_LOW - [18:18] - read-write - - - GPIO4_LEVEL_HIGH - [17:17] - read-write - - - GPIO4_LEVEL_LOW - [16:16] - read-write - - - GPIO3_EDGE_HIGH - [15:15] - read-write - - - GPIO3_EDGE_LOW - [14:14] - read-write - - - GPIO3_LEVEL_HIGH - [13:13] - read-write - - - GPIO3_LEVEL_LOW - [12:12] - read-write - - - GPIO2_EDGE_HIGH - [11:11] - read-write - - - GPIO2_EDGE_LOW - [10:10] - read-write - - - GPIO2_LEVEL_HIGH - [9:9] - read-write - - - GPIO2_LEVEL_LOW - [8:8] - read-write - - - GPIO1_EDGE_HIGH - [7:7] - read-write - - - GPIO1_EDGE_LOW - [6:6] - read-write - - - GPIO1_LEVEL_HIGH - [5:5] - read-write - - - GPIO1_LEVEL_LOW - [4:4] - read-write - - - GPIO0_EDGE_HIGH - [3:3] - read-write - - - GPIO0_EDGE_LOW - [2:2] - read-write - - - GPIO0_LEVEL_HIGH - [1:1] - read-write - - - GPIO0_LEVEL_LOW - [0:0] - read-write - - - - - 4 - 0x4 - 0-3 - DORMANT_WAKE_INTF%s - Interrupt Force for dormant_wake - 0x170 - 0x00000000 - - - GPIO7_EDGE_HIGH - [31:31] - read-write - - - GPIO7_EDGE_LOW - [30:30] - read-write - - - GPIO7_LEVEL_HIGH - [29:29] - read-write - - - GPIO7_LEVEL_LOW - [28:28] - read-write - - - GPIO6_EDGE_HIGH - [27:27] - read-write - - - GPIO6_EDGE_LOW - [26:26] - read-write - - - GPIO6_LEVEL_HIGH - [25:25] - read-write - - - GPIO6_LEVEL_LOW - [24:24] - read-write - - - GPIO5_EDGE_HIGH - [23:23] - read-write - - - GPIO5_EDGE_LOW - [22:22] - read-write - - - GPIO5_LEVEL_HIGH - [21:21] - read-write - - - GPIO5_LEVEL_LOW - [20:20] - read-write - - - GPIO4_EDGE_HIGH - [19:19] - read-write - - - GPIO4_EDGE_LOW - [18:18] - read-write - - - GPIO4_LEVEL_HIGH - [17:17] - read-write - - - GPIO4_LEVEL_LOW - [16:16] - read-write - - - GPIO3_EDGE_HIGH - [15:15] - read-write - - - GPIO3_EDGE_LOW - [14:14] - read-write - - - GPIO3_LEVEL_HIGH - [13:13] - read-write - - - GPIO3_LEVEL_LOW - [12:12] - read-write - - - GPIO2_EDGE_HIGH - [11:11] - read-write - - - GPIO2_EDGE_LOW - [10:10] - read-write - - - GPIO2_LEVEL_HIGH - [9:9] - read-write - - - GPIO2_LEVEL_LOW - [8:8] - read-write - - - GPIO1_EDGE_HIGH - [7:7] - read-write - - - GPIO1_EDGE_LOW - [6:6] - read-write - - - GPIO1_LEVEL_HIGH - [5:5] - read-write - - - GPIO1_LEVEL_LOW - [4:4] - read-write - - - GPIO0_EDGE_HIGH - [3:3] - read-write - - - GPIO0_EDGE_LOW - [2:2] - read-write - - - GPIO0_LEVEL_HIGH - [1:1] - read-write - - - GPIO0_LEVEL_LOW - [0:0] - read-write - - - - - 4 - 0x4 - 0-3 - DORMANT_WAKE_INTS%s - Interrupt status after masking & forcing for dormant_wake - 0x180 - 0x00000000 - - - GPIO7_EDGE_HIGH - [31:31] - read-only - - - GPIO7_EDGE_LOW - [30:30] - read-only - - - GPIO7_LEVEL_HIGH - [29:29] - read-only - - - GPIO7_LEVEL_LOW - [28:28] - read-only - - - GPIO6_EDGE_HIGH - [27:27] - read-only - - - GPIO6_EDGE_LOW - [26:26] - read-only - - - GPIO6_LEVEL_HIGH - [25:25] - read-only - - - GPIO6_LEVEL_LOW - [24:24] - read-only - - - GPIO5_EDGE_HIGH - [23:23] - read-only - - - GPIO5_EDGE_LOW - [22:22] - read-only - - - GPIO5_LEVEL_HIGH - [21:21] - read-only - - - GPIO5_LEVEL_LOW - [20:20] - read-only - - - GPIO4_EDGE_HIGH - [19:19] - read-only - - - GPIO4_EDGE_LOW - [18:18] - read-only - - - GPIO4_LEVEL_HIGH - [17:17] - read-only - - - GPIO4_LEVEL_LOW - [16:16] - read-only - - - GPIO3_EDGE_HIGH - [15:15] - read-only - - - GPIO3_EDGE_LOW - [14:14] - read-only - - - GPIO3_LEVEL_HIGH - [13:13] - read-only - - - GPIO3_LEVEL_LOW - [12:12] - read-only - - - GPIO2_EDGE_HIGH - [11:11] - read-only - - - GPIO2_EDGE_LOW - [10:10] - read-only - - - GPIO2_LEVEL_HIGH - [9:9] - read-only - - - GPIO2_LEVEL_LOW - [8:8] - read-only - - - GPIO1_EDGE_HIGH - [7:7] - read-only - - - GPIO1_EDGE_LOW - [6:6] - read-only - - - GPIO1_LEVEL_HIGH - [5:5] - read-only - - - GPIO1_LEVEL_LOW - [4:4] - read-only - - - GPIO0_EDGE_HIGH - [3:3] - read-only - - - GPIO0_EDGE_LOW - [2:2] - read-only - - - GPIO0_LEVEL_HIGH - [1:1] - read-only - - - GPIO0_LEVEL_LOW - [0:0] - read-only - - - - - - - IO_QSPI - 1 - 0x40018000 - 0x20 - - 0x0 - 0x1000 - registers - - - IO_IRQ_QSPI - 14 - - - - 6 - 0x8 - SCLK,SS,SD0,SD1,SD2,SD3 - GPIO_QSPI%s - Cluster GPIO_QSPI%s, containing GPIO_QSPI_*_STATUS, GPIO_QSPI_*_CTRL - 0x0 - - GPIO_STATUS - GPIO status - 0x0 - 0x00000000 - - - IRQTOPROC - interrupt to processors, after override is applied - [26:26] - read-only - - - IRQFROMPAD - interrupt from pad before override is applied - [24:24] - read-only - - - INTOPERI - input signal to peripheral, after override is applied - [19:19] - read-only - - - INFROMPAD - input signal from pad, before override is applied - [17:17] - read-only - - - OETOPAD - output enable to pad after register override is applied - [13:13] - read-only - - - OEFROMPERI - output enable from selected peripheral, before register override is applied - [12:12] - read-only - - - OUTTOPAD - output signal to pad after register override is applied - [9:9] - read-only - - - OUTFROMPERI - output signal from selected peripheral, before register override is applied - [8:8] - read-only - - - - - GPIO_CTRL - GPIO control including function select and overrides. - 0x4 - 0x0000001F - - - IRQOVER - [29:28] - read-write - - - NORMAL - don't invert the interrupt - 0 - - - INVERT - invert the interrupt - 1 - - - LOW - drive interrupt low - 2 - - - HIGH - drive interrupt high - 3 - - - - - INOVER - [17:16] - read-write - - - NORMAL - don't invert the peri input - 0 - - - INVERT - invert the peri input - 1 - - - LOW - drive peri input low - 2 - - - HIGH - drive peri input high - 3 - - - - - OEOVER - [13:12] - read-write - - - NORMAL - drive output enable from peripheral signal selected by funcsel - 0 - - - INVERT - drive output enable from inverse of peripheral signal selected by funcsel - 1 - - - DISABLE - disable output - 2 - - - ENABLE - enable output - 3 - - - - - OUTOVER - [9:8] - read-write - - - NORMAL - drive output from peripheral signal selected by funcsel - 0 - - - INVERT - drive output from inverse of peripheral signal selected by funcsel - 1 - - - LOW - drive output low - 2 - - - HIGH - drive output high - 3 - - - - - FUNCSEL - 0-31 -> selects pin function according to the gpio table\n - 31 == NULL - [4:0] - read-write - - - xip_sclk - 0 - - - sio_30 - 5 - - - null - 31 - - - - - - - - INTR - Raw Interrupts - 0x30 - 0x00000000 - - - GPIO_QSPI_SD3_EDGE_HIGH - [23:23] - read-write - oneToClear - - - GPIO_QSPI_SD3_EDGE_LOW - [22:22] - read-write - oneToClear - - - GPIO_QSPI_SD3_LEVEL_HIGH - [21:21] - read-only - - - GPIO_QSPI_SD3_LEVEL_LOW - [20:20] - read-only - - - GPIO_QSPI_SD2_EDGE_HIGH - [19:19] - read-write - oneToClear - - - GPIO_QSPI_SD2_EDGE_LOW - [18:18] - read-write - oneToClear - - - GPIO_QSPI_SD2_LEVEL_HIGH - [17:17] - read-only - - - GPIO_QSPI_SD2_LEVEL_LOW - [16:16] - read-only - - - GPIO_QSPI_SD1_EDGE_HIGH - [15:15] - read-write - oneToClear - - - GPIO_QSPI_SD1_EDGE_LOW - [14:14] - read-write - oneToClear - - - GPIO_QSPI_SD1_LEVEL_HIGH - [13:13] - read-only - - - GPIO_QSPI_SD1_LEVEL_LOW - [12:12] - read-only - - - GPIO_QSPI_SD0_EDGE_HIGH - [11:11] - read-write - oneToClear - - - GPIO_QSPI_SD0_EDGE_LOW - [10:10] - read-write - oneToClear - - - GPIO_QSPI_SD0_LEVEL_HIGH - [9:9] - read-only - - - GPIO_QSPI_SD0_LEVEL_LOW - [8:8] - read-only - - - GPIO_QSPI_SS_EDGE_HIGH - [7:7] - read-write - oneToClear - - - GPIO_QSPI_SS_EDGE_LOW - [6:6] - read-write - oneToClear - - - GPIO_QSPI_SS_LEVEL_HIGH - [5:5] - read-only - - - GPIO_QSPI_SS_LEVEL_LOW - [4:4] - read-only - - - GPIO_QSPI_SCLK_EDGE_HIGH - [3:3] - read-write - oneToClear - - - GPIO_QSPI_SCLK_EDGE_LOW - [2:2] - read-write - oneToClear - - - GPIO_QSPI_SCLK_LEVEL_HIGH - [1:1] - read-only - - - GPIO_QSPI_SCLK_LEVEL_LOW - [0:0] - read-only - - - - - PROC0_INTE - Interrupt Enable for proc0 - 0x34 - 0x00000000 - - - GPIO_QSPI_SD3_EDGE_HIGH - [23:23] - read-write - - - GPIO_QSPI_SD3_EDGE_LOW - [22:22] - read-write - - - GPIO_QSPI_SD3_LEVEL_HIGH - [21:21] - read-write - - - GPIO_QSPI_SD3_LEVEL_LOW - [20:20] - read-write - - - GPIO_QSPI_SD2_EDGE_HIGH - [19:19] - read-write - - - GPIO_QSPI_SD2_EDGE_LOW - [18:18] - read-write - - - GPIO_QSPI_SD2_LEVEL_HIGH - [17:17] - read-write - - - GPIO_QSPI_SD2_LEVEL_LOW - [16:16] - read-write - - - GPIO_QSPI_SD1_EDGE_HIGH - [15:15] - read-write - - - GPIO_QSPI_SD1_EDGE_LOW - [14:14] - read-write - - - GPIO_QSPI_SD1_LEVEL_HIGH - [13:13] - read-write - - - GPIO_QSPI_SD1_LEVEL_LOW - [12:12] - read-write - - - GPIO_QSPI_SD0_EDGE_HIGH - [11:11] - read-write - - - GPIO_QSPI_SD0_EDGE_LOW - [10:10] - read-write - - - GPIO_QSPI_SD0_LEVEL_HIGH - [9:9] - read-write - - - GPIO_QSPI_SD0_LEVEL_LOW - [8:8] - read-write - - - GPIO_QSPI_SS_EDGE_HIGH - [7:7] - read-write - - - GPIO_QSPI_SS_EDGE_LOW - [6:6] - read-write - - - GPIO_QSPI_SS_LEVEL_HIGH - [5:5] - read-write - - - GPIO_QSPI_SS_LEVEL_LOW - [4:4] - read-write - - - GPIO_QSPI_SCLK_EDGE_HIGH - [3:3] - read-write - - - GPIO_QSPI_SCLK_EDGE_LOW - [2:2] - read-write - - - GPIO_QSPI_SCLK_LEVEL_HIGH - [1:1] - read-write - - - GPIO_QSPI_SCLK_LEVEL_LOW - [0:0] - read-write - - - - - PROC0_INTF - Interrupt Force for proc0 - 0x38 - 0x00000000 - - - GPIO_QSPI_SD3_EDGE_HIGH - [23:23] - read-write - - - GPIO_QSPI_SD3_EDGE_LOW - [22:22] - read-write - - - GPIO_QSPI_SD3_LEVEL_HIGH - [21:21] - read-write - - - GPIO_QSPI_SD3_LEVEL_LOW - [20:20] - read-write - - - GPIO_QSPI_SD2_EDGE_HIGH - [19:19] - read-write - - - GPIO_QSPI_SD2_EDGE_LOW - [18:18] - read-write - - - GPIO_QSPI_SD2_LEVEL_HIGH - [17:17] - read-write - - - GPIO_QSPI_SD2_LEVEL_LOW - [16:16] - read-write - - - GPIO_QSPI_SD1_EDGE_HIGH - [15:15] - read-write - - - GPIO_QSPI_SD1_EDGE_LOW - [14:14] - read-write - - - GPIO_QSPI_SD1_LEVEL_HIGH - [13:13] - read-write - - - GPIO_QSPI_SD1_LEVEL_LOW - [12:12] - read-write - - - GPIO_QSPI_SD0_EDGE_HIGH - [11:11] - read-write - - - GPIO_QSPI_SD0_EDGE_LOW - [10:10] - read-write - - - GPIO_QSPI_SD0_LEVEL_HIGH - [9:9] - read-write - - - GPIO_QSPI_SD0_LEVEL_LOW - [8:8] - read-write - - - GPIO_QSPI_SS_EDGE_HIGH - [7:7] - read-write - - - GPIO_QSPI_SS_EDGE_LOW - [6:6] - read-write - - - GPIO_QSPI_SS_LEVEL_HIGH - [5:5] - read-write - - - GPIO_QSPI_SS_LEVEL_LOW - [4:4] - read-write - - - GPIO_QSPI_SCLK_EDGE_HIGH - [3:3] - read-write - - - GPIO_QSPI_SCLK_EDGE_LOW - [2:2] - read-write - - - GPIO_QSPI_SCLK_LEVEL_HIGH - [1:1] - read-write - - - GPIO_QSPI_SCLK_LEVEL_LOW - [0:0] - read-write - - - - - PROC0_INTS - Interrupt status after masking & forcing for proc0 - 0x3C - 0x00000000 - - - GPIO_QSPI_SD3_EDGE_HIGH - [23:23] - read-only - - - GPIO_QSPI_SD3_EDGE_LOW - [22:22] - read-only - - - GPIO_QSPI_SD3_LEVEL_HIGH - [21:21] - read-only - - - GPIO_QSPI_SD3_LEVEL_LOW - [20:20] - read-only - - - GPIO_QSPI_SD2_EDGE_HIGH - [19:19] - read-only - - - GPIO_QSPI_SD2_EDGE_LOW - [18:18] - read-only - - - GPIO_QSPI_SD2_LEVEL_HIGH - [17:17] - read-only - - - GPIO_QSPI_SD2_LEVEL_LOW - [16:16] - read-only - - - GPIO_QSPI_SD1_EDGE_HIGH - [15:15] - read-only - - - GPIO_QSPI_SD1_EDGE_LOW - [14:14] - read-only - - - GPIO_QSPI_SD1_LEVEL_HIGH - [13:13] - read-only - - - GPIO_QSPI_SD1_LEVEL_LOW - [12:12] - read-only - - - GPIO_QSPI_SD0_EDGE_HIGH - [11:11] - read-only - - - GPIO_QSPI_SD0_EDGE_LOW - [10:10] - read-only - - - GPIO_QSPI_SD0_LEVEL_HIGH - [9:9] - read-only - - - GPIO_QSPI_SD0_LEVEL_LOW - [8:8] - read-only - - - GPIO_QSPI_SS_EDGE_HIGH - [7:7] - read-only - - - GPIO_QSPI_SS_EDGE_LOW - [6:6] - read-only - - - GPIO_QSPI_SS_LEVEL_HIGH - [5:5] - read-only - - - GPIO_QSPI_SS_LEVEL_LOW - [4:4] - read-only - - - GPIO_QSPI_SCLK_EDGE_HIGH - [3:3] - read-only - - - GPIO_QSPI_SCLK_EDGE_LOW - [2:2] - read-only - - - GPIO_QSPI_SCLK_LEVEL_HIGH - [1:1] - read-only - - - GPIO_QSPI_SCLK_LEVEL_LOW - [0:0] - read-only - - - - - PROC1_INTE - Interrupt Enable for proc1 - 0x40 - 0x00000000 - - - GPIO_QSPI_SD3_EDGE_HIGH - [23:23] - read-write - - - GPIO_QSPI_SD3_EDGE_LOW - [22:22] - read-write - - - GPIO_QSPI_SD3_LEVEL_HIGH - [21:21] - read-write - - - GPIO_QSPI_SD3_LEVEL_LOW - [20:20] - read-write - - - GPIO_QSPI_SD2_EDGE_HIGH - [19:19] - read-write - - - GPIO_QSPI_SD2_EDGE_LOW - [18:18] - read-write - - - GPIO_QSPI_SD2_LEVEL_HIGH - [17:17] - read-write - - - GPIO_QSPI_SD2_LEVEL_LOW - [16:16] - read-write - - - GPIO_QSPI_SD1_EDGE_HIGH - [15:15] - read-write - - - GPIO_QSPI_SD1_EDGE_LOW - [14:14] - read-write - - - GPIO_QSPI_SD1_LEVEL_HIGH - [13:13] - read-write - - - GPIO_QSPI_SD1_LEVEL_LOW - [12:12] - read-write - - - GPIO_QSPI_SD0_EDGE_HIGH - [11:11] - read-write - - - GPIO_QSPI_SD0_EDGE_LOW - [10:10] - read-write - - - GPIO_QSPI_SD0_LEVEL_HIGH - [9:9] - read-write - - - GPIO_QSPI_SD0_LEVEL_LOW - [8:8] - read-write - - - GPIO_QSPI_SS_EDGE_HIGH - [7:7] - read-write - - - GPIO_QSPI_SS_EDGE_LOW - [6:6] - read-write - - - GPIO_QSPI_SS_LEVEL_HIGH - [5:5] - read-write - - - GPIO_QSPI_SS_LEVEL_LOW - [4:4] - read-write - - - GPIO_QSPI_SCLK_EDGE_HIGH - [3:3] - read-write - - - GPIO_QSPI_SCLK_EDGE_LOW - [2:2] - read-write - - - GPIO_QSPI_SCLK_LEVEL_HIGH - [1:1] - read-write - - - GPIO_QSPI_SCLK_LEVEL_LOW - [0:0] - read-write - - - - - PROC1_INTF - Interrupt Force for proc1 - 0x44 - 0x00000000 - - - GPIO_QSPI_SD3_EDGE_HIGH - [23:23] - read-write - - - GPIO_QSPI_SD3_EDGE_LOW - [22:22] - read-write - - - GPIO_QSPI_SD3_LEVEL_HIGH - [21:21] - read-write - - - GPIO_QSPI_SD3_LEVEL_LOW - [20:20] - read-write - - - GPIO_QSPI_SD2_EDGE_HIGH - [19:19] - read-write - - - GPIO_QSPI_SD2_EDGE_LOW - [18:18] - read-write - - - GPIO_QSPI_SD2_LEVEL_HIGH - [17:17] - read-write - - - GPIO_QSPI_SD2_LEVEL_LOW - [16:16] - read-write - - - GPIO_QSPI_SD1_EDGE_HIGH - [15:15] - read-write - - - GPIO_QSPI_SD1_EDGE_LOW - [14:14] - read-write - - - GPIO_QSPI_SD1_LEVEL_HIGH - [13:13] - read-write - - - GPIO_QSPI_SD1_LEVEL_LOW - [12:12] - read-write - - - GPIO_QSPI_SD0_EDGE_HIGH - [11:11] - read-write - - - GPIO_QSPI_SD0_EDGE_LOW - [10:10] - read-write - - - GPIO_QSPI_SD0_LEVEL_HIGH - [9:9] - read-write - - - GPIO_QSPI_SD0_LEVEL_LOW - [8:8] - read-write - - - GPIO_QSPI_SS_EDGE_HIGH - [7:7] - read-write - - - GPIO_QSPI_SS_EDGE_LOW - [6:6] - read-write - - - GPIO_QSPI_SS_LEVEL_HIGH - [5:5] - read-write - - - GPIO_QSPI_SS_LEVEL_LOW - [4:4] - read-write - - - GPIO_QSPI_SCLK_EDGE_HIGH - [3:3] - read-write - - - GPIO_QSPI_SCLK_EDGE_LOW - [2:2] - read-write - - - GPIO_QSPI_SCLK_LEVEL_HIGH - [1:1] - read-write - - - GPIO_QSPI_SCLK_LEVEL_LOW - [0:0] - read-write - - - - - PROC1_INTS - Interrupt status after masking & forcing for proc1 - 0x48 - 0x00000000 - - - GPIO_QSPI_SD3_EDGE_HIGH - [23:23] - read-only - - - GPIO_QSPI_SD3_EDGE_LOW - [22:22] - read-only - - - GPIO_QSPI_SD3_LEVEL_HIGH - [21:21] - read-only - - - GPIO_QSPI_SD3_LEVEL_LOW - [20:20] - read-only - - - GPIO_QSPI_SD2_EDGE_HIGH - [19:19] - read-only - - - GPIO_QSPI_SD2_EDGE_LOW - [18:18] - read-only - - - GPIO_QSPI_SD2_LEVEL_HIGH - [17:17] - read-only - - - GPIO_QSPI_SD2_LEVEL_LOW - [16:16] - read-only - - - GPIO_QSPI_SD1_EDGE_HIGH - [15:15] - read-only - - - GPIO_QSPI_SD1_EDGE_LOW - [14:14] - read-only - - - GPIO_QSPI_SD1_LEVEL_HIGH - [13:13] - read-only - - - GPIO_QSPI_SD1_LEVEL_LOW - [12:12] - read-only - - - GPIO_QSPI_SD0_EDGE_HIGH - [11:11] - read-only - - - GPIO_QSPI_SD0_EDGE_LOW - [10:10] - read-only - - - GPIO_QSPI_SD0_LEVEL_HIGH - [9:9] - read-only - - - GPIO_QSPI_SD0_LEVEL_LOW - [8:8] - read-only - - - GPIO_QSPI_SS_EDGE_HIGH - [7:7] - read-only - - - GPIO_QSPI_SS_EDGE_LOW - [6:6] - read-only - - - GPIO_QSPI_SS_LEVEL_HIGH - [5:5] - read-only - - - GPIO_QSPI_SS_LEVEL_LOW - [4:4] - read-only - - - GPIO_QSPI_SCLK_EDGE_HIGH - [3:3] - read-only - - - GPIO_QSPI_SCLK_EDGE_LOW - [2:2] - read-only - - - GPIO_QSPI_SCLK_LEVEL_HIGH - [1:1] - read-only - - - GPIO_QSPI_SCLK_LEVEL_LOW - [0:0] - read-only - - - - - DORMANT_WAKE_INTE - Interrupt Enable for dormant_wake - 0x4C - 0x00000000 - - - GPIO_QSPI_SD3_EDGE_HIGH - [23:23] - read-write - - - GPIO_QSPI_SD3_EDGE_LOW - [22:22] - read-write - - - GPIO_QSPI_SD3_LEVEL_HIGH - [21:21] - read-write - - - GPIO_QSPI_SD3_LEVEL_LOW - [20:20] - read-write - - - GPIO_QSPI_SD2_EDGE_HIGH - [19:19] - read-write - - - GPIO_QSPI_SD2_EDGE_LOW - [18:18] - read-write - - - GPIO_QSPI_SD2_LEVEL_HIGH - [17:17] - read-write - - - GPIO_QSPI_SD2_LEVEL_LOW - [16:16] - read-write - - - GPIO_QSPI_SD1_EDGE_HIGH - [15:15] - read-write - - - GPIO_QSPI_SD1_EDGE_LOW - [14:14] - read-write - - - GPIO_QSPI_SD1_LEVEL_HIGH - [13:13] - read-write - - - GPIO_QSPI_SD1_LEVEL_LOW - [12:12] - read-write - - - GPIO_QSPI_SD0_EDGE_HIGH - [11:11] - read-write - - - GPIO_QSPI_SD0_EDGE_LOW - [10:10] - read-write - - - GPIO_QSPI_SD0_LEVEL_HIGH - [9:9] - read-write - - - GPIO_QSPI_SD0_LEVEL_LOW - [8:8] - read-write - - - GPIO_QSPI_SS_EDGE_HIGH - [7:7] - read-write - - - GPIO_QSPI_SS_EDGE_LOW - [6:6] - read-write - - - GPIO_QSPI_SS_LEVEL_HIGH - [5:5] - read-write - - - GPIO_QSPI_SS_LEVEL_LOW - [4:4] - read-write - - - GPIO_QSPI_SCLK_EDGE_HIGH - [3:3] - read-write - - - GPIO_QSPI_SCLK_EDGE_LOW - [2:2] - read-write - - - GPIO_QSPI_SCLK_LEVEL_HIGH - [1:1] - read-write - - - GPIO_QSPI_SCLK_LEVEL_LOW - [0:0] - read-write - - - - - DORMANT_WAKE_INTF - Interrupt Force for dormant_wake - 0x50 - 0x00000000 - - - GPIO_QSPI_SD3_EDGE_HIGH - [23:23] - read-write - - - GPIO_QSPI_SD3_EDGE_LOW - [22:22] - read-write - - - GPIO_QSPI_SD3_LEVEL_HIGH - [21:21] - read-write - - - GPIO_QSPI_SD3_LEVEL_LOW - [20:20] - read-write - - - GPIO_QSPI_SD2_EDGE_HIGH - [19:19] - read-write - - - GPIO_QSPI_SD2_EDGE_LOW - [18:18] - read-write - - - GPIO_QSPI_SD2_LEVEL_HIGH - [17:17] - read-write - - - GPIO_QSPI_SD2_LEVEL_LOW - [16:16] - read-write - - - GPIO_QSPI_SD1_EDGE_HIGH - [15:15] - read-write - - - GPIO_QSPI_SD1_EDGE_LOW - [14:14] - read-write - - - GPIO_QSPI_SD1_LEVEL_HIGH - [13:13] - read-write - - - GPIO_QSPI_SD1_LEVEL_LOW - [12:12] - read-write - - - GPIO_QSPI_SD0_EDGE_HIGH - [11:11] - read-write - - - GPIO_QSPI_SD0_EDGE_LOW - [10:10] - read-write - - - GPIO_QSPI_SD0_LEVEL_HIGH - [9:9] - read-write - - - GPIO_QSPI_SD0_LEVEL_LOW - [8:8] - read-write - - - GPIO_QSPI_SS_EDGE_HIGH - [7:7] - read-write - - - GPIO_QSPI_SS_EDGE_LOW - [6:6] - read-write - - - GPIO_QSPI_SS_LEVEL_HIGH - [5:5] - read-write - - - GPIO_QSPI_SS_LEVEL_LOW - [4:4] - read-write - - - GPIO_QSPI_SCLK_EDGE_HIGH - [3:3] - read-write - - - GPIO_QSPI_SCLK_EDGE_LOW - [2:2] - read-write - - - GPIO_QSPI_SCLK_LEVEL_HIGH - [1:1] - read-write - - - GPIO_QSPI_SCLK_LEVEL_LOW - [0:0] - read-write - - - - - DORMANT_WAKE_INTS - Interrupt status after masking & forcing for dormant_wake - 0x54 - 0x00000000 - - - GPIO_QSPI_SD3_EDGE_HIGH - [23:23] - read-only - - - GPIO_QSPI_SD3_EDGE_LOW - [22:22] - read-only - - - GPIO_QSPI_SD3_LEVEL_HIGH - [21:21] - read-only - - - GPIO_QSPI_SD3_LEVEL_LOW - [20:20] - read-only - - - GPIO_QSPI_SD2_EDGE_HIGH - [19:19] - read-only - - - GPIO_QSPI_SD2_EDGE_LOW - [18:18] - read-only - - - GPIO_QSPI_SD2_LEVEL_HIGH - [17:17] - read-only - - - GPIO_QSPI_SD2_LEVEL_LOW - [16:16] - read-only - - - GPIO_QSPI_SD1_EDGE_HIGH - [15:15] - read-only - - - GPIO_QSPI_SD1_EDGE_LOW - [14:14] - read-only - - - GPIO_QSPI_SD1_LEVEL_HIGH - [13:13] - read-only - - - GPIO_QSPI_SD1_LEVEL_LOW - [12:12] - read-only - - - GPIO_QSPI_SD0_EDGE_HIGH - [11:11] - read-only - - - GPIO_QSPI_SD0_EDGE_LOW - [10:10] - read-only - - - GPIO_QSPI_SD0_LEVEL_HIGH - [9:9] - read-only - - - GPIO_QSPI_SD0_LEVEL_LOW - [8:8] - read-only - - - GPIO_QSPI_SS_EDGE_HIGH - [7:7] - read-only - - - GPIO_QSPI_SS_EDGE_LOW - [6:6] - read-only - - - GPIO_QSPI_SS_LEVEL_HIGH - [5:5] - read-only - - - GPIO_QSPI_SS_LEVEL_LOW - [4:4] - read-only - - - GPIO_QSPI_SCLK_EDGE_HIGH - [3:3] - read-only - - - GPIO_QSPI_SCLK_EDGE_LOW - [2:2] - read-only - - - GPIO_QSPI_SCLK_LEVEL_HIGH - [1:1] - read-only - - - GPIO_QSPI_SCLK_LEVEL_LOW - [0:0] - read-only - - - - - - - PADS_BANK0 - 1 - 0x4001C000 - 0x20 - - 0x0 - 0x1000 - registers - - - - VOLTAGE_SELECT - Voltage select. Per bank control - 0x0 - 0x00000000 - - - VOLTAGE_SELECT - [0:0] - read-write - - - 3v3 - Set voltage to 3.3V (DVDD >= 2V5) - 0 - - - 1v8 - Set voltage to 1.8V (DVDD <= 1V8) - 1 - - - - - - - 30 - 0x4 - 0-29 - GPIO%s - Pad control register - 0x4 - 0x00000056 - - - OD - Output disable. Has priority over output enable from peripherals - [7:7] - read-write - - - IE - Input enable - [6:6] - read-write - - - DRIVE - Drive strength. - [5:4] - read-write - - - 2mA - 0 - - - 4mA - 1 - - - 8mA - 2 - - - 12mA - 3 - - - - - PUE - Pull up enable - [3:3] - read-write - - - PDE - Pull down enable - [2:2] - read-write - - - SCHMITT - Enable schmitt trigger - [1:1] - read-write - - - SLEWFAST - Slew rate control. 1 = Fast, 0 = Slow - [0:0] - read-write - - - - - SWCLK - Pad control register - 0x7C - 0x000000DA - - - OD - Output disable. Has priority over output enable from peripherals - [7:7] - read-write - - - IE - Input enable - [6:6] - read-write - - - DRIVE - Drive strength. - [5:4] - read-write - - - 2mA - 0 - - - 4mA - 1 - - - 8mA - 2 - - - 12mA - 3 - - - - - PUE - Pull up enable - [3:3] - read-write - - - PDE - Pull down enable - [2:2] - read-write - - - SCHMITT - Enable schmitt trigger - [1:1] - read-write - - - SLEWFAST - Slew rate control. 1 = Fast, 0 = Slow - [0:0] - read-write - - - - - SWD - Pad control register - 0x80 - 0x0000005A - - - OD - Output disable. Has priority over output enable from peripherals - [7:7] - read-write - - - IE - Input enable - [6:6] - read-write - - - DRIVE - Drive strength. - [5:4] - read-write - - - 2mA - 0 - - - 4mA - 1 - - - 8mA - 2 - - - 12mA - 3 - - - - - PUE - Pull up enable - [3:3] - read-write - - - PDE - Pull down enable - [2:2] - read-write - - - SCHMITT - Enable schmitt trigger - [1:1] - read-write - - - SLEWFAST - Slew rate control. 1 = Fast, 0 = Slow - [0:0] - read-write - - - - - - - PADS_QSPI - 1 - 0x40020000 - 0x20 - - 0x0 - 0x1000 - registers - - - - VOLTAGE_SELECT - Voltage select. Per bank control - 0x0 - 0x00000000 - - - VOLTAGE_SELECT - [0:0] - read-write - - - 3v3 - Set voltage to 3.3V (DVDD >= 2V5) - 0 - - - 1v8 - Set voltage to 1.8V (DVDD <= 1V8) - 1 - - - - - - - GPIO_QSPI_SCLK - Pad control register - 0x4 - 0x00000056 - - - OD - Output disable. Has priority over output enable from peripherals - [7:7] - read-write - - - IE - Input enable - [6:6] - read-write - - - DRIVE - Drive strength. - [5:4] - read-write - - - 2mA - 0 - - - 4mA - 1 - - - 8mA - 2 - - - 12mA - 3 - - - - - PUE - Pull up enable - [3:3] - read-write - - - PDE - Pull down enable - [2:2] - read-write - - - SCHMITT - Enable schmitt trigger - [1:1] - read-write - - - SLEWFAST - Slew rate control. 1 = Fast, 0 = Slow - [0:0] - read-write - - - - - GPIO_QSPI_SD0 - Pad control register - 0x8 - 0x00000052 - - - OD - Output disable. Has priority over output enable from peripherals - [7:7] - read-write - - - IE - Input enable - [6:6] - read-write - - - DRIVE - Drive strength. - [5:4] - read-write - - - 2mA - 0 - - - 4mA - 1 - - - 8mA - 2 - - - 12mA - 3 - - - - - PUE - Pull up enable - [3:3] - read-write - - - PDE - Pull down enable - [2:2] - read-write - - - SCHMITT - Enable schmitt trigger - [1:1] - read-write - - - SLEWFAST - Slew rate control. 1 = Fast, 0 = Slow - [0:0] - read-write - - - - - GPIO_QSPI_SD1 - Pad control register - 0xC - 0x00000052 - - - OD - Output disable. Has priority over output enable from peripherals - [7:7] - read-write - - - IE - Input enable - [6:6] - read-write - - - DRIVE - Drive strength. - [5:4] - read-write - - - 2mA - 0 - - - 4mA - 1 - - - 8mA - 2 - - - 12mA - 3 - - - - - PUE - Pull up enable - [3:3] - read-write - - - PDE - Pull down enable - [2:2] - read-write - - - SCHMITT - Enable schmitt trigger - [1:1] - read-write - - - SLEWFAST - Slew rate control. 1 = Fast, 0 = Slow - [0:0] - read-write - - - - - GPIO_QSPI_SD2 - Pad control register - 0x10 - 0x00000052 - - - OD - Output disable. Has priority over output enable from peripherals - [7:7] - read-write - - - IE - Input enable - [6:6] - read-write - - - DRIVE - Drive strength. - [5:4] - read-write - - - 2mA - 0 - - - 4mA - 1 - - - 8mA - 2 - - - 12mA - 3 - - - - - PUE - Pull up enable - [3:3] - read-write - - - PDE - Pull down enable - [2:2] - read-write - - - SCHMITT - Enable schmitt trigger - [1:1] - read-write - - - SLEWFAST - Slew rate control. 1 = Fast, 0 = Slow - [0:0] - read-write - - - - - GPIO_QSPI_SD3 - Pad control register - 0x14 - 0x00000052 - - - OD - Output disable. Has priority over output enable from peripherals - [7:7] - read-write - - - IE - Input enable - [6:6] - read-write - - - DRIVE - Drive strength. - [5:4] - read-write - - - 2mA - 0 - - - 4mA - 1 - - - 8mA - 2 - - - 12mA - 3 - - - - - PUE - Pull up enable - [3:3] - read-write - - - PDE - Pull down enable - [2:2] - read-write - - - SCHMITT - Enable schmitt trigger - [1:1] - read-write - - - SLEWFAST - Slew rate control. 1 = Fast, 0 = Slow - [0:0] - read-write - - - - - GPIO_QSPI_SS - Pad control register - 0x18 - 0x0000005A - - - OD - Output disable. Has priority over output enable from peripherals - [7:7] - read-write - - - IE - Input enable - [6:6] - read-write - - - DRIVE - Drive strength. - [5:4] - read-write - - - 2mA - 0 - - - 4mA - 1 - - - 8mA - 2 - - - 12mA - 3 - - - - - PUE - Pull up enable - [3:3] - read-write - - - PDE - Pull down enable - [2:2] - read-write - - - SCHMITT - Enable schmitt trigger - [1:1] - read-write - - - SLEWFAST - Slew rate control. 1 = Fast, 0 = Slow - [0:0] - read-write - - - - - - - XOSC - 1 - Controls the crystal oscillator - 0x40024000 - 0x20 - - 0x0 - 0x1000 - registers - - - - CTRL - Crystal Oscillator Control - 0x0 - 0x00000000 - - - ENABLE - On power-up this field is initialised to DISABLE and the chip runs from the ROSC.\n - If the chip has subsequently been programmed to run from the XOSC then setting this field to DISABLE may lock-up the chip. If this is a concern then run the clk_ref from the ROSC and enable the clk_sys RESUS feature.\n - The 12-bit code is intended to give some protection against accidental writes. An invalid setting will enable the oscillator. - [23:12] - read-write - - - DISABLE - 3358 - - - ENABLE - 4011 - - - - - FREQ_RANGE - Frequency range. This resets to 0xAA0 and cannot be changed. - [11:0] - read-write - - - 1_15MHZ - 2720 - - - RESERVED_1 - 2721 - - - RESERVED_2 - 2722 - - - RESERVED_3 - 2723 - - - - - - - STATUS - Crystal Oscillator Status - 0x4 - 0x00000000 - - - STABLE - Oscillator is running and stable - [31:31] - read-only - - - BADWRITE - An invalid value has been written to CTRL_ENABLE or CTRL_FREQ_RANGE or DORMANT - [24:24] - read-write - oneToClear - - - ENABLED - Oscillator is enabled but not necessarily running and stable, resets to 0 - [12:12] - read-only - - - FREQ_RANGE - The current frequency range setting, always reads 0 - [1:0] - read-only - - - 1_15MHZ - 0 - - - RESERVED_1 - 1 - - - RESERVED_2 - 2 - - - RESERVED_3 - 3 - - - - - - - DORMANT - Crystal Oscillator pause control\n - This is used to save power by pausing the XOSC\n - On power-up this field is initialised to WAKE\n - An invalid write will also select WAKE\n - WARNING: stop the PLLs before selecting dormant mode\n - WARNING: setup the irq before selecting dormant mode - 0x8 - read-write - 0x00000000 - - - STARTUP - Controls the startup delay - 0xC - 0x000000C4 - - - X4 - Multiplies the startup_delay by 4. This is of little value to the user given that the delay can be programmed directly. - [20:20] - read-write - - - DELAY - in multiples of 256*xtal_period. The reset value of 0xc4 corresponds to approx 50 000 cycles. - [13:0] - read-write - - - - - - - PLL_SYS - 1 - 0x40028000 - 0x20 - - 0x0 - 0x1000 - registers - - - - CS - Control and Status\n - GENERAL CONSTRAINTS:\n - Reference clock frequency min=5MHz, max=800MHz\n - Feedback divider min=16, max=320\n - VCO frequency min=750MHz, max=1600MHz - 0x0 - 0x00000001 - - - LOCK - PLL is locked - [31:31] - read-only - - - BYPASS - Passes the reference clock to the output instead of the divided VCO. The VCO continues to run so the user can switch between the reference clock and the divided VCO but the output will glitch when doing so. - [8:8] - read-write - - - REFDIV - Divides the PLL input reference clock.\n - Behaviour is undefined for div=0.\n - PLL output will be unpredictable during refdiv changes, wait for lock=1 before using it. - [5:0] - read-write - - - - - PWR - Controls the PLL power modes. - 0x4 - 0x0000002D - - - VCOPD - PLL VCO powerdown\n - To save power set high when PLL output not required or bypass=1. - [5:5] - read-write - - - POSTDIVPD - PLL post divider powerdown\n - To save power set high when PLL output not required or bypass=1. - [3:3] - read-write - - - DSMPD - PLL DSM powerdown\n - Nothing is achieved by setting this low. - [2:2] - read-write - - - PD - PLL powerdown\n - To save power set high when PLL output not required. - [0:0] - read-write - - - - - FBDIV_INT - Feedback divisor\n - (note: this PLL does not support fractional division) - 0x8 - 0x00000000 - - - FBDIV_INT - see ctrl reg description for constraints - [11:0] - read-write - - - - - PRIM - Controls the PLL post dividers for the primary output\n - (note: this PLL does not have a secondary output)\n - the primary output is driven from VCO divided by postdiv1*postdiv2 - 0xC - 0x00077000 - - - POSTDIV1 - divide by 1-7 - [18:16] - read-write - - - POSTDIV2 - divide by 1-7 - [14:12] - read-write - - - - - - - PLL_USB - 0x4002C000 - - - BUSCTRL - 1 - Register block for busfabric control signals and performance counters - 0x40030000 - 0x20 - - 0x0 - 0x1000 - registers - - - - BUS_PRIORITY - Set the priority of each master for bus arbitration. - 0x0 - 0x00000000 - - - DMA_W - 0 - low priority, 1 - high priority - [12:12] - read-write - - - DMA_R - 0 - low priority, 1 - high priority - [8:8] - read-write - - - PROC1 - 0 - low priority, 1 - high priority - [4:4] - read-write - - - PROC0 - 0 - low priority, 1 - high priority - [0:0] - read-write - - - - - BUS_PRIORITY_ACK - Bus priority acknowledge - 0x4 - 0x00000000 - - - BUS_PRIORITY_ACK - Goes to 1 once all arbiters have registered the new global priority levels.\n - Arbiters update their local priority when servicing a new nonsequential access.\n - In normal circumstances this will happen almost immediately. - [0:0] - read-only - - - - - PERFCTR0 - Bus fabric performance counter 0 - 0x8 - 0x00000000 - - - PERFCTR0 - Busfabric saturating performance counter 0\n - Count some event signal from the busfabric arbiters.\n - Write any value to clear. Select an event to count using PERFSEL0 - [23:0] - read-write - oneToClear - - - - - PERFSEL0 - Bus fabric performance event select for PERFCTR0 - 0xC - 0x0000001F - - - PERFSEL0 - Select an event for PERFCTR0. Count either contested accesses, or all accesses, on a downstream port of the main crossbar. - [4:0] - read-write - - - apb_contested - 0 - - - apb - 1 - - - fastperi_contested - 2 - - - fastperi - 3 - - - sram5_contested - 4 - - - sram5 - 5 - - - sram4_contested - 6 - - - sram4 - 7 - - - sram3_contested - 8 - - - sram3 - 9 - - - sram2_contested - 10 - - - sram2 - 11 - - - sram1_contested - 12 - - - sram1 - 13 - - - sram0_contested - 14 - - - sram0 - 15 - - - xip_main_contested - 16 - - - xip_main - 17 - - - rom_contested - 18 - - - rom - 19 - - - - - - - PERFCTR1 - Bus fabric performance counter 1 - 0x10 - 0x00000000 - - - PERFCTR1 - Busfabric saturating performance counter 1\n - Count some event signal from the busfabric arbiters.\n - Write any value to clear. Select an event to count using PERFSEL1 - [23:0] - read-write - oneToClear - - - - - PERFSEL1 - Bus fabric performance event select for PERFCTR1 - 0x14 - 0x0000001F - - - PERFSEL1 - Select an event for PERFCTR1. Count either contested accesses, or all accesses, on a downstream port of the main crossbar. - [4:0] - read-write - - - apb_contested - 0 - - - apb - 1 - - - fastperi_contested - 2 - - - fastperi - 3 - - - sram5_contested - 4 - - - sram5 - 5 - - - sram4_contested - 6 - - - sram4 - 7 - - - sram3_contested - 8 - - - sram3 - 9 - - - sram2_contested - 10 - - - sram2 - 11 - - - sram1_contested - 12 - - - sram1 - 13 - - - sram0_contested - 14 - - - sram0 - 15 - - - xip_main_contested - 16 - - - xip_main - 17 - - - rom_contested - 18 - - - rom - 19 - - - - - - - PERFCTR2 - Bus fabric performance counter 2 - 0x18 - 0x00000000 - - - PERFCTR2 - Busfabric saturating performance counter 2\n - Count some event signal from the busfabric arbiters.\n - Write any value to clear. Select an event to count using PERFSEL2 - [23:0] - read-write - oneToClear - - - - - PERFSEL2 - Bus fabric performance event select for PERFCTR2 - 0x1C - 0x0000001F - - - PERFSEL2 - Select an event for PERFCTR2. Count either contested accesses, or all accesses, on a downstream port of the main crossbar. - [4:0] - read-write - - - apb_contested - 0 - - - apb - 1 - - - fastperi_contested - 2 - - - fastperi - 3 - - - sram5_contested - 4 - - - sram5 - 5 - - - sram4_contested - 6 - - - sram4 - 7 - - - sram3_contested - 8 - - - sram3 - 9 - - - sram2_contested - 10 - - - sram2 - 11 - - - sram1_contested - 12 - - - sram1 - 13 - - - sram0_contested - 14 - - - sram0 - 15 - - - xip_main_contested - 16 - - - xip_main - 17 - - - rom_contested - 18 - - - rom - 19 - - - - - - - PERFCTR3 - Bus fabric performance counter 3 - 0x20 - 0x00000000 - - - PERFCTR3 - Busfabric saturating performance counter 3\n - Count some event signal from the busfabric arbiters.\n - Write any value to clear. Select an event to count using PERFSEL3 - [23:0] - read-write - oneToClear - - - - - PERFSEL3 - Bus fabric performance event select for PERFCTR3 - 0x24 - 0x0000001F - - - PERFSEL3 - Select an event for PERFCTR3. Count either contested accesses, or all accesses, on a downstream port of the main crossbar. - [4:0] - read-write - - - apb_contested - 0 - - - apb - 1 - - - fastperi_contested - 2 - - - fastperi - 3 - - - sram5_contested - 4 - - - sram5 - 5 - - - sram4_contested - 6 - - - sram4 - 7 - - - sram3_contested - 8 - - - sram3 - 9 - - - sram2_contested - 10 - - - sram2 - 11 - - - sram1_contested - 12 - - - sram1 - 13 - - - sram0_contested - 14 - - - sram0 - 15 - - - xip_main_contested - 16 - - - xip_main - 17 - - - rom_contested - 18 - - - rom - 19 - - - - - - - - - UART0 - 1 - 0x40034000 - 0x20 - - 0x0 - 0x1000 - registers - - - UART0_IRQ - 20 - - - - UARTDR - Data Register, UARTDR - 0x0 - 0x00000000 - - - OE - Overrun error. This bit is set to 1 if data is received and the receive FIFO is already full. This is cleared to 0 once there is an empty space in the FIFO and a new character can be written to it. - [11:11] - read-only - - - BE - Break error. This bit is set to 1 if a break condition was detected, indicating that the received data input was held LOW for longer than a full-word transmission time (defined as start, data, parity and stop bits). In FIFO mode, this error is associated with the character at the top of the FIFO. When a break occurs, only one 0 character is loaded into the FIFO. The next character is only enabled after the receive data input goes to a 1 (marking state), and the next valid start bit is received. - [10:10] - read-only - - - PE - Parity error. When set to 1, it indicates that the parity of the received data character does not match the parity that the EPS and SPS bits in the Line Control Register, UARTLCR_H. In FIFO mode, this error is associated with the character at the top of the FIFO. - [9:9] - read-only - - - FE - Framing error. When set to 1, it indicates that the received character did not have a valid stop bit (a valid stop bit is 1). In FIFO mode, this error is associated with the character at the top of the FIFO. - [8:8] - read-only - - - DATA - Receive (read) data character. Transmit (write) data character. - [7:0] - read-write - - - - - UARTRSR - Receive Status Register/Error Clear Register, UARTRSR/UARTECR - 0x4 - 0x00000000 - - - OE - Overrun error. This bit is set to 1 if data is received and the FIFO is already full. This bit is cleared to 0 by a write to UARTECR. The FIFO contents remain valid because no more data is written when the FIFO is full, only the contents of the shift register are overwritten. The CPU must now read the data, to empty the FIFO. - [3:3] - read-write - oneToClear - - - BE - Break error. This bit is set to 1 if a break condition was detected, indicating that the received data input was held LOW for longer than a full-word transmission time (defined as start, data, parity, and stop bits). This bit is cleared to 0 after a write to UARTECR. In FIFO mode, this error is associated with the character at the top of the FIFO. When a break occurs, only one 0 character is loaded into the FIFO. The next character is only enabled after the receive data input goes to a 1 (marking state) and the next valid start bit is received. - [2:2] - read-write - oneToClear - - - PE - Parity error. When set to 1, it indicates that the parity of the received data character does not match the parity that the EPS and SPS bits in the Line Control Register, UARTLCR_H. This bit is cleared to 0 by a write to UARTECR. In FIFO mode, this error is associated with the character at the top of the FIFO. - [1:1] - read-write - oneToClear - - - FE - Framing error. When set to 1, it indicates that the received character did not have a valid stop bit (a valid stop bit is 1). This bit is cleared to 0 by a write to UARTECR. In FIFO mode, this error is associated with the character at the top of the FIFO. - [0:0] - read-write - oneToClear - - - - - UARTFR - Flag Register, UARTFR - 0x18 - 0x00000090 - - - RI - Ring indicator. This bit is the complement of the UART ring indicator, nUARTRI, modem status input. That is, the bit is 1 when nUARTRI is LOW. - [8:8] - read-only - - - TXFE - Transmit FIFO empty. The meaning of this bit depends on the state of the FEN bit in the Line Control Register, UARTLCR_H. If the FIFO is disabled, this bit is set when the transmit holding register is empty. If the FIFO is enabled, the TXFE bit is set when the transmit FIFO is empty. This bit does not indicate if there is data in the transmit shift register. - [7:7] - read-only - - - RXFF - Receive FIFO full. The meaning of this bit depends on the state of the FEN bit in the UARTLCR_H Register. If the FIFO is disabled, this bit is set when the receive holding register is full. If the FIFO is enabled, the RXFF bit is set when the receive FIFO is full. - [6:6] - read-only - - - TXFF - Transmit FIFO full. The meaning of this bit depends on the state of the FEN bit in the UARTLCR_H Register. If the FIFO is disabled, this bit is set when the transmit holding register is full. If the FIFO is enabled, the TXFF bit is set when the transmit FIFO is full. - [5:5] - read-only - - - RXFE - Receive FIFO empty. The meaning of this bit depends on the state of the FEN bit in the UARTLCR_H Register. If the FIFO is disabled, this bit is set when the receive holding register is empty. If the FIFO is enabled, the RXFE bit is set when the receive FIFO is empty. - [4:4] - read-only - - - BUSY - UART busy. If this bit is set to 1, the UART is busy transmitting data. This bit remains set until the complete byte, including all the stop bits, has been sent from the shift register. This bit is set as soon as the transmit FIFO becomes non-empty, regardless of whether the UART is enabled or not. - [3:3] - read-only - - - DCD - Data carrier detect. This bit is the complement of the UART data carrier detect, nUARTDCD, modem status input. That is, the bit is 1 when nUARTDCD is LOW. - [2:2] - read-only - - - DSR - Data set ready. This bit is the complement of the UART data set ready, nUARTDSR, modem status input. That is, the bit is 1 when nUARTDSR is LOW. - [1:1] - read-only - - - CTS - Clear to send. This bit is the complement of the UART clear to send, nUARTCTS, modem status input. That is, the bit is 1 when nUARTCTS is LOW. - [0:0] - read-only - - - - - UARTILPR - IrDA Low-Power Counter Register, UARTILPR - 0x20 - 0x00000000 - - - ILPDVSR - 8-bit low-power divisor value. These bits are cleared to 0 at reset. - [7:0] - read-write - - - - - UARTIBRD - Integer Baud Rate Register, UARTIBRD - 0x24 - 0x00000000 - - - BAUD_DIVINT - The integer baud rate divisor. These bits are cleared to 0 on reset. - [15:0] - read-write - - - - - UARTFBRD - Fractional Baud Rate Register, UARTFBRD - 0x28 - 0x00000000 - - - BAUD_DIVFRAC - The fractional baud rate divisor. These bits are cleared to 0 on reset. - [5:0] - read-write - - - - - UARTLCR_H - Line Control Register, UARTLCR_H - 0x2C - 0x00000000 - - - SPS - Stick parity select. 0 = stick parity is disabled 1 = either: * if the EPS bit is 0 then the parity bit is transmitted and checked as a 1 * if the EPS bit is 1 then the parity bit is transmitted and checked as a 0. This bit has no effect when the PEN bit disables parity checking and generation. - [7:7] - read-write - - - WLEN - Word length. These bits indicate the number of data bits transmitted or received in a frame as follows: b11 = 8 bits b10 = 7 bits b01 = 6 bits b00 = 5 bits. - [6:5] - read-write - - - FEN - Enable FIFOs: 0 = FIFOs are disabled (character mode) that is, the FIFOs become 1-byte-deep holding registers 1 = transmit and receive FIFO buffers are enabled (FIFO mode). - [4:4] - read-write - - - STP2 - Two stop bits select. If this bit is set to 1, two stop bits are transmitted at the end of the frame. The receive logic does not check for two stop bits being received. - [3:3] - read-write - - - EPS - Even parity select. Controls the type of parity the UART uses during transmission and reception: 0 = odd parity. The UART generates or checks for an odd number of 1s in the data and parity bits. 1 = even parity. The UART generates or checks for an even number of 1s in the data and parity bits. This bit has no effect when the PEN bit disables parity checking and generation. - [2:2] - read-write - - - PEN - Parity enable: 0 = parity is disabled and no parity bit added to the data frame 1 = parity checking and generation is enabled. - [1:1] - read-write - - - BRK - Send break. If this bit is set to 1, a low-level is continually output on the UARTTXD output, after completing transmission of the current character. For the proper execution of the break command, the software must set this bit for at least two complete frames. For normal use, this bit must be cleared to 0. - [0:0] - read-write - - - - - UARTCR - Control Register, UARTCR - 0x30 - 0x00000300 - - - CTSEN - CTS hardware flow control enable. If this bit is set to 1, CTS hardware flow control is enabled. Data is only transmitted when the nUARTCTS signal is asserted. - [15:15] - read-write - - - RTSEN - RTS hardware flow control enable. If this bit is set to 1, RTS hardware flow control is enabled. Data is only requested when there is space in the receive FIFO for it to be received. - [14:14] - read-write - - - OUT2 - This bit is the complement of the UART Out2 (nUARTOut2) modem status output. That is, when the bit is programmed to a 1, the output is 0. For DTE this can be used as Ring Indicator (RI). - [13:13] - read-write - - - OUT1 - This bit is the complement of the UART Out1 (nUARTOut1) modem status output. That is, when the bit is programmed to a 1 the output is 0. For DTE this can be used as Data Carrier Detect (DCD). - [12:12] - read-write - - - RTS - Request to send. This bit is the complement of the UART request to send, nUARTRTS, modem status output. That is, when the bit is programmed to a 1 then nUARTRTS is LOW. - [11:11] - read-write - - - DTR - Data transmit ready. This bit is the complement of the UART data transmit ready, nUARTDTR, modem status output. That is, when the bit is programmed to a 1 then nUARTDTR is LOW. - [10:10] - read-write - - - RXE - Receive enable. If this bit is set to 1, the receive section of the UART is enabled. Data reception occurs for either UART signals or SIR signals depending on the setting of the SIREN bit. When the UART is disabled in the middle of reception, it completes the current character before stopping. - [9:9] - read-write - - - TXE - Transmit enable. If this bit is set to 1, the transmit section of the UART is enabled. Data transmission occurs for either UART signals, or SIR signals depending on the setting of the SIREN bit. When the UART is disabled in the middle of transmission, it completes the current character before stopping. - [8:8] - read-write - - - LBE - Loopback enable. If this bit is set to 1 and the SIREN bit is set to 1 and the SIRTEST bit in the Test Control Register, UARTTCR is set to 1, then the nSIROUT path is inverted, and fed through to the SIRIN path. The SIRTEST bit in the test register must be set to 1 to override the normal half-duplex SIR operation. This must be the requirement for accessing the test registers during normal operation, and SIRTEST must be cleared to 0 when loopback testing is finished. This feature reduces the amount of external coupling required during system test. If this bit is set to 1, and the SIRTEST bit is set to 0, the UARTTXD path is fed through to the UARTRXD path. In either SIR mode or UART mode, when this bit is set, the modem outputs are also fed through to the modem inputs. This bit is cleared to 0 on reset, to disable loopback. - [7:7] - read-write - - - SIRLP - SIR low-power IrDA mode. This bit selects the IrDA encoding mode. If this bit is cleared to 0, low-level bits are transmitted as an active high pulse with a width of 3 / 16th of the bit period. If this bit is set to 1, low-level bits are transmitted with a pulse width that is 3 times the period of the IrLPBaud16 input signal, regardless of the selected bit rate. Setting this bit uses less power, but might reduce transmission distances. - [2:2] - read-write - - - SIREN - SIR enable: 0 = IrDA SIR ENDEC is disabled. nSIROUT remains LOW (no light pulse generated), and signal transitions on SIRIN have no effect. 1 = IrDA SIR ENDEC is enabled. Data is transmitted and received on nSIROUT and SIRIN. UARTTXD remains HIGH, in the marking state. Signal transitions on UARTRXD or modem status inputs have no effect. This bit has no effect if the UARTEN bit disables the UART. - [1:1] - read-write - - - UARTEN - UART enable: 0 = UART is disabled. If the UART is disabled in the middle of transmission or reception, it completes the current character before stopping. 1 = the UART is enabled. Data transmission and reception occurs for either UART signals or SIR signals depending on the setting of the SIREN bit. - [0:0] - read-write - - - - - UARTIFLS - Interrupt FIFO Level Select Register, UARTIFLS - 0x34 - 0x00000012 - - - RXIFLSEL - Receive interrupt FIFO level select. The trigger points for the receive interrupt are as follows: b000 = Receive FIFO becomes >= 1 / 8 full b001 = Receive FIFO becomes >= 1 / 4 full b010 = Receive FIFO becomes >= 1 / 2 full b011 = Receive FIFO becomes >= 3 / 4 full b100 = Receive FIFO becomes >= 7 / 8 full b101-b111 = reserved. - [5:3] - read-write - - - TXIFLSEL - Transmit interrupt FIFO level select. The trigger points for the transmit interrupt are as follows: b000 = Transmit FIFO becomes <= 1 / 8 full b001 = Transmit FIFO becomes <= 1 / 4 full b010 = Transmit FIFO becomes <= 1 / 2 full b011 = Transmit FIFO becomes <= 3 / 4 full b100 = Transmit FIFO becomes <= 7 / 8 full b101-b111 = reserved. - [2:0] - read-write - - - - - UARTIMSC - Interrupt Mask Set/Clear Register, UARTIMSC - 0x38 - 0x00000000 - - - OEIM - Overrun error interrupt mask. A read returns the current mask for the UARTOEINTR interrupt. On a write of 1, the mask of the UARTOEINTR interrupt is set. A write of 0 clears the mask. - [10:10] - read-write - - - BEIM - Break error interrupt mask. A read returns the current mask for the UARTBEINTR interrupt. On a write of 1, the mask of the UARTBEINTR interrupt is set. A write of 0 clears the mask. - [9:9] - read-write - - - PEIM - Parity error interrupt mask. A read returns the current mask for the UARTPEINTR interrupt. On a write of 1, the mask of the UARTPEINTR interrupt is set. A write of 0 clears the mask. - [8:8] - read-write - - - FEIM - Framing error interrupt mask. A read returns the current mask for the UARTFEINTR interrupt. On a write of 1, the mask of the UARTFEINTR interrupt is set. A write of 0 clears the mask. - [7:7] - read-write - - - RTIM - Receive timeout interrupt mask. A read returns the current mask for the UARTRTINTR interrupt. On a write of 1, the mask of the UARTRTINTR interrupt is set. A write of 0 clears the mask. - [6:6] - read-write - - - TXIM - Transmit interrupt mask. A read returns the current mask for the UARTTXINTR interrupt. On a write of 1, the mask of the UARTTXINTR interrupt is set. A write of 0 clears the mask. - [5:5] - read-write - - - RXIM - Receive interrupt mask. A read returns the current mask for the UARTRXINTR interrupt. On a write of 1, the mask of the UARTRXINTR interrupt is set. A write of 0 clears the mask. - [4:4] - read-write - - - DSRMIM - nUARTDSR modem interrupt mask. A read returns the current mask for the UARTDSRINTR interrupt. On a write of 1, the mask of the UARTDSRINTR interrupt is set. A write of 0 clears the mask. - [3:3] - read-write - - - DCDMIM - nUARTDCD modem interrupt mask. A read returns the current mask for the UARTDCDINTR interrupt. On a write of 1, the mask of the UARTDCDINTR interrupt is set. A write of 0 clears the mask. - [2:2] - read-write - - - CTSMIM - nUARTCTS modem interrupt mask. A read returns the current mask for the UARTCTSINTR interrupt. On a write of 1, the mask of the UARTCTSINTR interrupt is set. A write of 0 clears the mask. - [1:1] - read-write - - - RIMIM - nUARTRI modem interrupt mask. A read returns the current mask for the UARTRIINTR interrupt. On a write of 1, the mask of the UARTRIINTR interrupt is set. A write of 0 clears the mask. - [0:0] - read-write - - - - - UARTRIS - Raw Interrupt Status Register, UARTRIS - 0x3C - 0x00000000 - - - OERIS - Overrun error interrupt status. Returns the raw interrupt state of the UARTOEINTR interrupt. - [10:10] - read-only - - - BERIS - Break error interrupt status. Returns the raw interrupt state of the UARTBEINTR interrupt. - [9:9] - read-only - - - PERIS - Parity error interrupt status. Returns the raw interrupt state of the UARTPEINTR interrupt. - [8:8] - read-only - - - FERIS - Framing error interrupt status. Returns the raw interrupt state of the UARTFEINTR interrupt. - [7:7] - read-only - - - RTRIS - Receive timeout interrupt status. Returns the raw interrupt state of the UARTRTINTR interrupt. a - [6:6] - read-only - - - TXRIS - Transmit interrupt status. Returns the raw interrupt state of the UARTTXINTR interrupt. - [5:5] - read-only - - - RXRIS - Receive interrupt status. Returns the raw interrupt state of the UARTRXINTR interrupt. - [4:4] - read-only - - - DSRRMIS - nUARTDSR modem interrupt status. Returns the raw interrupt state of the UARTDSRINTR interrupt. - [3:3] - read-only - - - DCDRMIS - nUARTDCD modem interrupt status. Returns the raw interrupt state of the UARTDCDINTR interrupt. - [2:2] - read-only - - - CTSRMIS - nUARTCTS modem interrupt status. Returns the raw interrupt state of the UARTCTSINTR interrupt. - [1:1] - read-only - - - RIRMIS - nUARTRI modem interrupt status. Returns the raw interrupt state of the UARTRIINTR interrupt. - [0:0] - read-only - - - - - UARTMIS - Masked Interrupt Status Register, UARTMIS - 0x40 - 0x00000000 - - - OEMIS - Overrun error masked interrupt status. Returns the masked interrupt state of the UARTOEINTR interrupt. - [10:10] - read-only - - - BEMIS - Break error masked interrupt status. Returns the masked interrupt state of the UARTBEINTR interrupt. - [9:9] - read-only - - - PEMIS - Parity error masked interrupt status. Returns the masked interrupt state of the UARTPEINTR interrupt. - [8:8] - read-only - - - FEMIS - Framing error masked interrupt status. Returns the masked interrupt state of the UARTFEINTR interrupt. - [7:7] - read-only - - - RTMIS - Receive timeout masked interrupt status. Returns the masked interrupt state of the UARTRTINTR interrupt. - [6:6] - read-only - - - TXMIS - Transmit masked interrupt status. Returns the masked interrupt state of the UARTTXINTR interrupt. - [5:5] - read-only - - - RXMIS - Receive masked interrupt status. Returns the masked interrupt state of the UARTRXINTR interrupt. - [4:4] - read-only - - - DSRMMIS - nUARTDSR modem masked interrupt status. Returns the masked interrupt state of the UARTDSRINTR interrupt. - [3:3] - read-only - - - DCDMMIS - nUARTDCD modem masked interrupt status. Returns the masked interrupt state of the UARTDCDINTR interrupt. - [2:2] - read-only - - - CTSMMIS - nUARTCTS modem masked interrupt status. Returns the masked interrupt state of the UARTCTSINTR interrupt. - [1:1] - read-only - - - RIMMIS - nUARTRI modem masked interrupt status. Returns the masked interrupt state of the UARTRIINTR interrupt. - [0:0] - read-only - - - - - UARTICR - Interrupt Clear Register, UARTICR - 0x44 - 0x00000000 - - - OEIC - Overrun error interrupt clear. Clears the UARTOEINTR interrupt. - [10:10] - read-write - oneToClear - - - BEIC - Break error interrupt clear. Clears the UARTBEINTR interrupt. - [9:9] - read-write - oneToClear - - - PEIC - Parity error interrupt clear. Clears the UARTPEINTR interrupt. - [8:8] - read-write - oneToClear - - - FEIC - Framing error interrupt clear. Clears the UARTFEINTR interrupt. - [7:7] - read-write - oneToClear - - - RTIC - Receive timeout interrupt clear. Clears the UARTRTINTR interrupt. - [6:6] - read-write - oneToClear - - - TXIC - Transmit interrupt clear. Clears the UARTTXINTR interrupt. - [5:5] - read-write - oneToClear - - - RXIC - Receive interrupt clear. Clears the UARTRXINTR interrupt. - [4:4] - read-write - oneToClear - - - DSRMIC - nUARTDSR modem interrupt clear. Clears the UARTDSRINTR interrupt. - [3:3] - read-write - oneToClear - - - DCDMIC - nUARTDCD modem interrupt clear. Clears the UARTDCDINTR interrupt. - [2:2] - read-write - oneToClear - - - CTSMIC - nUARTCTS modem interrupt clear. Clears the UARTCTSINTR interrupt. - [1:1] - read-write - oneToClear - - - RIMIC - nUARTRI modem interrupt clear. Clears the UARTRIINTR interrupt. - [0:0] - read-write - oneToClear - - - - - UARTDMACR - DMA Control Register, UARTDMACR - 0x48 - 0x00000000 - - - DMAONERR - DMA on error. If this bit is set to 1, the DMA receive request outputs, UARTRXDMASREQ or UARTRXDMABREQ, are disabled when the UART error interrupt is asserted. - [2:2] - read-write - - - TXDMAE - Transmit DMA enable. If this bit is set to 1, DMA for the transmit FIFO is enabled. - [1:1] - read-write - - - RXDMAE - Receive DMA enable. If this bit is set to 1, DMA for the receive FIFO is enabled. - [0:0] - read-write - - - - - UARTPERIPHID0 - UARTPeriphID0 Register - 0xFE0 - 0x00000011 - - - PARTNUMBER0 - These bits read back as 0x11 - [7:0] - read-only - - - - - UARTPERIPHID1 - UARTPeriphID1 Register - 0xFE4 - 0x00000010 - - - DESIGNER0 - These bits read back as 0x1 - [7:4] - read-only - - - PARTNUMBER1 - These bits read back as 0x0 - [3:0] - read-only - - - - - UARTPERIPHID2 - UARTPeriphID2 Register - 0xFE8 - 0x00000034 - - - REVISION - This field depends on the revision of the UART: r1p0 0x0 r1p1 0x1 r1p3 0x2 r1p4 0x2 r1p5 0x3 - [7:4] - read-only - - - DESIGNER1 - These bits read back as 0x4 - [3:0] - read-only - - - - - UARTPERIPHID3 - UARTPeriphID3 Register - 0xFEC - 0x00000000 - - - CONFIGURATION - These bits read back as 0x00 - [7:0] - read-only - - - - - UARTPCELLID0 - UARTPCellID0 Register - 0xFF0 - 0x0000000D - - - UARTPCELLID0 - These bits read back as 0x0D - [7:0] - read-only - - - - - UARTPCELLID1 - UARTPCellID1 Register - 0xFF4 - 0x000000F0 - - - UARTPCELLID1 - These bits read back as 0xF0 - [7:0] - read-only - - - - - UARTPCELLID2 - UARTPCellID2 Register - 0xFF8 - 0x00000005 - - - UARTPCELLID2 - These bits read back as 0x05 - [7:0] - read-only - - - - - UARTPCELLID3 - UARTPCellID3 Register - 0xFFC - 0x000000B1 - - - UARTPCELLID3 - These bits read back as 0xB1 - [7:0] - read-only - - - - - - - UART1 - 0x40038000 - - UART1_IRQ - 21 - - - - SPI0 - 1 - 0x4003C000 - 0x20 - - 0x0 - 0x1000 - registers - - - SPI0_IRQ - 18 - - - - SSPCR0 - Control register 0, SSPCR0 on page 3-4 - 0x0 - 0x00000000 - - - SCR - Serial clock rate. The value SCR is used to generate the transmit and receive bit rate of the PrimeCell SSP. The bit rate is: F SSPCLK CPSDVSR x (1+SCR) where CPSDVSR is an even value from 2-254, programmed through the SSPCPSR register and SCR is a value from 0-255. - [15:8] - read-write - - - SPH - SSPCLKOUT phase, applicable to Motorola SPI frame format only. See Motorola SPI frame format on page 2-10. - [7:7] - read-write - - - SPO - SSPCLKOUT polarity, applicable to Motorola SPI frame format only. See Motorola SPI frame format on page 2-10. - [6:6] - read-write - - - FRF - Frame format. - [5:4] - read-write - - FRF - - Motorola - Motorola SPI frame format - 0 - - - Texas_Instruments - Texas Instruments synchronous serial frame format - 1 - - - National_Semiconductor_Microwire - National Semiconductor Microwire frame format - 2 - - - - - DSS - Data Size Select: 0000 Reserved, undefined operation. 0001 Reserved, undefined operation. 0010 Reserved, undefined operation. 0011 4-bit data. 0100 5-bit data. 0101 6-bit data. 0110 7-bit data. 0111 8-bit data. 1000 9-bit data. 1001 10-bit data. 1010 11-bit data. 1011 12-bit data. 1100 13-bit data. 1101 14-bit data. 1110 15-bit data. 1111 16-bit data. - [3:0] - read-write - - - - - SSPCR1 - Control register 1, SSPCR1 on page 3-5 - 0x4 - 0x00000000 - - - SOD - Slave-mode output disable. This bit is relevant only in the slave mode, MS=1. In multiple-slave systems, it is possible for an PrimeCell SSP master to broadcast a message to all slaves in the system while ensuring that only one slave drives data onto its serial output line. In such systems the RXD lines from multiple slaves could be tied together. To operate in such systems, the SOD bit can be set if the PrimeCell SSP slave is not supposed to drive the SSPTXD line: 0 SSP can drive the SSPTXD output in slave mode. 1 SSP must not drive the SSPTXD output in slave mode. - [3:3] - read-write - - - MS - Master or slave mode select. This bit can be modified only when the PrimeCell SSP is disabled, SSE=0: 0 Device configured as master, default. 1 Device configured as slave. - [2:2] - read-write - - - SSE - Synchronous serial port enable: 0 SSP operation disabled. 1 SSP operation enabled. - [1:1] - read-write - - - LBM - Loop back mode: 0 Normal serial port operation enabled. 1 Output of transmit serial shifter is connected to input of receive serial shifter internally. - [0:0] - read-write - - - - - SSPDR - Data register, SSPDR on page 3-6 - 0x8 - 0x00000000 - - - DATA - Transmit/Receive FIFO: Read Receive FIFO. Write Transmit FIFO. You must right-justify data when the PrimeCell SSP is programmed for a data size that is less than 16 bits. Unused bits at the top are ignored by transmit logic. The receive logic automatically right-justifies. - [15:0] - read-write - - - - - SSPSR - Status register, SSPSR on page 3-7 - 0xC - 0x00000003 - - - BSY - PrimeCell SSP busy flag, RO: 0 SSP is idle. 1 SSP is currently transmitting and/or receiving a frame or the transmit FIFO is not empty. - [4:4] - read-only - - - RFF - Receive FIFO full, RO: 0 Receive FIFO is not full. 1 Receive FIFO is full. - [3:3] - read-only - - - RNE - Receive FIFO not empty, RO: 0 Receive FIFO is empty. 1 Receive FIFO is not empty. - [2:2] - read-only - - - TNF - Transmit FIFO not full, RO: 0 Transmit FIFO is full. 1 Transmit FIFO is not full. - [1:1] - read-only - - - TFE - Transmit FIFO empty, RO: 0 Transmit FIFO is not empty. 1 Transmit FIFO is empty. - [0:0] - read-only - - - - - SSPCPSR - Clock prescale register, SSPCPSR on page 3-8 - 0x10 - 0x00000000 - - - CPSDVSR - Clock prescale divisor. Must be an even number from 2-254, depending on the frequency of SSPCLK. The least significant bit always returns zero on reads. - [7:0] - read-write - - - - - SSPIMSC - Interrupt mask set or clear register, SSPIMSC on page 3-9 - 0x14 - 0x00000000 - - - TXIM - Transmit FIFO interrupt mask: 0 Transmit FIFO half empty or less condition interrupt is masked. 1 Transmit FIFO half empty or less condition interrupt is not masked. - [3:3] - read-write - - - RXIM - Receive FIFO interrupt mask: 0 Receive FIFO half full or less condition interrupt is masked. 1 Receive FIFO half full or less condition interrupt is not masked. - [2:2] - read-write - - - RTIM - Receive timeout interrupt mask: 0 Receive FIFO not empty and no read prior to timeout period interrupt is masked. 1 Receive FIFO not empty and no read prior to timeout period interrupt is not masked. - [1:1] - read-write - - - RORIM - Receive overrun interrupt mask: 0 Receive FIFO written to while full condition interrupt is masked. 1 Receive FIFO written to while full condition interrupt is not masked. - [0:0] - read-write - - - - - SSPRIS - Raw interrupt status register, SSPRIS on page 3-10 - 0x18 - 0x00000008 - - - TXRIS - Gives the raw interrupt state, prior to masking, of the SSPTXINTR interrupt - [3:3] - read-only - - - RXRIS - Gives the raw interrupt state, prior to masking, of the SSPRXINTR interrupt - [2:2] - read-only - - - RTRIS - Gives the raw interrupt state, prior to masking, of the SSPRTINTR interrupt - [1:1] - read-only - - - RORRIS - Gives the raw interrupt state, prior to masking, of the SSPRORINTR interrupt - [0:0] - read-only - - - - - SSPMIS - Masked interrupt status register, SSPMIS on page 3-11 - 0x1C - 0x00000000 - - - TXMIS - Gives the transmit FIFO masked interrupt state, after masking, of the SSPTXINTR interrupt - [3:3] - read-only - - - RXMIS - Gives the receive FIFO masked interrupt state, after masking, of the SSPRXINTR interrupt - [2:2] - read-only - - - RTMIS - Gives the receive timeout masked interrupt state, after masking, of the SSPRTINTR interrupt - [1:1] - read-only - - - RORMIS - Gives the receive over run masked interrupt status, after masking, of the SSPRORINTR interrupt - [0:0] - read-only - - - - - SSPICR - Interrupt clear register, SSPICR on page 3-11 - 0x20 - 0x00000000 - - - RTIC - Clears the SSPRTINTR interrupt - [1:1] - read-write - oneToClear - - - RORIC - Clears the SSPRORINTR interrupt - [0:0] - read-write - oneToClear - - - - - SSPDMACR - DMA control register, SSPDMACR on page 3-12 - 0x24 - 0x00000000 - - - TXDMAE - Transmit DMA Enable. If this bit is set to 1, DMA for the transmit FIFO is enabled. - [1:1] - read-write - - - RXDMAE - Receive DMA Enable. If this bit is set to 1, DMA for the receive FIFO is enabled. - [0:0] - read-write - - - - - SSPPERIPHID0 - Peripheral identification registers, SSPPeriphID0-3 on page 3-13 - 0xFE0 - 0x00000022 - - - PARTNUMBER0 - These bits read back as 0x22 - [7:0] - read-only - - - - - SSPPERIPHID1 - Peripheral identification registers, SSPPeriphID0-3 on page 3-13 - 0xFE4 - 0x00000010 - - - DESIGNER0 - These bits read back as 0x1 - [7:4] - read-only - - - PARTNUMBER1 - These bits read back as 0x0 - [3:0] - read-only - - - - - SSPPERIPHID2 - Peripheral identification registers, SSPPeriphID0-3 on page 3-13 - 0xFE8 - 0x00000034 - - - REVISION - These bits return the peripheral revision - [7:4] - read-only - - - DESIGNER1 - These bits read back as 0x4 - [3:0] - read-only - - - - - SSPPERIPHID3 - Peripheral identification registers, SSPPeriphID0-3 on page 3-13 - 0xFEC - 0x00000000 - - - CONFIGURATION - These bits read back as 0x00 - [7:0] - read-only - - - - - SSPPCELLID0 - PrimeCell identification registers, SSPPCellID0-3 on page 3-16 - 0xFF0 - 0x0000000D - - - SSPPCELLID0 - These bits read back as 0x0D - [7:0] - read-only - - - - - SSPPCELLID1 - PrimeCell identification registers, SSPPCellID0-3 on page 3-16 - 0xFF4 - 0x000000F0 - - - SSPPCELLID1 - These bits read back as 0xF0 - [7:0] - read-only - - - - - SSPPCELLID2 - PrimeCell identification registers, SSPPCellID0-3 on page 3-16 - 0xFF8 - 0x00000005 - - - SSPPCELLID2 - These bits read back as 0x05 - [7:0] - read-only - - - - - SSPPCELLID3 - PrimeCell identification registers, SSPPCellID0-3 on page 3-16 - 0xFFC - 0x000000B1 - - - SSPPCELLID3 - These bits read back as 0xB1 - [7:0] - read-only - - - - - - - SPI1 - 0x40040000 - - SPI1_IRQ - 19 - - - - I2C0 - 1 - DW_apb_i2c address block\n\n - List of configuration constants for the Synopsys I2C hardware (you may see references to these in I2C register header; these are *fixed* values, set at hardware design time):\n\n - IC_ULTRA_FAST_MODE ................ 0x0\n - IC_UFM_TBUF_CNT_DEFAULT ........... 0x8\n - IC_UFM_SCL_LOW_COUNT .............. 0x0008\n - IC_UFM_SCL_HIGH_COUNT ............. 0x0006\n - IC_TX_TL .......................... 0x0\n - IC_TX_CMD_BLOCK ................... 0x1\n - IC_HAS_DMA ........................ 0x1\n - IC_HAS_ASYNC_FIFO ................. 0x0\n - IC_SMBUS_ARP ...................... 0x0\n - IC_FIRST_DATA_BYTE_STATUS ......... 0x1\n - IC_INTR_IO ........................ 0x1\n - IC_MASTER_MODE .................... 0x1\n - IC_DEFAULT_ACK_GENERAL_CALL ....... 0x1\n - IC_INTR_POL ....................... 0x1\n - IC_OPTIONAL_SAR ................... 0x0\n - IC_DEFAULT_TAR_SLAVE_ADDR ......... 0x055\n - IC_DEFAULT_SLAVE_ADDR ............. 0x055\n - IC_DEFAULT_HS_SPKLEN .............. 0x1\n - IC_FS_SCL_HIGH_COUNT .............. 0x0006\n - IC_HS_SCL_LOW_COUNT ............... 0x0008\n - IC_DEVICE_ID_VALUE ................ 0x0\n - IC_10BITADDR_MASTER ............... 0x0\n - IC_CLK_FREQ_OPTIMIZATION .......... 0x0\n - IC_DEFAULT_FS_SPKLEN .............. 0x7\n - IC_ADD_ENCODED_PARAMS ............. 0x0\n - IC_DEFAULT_SDA_HOLD ............... 0x000001\n - IC_DEFAULT_SDA_SETUP .............. 0x64\n - IC_AVOID_RX_FIFO_FLUSH_ON_TX_ABRT . 0x0\n - IC_CLOCK_PERIOD ................... 100\n - IC_EMPTYFIFO_HOLD_MASTER_EN ....... 1\n - IC_RESTART_EN ..................... 0x1\n - IC_TX_CMD_BLOCK_DEFAULT ........... 0x0\n - IC_BUS_CLEAR_FEATURE .............. 0x0\n - IC_CAP_LOADING .................... 100\n - IC_FS_SCL_LOW_COUNT ............... 0x000d\n - APB_DATA_WIDTH .................... 32\n - IC_SDA_STUCK_TIMEOUT_DEFAULT ...... 0xffffffff\n - IC_SLV_DATA_NACK_ONLY ............. 0x1\n - IC_10BITADDR_SLAVE ................ 0x0\n - IC_CLK_TYPE ....................... 0x0\n - IC_SMBUS_UDID_MSB ................. 0x0\n - IC_SMBUS_SUSPEND_ALERT ............ 0x0\n - IC_HS_SCL_HIGH_COUNT .............. 0x0006\n - IC_SLV_RESTART_DET_EN ............. 0x1\n - IC_SMBUS .......................... 0x0\n - IC_OPTIONAL_SAR_DEFAULT ........... 0x0\n - IC_PERSISTANT_SLV_ADDR_DEFAULT .... 0x0\n - IC_USE_COUNTS ..................... 0x0\n - IC_RX_BUFFER_DEPTH ................ 16\n - IC_SCL_STUCK_TIMEOUT_DEFAULT ...... 0xffffffff\n - IC_RX_FULL_HLD_BUS_EN ............. 0x1\n - IC_SLAVE_DISABLE .................. 0x1\n - IC_RX_TL .......................... 0x0\n - IC_DEVICE_ID ...................... 0x0\n - IC_HC_COUNT_VALUES ................ 0x0\n - I2C_DYNAMIC_TAR_UPDATE ............ 0\n - IC_SMBUS_CLK_LOW_MEXT_DEFAULT ..... 0xffffffff\n - IC_SMBUS_CLK_LOW_SEXT_DEFAULT ..... 0xffffffff\n - IC_HS_MASTER_CODE ................. 0x1\n - IC_SMBUS_RST_IDLE_CNT_DEFAULT ..... 0xffff\n - IC_SMBUS_UDID_LSB_DEFAULT ......... 0xffffffff\n - IC_SS_SCL_HIGH_COUNT .............. 0x0028\n - IC_SS_SCL_LOW_COUNT ............... 0x002f\n - IC_MAX_SPEED_MODE ................. 0x2\n - IC_STAT_FOR_CLK_STRETCH ........... 0x0\n - IC_STOP_DET_IF_MASTER_ACTIVE ...... 0x0\n - IC_DEFAULT_UFM_SPKLEN ............. 0x1\n - IC_TX_BUFFER_DEPTH ................ 16 - 0x40044000 - 0x20 - - 0x0 - 0x100 - registers - - - I2C0_IRQ - 23 - - - - IC_CON - I2C Control Register. This register can be written only when the DW_apb_i2c is disabled, which corresponds to the IC_ENABLE[0] register being set to 0. Writes at other times have no effect.\n\n - Read/Write Access: - bit 10 is read only. - bit 11 is read only - bit 16 is read only - bit 17 is read only - bits 18 and 19 are read only. - 0x0 - 0x00000065 - - - STOP_DET_IF_MASTER_ACTIVE - Master issues the STOP_DET interrupt irrespective of whether master is active or not - [10:10] - read-only - - - RX_FIFO_FULL_HLD_CTRL - This bit controls whether DW_apb_i2c should hold the bus when the Rx FIFO is physically full to its RX_BUFFER_DEPTH, as described in the IC_RX_FULL_HLD_BUS_EN parameter.\n\n - Reset value: 0x0. - [9:9] - read-write - - - DISABLED - Overflow when RX_FIFO is full - 0 - - - ENABLED - Hold bus when RX_FIFO is full - 1 - - - - - TX_EMPTY_CTRL - This bit controls the generation of the TX_EMPTY interrupt, as described in the IC_RAW_INTR_STAT register.\n\n - Reset value: 0x0. - [8:8] - read-write - - - DISABLED - Default behaviour of TX_EMPTY interrupt - 0 - - - ENABLED - Controlled generation of TX_EMPTY interrupt - 1 - - - - - STOP_DET_IFADDRESSED - In slave mode: - 1'b1: issues the STOP_DET interrupt only when it is addressed. - 1'b0: issues the STOP_DET irrespective of whether it's addressed or not. Reset value: 0x0\n\n - NOTE: During a general call address, this slave does not issue the STOP_DET interrupt if STOP_DET_IF_ADDRESSED = 1'b1, even if the slave responds to the general call address by generating ACK. The STOP_DET interrupt is generated only when the transmitted address matches the slave address (SAR). - [7:7] - read-write - - - DISABLED - slave issues STOP_DET intr always - 0 - - - ENABLED - slave issues STOP_DET intr only if addressed - 1 - - - - - IC_SLAVE_DISABLE - This bit controls whether I2C has its slave disabled, which means once the presetn signal is applied, then this bit is set and the slave is disabled.\n\n - If this bit is set (slave is disabled), DW_apb_i2c functions only as a master and does not perform any action that requires a slave.\n\n - NOTE: Software should ensure that if this bit is written with 0, then bit 0 should also be written with a 0. - [6:6] - read-write - - - SLAVE_ENABLED - Slave mode is enabled - 0 - - - SLAVE_DISABLED - Slave mode is disabled - 1 - - - - - IC_RESTART_EN - Determines whether RESTART conditions may be sent when acting as a master. Some older slaves do not support handling RESTART conditions; however, RESTART conditions are used in several DW_apb_i2c operations. When RESTART is disabled, the master is prohibited from performing the following functions: - Sending a START BYTE - Performing any high-speed mode operation - High-speed mode operation - Performing direction changes in combined format mode - Performing a read operation with a 10-bit address By replacing RESTART condition followed by a STOP and a subsequent START condition, split operations are broken down into multiple DW_apb_i2c transfers. If the above operations are performed, it will result in setting bit 6 (TX_ABRT) of the IC_RAW_INTR_STAT register.\n\n - Reset value: ENABLED - [5:5] - read-write - - - DISABLED - Master restart disabled - 0 - - - ENABLED - Master restart enabled - 1 - - - - - IC_10BITADDR_MASTER - Controls whether the DW_apb_i2c starts its transfers in 7- or 10-bit addressing mode when acting as a master. - 0: 7-bit addressing - 1: 10-bit addressing - [4:4] - read-write - - - ADDR_7BITS - Master 7Bit addressing mode - 0 - - - ADDR_10BITS - Master 10Bit addressing mode - 1 - - - - - IC_10BITADDR_SLAVE - When acting as a slave, this bit controls whether the DW_apb_i2c responds to 7- or 10-bit addresses. - 0: 7-bit addressing. The DW_apb_i2c ignores transactions that involve 10-bit addressing; for 7-bit addressing, only the lower 7 bits of the IC_SAR register are compared. - 1: 10-bit addressing. The DW_apb_i2c responds to only 10-bit addressing transfers that match the full 10 bits of the IC_SAR register. - [3:3] - read-write - - - ADDR_7BITS - Slave 7Bit addressing - 0 - - - ADDR_10BITS - Slave 10Bit addressing - 1 - - - - - SPEED - These bits control at which speed the DW_apb_i2c operates; its setting is relevant only if one is operating the DW_apb_i2c in master mode. Hardware protects against illegal values being programmed by software. These bits must be programmed appropriately for slave mode also, as it is used to capture correct value of spike filter as per the speed mode.\n\n - This register should be programmed only with a value in the range of 1 to IC_MAX_SPEED_MODE; otherwise, hardware updates this register with the value of IC_MAX_SPEED_MODE.\n\n - 1: standard mode (100 kbit/s)\n\n - 2: fast mode (<=400 kbit/s) or fast mode plus (<=1000Kbit/s)\n\n - 3: high speed mode (3.4 Mbit/s)\n\n - Note: This field is not applicable when IC_ULTRA_FAST_MODE=1 - [2:1] - read-write - - - STANDARD - Standard Speed mode of operation - 1 - - - FAST - Fast or Fast Plus mode of operation - 2 - - - HIGH - High Speed mode of operation - 3 - - - - - MASTER_MODE - This bit controls whether the DW_apb_i2c master is enabled.\n\n - NOTE: Software should ensure that if this bit is written with '1' then bit 6 should also be written with a '1'. - [0:0] - read-write - - - DISABLED - Master mode is disabled - 0 - - - ENABLED - Master mode is enabled - 1 - - - - - - - IC_TAR - I2C Target Address Register\n\n - This register is 12 bits wide, and bits 31:12 are reserved. This register can be written to only when IC_ENABLE[0] is set to 0.\n\n - Note: If the software or application is aware that the DW_apb_i2c is not using the TAR address for the pending commands in the Tx FIFO, then it is possible to update the TAR address even while the Tx FIFO has entries (IC_STATUS[2]= 0). - It is not necessary to perform any write to this register if DW_apb_i2c is enabled as an I2C slave only. - 0x4 - 0x00000055 - - - SPECIAL - This bit indicates whether software performs a Device-ID or General Call or START BYTE command. - 0: ignore bit 10 GC_OR_START and use IC_TAR normally - 1: perform special I2C command as specified in Device_ID or GC_OR_START bit Reset value: 0x0 - [11:11] - read-write - - - DISABLED - Disables programming of GENERAL_CALL or START_BYTE transmission - 0 - - - ENABLED - Enables programming of GENERAL_CALL or START_BYTE transmission - 1 - - - - - GC_OR_START - If bit 11 (SPECIAL) is set to 1 and bit 13(Device-ID) is set to 0, then this bit indicates whether a General Call or START byte command is to be performed by the DW_apb_i2c. - 0: General Call Address - after issuing a General Call, only writes may be performed. Attempting to issue a read command results in setting bit 6 (TX_ABRT) of the IC_RAW_INTR_STAT register. The DW_apb_i2c remains in General Call mode until the SPECIAL bit value (bit 11) is cleared. - 1: START BYTE Reset value: 0x0 - [10:10] - read-write - - - GENERAL_CALL - GENERAL_CALL byte transmission - 0 - - - START_BYTE - START byte transmission - 1 - - - - - IC_TAR - This is the target address for any master transaction. When transmitting a General Call, these bits are ignored. To generate a START BYTE, the CPU needs to write only once into these bits.\n\n - If the IC_TAR and IC_SAR are the same, loopback exists but the FIFOs are shared between master and slave, so full loopback is not feasible. Only one direction loopback mode is supported (simplex), not duplex. A master cannot transmit to itself; it can transmit to only a slave. - [9:0] - read-write - - - - - IC_SAR - I2C Slave Address Register - 0x8 - 0x00000055 - - - IC_SAR - The IC_SAR holds the slave address when the I2C is operating as a slave. For 7-bit addressing, only IC_SAR[6:0] is used.\n\n - This register can be written only when the I2C interface is disabled, which corresponds to the IC_ENABLE[0] register being set to 0. Writes at other times have no effect.\n\n - Note: The default values cannot be any of the reserved address locations: that is, 0x00 to 0x07, or 0x78 to 0x7f. The correct operation of the device is not guaranteed if you program the IC_SAR or IC_TAR to a reserved value. Refer to <<table_I2C_firstbyte_bit_defs>> for a complete list of these reserved values. - [9:0] - read-write - - - - - IC_DATA_CMD - I2C Rx/Tx Data Buffer and Command Register; this is the register the CPU writes to when filling the TX FIFO and the CPU reads from when retrieving bytes from RX FIFO.\n\n - The size of the register changes as follows:\n\n - Write: - 11 bits when IC_EMPTYFIFO_HOLD_MASTER_EN=1 - 9 bits when IC_EMPTYFIFO_HOLD_MASTER_EN=0 Read: - 12 bits when IC_FIRST_DATA_BYTE_STATUS = 1 - 8 bits when IC_FIRST_DATA_BYTE_STATUS = 0 Note: In order for the DW_apb_i2c to continue acknowledging reads, a read command should be written for every byte that is to be received; otherwise the DW_apb_i2c will stop acknowledging. - 0x10 - 0x00000000 - - - FIRST_DATA_BYTE - Indicates the first data byte received after the address phase for receive transfer in Master receiver or Slave receiver mode.\n\n - Reset value : 0x0\n\n - NOTE: In case of APB_DATA_WIDTH=8,\n\n - 1. The user has to perform two APB Reads to IC_DATA_CMD in order to get status on 11 bit.\n\n - 2. In order to read the 11 bit, the user has to perform the first data byte read [7:0] (offset 0x10) and then perform the second read [15:8] (offset 0x11) in order to know the status of 11 bit (whether the data received in previous read is a first data byte or not).\n\n - 3. The 11th bit is an optional read field, user can ignore 2nd byte read [15:8] (offset 0x11) if not interested in FIRST_DATA_BYTE status. - [11:11] - read-only - - - INACTIVE - Sequential data byte received - 0 - - - ACTIVE - Non sequential data byte received - 1 - - - - - RESTART - This bit controls whether a RESTART is issued before the byte is sent or received.\n\n - 1 - If IC_RESTART_EN is 1, a RESTART is issued before the data is sent/received (according to the value of CMD), regardless of whether or not the transfer direction is changing from the previous command; if IC_RESTART_EN is 0, a STOP followed by a START is issued instead.\n\n - 0 - If IC_RESTART_EN is 1, a RESTART is issued only if the transfer direction is changing from the previous command; if IC_RESTART_EN is 0, a STOP followed by a START is issued instead.\n\n - Reset value: 0x0 - [10:10] - read-write - clear - - - DISABLE - Don't Issue RESTART before this command - 0 - - - ENABLE - Issue RESTART before this command - 1 - - - - - STOP - This bit controls whether a STOP is issued after the byte is sent or received.\n\n - - 1 - STOP is issued after this byte, regardless of whether or not the Tx FIFO is empty. If the Tx FIFO is not empty, the master immediately tries to start a new transfer by issuing a START and arbitrating for the bus. - 0 - STOP is not issued after this byte, regardless of whether or not the Tx FIFO is empty. If the Tx FIFO is not empty, the master continues the current transfer by sending/receiving data bytes according to the value of the CMD bit. If the Tx FIFO is empty, the master holds the SCL line low and stalls the bus until a new command is available in the Tx FIFO. Reset value: 0x0 - [9:9] - read-write - clear - - - DISABLE - Don't Issue STOP after this command - 0 - - - ENABLE - Issue STOP after this command - 1 - - - - - CMD - This bit controls whether a read or a write is performed. This bit does not control the direction when the DW_apb_i2con acts as a slave. It controls only the direction when it acts as a master.\n\n - When a command is entered in the TX FIFO, this bit distinguishes the write and read commands. In slave-receiver mode, this bit is a 'don't care' because writes to this register are not required. In slave-transmitter mode, a '0' indicates that the data in IC_DATA_CMD is to be transmitted.\n\n - When programming this bit, you should remember the following: attempting to perform a read operation after a General Call command has been sent results in a TX_ABRT interrupt (bit 6 of the IC_RAW_INTR_STAT register), unless bit 11 (SPECIAL) in the IC_TAR register has been cleared. If a '1' is written to this bit after receiving a RD_REQ interrupt, then a TX_ABRT interrupt occurs.\n\n - Reset value: 0x0 - [8:8] - read-write - clear - - - WRITE - Master Write Command - 0 - - - READ - Master Read Command - 1 - - - - - DAT - This register contains the data to be transmitted or received on the I2C bus. If you are writing to this register and want to perform a read, bits 7:0 (DAT) are ignored by the DW_apb_i2c. However, when you read this register, these bits return the value of data received on the DW_apb_i2c interface.\n\n - Reset value: 0x0 - [7:0] - read-write - - - - - IC_SS_SCL_HCNT - Standard Speed I2C Clock SCL High Count Register - 0x14 - 0x00000028 - - - IC_SS_SCL_HCNT - This register must be set before any I2C bus transaction can take place to ensure proper I/O timing. This register sets the SCL clock high-period count for standard speed. For more information, refer to 'IC_CLK Frequency Configuration'.\n\n - This register can be written only when the I2C interface is disabled which corresponds to the IC_ENABLE[0] register being set to 0. Writes at other times have no effect.\n\n - The minimum valid value is 6; hardware prevents values less than this being written, and if attempted results in 6 being set. For designs with APB_DATA_WIDTH = 8, the order of programming is important to ensure the correct operation of the DW_apb_i2c. The lower byte must be programmed first. Then the upper byte is programmed.\n\n - NOTE: This register must not be programmed to a value higher than 65525, because DW_apb_i2c uses a 16-bit counter to flag an I2C bus idle condition when this counter reaches a value of IC_SS_SCL_HCNT + 10. - [15:0] - read-write - - - - - IC_SS_SCL_LCNT - Standard Speed I2C Clock SCL Low Count Register - 0x18 - 0x0000002F - - - IC_SS_SCL_LCNT - This register must be set before any I2C bus transaction can take place to ensure proper I/O timing. This register sets the SCL clock low period count for standard speed. For more information, refer to 'IC_CLK Frequency Configuration'\n\n - This register can be written only when the I2C interface is disabled which corresponds to the IC_ENABLE[0] register being set to 0. Writes at other times have no effect.\n\n - The minimum valid value is 8; hardware prevents values less than this being written, and if attempted, results in 8 being set. For designs with APB_DATA_WIDTH = 8, the order of programming is important to ensure the correct operation of DW_apb_i2c. The lower byte must be programmed first, and then the upper byte is programmed. - [15:0] - read-write - - - - - IC_FS_SCL_HCNT - Fast Mode or Fast Mode Plus I2C Clock SCL High Count Register - 0x1C - 0x00000006 - - - IC_FS_SCL_HCNT - This register must be set before any I2C bus transaction can take place to ensure proper I/O timing. This register sets the SCL clock high-period count for fast mode or fast mode plus. It is used in high-speed mode to send the Master Code and START BYTE or General CALL. For more information, refer to 'IC_CLK Frequency Configuration'.\n\n - This register goes away and becomes read-only returning 0s if IC_MAX_SPEED_MODE = standard. This register can be written only when the I2C interface is disabled, which corresponds to the IC_ENABLE[0] register being set to 0. Writes at other times have no effect.\n\n - The minimum valid value is 6; hardware prevents values less than this being written, and if attempted results in 6 being set. For designs with APB_DATA_WIDTH == 8 the order of programming is important to ensure the correct operation of the DW_apb_i2c. The lower byte must be programmed first. Then the upper byte is programmed. - [15:0] - read-write - - - - - IC_FS_SCL_LCNT - Fast Mode or Fast Mode Plus I2C Clock SCL Low Count Register - 0x20 - 0x0000000D - - - IC_FS_SCL_LCNT - This register must be set before any I2C bus transaction can take place to ensure proper I/O timing. This register sets the SCL clock low period count for fast speed. It is used in high-speed mode to send the Master Code and START BYTE or General CALL. For more information, refer to 'IC_CLK Frequency Configuration'.\n\n - This register goes away and becomes read-only returning 0s if IC_MAX_SPEED_MODE = standard.\n\n - This register can be written only when the I2C interface is disabled, which corresponds to the IC_ENABLE[0] register being set to 0. Writes at other times have no effect.\n\n - The minimum valid value is 8; hardware prevents values less than this being written, and if attempted results in 8 being set. For designs with APB_DATA_WIDTH = 8 the order of programming is important to ensure the correct operation of the DW_apb_i2c. The lower byte must be programmed first. Then the upper byte is programmed. If the value is less than 8 then the count value gets changed to 8. - [15:0] - read-write - - - - - IC_INTR_STAT - I2C Interrupt Status Register\n\n - Each bit in this register has a corresponding mask bit in the IC_INTR_MASK register. These bits are cleared by reading the matching interrupt clear register. The unmasked raw versions of these bits are available in the IC_RAW_INTR_STAT register. - 0x2C - 0x00000000 - - - R_RESTART_DET - See IC_RAW_INTR_STAT for a detailed description of R_RESTART_DET bit.\n\n - Reset value: 0x0 - [12:12] - read-only - - - INACTIVE - R_RESTART_DET interrupt is inactive - 0 - - - ACTIVE - R_RESTART_DET interrupt is active - 1 - - - - - R_GEN_CALL - See IC_RAW_INTR_STAT for a detailed description of R_GEN_CALL bit.\n\n - Reset value: 0x0 - [11:11] - read-only - - - INACTIVE - R_GEN_CALL interrupt is inactive - 0 - - - ACTIVE - R_GEN_CALL interrupt is active - 1 - - - - - R_START_DET - See IC_RAW_INTR_STAT for a detailed description of R_START_DET bit.\n\n - Reset value: 0x0 - [10:10] - read-only - - - INACTIVE - R_START_DET interrupt is inactive - 0 - - - ACTIVE - R_START_DET interrupt is active - 1 - - - - - R_STOP_DET - See IC_RAW_INTR_STAT for a detailed description of R_STOP_DET bit.\n\n - Reset value: 0x0 - [9:9] - read-only - - - INACTIVE - R_STOP_DET interrupt is inactive - 0 - - - ACTIVE - R_STOP_DET interrupt is active - 1 - - - - - R_ACTIVITY - See IC_RAW_INTR_STAT for a detailed description of R_ACTIVITY bit.\n\n - Reset value: 0x0 - [8:8] - read-only - - - INACTIVE - R_ACTIVITY interrupt is inactive - 0 - - - ACTIVE - R_ACTIVITY interrupt is active - 1 - - - - - R_RX_DONE - See IC_RAW_INTR_STAT for a detailed description of R_RX_DONE bit.\n\n - Reset value: 0x0 - [7:7] - read-only - - - INACTIVE - R_RX_DONE interrupt is inactive - 0 - - - ACTIVE - R_RX_DONE interrupt is active - 1 - - - - - R_TX_ABRT - See IC_RAW_INTR_STAT for a detailed description of R_TX_ABRT bit.\n\n - Reset value: 0x0 - [6:6] - read-only - - - INACTIVE - R_TX_ABRT interrupt is inactive - 0 - - - ACTIVE - R_TX_ABRT interrupt is active - 1 - - - - - R_RD_REQ - See IC_RAW_INTR_STAT for a detailed description of R_RD_REQ bit.\n\n - Reset value: 0x0 - [5:5] - read-only - - - INACTIVE - R_RD_REQ interrupt is inactive - 0 - - - ACTIVE - R_RD_REQ interrupt is active - 1 - - - - - R_TX_EMPTY - See IC_RAW_INTR_STAT for a detailed description of R_TX_EMPTY bit.\n\n - Reset value: 0x0 - [4:4] - read-only - - - INACTIVE - R_TX_EMPTY interrupt is inactive - 0 - - - ACTIVE - R_TX_EMPTY interrupt is active - 1 - - - - - R_TX_OVER - See IC_RAW_INTR_STAT for a detailed description of R_TX_OVER bit.\n\n - Reset value: 0x0 - [3:3] - read-only - - - INACTIVE - R_TX_OVER interrupt is inactive - 0 - - - ACTIVE - R_TX_OVER interrupt is active - 1 - - - - - R_RX_FULL - See IC_RAW_INTR_STAT for a detailed description of R_RX_FULL bit.\n\n - Reset value: 0x0 - [2:2] - read-only - - - INACTIVE - R_RX_FULL interrupt is inactive - 0 - - - ACTIVE - R_RX_FULL interrupt is active - 1 - - - - - R_RX_OVER - See IC_RAW_INTR_STAT for a detailed description of R_RX_OVER bit.\n\n - Reset value: 0x0 - [1:1] - read-only - - - INACTIVE - R_RX_OVER interrupt is inactive - 0 - - - ACTIVE - R_RX_OVER interrupt is active - 1 - - - - - R_RX_UNDER - See IC_RAW_INTR_STAT for a detailed description of R_RX_UNDER bit.\n\n - Reset value: 0x0 - [0:0] - read-only - - - INACTIVE - RX_UNDER interrupt is inactive - 0 - - - ACTIVE - RX_UNDER interrupt is active - 1 - - - - - - - IC_INTR_MASK - I2C Interrupt Mask Register.\n\n - These bits mask their corresponding interrupt status bits. This register is active low; a value of 0 masks the interrupt, whereas a value of 1 unmasks the interrupt. - 0x30 - 0x000008FF - - - M_RESTART_DET - This bit masks the R_RESTART_DET interrupt in IC_INTR_STAT register.\n\n - Reset value: 0x0 - [12:12] - read-write - - - ENABLED - RESTART_DET interrupt is masked - 0 - - - DISABLED - RESTART_DET interrupt is unmasked - 1 - - - - - M_GEN_CALL - This bit masks the R_GEN_CALL interrupt in IC_INTR_STAT register.\n\n - Reset value: 0x1 - [11:11] - read-write - - - ENABLED - GEN_CALL interrupt is masked - 0 - - - DISABLED - GEN_CALL interrupt is unmasked - 1 - - - - - M_START_DET - This bit masks the R_START_DET interrupt in IC_INTR_STAT register.\n\n - Reset value: 0x0 - [10:10] - read-write - - - ENABLED - START_DET interrupt is masked - 0 - - - DISABLED - START_DET interrupt is unmasked - 1 - - - - - M_STOP_DET - This bit masks the R_STOP_DET interrupt in IC_INTR_STAT register.\n\n - Reset value: 0x0 - [9:9] - read-write - - - ENABLED - STOP_DET interrupt is masked - 0 - - - DISABLED - STOP_DET interrupt is unmasked - 1 - - - - - M_ACTIVITY - This bit masks the R_ACTIVITY interrupt in IC_INTR_STAT register.\n\n - Reset value: 0x0 - [8:8] - read-write - - - ENABLED - ACTIVITY interrupt is masked - 0 - - - DISABLED - ACTIVITY interrupt is unmasked - 1 - - - - - M_RX_DONE - This bit masks the R_RX_DONE interrupt in IC_INTR_STAT register.\n\n - Reset value: 0x1 - [7:7] - read-write - - - ENABLED - RX_DONE interrupt is masked - 0 - - - DISABLED - RX_DONE interrupt is unmasked - 1 - - - - - M_TX_ABRT - This bit masks the R_TX_ABRT interrupt in IC_INTR_STAT register.\n\n - Reset value: 0x1 - [6:6] - read-write - - - ENABLED - TX_ABORT interrupt is masked - 0 - - - DISABLED - TX_ABORT interrupt is unmasked - 1 - - - - - M_RD_REQ - This bit masks the R_RD_REQ interrupt in IC_INTR_STAT register.\n\n - Reset value: 0x1 - [5:5] - read-write - - - ENABLED - RD_REQ interrupt is masked - 0 - - - DISABLED - RD_REQ interrupt is unmasked - 1 - - - - - M_TX_EMPTY - This bit masks the R_TX_EMPTY interrupt in IC_INTR_STAT register.\n\n - Reset value: 0x1 - [4:4] - read-write - - - ENABLED - TX_EMPTY interrupt is masked - 0 - - - DISABLED - TX_EMPTY interrupt is unmasked - 1 - - - - - M_TX_OVER - This bit masks the R_TX_OVER interrupt in IC_INTR_STAT register.\n\n - Reset value: 0x1 - [3:3] - read-write - - - ENABLED - TX_OVER interrupt is masked - 0 - - - DISABLED - TX_OVER interrupt is unmasked - 1 - - - - - M_RX_FULL - This bit masks the R_RX_FULL interrupt in IC_INTR_STAT register.\n\n - Reset value: 0x1 - [2:2] - read-write - - - ENABLED - RX_FULL interrupt is masked - 0 - - - DISABLED - RX_FULL interrupt is unmasked - 1 - - - - - M_RX_OVER - This bit masks the R_RX_OVER interrupt in IC_INTR_STAT register.\n\n - Reset value: 0x1 - [1:1] - read-write - - - ENABLED - RX_OVER interrupt is masked - 0 - - - DISABLED - RX_OVER interrupt is unmasked - 1 - - - - - M_RX_UNDER - This bit masks the R_RX_UNDER interrupt in IC_INTR_STAT register.\n\n - Reset value: 0x1 - [0:0] - read-write - - - ENABLED - RX_UNDER interrupt is masked - 0 - - - DISABLED - RX_UNDER interrupt is unmasked - 1 - - - - - - - IC_RAW_INTR_STAT - I2C Raw Interrupt Status Register\n\n - Unlike the IC_INTR_STAT register, these bits are not masked so they always show the true status of the DW_apb_i2c. - 0x34 - 0x00000000 - - - RESTART_DET - Indicates whether a RESTART condition has occurred on the I2C interface when DW_apb_i2c is operating in Slave mode and the slave is being addressed. Enabled only when IC_SLV_RESTART_DET_EN=1.\n\n - Note: However, in high-speed mode or during a START BYTE transfer, the RESTART comes before the address field as per the I2C protocol. In this case, the slave is not the addressed slave when the RESTART is issued, therefore DW_apb_i2c does not generate the RESTART_DET interrupt.\n\n - Reset value: 0x0 - [12:12] - read-only - - - INACTIVE - RESTART_DET interrupt is inactive - 0 - - - ACTIVE - RESTART_DET interrupt is active - 1 - - - - - GEN_CALL - Set only when a General Call address is received and it is acknowledged. It stays set until it is cleared either by disabling DW_apb_i2c or when the CPU reads bit 0 of the IC_CLR_GEN_CALL register. DW_apb_i2c stores the received data in the Rx buffer.\n\n - Reset value: 0x0 - [11:11] - read-only - - - INACTIVE - GEN_CALL interrupt is inactive - 0 - - - ACTIVE - GEN_CALL interrupt is active - 1 - - - - - START_DET - Indicates whether a START or RESTART condition has occurred on the I2C interface regardless of whether DW_apb_i2c is operating in slave or master mode.\n\n - Reset value: 0x0 - [10:10] - read-only - - - INACTIVE - START_DET interrupt is inactive - 0 - - - ACTIVE - START_DET interrupt is active - 1 - - - - - STOP_DET - Indicates whether a STOP condition has occurred on the I2C interface regardless of whether DW_apb_i2c is operating in slave or master mode.\n\n - In Slave Mode: - If IC_CON[7]=1'b1 (STOP_DET_IFADDRESSED), the STOP_DET interrupt will be issued only if slave is addressed. Note: During a general call address, this slave does not issue a STOP_DET interrupt if STOP_DET_IF_ADDRESSED=1'b1, even if the slave responds to the general call address by generating ACK. The STOP_DET interrupt is generated only when the transmitted address matches the slave address (SAR). - If IC_CON[7]=1'b0 (STOP_DET_IFADDRESSED), the STOP_DET interrupt is issued irrespective of whether it is being addressed. In Master Mode: - If IC_CON[10]=1'b1 (STOP_DET_IF_MASTER_ACTIVE),the STOP_DET interrupt will be issued only if Master is active. - If IC_CON[10]=1'b0 (STOP_DET_IFADDRESSED),the STOP_DET interrupt will be issued irrespective of whether master is active or not. Reset value: 0x0 - [9:9] - read-only - - - INACTIVE - STOP_DET interrupt is inactive - 0 - - - ACTIVE - STOP_DET interrupt is active - 1 - - - - - ACTIVITY - This bit captures DW_apb_i2c activity and stays set until it is cleared. There are four ways to clear it: - Disabling the DW_apb_i2c - Reading the IC_CLR_ACTIVITY register - Reading the IC_CLR_INTR register - System reset Once this bit is set, it stays set unless one of the four methods is used to clear it. Even if the DW_apb_i2c module is idle, this bit remains set until cleared, indicating that there was activity on the bus.\n\n - Reset value: 0x0 - [8:8] - read-only - - - INACTIVE - RAW_INTR_ACTIVITY interrupt is inactive - 0 - - - ACTIVE - RAW_INTR_ACTIVITY interrupt is active - 1 - - - - - RX_DONE - When the DW_apb_i2c is acting as a slave-transmitter, this bit is set to 1 if the master does not acknowledge a transmitted byte. This occurs on the last byte of the transmission, indicating that the transmission is done.\n\n - Reset value: 0x0 - [7:7] - read-only - - - INACTIVE - RX_DONE interrupt is inactive - 0 - - - ACTIVE - RX_DONE interrupt is active - 1 - - - - - TX_ABRT - This bit indicates if DW_apb_i2c, as an I2C transmitter, is unable to complete the intended actions on the contents of the transmit FIFO. This situation can occur both as an I2C master or an I2C slave, and is referred to as a 'transmit abort'. When this bit is set to 1, the IC_TX_ABRT_SOURCE register indicates the reason why the transmit abort takes places.\n\n - Note: The DW_apb_i2c flushes/resets/empties the TX_FIFO and RX_FIFO whenever there is a transmit abort caused by any of the events tracked by the IC_TX_ABRT_SOURCE register. The FIFOs remains in this flushed state until the register IC_CLR_TX_ABRT is read. Once this read is performed, the Tx FIFO is then ready to accept more data bytes from the APB interface.\n\n - Reset value: 0x0 - [6:6] - read-only - - - INACTIVE - TX_ABRT interrupt is inactive - 0 - - - ACTIVE - TX_ABRT interrupt is active - 1 - - - - - RD_REQ - This bit is set to 1 when DW_apb_i2c is acting as a slave and another I2C master is attempting to read data from DW_apb_i2c. The DW_apb_i2c holds the I2C bus in a wait state (SCL=0) until this interrupt is serviced, which means that the slave has been addressed by a remote master that is asking for data to be transferred. The processor must respond to this interrupt and then write the requested data to the IC_DATA_CMD register. This bit is set to 0 just after the processor reads the IC_CLR_RD_REQ register.\n\n - Reset value: 0x0 - [5:5] - read-only - - - INACTIVE - RD_REQ interrupt is inactive - 0 - - - ACTIVE - RD_REQ interrupt is active - 1 - - - - - TX_EMPTY - The behavior of the TX_EMPTY interrupt status differs based on the TX_EMPTY_CTRL selection in the IC_CON register. - When TX_EMPTY_CTRL = 0: This bit is set to 1 when the transmit buffer is at or below the threshold value set in the IC_TX_TL register. - When TX_EMPTY_CTRL = 1: This bit is set to 1 when the transmit buffer is at or below the threshold value set in the IC_TX_TL register and the transmission of the address/data from the internal shift register for the most recently popped command is completed. It is automatically cleared by hardware when the buffer level goes above the threshold. When IC_ENABLE[0] is set to 0, the TX FIFO is flushed and held in reset. There the TX FIFO looks like it has no data within it, so this bit is set to 1, provided there is activity in the master or slave state machines. When there is no longer any activity, then with ic_en=0, this bit is set to 0.\n\n - Reset value: 0x0. - [4:4] - read-only - - - INACTIVE - TX_EMPTY interrupt is inactive - 0 - - - ACTIVE - TX_EMPTY interrupt is active - 1 - - - - - TX_OVER - Set during transmit if the transmit buffer is filled to IC_TX_BUFFER_DEPTH and the processor attempts to issue another I2C command by writing to the IC_DATA_CMD register. When the module is disabled, this bit keeps its level until the master or slave state machines go into idle, and when ic_en goes to 0, this interrupt is cleared.\n\n - Reset value: 0x0 - [3:3] - read-only - - - INACTIVE - TX_OVER interrupt is inactive - 0 - - - ACTIVE - TX_OVER interrupt is active - 1 - - - - - RX_FULL - Set when the receive buffer reaches or goes above the RX_TL threshold in the IC_RX_TL register. It is automatically cleared by hardware when buffer level goes below the threshold. If the module is disabled (IC_ENABLE[0]=0), the RX FIFO is flushed and held in reset; therefore the RX FIFO is not full. So this bit is cleared once the IC_ENABLE bit 0 is programmed with a 0, regardless of the activity that continues.\n\n - Reset value: 0x0 - [2:2] - read-only - - - INACTIVE - RX_FULL interrupt is inactive - 0 - - - ACTIVE - RX_FULL interrupt is active - 1 - - - - - RX_OVER - Set if the receive buffer is completely filled to IC_RX_BUFFER_DEPTH and an additional byte is received from an external I2C device. The DW_apb_i2c acknowledges this, but any data bytes received after the FIFO is full are lost. If the module is disabled (IC_ENABLE[0]=0), this bit keeps its level until the master or slave state machines go into idle, and when ic_en goes to 0, this interrupt is cleared.\n\n - Note: If bit 9 of the IC_CON register (RX_FIFO_FULL_HLD_CTRL) is programmed to HIGH, then the RX_OVER interrupt never occurs, because the Rx FIFO never overflows.\n\n - Reset value: 0x0 - [1:1] - read-only - - - INACTIVE - RX_OVER interrupt is inactive - 0 - - - ACTIVE - RX_OVER interrupt is active - 1 - - - - - RX_UNDER - Set if the processor attempts to read the receive buffer when it is empty by reading from the IC_DATA_CMD register. If the module is disabled (IC_ENABLE[0]=0), this bit keeps its level until the master or slave state machines go into idle, and when ic_en goes to 0, this interrupt is cleared.\n\n - Reset value: 0x0 - [0:0] - read-only - - - INACTIVE - RX_UNDER interrupt is inactive - 0 - - - ACTIVE - RX_UNDER interrupt is active - 1 - - - - - - - IC_RX_TL - I2C Receive FIFO Threshold Register - 0x38 - 0x00000000 - - - RX_TL - Receive FIFO Threshold Level.\n\n - Controls the level of entries (or above) that triggers the RX_FULL interrupt (bit 2 in IC_RAW_INTR_STAT register). The valid range is 0-255, with the additional restriction that hardware does not allow this value to be set to a value larger than the depth of the buffer. If an attempt is made to do that, the actual value set will be the maximum depth of the buffer. A value of 0 sets the threshold for 1 entry, and a value of 255 sets the threshold for 256 entries. - [7:0] - read-write - - - - - IC_TX_TL - I2C Transmit FIFO Threshold Register - 0x3C - 0x00000000 - - - TX_TL - Transmit FIFO Threshold Level.\n\n - Controls the level of entries (or below) that trigger the TX_EMPTY interrupt (bit 4 in IC_RAW_INTR_STAT register). The valid range is 0-255, with the additional restriction that it may not be set to value larger than the depth of the buffer. If an attempt is made to do that, the actual value set will be the maximum depth of the buffer. A value of 0 sets the threshold for 0 entries, and a value of 255 sets the threshold for 255 entries. - [7:0] - read-write - - - - - IC_CLR_INTR - Clear Combined and Individual Interrupt Register - 0x40 - 0x00000000 - - - CLR_INTR - Read this register to clear the combined interrupt, all individual interrupts, and the IC_TX_ABRT_SOURCE register. This bit does not clear hardware clearable interrupts but software clearable interrupts. Refer to Bit 9 of the IC_TX_ABRT_SOURCE register for an exception to clearing IC_TX_ABRT_SOURCE.\n\n - Reset value: 0x0 - [0:0] - read-only - - - - - IC_CLR_RX_UNDER - Clear RX_UNDER Interrupt Register - 0x44 - 0x00000000 - - - CLR_RX_UNDER - Read this register to clear the RX_UNDER interrupt (bit 0) of the IC_RAW_INTR_STAT register.\n\n - Reset value: 0x0 - [0:0] - read-only - - - - - IC_CLR_RX_OVER - Clear RX_OVER Interrupt Register - 0x48 - 0x00000000 - - - CLR_RX_OVER - Read this register to clear the RX_OVER interrupt (bit 1) of the IC_RAW_INTR_STAT register.\n\n - Reset value: 0x0 - [0:0] - read-only - - - - - IC_CLR_TX_OVER - Clear TX_OVER Interrupt Register - 0x4C - 0x00000000 - - - CLR_TX_OVER - Read this register to clear the TX_OVER interrupt (bit 3) of the IC_RAW_INTR_STAT register.\n\n - Reset value: 0x0 - [0:0] - read-only - - - - - IC_CLR_RD_REQ - Clear RD_REQ Interrupt Register - 0x50 - 0x00000000 - - - CLR_RD_REQ - Read this register to clear the RD_REQ interrupt (bit 5) of the IC_RAW_INTR_STAT register.\n\n - Reset value: 0x0 - [0:0] - read-only - - - - - IC_CLR_TX_ABRT - Clear TX_ABRT Interrupt Register - 0x54 - 0x00000000 - - - CLR_TX_ABRT - Read this register to clear the TX_ABRT interrupt (bit 6) of the IC_RAW_INTR_STAT register, and the IC_TX_ABRT_SOURCE register. This also releases the TX FIFO from the flushed/reset state, allowing more writes to the TX FIFO. Refer to Bit 9 of the IC_TX_ABRT_SOURCE register for an exception to clearing IC_TX_ABRT_SOURCE.\n\n - Reset value: 0x0 - [0:0] - read-only - - - - - IC_CLR_RX_DONE - Clear RX_DONE Interrupt Register - 0x58 - 0x00000000 - - - CLR_RX_DONE - Read this register to clear the RX_DONE interrupt (bit 7) of the IC_RAW_INTR_STAT register.\n\n - Reset value: 0x0 - [0:0] - read-only - - - - - IC_CLR_ACTIVITY - Clear ACTIVITY Interrupt Register - 0x5C - 0x00000000 - - - CLR_ACTIVITY - Reading this register clears the ACTIVITY interrupt if the I2C is not active anymore. If the I2C module is still active on the bus, the ACTIVITY interrupt bit continues to be set. It is automatically cleared by hardware if the module is disabled and if there is no further activity on the bus. The value read from this register to get status of the ACTIVITY interrupt (bit 8) of the IC_RAW_INTR_STAT register.\n\n - Reset value: 0x0 - [0:0] - read-only - - - - - IC_CLR_STOP_DET - Clear STOP_DET Interrupt Register - 0x60 - 0x00000000 - - - CLR_STOP_DET - Read this register to clear the STOP_DET interrupt (bit 9) of the IC_RAW_INTR_STAT register.\n\n - Reset value: 0x0 - [0:0] - read-only - - - - - IC_CLR_START_DET - Clear START_DET Interrupt Register - 0x64 - 0x00000000 - - - CLR_START_DET - Read this register to clear the START_DET interrupt (bit 10) of the IC_RAW_INTR_STAT register.\n\n - Reset value: 0x0 - [0:0] - read-only - - - - - IC_CLR_GEN_CALL - Clear GEN_CALL Interrupt Register - 0x68 - 0x00000000 - - - CLR_GEN_CALL - Read this register to clear the GEN_CALL interrupt (bit 11) of IC_RAW_INTR_STAT register.\n\n - Reset value: 0x0 - [0:0] - read-only - - - - - IC_ENABLE - I2C Enable Register - 0x6C - 0x00000000 - - - TX_CMD_BLOCK - In Master mode: - 1'b1: Blocks the transmission of data on I2C bus even if Tx FIFO has data to transmit. - 1'b0: The transmission of data starts on I2C bus automatically, as soon as the first data is available in the Tx FIFO. Note: To block the execution of Master commands, set the TX_CMD_BLOCK bit only when Tx FIFO is empty (IC_STATUS[2]==1) and Master is in Idle state (IC_STATUS[5] == 0). Any further commands put in the Tx FIFO are not executed until TX_CMD_BLOCK bit is unset. Reset value: IC_TX_CMD_BLOCK_DEFAULT - [2:2] - read-write - - - NOT_BLOCKED - Tx Command execution not blocked - 0 - - - BLOCKED - Tx Command execution blocked - 1 - - - - - ABORT - When set, the controller initiates the transfer abort. - 0: ABORT not initiated or ABORT done - 1: ABORT operation in progress The software can abort the I2C transfer in master mode by setting this bit. The software can set this bit only when ENABLE is already set; otherwise, the controller ignores any write to ABORT bit. The software cannot clear the ABORT bit once set. In response to an ABORT, the controller issues a STOP and flushes the Tx FIFO after completing the current transfer, then sets the TX_ABORT interrupt after the abort operation. The ABORT bit is cleared automatically after the abort operation.\n\n - For a detailed description on how to abort I2C transfers, refer to 'Aborting I2C Transfers'.\n\n - Reset value: 0x0 - [1:1] - read-write - - - DISABLE - ABORT operation not in progress - 0 - - - ENABLED - ABORT operation in progress - 1 - - - - - ENABLE - Controls whether the DW_apb_i2c is enabled. - 0: Disables DW_apb_i2c (TX and RX FIFOs are held in an erased state) - 1: Enables DW_apb_i2c Software can disable DW_apb_i2c while it is active. However, it is important that care be taken to ensure that DW_apb_i2c is disabled properly. A recommended procedure is described in 'Disabling DW_apb_i2c'.\n\n - When DW_apb_i2c is disabled, the following occurs: - The TX FIFO and RX FIFO get flushed. - Status bits in the IC_INTR_STAT register are still active until DW_apb_i2c goes into IDLE state. If the module is transmitting, it stops as well as deletes the contents of the transmit buffer after the current transfer is complete. If the module is receiving, the DW_apb_i2c stops the current transfer at the end of the current byte and does not acknowledge the transfer.\n\n - In systems with asynchronous pclk and ic_clk when IC_CLK_TYPE parameter set to asynchronous (1), there is a two ic_clk delay when enabling or disabling the DW_apb_i2c. For a detailed description on how to disable DW_apb_i2c, refer to 'Disabling DW_apb_i2c'\n\n - Reset value: 0x0 - [0:0] - read-write - - - DISABLED - I2C is disabled - 0 - - - ENABLED - I2C is enabled - 1 - - - - - - - IC_STATUS - I2C Status Register\n\n - This is a read-only register used to indicate the current transfer status and FIFO status. The status register may be read at any time. None of the bits in this register request an interrupt.\n\n - When the I2C is disabled by writing 0 in bit 0 of the IC_ENABLE register: - Bits 1 and 2 are set to 1 - Bits 3 and 10 are set to 0 When the master or slave state machines goes to idle and ic_en=0: - Bits 5 and 6 are set to 0 - 0x70 - 0x00000006 - - - SLV_ACTIVITY - Slave FSM Activity Status. When the Slave Finite State Machine (FSM) is not in the IDLE state, this bit is set. - 0: Slave FSM is in IDLE state so the Slave part of DW_apb_i2c is not Active - 1: Slave FSM is not in IDLE state so the Slave part of DW_apb_i2c is Active Reset value: 0x0 - [6:6] - read-only - - - IDLE - Slave is idle - 0 - - - ACTIVE - Slave not idle - 1 - - - - - MST_ACTIVITY - Master FSM Activity Status. When the Master Finite State Machine (FSM) is not in the IDLE state, this bit is set. - 0: Master FSM is in IDLE state so the Master part of DW_apb_i2c is not Active - 1: Master FSM is not in IDLE state so the Master part of DW_apb_i2c is Active Note: IC_STATUS[0]-that is, ACTIVITY bit-is the OR of SLV_ACTIVITY and MST_ACTIVITY bits.\n\n - Reset value: 0x0 - [5:5] - read-only - - - IDLE - Master is idle - 0 - - - ACTIVE - Master not idle - 1 - - - - - RFF - Receive FIFO Completely Full. When the receive FIFO is completely full, this bit is set. When the receive FIFO contains one or more empty location, this bit is cleared. - 0: Receive FIFO is not full - 1: Receive FIFO is full Reset value: 0x0 - [4:4] - read-only - - - NOT_FULL - Rx FIFO not full - 0 - - - FULL - Rx FIFO is full - 1 - - - - - RFNE - Receive FIFO Not Empty. This bit is set when the receive FIFO contains one or more entries; it is cleared when the receive FIFO is empty. - 0: Receive FIFO is empty - 1: Receive FIFO is not empty Reset value: 0x0 - [3:3] - read-only - - - EMPTY - Rx FIFO is empty - 0 - - - NOT_EMPTY - Rx FIFO not empty - 1 - - - - - TFE - Transmit FIFO Completely Empty. When the transmit FIFO is completely empty, this bit is set. When it contains one or more valid entries, this bit is cleared. This bit field does not request an interrupt. - 0: Transmit FIFO is not empty - 1: Transmit FIFO is empty Reset value: 0x1 - [2:2] - read-only - - - NON_EMPTY - Tx FIFO not empty - 0 - - - EMPTY - Tx FIFO is empty - 1 - - - - - TFNF - Transmit FIFO Not Full. Set when the transmit FIFO contains one or more empty locations, and is cleared when the FIFO is full. - 0: Transmit FIFO is full - 1: Transmit FIFO is not full Reset value: 0x1 - [1:1] - read-only - - - FULL - Tx FIFO is full - 0 - - - NOT_FULL - Tx FIFO not full - 1 - - - - - ACTIVITY - I2C Activity Status. Reset value: 0x0 - [0:0] - read-only - - - INACTIVE - I2C is idle - 0 - - - ACTIVE - I2C is active - 1 - - - - - - - IC_TXFLR - I2C Transmit FIFO Level Register This register contains the number of valid data entries in the transmit FIFO buffer. It is cleared whenever: - The I2C is disabled - There is a transmit abort - that is, TX_ABRT bit is set in the IC_RAW_INTR_STAT register - The slave bulk transmit mode is aborted The register increments whenever data is placed into the transmit FIFO and decrements when data is taken from the transmit FIFO. - 0x74 - 0x00000000 - - - TXFLR - Transmit FIFO Level. Contains the number of valid data entries in the transmit FIFO.\n\n - Reset value: 0x0 - [4:0] - read-only - - - - - IC_RXFLR - I2C Receive FIFO Level Register This register contains the number of valid data entries in the receive FIFO buffer. It is cleared whenever: - The I2C is disabled - Whenever there is a transmit abort caused by any of the events tracked in IC_TX_ABRT_SOURCE The register increments whenever data is placed into the receive FIFO and decrements when data is taken from the receive FIFO. - 0x78 - 0x00000000 - - - RXFLR - Receive FIFO Level. Contains the number of valid data entries in the receive FIFO.\n\n - Reset value: 0x0 - [4:0] - read-only - - - - - IC_SDA_HOLD - I2C SDA Hold Time Length Register\n\n - The bits [15:0] of this register are used to control the hold time of SDA during transmit in both slave and master mode (after SCL goes from HIGH to LOW).\n\n - The bits [23:16] of this register are used to extend the SDA transition (if any) whenever SCL is HIGH in the receiver in either master or slave mode.\n\n - Writes to this register succeed only when IC_ENABLE[0]=0.\n\n - The values in this register are in units of ic_clk period. The value programmed in IC_SDA_TX_HOLD must be greater than the minimum hold time in each mode (one cycle in master mode, seven cycles in slave mode) for the value to be implemented.\n\n - The programmed SDA hold time during transmit (IC_SDA_TX_HOLD) cannot exceed at any time the duration of the low part of scl. Therefore the programmed value cannot be larger than N_SCL_LOW-2, where N_SCL_LOW is the duration of the low part of the scl period measured in ic_clk cycles. - 0x7C - 0x00000001 - - - IC_SDA_RX_HOLD - Sets the required SDA hold time in units of ic_clk period, when DW_apb_i2c acts as a receiver.\n\n - Reset value: IC_DEFAULT_SDA_HOLD[23:16]. - [23:16] - read-write - - - IC_SDA_TX_HOLD - Sets the required SDA hold time in units of ic_clk period, when DW_apb_i2c acts as a transmitter.\n\n - Reset value: IC_DEFAULT_SDA_HOLD[15:0]. - [15:0] - read-write - - - - - IC_TX_ABRT_SOURCE - I2C Transmit Abort Source Register\n\n - This register has 32 bits that indicate the source of the TX_ABRT bit. Except for Bit 9, this register is cleared whenever the IC_CLR_TX_ABRT register or the IC_CLR_INTR register is read. To clear Bit 9, the source of the ABRT_SBYTE_NORSTRT must be fixed first; RESTART must be enabled (IC_CON[5]=1), the SPECIAL bit must be cleared (IC_TAR[11]), or the GC_OR_START bit must be cleared (IC_TAR[10]).\n\n - Once the source of the ABRT_SBYTE_NORSTRT is fixed, then this bit can be cleared in the same manner as other bits in this register. If the source of the ABRT_SBYTE_NORSTRT is not fixed before attempting to clear this bit, Bit 9 clears for one cycle and is then re-asserted. - 0x80 - 0x00000000 - - - TX_FLUSH_CNT - This field indicates the number of Tx FIFO Data Commands which are flushed due to TX_ABRT interrupt. It is cleared whenever I2C is disabled.\n\n - Reset value: 0x0\n\n - Role of DW_apb_i2c: Master-Transmitter or Slave-Transmitter - [31:23] - read-only - - - ABRT_USER_ABRT - This is a master-mode-only bit. Master has detected the transfer abort (IC_ENABLE[1])\n\n - Reset value: 0x0\n\n - Role of DW_apb_i2c: Master-Transmitter - [16:16] - read-only - - - ABRT_USER_ABRT_VOID - Transfer abort detected by master- scenario not present - 0 - - - ABRT_USER_ABRT_GENERATED - Transfer abort detected by master - 1 - - - - - ABRT_SLVRD_INTX - 1: When the processor side responds to a slave mode request for data to be transmitted to a remote master and user writes a 1 in CMD (bit 8) of IC_DATA_CMD register.\n\n - Reset value: 0x0\n\n - Role of DW_apb_i2c: Slave-Transmitter - [15:15] - read-only - - - ABRT_SLVRD_INTX_VOID - Slave trying to transmit to remote master in read mode- scenario not present - 0 - - - ABRT_SLVRD_INTX_GENERATED - Slave trying to transmit to remote master in read mode - 1 - - - - - ABRT_SLV_ARBLOST - This field indicates that a Slave has lost the bus while transmitting data to a remote master. IC_TX_ABRT_SOURCE[12] is set at the same time. Note: Even though the slave never 'owns' the bus, something could go wrong on the bus. This is a fail safe check. For instance, during a data transmission at the low-to-high transition of SCL, if what is on the data bus is not what is supposed to be transmitted, then DW_apb_i2c no longer own the bus.\n\n - Reset value: 0x0\n\n - Role of DW_apb_i2c: Slave-Transmitter - [14:14] - read-only - - - ABRT_SLV_ARBLOST_VOID - Slave lost arbitration to remote master- scenario not present - 0 - - - ABRT_SLV_ARBLOST_GENERATED - Slave lost arbitration to remote master - 1 - - - - - ABRT_SLVFLUSH_TXFIFO - This field specifies that the Slave has received a read command and some data exists in the TX FIFO, so the slave issues a TX_ABRT interrupt to flush old data in TX FIFO.\n\n - Reset value: 0x0\n\n - Role of DW_apb_i2c: Slave-Transmitter - [13:13] - read-only - - - ABRT_SLVFLUSH_TXFIFO_VOID - Slave flushes existing data in TX-FIFO upon getting read command- scenario not present - 0 - - - ABRT_SLVFLUSH_TXFIFO_GENERATED - Slave flushes existing data in TX-FIFO upon getting read command - 1 - - - - - ARB_LOST - This field specifies that the Master has lost arbitration, or if IC_TX_ABRT_SOURCE[14] is also set, then the slave transmitter has lost arbitration.\n\n - Reset value: 0x0\n\n - Role of DW_apb_i2c: Master-Transmitter or Slave-Transmitter - [12:12] - read-only - - - ABRT_LOST_VOID - Master or Slave-Transmitter lost arbitration- scenario not present - 0 - - - ABRT_LOST_GENERATED - Master or Slave-Transmitter lost arbitration - 1 - - - - - ABRT_MASTER_DIS - This field indicates that the User tries to initiate a Master operation with the Master mode disabled.\n\n - Reset value: 0x0\n\n - Role of DW_apb_i2c: Master-Transmitter or Master-Receiver - [11:11] - read-only - - - ABRT_MASTER_DIS_VOID - User initiating master operation when MASTER disabled- scenario not present - 0 - - - ABRT_MASTER_DIS_GENERATED - User initiating master operation when MASTER disabled - 1 - - - - - ABRT_10B_RD_NORSTRT - This field indicates that the restart is disabled (IC_RESTART_EN bit (IC_CON[5]) =0) and the master sends a read command in 10-bit addressing mode.\n\n - Reset value: 0x0\n\n - Role of DW_apb_i2c: Master-Receiver - [10:10] - read-only - - - ABRT_10B_RD_VOID - Master not trying to read in 10Bit addressing mode when RESTART disabled - 0 - - - ABRT_10B_RD_GENERATED - Master trying to read in 10Bit addressing mode when RESTART disabled - 1 - - - - - ABRT_SBYTE_NORSTRT - To clear Bit 9, the source of the ABRT_SBYTE_NORSTRT must be fixed first; restart must be enabled (IC_CON[5]=1), the SPECIAL bit must be cleared (IC_TAR[11]), or the GC_OR_START bit must be cleared (IC_TAR[10]). Once the source of the ABRT_SBYTE_NORSTRT is fixed, then this bit can be cleared in the same manner as other bits in this register. If the source of the ABRT_SBYTE_NORSTRT is not fixed before attempting to clear this bit, bit 9 clears for one cycle and then gets reasserted. When this field is set to 1, the restart is disabled (IC_RESTART_EN bit (IC_CON[5]) =0) and the user is trying to send a START Byte.\n\n - Reset value: 0x0\n\n - Role of DW_apb_i2c: Master - [9:9] - read-only - - - ABRT_SBYTE_NORSTRT_VOID - User trying to send START byte when RESTART disabled- scenario not present - 0 - - - ABRT_SBYTE_NORSTRT_GENERATED - User trying to send START byte when RESTART disabled - 1 - - - - - ABRT_HS_NORSTRT - This field indicates that the restart is disabled (IC_RESTART_EN bit (IC_CON[5]) =0) and the user is trying to use the master to transfer data in High Speed mode.\n\n - Reset value: 0x0\n\n - Role of DW_apb_i2c: Master-Transmitter or Master-Receiver - [8:8] - read-only - - - ABRT_HS_NORSTRT_VOID - User trying to switch Master to HS mode when RESTART disabled- scenario not present - 0 - - - ABRT_HS_NORSTRT_GENERATED - User trying to switch Master to HS mode when RESTART disabled - 1 - - - - - ABRT_SBYTE_ACKDET - This field indicates that the Master has sent a START Byte and the START Byte was acknowledged (wrong behavior).\n\n - Reset value: 0x0\n\n - Role of DW_apb_i2c: Master - [7:7] - read-only - - - ABRT_SBYTE_ACKDET_VOID - ACK detected for START byte- scenario not present - 0 - - - ABRT_SBYTE_ACKDET_GENERATED - ACK detected for START byte - 1 - - - - - ABRT_HS_ACKDET - This field indicates that the Master is in High Speed mode and the High Speed Master code was acknowledged (wrong behavior).\n\n - Reset value: 0x0\n\n - Role of DW_apb_i2c: Master - [6:6] - read-only - - - ABRT_HS_ACK_VOID - HS Master code ACKed in HS Mode- scenario not present - 0 - - - ABRT_HS_ACK_GENERATED - HS Master code ACKed in HS Mode - 1 - - - - - ABRT_GCALL_READ - This field indicates that DW_apb_i2c in the master mode has sent a General Call but the user programmed the byte following the General Call to be a read from the bus (IC_DATA_CMD[9] is set to 1).\n\n - Reset value: 0x0\n\n - Role of DW_apb_i2c: Master-Transmitter - [5:5] - read-only - - - ABRT_GCALL_READ_VOID - GCALL is followed by read from bus-scenario not present - 0 - - - ABRT_GCALL_READ_GENERATED - GCALL is followed by read from bus - 1 - - - - - ABRT_GCALL_NOACK - This field indicates that DW_apb_i2c in master mode has sent a General Call and no slave on the bus acknowledged the General Call.\n\n - Reset value: 0x0\n\n - Role of DW_apb_i2c: Master-Transmitter - [4:4] - read-only - - - ABRT_GCALL_NOACK_VOID - GCALL not ACKed by any slave-scenario not present - 0 - - - ABRT_GCALL_NOACK_GENERATED - GCALL not ACKed by any slave - 1 - - - - - ABRT_TXDATA_NOACK - This field indicates the master-mode only bit. When the master receives an acknowledgement for the address, but when it sends data byte(s) following the address, it did not receive an acknowledge from the remote slave(s).\n\n - Reset value: 0x0\n\n - Role of DW_apb_i2c: Master-Transmitter - [3:3] - read-only - - - ABRT_TXDATA_NOACK_VOID - Transmitted data non-ACKed by addressed slave-scenario not present - 0 - - - ABRT_TXDATA_NOACK_GENERATED - Transmitted data not ACKed by addressed slave - 1 - - - - - ABRT_10ADDR2_NOACK - This field indicates that the Master is in 10-bit address mode and that the second address byte of the 10-bit address was not acknowledged by any slave.\n\n - Reset value: 0x0\n\n - Role of DW_apb_i2c: Master-Transmitter or Master-Receiver - [2:2] - read-only - - - INACTIVE - This abort is not generated - 0 - - - ACTIVE - Byte 2 of 10Bit Address not ACKed by any slave - 1 - - - - - ABRT_10ADDR1_NOACK - This field indicates that the Master is in 10-bit address mode and the first 10-bit address byte was not acknowledged by any slave.\n\n - Reset value: 0x0\n\n - Role of DW_apb_i2c: Master-Transmitter or Master-Receiver - [1:1] - read-only - - - INACTIVE - This abort is not generated - 0 - - - ACTIVE - Byte 1 of 10Bit Address not ACKed by any slave - 1 - - - - - ABRT_7B_ADDR_NOACK - This field indicates that the Master is in 7-bit addressing mode and the address sent was not acknowledged by any slave.\n\n - Reset value: 0x0\n\n - Role of DW_apb_i2c: Master-Transmitter or Master-Receiver - [0:0] - read-only - - - INACTIVE - This abort is not generated - 0 - - - ACTIVE - This abort is generated because of NOACK for 7-bit address - 1 - - - - - - - IC_SLV_DATA_NACK_ONLY - Generate Slave Data NACK Register\n\n - The register is used to generate a NACK for the data part of a transfer when DW_apb_i2c is acting as a slave-receiver. This register only exists when the IC_SLV_DATA_NACK_ONLY parameter is set to 1. When this parameter disabled, this register does not exist and writing to the register's address has no effect.\n\n - A write can occur on this register if both of the following conditions are met: - DW_apb_i2c is disabled (IC_ENABLE[0] = 0) - Slave part is inactive (IC_STATUS[6] = 0) Note: The IC_STATUS[6] is a register read-back location for the internal slv_activity signal; the user should poll this before writing the ic_slv_data_nack_only bit. - 0x84 - 0x00000000 - - - NACK - Generate NACK. This NACK generation only occurs when DW_apb_i2c is a slave-receiver. If this register is set to a value of 1, it can only generate a NACK after a data byte is received; hence, the data transfer is aborted and the data received is not pushed to the receive buffer.\n\n - When the register is set to a value of 0, it generates NACK/ACK, depending on normal criteria. - 1: generate NACK after data byte received - 0: generate NACK/ACK normally Reset value: 0x0 - [0:0] - read-write - - - DISABLED - Slave receiver generates NACK normally - 0 - - - ENABLED - Slave receiver generates NACK upon data reception only - 1 - - - - - - - IC_DMA_CR - DMA Control Register\n\n - The register is used to enable the DMA Controller interface operation. There is a separate bit for transmit and receive. This can be programmed regardless of the state of IC_ENABLE. - 0x88 - 0x00000000 - - - TDMAE - Transmit DMA Enable. This bit enables/disables the transmit FIFO DMA channel. Reset value: 0x0 - [1:1] - read-write - - - DISABLED - transmit FIFO DMA channel disabled - 0 - - - ENABLED - Transmit FIFO DMA channel enabled - 1 - - - - - RDMAE - Receive DMA Enable. This bit enables/disables the receive FIFO DMA channel. Reset value: 0x0 - [0:0] - read-write - - - DISABLED - Receive FIFO DMA channel disabled - 0 - - - ENABLED - Receive FIFO DMA channel enabled - 1 - - - - - - - IC_DMA_TDLR - DMA Transmit Data Level Register - 0x8C - 0x00000000 - - - DMATDL - Transmit Data Level. This bit field controls the level at which a DMA request is made by the transmit logic. It is equal to the watermark level; that is, the dma_tx_req signal is generated when the number of valid data entries in the transmit FIFO is equal to or below this field value, and TDMAE = 1.\n\n - Reset value: 0x0 - [3:0] - read-write - - - - - IC_DMA_RDLR - I2C Receive Data Level Register - 0x90 - 0x00000000 - - - DMARDL - Receive Data Level. This bit field controls the level at which a DMA request is made by the receive logic. The watermark level = DMARDL+1; that is, dma_rx_req is generated when the number of valid data entries in the receive FIFO is equal to or more than this field value + 1, and RDMAE =1. For instance, when DMARDL is 0, then dma_rx_req is asserted when 1 or more data entries are present in the receive FIFO.\n\n - Reset value: 0x0 - [3:0] - read-write - - - - - IC_SDA_SETUP - I2C SDA Setup Register\n\n - This register controls the amount of time delay (in terms of number of ic_clk clock periods) introduced in the rising edge of SCL - relative to SDA changing - when DW_apb_i2c services a read request in a slave-transmitter operation. The relevant I2C requirement is tSU:DAT (note 4) as detailed in the I2C Bus Specification. This register must be programmed with a value equal to or greater than 2.\n\n - Writes to this register succeed only when IC_ENABLE[0] = 0.\n\n - Note: The length of setup time is calculated using [(IC_SDA_SETUP - 1) * (ic_clk_period)], so if the user requires 10 ic_clk periods of setup time, they should program a value of 11. The IC_SDA_SETUP register is only used by the DW_apb_i2c when operating as a slave transmitter. - 0x94 - 0x00000064 - - - SDA_SETUP - SDA Setup. It is recommended that if the required delay is 1000ns, then for an ic_clk frequency of 10 MHz, IC_SDA_SETUP should be programmed to a value of 11. IC_SDA_SETUP must be programmed with a minimum value of 2. - [7:0] - read-write - - - - - IC_ACK_GENERAL_CALL - I2C ACK General Call Register\n\n - The register controls whether DW_apb_i2c responds with a ACK or NACK when it receives an I2C General Call address.\n\n - This register is applicable only when the DW_apb_i2c is in slave mode. - 0x98 - 0x00000001 - - - ACK_GEN_CALL - ACK General Call. When set to 1, DW_apb_i2c responds with a ACK (by asserting ic_data_oe) when it receives a General Call. Otherwise, DW_apb_i2c responds with a NACK (by negating ic_data_oe). - [0:0] - read-write - - - DISABLED - Generate NACK for a General Call - 0 - - - ENABLED - Generate ACK for a General Call - 1 - - - - - - - IC_ENABLE_STATUS - I2C Enable Status Register\n\n - The register is used to report the DW_apb_i2c hardware status when the IC_ENABLE[0] register is set from 1 to 0; that is, when DW_apb_i2c is disabled.\n\n - If IC_ENABLE[0] has been set to 1, bits 2:1 are forced to 0, and bit 0 is forced to 1.\n\n - If IC_ENABLE[0] has been set to 0, bits 2:1 is only be valid as soon as bit 0 is read as '0'.\n\n - Note: When IC_ENABLE[0] has been set to 0, a delay occurs for bit 0 to be read as 0 because disabling the DW_apb_i2c depends on I2C bus activities. - 0x9C - 0x00000000 - - - SLV_RX_DATA_LOST - Slave Received Data Lost. This bit indicates if a Slave-Receiver operation has been aborted with at least one data byte received from an I2C transfer due to the setting bit 0 of IC_ENABLE from 1 to 0. When read as 1, DW_apb_i2c is deemed to have been actively engaged in an aborted I2C transfer (with matching address) and the data phase of the I2C transfer has been entered, even though a data byte has been responded with a NACK.\n\n - Note: If the remote I2C master terminates the transfer with a STOP condition before the DW_apb_i2c has a chance to NACK a transfer, and IC_ENABLE[0] has been set to 0, then this bit is also set to 1.\n\n - When read as 0, DW_apb_i2c is deemed to have been disabled without being actively involved in the data phase of a Slave-Receiver transfer.\n\n - Note: The CPU can safely read this bit when IC_EN (bit 0) is read as 0.\n\n - Reset value: 0x0 - [2:2] - read-only - - - INACTIVE - Slave RX Data is not lost - 0 - - - ACTIVE - Slave RX Data is lost - 1 - - - - - SLV_DISABLED_WHILE_BUSY - Slave Disabled While Busy (Transmit, Receive). This bit indicates if a potential or active Slave operation has been aborted due to the setting bit 0 of the IC_ENABLE register from 1 to 0. This bit is set when the CPU writes a 0 to the IC_ENABLE register while:\n\n - (a) DW_apb_i2c is receiving the address byte of the Slave-Transmitter operation from a remote master;\n\n - OR,\n\n - (b) address and data bytes of the Slave-Receiver operation from a remote master.\n\n - When read as 1, DW_apb_i2c is deemed to have forced a NACK during any part of an I2C transfer, irrespective of whether the I2C address matches the slave address set in DW_apb_i2c (IC_SAR register) OR if the transfer is completed before IC_ENABLE is set to 0 but has not taken effect.\n\n - Note: If the remote I2C master terminates the transfer with a STOP condition before the DW_apb_i2c has a chance to NACK a transfer, and IC_ENABLE[0] has been set to 0, then this bit will also be set to 1.\n\n - When read as 0, DW_apb_i2c is deemed to have been disabled when there is master activity, or when the I2C bus is idle.\n\n - Note: The CPU can safely read this bit when IC_EN (bit 0) is read as 0.\n\n - Reset value: 0x0 - [1:1] - read-only - - - INACTIVE - Slave is disabled when it is idle - 0 - - - ACTIVE - Slave is disabled when it is active - 1 - - - - - IC_EN - ic_en Status. This bit always reflects the value driven on the output port ic_en. - When read as 1, DW_apb_i2c is deemed to be in an enabled state. - When read as 0, DW_apb_i2c is deemed completely inactive. Note: The CPU can safely read this bit anytime. When this bit is read as 0, the CPU can safely read SLV_RX_DATA_LOST (bit 2) and SLV_DISABLED_WHILE_BUSY (bit 1).\n\n - Reset value: 0x0 - [0:0] - read-only - - - DISABLED - I2C disabled - 0 - - - ENABLED - I2C enabled - 1 - - - - - - - IC_FS_SPKLEN - I2C SS, FS or FM+ spike suppression limit\n\n - This register is used to store the duration, measured in ic_clk cycles, of the longest spike that is filtered out by the spike suppression logic when the component is operating in SS, FS or FM+ modes. The relevant I2C requirement is tSP (table 4) as detailed in the I2C Bus Specification. This register must be programmed with a minimum value of 1. - 0xA0 - 0x00000007 - - - IC_FS_SPKLEN - This register must be set before any I2C bus transaction can take place to ensure stable operation. This register sets the duration, measured in ic_clk cycles, of the longest spike in the SCL or SDA lines that will be filtered out by the spike suppression logic. This register can be written only when the I2C interface is disabled which corresponds to the IC_ENABLE[0] register being set to 0. Writes at other times have no effect. The minimum valid value is 1; hardware prevents values less than this being written, and if attempted results in 1 being set. or more information, refer to 'Spike Suppression'. - [7:0] - read-write - - - - - IC_CLR_RESTART_DET - Clear RESTART_DET Interrupt Register - 0xA8 - 0x00000000 - - - CLR_RESTART_DET - Read this register to clear the RESTART_DET interrupt (bit 12) of IC_RAW_INTR_STAT register.\n\n - Reset value: 0x0 - [0:0] - read-only - - - - - IC_COMP_PARAM_1 - Component Parameter Register 1\n\n - Note This register is not implemented and therefore reads as 0. If it was implemented it would be a constant read-only register that contains encoded information about the component's parameter settings. Fields shown below are the settings for those parameters - 0xF4 - 0x00000000 - - - TX_BUFFER_DEPTH - TX Buffer Depth = 16 - [23:16] - read-only - - - RX_BUFFER_DEPTH - RX Buffer Depth = 16 - [15:8] - read-only - - - ADD_ENCODED_PARAMS - Encoded parameters not visible - [7:7] - read-only - - - HAS_DMA - DMA handshaking signals are enabled - [6:6] - read-only - - - INTR_IO - COMBINED Interrupt outputs - [5:5] - read-only - - - HC_COUNT_VALUES - Programmable count values for each mode. - [4:4] - read-only - - - MAX_SPEED_MODE - MAX SPEED MODE = FAST MODE - [3:2] - read-only - - - APB_DATA_WIDTH - APB data bus width is 32 bits - [1:0] - read-only - - - - - IC_COMP_VERSION - I2C Component Version Register - 0xF8 - 0x3230312A - - - IC_COMP_VERSION - [31:0] - read-only - - - - - IC_COMP_TYPE - I2C Component Type Register - 0xFC - 0x44570140 - - - IC_COMP_TYPE - Designware Component Type number = 0x44_57_01_40. This assigned unique hex value is constant and is derived from the two ASCII letters 'DW' followed by a 16-bit unsigned number. - [31:0] - read-only - - - - - - - I2C1 - 0x40048000 - - I2C1_IRQ - 24 - - - - ADC - 2 - Control and data interface to SAR ADC - 0x4004C000 - 0x20 - - 0x0 - 0x1000 - registers - - - ADC_IRQ_FIFO - 22 - - - - CS - ADC Control and Status - 0x0 - 0x00000000 - - - RROBIN - Round-robin sampling. 1 bit per channel. Set all bits to 0 to disable.\n - Otherwise, the ADC will cycle through each enabled channel in a round-robin fashion.\n - The first channel to be sampled will be the one currently indicated by AINSEL.\n - AINSEL will be updated after each conversion with the newly-selected channel. - [20:16] - read-write - - - AINSEL - Select analog mux input. Updated automatically in round-robin mode. - [14:12] - read-write - - - ERR_STICKY - Some past ADC conversion encountered an error. Write 1 to clear. - [10:10] - read-write - oneToClear - - - ERR - The most recent ADC conversion encountered an error; result is undefined or noisy. - [9:9] - read-only - - - READY - 1 if the ADC is ready to start a new conversion. Implies any previous conversion has completed.\n - 0 whilst conversion in progress. - [8:8] - read-only - - - START_MANY - Continuously perform conversions whilst this bit is 1. A new conversion will start immediately after the previous finishes. - [3:3] - read-write - - - START_ONCE - Start a single conversion. Self-clearing. Ignored if start_many is asserted. - [2:2] - read-write - clear - - - TS_EN - Power on temperature sensor. 1 - enabled. 0 - disabled. - [1:1] - read-write - - - EN - Power on ADC and enable its clock.\n - 1 - enabled. 0 - disabled. - [0:0] - read-write - - - - - RESULT - Result of most recent ADC conversion - 0x4 - 0x00000000 - - - RESULT - [11:0] - read-only - - - - - FCS - FIFO control and status - 0x8 - 0x00000000 - - - THRESH - DREQ/IRQ asserted when level >= threshold - [27:24] - read-write - - - LEVEL - The number of conversion results currently waiting in the FIFO - [19:16] - read-only - - - OVER - 1 if the FIFO has been overflowed. Write 1 to clear. - [11:11] - read-write - oneToClear - - - UNDER - 1 if the FIFO has been underflowed. Write 1 to clear. - [10:10] - read-write - oneToClear - - - FULL - [9:9] - read-only - - - EMPTY - [8:8] - read-only - - - DREQ_EN - If 1: assert DMA requests when FIFO contains data - [3:3] - read-write - - - ERR - If 1: conversion error bit appears in the FIFO alongside the result - [2:2] - read-write - - - SHIFT - If 1: FIFO results are right-shifted to be one byte in size. Enables DMA to byte buffers. - [1:1] - read-write - - - EN - If 1: write result to the FIFO after each conversion. - [0:0] - read-write - - - - - FIFO - Conversion result FIFO - 0xC - 0x00000000 - - - ERR - 1 if this particular sample experienced a conversion error. Remains in the same location if the sample is shifted. - [15:15] - read-only - - - VAL - [11:0] - read-only - - - - - DIV - Clock divider. If non-zero, CS_START_MANY will start conversions\n - at regular intervals rather than back-to-back.\n - The divider is reset when either of these fields are written.\n - Total period is 1 + INT + FRAC / 256 - 0x10 - 0x00000000 - - - INT - Integer part of clock divisor. - [23:8] - read-write - - - FRAC - Fractional part of clock divisor. First-order delta-sigma. - [7:0] - read-write - - - - - INTR - Raw Interrupts - 0x14 - 0x00000000 - - - FIFO - Triggered when the sample FIFO reaches a certain level.\n - This level can be programmed via the FCS_THRESH field. - [0:0] - read-only - - - - - INTE - Interrupt Enable - 0x18 - 0x00000000 - - - FIFO - Triggered when the sample FIFO reaches a certain level.\n - This level can be programmed via the FCS_THRESH field. - [0:0] - read-write - - - - - INTF - Interrupt Force - 0x1C - 0x00000000 - - - FIFO - Triggered when the sample FIFO reaches a certain level.\n - This level can be programmed via the FCS_THRESH field. - [0:0] - read-write - - - - - INTS - Interrupt status after masking & forcing - 0x20 - 0x00000000 - - - FIFO - Triggered when the sample FIFO reaches a certain level.\n - This level can be programmed via the FCS_THRESH field. - [0:0] - read-only - - - - - - - PWM - 1 - Simple PWM - 0x40050000 - 0x20 - - 0x0 - 0x1000 - registers - - - PWM_IRQ_WRAP - 4 - - - - 8 - 0x14 - 0-7 - CH%s - Cluster CH%s, containing CH*_CC, CH*_CSR, CH*_CTR, CH*_DIV, CH*_TOP - 0x0 - - CC - Counter compare values - 0xC - 0x00000000 - - - B - [31:16] - read-write - - - A - [15:0] - read-write - - - - - CSR - Control and status register - 0x0 - 0x00000000 - - - PH_ADV - Advance the phase of the counter by 1 count, while it is running.\n - Self-clearing. Write a 1, and poll until low. Counter must be running\n - at less than full speed (div_int + div_frac / 16 > 1) - [7:7] - read-write - clear - - - PH_RET - Retard the phase of the counter by 1 count, while it is running.\n - Self-clearing. Write a 1, and poll until low. Counter must be running. - [6:6] - read-write - clear - - - DIVMODE - [5:4] - read-write - - - div - Free-running counting at rate dictated by fractional divider - 0 - - - level - Fractional divider operation is gated by the PWM B pin. - 1 - - - rise - Counter advances with each rising edge of the PWM B pin. - 2 - - - fall - Counter advances with each falling edge of the PWM B pin. - 3 - - - - - B_INV - Invert output B - [3:3] - read-write - - - A_INV - Invert output A - [2:2] - read-write - - - PH_CORRECT - 1: Enable phase-correct modulation. 0: Trailing-edge - [1:1] - read-write - - - EN - Enable the PWM channel. - [0:0] - read-write - - - - - CTR - Direct access to the PWM counter - 0x8 - 0x00000000 - - - CTR - [15:0] - read-write - - - - - DIV - INT and FRAC form a fixed-point fractional number.\n - Counting rate is system clock frequency divided by this number.\n - Fractional division uses simple 1st-order sigma-delta. - 0x4 - 0x00000010 - - - INT - [11:4] - read-write - - - FRAC - [3:0] - read-write - - - - - TOP - Counter wrap value - 0x10 - 0x0000FFFF - - - TOP - [15:0] - read-write - - - - - - EN - This register aliases the CSR_EN bits for all channels.\n - Writing to this register allows multiple channels to be enabled\n - or disabled simultaneously, so they can run in perfect sync.\n - For each channel, there is only one physical EN register bit,\n - which can be accessed through here or CHx_CSR. - 0xA0 - 0x00000000 - - - CH7 - [7:7] - read-write - - - CH6 - [6:6] - read-write - - - CH5 - [5:5] - read-write - - - CH4 - [4:4] - read-write - - - CH3 - [3:3] - read-write - - - CH2 - [2:2] - read-write - - - CH1 - [1:1] - read-write - - - CH0 - [0:0] - read-write - - - - - INTR - Raw Interrupts - 0xA4 - 0x00000000 - - - CH7 - [7:7] - read-write - oneToClear - - - CH6 - [6:6] - read-write - oneToClear - - - CH5 - [5:5] - read-write - oneToClear - - - CH4 - [4:4] - read-write - oneToClear - - - CH3 - [3:3] - read-write - oneToClear - - - CH2 - [2:2] - read-write - oneToClear - - - CH1 - [1:1] - read-write - oneToClear - - - CH0 - [0:0] - read-write - oneToClear - - - - - INTE - Interrupt Enable - 0xA8 - 0x00000000 - - - CH7 - [7:7] - read-write - - - CH6 - [6:6] - read-write - - - CH5 - [5:5] - read-write - - - CH4 - [4:4] - read-write - - - CH3 - [3:3] - read-write - - - CH2 - [2:2] - read-write - - - CH1 - [1:1] - read-write - - - CH0 - [0:0] - read-write - - - - - INTF - Interrupt Force - 0xAC - 0x00000000 - - - CH7 - [7:7] - read-write - - - CH6 - [6:6] - read-write - - - CH5 - [5:5] - read-write - - - CH4 - [4:4] - read-write - - - CH3 - [3:3] - read-write - - - CH2 - [2:2] - read-write - - - CH1 - [1:1] - read-write - - - CH0 - [0:0] - read-write - - - - - INTS - Interrupt status after masking & forcing - 0xB0 - 0x00000000 - - - CH7 - [7:7] - read-only - - - CH6 - [6:6] - read-only - - - CH5 - [5:5] - read-only - - - CH4 - [4:4] - read-only - - - CH3 - [3:3] - read-only - - - CH2 - [2:2] - read-only - - - CH1 - [1:1] - read-only - - - CH0 - [0:0] - read-only - - - - - - - TIMER - 1 - Controls time and alarms\n - time is a 64 bit value indicating the time in usec since power-on\n - timeh is the top 32 bits of time & timel is the bottom 32 bits\n - to change time write to timelw before timehw\n - to read time read from timelr before timehr\n - An alarm is set by setting alarm_enable and writing to the corresponding alarm register\n - When an alarm is pending, the corresponding alarm_running signal will be high\n - An alarm can be cancelled before it has finished by clearing the alarm_enable\n - When an alarm fires, the corresponding alarm_irq is set and alarm_running is cleared\n - To clear the interrupt write a 1 to the corresponding alarm_irq - 0x40054000 - 0x20 - - 0x0 - 0x1000 - registers - - - TIMER_IRQ_0 - 0 - - - TIMER_IRQ_1 - 1 - - - TIMER_IRQ_2 - 2 - - - TIMER_IRQ_3 - 3 - - - - TIMEHW - Write to bits 63:32 of time\n - always write timelw before timehw - 0x0 - write-only - 0x00000000 - - - TIMELW - Write to bits 31:0 of time\n - writes do not get copied to time until timehw is written - 0x4 - write-only - 0x00000000 - - - TIMEHR - Read from bits 63:32 of time\n - always read timelr before timehr - 0x8 - read-only - 0x00000000 - - - TIMELR - Read from bits 31:0 of time - 0xC - read-only - 0x00000000 - - - ALARM0 - Arm alarm 0, and configure the time it will fire.\n - Once armed, the alarm fires when TIMER_ALARM0 == TIMELR.\n - The alarm will disarm itself once it fires, and can\n - be disarmed early using the ARMED status register. - 0x10 - read-write - 0x00000000 - - - ALARM1 - Arm alarm 1, and configure the time it will fire.\n - Once armed, the alarm fires when TIMER_ALARM1 == TIMELR.\n - The alarm will disarm itself once it fires, and can\n - be disarmed early using the ARMED status register. - 0x14 - read-write - 0x00000000 - - - ALARM2 - Arm alarm 2, and configure the time it will fire.\n - Once armed, the alarm fires when TIMER_ALARM2 == TIMELR.\n - The alarm will disarm itself once it fires, and can\n - be disarmed early using the ARMED status register. - 0x18 - read-write - 0x00000000 - - - ALARM3 - Arm alarm 3, and configure the time it will fire.\n - Once armed, the alarm fires when TIMER_ALARM3 == TIMELR.\n - The alarm will disarm itself once it fires, and can\n - be disarmed early using the ARMED status register. - 0x1C - read-write - 0x00000000 - - - ARMED - Indicates the armed/disarmed status of each alarm.\n - A write to the corresponding ALARMx register arms the alarm.\n - Alarms automatically disarm upon firing, but writing ones here\n - will disarm immediately without waiting to fire. - 0x20 - 0x00000000 - - - ARMED - [3:0] - read-write - oneToClear - - - - - TIMERAWH - Raw read from bits 63:32 of time (no side effects) - 0x24 - read-only - 0x00000000 - - - TIMERAWL - Raw read from bits 31:0 of time (no side effects) - 0x28 - read-only - 0x00000000 - - - DBGPAUSE - Set bits high to enable pause when the corresponding debug ports are active - 0x2C - 0x00000007 - - - DBG1 - Pause when processor 1 is in debug mode - [2:2] - read-write - - - DBG0 - Pause when processor 0 is in debug mode - [1:1] - read-write - - - - - PAUSE - Set high to pause the timer - 0x30 - 0x00000000 - - - PAUSE - [0:0] - read-write - - - - - INTR - Raw Interrupts - 0x34 - 0x00000000 - - - ALARM_3 - [3:3] - read-write - oneToClear - - - ALARM_2 - [2:2] - read-write - oneToClear - - - ALARM_1 - [1:1] - read-write - oneToClear - - - ALARM_0 - [0:0] - read-write - oneToClear - - - - - INTE - Interrupt Enable - 0x38 - 0x00000000 - - - ALARM_3 - [3:3] - read-write - - - ALARM_2 - [2:2] - read-write - - - ALARM_1 - [1:1] - read-write - - - ALARM_0 - [0:0] - read-write - - - - - INTF - Interrupt Force - 0x3C - 0x00000000 - - - ALARM_3 - [3:3] - read-write - - - ALARM_2 - [2:2] - read-write - - - ALARM_1 - [1:1] - read-write - - - ALARM_0 - [0:0] - read-write - - - - - INTS - Interrupt status after masking & forcing - 0x40 - 0x00000000 - - - ALARM_3 - [3:3] - read-only - - - ALARM_2 - [2:2] - read-only - - - ALARM_1 - [1:1] - read-only - - - ALARM_0 - [0:0] - read-only - - - - - - - WATCHDOG - 1 - 0x40058000 - 0x20 - - 0x0 - 0x1000 - registers - - - - CTRL - Watchdog control\n - The rst_wdsel register determines which subsystems are reset when the watchdog is triggered.\n - The watchdog can be triggered in software. - 0x0 - 0x07000000 - - - TRIGGER - Trigger a watchdog reset - [31:31] - read-write - clear - - - ENABLE - When not enabled the watchdog timer is paused - [30:30] - read-write - - - PAUSE_DBG1 - Pause the watchdog timer when processor 1 is in debug mode - [26:26] - read-write - - - PAUSE_DBG0 - Pause the watchdog timer when processor 0 is in debug mode - [25:25] - read-write - - - PAUSE_JTAG - Pause the watchdog timer when JTAG is accessing the bus fabric - [24:24] - read-write - - - TIME - Indicates the number of ticks / 2 (see errata RP2040-E1) before a watchdog reset will be triggered - [23:0] - read-only - - - - - LOAD - Load the watchdog timer. The maximum setting is 0xffffff which corresponds to 0xffffff / 2 ticks before triggering a watchdog reset (see errata RP2040-E1). - 0x4 - 0x00000000 - - - LOAD - [23:0] - write-only - - - - - REASON - Logs the reason for the last reset. Both bits are zero for the case of a hardware reset. - 0x8 - 0x00000000 - - - FORCE - [1:1] - read-only - - - TIMER - [0:0] - read-only - - - - - SCRATCH0 - Scratch register. Information persists through soft reset of the chip. - 0xC - read-write - 0x00000000 - - - SCRATCH1 - Scratch register. Information persists through soft reset of the chip. - 0x10 - read-write - 0x00000000 - - - SCRATCH2 - Scratch register. Information persists through soft reset of the chip. - 0x14 - read-write - 0x00000000 - - - SCRATCH3 - Scratch register. Information persists through soft reset of the chip. - 0x18 - read-write - 0x00000000 - - - SCRATCH4 - Scratch register. Information persists through soft reset of the chip. - 0x1C - read-write - 0x00000000 - - - SCRATCH5 - Scratch register. Information persists through soft reset of the chip. - 0x20 - read-write - 0x00000000 - - - SCRATCH6 - Scratch register. Information persists through soft reset of the chip. - 0x24 - read-write - 0x00000000 - - - SCRATCH7 - Scratch register. Information persists through soft reset of the chip. - 0x28 - read-write - 0x00000000 - - - TICK - Controls the tick generator - 0x2C - 0x00000200 - - - COUNT - Count down timer: the remaining number clk_tick cycles before the next tick is generated. - [19:11] - read-only - - - RUNNING - Is the tick generator running? - [10:10] - read-only - - - ENABLE - start / stop tick generation - [9:9] - read-write - - - CYCLES - Total number of clk_tick cycles before the next tick. - [8:0] - read-write - - - - - - - RTC - 1 - Register block to control RTC - 0x4005C000 - 0x20 - - 0x0 - 0x1000 - registers - - - RTC_IRQ - 25 - - - - CLKDIV_M1 - Divider minus 1 for the 1 second counter. Safe to change the value when RTC is not enabled. - 0x0 - 0x00000000 - - - CLKDIV_M1 - [15:0] - read-write - - - - - SETUP_0 - RTC setup register 0 - 0x4 - 0x00000000 - - - YEAR - Year - [23:12] - read-write - - - MONTH - Month (1..12) - [11:8] - read-write - - - DAY - Day of the month (1..31) - [4:0] - read-write - - - - - SETUP_1 - RTC setup register 1 - 0x8 - 0x00000000 - - - DOTW - Day of the week: 1-Monday...0-Sunday ISO 8601 mod 7 - [26:24] - read-write - - - HOUR - Hours - [20:16] - read-write - - - MIN - Minutes - [13:8] - read-write - - - SEC - Seconds - [5:0] - read-write - - - - - CTRL - RTC Control and status - 0xC - 0x00000000 - - - FORCE_NOTLEAPYEAR - If set, leapyear is forced off.\n - Useful for years divisible by 100 but not by 400 - [8:8] - read-write - - - LOAD - Load RTC - [4:4] - read-write - clear - - - RTC_ACTIVE - RTC enabled (running) - [1:1] - read-only - - - RTC_ENABLE - Enable RTC - [0:0] - read-write - - - - - IRQ_SETUP_0 - Interrupt setup register 0 - 0x10 - 0x00000000 - - - MATCH_ACTIVE - [29:29] - read-only - - - MATCH_ENA - Global match enable. Don't change any other value while this one is enabled - [28:28] - read-write - - - YEAR_ENA - Enable year matching - [26:26] - read-write - - - MONTH_ENA - Enable month matching - [25:25] - read-write - - - DAY_ENA - Enable day matching - [24:24] - read-write - - - YEAR - Year - [23:12] - read-write - - - MONTH - Month (1..12) - [11:8] - read-write - - - DAY - Day of the month (1..31) - [4:0] - read-write - - - - - IRQ_SETUP_1 - Interrupt setup register 1 - 0x14 - 0x00000000 - - - DOTW_ENA - Enable day of the week matching - [31:31] - read-write - - - HOUR_ENA - Enable hour matching - [30:30] - read-write - - - MIN_ENA - Enable minute matching - [29:29] - read-write - - - SEC_ENA - Enable second matching - [28:28] - read-write - - - DOTW - Day of the week - [26:24] - read-write - - - HOUR - Hours - [20:16] - read-write - - - MIN - Minutes - [13:8] - read-write - - - SEC - Seconds - [5:0] - read-write - - - - - RTC_1 - RTC register 1. - 0x18 - 0x00000000 - - - YEAR - Year - [23:12] - read-only - - - MONTH - Month (1..12) - [11:8] - read-only - - - DAY - Day of the month (1..31) - [4:0] - read-only - - - - - RTC_0 - RTC register 0\n - Read this before RTC 1! - 0x1C - 0x00000000 - - - DOTW - Day of the week - [26:24] - read-only - - - HOUR - Hours - [20:16] - read-only - - - MIN - Minutes - [13:8] - read-only - - - SEC - Seconds - [5:0] - read-only - - - - - INTR - Raw Interrupts - 0x20 - 0x00000000 - - - RTC - [0:0] - read-only - - - - - INTE - Interrupt Enable - 0x24 - 0x00000000 - - - RTC - [0:0] - read-write - - - - - INTF - Interrupt Force - 0x28 - 0x00000000 - - - RTC - [0:0] - read-write - - - - - INTS - Interrupt status after masking & forcing - 0x2C - 0x00000000 - - - RTC - [0:0] - read-only - - - - - - - ROSC - 1 - 0x40060000 - 0x20 - - 0x0 - 0x1000 - registers - - - - CTRL - Ring Oscillator control - 0x0 - 0x00000AA0 - - - ENABLE - On power-up this field is initialised to ENABLE\n - The system clock must be switched to another source before setting this field to DISABLE otherwise the chip will lock up\n - The 12-bit code is intended to give some protection against accidental writes. An invalid setting will enable the oscillator. - [23:12] - read-write - - - DISABLE - 3358 - - - ENABLE - 4011 - - - - - FREQ_RANGE - Controls the number of delay stages in the ROSC ring\n - LOW uses stages 0 to 7\n - MEDIUM uses stages 0 to 5\n - HIGH uses stages 0 to 3\n - TOOHIGH uses stages 0 to 1 and should not be used because its frequency exceeds design specifications\n - The clock output will not glitch when changing the range up one step at a time\n - The clock output will glitch when changing the range down\n - Note: the values here are gray coded which is why HIGH comes before TOOHIGH - [11:0] - read-write - - - LOW - 4004 - - - MEDIUM - 4005 - - - HIGH - 4007 - - - TOOHIGH - 4006 - - - - - - - FREQA - The FREQA & FREQB registers control the frequency by controlling the drive strength of each stage\n - The drive strength has 4 levels determined by the number of bits set\n - Increasing the number of bits set increases the drive strength and increases the oscillation frequency\n - 0 bits set is the default drive strength\n - 1 bit set doubles the drive strength\n - 2 bits set triples drive strength\n - 3 bits set quadruples drive strength - 0x4 - 0x00000000 - - - PASSWD - Set to 0x9696 to apply the settings\n - Any other value in this field will set all drive strengths to 0 - [31:16] - read-write - - - PASS - 38550 - - - - - DS3 - Stage 3 drive strength - [14:12] - read-write - - - DS2 - Stage 2 drive strength - [10:8] - read-write - - - DS1 - Stage 1 drive strength - [6:4] - read-write - - - DS0 - Stage 0 drive strength - [2:0] - read-write - - - - - FREQB - For a detailed description see freqa register - 0x8 - 0x00000000 - - - PASSWD - Set to 0x9696 to apply the settings\n - Any other value in this field will set all drive strengths to 0 - [31:16] - read-write - - - PASS - 38550 - - - - - DS7 - Stage 7 drive strength - [14:12] - read-write - - - DS6 - Stage 6 drive strength - [10:8] - read-write - - - DS5 - Stage 5 drive strength - [6:4] - read-write - - - DS4 - Stage 4 drive strength - [2:0] - read-write - - - - - DORMANT - Ring Oscillator pause control\n - This is used to save power by pausing the ROSC\n - On power-up this field is initialised to WAKE\n - An invalid write will also select WAKE\n - Warning: setup the irq before selecting dormant mode - 0xC - read-write - 0x00000000 - - - DIV - Controls the output divider - 0x10 - 0x00000000 - - - DIV - set to 0xaa0 + div where\n - div = 0 divides by 32\n - div = 1-31 divides by div\n - any other value sets div=31\n - this register resets to div=16 - [11:0] - read-write - - - PASS - 2720 - - - - - - - PHASE - Controls the phase shifted output - 0x14 - 0x00000008 - - - PASSWD - set to 0xaa\n - any other value enables the output with shift=0 - [11:4] - read-write - - - ENABLE - enable the phase-shifted output\n - this can be changed on-the-fly - [3:3] - read-write - - - FLIP - invert the phase-shifted output\n - this is ignored when div=1 - [2:2] - read-write - - - SHIFT - phase shift the phase-shifted output by SHIFT input clocks\n - this can be changed on-the-fly\n - must be set to 0 before setting div=1 - [1:0] - read-write - - - - - RANDOMBIT - This just reads the state of the oscillator output so randomness is compromised if the ring oscillator is stopped or run at a harmonic of the bus frequency - 0x1C - 0x00000001 - - - RANDOMBIT - [0:0] - read-only - - - - - STATUS - Ring Oscillator Status - 0x18 - 0x00000000 - - - STABLE - Oscillator is running and stable - 31 - 1 - read-only - - - DIV_RUNNING - post-divider is running - this resets to 0 but transitions to 1 during chip startup - 16 - 1 - read-only - - - ENABLED - Oscillator is enabled but not necessarily running and stable - this resets to 0 but transitions to 1 during chip startup - 12 - 1 - read-only - - - - - - - VREG_AND_CHIP_RESET - 1 - control and status for on-chip voltage regulator and chip level reset subsystem - 0x40064000 - 0x20 - - 0x0 - 0x1000 - registers - - - - VREG - Voltage regulator control and status - 0x0 - 0x000000B1 - - - ROK - regulation status\n - 0=not in regulation, 1=in regulation - [12:12] - read-only - - - VSEL - Output voltage select for on-chip voltage regulator. - [7:4] - read-write - - VSEL - - Voltage0_80 - 0.80V - 5 - - - Voltage0_85 - 0.85V - 6 - - - Voltage0_90 - 0.90V - 7 - - - Voltage0_95 - 0.95V - 8 - - - Voltage1_00 - 1.00V - 9 - - - Voltage1_05 - 1.05V - 10 - - - Voltage1_10 - 1.10V (default) - 11 - - - Voltage1_15 - 1.15V - 12 - - - Voltage1_20 - 1.20V - 13 - - - Voltage1_25 - 1.25V - 14 - - - Voltage1_30 - 1.30V - 15 - - - - - HIZ - high impedance mode select\n - 0=not in high impedance mode, 1=in high impedance mode - [1:1] - read-write - - - EN - enable\n - 0=not enabled, 1=enabled - [0:0] - read-write - - - - - BOD - brown-out detection control - 0x4 - 0x00000091 - - - VSEL - threshold select\n - 0000 - 0.473V\n - 0001 - 0.516V\n - 0010 - 0.559V\n - 0011 - 0.602V\n - 0100 - 0.645V\n - 0101 - 0.688V\n - 0110 - 0.731V\n - 0111 - 0.774V\n - 1000 - 0.817V\n - 1001 - 0.860V (default)\n - 1010 - 0.903V\n - 1011 - 0.946V\n - 1100 - 0.989V\n - 1101 - 1.032V\n - 1110 - 1.075V\n - 1111 - 1.118V - [7:4] - read-write - - - EN - enable\n - 0=not enabled, 1=enabled - [0:0] - read-write - - - - - CHIP_RESET - Chip reset control and status - 0x8 - 0x00000000 - - - PSM_RESTART_FLAG - This is set by psm_restart from the debugger.\n - Its purpose is to branch bootcode to a safe mode when the debugger has issued a psm_restart in order to recover from a boot lock-up.\n - In the safe mode the debugger can repair the boot code, clear this flag then reboot the processor. - [24:24] - read-write - oneToClear - - - HAD_PSM_RESTART - Last reset was from the debug port - [20:20] - read-only - - - HAD_RUN - Last reset was from the RUN pin - [16:16] - read-only - - - HAD_POR - Last reset was from the power-on reset or brown-out detection blocks - [8:8] - read-only - - - - - - - TBMAN - 1 - Testbench manager. Allows the programmer to know what platform their software is running on. - 0x4006C000 - 0x20 - - 0x0 - 0x1000 - registers - - - - PLATFORM - Indicates the type of platform in use - 0x0 - 0x00000005 - - - FPGA - Indicates the platform is an FPGA - [1:1] - read-only - - - ASIC - Indicates the platform is an ASIC - [0:0] - read-only - - - - - - - DMA - 1 - DMA with separate read and write masters - 0x50000000 - 0x20 - - 0x0 - 0x1000 - registers - - - DMA_IRQ_0 - 11 - - - DMA_IRQ_1 - 12 - - - - 12 - 0x40 - 0-11 - CH%s - Cluster CH%s, containing CH?_READ_ADDR,CH??_READ_ADDR, CH?_WRITE_ADDR,CH??_WRITE_ADDR, CH?_TRANS_COUNT,CH??_TRANS_COUNT, CH?_CTRL_TRIG,CH??_CTRL_TRIG, CH?_AL1_CTRL,CH??_AL1_CTRL, CH?_AL1_READ_ADDR,CH??_AL1_READ_ADDR, CH?_AL1_WRITE_ADDR,CH??_AL1_WRITE_ADDR, CH?_AL1_TRANS_COUNT_TRIG,CH??_AL1_TRANS_COUNT_TRIG, CH?_AL2_CTRL,CH??_AL2_CTRL, CH?_AL2_TRANS_COUNT,CH??_AL2_TRANS_COUNT, CH?_AL2_READ_ADDR,CH??_AL2_READ_ADDR, CH?_AL2_WRITE_ADDR_TRIG,CH??_AL2_WRITE_ADDR_TRIG, CH?_AL3_CTRL,CH??_AL3_CTRL, CH?_AL3_WRITE_ADDR,CH??_AL3_WRITE_ADDR, CH?_AL3_TRANS_COUNT,CH??_AL3_TRANS_COUNT, CH?_AL3_READ_ADDR_TRIG,CH??_AL3_READ_ADDR_TRIG - 0x0 - - CH_READ_ADDR - DMA Channel 0 Read Address pointer\n - This register updates automatically each time a read completes. The current value is the next address to be read by this channel. - 0x0 - read-write - 0x00000000 - - - CH_WRITE_ADDR - DMA Channel 0 Write Address pointer\n - This register updates automatically each time a write completes. The current value is the next address to be written by this channel. - 0x4 - read-write - 0x00000000 - - - CH_TRANS_COUNT - DMA Channel 0 Transfer Count\n - Program the number of bus transfers a channel will perform before halting. Note that, if transfers are larger than one byte in size, this is not equal to the number of bytes transferred (see CTRL_DATA_SIZE).\n\n - When the channel is active, reading this register shows the number of transfers remaining, updating automatically each time a write transfer completes.\n\n - Writing this register sets the RELOAD value for the transfer counter. Each time this channel is triggered, the RELOAD value is copied into the live transfer counter. The channel can be started multiple times, and will perform the same number of transfers each time, as programmed by most recent write.\n\n - The RELOAD value can be observed at CHx_DBG_TCR. If TRANS_COUNT is used as a trigger, the written value is used immediately as the length of the new transfer sequence, as well as being written to RELOAD. - 0x8 - read-write - 0x00000000 - - - CH_CTRL_TRIG - DMA Channel 0 Control and Status - 0xC - 0x00000000 - - - AHB_ERROR - Logical OR of the READ_ERROR and WRITE_ERROR flags. The channel halts when it encounters any bus error, and always raises its channel IRQ flag. - [31:31] - read-only - - - READ_ERROR - If 1, the channel received a read bus error. Write one to clear.\n - READ_ADDR shows the approximate address where the bus error was encountered (will not be earlier, or more than 3 transfers later) - [30:30] - read-write - oneToClear - - - WRITE_ERROR - If 1, the channel received a write bus error. Write one to clear.\n - WRITE_ADDR shows the approximate address where the bus error was encountered (will not be earlier, or more than 5 transfers later) - [29:29] - read-write - oneToClear - - - BUSY - This flag goes high when the channel starts a new transfer sequence, and low when the last transfer of that sequence completes. Clearing EN while BUSY is high pauses the channel, and BUSY will stay high while paused.\n\n - To terminate a sequence early (and clear the BUSY flag), see CHAN_ABORT. - [24:24] - read-only - - - SNIFF_EN - If 1, this channel's data transfers are visible to the sniff hardware, and each transfer will advance the state of the checksum. This only applies if the sniff hardware is enabled, and has this channel selected.\n\n - This allows checksum to be enabled or disabled on a per-control- block basis. - [23:23] - read-write - - - BSWAP - Apply byte-swap transformation to DMA data.\n - For byte data, this has no effect. For halfword data, the two bytes of each halfword are swapped. For word data, the four bytes of each word are swapped to reverse order. - [22:22] - read-write - - - IRQ_QUIET - In QUIET mode, the channel does not generate IRQs at the end of every transfer block. Instead, an IRQ is raised when NULL is written to a trigger register, indicating the end of a control block chain.\n\n - This reduces the number of interrupts to be serviced by the CPU when transferring a DMA chain of many small control blocks. - [21:21] - read-write - - - TREQ_SEL - Select a Transfer Request signal.\n - The channel uses the transfer request signal to pace its data transfer rate. Sources for TREQ signals are internal (TIMERS) or external (DREQ, a Data Request from the system).\n - 0x0 to 0x3a -> select DREQ n as TREQ - [20:15] - read-write - - TREQ_SEL - - PIO0_TX0 - Select PIO0's TX FIFO 0 as TREQ - 0 - - - PIO0_TX1 - Select PIO0's TX FIFO 1 as TREQ - 1 - - - PIO0_TX2 - Select PIO0's TX FIFO 2 as TREQ - 2 - - - PIO0_TX3 - Select PIO0's TX FIFO 3 as TREQ - 3 - - - PIO0_RX0 - Select PIO0's RX FIFO 0 as TREQ - 4 - - - PIO0_RX1 - Select PIO0's RX FIFO 1 as TREQ - 5 - - - PIO0_RX2 - Select PIO0's RX FIFO 2 as TREQ - 6 - - - PIO0_RX3 - Select PIO0's RX FIFO 3 as TREQ - 7 - - - PIO1_TX0 - Select PIO1's TX FIFO 0 as TREQ - 8 - - - PIO1_TX1 - Select PIO1's TX FIFO 1 as TREQ - 9 - - - PIO1_TX2 - Select PIO1's TX FIFO 2 as TREQ - 10 - - - PIO1_TX3 - Select PIO1's TX FIFO 3 as TREQ - 11 - - - PIO1_RX0 - Select PIO1's RX FIFO 0 as TREQ - 12 - - - PIO1_RX1 - Select PIO1's RX FIFO 1 as TREQ - 13 - - - PIO1_RX2 - Select PIO1's RX FIFO 2 as TREQ - 14 - - - PIO1_RX3 - Select PIO1's RX FIFO 3 as TREQ - 15 - - - SPI0_TX - Select SPI0's TX FIFO as TREQ - 16 - - - SPI0_RX - Select SPI0's RX FIFO as TREQ - 17 - - - SPI1_TX - Select SPI1's TX FIFO as TREQ - 18 - - - SPI1_RX - Select SPI1's RX FIFO as TREQ - 19 - - - UART0_TX - Select UART0's TX FIFO as TREQ - 20 - - - UART0_RX - Select UART0's RX FIFO as TREQ - 21 - - - UART1_TX - Select UART1's TX FIFO as TREQ - 22 - - - UART1_RX - Select UART1's RX FIFO as TREQ - 23 - - - PWM_WRAP0 - Select PWM Counter 0's Wrap Value as TREQ - 24 - - - PWM_WRAP1 - Select PWM Counter 1's Wrap Value as TREQ - 25 - - - PWM_WRAP2 - Select PWM Counter 2's Wrap Value as TREQ - 26 - - - PWM_WRAP3 - Select PWM Counter 3's Wrap Value as TREQ - 27 - - - PWM_WRAP4 - Select PWM Counter 4's Wrap Value as TREQ - 28 - - - PWM_WRAP5 - Select PWM Counter 5's Wrap Value as TREQ - 29 - - - PWM_WRAP6 - Select PWM Counter 6's Wrap Value as TREQ - 30 - - - PWM_WRAP7 - Select PWM Counter 7's Wrap Value as TREQ - 31 - - - I2C0_TX - Select I2C0's TX FIFO as TREQ - 32 - - - I2C0_RX - Select I2C0's RX FIFO as TREQ - 33 - - - I2C1_TX - Select I2C1's TX FIFO as TREQ - 34 - - - I2C1_RX - Select I2C1's RX FIFO as TREQ - 35 - - - ADC - Select the ADC as TREQ - 36 - - - XIP_STREAM - Select the XIP Streaming FIFO as TREQ - 37 - - - XIP_SSITX - Select the XIP SSI TX FIFO as TREQ - 38 - - - XIP_SSIRX - Select the XIP SSI RX FIFO as TREQ - 39 - - - TIMER0 - Select Timer 0 as TREQ - 59 - - - TIMER1 - Select Timer 1 as TREQ - 60 - - - TIMER2 - Select Timer 2 as TREQ (Optional) - 61 - - - TIMER3 - Select Timer 3 as TREQ (Optional) - 62 - - - PERMANENT - Permanent request, for unpaced transfers. - 63 - - - - - CHAIN_TO - When this channel completes, it will trigger the channel indicated by CHAIN_TO. Disable by setting CHAIN_TO = _(this channel)_. \n Reset value is 0, which means for channels 1 and above the default will be to chain to channel 0 - set this field to avoid this behaviour. - [14:11] - read-write - - - RING_SEL - Select whether RING_SIZE applies to read or write addresses.\n - If 0, read addresses are wrapped on a (1 << RING_SIZE) boundary. If 1, write addresses are wrapped. - [10:10] - read-write - - - RING_SIZE - Size of address wrap region. If 0, don't wrap. For values n > 0, only the lower n bits of the address will change. This wraps the address on a (1 << n) byte boundary, facilitating access to naturally-aligned ring buffers.\n\n - Ring sizes between 2 and 32768 bytes are possible. This can apply to either read or write addresses, based on value of RING_SEL. - [9:6] - read-write - - - RING_NONE - 0 - - - - - INCR_WRITE - If 1, the write address increments with each transfer. If 0, each write is directed to the same, initial address.\n\n - Generally this should be disabled for memory-to-peripheral transfers. - [5:5] - read-write - - - INCR_READ - If 1, the read address increments with each transfer. If 0, each read is directed to the same, initial address.\n\n - Generally this should be disabled for peripheral-to-memory transfers. - [4:4] - read-write - - - DATA_SIZE - Set the size of each bus transfer (byte/halfword/word). READ_ADDR and WRITE_ADDR advance by this amount (1/2/4 bytes) with each transfer. - [3:2] - read-write - - - SIZE_BYTE - 0 - - - SIZE_HALFWORD - 1 - - - SIZE_WORD - 2 - - - - - HIGH_PRIORITY - HIGH_PRIORITY gives a channel preferential treatment in issue scheduling: in each scheduling round, all high priority channels are considered first, and then only a single low priority channel, before returning to the high priority channels.\n\n - This only affects the order in which the DMA schedules channels. The DMA's bus priority is not changed. If the DMA is not saturated then a low priority channel will see no loss of throughput. - [1:1] - read-write - - - EN - DMA Channel Enable.\n - When 1, the channel will respond to triggering events, which will cause it to become BUSY and start transferring data. When 0, the channel will ignore triggers, stop issuing transfers, and pause the current transfer sequence (i.e. BUSY will remain high if already high) - [0:0] - read-write - - - - - CH_AL1_CTRL - DMA Channel 0 Control and Status - 0x10 - 0x00000000 - - - AHB_ERROR - Logical OR of the READ_ERROR and WRITE_ERROR flags. The channel halts when it encounters any bus error, and always raises its channel IRQ flag. - [31:31] - read-only - - - READ_ERROR - If 1, the channel received a read bus error. Write one to clear.\n - READ_ADDR shows the approximate address where the bus error was encountered (will not be earlier, or more than 3 transfers later) - [30:30] - read-write - oneToClear - - - WRITE_ERROR - If 1, the channel received a write bus error. Write one to clear.\n - WRITE_ADDR shows the approximate address where the bus error was encountered (will not be earlier, or more than 5 transfers later) - [29:29] - read-write - oneToClear - - - BUSY - This flag goes high when the channel starts a new transfer sequence, and low when the last transfer of that sequence completes. Clearing EN while BUSY is high pauses the channel, and BUSY will stay high while paused.\n\n - To terminate a sequence early (and clear the BUSY flag), see CHAN_ABORT. - [24:24] - read-only - - - SNIFF_EN - If 1, this channel's data transfers are visible to the sniff hardware, and each transfer will advance the state of the checksum. This only applies if the sniff hardware is enabled, and has this channel selected.\n\n - This allows checksum to be enabled or disabled on a per-control- block basis. - [23:23] - read-write - - - BSWAP - Apply byte-swap transformation to DMA data.\n - For byte data, this has no effect. For halfword data, the two bytes of each halfword are swapped. For word data, the four bytes of each word are swapped to reverse order. - [22:22] - read-write - - - IRQ_QUIET - In QUIET mode, the channel does not generate IRQs at the end of every transfer block. Instead, an IRQ is raised when NULL is written to a trigger register, indicating the end of a control block chain.\n\n - This reduces the number of interrupts to be serviced by the CPU when transferring a DMA chain of many small control blocks. - [21:21] - read-write - - - TREQ_SEL - Select a Transfer Request signal.\n - The channel uses the transfer request signal to pace its data transfer rate. Sources for TREQ signals are internal (TIMERS) or external (DREQ, a Data Request from the system).\n - 0x0 to 0x3a -> select DREQ n as TREQ - [20:15] - read-write - - TREQ_SEL - - PIO0_TX0 - Select PIO0's TX FIFO 0 as TREQ - 0 - - - PIO0_TX1 - Select PIO0's TX FIFO 1 as TREQ - 1 - - - PIO0_TX2 - Select PIO0's TX FIFO 2 as TREQ - 2 - - - PIO0_TX3 - Select PIO0's TX FIFO 3 as TREQ - 3 - - - PIO0_RX0 - Select PIO0's RX FIFO 0 as TREQ - 4 - - - PIO0_RX1 - Select PIO0's RX FIFO 1 as TREQ - 5 - - - PIO0_RX2 - Select PIO0's RX FIFO 2 as TREQ - 6 - - - PIO0_RX3 - Select PIO0's RX FIFO 3 as TREQ - 7 - - - PIO1_TX0 - Select PIO1's TX FIFO 0 as TREQ - 8 - - - PIO1_TX1 - Select PIO1's TX FIFO 1 as TREQ - 9 - - - PIO1_TX2 - Select PIO1's TX FIFO 2 as TREQ - 10 - - - PIO1_TX3 - Select PIO1's TX FIFO 3 as TREQ - 11 - - - PIO1_RX0 - Select PIO1's RX FIFO 0 as TREQ - 12 - - - PIO1_RX1 - Select PIO1's RX FIFO 1 as TREQ - 13 - - - PIO1_RX2 - Select PIO1's RX FIFO 2 as TREQ - 14 - - - PIO1_RX3 - Select PIO1's RX FIFO 3 as TREQ - 15 - - - SPI0_TX - Select SPI0's TX FIFO as TREQ - 16 - - - SPI0_RX - Select SPI0's RX FIFO as TREQ - 17 - - - SPI1_TX - Select SPI1's TX FIFO as TREQ - 18 - - - SPI1_RX - Select SPI1's RX FIFO as TREQ - 19 - - - UART0_TX - Select UART0's TX FIFO as TREQ - 20 - - - UART0_RX - Select UART0's RX FIFO as TREQ - 21 - - - UART1_TX - Select UART1's TX FIFO as TREQ - 22 - - - UART1_RX - Select UART1's RX FIFO as TREQ - 23 - - - PWM_WRAP0 - Select PWM Counter 0's Wrap Value as TREQ - 24 - - - PWM_WRAP1 - Select PWM Counter 1's Wrap Value as TREQ - 25 - - - PWM_WRAP2 - Select PWM Counter 2's Wrap Value as TREQ - 26 - - - PWM_WRAP3 - Select PWM Counter 3's Wrap Value as TREQ - 27 - - - PWM_WRAP4 - Select PWM Counter 4's Wrap Value as TREQ - 28 - - - PWM_WRAP5 - Select PWM Counter 5's Wrap Value as TREQ - 29 - - - PWM_WRAP6 - Select PWM Counter 6's Wrap Value as TREQ - 30 - - - PWM_WRAP7 - Select PWM Counter 7's Wrap Value as TREQ - 31 - - - I2C0_TX - Select I2C0's TX FIFO as TREQ - 32 - - - I2C0_RX - Select I2C0's RX FIFO as TREQ - 33 - - - I2C1_TX - Select I2C1's TX FIFO as TREQ - 34 - - - I2C1_RX - Select I2C1's RX FIFO as TREQ - 35 - - - ADC - Select the ADC as TREQ - 36 - - - XIP_STREAM - Select the XIP Streaming FIFO as TREQ - 37 - - - XIP_SSITX - Select the XIP SSI TX FIFO as TREQ - 38 - - - XIP_SSIRX - Select the XIP SSI RX FIFO as TREQ - 39 - - - TIMER0 - Select Timer 0 as TREQ - 59 - - - TIMER1 - Select Timer 1 as TREQ - 60 - - - TIMER2 - Select Timer 2 as TREQ (Optional) - 61 - - - TIMER3 - Select Timer 3 as TREQ (Optional) - 62 - - - PERMANENT - Permanent request, for unpaced transfers. - 63 - - - - - CHAIN_TO - When this channel completes, it will trigger the channel indicated by CHAIN_TO. Disable by setting CHAIN_TO = _(this channel)_. \n Reset value is 0, which means for channels 1 and above the default will be to chain to channel 0 - set this field to avoid this behaviour. - [14:11] - read-write - - - RING_SEL - Select whether RING_SIZE applies to read or write addresses.\n - If 0, read addresses are wrapped on a (1 << RING_SIZE) boundary. If 1, write addresses are wrapped. - [10:10] - read-write - - - RING_SIZE - Size of address wrap region. If 0, don't wrap. For values n > 0, only the lower n bits of the address will change. This wraps the address on a (1 << n) byte boundary, facilitating access to naturally-aligned ring buffers.\n\n - Ring sizes between 2 and 32768 bytes are possible. This can apply to either read or write addresses, based on value of RING_SEL. - [9:6] - read-write - - - RING_NONE - 0 - - - - - INCR_WRITE - If 1, the write address increments with each transfer. If 0, each write is directed to the same, initial address.\n\n - Generally this should be disabled for memory-to-peripheral transfers. - [5:5] - read-write - - - INCR_READ - If 1, the read address increments with each transfer. If 0, each read is directed to the same, initial address.\n\n - Generally this should be disabled for peripheral-to-memory transfers. - [4:4] - read-write - - - DATA_SIZE - Set the size of each bus transfer (byte/halfword/word). READ_ADDR and WRITE_ADDR advance by this amount (1/2/4 bytes) with each transfer. - [3:2] - read-write - - - SIZE_BYTE - 0 - - - SIZE_HALFWORD - 1 - - - SIZE_WORD - 2 - - - - - HIGH_PRIORITY - HIGH_PRIORITY gives a channel preferential treatment in issue scheduling: in each scheduling round, all high priority channels are considered first, and then only a single low priority channel, before returning to the high priority channels.\n\n - This only affects the order in which the DMA schedules channels. The DMA's bus priority is not changed. If the DMA is not saturated then a low priority channel will see no loss of throughput. - [1:1] - read-write - - - EN - DMA Channel Enable.\n - When 1, the channel will respond to triggering events, which will cause it to become BUSY and start transferring data. When 0, the channel will ignore triggers, stop issuing transfers, and pause the current transfer sequence (i.e. BUSY will remain high if already high) - [0:0] - read-write - - - - - CH_AL1_READ_ADDR - Alias for channel 0 READ_ADDR register - 0x14 - read-write - 0x00000000 - - - CH_AL1_WRITE_ADDR - Alias for channel 0 WRITE_ADDR register - 0x18 - read-write - 0x00000000 - - - CH_AL1_TRANS_COUNT_TRIG - Alias for channel 0 TRANS_COUNT register\n - This is a trigger register (0xc). Writing a nonzero value will\n - reload the channel counter and start the channel. - 0x1C - read-write - 0x00000000 - - - CH_AL2_CTRL - DMA Channel 0 Control and Status - 0x20 - 0x00000000 - - - AHB_ERROR - Logical OR of the READ_ERROR and WRITE_ERROR flags. The channel halts when it encounters any bus error, and always raises its channel IRQ flag. - [31:31] - read-only - - - READ_ERROR - If 1, the channel received a read bus error. Write one to clear.\n - READ_ADDR shows the approximate address where the bus error was encountered (will not be earlier, or more than 3 transfers later) - [30:30] - read-write - oneToClear - - - WRITE_ERROR - If 1, the channel received a write bus error. Write one to clear.\n - WRITE_ADDR shows the approximate address where the bus error was encountered (will not be earlier, or more than 5 transfers later) - [29:29] - read-write - oneToClear - - - BUSY - This flag goes high when the channel starts a new transfer sequence, and low when the last transfer of that sequence completes. Clearing EN while BUSY is high pauses the channel, and BUSY will stay high while paused.\n\n - To terminate a sequence early (and clear the BUSY flag), see CHAN_ABORT. - [24:24] - read-only - - - SNIFF_EN - If 1, this channel's data transfers are visible to the sniff hardware, and each transfer will advance the state of the checksum. This only applies if the sniff hardware is enabled, and has this channel selected.\n\n - This allows checksum to be enabled or disabled on a per-control- block basis. - [23:23] - read-write - - - BSWAP - Apply byte-swap transformation to DMA data.\n - For byte data, this has no effect. For halfword data, the two bytes of each halfword are swapped. For word data, the four bytes of each word are swapped to reverse order. - [22:22] - read-write - - - IRQ_QUIET - In QUIET mode, the channel does not generate IRQs at the end of every transfer block. Instead, an IRQ is raised when NULL is written to a trigger register, indicating the end of a control block chain.\n\n - This reduces the number of interrupts to be serviced by the CPU when transferring a DMA chain of many small control blocks. - [21:21] - read-write - - - TREQ_SEL - Select a Transfer Request signal.\n - The channel uses the transfer request signal to pace its data transfer rate. Sources for TREQ signals are internal (TIMERS) or external (DREQ, a Data Request from the system).\n - 0x0 to 0x3a -> select DREQ n as TREQ - [20:15] - read-write - - TREQ_SEL - - PIO0_TX0 - Select PIO0's TX FIFO 0 as TREQ - 0 - - - PIO0_TX1 - Select PIO0's TX FIFO 1 as TREQ - 1 - - - PIO0_TX2 - Select PIO0's TX FIFO 2 as TREQ - 2 - - - PIO0_TX3 - Select PIO0's TX FIFO 3 as TREQ - 3 - - - PIO0_RX0 - Select PIO0's RX FIFO 0 as TREQ - 4 - - - PIO0_RX1 - Select PIO0's RX FIFO 1 as TREQ - 5 - - - PIO0_RX2 - Select PIO0's RX FIFO 2 as TREQ - 6 - - - PIO0_RX3 - Select PIO0's RX FIFO 3 as TREQ - 7 - - - PIO1_TX0 - Select PIO1's TX FIFO 0 as TREQ - 8 - - - PIO1_TX1 - Select PIO1's TX FIFO 1 as TREQ - 9 - - - PIO1_TX2 - Select PIO1's TX FIFO 2 as TREQ - 10 - - - PIO1_TX3 - Select PIO1's TX FIFO 3 as TREQ - 11 - - - PIO1_RX0 - Select PIO1's RX FIFO 0 as TREQ - 12 - - - PIO1_RX1 - Select PIO1's RX FIFO 1 as TREQ - 13 - - - PIO1_RX2 - Select PIO1's RX FIFO 2 as TREQ - 14 - - - PIO1_RX3 - Select PIO1's RX FIFO 3 as TREQ - 15 - - - SPI0_TX - Select SPI0's TX FIFO as TREQ - 16 - - - SPI0_RX - Select SPI0's RX FIFO as TREQ - 17 - - - SPI1_TX - Select SPI1's TX FIFO as TREQ - 18 - - - SPI1_RX - Select SPI1's RX FIFO as TREQ - 19 - - - UART0_TX - Select UART0's TX FIFO as TREQ - 20 - - - UART0_RX - Select UART0's RX FIFO as TREQ - 21 - - - UART1_TX - Select UART1's TX FIFO as TREQ - 22 - - - UART1_RX - Select UART1's RX FIFO as TREQ - 23 - - - PWM_WRAP0 - Select PWM Counter 0's Wrap Value as TREQ - 24 - - - PWM_WRAP1 - Select PWM Counter 1's Wrap Value as TREQ - 25 - - - PWM_WRAP2 - Select PWM Counter 2's Wrap Value as TREQ - 26 - - - PWM_WRAP3 - Select PWM Counter 3's Wrap Value as TREQ - 27 - - - PWM_WRAP4 - Select PWM Counter 4's Wrap Value as TREQ - 28 - - - PWM_WRAP5 - Select PWM Counter 5's Wrap Value as TREQ - 29 - - - PWM_WRAP6 - Select PWM Counter 6's Wrap Value as TREQ - 30 - - - PWM_WRAP7 - Select PWM Counter 7's Wrap Value as TREQ - 31 - - - I2C0_TX - Select I2C0's TX FIFO as TREQ - 32 - - - I2C0_RX - Select I2C0's RX FIFO as TREQ - 33 - - - I2C1_TX - Select I2C1's TX FIFO as TREQ - 34 - - - I2C1_RX - Select I2C1's RX FIFO as TREQ - 35 - - - ADC - Select the ADC as TREQ - 36 - - - XIP_STREAM - Select the XIP Streaming FIFO as TREQ - 37 - - - XIP_SSITX - Select the XIP SSI TX FIFO as TREQ - 38 - - - XIP_SSIRX - Select the XIP SSI RX FIFO as TREQ - 39 - - - TIMER0 - Select Timer 0 as TREQ - 59 - - - TIMER1 - Select Timer 1 as TREQ - 60 - - - TIMER2 - Select Timer 2 as TREQ (Optional) - 61 - - - TIMER3 - Select Timer 3 as TREQ (Optional) - 62 - - - PERMANENT - Permanent request, for unpaced transfers. - 63 - - - - - CHAIN_TO - When this channel completes, it will trigger the channel indicated by CHAIN_TO. Disable by setting CHAIN_TO = _(this channel)_. \n Reset value is 0, which means for channels 1 and above the default will be to chain to channel 0 - set this field to avoid this behaviour. - [14:11] - read-write - - - RING_SEL - Select whether RING_SIZE applies to read or write addresses.\n - If 0, read addresses are wrapped on a (1 << RING_SIZE) boundary. If 1, write addresses are wrapped. - [10:10] - read-write - - - RING_SIZE - Size of address wrap region. If 0, don't wrap. For values n > 0, only the lower n bits of the address will change. This wraps the address on a (1 << n) byte boundary, facilitating access to naturally-aligned ring buffers.\n\n - Ring sizes between 2 and 32768 bytes are possible. This can apply to either read or write addresses, based on value of RING_SEL. - [9:6] - read-write - - - RING_NONE - 0 - - - - - INCR_WRITE - If 1, the write address increments with each transfer. If 0, each write is directed to the same, initial address.\n\n - Generally this should be disabled for memory-to-peripheral transfers. - [5:5] - read-write - - - INCR_READ - If 1, the read address increments with each transfer. If 0, each read is directed to the same, initial address.\n\n - Generally this should be disabled for peripheral-to-memory transfers. - [4:4] - read-write - - - DATA_SIZE - Set the size of each bus transfer (byte/halfword/word). READ_ADDR and WRITE_ADDR advance by this amount (1/2/4 bytes) with each transfer. - [3:2] - read-write - - - SIZE_BYTE - 0 - - - SIZE_HALFWORD - 1 - - - SIZE_WORD - 2 - - - - - HIGH_PRIORITY - HIGH_PRIORITY gives a channel preferential treatment in issue scheduling: in each scheduling round, all high priority channels are considered first, and then only a single low priority channel, before returning to the high priority channels.\n\n - This only affects the order in which the DMA schedules channels. The DMA's bus priority is not changed. If the DMA is not saturated then a low priority channel will see no loss of throughput. - [1:1] - read-write - - - EN - DMA Channel Enable.\n - When 1, the channel will respond to triggering events, which will cause it to become BUSY and start transferring data. When 0, the channel will ignore triggers, stop issuing transfers, and pause the current transfer sequence (i.e. BUSY will remain high if already high) - [0:0] - read-write - - - - - CH_AL2_TRANS_COUNT - Alias for channel 0 TRANS_COUNT register - 0x24 - read-write - 0x00000000 - - - CH_AL2_READ_ADDR - Alias for channel 0 READ_ADDR register - 0x28 - read-write - 0x00000000 - - - CH_AL2_WRITE_ADDR_TRIG - Alias for channel 0 WRITE_ADDR register\n - This is a trigger register (0xc). Writing a nonzero value will\n - reload the channel counter and start the channel. - 0x2C - read-write - 0x00000000 - - - CH_AL3_CTRL - DMA Channel 0 Control and Status - 0x30 - 0x00000000 - - - AHB_ERROR - Logical OR of the READ_ERROR and WRITE_ERROR flags. The channel halts when it encounters any bus error, and always raises its channel IRQ flag. - [31:31] - read-only - - - READ_ERROR - If 1, the channel received a read bus error. Write one to clear.\n - READ_ADDR shows the approximate address where the bus error was encountered (will not be earlier, or more than 3 transfers later) - [30:30] - read-write - oneToClear - - - WRITE_ERROR - If 1, the channel received a write bus error. Write one to clear.\n - WRITE_ADDR shows the approximate address where the bus error was encountered (will not be earlier, or more than 5 transfers later) - [29:29] - read-write - oneToClear - - - BUSY - This flag goes high when the channel starts a new transfer sequence, and low when the last transfer of that sequence completes. Clearing EN while BUSY is high pauses the channel, and BUSY will stay high while paused.\n\n - To terminate a sequence early (and clear the BUSY flag), see CHAN_ABORT. - [24:24] - read-only - - - SNIFF_EN - If 1, this channel's data transfers are visible to the sniff hardware, and each transfer will advance the state of the checksum. This only applies if the sniff hardware is enabled, and has this channel selected.\n\n - This allows checksum to be enabled or disabled on a per-control- block basis. - [23:23] - read-write - - - BSWAP - Apply byte-swap transformation to DMA data.\n - For byte data, this has no effect. For halfword data, the two bytes of each halfword are swapped. For word data, the four bytes of each word are swapped to reverse order. - [22:22] - read-write - - - IRQ_QUIET - In QUIET mode, the channel does not generate IRQs at the end of every transfer block. Instead, an IRQ is raised when NULL is written to a trigger register, indicating the end of a control block chain.\n\n - This reduces the number of interrupts to be serviced by the CPU when transferring a DMA chain of many small control blocks. - [21:21] - read-write - - - TREQ_SEL - Select a Transfer Request signal.\n - The channel uses the transfer request signal to pace its data transfer rate. Sources for TREQ signals are internal (TIMERS) or external (DREQ, a Data Request from the system).\n - 0x0 to 0x3a -> select DREQ n as TREQ - [20:15] - read-write - - TREQ_SEL - - PIO0_TX0 - Select PIO0's TX FIFO 0 as TREQ - 0 - - - PIO0_TX1 - Select PIO0's TX FIFO 1 as TREQ - 1 - - - PIO0_TX2 - Select PIO0's TX FIFO 2 as TREQ - 2 - - - PIO0_TX3 - Select PIO0's TX FIFO 3 as TREQ - 3 - - - PIO0_RX0 - Select PIO0's RX FIFO 0 as TREQ - 4 - - - PIO0_RX1 - Select PIO0's RX FIFO 1 as TREQ - 5 - - - PIO0_RX2 - Select PIO0's RX FIFO 2 as TREQ - 6 - - - PIO0_RX3 - Select PIO0's RX FIFO 3 as TREQ - 7 - - - PIO1_TX0 - Select PIO1's TX FIFO 0 as TREQ - 8 - - - PIO1_TX1 - Select PIO1's TX FIFO 1 as TREQ - 9 - - - PIO1_TX2 - Select PIO1's TX FIFO 2 as TREQ - 10 - - - PIO1_TX3 - Select PIO1's TX FIFO 3 as TREQ - 11 - - - PIO1_RX0 - Select PIO1's RX FIFO 0 as TREQ - 12 - - - PIO1_RX1 - Select PIO1's RX FIFO 1 as TREQ - 13 - - - PIO1_RX2 - Select PIO1's RX FIFO 2 as TREQ - 14 - - - PIO1_RX3 - Select PIO1's RX FIFO 3 as TREQ - 15 - - - SPI0_TX - Select SPI0's TX FIFO as TREQ - 16 - - - SPI0_RX - Select SPI0's RX FIFO as TREQ - 17 - - - SPI1_TX - Select SPI1's TX FIFO as TREQ - 18 - - - SPI1_RX - Select SPI1's RX FIFO as TREQ - 19 - - - UART0_TX - Select UART0's TX FIFO as TREQ - 20 - - - UART0_RX - Select UART0's RX FIFO as TREQ - 21 - - - UART1_TX - Select UART1's TX FIFO as TREQ - 22 - - - UART1_RX - Select UART1's RX FIFO as TREQ - 23 - - - PWM_WRAP0 - Select PWM Counter 0's Wrap Value as TREQ - 24 - - - PWM_WRAP1 - Select PWM Counter 1's Wrap Value as TREQ - 25 - - - PWM_WRAP2 - Select PWM Counter 2's Wrap Value as TREQ - 26 - - - PWM_WRAP3 - Select PWM Counter 3's Wrap Value as TREQ - 27 - - - PWM_WRAP4 - Select PWM Counter 4's Wrap Value as TREQ - 28 - - - PWM_WRAP5 - Select PWM Counter 5's Wrap Value as TREQ - 29 - - - PWM_WRAP6 - Select PWM Counter 6's Wrap Value as TREQ - 30 - - - PWM_WRAP7 - Select PWM Counter 7's Wrap Value as TREQ - 31 - - - I2C0_TX - Select I2C0's TX FIFO as TREQ - 32 - - - I2C0_RX - Select I2C0's RX FIFO as TREQ - 33 - - - I2C1_TX - Select I2C1's TX FIFO as TREQ - 34 - - - I2C1_RX - Select I2C1's RX FIFO as TREQ - 35 - - - ADC - Select the ADC as TREQ - 36 - - - XIP_STREAM - Select the XIP Streaming FIFO as TREQ - 37 - - - XIP_SSITX - Select the XIP SSI TX FIFO as TREQ - 38 - - - XIP_SSIRX - Select the XIP SSI RX FIFO as TREQ - 39 - - - TIMER0 - Select Timer 0 as TREQ - 59 - - - TIMER1 - Select Timer 1 as TREQ - 60 - - - TIMER2 - Select Timer 2 as TREQ (Optional) - 61 - - - TIMER3 - Select Timer 3 as TREQ (Optional) - 62 - - - PERMANENT - Permanent request, for unpaced transfers. - 63 - - - - - CHAIN_TO - When this channel completes, it will trigger the channel indicated by CHAIN_TO. Disable by setting CHAIN_TO = _(this channel)_. \n Reset value is 0, which means for channels 1 and above the default will be to chain to channel 0 - set this field to avoid this behaviour. - [14:11] - read-write - - - RING_SEL - Select whether RING_SIZE applies to read or write addresses.\n - If 0, read addresses are wrapped on a (1 << RING_SIZE) boundary. If 1, write addresses are wrapped. - [10:10] - read-write - - - RING_SIZE - Size of address wrap region. If 0, don't wrap. For values n > 0, only the lower n bits of the address will change. This wraps the address on a (1 << n) byte boundary, facilitating access to naturally-aligned ring buffers.\n\n - Ring sizes between 2 and 32768 bytes are possible. This can apply to either read or write addresses, based on value of RING_SEL. - [9:6] - read-write - - - RING_NONE - 0 - - - - - INCR_WRITE - If 1, the write address increments with each transfer. If 0, each write is directed to the same, initial address.\n\n - Generally this should be disabled for memory-to-peripheral transfers. - [5:5] - read-write - - - INCR_READ - If 1, the read address increments with each transfer. If 0, each read is directed to the same, initial address.\n\n - Generally this should be disabled for peripheral-to-memory transfers. - [4:4] - read-write - - - DATA_SIZE - Set the size of each bus transfer (byte/halfword/word). READ_ADDR and WRITE_ADDR advance by this amount (1/2/4 bytes) with each transfer. - [3:2] - read-write - - - SIZE_BYTE - 0 - - - SIZE_HALFWORD - 1 - - - SIZE_WORD - 2 - - - - - HIGH_PRIORITY - HIGH_PRIORITY gives a channel preferential treatment in issue scheduling: in each scheduling round, all high priority channels are considered first, and then only a single low priority channel, before returning to the high priority channels.\n\n - This only affects the order in which the DMA schedules channels. The DMA's bus priority is not changed. If the DMA is not saturated then a low priority channel will see no loss of throughput. - [1:1] - read-write - - - EN - DMA Channel Enable.\n - When 1, the channel will respond to triggering events, which will cause it to become BUSY and start transferring data. When 0, the channel will ignore triggers, stop issuing transfers, and pause the current transfer sequence (i.e. BUSY will remain high if already high) - [0:0] - read-write - - - - - CH_AL3_WRITE_ADDR - Alias for channel 0 WRITE_ADDR register - 0x34 - read-write - 0x00000000 - - - CH_AL3_TRANS_COUNT - Alias for channel 0 TRANS_COUNT register - 0x38 - read-write - 0x00000000 - - - CH_AL3_READ_ADDR_TRIG - Alias for channel 0 READ_ADDR register\n - This is a trigger register (0xc). Writing a nonzero value will\n - reload the channel counter and start the channel. - 0x3C - read-write - 0x00000000 - - - - INTR - Interrupt Status (raw) - 0x400 - 0x00000000 - - - INTR - Raw interrupt status for DMA Channels 0..15. Bit n corresponds to channel n. Ignores any masking or forcing. Channel interrupts can be cleared by writing a bit mask to INTR, INTS0 or INTS1.\n\n - Channel interrupts can be routed to either of two system-level IRQs based on INTE0 and INTE1.\n\n - This can be used vector different channel interrupts to different ISRs: this might be done to allow NVIC IRQ preemption for more time-critical channels, or to spread IRQ load across different cores.\n\n - It is also valid to ignore this behaviour and just use INTE0/INTS0/IRQ 0. - [15:0] - read-write - oneToClear - - - - - INTE0 - Interrupt Enables for IRQ 0 - 0x404 - 0x00000000 - - - INTE0 - Set bit n to pass interrupts from channel n to DMA IRQ 0. - [15:0] - read-write - - - - - INTF0 - Force Interrupts - 0x408 - 0x00000000 - - - INTF0 - Write 1s to force the corresponding bits in INTE0. The interrupt remains asserted until INTF0 is cleared. - [15:0] - read-write - - - - - INTS0 - Interrupt Status for IRQ 0 - 0x40C - 0x00000000 - - - INTS0 - Indicates active channel interrupt requests which are currently causing IRQ 0 to be asserted.\n - Channel interrupts can be cleared by writing a bit mask here. - [15:0] - read-write - oneToClear - - - - - INTE1 - Interrupt Enables for IRQ 1 - 0x414 - 0x00000000 - - - INTE1 - Set bit n to pass interrupts from channel n to DMA IRQ 1. - [15:0] - read-write - - - - - INTF1 - Force Interrupts for IRQ 1 - 0x418 - 0x00000000 - - - INTF1 - Write 1s to force the corresponding bits in INTE0. The interrupt remains asserted until INTF0 is cleared. - [15:0] - read-write - - - - - INTS1 - Interrupt Status (masked) for IRQ 1 - 0x41C - 0x00000000 - - - INTS1 - Indicates active channel interrupt requests which are currently causing IRQ 1 to be asserted.\n - Channel interrupts can be cleared by writing a bit mask here. - [15:0] - read-write - oneToClear - - - - - TIMER0 - Pacing (X/Y) Fractional Timer\n - The pacing timer produces TREQ assertions at a rate set by ((X/Y) * sys_clk). This equation is evaluated every sys_clk cycles and therefore can only generate TREQs at a rate of 1 per sys_clk (i.e. permanent TREQ) or less. - 0x420 - 0x00000000 - - - X - Pacing Timer Dividend. Specifies the X value for the (X/Y) fractional timer. - [31:16] - read-write - - - Y - Pacing Timer Divisor. Specifies the Y value for the (X/Y) fractional timer. - [15:0] - read-write - - - - - TIMER1 - Pacing (X/Y) Fractional Timer\n - The pacing timer produces TREQ assertions at a rate set by ((X/Y) * sys_clk). This equation is evaluated every sys_clk cycles and therefore can only generate TREQs at a rate of 1 per sys_clk (i.e. permanent TREQ) or less. - 0x424 - 0x00000000 - - - X - Pacing Timer Dividend. Specifies the X value for the (X/Y) fractional timer. - [31:16] - read-write - - - Y - Pacing Timer Divisor. Specifies the Y value for the (X/Y) fractional timer. - [15:0] - read-write - - - - - TIMER2 - Pacing (X/Y) Fractional Timer\n - The pacing timer produces TREQ assertions at a rate set by ((X/Y) * sys_clk). This equation is evaluated every sys_clk cycles and therefore can only generate TREQs at a rate of 1 per sys_clk (i.e. permanent TREQ) or less. - 0x428 - 0x00000000 - - - X - Pacing Timer Dividend. Specifies the X value for the (X/Y) fractional timer. - [31:16] - read-write - - - Y - Pacing Timer Divisor. Specifies the Y value for the (X/Y) fractional timer. - [15:0] - read-write - - - - - TIMER3 - Pacing (X/Y) Fractional Timer\n - The pacing timer produces TREQ assertions at a rate set by ((X/Y) * sys_clk). This equation is evaluated every sys_clk cycles and therefore can only generate TREQs at a rate of 1 per sys_clk (i.e. permanent TREQ) or less. - 0x42C - 0x00000000 - - - X - Pacing Timer Dividend. Specifies the X value for the (X/Y) fractional timer. - [31:16] - read-write - - - Y - Pacing Timer Divisor. Specifies the Y value for the (X/Y) fractional timer. - [15:0] - read-write - - - - - MULTI_CHAN_TRIGGER - Trigger one or more channels simultaneously - 0x430 - 0x00000000 - - - MULTI_CHAN_TRIGGER - Each bit in this register corresponds to a DMA channel. Writing a 1 to the relevant bit is the same as writing to that channel's trigger register; the channel will start if it is currently enabled and not already busy. - [15:0] - read-write - clear - - - - - SNIFF_CTRL - Sniffer Control - 0x434 - 0x00000000 - - - OUT_INV - If set, the result appears inverted (bitwise complement) when read. This does not affect the way the checksum is calculated; the result is transformed on-the-fly between the result register and the bus. - [11:11] - read-write - - - OUT_REV - If set, the result appears bit-reversed when read. This does not affect the way the checksum is calculated; the result is transformed on-the-fly between the result register and the bus. - [10:10] - read-write - - - BSWAP - Locally perform a byte reverse on the sniffed data, before feeding into checksum.\n\n - Note that the sniff hardware is downstream of the DMA channel byteswap performed in the read master: if channel CTRL_BSWAP and SNIFF_CTRL_BSWAP are both enabled, their effects cancel from the sniffer's point of view. - [9:9] - read-write - - - CALC - [8:5] - read-write - - - CRC32 - Calculate a CRC-32 (IEEE802.3 polynomial) - 0 - - - CRC32R - Calculate a CRC-32 (IEEE802.3 polynomial) with bit reversed data - 1 - - - CRC16 - Calculate a CRC-16-CCITT - 2 - - - CRC16R - Calculate a CRC-16-CCITT with bit reversed data - 3 - - - EVEN - XOR reduction over all data. == 1 if the total 1 population count is odd. - 14 - - - SUM - Calculate a simple 32-bit checksum (addition with a 32 bit accumulator) - 15 - - - - - DMACH - DMA channel for Sniffer to observe - [4:1] - read-write - - - EN - Enable sniffer - [0:0] - read-write - - - - - SNIFF_DATA - Data accumulator for sniff hardware\n - Write an initial seed value here before starting a DMA transfer on the channel indicated by SNIFF_CTRL_DMACH. The hardware will update this register each time it observes a read from the indicated channel. Once the channel completes, the final result can be read from this register. - 0x438 - read-write - 0x00000000 - - - FIFO_LEVELS - Debug RAF, WAF, TDF levels - 0x440 - 0x00000000 - - - RAF_LVL - Current Read-Address-FIFO fill level - [23:16] - read-only - - - WAF_LVL - Current Write-Address-FIFO fill level - [15:8] - read-only - - - TDF_LVL - Current Transfer-Data-FIFO fill level - [7:0] - read-only - - - - - CHAN_ABORT - Abort an in-progress transfer sequence on one or more channels - 0x444 - 0x00000000 - - - CHAN_ABORT - Each bit corresponds to a channel. Writing a 1 aborts whatever transfer sequence is in progress on that channel. The bit will remain high until any in-flight transfers have been flushed through the address and data FIFOs.\n\n - After writing, this register must be polled until it returns all-zero. Until this point, it is unsafe to restart the channel. - [15:0] - read-write - clear - - - - - N_CHANNELS - The number of channels this DMA instance is equipped with. This DMA supports up to 16 hardware channels, but can be configured with as few as one, to minimise silicon area. - 0x448 - 0x00000000 - - - N_CHANNELS - [4:0] - read-only - - - - - CH0_DBG_CTDREQ - Read: get channel DREQ counter (i.e. how many accesses the DMA expects it can perform on the peripheral without overflow/underflow. Write any value: clears the counter, and cause channel to re-initiate DREQ handshake. - 0x800 - 0x00000000 - - - CH0_DBG_CTDREQ - [5:0] - read-write - oneToClear - - - - - CH0_DBG_TCR - Read to get channel TRANS_COUNT reload value, i.e. the length of the next transfer - 0x804 - read-only - 0x00000000 - - - CH1_DBG_CTDREQ - Read: get channel DREQ counter (i.e. how many accesses the DMA expects it can perform on the peripheral without overflow/underflow. Write any value: clears the counter, and cause channel to re-initiate DREQ handshake. - 0x840 - 0x00000000 - - - CH1_DBG_CTDREQ - [5:0] - read-write - oneToClear - - - - - CH1_DBG_TCR - Read to get channel TRANS_COUNT reload value, i.e. the length of the next transfer - 0x844 - read-only - 0x00000000 - - - CH2_DBG_CTDREQ - Read: get channel DREQ counter (i.e. how many accesses the DMA expects it can perform on the peripheral without overflow/underflow. Write any value: clears the counter, and cause channel to re-initiate DREQ handshake. - 0x880 - 0x00000000 - - - CH2_DBG_CTDREQ - [5:0] - read-write - oneToClear - - - - - CH2_DBG_TCR - Read to get channel TRANS_COUNT reload value, i.e. the length of the next transfer - 0x884 - read-only - 0x00000000 - - - CH3_DBG_CTDREQ - Read: get channel DREQ counter (i.e. how many accesses the DMA expects it can perform on the peripheral without overflow/underflow. Write any value: clears the counter, and cause channel to re-initiate DREQ handshake. - 0x8C0 - 0x00000000 - - - CH3_DBG_CTDREQ - [5:0] - read-write - oneToClear - - - - - CH3_DBG_TCR - Read to get channel TRANS_COUNT reload value, i.e. the length of the next transfer - 0x8C4 - read-only - 0x00000000 - - - CH4_DBG_CTDREQ - Read: get channel DREQ counter (i.e. how many accesses the DMA expects it can perform on the peripheral without overflow/underflow. Write any value: clears the counter, and cause channel to re-initiate DREQ handshake. - 0x900 - 0x00000000 - - - CH4_DBG_CTDREQ - [5:0] - read-write - oneToClear - - - - - CH4_DBG_TCR - Read to get channel TRANS_COUNT reload value, i.e. the length of the next transfer - 0x904 - read-only - 0x00000000 - - - CH5_DBG_CTDREQ - Read: get channel DREQ counter (i.e. how many accesses the DMA expects it can perform on the peripheral without overflow/underflow. Write any value: clears the counter, and cause channel to re-initiate DREQ handshake. - 0x940 - 0x00000000 - - - CH5_DBG_CTDREQ - [5:0] - read-write - oneToClear - - - - - CH5_DBG_TCR - Read to get channel TRANS_COUNT reload value, i.e. the length of the next transfer - 0x944 - read-only - 0x00000000 - - - CH6_DBG_CTDREQ - Read: get channel DREQ counter (i.e. how many accesses the DMA expects it can perform on the peripheral without overflow/underflow. Write any value: clears the counter, and cause channel to re-initiate DREQ handshake. - 0x980 - 0x00000000 - - - CH6_DBG_CTDREQ - [5:0] - read-write - oneToClear - - - - - CH6_DBG_TCR - Read to get channel TRANS_COUNT reload value, i.e. the length of the next transfer - 0x984 - read-only - 0x00000000 - - - CH7_DBG_CTDREQ - Read: get channel DREQ counter (i.e. how many accesses the DMA expects it can perform on the peripheral without overflow/underflow. Write any value: clears the counter, and cause channel to re-initiate DREQ handshake. - 0x9C0 - 0x00000000 - - - CH7_DBG_CTDREQ - [5:0] - read-write - oneToClear - - - - - CH7_DBG_TCR - Read to get channel TRANS_COUNT reload value, i.e. the length of the next transfer - 0x9C4 - read-only - 0x00000000 - - - CH8_DBG_CTDREQ - Read: get channel DREQ counter (i.e. how many accesses the DMA expects it can perform on the peripheral without overflow/underflow. Write any value: clears the counter, and cause channel to re-initiate DREQ handshake. - 0xA00 - 0x00000000 - - - CH8_DBG_CTDREQ - [5:0] - read-write - oneToClear - - - - - CH8_DBG_TCR - Read to get channel TRANS_COUNT reload value, i.e. the length of the next transfer - 0xA04 - read-only - 0x00000000 - - - CH9_DBG_CTDREQ - Read: get channel DREQ counter (i.e. how many accesses the DMA expects it can perform on the peripheral without overflow/underflow. Write any value: clears the counter, and cause channel to re-initiate DREQ handshake. - 0xA40 - 0x00000000 - - - CH9_DBG_CTDREQ - [5:0] - read-write - oneToClear - - - - - CH9_DBG_TCR - Read to get channel TRANS_COUNT reload value, i.e. the length of the next transfer - 0xA44 - read-only - 0x00000000 - - - CH10_DBG_CTDREQ - Read: get channel DREQ counter (i.e. how many accesses the DMA expects it can perform on the peripheral without overflow/underflow. Write any value: clears the counter, and cause channel to re-initiate DREQ handshake. - 0xA80 - 0x00000000 - - - CH10_DBG_CTDREQ - [5:0] - read-write - oneToClear - - - - - CH10_DBG_TCR - Read to get channel TRANS_COUNT reload value, i.e. the length of the next transfer - 0xA84 - read-only - 0x00000000 - - - CH11_DBG_CTDREQ - Read: get channel DREQ counter (i.e. how many accesses the DMA expects it can perform on the peripheral without overflow/underflow. Write any value: clears the counter, and cause channel to re-initiate DREQ handshake. - 0xAC0 - 0x00000000 - - - CH11_DBG_CTDREQ - [5:0] - read-write - oneToClear - - - - - CH11_DBG_TCR - Read to get channel TRANS_COUNT reload value, i.e. the length of the next transfer - 0xAC4 - read-only - 0x00000000 - - - - - USBCTRL_DPRAM - 1 - DPRAM layout for USB device. - 0x50100000 - 0x20 - - 0x0 - 0x100 - registers - - - - SETUP_PACKET_LOW - Bytes 0-3 of the SETUP packet from the host. - 0x0 - 0x00000000 - - - WVALUE - [31:16] - read-write - - - BREQUEST - [15:8] - read-write - - - BMREQUESTTYPE - [7:0] - read-write - - - - - SETUP_PACKET_HIGH - Bytes 4-7 of the setup packet from the host. - 0x4 - 0x00000000 - - - WLENGTH - [31:16] - read-write - - - WINDEX - [15:0] - read-write - - - - - 30 - 0x4 - 0-29 - EP_CONTROL%s - - - 0x8 - 0x00000000 - - - ENABLE - Enable this endpoint. The device will not reply to any packets for this endpoint if this bit is not set. - [31:31] - read-write - - - DOUBLE_BUFFERED - This endpoint is double buffered. - [30:30] - read-write - - - INTERRUPT_PER_BUFF - Trigger an interrupt each time a buffer is done. - [29:29] - read-write - - - INTERRUPT_PER_DOUBLE_BUFF - Trigger an interrupt each time both buffers are done. Only valid in double buffered mode. - [28:28] - read-write - - - ENDPOINT_TYPE - [27:26] - read-write - - - Control - 0 - - - Isochronous - 1 - - - Bulk - 2 - - - Interrupt - 3 - - - - - INTERRUPT_ON_STALL - Trigger an interrupt if a STALL is sent. Intended for debug only. - [17:17] - read-write - - - INTERRUPT_ON_NAK - Trigger an interrupt if a NAK is sent. Intended for debug only. - [16:16] - read-write - - - BUFFER_ADDRESS - 64 byte aligned buffer address for this EP (bits 0-5 are ignored). Relative to the start of the DPRAM. - [15:0] - read-write - - - HOST_POLL_INTERVAL - The interval the host controller should poll this endpoint. Only applicable for interrupt endpoints. Specified in ms - 1. For example: a value of 9 would poll the endpoint every 10ms. - 16 - 10 - - - - - 32 - 0x4 - 0-31 - EP_BUFFER_CONTROL%s - - - 0x80 - 0x00000000 - - - FULL_1 - Buffer 1 is full. For an IN transfer (TX to the host) the bit is set to indicate the data is valid. For an OUT transfer (RX from the host) this bit should be left as a 0. The host will set it when it has filled the buffer with data. - [31:31] - read-write - - - LAST_1 - Buffer 1 is the last buffer of the transfer. - [30:30] - read-write - - - PID_1 - The data pid of buffer 1. - [29:29] - read-write - - - DOUBLE_BUFFER_ISO_OFFSET - The number of bytes buffer 1 is offset from buffer 0 in Isochronous mode. Only valid in double buffered mode for an Isochronous endpoint.\n - For a non Isochronous endpoint the offset is always 64 bytes. - [28:27] - read-write - - - 128 - 0 - - - 256 - 1 - - - 512 - 2 - - - 1024 - 3 - - - - - AVAILABLE_1 - Buffer 1 is available. This bit is set to indicate the buffer can be used by the controller. The controller clears the available bit when writing the status back. - [26:26] - read-write - - - LENGTH_1 - The length of the data in buffer 1. - [25:16] - read-write - - - FULL_0 - Buffer 0 is full. For an IN transfer (TX to the host) the bit is set to indicate the data is valid. For an OUT transfer (RX from the host) this bit should be left as a 0. The host will set it when it has filled the buffer with data. - [15:15] - read-write - - - LAST_0 - Buffer 0 is the last buffer of the transfer. - [14:14] - read-write - - - PID_0 - The data pid of buffer 0. - [13:13] - read-write - - - RESET - Reset the buffer selector to buffer 0. - [12:12] - read-write - - - STALL - Reply with a stall (valid for both buffers). - [11:11] - read-write - - - AVAILABLE_0 - Buffer 0 is available. This bit is set to indicate the buffer can be used by the controller. The controller clears the available bit when writing the status back. - [10:10] - read-write - - - LENGTH_0 - The length of the data in buffer 0. - [9:0] - read-write - - - - - EPX_CONTROL - EPx Control (Host-mode only!) - 0x100 - 0x00000000 - - - ENABLE - Enable this endpoint. The device will not reply to any packets for this endpoint if this bit is not set. - [31:31] - read-write - - - DOUBLE_BUFFERED - This endpoint is double buffered. - [30:30] - read-write - - - INTERRUPT_PER_BUFF - Trigger an interrupt each time a buffer is done. - [29:29] - read-write - - - INTERRUPT_PER_DOUBLE_BUFF - Trigger an interrupt each time both buffers are done. Only valid in double buffered mode. - [28:28] - read-write - - - ENDPOINT_TYPE - [27:26] - read-write - - - Control - 0 - - - Isochronous - 1 - - - Bulk - 2 - - - Interrupt - 3 - - - - - INTERRUPT_ON_STALL - Trigger an interrupt if a STALL is sent. Intended for debug only. - [17:17] - read-write - - - INTERRUPT_ON_NAK - Trigger an interrupt if a NAK is sent. Intended for debug only. - [16:16] - read-write - - - BUFFER_ADDRESS - 64 byte aligned buffer address for this EP (bits 0-5 are ignored). Relative to the start of the DPRAM. - [15:0] - read-write - - - - - - - USBCTRL_REGS - 1 - USB FS/LS controller device registers - 0x50110000 - 0x20 - - 0x0 - 0x1000 - registers - - - USBCTRL_IRQ - 5 - - - - ADDR_ENDP - Device address and endpoint control - 0x0 - 0x00000000 - - - ENDPOINT - Device endpoint to send data to. Only valid for HOST mode. - [19:16] - read-write - - - ADDRESS - In device mode, the address that the device should respond to. Set in response to a SET_ADDR setup packet from the host. In host mode set to the address of the device to communicate with. - [6:0] - read-write - - - - - 15 - 0x4 - 1-15 - HOST_ADDR_ENDP%s - Interrupt endpoints. Only valid in HOST mode. - 0x4 - 0x00000000 - - - INTEP_PREAMBLE - Interrupt EP requires preamble (is a low speed device on a full speed hub) - [26:26] - read-write - - - INTEP_DIR - Direction of the interrupt endpoint. In=0, Out=1 - [25:25] - read-write - - - ENDPOINT - Endpoint number of the interrupt endpoint - [19:16] - read-write - - - ADDRESS - Device address - [6:0] - read-write - - - - - MAIN_CTRL - Main control register - 0x40 - 0x00000000 - - - SIM_TIMING - Reduced timings for simulation - [31:31] - read-write - - - HOST_NDEVICE - Device mode = 0, Host mode = 1 - [1:1] - read-write - - - CONTROLLER_EN - Enable controller - [0:0] - read-write - - - - - SOF_WR - Set the SOF (Start of Frame) frame number in the host controller. The SOF packet is sent every 1ms and the host will increment the frame number by 1 each time. - 0x44 - 0x00000000 - - - COUNT - [10:0] - write-only - - - - - SOF_RD - Read the last SOF (Start of Frame) frame number seen. In device mode the last SOF received from the host. In host mode the last SOF sent by the host. - 0x48 - 0x00000000 - - - COUNT - [10:0] - read-only - - - - - SIE_CTRL - SIE control register - 0x4C - 0x00000000 - - - EP0_INT_STALL - Device: Set bit in EP_STATUS_STALL_NAK when EP0 sends a STALL - [31:31] - read-write - - - EP0_DOUBLE_BUF - Device: EP0 single buffered = 0, double buffered = 1 - [30:30] - read-write - - - EP0_INT_1BUF - Device: Set bit in BUFF_STATUS for every buffer completed on EP0 - [29:29] - read-write - - - EP0_INT_2BUF - Device: Set bit in BUFF_STATUS for every 2 buffers completed on EP0 - [28:28] - read-write - - - EP0_INT_NAK - Device: Set bit in EP_STATUS_STALL_NAK when EP0 sends a NAK - [27:27] - read-write - - - DIRECT_EN - Direct bus drive enable - [26:26] - read-write - - - DIRECT_DP - Direct control of DP - [25:25] - read-write - - - DIRECT_DM - Direct control of DM - [24:24] - read-write - - - TRANSCEIVER_PD - Power down bus transceiver - [18:18] - read-write - - - RPU_OPT - Device: Pull-up strength (0=1K2, 1=2k3) - [17:17] - read-write - - - PULLUP_EN - Device: Enable pull up resistor - [16:16] - read-write - - - PULLDOWN_EN - Host: Enable pull down resistors - [15:15] - read-write - - - RESET_BUS - Host: Reset bus - [13:13] - read-write - clear - - - RESUME - Device: Remote wakeup. Device can initiate its own resume after suspend. - [12:12] - read-write - clear - - - VBUS_EN - Host: Enable VBUS - [11:11] - read-write - - - KEEP_ALIVE_EN - Host: Enable keep alive packet (for low speed bus) - [10:10] - read-write - - - SOF_EN - Host: Enable SOF generation (for full speed bus) - [9:9] - read-write - - - SOF_SYNC - Host: Delay packet(s) until after SOF - [8:8] - read-write - - - PREAMBLE_EN - Host: Preable enable for LS device on FS hub - [6:6] - read-write - - - STOP_TRANS - Host: Stop transaction - [4:4] - read-write - clear - - - RECEIVE_DATA - Host: Receive transaction (IN to host) - [3:3] - read-write - - - SEND_DATA - Host: Send transaction (OUT from host) - [2:2] - read-write - - - SEND_SETUP - Host: Send Setup packet - [1:1] - read-write - - - START_TRANS - Host: Start transaction - [0:0] - read-write - clear - - - - - SIE_STATUS - SIE status register - 0x50 - 0x00000000 - - - DATA_SEQ_ERROR - Data Sequence Error.\n\n - The device can raise a sequence error in the following conditions:\n\n - * A SETUP packet is received followed by a DATA1 packet (data phase should always be DATA0) * An OUT packet is received from the host but doesn't match the data pid in the buffer control register read from DPSRAM\n\n - The host can raise a data sequence error in the following conditions:\n\n - * An IN packet from the device has the wrong data PID - [31:31] - read-write - oneToClear - - - ACK_REC - ACK received. Raised by both host and device. - [30:30] - read-write - oneToClear - - - STALL_REC - Host: STALL received - [29:29] - read-write - oneToClear - - - NAK_REC - Host: NAK received - [28:28] - read-write - oneToClear - - - RX_TIMEOUT - RX timeout is raised by both the host and device if an ACK is not received in the maximum time specified by the USB spec. - [27:27] - read-write - oneToClear - - - RX_OVERFLOW - RX overflow is raised by the Serial RX engine if the incoming data is too fast. - [26:26] - read-write - oneToClear - - - BIT_STUFF_ERROR - Bit Stuff Error. Raised by the Serial RX engine. - [25:25] - read-write - oneToClear - - - CRC_ERROR - CRC Error. Raised by the Serial RX engine. - [24:24] - read-write - oneToClear - - - BUS_RESET - Device: bus reset received - [19:19] - read-write - oneToClear - - - TRANS_COMPLETE - Transaction complete.\n\n - Raised by device if:\n\n - * An IN or OUT packet is sent with the `LAST_BUFF` bit set in the buffer control register\n\n - Raised by host if:\n\n - * A setup packet is sent when no data in or data out transaction follows * An IN packet is received and the `LAST_BUFF` bit is set in the buffer control register * An IN packet is received with zero length * An OUT packet is sent and the `LAST_BUFF` bit is set - [18:18] - read-write - oneToClear - - - SETUP_REC - Device: Setup packet received - [17:17] - read-write - oneToClear - - - CONNECTED - Device: connected - [16:16] - read-write - oneToClear - - - RESUME - Host: Device has initiated a remote resume. Device: host has initiated a resume. - [11:11] - read-write - oneToClear - - - VBUS_OVER_CURR - VBUS over current detected - [10:10] - read-only - - - SPEED - Host: device speed. Disconnected = 00, LS = 01, FS = 10 - [9:8] - read-write - oneToClear - - - SUSPENDED - Bus in suspended state. Valid for device and host. Host and device will go into suspend if neither Keep Alive / SOF frames are enabled. - [4:4] - read-write - oneToClear - - - LINE_STATE - USB bus line state - [3:2] - read-only - - LINE_STATE - - SE0 - SE0 - 0 - - - J - J - 1 - - - K - K - 2 - - - SE1 - SE1 - 3 - - - - - VBUS_DETECTED - Device: VBUS Detected - [0:0] - read-only - - - - - INT_EP_CTRL - interrupt endpoint control register - 0x54 - 0x00000000 - - - INT_EP_ACTIVE - Host: Enable interrupt endpoint 1 -> 15 - [15:1] - read-write - - - - - BUFF_STATUS - Buffer status register. A bit set here indicates that a buffer has completed on the endpoint (if the buffer interrupt is enabled). It is possible for 2 buffers to be completed, so clearing the buffer status bit may instantly re set it on the next clock cycle. - 0x58 - 0x00000000 - - - EP15_OUT - [31:31] - read-write - oneToClear - - - EP15_IN - [30:30] - read-write - oneToClear - - - EP14_OUT - [29:29] - read-write - oneToClear - - - EP14_IN - [28:28] - read-write - oneToClear - - - EP13_OUT - [27:27] - read-write - oneToClear - - - EP13_IN - [26:26] - read-write - oneToClear - - - EP12_OUT - [25:25] - read-write - oneToClear - - - EP12_IN - [24:24] - read-write - oneToClear - - - EP11_OUT - [23:23] - read-write - oneToClear - - - EP11_IN - [22:22] - read-write - oneToClear - - - EP10_OUT - [21:21] - read-write - oneToClear - - - EP10_IN - [20:20] - read-write - oneToClear - - - EP9_OUT - [19:19] - read-write - oneToClear - - - EP9_IN - [18:18] - read-write - oneToClear - - - EP8_OUT - [17:17] - read-write - oneToClear - - - EP8_IN - [16:16] - read-write - oneToClear - - - EP7_OUT - [15:15] - read-write - oneToClear - - - EP7_IN - [14:14] - read-write - oneToClear - - - EP6_OUT - [13:13] - read-write - oneToClear - - - EP6_IN - [12:12] - read-write - oneToClear - - - EP5_OUT - [11:11] - read-write - oneToClear - - - EP5_IN - [10:10] - read-write - oneToClear - - - EP4_OUT - [9:9] - read-write - oneToClear - - - EP4_IN - [8:8] - read-write - oneToClear - - - EP3_OUT - [7:7] - read-write - oneToClear - - - EP3_IN - [6:6] - read-write - oneToClear - - - EP2_OUT - [5:5] - read-write - oneToClear - - - EP2_IN - [4:4] - read-write - oneToClear - - - EP1_OUT - [3:3] - read-write - oneToClear - - - EP1_IN - [2:2] - read-write - oneToClear - - - EP0_OUT - [1:1] - read-write - oneToClear - - - EP0_IN - [0:0] - read-write - oneToClear - - - - - BUFF_CPU_SHOULD_HANDLE - Which of the double buffers should be handled. Only valid if using an interrupt per buffer (i.e. not per 2 buffers). Not valid for host interrupt endpoint polling because they are only single buffered. - 0x5C - 0x00000000 - - - EP15_OUT - [31:31] - read-only - - - EP15_IN - [30:30] - read-only - - - EP14_OUT - [29:29] - read-only - - - EP14_IN - [28:28] - read-only - - - EP13_OUT - [27:27] - read-only - - - EP13_IN - [26:26] - read-only - - - EP12_OUT - [25:25] - read-only - - - EP12_IN - [24:24] - read-only - - - EP11_OUT - [23:23] - read-only - - - EP11_IN - [22:22] - read-only - - - EP10_OUT - [21:21] - read-only - - - EP10_IN - [20:20] - read-only - - - EP9_OUT - [19:19] - read-only - - - EP9_IN - [18:18] - read-only - - - EP8_OUT - [17:17] - read-only - - - EP8_IN - [16:16] - read-only - - - EP7_OUT - [15:15] - read-only - - - EP7_IN - [14:14] - read-only - - - EP6_OUT - [13:13] - read-only - - - EP6_IN - [12:12] - read-only - - - EP5_OUT - [11:11] - read-only - - - EP5_IN - [10:10] - read-only - - - EP4_OUT - [9:9] - read-only - - - EP4_IN - [8:8] - read-only - - - EP3_OUT - [7:7] - read-only - - - EP3_IN - [6:6] - read-only - - - EP2_OUT - [5:5] - read-only - - - EP2_IN - [4:4] - read-only - - - EP1_OUT - [3:3] - read-only - - - EP1_IN - [2:2] - read-only - - - EP0_OUT - [1:1] - read-only - - - EP0_IN - [0:0] - read-only - - - - - EP_ABORT - Device only: Can be set to ignore the buffer control register for this endpoint in case you would like to revoke a buffer. A NAK will be sent for every access to the endpoint until this bit is cleared. A corresponding bit in `EP_ABORT_DONE` is set when it is safe to modify the buffer control register. - 0x60 - 0x00000000 - - - EP15_OUT - [31:31] - read-write - - - EP15_IN - [30:30] - read-write - - - EP14_OUT - [29:29] - read-write - - - EP14_IN - [28:28] - read-write - - - EP13_OUT - [27:27] - read-write - - - EP13_IN - [26:26] - read-write - - - EP12_OUT - [25:25] - read-write - - - EP12_IN - [24:24] - read-write - - - EP11_OUT - [23:23] - read-write - - - EP11_IN - [22:22] - read-write - - - EP10_OUT - [21:21] - read-write - - - EP10_IN - [20:20] - read-write - - - EP9_OUT - [19:19] - read-write - - - EP9_IN - [18:18] - read-write - - - EP8_OUT - [17:17] - read-write - - - EP8_IN - [16:16] - read-write - - - EP7_OUT - [15:15] - read-write - - - EP7_IN - [14:14] - read-write - - - EP6_OUT - [13:13] - read-write - - - EP6_IN - [12:12] - read-write - - - EP5_OUT - [11:11] - read-write - - - EP5_IN - [10:10] - read-write - - - EP4_OUT - [9:9] - read-write - - - EP4_IN - [8:8] - read-write - - - EP3_OUT - [7:7] - read-write - - - EP3_IN - [6:6] - read-write - - - EP2_OUT - [5:5] - read-write - - - EP2_IN - [4:4] - read-write - - - EP1_OUT - [3:3] - read-write - - - EP1_IN - [2:2] - read-write - - - EP0_OUT - [1:1] - read-write - - - EP0_IN - [0:0] - read-write - - - - - EP_ABORT_DONE - Device only: Used in conjunction with `EP_ABORT`. Set once an endpoint is idle so the programmer knows it is safe to modify the buffer control register. - 0x64 - 0x00000000 - - - EP15_OUT - [31:31] - read-write - oneToClear - - - EP15_IN - [30:30] - read-write - oneToClear - - - EP14_OUT - [29:29] - read-write - oneToClear - - - EP14_IN - [28:28] - read-write - oneToClear - - - EP13_OUT - [27:27] - read-write - oneToClear - - - EP13_IN - [26:26] - read-write - oneToClear - - - EP12_OUT - [25:25] - read-write - oneToClear - - - EP12_IN - [24:24] - read-write - oneToClear - - - EP11_OUT - [23:23] - read-write - oneToClear - - - EP11_IN - [22:22] - read-write - oneToClear - - - EP10_OUT - [21:21] - read-write - oneToClear - - - EP10_IN - [20:20] - read-write - oneToClear - - - EP9_OUT - [19:19] - read-write - oneToClear - - - EP9_IN - [18:18] - read-write - oneToClear - - - EP8_OUT - [17:17] - read-write - oneToClear - - - EP8_IN - [16:16] - read-write - oneToClear - - - EP7_OUT - [15:15] - read-write - oneToClear - - - EP7_IN - [14:14] - read-write - oneToClear - - - EP6_OUT - [13:13] - read-write - oneToClear - - - EP6_IN - [12:12] - read-write - oneToClear - - - EP5_OUT - [11:11] - read-write - oneToClear - - - EP5_IN - [10:10] - read-write - oneToClear - - - EP4_OUT - [9:9] - read-write - oneToClear - - - EP4_IN - [8:8] - read-write - oneToClear - - - EP3_OUT - [7:7] - read-write - oneToClear - - - EP3_IN - [6:6] - read-write - oneToClear - - - EP2_OUT - [5:5] - read-write - oneToClear - - - EP2_IN - [4:4] - read-write - oneToClear - - - EP1_OUT - [3:3] - read-write - oneToClear - - - EP1_IN - [2:2] - read-write - oneToClear - - - EP0_OUT - [1:1] - read-write - oneToClear - - - EP0_IN - [0:0] - read-write - oneToClear - - - - - EP_STALL_ARM - Device: this bit must be set in conjunction with the `STALL` bit in the buffer control register to send a STALL on EP0. The device controller clears these bits when a SETUP packet is received because the USB spec requires that a STALL condition is cleared when a SETUP packet is received. - 0x68 - 0x00000000 - - - EP0_OUT - [1:1] - read-write - - - EP0_IN - [0:0] - read-write - - - - - NAK_POLL - Used by the host controller. Sets the wait time in microseconds before trying again if the device replies with a NAK. - 0x6C - 0x00100010 - - - DELAY_FS - NAK polling interval for a full speed device - [25:16] - read-write - - - DELAY_LS - NAK polling interval for a low speed device - [9:0] - read-write - - - - - EP_STATUS_STALL_NAK - Device: bits are set when the `IRQ_ON_NAK` or `IRQ_ON_STALL` bits are set. For EP0 this comes from `SIE_CTRL`. For all other endpoints it comes from the endpoint control register. - 0x70 - 0x00000000 - - - EP15_OUT - [31:31] - read-write - oneToClear - - - EP15_IN - [30:30] - read-write - oneToClear - - - EP14_OUT - [29:29] - read-write - oneToClear - - - EP14_IN - [28:28] - read-write - oneToClear - - - EP13_OUT - [27:27] - read-write - oneToClear - - - EP13_IN - [26:26] - read-write - oneToClear - - - EP12_OUT - [25:25] - read-write - oneToClear - - - EP12_IN - [24:24] - read-write - oneToClear - - - EP11_OUT - [23:23] - read-write - oneToClear - - - EP11_IN - [22:22] - read-write - oneToClear - - - EP10_OUT - [21:21] - read-write - oneToClear - - - EP10_IN - [20:20] - read-write - oneToClear - - - EP9_OUT - [19:19] - read-write - oneToClear - - - EP9_IN - [18:18] - read-write - oneToClear - - - EP8_OUT - [17:17] - read-write - oneToClear - - - EP8_IN - [16:16] - read-write - oneToClear - - - EP7_OUT - [15:15] - read-write - oneToClear - - - EP7_IN - [14:14] - read-write - oneToClear - - - EP6_OUT - [13:13] - read-write - oneToClear - - - EP6_IN - [12:12] - read-write - oneToClear - - - EP5_OUT - [11:11] - read-write - oneToClear - - - EP5_IN - [10:10] - read-write - oneToClear - - - EP4_OUT - [9:9] - read-write - oneToClear - - - EP4_IN - [8:8] - read-write - oneToClear - - - EP3_OUT - [7:7] - read-write - oneToClear - - - EP3_IN - [6:6] - read-write - oneToClear - - - EP2_OUT - [5:5] - read-write - oneToClear - - - EP2_IN - [4:4] - read-write - oneToClear - - - EP1_OUT - [3:3] - read-write - oneToClear - - - EP1_IN - [2:2] - read-write - oneToClear - - - EP0_OUT - [1:1] - read-write - oneToClear - - - EP0_IN - [0:0] - read-write - oneToClear - - - - - USB_MUXING - Where to connect the USB controller. Should be to_phy by default. - 0x74 - 0x00000000 - - - SOFTCON - [3:3] - read-write - - - TO_DIGITAL_PAD - [2:2] - read-write - - - TO_EXTPHY - [1:1] - read-write - - - TO_PHY - [0:0] - read-write - - - - - USB_PWR - Overrides for the power signals in the event that the VBUS signals are not hooked up to GPIO. Set the value of the override and then the override enable to switch over to the override value. - 0x78 - 0x00000000 - - - OVERCURR_DETECT_EN - [5:5] - read-write - - - OVERCURR_DETECT - [4:4] - read-write - - - VBUS_DETECT_OVERRIDE_EN - [3:3] - read-write - - - VBUS_DETECT - [2:2] - read-write - - - VBUS_EN_OVERRIDE_EN - [1:1] - read-write - - - VBUS_EN - [0:0] - read-write - - - - - USBPHY_DIRECT - This register allows for direct control of the USB phy. Use in conjunction with usbphy_direct_override register to enable each override bit. - 0x7C - 0x00000000 - - - DM_OVV - DM over voltage - [22:22] - read-only - - - DP_OVV - DP over voltage - [21:21] - read-only - - - DM_OVCN - DM overcurrent - [20:20] - read-only - - - DP_OVCN - DP overcurrent - [19:19] - read-only - - - RX_DM - DPM pin state - [18:18] - read-only - - - RX_DP - DPP pin state - [17:17] - read-only - - - RX_DD - Differential RX - [16:16] - read-only - - - TX_DIFFMODE - TX_DIFFMODE=0: Single ended mode\n - TX_DIFFMODE=1: Differential drive mode (TX_DM, TX_DM_OE ignored) - [15:15] - read-write - - - TX_FSSLEW - TX_FSSLEW=0: Low speed slew rate\n - TX_FSSLEW=1: Full speed slew rate - [14:14] - read-write - - - TX_PD - TX power down override (if override enable is set). 1 = powered down. - [13:13] - read-write - - - RX_PD - RX power down override (if override enable is set). 1 = powered down. - [12:12] - read-write - - - TX_DM - Output data. TX_DIFFMODE=1, Ignored\n - TX_DIFFMODE=0, Drives DPM only. TX_DM_OE=1 to enable drive. DPM=TX_DM - [11:11] - read-write - - - TX_DP - Output data. If TX_DIFFMODE=1, Drives DPP/DPM diff pair. TX_DP_OE=1 to enable drive. DPP=TX_DP, DPM=~TX_DP\n - If TX_DIFFMODE=0, Drives DPP only. TX_DP_OE=1 to enable drive. DPP=TX_DP - [10:10] - read-write - - - TX_DM_OE - Output enable. If TX_DIFFMODE=1, Ignored.\n - If TX_DIFFMODE=0, OE for DPM only. 0 - DPM in Hi-Z state; 1 - DPM driving - [9:9] - read-write - - - TX_DP_OE - Output enable. If TX_DIFFMODE=1, OE for DPP/DPM diff pair. 0 - DPP/DPM in Hi-Z state; 1 - DPP/DPM driving\n - If TX_DIFFMODE=0, OE for DPP only. 0 - DPP in Hi-Z state; 1 - DPP driving - [8:8] - read-write - - - DM_PULLDN_EN - DM pull down enable - [6:6] - read-write - - - DM_PULLUP_EN - DM pull up enable - [5:5] - read-write - - - DM_PULLUP_HISEL - Enable the second DM pull up resistor. 0 - Pull = Rpu2; 1 - Pull = Rpu1 + Rpu2 - [4:4] - read-write - - - DP_PULLDN_EN - DP pull down enable - [2:2] - read-write - - - DP_PULLUP_EN - DP pull up enable - [1:1] - read-write - - - DP_PULLUP_HISEL - Enable the second DP pull up resistor. 0 - Pull = Rpu2; 1 - Pull = Rpu1 + Rpu2 - [0:0] - read-write - - - - - USBPHY_DIRECT_OVERRIDE - Override enable for each control in usbphy_direct - 0x80 - 0x00000000 - - - TX_DIFFMODE_OVERRIDE_EN - [15:15] - read-write - - - DM_PULLUP_OVERRIDE_EN - [12:12] - read-write - - - TX_FSSLEW_OVERRIDE_EN - [11:11] - read-write - - - TX_PD_OVERRIDE_EN - [10:10] - read-write - - - RX_PD_OVERRIDE_EN - [9:9] - read-write - - - TX_DM_OVERRIDE_EN - [8:8] - read-write - - - TX_DP_OVERRIDE_EN - [7:7] - read-write - - - TX_DM_OE_OVERRIDE_EN - [6:6] - read-write - - - TX_DP_OE_OVERRIDE_EN - [5:5] - read-write - - - DM_PULLDN_EN_OVERRIDE_EN - [4:4] - read-write - - - DP_PULLDN_EN_OVERRIDE_EN - [3:3] - read-write - - - DP_PULLUP_EN_OVERRIDE_EN - [2:2] - read-write - - - DM_PULLUP_HISEL_OVERRIDE_EN - [1:1] - read-write - - - DP_PULLUP_HISEL_OVERRIDE_EN - [0:0] - read-write - - - - - USBPHY_TRIM - Used to adjust trim values of USB phy pull down resistors. - 0x84 - 0x00001F1F - - - DM_PULLDN_TRIM - Value to drive to USB PHY\n - DM pulldown resistor trim control\n - Experimental data suggests that the reset value will work, but this register allows adjustment if required - [12:8] - read-write - - - DP_PULLDN_TRIM - Value to drive to USB PHY\n - DP pulldown resistor trim control\n - Experimental data suggests that the reset value will work, but this register allows adjustment if required - [4:0] - read-write - - - - - INTR - Raw Interrupts - 0x8C - 0x00000000 - - - EP_STALL_NAK - Raised when any bit in EP_STATUS_STALL_NAK is set. Clear by clearing all bits in EP_STATUS_STALL_NAK. - [19:19] - read-only - - - ABORT_DONE - Raised when any bit in ABORT_DONE is set. Clear by clearing all bits in ABORT_DONE. - [18:18] - read-only - - - DEV_SOF - Set every time the device receives a SOF (Start of Frame) packet. Cleared by reading SOF_RD - [17:17] - read-only - - - SETUP_REQ - Device. Source: SIE_STATUS.SETUP_REC - [16:16] - read-only - - - DEV_RESUME_FROM_HOST - Set when the device receives a resume from the host. Cleared by writing to SIE_STATUS.RESUME - [15:15] - read-only - - - DEV_SUSPEND - Set when the device suspend state changes. Cleared by writing to SIE_STATUS.SUSPENDED - [14:14] - read-only - - - DEV_CONN_DIS - Set when the device connection state changes. Cleared by writing to SIE_STATUS.CONNECTED - [13:13] - read-only - - - BUS_RESET - Source: SIE_STATUS.BUS_RESET - [12:12] - read-only - - - VBUS_DETECT - Source: SIE_STATUS.VBUS_DETECTED - [11:11] - read-only - - - STALL - Source: SIE_STATUS.STALL_REC - [10:10] - read-only - - - ERROR_CRC - Source: SIE_STATUS.CRC_ERROR - [9:9] - read-only - - - ERROR_BIT_STUFF - Source: SIE_STATUS.BIT_STUFF_ERROR - [8:8] - read-only - - - ERROR_RX_OVERFLOW - Source: SIE_STATUS.RX_OVERFLOW - [7:7] - read-only - - - ERROR_RX_TIMEOUT - Source: SIE_STATUS.RX_TIMEOUT - [6:6] - read-only - - - ERROR_DATA_SEQ - Source: SIE_STATUS.DATA_SEQ_ERROR - [5:5] - read-only - - - BUFF_STATUS - Raised when any bit in BUFF_STATUS is set. Clear by clearing all bits in BUFF_STATUS. - [4:4] - read-only - - - TRANS_COMPLETE - Raised every time SIE_STATUS.TRANS_COMPLETE is set. Clear by writing to this bit. - [3:3] - read-only - - - HOST_SOF - Host: raised every time the host sends a SOF (Start of Frame). Cleared by reading SOF_RD - [2:2] - read-only - - - HOST_RESUME - Host: raised when a device wakes up the host. Cleared by writing to SIE_STATUS.RESUME - [1:1] - read-only - - - HOST_CONN_DIS - Host: raised when a device is connected or disconnected (i.e. when SIE_STATUS.SPEED changes). Cleared by writing to SIE_STATUS.SPEED - [0:0] - read-only - - - - - INTE - Interrupt Enable - 0x90 - 0x00000000 - - - EP_STALL_NAK - Raised when any bit in EP_STATUS_STALL_NAK is set. Clear by clearing all bits in EP_STATUS_STALL_NAK. - [19:19] - read-write - - - ABORT_DONE - Raised when any bit in ABORT_DONE is set. Clear by clearing all bits in ABORT_DONE. - [18:18] - read-write - - - DEV_SOF - Set every time the device receives a SOF (Start of Frame) packet. Cleared by reading SOF_RD - [17:17] - read-write - - - SETUP_REQ - Device. Source: SIE_STATUS.SETUP_REC - [16:16] - read-write - - - DEV_RESUME_FROM_HOST - Set when the device receives a resume from the host. Cleared by writing to SIE_STATUS.RESUME - [15:15] - read-write - - - DEV_SUSPEND - Set when the device suspend state changes. Cleared by writing to SIE_STATUS.SUSPENDED - [14:14] - read-write - - - DEV_CONN_DIS - Set when the device connection state changes. Cleared by writing to SIE_STATUS.CONNECTED - [13:13] - read-write - - - BUS_RESET - Source: SIE_STATUS.BUS_RESET - [12:12] - read-write - - - VBUS_DETECT - Source: SIE_STATUS.VBUS_DETECTED - [11:11] - read-write - - - STALL - Source: SIE_STATUS.STALL_REC - [10:10] - read-write - - - ERROR_CRC - Source: SIE_STATUS.CRC_ERROR - [9:9] - read-write - - - ERROR_BIT_STUFF - Source: SIE_STATUS.BIT_STUFF_ERROR - [8:8] - read-write - - - ERROR_RX_OVERFLOW - Source: SIE_STATUS.RX_OVERFLOW - [7:7] - read-write - - - ERROR_RX_TIMEOUT - Source: SIE_STATUS.RX_TIMEOUT - [6:6] - read-write - - - ERROR_DATA_SEQ - Source: SIE_STATUS.DATA_SEQ_ERROR - [5:5] - read-write - - - BUFF_STATUS - Raised when any bit in BUFF_STATUS is set. Clear by clearing all bits in BUFF_STATUS. - [4:4] - read-write - - - TRANS_COMPLETE - Raised every time SIE_STATUS.TRANS_COMPLETE is set. Clear by writing to this bit. - [3:3] - read-write - - - HOST_SOF - Host: raised every time the host sends a SOF (Start of Frame). Cleared by reading SOF_RD - [2:2] - read-write - - - HOST_RESUME - Host: raised when a device wakes up the host. Cleared by writing to SIE_STATUS.RESUME - [1:1] - read-write - - - HOST_CONN_DIS - Host: raised when a device is connected or disconnected (i.e. when SIE_STATUS.SPEED changes). Cleared by writing to SIE_STATUS.SPEED - [0:0] - read-write - - - - - INTF - Interrupt Force - 0x94 - 0x00000000 - - - EP_STALL_NAK - Raised when any bit in EP_STATUS_STALL_NAK is set. Clear by clearing all bits in EP_STATUS_STALL_NAK. - [19:19] - read-write - - - ABORT_DONE - Raised when any bit in ABORT_DONE is set. Clear by clearing all bits in ABORT_DONE. - [18:18] - read-write - - - DEV_SOF - Set every time the device receives a SOF (Start of Frame) packet. Cleared by reading SOF_RD - [17:17] - read-write - - - SETUP_REQ - Device. Source: SIE_STATUS.SETUP_REC - [16:16] - read-write - - - DEV_RESUME_FROM_HOST - Set when the device receives a resume from the host. Cleared by writing to SIE_STATUS.RESUME - [15:15] - read-write - - - DEV_SUSPEND - Set when the device suspend state changes. Cleared by writing to SIE_STATUS.SUSPENDED - [14:14] - read-write - - - DEV_CONN_DIS - Set when the device connection state changes. Cleared by writing to SIE_STATUS.CONNECTED - [13:13] - read-write - - - BUS_RESET - Source: SIE_STATUS.BUS_RESET - [12:12] - read-write - - - VBUS_DETECT - Source: SIE_STATUS.VBUS_DETECTED - [11:11] - read-write - - - STALL - Source: SIE_STATUS.STALL_REC - [10:10] - read-write - - - ERROR_CRC - Source: SIE_STATUS.CRC_ERROR - [9:9] - read-write - - - ERROR_BIT_STUFF - Source: SIE_STATUS.BIT_STUFF_ERROR - [8:8] - read-write - - - ERROR_RX_OVERFLOW - Source: SIE_STATUS.RX_OVERFLOW - [7:7] - read-write - - - ERROR_RX_TIMEOUT - Source: SIE_STATUS.RX_TIMEOUT - [6:6] - read-write - - - ERROR_DATA_SEQ - Source: SIE_STATUS.DATA_SEQ_ERROR - [5:5] - read-write - - - BUFF_STATUS - Raised when any bit in BUFF_STATUS is set. Clear by clearing all bits in BUFF_STATUS. - [4:4] - read-write - - - TRANS_COMPLETE - Raised every time SIE_STATUS.TRANS_COMPLETE is set. Clear by writing to this bit. - [3:3] - read-write - - - HOST_SOF - Host: raised every time the host sends a SOF (Start of Frame). Cleared by reading SOF_RD - [2:2] - read-write - - - HOST_RESUME - Host: raised when a device wakes up the host. Cleared by writing to SIE_STATUS.RESUME - [1:1] - read-write - - - HOST_CONN_DIS - Host: raised when a device is connected or disconnected (i.e. when SIE_STATUS.SPEED changes). Cleared by writing to SIE_STATUS.SPEED - [0:0] - read-write - - - - - INTS - Interrupt status after masking & forcing - 0x98 - 0x00000000 - - - EP_STALL_NAK - Raised when any bit in EP_STATUS_STALL_NAK is set. Clear by clearing all bits in EP_STATUS_STALL_NAK. - [19:19] - read-only - - - ABORT_DONE - Raised when any bit in ABORT_DONE is set. Clear by clearing all bits in ABORT_DONE. - [18:18] - read-only - - - DEV_SOF - Set every time the device receives a SOF (Start of Frame) packet. Cleared by reading SOF_RD - [17:17] - read-only - - - SETUP_REQ - Device. Source: SIE_STATUS.SETUP_REC - [16:16] - read-only - - - DEV_RESUME_FROM_HOST - Set when the device receives a resume from the host. Cleared by writing to SIE_STATUS.RESUME - [15:15] - read-only - - - DEV_SUSPEND - Set when the device suspend state changes. Cleared by writing to SIE_STATUS.SUSPENDED - [14:14] - read-only - - - DEV_CONN_DIS - Set when the device connection state changes. Cleared by writing to SIE_STATUS.CONNECTED - [13:13] - read-only - - - BUS_RESET - Source: SIE_STATUS.BUS_RESET - [12:12] - read-only - - - VBUS_DETECT - Source: SIE_STATUS.VBUS_DETECTED - [11:11] - read-only - - - STALL - Source: SIE_STATUS.STALL_REC - [10:10] - read-only - - - ERROR_CRC - Source: SIE_STATUS.CRC_ERROR - [9:9] - read-only - - - ERROR_BIT_STUFF - Source: SIE_STATUS.BIT_STUFF_ERROR - [8:8] - read-only - - - ERROR_RX_OVERFLOW - Source: SIE_STATUS.RX_OVERFLOW - [7:7] - read-only - - - ERROR_RX_TIMEOUT - Source: SIE_STATUS.RX_TIMEOUT - [6:6] - read-only - - - ERROR_DATA_SEQ - Source: SIE_STATUS.DATA_SEQ_ERROR - [5:5] - read-only - - - BUFF_STATUS - Raised when any bit in BUFF_STATUS is set. Clear by clearing all bits in BUFF_STATUS. - [4:4] - read-only - - - TRANS_COMPLETE - Raised every time SIE_STATUS.TRANS_COMPLETE is set. Clear by writing to this bit. - [3:3] - read-only - - - HOST_SOF - Host: raised every time the host sends a SOF (Start of Frame). Cleared by reading SOF_RD - [2:2] - read-only - - - HOST_RESUME - Host: raised when a device wakes up the host. Cleared by writing to SIE_STATUS.RESUME - [1:1] - read-only - - - HOST_CONN_DIS - Host: raised when a device is connected or disconnected (i.e. when SIE_STATUS.SPEED changes). Cleared by writing to SIE_STATUS.SPEED - [0:0] - read-only - - - - - - - PIO0 - 1 - Programmable IO block - 0x50200000 - 0x20 - - 0x0 - 0x1000 - registers - - - PIO0_IRQ_0 - 7 - - - PIO0_IRQ_1 - 8 - - - - CTRL - PIO control register - 0x0 - 0x00000000 - - - CLKDIV_RESTART - Restart a state machine's clock divider from an initial phase of 0. Clock dividers are free-running, so once started, their output (including fractional jitter) is completely determined by the integer/fractional divisor configured in SMx_CLKDIV. This means that, if multiple clock dividers with the same divisor are restarted simultaneously, by writing multiple 1 bits to this field, the execution clocks of those state machines will run in precise lockstep.\n\n - Note that setting/clearing SM_ENABLE does not stop the clock divider from running, so once multiple state machines' clocks are synchronised, it is safe to disable/reenable a state machine, whilst keeping the clock dividers in sync.\n\n - Note also that CLKDIV_RESTART can be written to whilst the state machine is running, and this is useful to resynchronise clock dividers after the divisors (SMx_CLKDIV) have been changed on-the-fly. - [11:8] - read-write - clear - - - SM_RESTART - Write 1 to instantly clear internal SM state which may be otherwise difficult to access and will affect future execution.\n\n - Specifically, the following are cleared: input and output shift counters; the contents of the input shift register; the delay counter; the waiting-on-IRQ state; any stalled instruction written to SMx_INSTR or run by OUT/MOV EXEC; any pin write left asserted due to OUT_STICKY.\n\n - The program counter, the contents of the output shift register and the X/Y scratch registers are not affected. - [7:4] - read-write - clear - - - SM_ENABLE - Enable/disable each of the four state machines by writing 1/0 to each of these four bits. When disabled, a state machine will cease executing instructions, except those written directly to SMx_INSTR by the system. Multiple bits can be set/cleared at once to run/halt multiple state machines simultaneously. - [3:0] - read-write - - - - - FSTAT - FIFO status register - 0x4 - 0x0F000F00 - - - TXEMPTY - State machine TX FIFO is empty - [27:24] - read-only - - - TXFULL - State machine TX FIFO is full - [19:16] - read-only - - - RXEMPTY - State machine RX FIFO is empty - [11:8] - read-only - - - RXFULL - State machine RX FIFO is full - [3:0] - read-only - - - - - FDEBUG - FIFO debug register - 0x8 - 0x00000000 - - - TXSTALL - State machine has stalled on empty TX FIFO during a blocking PULL, or an OUT with autopull enabled. Write 1 to clear. - [27:24] - read-write - oneToClear - - - TXOVER - TX FIFO overflow (i.e. write-on-full by the system) has occurred. Write 1 to clear. Note that write-on-full does not alter the state or contents of the FIFO in any way, but the data that the system attempted to write is dropped, so if this flag is set, your software has quite likely dropped some data on the floor. - [19:16] - read-write - oneToClear - - - RXUNDER - RX FIFO underflow (i.e. read-on-empty by the system) has occurred. Write 1 to clear. Note that read-on-empty does not perturb the state of the FIFO in any way, but the data returned by reading from an empty FIFO is undefined, so this flag generally only becomes set due to some kind of software error. - [11:8] - read-write - oneToClear - - - RXSTALL - State machine has stalled on full RX FIFO during a blocking PUSH, or an IN with autopush enabled. This flag is also set when a nonblocking PUSH to a full FIFO took place, in which case the state machine has dropped data. Write 1 to clear. - [3:0] - read-write - oneToClear - - - - - FLEVEL - FIFO levels - 0xC - 0x00000000 - - - RX3 - [31:28] - read-only - - - TX3 - [27:24] - read-only - - - RX2 - [23:20] - read-only - - - TX2 - [19:16] - read-only - - - RX1 - [15:12] - read-only - - - TX1 - [11:8] - read-only - - - RX0 - [7:4] - read-only - - - TX0 - [3:0] - read-only - - - - - 4 - 0x4 - 0-3 - TXF%s - Direct write access to the TX FIFO for this state machine. Each write pushes one word to the FIFO. Attempting to write to a full FIFO has no effect on the FIFO state or contents, and sets the sticky FDEBUG_TXOVER error flag for this FIFO. - 0x10 - write-only - 0x00000000 - - - 4 - 0x4 - 0-3 - RXF%s - Direct read access to the RX FIFO for this state machine. Each read pops one word from the FIFO. Attempting to read from an empty FIFO has no effect on the FIFO state, and sets the sticky FDEBUG_RXUNDER error flag for this FIFO. The data returned to the system on a read from an empty FIFO is undefined. - 0x20 - read-only - 0x00000000 - - - IRQ - State machine IRQ flags register. Write 1 to clear. There are 8 state machine IRQ flags, which can be set, cleared, and waited on by the state machines. There's no fixed association between flags and state machines -- any state machine can use any flag.\n\n - Any of the 8 flags can be used for timing synchronisation between state machines, using IRQ and WAIT instructions. The lower four of these flags are also routed out to system-level interrupt requests, alongside FIFO status interrupts -- see e.g. IRQ0_INTE. - 0x30 - 0x00000000 - - - IRQ - [7:0] - read-write - oneToClear - - - - - IRQ_FORCE - Writing a 1 to each of these bits will forcibly assert the corresponding IRQ. Note this is different to the INTF register: writing here affects PIO internal state. INTF just asserts the processor-facing IRQ signal for testing ISRs, and is not visible to the state machines. - 0x34 - 0x00000000 - - - IRQ_FORCE - [7:0] - write-only - - - - - INPUT_SYNC_BYPASS - There is a 2-flipflop synchronizer on each GPIO input, which protects PIO logic from metastabilities. This increases input delay, and for fast synchronous IO (e.g. SPI) these synchronizers may need to be bypassed. Each bit in this register corresponds to one GPIO.\n - 0 -> input is synchronized (default)\n - 1 -> synchronizer is bypassed\n - If in doubt, leave this register as all zeroes. - 0x38 - read-write - 0x00000000 - - - DBG_PADOUT - Read to sample the pad output values PIO is currently driving to the GPIOs. On RP2040 there are 30 GPIOs, so the two most significant bits are hardwired to 0. - 0x3C - read-only - 0x00000000 - - - DBG_PADOE - Read to sample the pad output enables (direction) PIO is currently driving to the GPIOs. On RP2040 there are 30 GPIOs, so the two most significant bits are hardwired to 0. - 0x40 - read-only - 0x00000000 - - - DBG_CFGINFO - The PIO hardware has some free parameters that may vary between chip products.\n - These should be provided in the chip datasheet, but are also exposed here. - 0x44 - 0x00000000 - - - IMEM_SIZE - The size of the instruction memory, measured in units of one instruction - [21:16] - read-only - - - SM_COUNT - The number of state machines this PIO instance is equipped with. - [11:8] - read-only - - - FIFO_DEPTH - The depth of the state machine TX/RX FIFOs, measured in words.\n - Joining fifos via SHIFTCTRL_FJOIN gives one FIFO with double\n - this depth. - [5:0] - read-only - - - - - 32 - 0x4 - 0-31 - INSTR_MEM%s - Write-only access to instruction memory location %s - 0x48 - 0x00000000 - - - INSTR_MEM0 - [15:0] - write-only - - - - - 4 - 0x18 - 0-3 - SM%s - Cluster SM%s, containing SM*_CLKDIV, SM*_EXECCTRL, SM*_SHIFTCTRL, SM*_ADDR, SM*_INSTR, SM*_PINCTRL - 0xC8 - - SM_CLKDIV - Clock divisor register for state machine 0\n - Frequency = clock freq / (CLKDIV_INT + CLKDIV_FRAC / 256) - 0x0 - 0x00010000 - - - INT - Effective frequency is sysclk/(int + frac/256).\n - Value of 0 is interpreted as 65536. If INT is 0, FRAC must also be 0. - [31:16] - read-write - - - FRAC - Fractional part of clock divisor - [15:8] - read-write - - - - - SM_EXECCTRL - Execution/behavioural settings for state machine 0 - 0x4 - 0x0001F000 - - - EXEC_STALLED - If 1, an instruction written to SMx_INSTR is stalled, and latched by the state machine. Will clear to 0 once this instruction completes. - [31:31] - read-only - - - SIDE_EN - If 1, the MSB of the Delay/Side-set instruction field is used as side-set enable, rather than a side-set data bit. This allows instructions to perform side-set optionally, rather than on every instruction, but the maximum possible side-set width is reduced from 5 to 4. Note that the value of PINCTRL_SIDESET_COUNT is inclusive of this enable bit. - [30:30] - read-write - - - SIDE_PINDIR - If 1, side-set data is asserted to pin directions, instead of pin values - [29:29] - read-write - - - JMP_PIN - The GPIO number to use as condition for JMP PIN. Unaffected by input mapping. - [28:24] - read-write - - - OUT_EN_SEL - Which data bit to use for inline OUT enable - [23:19] - read-write - - - INLINE_OUT_EN - If 1, use a bit of OUT data as an auxiliary write enable\n - When used in conjunction with OUT_STICKY, writes with an enable of 0 will\n - deassert the latest pin write. This can create useful masking/override behaviour\n - due to the priority ordering of state machine pin writes (SM0 < SM1 < ...) - [18:18] - read-write - - - OUT_STICKY - Continuously assert the most recent OUT/SET to the pins - [17:17] - read-write - - - WRAP_TOP - After reaching this address, execution is wrapped to wrap_bottom.\n - If the instruction is a jump, and the jump condition is true, the jump takes priority. - [16:12] - read-write - - - WRAP_BOTTOM - After reaching wrap_top, execution is wrapped to this address. - [11:7] - read-write - - - STATUS_SEL - Comparison used for the MOV x, STATUS instruction. - [4:4] - read-write - - - TXLEVEL - All-ones if TX FIFO level < N, otherwise all-zeroes - 0 - - - RXLEVEL - All-ones if RX FIFO level < N, otherwise all-zeroes - 1 - - - - - STATUS_N - Comparison level for the MOV x, STATUS instruction - [3:0] - read-write - - - - - SM_SHIFTCTRL - Control behaviour of the input/output shift registers for state machine 0 - 0x8 - 0x000C0000 - - - FJOIN_RX - When 1, RX FIFO steals the TX FIFO's storage, and becomes twice as deep.\n - TX FIFO is disabled as a result (always reads as both full and empty).\n - FIFOs are flushed when this bit is changed. - [31:31] - read-write - - - FJOIN_TX - When 1, TX FIFO steals the RX FIFO's storage, and becomes twice as deep.\n - RX FIFO is disabled as a result (always reads as both full and empty).\n - FIFOs are flushed when this bit is changed. - [30:30] - read-write - - - PULL_THRESH - Number of bits shifted out of OSR before autopull, or conditional pull (PULL IFEMPTY), will take place.\n - Write 0 for value of 32. - [29:25] - read-write - - - PUSH_THRESH - Number of bits shifted into ISR before autopush, or conditional push (PUSH IFFULL), will take place.\n - Write 0 for value of 32. - [24:20] - read-write - - - OUT_SHIFTDIR - 1 = shift out of output shift register to right. 0 = to left. - [19:19] - read-write - - - IN_SHIFTDIR - 1 = shift input shift register to right (data enters from left). 0 = to left. - [18:18] - read-write - - - AUTOPULL - Pull automatically when the output shift register is emptied, i.e. on or following an OUT instruction which causes the output shift counter to reach or exceed PULL_THRESH. - [17:17] - read-write - - - AUTOPUSH - Push automatically when the input shift register is filled, i.e. on an IN instruction which causes the input shift counter to reach or exceed PUSH_THRESH. - [16:16] - read-write - - - - - SM_ADDR - Current instruction address of state machine 0 - 0xC - 0x00000000 - - - SM0_ADDR - [4:0] - read-only - - - - - SM_INSTR - Read to see the instruction currently addressed by state machine 0's program counter\n - Write to execute an instruction immediately (including jumps) and then resume execution. - 0x10 - 0x00000000 - - - SM0_INSTR - [15:0] - read-write - - - - - SM_PINCTRL - State machine pin control - 0x14 - 0x14000000 - - - SIDESET_COUNT - The number of MSBs of the Delay/Side-set instruction field which are used for side-set. Inclusive of the enable bit, if present. Minimum of 0 (all delay bits, no side-set) and maximum of 5 (all side-set, no delay). - [31:29] - read-write - - - SET_COUNT - The number of pins asserted by a SET. In the range 0 to 5 inclusive. - [28:26] - read-write - - - OUT_COUNT - The number of pins asserted by an OUT PINS, OUT PINDIRS or MOV PINS instruction. In the range 0 to 32 inclusive. - [25:20] - read-write - - - IN_BASE - The pin which is mapped to the least-significant bit of a state machine's IN data bus. Higher-numbered pins are mapped to consecutively more-significant data bits, with a modulo of 32 applied to pin number. - [19:15] - read-write - - - SIDESET_BASE - The lowest-numbered pin that will be affected by a side-set operation. The MSBs of an instruction's side-set/delay field (up to 5, determined by SIDESET_COUNT) are used for side-set data, with the remaining LSBs used for delay. The least-significant bit of the side-set portion is the bit written to this pin, with more-significant bits written to higher-numbered pins. - [14:10] - read-write - - - SET_BASE - The lowest-numbered pin that will be affected by a SET PINS or SET PINDIRS instruction. The data written to this pin is the least-significant bit of the SET data. - [9:5] - read-write - - - OUT_BASE - The lowest-numbered pin that will be affected by an OUT PINS, OUT PINDIRS or MOV PINS instruction. The data written to this pin will always be the least-significant bit of the OUT or MOV data. - [4:0] - read-write - - - - - - INTR - Raw Interrupts - 0x128 - 0x00000000 - - - SM3 - [11:11] - read-only - - - SM2 - [10:10] - read-only - - - SM1 - [9:9] - read-only - - - SM0 - [8:8] - read-only - - - SM3_TXNFULL - [7:7] - read-only - - - SM2_TXNFULL - [6:6] - read-only - - - SM1_TXNFULL - [5:5] - read-only - - - SM0_TXNFULL - [4:4] - read-only - - - SM3_RXNEMPTY - [3:3] - read-only - - - SM2_RXNEMPTY - [2:2] - read-only - - - SM1_RXNEMPTY - [1:1] - read-only - - - SM0_RXNEMPTY - [0:0] - read-only - - - - - 2 - 0xC - 0-1 - SM_IRQ%s - Cluster SM_IRQ%s, containing IRQ*_INTE, IRQ*_INTF, IRQ*_INTS - 0x12C - - IRQ_INTE - Interrupt Enable for irq0 - 0x0 - 0x00000000 - - - SM3 - [11:11] - read-write - - - SM2 - [10:10] - read-write - - - SM1 - [9:9] - read-write - - - SM0 - [8:8] - read-write - - - SM3_TXNFULL - [7:7] - read-write - - - SM2_TXNFULL - [6:6] - read-write - - - SM1_TXNFULL - [5:5] - read-write - - - SM0_TXNFULL - [4:4] - read-write - - - SM3_RXNEMPTY - [3:3] - read-write - - - SM2_RXNEMPTY - [2:2] - read-write - - - SM1_RXNEMPTY - [1:1] - read-write - - - SM0_RXNEMPTY - [0:0] - read-write - - - - - IRQ_INTF - Interrupt Force for irq0 - 0x4 - 0x00000000 - - - SM3 - [11:11] - read-write - - - SM2 - [10:10] - read-write - - - SM1 - [9:9] - read-write - - - SM0 - [8:8] - read-write - - - SM3_TXNFULL - [7:7] - read-write - - - SM2_TXNFULL - [6:6] - read-write - - - SM1_TXNFULL - [5:5] - read-write - - - SM0_TXNFULL - [4:4] - read-write - - - SM3_RXNEMPTY - [3:3] - read-write - - - SM2_RXNEMPTY - [2:2] - read-write - - - SM1_RXNEMPTY - [1:1] - read-write - - - SM0_RXNEMPTY - [0:0] - read-write - - - - - IRQ_INTS - Interrupt status after masking & forcing for irq0 - 0x8 - 0x00000000 - - - SM3 - [11:11] - read-only - - - SM2 - [10:10] - read-only - - - SM1 - [9:9] - read-only - - - SM0 - [8:8] - read-only - - - SM3_TXNFULL - [7:7] - read-only - - - SM2_TXNFULL - [6:6] - read-only - - - SM1_TXNFULL - [5:5] - read-only - - - SM0_TXNFULL - [4:4] - read-only - - - SM3_RXNEMPTY - [3:3] - read-only - - - SM2_RXNEMPTY - [2:2] - read-only - - - SM1_RXNEMPTY - [1:1] - read-only - - - SM0_RXNEMPTY - [0:0] - read-only - - - - - - - - PIO1 - 0x50300000 - - PIO1_IRQ_0 - 9 - - - PIO1_IRQ_1 - 10 - - - - SIO - 1 - Single-cycle IO block\n - Provides core-local and inter-core hardware for the two processors, with single-cycle access. - 0xD0000000 - 0x20 - - 0x0 - 0x200 - registers - - - SIO_IRQ_PROC0 - 15 - - - SIO_IRQ_PROC1 - 16 - - - - CPUID - Processor core identifier\n - Value is 0 when read from processor core 0, and 1 when read from processor core 1. - 0x0 - read-only - 0x00000000 - - - GPIO_IN - Input value for GPIO pins - 0x4 - 0x00000000 - - - GPIO_IN - Input value for GPIO0...29 - [29:0] - read-only - - - - - GPIO_HI_IN - Input value for QSPI pins - 0x8 - 0x00000000 - - - GPIO_HI_IN - Input value on QSPI IO in order 0..5: SCLK, SSn, SD0, SD1, SD2, SD3 - [5:0] - read-only - - - - - GPIO_OUT - GPIO output value - 0x10 - 0x00000000 - - - GPIO_OUT - Set output level (1/0 -> high/low) for GPIO0...29.\n - Reading back gives the last value written, NOT the input value from the pins.\n - If core 0 and core 1 both write to GPIO_OUT simultaneously (or to a SET/CLR/XOR alias),\n - the result is as though the write from core 0 took place first,\n - and the write from core 1 was then applied to that intermediate result. - [29:0] - read-write - - - - - GPIO_OUT_SET - GPIO output value set - 0x14 - 0x00000000 - - - GPIO_OUT_SET - Perform an atomic bit-set on GPIO_OUT, i.e. `GPIO_OUT |= wdata` - [29:0] - write-only - - - - - GPIO_OUT_CLR - GPIO output value clear - 0x18 - 0x00000000 - - - GPIO_OUT_CLR - Perform an atomic bit-clear on GPIO_OUT, i.e. `GPIO_OUT &= ~wdata` - [29:0] - write-only - - - - - GPIO_OUT_XOR - GPIO output value XOR - 0x1C - 0x00000000 - - - GPIO_OUT_XOR - Perform an atomic bitwise XOR on GPIO_OUT, i.e. `GPIO_OUT ^= wdata` - [29:0] - write-only - - - - - GPIO_OE - GPIO output enable - 0x20 - 0x00000000 - - - GPIO_OE - Set output enable (1/0 -> output/input) for GPIO0...29.\n - Reading back gives the last value written.\n - If core 0 and core 1 both write to GPIO_OE simultaneously (or to a SET/CLR/XOR alias),\n - the result is as though the write from core 0 took place first,\n - and the write from core 1 was then applied to that intermediate result. - [29:0] - read-write - - - - - GPIO_OE_SET - GPIO output enable set - 0x24 - 0x00000000 - - - GPIO_OE_SET - Perform an atomic bit-set on GPIO_OE, i.e. `GPIO_OE |= wdata` - [29:0] - write-only - - - - - GPIO_OE_CLR - GPIO output enable clear - 0x28 - 0x00000000 - - - GPIO_OE_CLR - Perform an atomic bit-clear on GPIO_OE, i.e. `GPIO_OE &= ~wdata` - [29:0] - write-only - - - - - GPIO_OE_XOR - GPIO output enable XOR - 0x2C - 0x00000000 - - - GPIO_OE_XOR - Perform an atomic bitwise XOR on GPIO_OE, i.e. `GPIO_OE ^= wdata` - [29:0] - write-only - - - - - GPIO_HI_OUT - QSPI output value - 0x30 - 0x00000000 - - - GPIO_HI_OUT - Set output level (1/0 -> high/low) for QSPI IO0...5.\n - Reading back gives the last value written, NOT the input value from the pins.\n - If core 0 and core 1 both write to GPIO_HI_OUT simultaneously (or to a SET/CLR/XOR alias),\n - the result is as though the write from core 0 took place first,\n - and the write from core 1 was then applied to that intermediate result. - [5:0] - read-write - - - - - GPIO_HI_OUT_SET - QSPI output value set - 0x34 - 0x00000000 - - - GPIO_HI_OUT_SET - Perform an atomic bit-set on GPIO_HI_OUT, i.e. `GPIO_HI_OUT |= wdata` - [5:0] - write-only - - - - - GPIO_HI_OUT_CLR - QSPI output value clear - 0x38 - 0x00000000 - - - GPIO_HI_OUT_CLR - Perform an atomic bit-clear on GPIO_HI_OUT, i.e. `GPIO_HI_OUT &= ~wdata` - [5:0] - write-only - - - - - GPIO_HI_OUT_XOR - QSPI output value XOR - 0x3C - 0x00000000 - - - GPIO_HI_OUT_XOR - Perform an atomic bitwise XOR on GPIO_HI_OUT, i.e. `GPIO_HI_OUT ^= wdata` - [5:0] - write-only - - - - - GPIO_HI_OE - QSPI output enable - 0x40 - 0x00000000 - - - GPIO_HI_OE - Set output enable (1/0 -> output/input) for QSPI IO0...5.\n - Reading back gives the last value written.\n - If core 0 and core 1 both write to GPIO_HI_OE simultaneously (or to a SET/CLR/XOR alias),\n - the result is as though the write from core 0 took place first,\n - and the write from core 1 was then applied to that intermediate result. - [5:0] - read-write - - - - - GPIO_HI_OE_SET - QSPI output enable set - 0x44 - 0x00000000 - - - GPIO_HI_OE_SET - Perform an atomic bit-set on GPIO_HI_OE, i.e. `GPIO_HI_OE |= wdata` - [5:0] - write-only - - - - - GPIO_HI_OE_CLR - QSPI output enable clear - 0x48 - 0x00000000 - - - GPIO_HI_OE_CLR - Perform an atomic bit-clear on GPIO_HI_OE, i.e. `GPIO_HI_OE &= ~wdata` - [5:0] - write-only - - - - - GPIO_HI_OE_XOR - QSPI output enable XOR - 0x4C - 0x00000000 - - - GPIO_HI_OE_XOR - Perform an atomic bitwise XOR on GPIO_HI_OE, i.e. `GPIO_HI_OE ^= wdata` - [5:0] - write-only - - - - - FIFO_ST - Status register for inter-core FIFOs (mailboxes).\n - There is one FIFO in the core 0 -> core 1 direction, and one core 1 -> core 0. Both are 32 bits wide and 8 words deep.\n - Core 0 can see the read side of the 1->0 FIFO (RX), and the write side of 0->1 FIFO (TX).\n - Core 1 can see the read side of the 0->1 FIFO (RX), and the write side of 1->0 FIFO (TX).\n - The SIO IRQ for each core is the logical OR of the VLD, WOF and ROE fields of its FIFO_ST register. - 0x50 - 0x00000002 - - - ROE - Sticky flag indicating the RX FIFO was read when empty. This read was ignored by the FIFO. - [3:3] - read-write - oneToClear - - - WOF - Sticky flag indicating the TX FIFO was written when full. This write was ignored by the FIFO. - [2:2] - read-write - oneToClear - - - RDY - Value is 1 if this core's TX FIFO is not full (i.e. if FIFO_WR is ready for more data) - [1:1] - read-only - - - VLD - Value is 1 if this core's RX FIFO is not empty (i.e. if FIFO_RD is valid) - [0:0] - read-only - - - - - FIFO_WR - Write access to this core's TX FIFO - 0x54 - write-only - 0x00000000 - - - FIFO_RD - Read access to this core's RX FIFO - 0x58 - read-only - 0x00000000 - - - SPINLOCK_ST - Spinlock state\n - A bitmap containing the state of all 32 spinlocks (1=locked).\n - Mainly intended for debugging. - 0x5C - read-only - 0x00000000 - - - DIV_UDIVIDEND - Divider unsigned dividend\n - Write to the DIVIDEND operand of the divider, i.e. the p in `p / q`.\n - Any operand write starts a new calculation. The results appear in QUOTIENT, REMAINDER.\n - UDIVIDEND/SDIVIDEND are aliases of the same internal register. The U alias starts an\n - unsigned calculation, and the S alias starts a signed calculation. - 0x60 - read-write - 0x00000000 - - - DIV_UDIVISOR - Divider unsigned divisor\n - Write to the DIVISOR operand of the divider, i.e. the q in `p / q`.\n - Any operand write starts a new calculation. The results appear in QUOTIENT, REMAINDER.\n - UDIVISOR/SDIVISOR are aliases of the same internal register. The U alias starts an\n - unsigned calculation, and the S alias starts a signed calculation. - 0x64 - read-write - 0x00000000 - - - DIV_SDIVIDEND - Divider signed dividend\n - The same as UDIVIDEND, but starts a signed calculation, rather than unsigned. - 0x68 - read-write - 0x00000000 - - - DIV_SDIVISOR - Divider signed divisor\n - The same as UDIVISOR, but starts a signed calculation, rather than unsigned. - 0x6C - read-write - 0x00000000 - - - DIV_QUOTIENT - Divider result quotient\n - The result of `DIVIDEND / DIVISOR` (division). Contents undefined while CSR_READY is low.\n - For signed calculations, QUOTIENT is negative when the signs of DIVIDEND and DIVISOR differ.\n - This register can be written to directly, for context save/restore purposes. This halts any\n - in-progress calculation and sets the CSR_READY and CSR_DIRTY flags.\n - Reading from QUOTIENT clears the CSR_DIRTY flag, so should read results in the order\n - REMAINDER, QUOTIENT if CSR_DIRTY is used. - 0x70 - read-write - 0x00000000 - - - DIV_REMAINDER - Divider result remainder\n - The result of `DIVIDEND % DIVISOR` (modulo). Contents undefined while CSR_READY is low.\n - For signed calculations, REMAINDER is negative only when DIVIDEND is negative.\n - This register can be written to directly, for context save/restore purposes. This halts any\n - in-progress calculation and sets the CSR_READY and CSR_DIRTY flags. - 0x74 - read-write - 0x00000000 - - - DIV_CSR - Control and status register for divider. - 0x78 - 0x00000001 - - - DIRTY - Changes to 1 when any register is written, and back to 0 when QUOTIENT is read.\n - Software can use this flag to make save/restore more efficient (skip if not DIRTY).\n - If the flag is used in this way, it's recommended to either read QUOTIENT only,\n - or REMAINDER and then QUOTIENT, to prevent data loss on context switch. - [1:1] - read-only - - - READY - Reads as 0 when a calculation is in progress, 1 otherwise.\n - Writing an operand (xDIVIDEND, xDIVISOR) will immediately start a new calculation, no\n - matter if one is already in progress.\n - Writing to a result register will immediately terminate any in-progress calculation\n - and set the READY and DIRTY flags. - [0:0] - read-only - - - - - INTERP0_ACCUM0 - Read/write access to accumulator 0 - 0x80 - read-write - 0x00000000 - - - INTERP0_ACCUM1 - Read/write access to accumulator 1 - 0x84 - read-write - 0x00000000 - - - INTERP0_BASE0 - Read/write access to BASE0 register. - 0x88 - read-write - 0x00000000 - - - INTERP0_BASE1 - Read/write access to BASE1 register. - 0x8C - read-write - 0x00000000 - - - INTERP0_BASE2 - Read/write access to BASE2 register. - 0x90 - read-write - 0x00000000 - - - INTERP0_POP_LANE0 - Read LANE0 result, and simultaneously write lane results to both accumulators (POP). - 0x94 - read-only - 0x00000000 - - - INTERP0_POP_LANE1 - Read LANE1 result, and simultaneously write lane results to both accumulators (POP). - 0x98 - read-only - 0x00000000 - - - INTERP0_POP_FULL - Read FULL result, and simultaneously write lane results to both accumulators (POP). - 0x9C - read-only - 0x00000000 - - - INTERP0_PEEK_LANE0 - Read LANE0 result, without altering any internal state (PEEK). - 0xA0 - read-only - 0x00000000 - - - INTERP0_PEEK_LANE1 - Read LANE1 result, without altering any internal state (PEEK). - 0xA4 - read-only - 0x00000000 - - - INTERP0_PEEK_FULL - Read FULL result, without altering any internal state (PEEK). - 0xA8 - read-only - 0x00000000 - - - INTERP0_CTRL_LANE0 - Control register for lane 0 - 0xAC - 0x00000000 - - - OVERF - Set if either OVERF0 or OVERF1 is set. - [25:25] - read-only - - - OVERF1 - Indicates if any masked-off MSBs in ACCUM1 are set. - [24:24] - read-only - - - OVERF0 - Indicates if any masked-off MSBs in ACCUM0 are set. - [23:23] - read-only - - - BLEND - Only present on INTERP0 on each core. If BLEND mode is enabled:\n - - LANE1 result is a linear interpolation between BASE0 and BASE1, controlled\n - by the 8 LSBs of lane 1 shift and mask value (a fractional number between\n - 0 and 255/256ths)\n - - LANE0 result does not have BASE0 added (yields only the 8 LSBs of lane 1 shift+mask value)\n - - FULL result does not have lane 1 shift+mask value added (BASE2 + lane 0 shift+mask)\n - LANE1 SIGNED flag controls whether the interpolation is signed or unsigned. - [21:21] - read-write - - - FORCE_MSB - ORed into bits 29:28 of the lane result presented to the processor on the bus.\n - No effect on the internal 32-bit datapath. Handy for using a lane to generate sequence\n - of pointers into flash or SRAM. - [20:19] - read-write - - - ADD_RAW - If 1, mask + shift is bypassed for LANE0 result. This does not affect FULL result. - [18:18] - read-write - - - CROSS_RESULT - If 1, feed the opposite lane's result into this lane's accumulator on POP. - [17:17] - read-write - - - CROSS_INPUT - If 1, feed the opposite lane's accumulator into this lane's shift + mask hardware.\n - Takes effect even if ADD_RAW is set (the CROSS_INPUT mux is before the shift+mask bypass) - [16:16] - read-write - - - SIGNED - If SIGNED is set, the shifted and masked accumulator value is sign-extended to 32 bits\n - before adding to BASE0, and LANE0 PEEK/POP appear extended to 32 bits when read by processor. - [15:15] - read-write - - - MASK_MSB - The most-significant bit allowed to pass by the mask (inclusive)\n - Setting MSB < LSB may cause chip to turn inside-out - [14:10] - read-write - - - MASK_LSB - The least-significant bit allowed to pass by the mask (inclusive) - [9:5] - read-write - - - SHIFT - Logical right-shift applied to accumulator before masking - [4:0] - read-write - - - - - INTERP0_CTRL_LANE1 - Control register for lane 1 - 0xB0 - 0x00000000 - - - FORCE_MSB - ORed into bits 29:28 of the lane result presented to the processor on the bus.\n - No effect on the internal 32-bit datapath. Handy for using a lane to generate sequence\n - of pointers into flash or SRAM. - [20:19] - read-write - - - ADD_RAW - If 1, mask + shift is bypassed for LANE1 result. This does not affect FULL result. - [18:18] - read-write - - - CROSS_RESULT - If 1, feed the opposite lane's result into this lane's accumulator on POP. - [17:17] - read-write - - - CROSS_INPUT - If 1, feed the opposite lane's accumulator into this lane's shift + mask hardware.\n - Takes effect even if ADD_RAW is set (the CROSS_INPUT mux is before the shift+mask bypass) - [16:16] - read-write - - - SIGNED - If SIGNED is set, the shifted and masked accumulator value is sign-extended to 32 bits\n - before adding to BASE1, and LANE1 PEEK/POP appear extended to 32 bits when read by processor. - [15:15] - read-write - - - MASK_MSB - The most-significant bit allowed to pass by the mask (inclusive)\n - Setting MSB < LSB may cause chip to turn inside-out - [14:10] - read-write - - - MASK_LSB - The least-significant bit allowed to pass by the mask (inclusive) - [9:5] - read-write - - - SHIFT - Logical right-shift applied to accumulator before masking - [4:0] - read-write - - - - - INTERP0_ACCUM0_ADD - Values written here are atomically added to ACCUM0\n - Reading yields lane 0's raw shift and mask value (BASE0 not added). - 0xB4 - 0x00000000 - - - INTERP0_ACCUM0_ADD - [23:0] - read-write - - - - - INTERP0_ACCUM1_ADD - Values written here are atomically added to ACCUM1\n - Reading yields lane 1's raw shift and mask value (BASE1 not added). - 0xB8 - 0x00000000 - - - INTERP0_ACCUM1_ADD - [23:0] - read-write - - - - - INTERP0_BASE_1AND0 - On write, the lower 16 bits go to BASE0, upper bits to BASE1 simultaneously.\n - Each half is sign-extended to 32 bits if that lane's SIGNED flag is set. - 0xBC - write-only - 0x00000000 - - - INTERP1_ACCUM0 - Read/write access to accumulator 0 - 0xC0 - read-write - 0x00000000 - - - INTERP1_ACCUM1 - Read/write access to accumulator 1 - 0xC4 - read-write - 0x00000000 - - - INTERP1_BASE0 - Read/write access to BASE0 register. - 0xC8 - read-write - 0x00000000 - - - INTERP1_BASE1 - Read/write access to BASE1 register. - 0xCC - read-write - 0x00000000 - - - INTERP1_BASE2 - Read/write access to BASE2 register. - 0xD0 - read-write - 0x00000000 - - - INTERP1_POP_LANE0 - Read LANE0 result, and simultaneously write lane results to both accumulators (POP). - 0xD4 - read-only - 0x00000000 - - - INTERP1_POP_LANE1 - Read LANE1 result, and simultaneously write lane results to both accumulators (POP). - 0xD8 - read-only - 0x00000000 - - - INTERP1_POP_FULL - Read FULL result, and simultaneously write lane results to both accumulators (POP). - 0xDC - read-only - 0x00000000 - - - INTERP1_PEEK_LANE0 - Read LANE0 result, without altering any internal state (PEEK). - 0xE0 - read-only - 0x00000000 - - - INTERP1_PEEK_LANE1 - Read LANE1 result, without altering any internal state (PEEK). - 0xE4 - read-only - 0x00000000 - - - INTERP1_PEEK_FULL - Read FULL result, without altering any internal state (PEEK). - 0xE8 - read-only - 0x00000000 - - - INTERP1_CTRL_LANE0 - Control register for lane 0 - 0xEC - 0x00000000 - - - OVERF - Set if either OVERF0 or OVERF1 is set. - [25:25] - read-only - - - OVERF1 - Indicates if any masked-off MSBs in ACCUM1 are set. - [24:24] - read-only - - - OVERF0 - Indicates if any masked-off MSBs in ACCUM0 are set. - [23:23] - read-only - - - CLAMP - Only present on INTERP1 on each core. If CLAMP mode is enabled:\n - - LANE0 result is shifted and masked ACCUM0, clamped by a lower bound of\n - BASE0 and an upper bound of BASE1.\n - - Signedness of these comparisons is determined by LANE0_CTRL_SIGNED - [22:22] - read-write - - - FORCE_MSB - ORed into bits 29:28 of the lane result presented to the processor on the bus.\n - No effect on the internal 32-bit datapath. Handy for using a lane to generate sequence\n - of pointers into flash or SRAM. - [20:19] - read-write - - - ADD_RAW - If 1, mask + shift is bypassed for LANE0 result. This does not affect FULL result. - [18:18] - read-write - - - CROSS_RESULT - If 1, feed the opposite lane's result into this lane's accumulator on POP. - [17:17] - read-write - - - CROSS_INPUT - If 1, feed the opposite lane's accumulator into this lane's shift + mask hardware.\n - Takes effect even if ADD_RAW is set (the CROSS_INPUT mux is before the shift+mask bypass) - [16:16] - read-write - - - SIGNED - If SIGNED is set, the shifted and masked accumulator value is sign-extended to 32 bits\n - before adding to BASE0, and LANE0 PEEK/POP appear extended to 32 bits when read by processor. - [15:15] - read-write - - - MASK_MSB - The most-significant bit allowed to pass by the mask (inclusive)\n - Setting MSB < LSB may cause chip to turn inside-out - [14:10] - read-write - - - MASK_LSB - The least-significant bit allowed to pass by the mask (inclusive) - [9:5] - read-write - - - SHIFT - Logical right-shift applied to accumulator before masking - [4:0] - read-write - - - - - INTERP1_CTRL_LANE1 - Control register for lane 1 - 0xF0 - 0x00000000 - - - FORCE_MSB - ORed into bits 29:28 of the lane result presented to the processor on the bus.\n - No effect on the internal 32-bit datapath. Handy for using a lane to generate sequence\n - of pointers into flash or SRAM. - [20:19] - read-write - - - ADD_RAW - If 1, mask + shift is bypassed for LANE1 result. This does not affect FULL result. - [18:18] - read-write - - - CROSS_RESULT - If 1, feed the opposite lane's result into this lane's accumulator on POP. - [17:17] - read-write - - - CROSS_INPUT - If 1, feed the opposite lane's accumulator into this lane's shift + mask hardware.\n - Takes effect even if ADD_RAW is set (the CROSS_INPUT mux is before the shift+mask bypass) - [16:16] - read-write - - - SIGNED - If SIGNED is set, the shifted and masked accumulator value is sign-extended to 32 bits\n - before adding to BASE1, and LANE1 PEEK/POP appear extended to 32 bits when read by processor. - [15:15] - read-write - - - MASK_MSB - The most-significant bit allowed to pass by the mask (inclusive)\n - Setting MSB < LSB may cause chip to turn inside-out - [14:10] - read-write - - - MASK_LSB - The least-significant bit allowed to pass by the mask (inclusive) - [9:5] - read-write - - - SHIFT - Logical right-shift applied to accumulator before masking - [4:0] - read-write - - - - - INTERP1_ACCUM0_ADD - Values written here are atomically added to ACCUM0\n - Reading yields lane 0's raw shift and mask value (BASE0 not added). - 0xF4 - 0x00000000 - - - INTERP1_ACCUM0_ADD - [23:0] - read-write - - - - - INTERP1_ACCUM1_ADD - Values written here are atomically added to ACCUM1\n - Reading yields lane 1's raw shift and mask value (BASE1 not added). - 0xF8 - 0x00000000 - - - INTERP1_ACCUM1_ADD - [23:0] - read-write - - - - - INTERP1_BASE_1AND0 - On write, the lower 16 bits go to BASE0, upper bits to BASE1 simultaneously.\n - Each half is sign-extended to 32 bits if that lane's SIGNED flag is set. - 0xFC - write-only - 0x00000000 - - - 32 - 0x4 - 0-31 - SPINLOCK%s - Reading from a spinlock address will:\n - - Return 0 if lock is already locked\n - - Otherwise return nonzero, and simultaneously claim the lock\n\n - Writing (any value) releases the lock.\n - If core 0 and core 1 attempt to claim the same lock simultaneously, core 0 wins.\n - The value returned on success is 0x1 << lock number. - 0x100 - read-write - 0x00000000 - - - - - PPB - 1 - 0xE0000000 - 0x20 - - 0x0 - 0x10000 - registers - - - - SYST_CSR - Use the SysTick Control and Status Register to enable the SysTick features. - 0xE010 - 0x00000000 - - - COUNTFLAG - Returns 1 if timer counted to 0 since last time this was read. Clears on read by application or debugger. - [16:16] - read-only - - - CLKSOURCE - SysTick clock source. Always reads as one if SYST_CALIB reports NOREF.\n - Selects the SysTick timer clock source:\n - 0 = External reference clock.\n - 1 = Processor clock. - [2:2] - read-write - - - TICKINT - Enables SysTick exception request:\n - 0 = Counting down to zero does not assert the SysTick exception request.\n - 1 = Counting down to zero to asserts the SysTick exception request. - [1:1] - read-write - - - ENABLE - Enable SysTick counter:\n - 0 = Counter disabled.\n - 1 = Counter enabled. - [0:0] - read-write - - - - - SYST_RVR - Use the SysTick Reload Value Register to specify the start value to load into the current value register when the counter reaches 0. It can be any value between 0 and 0x00FFFFFF. A start value of 0 is possible, but has no effect because the SysTick interrupt and COUNTFLAG are activated when counting from 1 to 0. The reset value of this register is UNKNOWN.\n - To generate a multi-shot timer with a period of N processor clock cycles, use a RELOAD value of N-1. For example, if the SysTick interrupt is required every 100 clock pulses, set RELOAD to 99. - 0xE014 - 0x00000000 - - - RELOAD - Value to load into the SysTick Current Value Register when the counter reaches 0. - [23:0] - read-write - - - - - SYST_CVR - Use the SysTick Current Value Register to find the current value in the register. The reset value of this register is UNKNOWN. - 0xE018 - 0x00000000 - - - CURRENT - Reads return the current value of the SysTick counter. This register is write-clear. Writing to it with any value clears the register to 0. Clearing this register also clears the COUNTFLAG bit of the SysTick Control and Status Register. - [23:0] - read-write - - - - - SYST_CALIB - Use the SysTick Calibration Value Register to enable software to scale to any required speed using divide and multiply. - 0xE01C - 0x00000000 - - - NOREF - If reads as 1, the Reference clock is not provided - the CLKSOURCE bit of the SysTick Control and Status register will be forced to 1 and cannot be cleared to 0. - [31:31] - read-only - - - SKEW - If reads as 1, the calibration value for 10ms is inexact (due to clock frequency). - [30:30] - read-only - - - TENMS - An optional Reload value to be used for 10ms (100Hz) timing, subject to system clock skew errors. If the value reads as 0, the calibration value is not known. - [23:0] - read-only - - - - - NVIC_ISER - Use the Interrupt Set-Enable Register to enable interrupts and determine which interrupts are currently enabled.\n - If a pending interrupt is enabled, the NVIC activates the interrupt based on its priority. If an interrupt is not enabled, asserting its interrupt signal changes the interrupt state to pending, but the NVIC never activates the interrupt, regardless of its priority. - 0xE100 - 0x00000000 - - - SETENA - Interrupt set-enable bits.\n - Write:\n - 0 = No effect.\n - 1 = Enable interrupt.\n - Read:\n - 0 = Interrupt disabled.\n - 1 = Interrupt enabled. - [31:0] - read-write - - - - - NVIC_ICER - Use the Interrupt Clear-Enable Registers to disable interrupts and determine which interrupts are currently enabled. - 0xE180 - 0x00000000 - - - CLRENA - Interrupt clear-enable bits.\n - Write:\n - 0 = No effect.\n - 1 = Disable interrupt.\n - Read:\n - 0 = Interrupt disabled.\n - 1 = Interrupt enabled. - [31:0] - read-write - - - - - NVIC_ISPR - The NVIC_ISPR forces interrupts into the pending state, and shows which interrupts are pending. - 0xE200 - 0x00000000 - - - SETPEND - Interrupt set-pending bits.\n - Write:\n - 0 = No effect.\n - 1 = Changes interrupt state to pending.\n - Read:\n - 0 = Interrupt is not pending.\n - 1 = Interrupt is pending.\n - Note: Writing 1 to the NVIC_ISPR bit corresponding to:\n - An interrupt that is pending has no effect.\n - A disabled interrupt sets the state of that interrupt to pending. - [31:0] - read-write - - - - - NVIC_ICPR - Use the Interrupt Clear-Pending Register to clear pending interrupts and determine which interrupts are currently pending. - 0xE280 - 0x00000000 - - - CLRPEND - Interrupt clear-pending bits.\n - Write:\n - 0 = No effect.\n - 1 = Removes pending state and interrupt.\n - Read:\n - 0 = Interrupt is not pending.\n - 1 = Interrupt is pending. - [31:0] - read-write - - - - - NVIC_IPR0 - Use the Interrupt Priority Registers to assign a priority from 0 to 3 to each of the available interrupts. 0 is the highest priority, and 3 is the lowest.\n - Note: Writing 1 to an NVIC_ICPR bit does not affect the active state of the corresponding interrupt.\n - These registers are only word-accessible - 0xE400 - 0x00000000 - - - IP_3 - Priority of interrupt 3 - [31:30] - read-write - - - IP_2 - Priority of interrupt 2 - [23:22] - read-write - - - IP_1 - Priority of interrupt 1 - [15:14] - read-write - - - IP_0 - Priority of interrupt 0 - [7:6] - read-write - - - - - NVIC_IPR1 - Use the Interrupt Priority Registers to assign a priority from 0 to 3 to each of the available interrupts. 0 is the highest priority, and 3 is the lowest. - 0xE404 - 0x00000000 - - - IP_7 - Priority of interrupt 7 - [31:30] - read-write - - - IP_6 - Priority of interrupt 6 - [23:22] - read-write - - - IP_5 - Priority of interrupt 5 - [15:14] - read-write - - - IP_4 - Priority of interrupt 4 - [7:6] - read-write - - - - - NVIC_IPR2 - Use the Interrupt Priority Registers to assign a priority from 0 to 3 to each of the available interrupts. 0 is the highest priority, and 3 is the lowest. - 0xE408 - 0x00000000 - - - IP_11 - Priority of interrupt 11 - [31:30] - read-write - - - IP_10 - Priority of interrupt 10 - [23:22] - read-write - - - IP_9 - Priority of interrupt 9 - [15:14] - read-write - - - IP_8 - Priority of interrupt 8 - [7:6] - read-write - - - - - NVIC_IPR3 - Use the Interrupt Priority Registers to assign a priority from 0 to 3 to each of the available interrupts. 0 is the highest priority, and 3 is the lowest. - 0xE40C - 0x00000000 - - - IP_15 - Priority of interrupt 15 - [31:30] - read-write - - - IP_14 - Priority of interrupt 14 - [23:22] - read-write - - - IP_13 - Priority of interrupt 13 - [15:14] - read-write - - - IP_12 - Priority of interrupt 12 - [7:6] - read-write - - - - - NVIC_IPR4 - Use the Interrupt Priority Registers to assign a priority from 0 to 3 to each of the available interrupts. 0 is the highest priority, and 3 is the lowest. - 0xE410 - 0x00000000 - - - IP_19 - Priority of interrupt 19 - [31:30] - read-write - - - IP_18 - Priority of interrupt 18 - [23:22] - read-write - - - IP_17 - Priority of interrupt 17 - [15:14] - read-write - - - IP_16 - Priority of interrupt 16 - [7:6] - read-write - - - - - NVIC_IPR5 - Use the Interrupt Priority Registers to assign a priority from 0 to 3 to each of the available interrupts. 0 is the highest priority, and 3 is the lowest. - 0xE414 - 0x00000000 - - - IP_23 - Priority of interrupt 23 - [31:30] - read-write - - - IP_22 - Priority of interrupt 22 - [23:22] - read-write - - - IP_21 - Priority of interrupt 21 - [15:14] - read-write - - - IP_20 - Priority of interrupt 20 - [7:6] - read-write - - - - - NVIC_IPR6 - Use the Interrupt Priority Registers to assign a priority from 0 to 3 to each of the available interrupts. 0 is the highest priority, and 3 is the lowest. - 0xE418 - 0x00000000 - - - IP_27 - Priority of interrupt 27 - [31:30] - read-write - - - IP_26 - Priority of interrupt 26 - [23:22] - read-write - - - IP_25 - Priority of interrupt 25 - [15:14] - read-write - - - IP_24 - Priority of interrupt 24 - [7:6] - read-write - - - - - NVIC_IPR7 - Use the Interrupt Priority Registers to assign a priority from 0 to 3 to each of the available interrupts. 0 is the highest priority, and 3 is the lowest. - 0xE41C - 0x00000000 - - - IP_31 - Priority of interrupt 31 - [31:30] - read-write - - - IP_30 - Priority of interrupt 30 - [23:22] - read-write - - - IP_29 - Priority of interrupt 29 - [15:14] - read-write - - - IP_28 - Priority of interrupt 28 - [7:6] - read-write - - - - - CPUID - Read the CPU ID Base Register to determine: the ID number of the processor core, the version number of the processor core, the implementation details of the processor core. - 0xED00 - 0x410CC601 - - - IMPLEMENTER - Implementor code: 0x41 = ARM - [31:24] - read-only - - - VARIANT - Major revision number n in the rnpm revision status:\n - 0x0 = Revision 0. - [23:20] - read-only - - - ARCHITECTURE - Constant that defines the architecture of the processor:\n - 0xC = ARMv6-M architecture. - [19:16] - read-only - - - PARTNO - Number of processor within family: 0xC60 = Cortex-M0+ - [15:4] - read-only - - - REVISION - Minor revision number m in the rnpm revision status:\n - 0x1 = Patch 1. - [3:0] - read-only - - - - - ICSR - Use the Interrupt Control State Register to set a pending Non-Maskable Interrupt (NMI), set or clear a pending PendSV, set or clear a pending SysTick, check for pending exceptions, check the vector number of the highest priority pended exception, check the vector number of the active exception. - 0xED04 - 0x00000000 - - - NMIPENDSET - Setting this bit will activate an NMI. Since NMI is the highest priority exception, it will activate as soon as it is registered.\n - NMI set-pending bit.\n - Write:\n - 0 = No effect.\n - 1 = Changes NMI exception state to pending.\n - Read:\n - 0 = NMI exception is not pending.\n - 1 = NMI exception is pending.\n - Because NMI is the highest-priority exception, normally the processor enters the NMI\n - exception handler as soon as it detects a write of 1 to this bit. Entering the handler then clears\n - this bit to 0. This means a read of this bit by the NMI exception handler returns 1 only if the\n - NMI signal is reasserted while the processor is executing that handler. - [31:31] - read-write - - - PENDSVSET - PendSV set-pending bit.\n - Write:\n - 0 = No effect.\n - 1 = Changes PendSV exception state to pending.\n - Read:\n - 0 = PendSV exception is not pending.\n - 1 = PendSV exception is pending.\n - Writing 1 to this bit is the only way to set the PendSV exception state to pending. - [28:28] - read-write - - - PENDSVCLR - PendSV clear-pending bit.\n - Write:\n - 0 = No effect.\n - 1 = Removes the pending state from the PendSV exception. - [27:27] - read-write - - - PENDSTSET - SysTick exception set-pending bit.\n - Write:\n - 0 = No effect.\n - 1 = Changes SysTick exception state to pending.\n - Read:\n - 0 = SysTick exception is not pending.\n - 1 = SysTick exception is pending. - [26:26] - read-write - - - PENDSTCLR - SysTick exception clear-pending bit.\n - Write:\n - 0 = No effect.\n - 1 = Removes the pending state from the SysTick exception.\n - This bit is WO. On a register read its value is Unknown. - [25:25] - read-write - - - ISRPREEMPT - The system can only access this bit when the core is halted. It indicates that a pending interrupt is to be taken in the next running cycle. If C_MASKINTS is clear in the Debug Halting Control and Status Register, the interrupt is serviced. - [23:23] - read-only - - - ISRPENDING - External interrupt pending flag - [22:22] - read-only - - - VECTPENDING - Indicates the exception number for the highest priority pending exception: 0 = no pending exceptions. Non zero = The pending state includes the effect of memory-mapped enable and mask registers. It does not include the PRIMASK special-purpose register qualifier. - [20:12] - read-only - - - VECTACTIVE - Active exception number field. Reset clears the VECTACTIVE field. - [8:0] - read-only - - - - - VTOR - The VTOR holds the vector table offset address. - 0xED08 - 0x00000000 - - - TBLOFF - Bits [31:8] of the indicate the vector table offset address. - [31:8] - read-write - - - - - AIRCR - Use the Application Interrupt and Reset Control Register to: determine data endianness, clear all active state information from debug halt mode, request a system reset. - 0xED0C - 0x00000000 - - - VECTKEY - Register key:\n - Reads as Unknown\n - On writes, write 0x05FA to VECTKEY, otherwise the write is ignored. - [31:16] - read-write - - - ENDIANESS - Data endianness implemented:\n - 0 = Little-endian. - [15:15] - read-only - - - SYSRESETREQ - Writing 1 to this bit causes the SYSRESETREQ signal to the outer system to be asserted to request a reset. The intention is to force a large system reset of all major components except for debug. The C_HALT bit in the DHCSR is cleared as a result of the system reset requested. The debugger does not lose contact with the device. - [2:2] - read-write - - - VECTCLRACTIVE - Clears all active state information for fixed and configurable exceptions. This bit: is self-clearing, can only be set by the DAP when the core is halted. When set: clears all active exception status of the processor, forces a return to Thread mode, forces an IPSR of 0. A debugger must re-initialize the stack. - [1:1] - read-write - - - - - SCR - System Control Register. Use the System Control Register for power-management functions: signal to the system when the processor can enter a low power state, control how the processor enters and exits low power states. - 0xED10 - 0x00000000 - - - SEVONPEND - Send Event on Pending bit:\n - 0 = Only enabled interrupts or events can wakeup the processor, disabled interrupts are excluded.\n - 1 = Enabled events and all interrupts, including disabled interrupts, can wakeup the processor.\n - When an event or interrupt becomes pending, the event signal wakes up the processor from WFE. If the\n - processor is not waiting for an event, the event is registered and affects the next WFE.\n - The processor also wakes up on execution of an SEV instruction or an external event. - [4:4] - read-write - - - SLEEPDEEP - Controls whether the processor uses sleep or deep sleep as its low power mode:\n - 0 = Sleep.\n - 1 = Deep sleep. - [2:2] - read-write - - - SLEEPONEXIT - Indicates sleep-on-exit when returning from Handler mode to Thread mode:\n - 0 = Do not sleep when returning to Thread mode.\n - 1 = Enter sleep, or deep sleep, on return from an ISR to Thread mode.\n - Setting this bit to 1 enables an interrupt driven application to avoid returning to an empty main application. - [1:1] - read-write - - - - - CCR - The Configuration and Control Register permanently enables stack alignment and causes unaligned accesses to result in a Hard Fault. - 0xED14 - 0x00000000 - - - STKALIGN - Always reads as one, indicates 8-byte stack alignment on exception entry. On exception entry, the processor uses bit[9] of the stacked PSR to indicate the stack alignment. On return from the exception it uses this stacked bit to restore the correct stack alignment. - [9:9] - read-only - - - UNALIGN_TRP - Always reads as one, indicates that all unaligned accesses generate a HardFault. - [3:3] - read-only - - - - - SHPR2 - System handlers are a special class of exception handler that can have their priority set to any of the priority levels. Use the System Handler Priority Register 2 to set the priority of SVCall. - 0xED1C - 0x00000000 - - - PRI_11 - Priority of system handler 11, SVCall - [31:30] - read-write - - - - - SHPR3 - System handlers are a special class of exception handler that can have their priority set to any of the priority levels. Use the System Handler Priority Register 3 to set the priority of PendSV and SysTick. - 0xED20 - 0x00000000 - - - PRI_15 - Priority of system handler 15, SysTick - [31:30] - read-write - - - PRI_14 - Priority of system handler 14, PendSV - [23:22] - read-write - - - - - SHCSR - Use the System Handler Control and State Register to determine or clear the pending status of SVCall. - 0xED24 - 0x00000000 - - - SVCALLPENDED - Reads as 1 if SVCall is Pending. Write 1 to set pending SVCall, write 0 to clear pending SVCall. - [15:15] - read-write - - - - - MPU_TYPE - Read the MPU Type Register to determine if the processor implements an MPU, and how many regions the MPU supports. - 0xED90 - 0x00000800 - - - IREGION - Instruction region. Reads as zero as ARMv6-M only supports a unified MPU. - [23:16] - read-only - - - DREGION - Number of regions supported by the MPU. - [15:8] - read-only - - - SEPARATE - Indicates support for separate instruction and data address maps. Reads as 0 as ARMv6-M only supports a unified MPU. - [0:0] - read-only - - - - - MPU_CTRL - Use the MPU Control Register to enable and disable the MPU, and to control whether the default memory map is enabled as a background region for privileged accesses, and whether the MPU is enabled for HardFaults and NMIs. - 0xED94 - 0x00000000 - - - PRIVDEFENA - Controls whether the default memory map is enabled as a background region for privileged accesses. This bit is ignored when ENABLE is clear.\n - 0 = If the MPU is enabled, disables use of the default memory map. Any memory access to a location not\n - covered by any enabled region causes a fault.\n - 1 = If the MPU is enabled, enables use of the default memory map as a background region for privileged software accesses.\n - When enabled, the background region acts as if it is region number -1. Any region that is defined and enabled has priority over this default map. - [2:2] - read-write - - - HFNMIENA - Controls the use of the MPU for HardFaults and NMIs. Setting this bit when ENABLE is clear results in UNPREDICTABLE behaviour.\n - When the MPU is enabled:\n - 0 = MPU is disabled during HardFault and NMI handlers, regardless of the value of the ENABLE bit.\n - 1 = the MPU is enabled during HardFault and NMI handlers. - [1:1] - read-write - - - ENABLE - Enables the MPU. If the MPU is disabled, privileged and unprivileged accesses use the default memory map.\n - 0 = MPU disabled.\n - 1 = MPU enabled. - [0:0] - read-write - - - - - MPU_RNR - Use the MPU Region Number Register to select the region currently accessed by MPU_RBAR and MPU_RASR. - 0xED98 - 0x00000000 - - - REGION - Indicates the MPU region referenced by the MPU_RBAR and MPU_RASR registers.\n - The MPU supports 8 memory regions, so the permitted values of this field are 0-7. - [3:0] - read-write - - - - - MPU_RBAR - Read the MPU Region Base Address Register to determine the base address of the region identified by MPU_RNR. Write to update the base address of said region or that of a specified region, with whose number MPU_RNR will also be updated. - 0xED9C - 0x00000000 - - - ADDR - Base address of the region. - [31:8] - read-write - - - VALID - On writes, indicates whether the write must update the base address of the region identified by the REGION field, updating the MPU_RNR to indicate this new region.\n - Write:\n - 0 = MPU_RNR not changed, and the processor:\n - Updates the base address for the region specified in the MPU_RNR.\n - Ignores the value of the REGION field.\n - 1 = The processor:\n - Updates the value of the MPU_RNR to the value of the REGION field.\n - Updates the base address for the region specified in the REGION field.\n - Always reads as zero. - [4:4] - read-write - - - REGION - On writes, specifies the number of the region whose base address to update provided VALID is set written as 1. On reads, returns bits [3:0] of MPU_RNR. - [3:0] - read-write - - - - - MPU_RASR - Use the MPU Region Attribute and Size Register to define the size, access behaviour and memory type of the region identified by MPU_RNR, and enable that region. - 0xEDA0 - 0x00000000 - - - ATTRS - The MPU Region Attribute field. Use to define the region attribute control.\n - 28 = XN: Instruction access disable bit:\n - 0 = Instruction fetches enabled.\n - 1 = Instruction fetches disabled.\n - 26:24 = AP: Access permission field\n - 18 = S: Shareable bit\n - 17 = C: Cacheable bit\n - 16 = B: Bufferable bit - [31:16] - read-write - - - SRD - Subregion Disable. For regions of 256 bytes or larger, each bit of this field controls whether one of the eight equal subregions is enabled. - [15:8] - read-write - - - SIZE - Indicates the region size. Region size in bytes = 2^(SIZE+1). The minimum permitted value is 7 (b00111) = 256Bytes - [5:1] - read-write - - - ENABLE - Enables the region. - [0:0] - read-write - - - - - - - SW_IRQ - Virtual Peripheral to access unused NVIC software interrupts - 0x00000000 - - sw0_irq - Software IRQ 0 - 26 - - - sw1_irq - Software IRQ 1 - 27 - - - sw2_irq - Software IRQ 2 - 28 - - - sw3_irq - Software IRQ 3 - 29 - - - sw4_irq - Software IRQ 4 - 30 - - - sw5_irq - Software IRQ 5 - 31 - - - - \ No newline at end of file diff --git a/Tools/SVDs/rp235x.patched.svd b/Tools/SVDs/rp235x.patched.svd deleted file mode 100644 index 91ff49b5..00000000 --- a/Tools/SVDs/rp235x.patched.svd +++ /dev/null @@ -1,64929 +0,0 @@ - - - - Raspberry Pi - RP2350 - RP - 0.1 - Dual Cortex-M33 or Hazard3 processors at 150MHz - 520kB on-chip SRAM, in 10 independent banks - Extended low-power sleep states with optional SRAM retention: as low as 10uA DVDD - 8kB of one-time-programmable storage (OTP) - Up to 16MB of external QSPI flash/PSRAM via dedicated QSPI bus - Additional 16MB flash/PSRAM accessible via optional second chip-select - On-chip switched-mode power supply to generate core voltage - Low-quiescent-current LDO mode can be enabled for sleep states - 2x on-chip PLLs for internal or external clock generation - GPIOs are 5V-tolerant (powered), and 3.3V-failsafe (unpowered) - Security features: - Optional boot signing, enforced by on-chip mask ROM, with key fingerprint in OTP - Protected OTP storage for optional boot decryption key - Global bus filtering based on Arm or RISC-V security/privilege levels - Peripherals, GPIOs and DMA channels individually assignable to security domains - Hardware mitigations for fault injection attacks - Hardware SHA-256 accelerator - Peripherals: - 2x UARTs - 2x SPI controllers - 2x I2C controllers - 24x PWM channels - USB 1.1 controller and PHY, with host and device support - 12x PIO state machines - 1x HSTX peripheral - Copyright (c) 2024 Raspberry Pi Ltd. - - SPDX-License-Identifier: BSD-3-Clause - - CM33 - r1p0 - little - true - true - true - true - 4 - false - 52 - 8 - - 8 - 32 - 0x20 - read-write - 0x00000000 - 0xFFFFFFFF - - - RESETS - 0x40020000 - - 0x0 - 0xC - registers - - - - RESET - 0x0 - 0x1FFFFFFF - - - USBCTRL - [28:28] - read-write - - - UART1 - [27:27] - read-write - - - UART0 - [26:26] - read-write - - - TRNG - [25:25] - read-write - - - TIMER1 - [24:24] - read-write - - - TIMER0 - [23:23] - read-write - - - TBMAN - [22:22] - read-write - - - SYSINFO - [21:21] - read-write - - - SYSCFG - [20:20] - read-write - - - SPI1 - [19:19] - read-write - - - SPI0 - [18:18] - read-write - - - SHA256 - [17:17] - read-write - - - PWM - [16:16] - read-write - - - PLL_USB - [15:15] - read-write - - - PLL_SYS - [14:14] - read-write - - - PIO2 - [13:13] - read-write - - - PIO1 - [12:12] - read-write - - - PIO0 - [11:11] - read-write - - - PADS_QSPI - [10:10] - read-write - - - PADS_BANK0 - [9:9] - read-write - - - JTAG - [8:8] - read-write - - - IO_QSPI - [7:7] - read-write - - - IO_BANK0 - [6:6] - read-write - - - I2C1 - [5:5] - read-write - - - I2C0 - [4:4] - read-write - - - HSTX - [3:3] - read-write - - - DMA - [2:2] - read-write - - - BUSCTRL - [1:1] - read-write - - - ADC - [0:0] - read-write - - - - - WDSEL - 0x4 - 0x00000000 - - - USBCTRL - [28:28] - read-write - - - UART1 - [27:27] - read-write - - - UART0 - [26:26] - read-write - - - TRNG - [25:25] - read-write - - - TIMER1 - [24:24] - read-write - - - TIMER0 - [23:23] - read-write - - - TBMAN - [22:22] - read-write - - - SYSINFO - [21:21] - read-write - - - SYSCFG - [20:20] - read-write - - - SPI1 - [19:19] - read-write - - - SPI0 - [18:18] - read-write - - - SHA256 - [17:17] - read-write - - - PWM - [16:16] - read-write - - - PLL_USB - [15:15] - read-write - - - PLL_SYS - [14:14] - read-write - - - PIO2 - [13:13] - read-write - - - PIO1 - [12:12] - read-write - - - PIO0 - [11:11] - read-write - - - PADS_QSPI - [10:10] - read-write - - - PADS_BANK0 - [9:9] - read-write - - - JTAG - [8:8] - read-write - - - IO_QSPI - [7:7] - read-write - - - IO_BANK0 - [6:6] - read-write - - - I2C1 - [5:5] - read-write - - - I2C0 - [4:4] - read-write - - - HSTX - [3:3] - read-write - - - DMA - [2:2] - read-write - - - BUSCTRL - [1:1] - read-write - - - ADC - [0:0] - read-write - - - - - RESET_DONE - 0x8 - 0x00000000 - - - USBCTRL - [28:28] - read-only - - - UART1 - [27:27] - read-only - - - UART0 - [26:26] - read-only - - - TRNG - [25:25] - read-only - - - TIMER1 - [24:24] - read-only - - - TIMER0 - [23:23] - read-only - - - TBMAN - [22:22] - read-only - - - SYSINFO - [21:21] - read-only - - - SYSCFG - [20:20] - read-only - - - SPI1 - [19:19] - read-only - - - SPI0 - [18:18] - read-only - - - SHA256 - [17:17] - read-only - - - PWM - [16:16] - read-only - - - PLL_USB - [15:15] - read-only - - - PLL_SYS - [14:14] - read-only - - - PIO2 - [13:13] - read-only - - - PIO1 - [12:12] - read-only - - - PIO0 - [11:11] - read-only - - - PADS_QSPI - [10:10] - read-only - - - PADS_BANK0 - [9:9] - read-only - - - JTAG - [8:8] - read-only - - - IO_QSPI - [7:7] - read-only - - - IO_BANK0 - [6:6] - read-only - - - I2C1 - [5:5] - read-only - - - I2C0 - [4:4] - read-only - - - HSTX - [3:3] - read-only - - - DMA - [2:2] - read-only - - - BUSCTRL - [1:1] - read-only - - - ADC - [0:0] - read-only - - - - - - - PSM - 0x40018000 - - 0x0 - 0x10 - registers - - - - FRCE_ON - Force block out of reset (i.e. power it on) - 0x0 - 0x00000000 - - - PROC1 - [24:24] - read-write - - - PROC0 - [23:23] - read-write - - - ACCESSCTRL - [22:22] - read-write - - - SIO - [21:21] - read-write - - - XIP - [20:20] - read-write - - - SRAM9 - [19:19] - read-write - - - SRAM8 - [18:18] - read-write - - - SRAM7 - [17:17] - read-write - - - SRAM6 - [16:16] - read-write - - - SRAM5 - [15:15] - read-write - - - SRAM4 - [14:14] - read-write - - - SRAM3 - [13:13] - read-write - - - SRAM2 - [12:12] - read-write - - - SRAM1 - [11:11] - read-write - - - SRAM0 - [10:10] - read-write - - - BOOTRAM - [9:9] - read-write - - - ROM - [8:8] - read-write - - - BUSFABRIC - [7:7] - read-write - - - PSM_READY - [6:6] - read-write - - - CLOCKS - [5:5] - read-write - - - RESETS - [4:4] - read-write - - - XOSC - [3:3] - read-write - - - ROSC - [2:2] - read-write - - - OTP - [1:1] - read-write - - - PROC_COLD - [0:0] - read-write - - - - - FRCE_OFF - Force into reset (i.e. power it off) - 0x4 - 0x00000000 - - - PROC1 - [24:24] - read-write - - - PROC0 - [23:23] - read-write - - - ACCESSCTRL - [22:22] - read-write - - - SIO - [21:21] - read-write - - - XIP - [20:20] - read-write - - - SRAM9 - [19:19] - read-write - - - SRAM8 - [18:18] - read-write - - - SRAM7 - [17:17] - read-write - - - SRAM6 - [16:16] - read-write - - - SRAM5 - [15:15] - read-write - - - SRAM4 - [14:14] - read-write - - - SRAM3 - [13:13] - read-write - - - SRAM2 - [12:12] - read-write - - - SRAM1 - [11:11] - read-write - - - SRAM0 - [10:10] - read-write - - - BOOTRAM - [9:9] - read-write - - - ROM - [8:8] - read-write - - - BUSFABRIC - [7:7] - read-write - - - PSM_READY - [6:6] - read-write - - - CLOCKS - [5:5] - read-write - - - RESETS - [4:4] - read-write - - - XOSC - [3:3] - read-write - - - ROSC - [2:2] - read-write - - - OTP - [1:1] - read-write - - - PROC_COLD - [0:0] - read-write - - - - - WDSEL - Set to 1 if the watchdog should reset this - 0x8 - 0x00000000 - - - PROC1 - [24:24] - read-write - - - PROC0 - [23:23] - read-write - - - ACCESSCTRL - [22:22] - read-write - - - SIO - [21:21] - read-write - - - XIP - [20:20] - read-write - - - SRAM9 - [19:19] - read-write - - - SRAM8 - [18:18] - read-write - - - SRAM7 - [17:17] - read-write - - - SRAM6 - [16:16] - read-write - - - SRAM5 - [15:15] - read-write - - - SRAM4 - [14:14] - read-write - - - SRAM3 - [13:13] - read-write - - - SRAM2 - [12:12] - read-write - - - SRAM1 - [11:11] - read-write - - - SRAM0 - [10:10] - read-write - - - BOOTRAM - [9:9] - read-write - - - ROM - [8:8] - read-write - - - BUSFABRIC - [7:7] - read-write - - - PSM_READY - [6:6] - read-write - - - CLOCKS - [5:5] - read-write - - - RESETS - [4:4] - read-write - - - XOSC - [3:3] - read-write - - - ROSC - [2:2] - read-write - - - OTP - [1:1] - read-write - - - PROC_COLD - [0:0] - read-write - - - - - DONE - Is the subsystem ready? - 0xC - 0x00000000 - - - PROC1 - [24:24] - read-only - - - PROC0 - [23:23] - read-only - - - ACCESSCTRL - [22:22] - read-only - - - SIO - [21:21] - read-only - - - XIP - [20:20] - read-only - - - SRAM9 - [19:19] - read-only - - - SRAM8 - [18:18] - read-only - - - SRAM7 - [17:17] - read-only - - - SRAM6 - [16:16] - read-only - - - SRAM5 - [15:15] - read-only - - - SRAM4 - [14:14] - read-only - - - SRAM3 - [13:13] - read-only - - - SRAM2 - [12:12] - read-only - - - SRAM1 - [11:11] - read-only - - - SRAM0 - [10:10] - read-only - - - BOOTRAM - [9:9] - read-only - - - ROM - [8:8] - read-only - - - BUSFABRIC - [7:7] - read-only - - - PSM_READY - [6:6] - read-only - - - CLOCKS - [5:5] - read-only - - - RESETS - [4:4] - read-only - - - XOSC - [3:3] - read-only - - - ROSC - [2:2] - read-only - - - OTP - [1:1] - read-only - - - PROC_COLD - [0:0] - read-only - - - - - - - CLOCKS - 0x40010000 - - 0x0 - 0xD4 - registers - - - CLOCKS_IRQ - 30 - - - - CLK_GPOUT0_CTRL - Clock control, can be changed on-the-fly (except for auxsrc) - 0x0 - 0x00000000 - - - ENABLED - clock generator is enabled - [28:28] - read-only - - - NUDGE - An edge on this signal shifts the phase of the output by 1 cycle of the input clock - This can be done at any time - [20:20] - read-write - - - PHASE - This delays the enable signal by up to 3 cycles of the input clock - This must be set before the clock is enabled to have any effect - [17:16] - read-write - - - DC50 - Enables duty cycle correction for odd divisors, can be changed on-the-fly - [12:12] - read-write - - - ENABLE - Starts and stops the clock generator cleanly - [11:11] - read-write - - - KILL - Asynchronously kills the clock generator, enable must be set low before deasserting kill - [10:10] - read-write - - - AUXSRC - Selects the auxiliary clock source, will glitch when switching - [8:5] - read-write - - - clksrc_pll_sys - 0 - - - clksrc_gpin0 - 1 - - - clksrc_gpin1 - 2 - - - clksrc_pll_usb - 3 - - - clksrc_pll_usb_primary_ref_opcg - 4 - - - rosc_clksrc - 5 - - - xosc_clksrc - 6 - - - lposc_clksrc - 7 - - - clk_sys - 8 - - - clk_usb - 9 - - - clk_adc - 10 - - - clk_ref - 11 - - - clk_peri - 12 - - - clk_hstx - 13 - - - otp_clk2fc - 14 - - - - - - - CLK_GPOUT0_DIV - 0x4 - 0x00010000 - - - INT - Integer part of clock divisor, 0 -> max+1, can be changed on-the-fly - [31:16] - read-write - - - FRAC - Fractional component of the divisor, can be changed on-the-fly - [15:0] - read-write - - - - - CLK_GPOUT0_SELECTED - Indicates which src is currently selected (one-hot) - 0x8 - 0x00000001 - - - CLK_GPOUT0_SELECTED - This slice does not have a glitchless mux (only the AUX_SRC field is present, not SRC) so this register is hardwired to 0x1. - [0:0] - read-only - - - - - CLK_GPOUT1_CTRL - Clock control, can be changed on-the-fly (except for auxsrc) - 0xC - 0x00000000 - - - ENABLED - clock generator is enabled - [28:28] - read-only - - - NUDGE - An edge on this signal shifts the phase of the output by 1 cycle of the input clock - This can be done at any time - [20:20] - read-write - - - PHASE - This delays the enable signal by up to 3 cycles of the input clock - This must be set before the clock is enabled to have any effect - [17:16] - read-write - - - DC50 - Enables duty cycle correction for odd divisors, can be changed on-the-fly - [12:12] - read-write - - - ENABLE - Starts and stops the clock generator cleanly - [11:11] - read-write - - - KILL - Asynchronously kills the clock generator, enable must be set low before deasserting kill - [10:10] - read-write - - - AUXSRC - Selects the auxiliary clock source, will glitch when switching - [8:5] - read-write - - - clksrc_pll_sys - 0 - - - clksrc_gpin0 - 1 - - - clksrc_gpin1 - 2 - - - clksrc_pll_usb - 3 - - - clksrc_pll_usb_primary_ref_opcg - 4 - - - rosc_clksrc - 5 - - - xosc_clksrc - 6 - - - lposc_clksrc - 7 - - - clk_sys - 8 - - - clk_usb - 9 - - - clk_adc - 10 - - - clk_ref - 11 - - - clk_peri - 12 - - - clk_hstx - 13 - - - otp_clk2fc - 14 - - - - - - - CLK_GPOUT1_DIV - 0x10 - 0x00010000 - - - INT - Integer part of clock divisor, 0 -> max+1, can be changed on-the-fly - [31:16] - read-write - - - FRAC - Fractional component of the divisor, can be changed on-the-fly - [15:0] - read-write - - - - - CLK_GPOUT1_SELECTED - Indicates which src is currently selected (one-hot) - 0x14 - 0x00000001 - - - CLK_GPOUT1_SELECTED - This slice does not have a glitchless mux (only the AUX_SRC field is present, not SRC) so this register is hardwired to 0x1. - [0:0] - read-only - - - - - CLK_GPOUT2_CTRL - Clock control, can be changed on-the-fly (except for auxsrc) - 0x18 - 0x00000000 - - - ENABLED - clock generator is enabled - [28:28] - read-only - - - NUDGE - An edge on this signal shifts the phase of the output by 1 cycle of the input clock - This can be done at any time - [20:20] - read-write - - - PHASE - This delays the enable signal by up to 3 cycles of the input clock - This must be set before the clock is enabled to have any effect - [17:16] - read-write - - - DC50 - Enables duty cycle correction for odd divisors, can be changed on-the-fly - [12:12] - read-write - - - ENABLE - Starts and stops the clock generator cleanly - [11:11] - read-write - - - KILL - Asynchronously kills the clock generator, enable must be set low before deasserting kill - [10:10] - read-write - - - AUXSRC - Selects the auxiliary clock source, will glitch when switching - [8:5] - read-write - - - clksrc_pll_sys - 0 - - - clksrc_gpin0 - 1 - - - clksrc_gpin1 - 2 - - - clksrc_pll_usb - 3 - - - clksrc_pll_usb_primary_ref_opcg - 4 - - - rosc_clksrc_ph - 5 - - - xosc_clksrc - 6 - - - lposc_clksrc - 7 - - - clk_sys - 8 - - - clk_usb - 9 - - - clk_adc - 10 - - - clk_ref - 11 - - - clk_peri - 12 - - - clk_hstx - 13 - - - otp_clk2fc - 14 - - - - - - - CLK_GPOUT2_DIV - 0x1C - 0x00010000 - - - INT - Integer part of clock divisor, 0 -> max+1, can be changed on-the-fly - [31:16] - read-write - - - FRAC - Fractional component of the divisor, can be changed on-the-fly - [15:0] - read-write - - - - - CLK_GPOUT2_SELECTED - Indicates which src is currently selected (one-hot) - 0x20 - 0x00000001 - - - CLK_GPOUT2_SELECTED - This slice does not have a glitchless mux (only the AUX_SRC field is present, not SRC) so this register is hardwired to 0x1. - [0:0] - read-only - - - - - CLK_GPOUT3_CTRL - Clock control, can be changed on-the-fly (except for auxsrc) - 0x24 - 0x00000000 - - - ENABLED - clock generator is enabled - [28:28] - read-only - - - NUDGE - An edge on this signal shifts the phase of the output by 1 cycle of the input clock - This can be done at any time - [20:20] - read-write - - - PHASE - This delays the enable signal by up to 3 cycles of the input clock - This must be set before the clock is enabled to have any effect - [17:16] - read-write - - - DC50 - Enables duty cycle correction for odd divisors, can be changed on-the-fly - [12:12] - read-write - - - ENABLE - Starts and stops the clock generator cleanly - [11:11] - read-write - - - KILL - Asynchronously kills the clock generator, enable must be set low before deasserting kill - [10:10] - read-write - - - AUXSRC - Selects the auxiliary clock source, will glitch when switching - [8:5] - read-write - - - clksrc_pll_sys - 0 - - - clksrc_gpin0 - 1 - - - clksrc_gpin1 - 2 - - - clksrc_pll_usb - 3 - - - clksrc_pll_usb_primary_ref_opcg - 4 - - - rosc_clksrc_ph - 5 - - - xosc_clksrc - 6 - - - lposc_clksrc - 7 - - - clk_sys - 8 - - - clk_usb - 9 - - - clk_adc - 10 - - - clk_ref - 11 - - - clk_peri - 12 - - - clk_hstx - 13 - - - otp_clk2fc - 14 - - - - - - - CLK_GPOUT3_DIV - 0x28 - 0x00010000 - - - INT - Integer part of clock divisor, 0 -> max+1, can be changed on-the-fly - [31:16] - read-write - - - FRAC - Fractional component of the divisor, can be changed on-the-fly - [15:0] - read-write - - - - - CLK_GPOUT3_SELECTED - Indicates which src is currently selected (one-hot) - 0x2C - 0x00000001 - - - CLK_GPOUT3_SELECTED - This slice does not have a glitchless mux (only the AUX_SRC field is present, not SRC) so this register is hardwired to 0x1. - [0:0] - read-only - - - - - CLK_REF_CTRL - Clock control, can be changed on-the-fly (except for auxsrc) - 0x30 - 0x00000000 - - - AUXSRC - Selects the auxiliary clock source, will glitch when switching - [6:5] - read-write - - - clksrc_pll_usb - 0 - - - clksrc_gpin0 - 1 - - - clksrc_gpin1 - 2 - - - clksrc_pll_usb_primary_ref_opcg - 3 - - - - - SRC - Selects the clock source glitchlessly, can be changed on-the-fly - [1:0] - read-write - - - rosc_clksrc_ph - 0 - - - clksrc_clk_ref_aux - 1 - - - xosc_clksrc - 2 - - - lposc_clksrc - 3 - - - - - - - CLK_REF_DIV - 0x34 - 0x00010000 - - - INT - Integer part of clock divisor, 0 -> max+1, can be changed on-the-fly - [23:16] - read-write - - - - - CLK_REF_SELECTED - Indicates which src is currently selected (one-hot) - 0x38 - 0x00000001 - - - CLK_REF_SELECTED - The glitchless multiplexer does not switch instantaneously (to avoid glitches), so software should poll this register to wait for the switch to complete. This register contains one decoded bit for each of the clock sources enumerated in the CTRL SRC field. At most one of these bits will be set at any time, indicating that clock is currently present at the output of the glitchless mux. Whilst switching is in progress, this register may briefly show all-0s. - [3:0] - read-only - - - - - CLK_SYS_CTRL - Clock control, can be changed on-the-fly (except for auxsrc) - 0x3C - 0x00000000 - - - AUXSRC - Selects the auxiliary clock source, will glitch when switching - [7:5] - read-write - - - clksrc_pll_sys - 0 - - - clksrc_pll_usb - 1 - - - rosc_clksrc - 2 - - - xosc_clksrc - 3 - - - clksrc_gpin0 - 4 - - - clksrc_gpin1 - 5 - - - - - SRC - Selects the clock source glitchlessly, can be changed on-the-fly - [0:0] - read-write - - - clk_ref - 0 - - - clksrc_clk_sys_aux - 1 - - - - - - - CLK_SYS_DIV - 0x40 - 0x00010000 - - - INT - Integer part of clock divisor, 0 -> max+1, can be changed on-the-fly - [31:16] - read-write - - - FRAC - Fractional component of the divisor, can be changed on-the-fly - [15:0] - read-write - - - - - CLK_SYS_SELECTED - Indicates which src is currently selected (one-hot) - 0x44 - 0x00000001 - - - CLK_SYS_SELECTED - The glitchless multiplexer does not switch instantaneously (to avoid glitches), so software should poll this register to wait for the switch to complete. This register contains one decoded bit for each of the clock sources enumerated in the CTRL SRC field. At most one of these bits will be set at any time, indicating that clock is currently present at the output of the glitchless mux. Whilst switching is in progress, this register may briefly show all-0s. - [1:0] - read-only - - - - - CLK_PERI_CTRL - Clock control, can be changed on-the-fly (except for auxsrc) - 0x48 - 0x00000000 - - - ENABLED - clock generator is enabled - [28:28] - read-only - - - ENABLE - Starts and stops the clock generator cleanly - [11:11] - read-write - - - KILL - Asynchronously kills the clock generator, enable must be set low before deasserting kill - [10:10] - read-write - - - AUXSRC - Selects the auxiliary clock source, will glitch when switching - [7:5] - read-write - - - clk_sys - 0 - - - clksrc_pll_sys - 1 - - - clksrc_pll_usb - 2 - - - rosc_clksrc_ph - 3 - - - xosc_clksrc - 4 - - - clksrc_gpin0 - 5 - - - clksrc_gpin1 - 6 - - - - - - - CLK_PERI_DIV - 0x4C - 0x00010000 - - - INT - Integer part of clock divisor, 0 -> max+1, can be changed on-the-fly - [17:16] - read-write - - - - - CLK_PERI_SELECTED - Indicates which src is currently selected (one-hot) - 0x50 - 0x00000001 - - - CLK_PERI_SELECTED - This slice does not have a glitchless mux (only the AUX_SRC field is present, not SRC) so this register is hardwired to 0x1. - [0:0] - read-only - - - - - CLK_HSTX_CTRL - Clock control, can be changed on-the-fly (except for auxsrc) - 0x54 - 0x00000000 - - - ENABLED - clock generator is enabled - [28:28] - read-only - - - NUDGE - An edge on this signal shifts the phase of the output by 1 cycle of the input clock - This can be done at any time - [20:20] - read-write - - - PHASE - This delays the enable signal by up to 3 cycles of the input clock - This must be set before the clock is enabled to have any effect - [17:16] - read-write - - - ENABLE - Starts and stops the clock generator cleanly - [11:11] - read-write - - - KILL - Asynchronously kills the clock generator, enable must be set low before deasserting kill - [10:10] - read-write - - - AUXSRC - Selects the auxiliary clock source, will glitch when switching - [7:5] - read-write - - - clk_sys - 0 - - - clksrc_pll_sys - 1 - - - clksrc_pll_usb - 2 - - - clksrc_gpin0 - 3 - - - clksrc_gpin1 - 4 - - - - - - - CLK_HSTX_DIV - 0x58 - 0x00010000 - - - INT - Integer part of clock divisor, 0 -> max+1, can be changed on-the-fly - [17:16] - read-write - - - - - CLK_HSTX_SELECTED - Indicates which src is currently selected (one-hot) - 0x5C - 0x00000001 - - - CLK_HSTX_SELECTED - This slice does not have a glitchless mux (only the AUX_SRC field is present, not SRC) so this register is hardwired to 0x1. - [0:0] - read-only - - - - - CLK_USB_CTRL - Clock control, can be changed on-the-fly (except for auxsrc) - 0x60 - 0x00000000 - - - ENABLED - clock generator is enabled - [28:28] - read-only - - - NUDGE - An edge on this signal shifts the phase of the output by 1 cycle of the input clock - This can be done at any time - [20:20] - read-write - - - PHASE - This delays the enable signal by up to 3 cycles of the input clock - This must be set before the clock is enabled to have any effect - [17:16] - read-write - - - ENABLE - Starts and stops the clock generator cleanly - [11:11] - read-write - - - KILL - Asynchronously kills the clock generator, enable must be set low before deasserting kill - [10:10] - read-write - - - AUXSRC - Selects the auxiliary clock source, will glitch when switching - [7:5] - read-write - - - clksrc_pll_usb - 0 - - - clksrc_pll_sys - 1 - - - rosc_clksrc_ph - 2 - - - xosc_clksrc - 3 - - - clksrc_gpin0 - 4 - - - clksrc_gpin1 - 5 - - - - - - - CLK_USB_DIV - 0x64 - 0x00010000 - - - INT - Integer part of clock divisor, 0 -> max+1, can be changed on-the-fly - [19:16] - read-write - - - - - CLK_USB_SELECTED - Indicates which src is currently selected (one-hot) - 0x68 - 0x00000001 - - - CLK_USB_SELECTED - This slice does not have a glitchless mux (only the AUX_SRC field is present, not SRC) so this register is hardwired to 0x1. - [0:0] - read-only - - - - - CLK_ADC_CTRL - Clock control, can be changed on-the-fly (except for auxsrc) - 0x6C - 0x00000000 - - - ENABLED - clock generator is enabled - [28:28] - read-only - - - NUDGE - An edge on this signal shifts the phase of the output by 1 cycle of the input clock - This can be done at any time - [20:20] - read-write - - - PHASE - This delays the enable signal by up to 3 cycles of the input clock - This must be set before the clock is enabled to have any effect - [17:16] - read-write - - - ENABLE - Starts and stops the clock generator cleanly - [11:11] - read-write - - - KILL - Asynchronously kills the clock generator, enable must be set low before deasserting kill - [10:10] - read-write - - - AUXSRC - Selects the auxiliary clock source, will glitch when switching - [7:5] - read-write - - - clksrc_pll_usb - 0 - - - clksrc_pll_sys - 1 - - - rosc_clksrc_ph - 2 - - - xosc_clksrc - 3 - - - clksrc_gpin0 - 4 - - - clksrc_gpin1 - 5 - - - - - - - CLK_ADC_DIV - 0x70 - 0x00010000 - - - INT - Integer part of clock divisor, 0 -> max+1, can be changed on-the-fly - [19:16] - read-write - - - - - CLK_ADC_SELECTED - Indicates which src is currently selected (one-hot) - 0x74 - 0x00000001 - - - CLK_ADC_SELECTED - This slice does not have a glitchless mux (only the AUX_SRC field is present, not SRC) so this register is hardwired to 0x1. - [0:0] - read-only - - - - - DFTCLK_XOSC_CTRL - 0x78 - 0x00000000 - - - SRC - [1:0] - read-write - - - NULL - 0 - - - clksrc_pll_usb_primary - 1 - - - clksrc_gpin0 - 2 - - - - - - - DFTCLK_ROSC_CTRL - 0x7C - 0x00000000 - - - SRC - [1:0] - read-write - - - NULL - 0 - - - clksrc_pll_sys_primary_rosc - 1 - - - clksrc_gpin1 - 2 - - - - - - - DFTCLK_LPOSC_CTRL - 0x80 - 0x00000000 - - - SRC - [1:0] - read-write - - - NULL - 0 - - - clksrc_pll_usb_primary_lposc - 1 - - - clksrc_gpin1 - 2 - - - - - - - CLK_SYS_RESUS_CTRL - 0x84 - 0x000000FF - - - CLEAR - For clearing the resus after the fault that triggered it has been corrected - [16:16] - read-write - - - FRCE - Force a resus, for test purposes only - [12:12] - read-write - - - ENABLE - Enable resus - [8:8] - read-write - - - TIMEOUT - This is expressed as a number of clk_ref cycles - and must be >= 2x clk_ref_freq/min_clk_tst_freq - [7:0] - read-write - - - - - CLK_SYS_RESUS_STATUS - 0x88 - 0x00000000 - - - RESUSSED - Clock has been resuscitated, correct the error then send ctrl_clear=1 - [0:0] - read-only - - - - - FC0_REF_KHZ - Reference clock frequency in kHz - 0x8C - 0x00000000 - - - FC0_REF_KHZ - [19:0] - read-write - - - - - FC0_MIN_KHZ - Minimum pass frequency in kHz. This is optional. Set to 0 if you are not using the pass/fail flags - 0x90 - 0x00000000 - - - FC0_MIN_KHZ - [24:0] - read-write - - - - - FC0_MAX_KHZ - Maximum pass frequency in kHz. This is optional. Set to 0x1ffffff if you are not using the pass/fail flags - 0x94 - 0x01FFFFFF - - - FC0_MAX_KHZ - [24:0] - read-write - - - - - FC0_DELAY - Delays the start of frequency counting to allow the mux to settle - Delay is measured in multiples of the reference clock period - 0x98 - 0x00000001 - - - FC0_DELAY - [2:0] - read-write - - - - - FC0_INTERVAL - The test interval is 0.98us * 2**interval, but let's call it 1us * 2**interval - The default gives a test interval of 250us - 0x9C - 0x00000008 - - - FC0_INTERVAL - [3:0] - read-write - - - - - FC0_SRC - Clock sent to frequency counter, set to 0 when not required - Writing to this register initiates the frequency count - 0xA0 - 0x00000000 - - - FC0_SRC - [7:0] - read-write - - - NULL - 0 - - - pll_sys_clksrc_primary - 1 - - - pll_usb_clksrc_primary - 2 - - - rosc_clksrc - 3 - - - rosc_clksrc_ph - 4 - - - xosc_clksrc - 5 - - - clksrc_gpin0 - 6 - - - clksrc_gpin1 - 7 - - - clk_ref - 8 - - - clk_sys - 9 - - - clk_peri - 10 - - - clk_usb - 11 - - - clk_adc - 12 - - - clk_hstx - 13 - - - lposc_clksrc - 14 - - - otp_clk2fc - 15 - - - pll_usb_clksrc_primary_dft - 16 - - - - - - - FC0_STATUS - Frequency counter status - 0xA4 - 0x00000000 - - - DIED - Test clock stopped during test - [28:28] - read-only - - - FAST - Test clock faster than expected, only valid when status_done=1 - [24:24] - read-only - - - SLOW - Test clock slower than expected, only valid when status_done=1 - [20:20] - read-only - - - FAIL - Test failed - [16:16] - read-only - - - WAITING - Waiting for test clock to start - [12:12] - read-only - - - RUNNING - Test running - [8:8] - read-only - - - DONE - Test complete - [4:4] - read-only - - - PASS - Test passed - [0:0] - read-only - - - - - FC0_RESULT - Result of frequency measurement, only valid when status_done=1 - 0xA8 - 0x00000000 - - - KHZ - [29:5] - read-only - - - FRAC - [4:0] - read-only - - - - - WAKE_EN0 - enable clock in wake mode - 0xAC - 0xFFFFFFFF - - - CLK_SYS_SIO - [31:31] - read-write - - - CLK_SYS_SHA256 - [30:30] - read-write - - - CLK_SYS_PSM - [29:29] - read-write - - - CLK_SYS_ROSC - [28:28] - read-write - - - CLK_SYS_ROM - [27:27] - read-write - - - CLK_SYS_RESETS - [26:26] - read-write - - - CLK_SYS_PWM - [25:25] - read-write - - - CLK_SYS_POWMAN - [24:24] - read-write - - - CLK_REF_POWMAN - [23:23] - read-write - - - CLK_SYS_PLL_USB - [22:22] - read-write - - - CLK_SYS_PLL_SYS - [21:21] - read-write - - - CLK_SYS_PIO2 - [20:20] - read-write - - - CLK_SYS_PIO1 - [19:19] - read-write - - - CLK_SYS_PIO0 - [18:18] - read-write - - - CLK_SYS_PADS - [17:17] - read-write - - - CLK_SYS_OTP - [16:16] - read-write - - - CLK_REF_OTP - [15:15] - read-write - - - CLK_SYS_JTAG - [14:14] - read-write - - - CLK_SYS_IO - [13:13] - read-write - - - CLK_SYS_I2C1 - [12:12] - read-write - - - CLK_SYS_I2C0 - [11:11] - read-write - - - CLK_SYS_HSTX - [10:10] - read-write - - - CLK_HSTX - [9:9] - read-write - - - CLK_SYS_GLITCH_DETECTOR - [8:8] - read-write - - - CLK_SYS_DMA - [7:7] - read-write - - - CLK_SYS_BUSFABRIC - [6:6] - read-write - - - CLK_SYS_BUSCTRL - [5:5] - read-write - - - CLK_SYS_BOOTRAM - [4:4] - read-write - - - CLK_SYS_ADC - [3:3] - read-write - - - CLK_ADC - [2:2] - read-write - - - CLK_SYS_ACCESSCTRL - [1:1] - read-write - - - CLK_SYS_CLOCKS - [0:0] - read-write - - - - - WAKE_EN1 - enable clock in wake mode - 0xB0 - 0x7FFFFFFF - - - CLK_SYS_XOSC - [30:30] - read-write - - - CLK_SYS_XIP - [29:29] - read-write - - - CLK_SYS_WATCHDOG - [28:28] - read-write - - - CLK_USB - [27:27] - read-write - - - CLK_SYS_USBCTRL - [26:26] - read-write - - - CLK_SYS_UART1 - [25:25] - read-write - - - CLK_PERI_UART1 - [24:24] - read-write - - - CLK_SYS_UART0 - [23:23] - read-write - - - CLK_PERI_UART0 - [22:22] - read-write - - - CLK_SYS_TRNG - [21:21] - read-write - - - CLK_SYS_TIMER1 - [20:20] - read-write - - - CLK_SYS_TIMER0 - [19:19] - read-write - - - CLK_SYS_TICKS - [18:18] - read-write - - - CLK_REF_TICKS - [17:17] - read-write - - - CLK_SYS_TBMAN - [16:16] - read-write - - - CLK_SYS_SYSINFO - [15:15] - read-write - - - CLK_SYS_SYSCFG - [14:14] - read-write - - - CLK_SYS_SRAM9 - [13:13] - read-write - - - CLK_SYS_SRAM8 - [12:12] - read-write - - - CLK_SYS_SRAM7 - [11:11] - read-write - - - CLK_SYS_SRAM6 - [10:10] - read-write - - - CLK_SYS_SRAM5 - [9:9] - read-write - - - CLK_SYS_SRAM4 - [8:8] - read-write - - - CLK_SYS_SRAM3 - [7:7] - read-write - - - CLK_SYS_SRAM2 - [6:6] - read-write - - - CLK_SYS_SRAM1 - [5:5] - read-write - - - CLK_SYS_SRAM0 - [4:4] - read-write - - - CLK_SYS_SPI1 - [3:3] - read-write - - - CLK_PERI_SPI1 - [2:2] - read-write - - - CLK_SYS_SPI0 - [1:1] - read-write - - - CLK_PERI_SPI0 - [0:0] - read-write - - - - - SLEEP_EN0 - enable clock in sleep mode - 0xB4 - 0xFFFFFFFF - - - CLK_SYS_SIO - [31:31] - read-write - - - CLK_SYS_SHA256 - [30:30] - read-write - - - CLK_SYS_PSM - [29:29] - read-write - - - CLK_SYS_ROSC - [28:28] - read-write - - - CLK_SYS_ROM - [27:27] - read-write - - - CLK_SYS_RESETS - [26:26] - read-write - - - CLK_SYS_PWM - [25:25] - read-write - - - CLK_SYS_POWMAN - [24:24] - read-write - - - CLK_REF_POWMAN - [23:23] - read-write - - - CLK_SYS_PLL_USB - [22:22] - read-write - - - CLK_SYS_PLL_SYS - [21:21] - read-write - - - CLK_SYS_PIO2 - [20:20] - read-write - - - CLK_SYS_PIO1 - [19:19] - read-write - - - CLK_SYS_PIO0 - [18:18] - read-write - - - CLK_SYS_PADS - [17:17] - read-write - - - CLK_SYS_OTP - [16:16] - read-write - - - CLK_REF_OTP - [15:15] - read-write - - - CLK_SYS_JTAG - [14:14] - read-write - - - CLK_SYS_IO - [13:13] - read-write - - - CLK_SYS_I2C1 - [12:12] - read-write - - - CLK_SYS_I2C0 - [11:11] - read-write - - - CLK_SYS_HSTX - [10:10] - read-write - - - CLK_HSTX - [9:9] - read-write - - - CLK_SYS_GLITCH_DETECTOR - [8:8] - read-write - - - CLK_SYS_DMA - [7:7] - read-write - - - CLK_SYS_BUSFABRIC - [6:6] - read-write - - - CLK_SYS_BUSCTRL - [5:5] - read-write - - - CLK_SYS_BOOTRAM - [4:4] - read-write - - - CLK_SYS_ADC - [3:3] - read-write - - - CLK_ADC - [2:2] - read-write - - - CLK_SYS_ACCESSCTRL - [1:1] - read-write - - - CLK_SYS_CLOCKS - [0:0] - read-write - - - - - SLEEP_EN1 - enable clock in sleep mode - 0xB8 - 0x7FFFFFFF - - - CLK_SYS_XOSC - [30:30] - read-write - - - CLK_SYS_XIP - [29:29] - read-write - - - CLK_SYS_WATCHDOG - [28:28] - read-write - - - CLK_USB - [27:27] - read-write - - - CLK_SYS_USBCTRL - [26:26] - read-write - - - CLK_SYS_UART1 - [25:25] - read-write - - - CLK_PERI_UART1 - [24:24] - read-write - - - CLK_SYS_UART0 - [23:23] - read-write - - - CLK_PERI_UART0 - [22:22] - read-write - - - CLK_SYS_TRNG - [21:21] - read-write - - - CLK_SYS_TIMER1 - [20:20] - read-write - - - CLK_SYS_TIMER0 - [19:19] - read-write - - - CLK_SYS_TICKS - [18:18] - read-write - - - CLK_REF_TICKS - [17:17] - read-write - - - CLK_SYS_TBMAN - [16:16] - read-write - - - CLK_SYS_SYSINFO - [15:15] - read-write - - - CLK_SYS_SYSCFG - [14:14] - read-write - - - CLK_SYS_SRAM9 - [13:13] - read-write - - - CLK_SYS_SRAM8 - [12:12] - read-write - - - CLK_SYS_SRAM7 - [11:11] - read-write - - - CLK_SYS_SRAM6 - [10:10] - read-write - - - CLK_SYS_SRAM5 - [9:9] - read-write - - - CLK_SYS_SRAM4 - [8:8] - read-write - - - CLK_SYS_SRAM3 - [7:7] - read-write - - - CLK_SYS_SRAM2 - [6:6] - read-write - - - CLK_SYS_SRAM1 - [5:5] - read-write - - - CLK_SYS_SRAM0 - [4:4] - read-write - - - CLK_SYS_SPI1 - [3:3] - read-write - - - CLK_PERI_SPI1 - [2:2] - read-write - - - CLK_SYS_SPI0 - [1:1] - read-write - - - CLK_PERI_SPI0 - [0:0] - read-write - - - - - ENABLED0 - indicates the state of the clock enable - 0xBC - 0x00000000 - - - CLK_SYS_SIO - [31:31] - read-only - - - CLK_SYS_SHA256 - [30:30] - read-only - - - CLK_SYS_PSM - [29:29] - read-only - - - CLK_SYS_ROSC - [28:28] - read-only - - - CLK_SYS_ROM - [27:27] - read-only - - - CLK_SYS_RESETS - [26:26] - read-only - - - CLK_SYS_PWM - [25:25] - read-only - - - CLK_SYS_POWMAN - [24:24] - read-only - - - CLK_REF_POWMAN - [23:23] - read-only - - - CLK_SYS_PLL_USB - [22:22] - read-only - - - CLK_SYS_PLL_SYS - [21:21] - read-only - - - CLK_SYS_PIO2 - [20:20] - read-only - - - CLK_SYS_PIO1 - [19:19] - read-only - - - CLK_SYS_PIO0 - [18:18] - read-only - - - CLK_SYS_PADS - [17:17] - read-only - - - CLK_SYS_OTP - [16:16] - read-only - - - CLK_REF_OTP - [15:15] - read-only - - - CLK_SYS_JTAG - [14:14] - read-only - - - CLK_SYS_IO - [13:13] - read-only - - - CLK_SYS_I2C1 - [12:12] - read-only - - - CLK_SYS_I2C0 - [11:11] - read-only - - - CLK_SYS_HSTX - [10:10] - read-only - - - CLK_HSTX - [9:9] - read-only - - - CLK_SYS_GLITCH_DETECTOR - [8:8] - read-only - - - CLK_SYS_DMA - [7:7] - read-only - - - CLK_SYS_BUSFABRIC - [6:6] - read-only - - - CLK_SYS_BUSCTRL - [5:5] - read-only - - - CLK_SYS_BOOTRAM - [4:4] - read-only - - - CLK_SYS_ADC - [3:3] - read-only - - - CLK_ADC - [2:2] - read-only - - - CLK_SYS_ACCESSCTRL - [1:1] - read-only - - - CLK_SYS_CLOCKS - [0:0] - read-only - - - - - ENABLED1 - indicates the state of the clock enable - 0xC0 - 0x00000000 - - - CLK_SYS_XOSC - [30:30] - read-only - - - CLK_SYS_XIP - [29:29] - read-only - - - CLK_SYS_WATCHDOG - [28:28] - read-only - - - CLK_USB - [27:27] - read-only - - - CLK_SYS_USBCTRL - [26:26] - read-only - - - CLK_SYS_UART1 - [25:25] - read-only - - - CLK_PERI_UART1 - [24:24] - read-only - - - CLK_SYS_UART0 - [23:23] - read-only - - - CLK_PERI_UART0 - [22:22] - read-only - - - CLK_SYS_TRNG - [21:21] - read-only - - - CLK_SYS_TIMER1 - [20:20] - read-only - - - CLK_SYS_TIMER0 - [19:19] - read-only - - - CLK_SYS_TICKS - [18:18] - read-only - - - CLK_REF_TICKS - [17:17] - read-only - - - CLK_SYS_TBMAN - [16:16] - read-only - - - CLK_SYS_SYSINFO - [15:15] - read-only - - - CLK_SYS_SYSCFG - [14:14] - read-only - - - CLK_SYS_SRAM9 - [13:13] - read-only - - - CLK_SYS_SRAM8 - [12:12] - read-only - - - CLK_SYS_SRAM7 - [11:11] - read-only - - - CLK_SYS_SRAM6 - [10:10] - read-only - - - CLK_SYS_SRAM5 - [9:9] - read-only - - - CLK_SYS_SRAM4 - [8:8] - read-only - - - CLK_SYS_SRAM3 - [7:7] - read-only - - - CLK_SYS_SRAM2 - [6:6] - read-only - - - CLK_SYS_SRAM1 - [5:5] - read-only - - - CLK_SYS_SRAM0 - [4:4] - read-only - - - CLK_SYS_SPI1 - [3:3] - read-only - - - CLK_PERI_SPI1 - [2:2] - read-only - - - CLK_SYS_SPI0 - [1:1] - read-only - - - CLK_PERI_SPI0 - [0:0] - read-only - - - - - INTR - Raw Interrupts - 0xC4 - 0x00000000 - - - CLK_SYS_RESUS - [0:0] - read-only - - - - - INTE - Interrupt Enable - 0xC8 - 0x00000000 - - - CLK_SYS_RESUS - [0:0] - read-write - - - - - INTF - Interrupt Force - 0xCC - 0x00000000 - - - CLK_SYS_RESUS - [0:0] - read-write - - - - - INTS - Interrupt status after masking & forcing - 0xD0 - 0x00000000 - - - CLK_SYS_RESUS - [0:0] - read-only - - - - - - - TICKS - 0x40108000 - - 0x0 - 0x48 - registers - - - - 6 - 0xC - PROC0,PROC1,TIMER0,TIMER1,WATCHDOG,RISCV - TICK%s - Cluster TICK%s, containing *_CTRL, *_CYCLES, *_COUNT - 0x0 - - CTRL - Controls the tick generator - 0x0 - 0x00000000 - - - RUNNING - Is the tick generator running? - [1:1] - read-only - - - ENABLE - start / stop tick generation - [0:0] - read-write - - - - - CYCLES - 0x4 - 0x00000000 - - - PROC0_CYCLES - Total number of clk_tick cycles before the next tick. - [8:0] - read-write - - - - - COUNT - 0x8 - 0x00000000 - - - PROC0_COUNT - Count down timer: the remaining number clk_tick cycles before the next tick is generated. - [8:0] - read-only - - - - - - - - PADS_BANK0 - 0x40038000 - - 0x0 - 0xCC - registers - - - - VOLTAGE_SELECT - Voltage select. Per bank control - 0x0 - 0x00000000 - - - VOLTAGE_SELECT - [0:0] - read-write - - - 3v3 - Set voltage to 3.3V (DVDD >= 2V5) - 0 - - - 1v8 - Set voltage to 1.8V (DVDD <= 1V8) - 1 - - - - - - - 48 - 0x4 - 0-47 - GPIO%s - 0x4 - 0x00000116 - - - ISO - Pad isolation control. Remove this once the pad is configured by software. - [8:8] - read-write - - - OD - Output disable. Has priority over output enable from peripherals - [7:7] - read-write - - - IE - Input enable - [6:6] - read-write - - - DRIVE - Drive strength. - [5:4] - read-write - - - 2mA - 0 - - - 4mA - 1 - - - 8mA - 2 - - - 12mA - 3 - - - - - PUE - Pull up enable - [3:3] - read-write - - - PDE - Pull down enable - [2:2] - read-write - - - SCHMITT - Enable schmitt trigger - [1:1] - read-write - - - SLEWFAST - Slew rate control. 1 = Fast, 0 = Slow - [0:0] - read-write - - - - - SWCLK - 0xC4 - 0x0000005A - - - ISO - Pad isolation control. Remove this once the pad is configured by software. - [8:8] - read-write - - - OD - Output disable. Has priority over output enable from peripherals - [7:7] - read-write - - - IE - Input enable - [6:6] - read-write - - - DRIVE - Drive strength. - [5:4] - read-write - - - 2mA - 0 - - - 4mA - 1 - - - 8mA - 2 - - - 12mA - 3 - - - - - PUE - Pull up enable - [3:3] - read-write - - - PDE - Pull down enable - [2:2] - read-write - - - SCHMITT - Enable schmitt trigger - [1:1] - read-write - - - SLEWFAST - Slew rate control. 1 = Fast, 0 = Slow - [0:0] - read-write - - - - - SWD - 0xC8 - 0x0000005A - - - ISO - Pad isolation control. Remove this once the pad is configured by software. - [8:8] - read-write - - - OD - Output disable. Has priority over output enable from peripherals - [7:7] - read-write - - - IE - Input enable - [6:6] - read-write - - - DRIVE - Drive strength. - [5:4] - read-write - - - 2mA - 0 - - - 4mA - 1 - - - 8mA - 2 - - - 12mA - 3 - - - - - PUE - Pull up enable - [3:3] - read-write - - - PDE - Pull down enable - [2:2] - read-write - - - SCHMITT - Enable schmitt trigger - [1:1] - read-write - - - SLEWFAST - Slew rate control. 1 = Fast, 0 = Slow - [0:0] - read-write - - - - - - - PADS_QSPI - 0x40040000 - - 0x0 - 0x1C - registers - - - - VOLTAGE_SELECT - Voltage select. Per bank control - 0x0 - 0x00000000 - - - VOLTAGE_SELECT - [0:0] - read-write - - - 3v3 - Set voltage to 3.3V (DVDD >= 2V5) - 0 - - - 1v8 - Set voltage to 1.8V (DVDD <= 1V8) - 1 - - - - - - - GPIO_QSPI_SCLK - 0x4 - 0x00000156 - - - ISO - Pad isolation control. Remove this once the pad is configured by software. - [8:8] - read-write - - - OD - Output disable. Has priority over output enable from peripherals - [7:7] - read-write - - - IE - Input enable - [6:6] - read-write - - - DRIVE - Drive strength. - [5:4] - read-write - - - 2mA - 0 - - - 4mA - 1 - - - 8mA - 2 - - - 12mA - 3 - - - - - PUE - Pull up enable - [3:3] - read-write - - - PDE - Pull down enable - [2:2] - read-write - - - SCHMITT - Enable schmitt trigger - [1:1] - read-write - - - SLEWFAST - Slew rate control. 1 = Fast, 0 = Slow - [0:0] - read-write - - - - - GPIO_QSPI_SD0 - 0x8 - 0x00000156 - - - ISO - Pad isolation control. Remove this once the pad is configured by software. - [8:8] - read-write - - - OD - Output disable. Has priority over output enable from peripherals - [7:7] - read-write - - - IE - Input enable - [6:6] - read-write - - - DRIVE - Drive strength. - [5:4] - read-write - - - 2mA - 0 - - - 4mA - 1 - - - 8mA - 2 - - - 12mA - 3 - - - - - PUE - Pull up enable - [3:3] - read-write - - - PDE - Pull down enable - [2:2] - read-write - - - SCHMITT - Enable schmitt trigger - [1:1] - read-write - - - SLEWFAST - Slew rate control. 1 = Fast, 0 = Slow - [0:0] - read-write - - - - - GPIO_QSPI_SD1 - 0xC - 0x00000156 - - - ISO - Pad isolation control. Remove this once the pad is configured by software. - [8:8] - read-write - - - OD - Output disable. Has priority over output enable from peripherals - [7:7] - read-write - - - IE - Input enable - [6:6] - read-write - - - DRIVE - Drive strength. - [5:4] - read-write - - - 2mA - 0 - - - 4mA - 1 - - - 8mA - 2 - - - 12mA - 3 - - - - - PUE - Pull up enable - [3:3] - read-write - - - PDE - Pull down enable - [2:2] - read-write - - - SCHMITT - Enable schmitt trigger - [1:1] - read-write - - - SLEWFAST - Slew rate control. 1 = Fast, 0 = Slow - [0:0] - read-write - - - - - GPIO_QSPI_SD2 - 0x10 - 0x0000015A - - - ISO - Pad isolation control. Remove this once the pad is configured by software. - [8:8] - read-write - - - OD - Output disable. Has priority over output enable from peripherals - [7:7] - read-write - - - IE - Input enable - [6:6] - read-write - - - DRIVE - Drive strength. - [5:4] - read-write - - - 2mA - 0 - - - 4mA - 1 - - - 8mA - 2 - - - 12mA - 3 - - - - - PUE - Pull up enable - [3:3] - read-write - - - PDE - Pull down enable - [2:2] - read-write - - - SCHMITT - Enable schmitt trigger - [1:1] - read-write - - - SLEWFAST - Slew rate control. 1 = Fast, 0 = Slow - [0:0] - read-write - - - - - GPIO_QSPI_SD3 - 0x14 - 0x0000015A - - - ISO - Pad isolation control. Remove this once the pad is configured by software. - [8:8] - read-write - - - OD - Output disable. Has priority over output enable from peripherals - [7:7] - read-write - - - IE - Input enable - [6:6] - read-write - - - DRIVE - Drive strength. - [5:4] - read-write - - - 2mA - 0 - - - 4mA - 1 - - - 8mA - 2 - - - 12mA - 3 - - - - - PUE - Pull up enable - [3:3] - read-write - - - PDE - Pull down enable - [2:2] - read-write - - - SCHMITT - Enable schmitt trigger - [1:1] - read-write - - - SLEWFAST - Slew rate control. 1 = Fast, 0 = Slow - [0:0] - read-write - - - - - GPIO_QSPI_SS - 0x18 - 0x0000015A - - - ISO - Pad isolation control. Remove this once the pad is configured by software. - [8:8] - read-write - - - OD - Output disable. Has priority over output enable from peripherals - [7:7] - read-write - - - IE - Input enable - [6:6] - read-write - - - DRIVE - Drive strength. - [5:4] - read-write - - - 2mA - 0 - - - 4mA - 1 - - - 8mA - 2 - - - 12mA - 3 - - - - - PUE - Pull up enable - [3:3] - read-write - - - PDE - Pull down enable - [2:2] - read-write - - - SCHMITT - Enable schmitt trigger - [1:1] - read-write - - - SLEWFAST - Slew rate control. 1 = Fast, 0 = Slow - [0:0] - read-write - - - - - - - IO_QSPI - 0x40030000 - - 0x0 - 0x240 - registers - - - IO_IRQ_QSPI - 23 - - - IO_IRQ_QSPI_NS - 24 - - - - USBPHY_DP_STATUS - 0x0 - 0x00000000 - - - IRQTOPROC - interrupt to processors, after override is applied - [26:26] - read-only - - - INFROMPAD - input signal from pad, before filtering and override are applied - [17:17] - read-only - - - OETOPAD - output enable to pad after register override is applied - [13:13] - read-only - - - OUTTOPAD - output signal to pad after register override is applied - [9:9] - read-only - - - - - USBPHY_DP_CTRL - 0x4 - 0x0000001F - - - IRQOVER - [29:28] - read-write - - - NORMAL - don't invert the interrupt - 0 - - - INVERT - invert the interrupt - 1 - - - LOW - drive interrupt low - 2 - - - HIGH - drive interrupt high - 3 - - - - - INOVER - [17:16] - read-write - - - NORMAL - don't invert the peri input - 0 - - - INVERT - invert the peri input - 1 - - - LOW - drive peri input low - 2 - - - HIGH - drive peri input high - 3 - - - - - OEOVER - [15:14] - read-write - - - NORMAL - drive output enable from peripheral signal selected by funcsel - 0 - - - INVERT - drive output enable from inverse of peripheral signal selected by funcsel - 1 - - - DISABLE - disable output - 2 - - - ENABLE - enable output - 3 - - - - - OUTOVER - [13:12] - read-write - - - NORMAL - drive output from peripheral signal selected by funcsel - 0 - - - INVERT - drive output from inverse of peripheral signal selected by funcsel - 1 - - - LOW - drive output low - 2 - - - HIGH - drive output high - 3 - - - - - FUNCSEL - 0-31 -> selects pin function according to the gpio table - 31 == NULL - [4:0] - read-write - - - uart1_tx - 2 - - - i2c0_sda - 3 - - - siob_proc_56 - 5 - - - null - 31 - - - - - - - USBPHY_DM_STATUS - 0x8 - 0x00000000 - - - IRQTOPROC - interrupt to processors, after override is applied - [26:26] - read-only - - - INFROMPAD - input signal from pad, before filtering and override are applied - [17:17] - read-only - - - OETOPAD - output enable to pad after register override is applied - [13:13] - read-only - - - OUTTOPAD - output signal to pad after register override is applied - [9:9] - read-only - - - - - USBPHY_DM_CTRL - 0xC - 0x0000001F - - - IRQOVER - [29:28] - read-write - - - NORMAL - don't invert the interrupt - 0 - - - INVERT - invert the interrupt - 1 - - - LOW - drive interrupt low - 2 - - - HIGH - drive interrupt high - 3 - - - - - INOVER - [17:16] - read-write - - - NORMAL - don't invert the peri input - 0 - - - INVERT - invert the peri input - 1 - - - LOW - drive peri input low - 2 - - - HIGH - drive peri input high - 3 - - - - - OEOVER - [15:14] - read-write - - - NORMAL - drive output enable from peripheral signal selected by funcsel - 0 - - - INVERT - drive output enable from inverse of peripheral signal selected by funcsel - 1 - - - DISABLE - disable output - 2 - - - ENABLE - enable output - 3 - - - - - OUTOVER - [13:12] - read-write - - - NORMAL - drive output from peripheral signal selected by funcsel - 0 - - - INVERT - drive output from inverse of peripheral signal selected by funcsel - 1 - - - LOW - drive output low - 2 - - - HIGH - drive output high - 3 - - - - - FUNCSEL - 0-31 -> selects pin function according to the gpio table - 31 == NULL - [4:0] - read-write - - - uart1_rx - 2 - - - i2c0_scl - 3 - - - siob_proc_57 - 5 - - - null - 31 - - - - - - - 6 - 0x8 - SCLK,SS,SD0,SD1,SD2,SD3 - GPIO_QSPI%s - Cluster GPIO_QSPI%s, containing GPIO_QSPI_*_STATUS, GPIO_QSPI_*_CTRL - 0x10 - - GPIO_STATUS - 0x0 - 0x00000000 - - - IRQTOPROC - interrupt to processors, after override is applied - [26:26] - read-only - - - INFROMPAD - input signal from pad, before filtering and override are applied - [17:17] - read-only - - - OETOPAD - output enable to pad after register override is applied - [13:13] - read-only - - - OUTTOPAD - output signal to pad after register override is applied - [9:9] - read-only - - - - - GPIO_CTRL - 0x4 - 0x0000001F - - - IRQOVER - [29:28] - read-write - - - NORMAL - don't invert the interrupt - 0 - - - INVERT - invert the interrupt - 1 - - - LOW - drive interrupt low - 2 - - - HIGH - drive interrupt high - 3 - - - - - INOVER - [17:16] - read-write - - - NORMAL - don't invert the peri input - 0 - - - INVERT - invert the peri input - 1 - - - LOW - drive peri input low - 2 - - - HIGH - drive peri input high - 3 - - - - - OEOVER - [15:14] - read-write - - - NORMAL - drive output enable from peripheral signal selected by funcsel - 0 - - - INVERT - drive output enable from inverse of peripheral signal selected by funcsel - 1 - - - DISABLE - disable output - 2 - - - ENABLE - enable output - 3 - - - - - OUTOVER - [13:12] - read-write - - - NORMAL - drive output from peripheral signal selected by funcsel - 0 - - - INVERT - drive output from inverse of peripheral signal selected by funcsel - 1 - - - LOW - drive output low - 2 - - - HIGH - drive output high - 3 - - - - - FUNCSEL - 0-31 -> selects pin function according to the gpio table - 31 == NULL - [4:0] - read-write - - - xip_sclk - 0 - - - uart1_cts - 2 - - - i2c1_sda - 3 - - - siob_proc_58 - 5 - - - uart1_tx - 11 - - - null - 31 - - - - - - - - IRQSUMMARY_PROC0_SECURE - 0x200 - 0x00000000 - - - GPIO_QSPI_SD3 - [7:7] - read-only - - - GPIO_QSPI_SD2 - [6:6] - read-only - - - GPIO_QSPI_SD1 - [5:5] - read-only - - - GPIO_QSPI_SD0 - [4:4] - read-only - - - GPIO_QSPI_SS - [3:3] - read-only - - - GPIO_QSPI_SCLK - [2:2] - read-only - - - USBPHY_DM - [1:1] - read-only - - - USBPHY_DP - [0:0] - read-only - - - - - IRQSUMMARY_PROC0_NONSECURE - 0x204 - 0x00000000 - - - GPIO_QSPI_SD3 - [7:7] - read-only - - - GPIO_QSPI_SD2 - [6:6] - read-only - - - GPIO_QSPI_SD1 - [5:5] - read-only - - - GPIO_QSPI_SD0 - [4:4] - read-only - - - GPIO_QSPI_SS - [3:3] - read-only - - - GPIO_QSPI_SCLK - [2:2] - read-only - - - USBPHY_DM - [1:1] - read-only - - - USBPHY_DP - [0:0] - read-only - - - - - IRQSUMMARY_PROC1_SECURE - 0x208 - 0x00000000 - - - GPIO_QSPI_SD3 - [7:7] - read-only - - - GPIO_QSPI_SD2 - [6:6] - read-only - - - GPIO_QSPI_SD1 - [5:5] - read-only - - - GPIO_QSPI_SD0 - [4:4] - read-only - - - GPIO_QSPI_SS - [3:3] - read-only - - - GPIO_QSPI_SCLK - [2:2] - read-only - - - USBPHY_DM - [1:1] - read-only - - - USBPHY_DP - [0:0] - read-only - - - - - IRQSUMMARY_PROC1_NONSECURE - 0x20C - 0x00000000 - - - GPIO_QSPI_SD3 - [7:7] - read-only - - - GPIO_QSPI_SD2 - [6:6] - read-only - - - GPIO_QSPI_SD1 - [5:5] - read-only - - - GPIO_QSPI_SD0 - [4:4] - read-only - - - GPIO_QSPI_SS - [3:3] - read-only - - - GPIO_QSPI_SCLK - [2:2] - read-only - - - USBPHY_DM - [1:1] - read-only - - - USBPHY_DP - [0:0] - read-only - - - - - IRQSUMMARY_DORMANT_WAKE_SECURE - 0x210 - 0x00000000 - - - GPIO_QSPI_SD3 - [7:7] - read-only - - - GPIO_QSPI_SD2 - [6:6] - read-only - - - GPIO_QSPI_SD1 - [5:5] - read-only - - - GPIO_QSPI_SD0 - [4:4] - read-only - - - GPIO_QSPI_SS - [3:3] - read-only - - - GPIO_QSPI_SCLK - [2:2] - read-only - - - USBPHY_DM - [1:1] - read-only - - - USBPHY_DP - [0:0] - read-only - - - - - IRQSUMMARY_DORMANT_WAKE_NONSECURE - 0x214 - 0x00000000 - - - GPIO_QSPI_SD3 - [7:7] - read-only - - - GPIO_QSPI_SD2 - [6:6] - read-only - - - GPIO_QSPI_SD1 - [5:5] - read-only - - - GPIO_QSPI_SD0 - [4:4] - read-only - - - GPIO_QSPI_SS - [3:3] - read-only - - - GPIO_QSPI_SCLK - [2:2] - read-only - - - USBPHY_DM - [1:1] - read-only - - - USBPHY_DP - [0:0] - read-only - - - - - INTR - Raw Interrupts - 0x218 - 0x00000000 - - - GPIO_QSPI_SD3_EDGE_HIGH - [31:31] - read-write - oneToClear - - - GPIO_QSPI_SD3_EDGE_LOW - [30:30] - read-write - oneToClear - - - GPIO_QSPI_SD3_LEVEL_HIGH - [29:29] - read-only - - - GPIO_QSPI_SD3_LEVEL_LOW - [28:28] - read-only - - - GPIO_QSPI_SD2_EDGE_HIGH - [27:27] - read-write - oneToClear - - - GPIO_QSPI_SD2_EDGE_LOW - [26:26] - read-write - oneToClear - - - GPIO_QSPI_SD2_LEVEL_HIGH - [25:25] - read-only - - - GPIO_QSPI_SD2_LEVEL_LOW - [24:24] - read-only - - - GPIO_QSPI_SD1_EDGE_HIGH - [23:23] - read-write - oneToClear - - - GPIO_QSPI_SD1_EDGE_LOW - [22:22] - read-write - oneToClear - - - GPIO_QSPI_SD1_LEVEL_HIGH - [21:21] - read-only - - - GPIO_QSPI_SD1_LEVEL_LOW - [20:20] - read-only - - - GPIO_QSPI_SD0_EDGE_HIGH - [19:19] - read-write - oneToClear - - - GPIO_QSPI_SD0_EDGE_LOW - [18:18] - read-write - oneToClear - - - GPIO_QSPI_SD0_LEVEL_HIGH - [17:17] - read-only - - - GPIO_QSPI_SD0_LEVEL_LOW - [16:16] - read-only - - - GPIO_QSPI_SS_EDGE_HIGH - [15:15] - read-write - oneToClear - - - GPIO_QSPI_SS_EDGE_LOW - [14:14] - read-write - oneToClear - - - GPIO_QSPI_SS_LEVEL_HIGH - [13:13] - read-only - - - GPIO_QSPI_SS_LEVEL_LOW - [12:12] - read-only - - - GPIO_QSPI_SCLK_EDGE_HIGH - [11:11] - read-write - oneToClear - - - GPIO_QSPI_SCLK_EDGE_LOW - [10:10] - read-write - oneToClear - - - GPIO_QSPI_SCLK_LEVEL_HIGH - [9:9] - read-only - - - GPIO_QSPI_SCLK_LEVEL_LOW - [8:8] - read-only - - - USBPHY_DM_EDGE_HIGH - [7:7] - read-write - oneToClear - - - USBPHY_DM_EDGE_LOW - [6:6] - read-write - oneToClear - - - USBPHY_DM_LEVEL_HIGH - [5:5] - read-only - - - USBPHY_DM_LEVEL_LOW - [4:4] - read-only - - - USBPHY_DP_EDGE_HIGH - [3:3] - read-write - oneToClear - - - USBPHY_DP_EDGE_LOW - [2:2] - read-write - oneToClear - - - USBPHY_DP_LEVEL_HIGH - [1:1] - read-only - - - USBPHY_DP_LEVEL_LOW - [0:0] - read-only - - - - - PROC0_INTE - Interrupt Enable for proc0 - 0x21C - 0x00000000 - - - GPIO_QSPI_SD3_EDGE_HIGH - [31:31] - read-write - - - GPIO_QSPI_SD3_EDGE_LOW - [30:30] - read-write - - - GPIO_QSPI_SD3_LEVEL_HIGH - [29:29] - read-write - - - GPIO_QSPI_SD3_LEVEL_LOW - [28:28] - read-write - - - GPIO_QSPI_SD2_EDGE_HIGH - [27:27] - read-write - - - GPIO_QSPI_SD2_EDGE_LOW - [26:26] - read-write - - - GPIO_QSPI_SD2_LEVEL_HIGH - [25:25] - read-write - - - GPIO_QSPI_SD2_LEVEL_LOW - [24:24] - read-write - - - GPIO_QSPI_SD1_EDGE_HIGH - [23:23] - read-write - - - GPIO_QSPI_SD1_EDGE_LOW - [22:22] - read-write - - - GPIO_QSPI_SD1_LEVEL_HIGH - [21:21] - read-write - - - GPIO_QSPI_SD1_LEVEL_LOW - [20:20] - read-write - - - GPIO_QSPI_SD0_EDGE_HIGH - [19:19] - read-write - - - GPIO_QSPI_SD0_EDGE_LOW - [18:18] - read-write - - - GPIO_QSPI_SD0_LEVEL_HIGH - [17:17] - read-write - - - GPIO_QSPI_SD0_LEVEL_LOW - [16:16] - read-write - - - GPIO_QSPI_SS_EDGE_HIGH - [15:15] - read-write - - - GPIO_QSPI_SS_EDGE_LOW - [14:14] - read-write - - - GPIO_QSPI_SS_LEVEL_HIGH - [13:13] - read-write - - - GPIO_QSPI_SS_LEVEL_LOW - [12:12] - read-write - - - GPIO_QSPI_SCLK_EDGE_HIGH - [11:11] - read-write - - - GPIO_QSPI_SCLK_EDGE_LOW - [10:10] - read-write - - - GPIO_QSPI_SCLK_LEVEL_HIGH - [9:9] - read-write - - - GPIO_QSPI_SCLK_LEVEL_LOW - [8:8] - read-write - - - USBPHY_DM_EDGE_HIGH - [7:7] - read-write - - - USBPHY_DM_EDGE_LOW - [6:6] - read-write - - - USBPHY_DM_LEVEL_HIGH - [5:5] - read-write - - - USBPHY_DM_LEVEL_LOW - [4:4] - read-write - - - USBPHY_DP_EDGE_HIGH - [3:3] - read-write - - - USBPHY_DP_EDGE_LOW - [2:2] - read-write - - - USBPHY_DP_LEVEL_HIGH - [1:1] - read-write - - - USBPHY_DP_LEVEL_LOW - [0:0] - read-write - - - - - PROC0_INTF - Interrupt Force for proc0 - 0x220 - 0x00000000 - - - GPIO_QSPI_SD3_EDGE_HIGH - [31:31] - read-write - - - GPIO_QSPI_SD3_EDGE_LOW - [30:30] - read-write - - - GPIO_QSPI_SD3_LEVEL_HIGH - [29:29] - read-write - - - GPIO_QSPI_SD3_LEVEL_LOW - [28:28] - read-write - - - GPIO_QSPI_SD2_EDGE_HIGH - [27:27] - read-write - - - GPIO_QSPI_SD2_EDGE_LOW - [26:26] - read-write - - - GPIO_QSPI_SD2_LEVEL_HIGH - [25:25] - read-write - - - GPIO_QSPI_SD2_LEVEL_LOW - [24:24] - read-write - - - GPIO_QSPI_SD1_EDGE_HIGH - [23:23] - read-write - - - GPIO_QSPI_SD1_EDGE_LOW - [22:22] - read-write - - - GPIO_QSPI_SD1_LEVEL_HIGH - [21:21] - read-write - - - GPIO_QSPI_SD1_LEVEL_LOW - [20:20] - read-write - - - GPIO_QSPI_SD0_EDGE_HIGH - [19:19] - read-write - - - GPIO_QSPI_SD0_EDGE_LOW - [18:18] - read-write - - - GPIO_QSPI_SD0_LEVEL_HIGH - [17:17] - read-write - - - GPIO_QSPI_SD0_LEVEL_LOW - [16:16] - read-write - - - GPIO_QSPI_SS_EDGE_HIGH - [15:15] - read-write - - - GPIO_QSPI_SS_EDGE_LOW - [14:14] - read-write - - - GPIO_QSPI_SS_LEVEL_HIGH - [13:13] - read-write - - - GPIO_QSPI_SS_LEVEL_LOW - [12:12] - read-write - - - GPIO_QSPI_SCLK_EDGE_HIGH - [11:11] - read-write - - - GPIO_QSPI_SCLK_EDGE_LOW - [10:10] - read-write - - - GPIO_QSPI_SCLK_LEVEL_HIGH - [9:9] - read-write - - - GPIO_QSPI_SCLK_LEVEL_LOW - [8:8] - read-write - - - USBPHY_DM_EDGE_HIGH - [7:7] - read-write - - - USBPHY_DM_EDGE_LOW - [6:6] - read-write - - - USBPHY_DM_LEVEL_HIGH - [5:5] - read-write - - - USBPHY_DM_LEVEL_LOW - [4:4] - read-write - - - USBPHY_DP_EDGE_HIGH - [3:3] - read-write - - - USBPHY_DP_EDGE_LOW - [2:2] - read-write - - - USBPHY_DP_LEVEL_HIGH - [1:1] - read-write - - - USBPHY_DP_LEVEL_LOW - [0:0] - read-write - - - - - PROC0_INTS - Interrupt status after masking & forcing for proc0 - 0x224 - 0x00000000 - - - GPIO_QSPI_SD3_EDGE_HIGH - [31:31] - read-only - - - GPIO_QSPI_SD3_EDGE_LOW - [30:30] - read-only - - - GPIO_QSPI_SD3_LEVEL_HIGH - [29:29] - read-only - - - GPIO_QSPI_SD3_LEVEL_LOW - [28:28] - read-only - - - GPIO_QSPI_SD2_EDGE_HIGH - [27:27] - read-only - - - GPIO_QSPI_SD2_EDGE_LOW - [26:26] - read-only - - - GPIO_QSPI_SD2_LEVEL_HIGH - [25:25] - read-only - - - GPIO_QSPI_SD2_LEVEL_LOW - [24:24] - read-only - - - GPIO_QSPI_SD1_EDGE_HIGH - [23:23] - read-only - - - GPIO_QSPI_SD1_EDGE_LOW - [22:22] - read-only - - - GPIO_QSPI_SD1_LEVEL_HIGH - [21:21] - read-only - - - GPIO_QSPI_SD1_LEVEL_LOW - [20:20] - read-only - - - GPIO_QSPI_SD0_EDGE_HIGH - [19:19] - read-only - - - GPIO_QSPI_SD0_EDGE_LOW - [18:18] - read-only - - - GPIO_QSPI_SD0_LEVEL_HIGH - [17:17] - read-only - - - GPIO_QSPI_SD0_LEVEL_LOW - [16:16] - read-only - - - GPIO_QSPI_SS_EDGE_HIGH - [15:15] - read-only - - - GPIO_QSPI_SS_EDGE_LOW - [14:14] - read-only - - - GPIO_QSPI_SS_LEVEL_HIGH - [13:13] - read-only - - - GPIO_QSPI_SS_LEVEL_LOW - [12:12] - read-only - - - GPIO_QSPI_SCLK_EDGE_HIGH - [11:11] - read-only - - - GPIO_QSPI_SCLK_EDGE_LOW - [10:10] - read-only - - - GPIO_QSPI_SCLK_LEVEL_HIGH - [9:9] - read-only - - - GPIO_QSPI_SCLK_LEVEL_LOW - [8:8] - read-only - - - USBPHY_DM_EDGE_HIGH - [7:7] - read-only - - - USBPHY_DM_EDGE_LOW - [6:6] - read-only - - - USBPHY_DM_LEVEL_HIGH - [5:5] - read-only - - - USBPHY_DM_LEVEL_LOW - [4:4] - read-only - - - USBPHY_DP_EDGE_HIGH - [3:3] - read-only - - - USBPHY_DP_EDGE_LOW - [2:2] - read-only - - - USBPHY_DP_LEVEL_HIGH - [1:1] - read-only - - - USBPHY_DP_LEVEL_LOW - [0:0] - read-only - - - - - PROC1_INTE - Interrupt Enable for proc1 - 0x228 - 0x00000000 - - - GPIO_QSPI_SD3_EDGE_HIGH - [31:31] - read-write - - - GPIO_QSPI_SD3_EDGE_LOW - [30:30] - read-write - - - GPIO_QSPI_SD3_LEVEL_HIGH - [29:29] - read-write - - - GPIO_QSPI_SD3_LEVEL_LOW - [28:28] - read-write - - - GPIO_QSPI_SD2_EDGE_HIGH - [27:27] - read-write - - - GPIO_QSPI_SD2_EDGE_LOW - [26:26] - read-write - - - GPIO_QSPI_SD2_LEVEL_HIGH - [25:25] - read-write - - - GPIO_QSPI_SD2_LEVEL_LOW - [24:24] - read-write - - - GPIO_QSPI_SD1_EDGE_HIGH - [23:23] - read-write - - - GPIO_QSPI_SD1_EDGE_LOW - [22:22] - read-write - - - GPIO_QSPI_SD1_LEVEL_HIGH - [21:21] - read-write - - - GPIO_QSPI_SD1_LEVEL_LOW - [20:20] - read-write - - - GPIO_QSPI_SD0_EDGE_HIGH - [19:19] - read-write - - - GPIO_QSPI_SD0_EDGE_LOW - [18:18] - read-write - - - GPIO_QSPI_SD0_LEVEL_HIGH - [17:17] - read-write - - - GPIO_QSPI_SD0_LEVEL_LOW - [16:16] - read-write - - - GPIO_QSPI_SS_EDGE_HIGH - [15:15] - read-write - - - GPIO_QSPI_SS_EDGE_LOW - [14:14] - read-write - - - GPIO_QSPI_SS_LEVEL_HIGH - [13:13] - read-write - - - GPIO_QSPI_SS_LEVEL_LOW - [12:12] - read-write - - - GPIO_QSPI_SCLK_EDGE_HIGH - [11:11] - read-write - - - GPIO_QSPI_SCLK_EDGE_LOW - [10:10] - read-write - - - GPIO_QSPI_SCLK_LEVEL_HIGH - [9:9] - read-write - - - GPIO_QSPI_SCLK_LEVEL_LOW - [8:8] - read-write - - - USBPHY_DM_EDGE_HIGH - [7:7] - read-write - - - USBPHY_DM_EDGE_LOW - [6:6] - read-write - - - USBPHY_DM_LEVEL_HIGH - [5:5] - read-write - - - USBPHY_DM_LEVEL_LOW - [4:4] - read-write - - - USBPHY_DP_EDGE_HIGH - [3:3] - read-write - - - USBPHY_DP_EDGE_LOW - [2:2] - read-write - - - USBPHY_DP_LEVEL_HIGH - [1:1] - read-write - - - USBPHY_DP_LEVEL_LOW - [0:0] - read-write - - - - - PROC1_INTF - Interrupt Force for proc1 - 0x22C - 0x00000000 - - - GPIO_QSPI_SD3_EDGE_HIGH - [31:31] - read-write - - - GPIO_QSPI_SD3_EDGE_LOW - [30:30] - read-write - - - GPIO_QSPI_SD3_LEVEL_HIGH - [29:29] - read-write - - - GPIO_QSPI_SD3_LEVEL_LOW - [28:28] - read-write - - - GPIO_QSPI_SD2_EDGE_HIGH - [27:27] - read-write - - - GPIO_QSPI_SD2_EDGE_LOW - [26:26] - read-write - - - GPIO_QSPI_SD2_LEVEL_HIGH - [25:25] - read-write - - - GPIO_QSPI_SD2_LEVEL_LOW - [24:24] - read-write - - - GPIO_QSPI_SD1_EDGE_HIGH - [23:23] - read-write - - - GPIO_QSPI_SD1_EDGE_LOW - [22:22] - read-write - - - GPIO_QSPI_SD1_LEVEL_HIGH - [21:21] - read-write - - - GPIO_QSPI_SD1_LEVEL_LOW - [20:20] - read-write - - - GPIO_QSPI_SD0_EDGE_HIGH - [19:19] - read-write - - - GPIO_QSPI_SD0_EDGE_LOW - [18:18] - read-write - - - GPIO_QSPI_SD0_LEVEL_HIGH - [17:17] - read-write - - - GPIO_QSPI_SD0_LEVEL_LOW - [16:16] - read-write - - - GPIO_QSPI_SS_EDGE_HIGH - [15:15] - read-write - - - GPIO_QSPI_SS_EDGE_LOW - [14:14] - read-write - - - GPIO_QSPI_SS_LEVEL_HIGH - [13:13] - read-write - - - GPIO_QSPI_SS_LEVEL_LOW - [12:12] - read-write - - - GPIO_QSPI_SCLK_EDGE_HIGH - [11:11] - read-write - - - GPIO_QSPI_SCLK_EDGE_LOW - [10:10] - read-write - - - GPIO_QSPI_SCLK_LEVEL_HIGH - [9:9] - read-write - - - GPIO_QSPI_SCLK_LEVEL_LOW - [8:8] - read-write - - - USBPHY_DM_EDGE_HIGH - [7:7] - read-write - - - USBPHY_DM_EDGE_LOW - [6:6] - read-write - - - USBPHY_DM_LEVEL_HIGH - [5:5] - read-write - - - USBPHY_DM_LEVEL_LOW - [4:4] - read-write - - - USBPHY_DP_EDGE_HIGH - [3:3] - read-write - - - USBPHY_DP_EDGE_LOW - [2:2] - read-write - - - USBPHY_DP_LEVEL_HIGH - [1:1] - read-write - - - USBPHY_DP_LEVEL_LOW - [0:0] - read-write - - - - - PROC1_INTS - Interrupt status after masking & forcing for proc1 - 0x230 - 0x00000000 - - - GPIO_QSPI_SD3_EDGE_HIGH - [31:31] - read-only - - - GPIO_QSPI_SD3_EDGE_LOW - [30:30] - read-only - - - GPIO_QSPI_SD3_LEVEL_HIGH - [29:29] - read-only - - - GPIO_QSPI_SD3_LEVEL_LOW - [28:28] - read-only - - - GPIO_QSPI_SD2_EDGE_HIGH - [27:27] - read-only - - - GPIO_QSPI_SD2_EDGE_LOW - [26:26] - read-only - - - GPIO_QSPI_SD2_LEVEL_HIGH - [25:25] - read-only - - - GPIO_QSPI_SD2_LEVEL_LOW - [24:24] - read-only - - - GPIO_QSPI_SD1_EDGE_HIGH - [23:23] - read-only - - - GPIO_QSPI_SD1_EDGE_LOW - [22:22] - read-only - - - GPIO_QSPI_SD1_LEVEL_HIGH - [21:21] - read-only - - - GPIO_QSPI_SD1_LEVEL_LOW - [20:20] - read-only - - - GPIO_QSPI_SD0_EDGE_HIGH - [19:19] - read-only - - - GPIO_QSPI_SD0_EDGE_LOW - [18:18] - read-only - - - GPIO_QSPI_SD0_LEVEL_HIGH - [17:17] - read-only - - - GPIO_QSPI_SD0_LEVEL_LOW - [16:16] - read-only - - - GPIO_QSPI_SS_EDGE_HIGH - [15:15] - read-only - - - GPIO_QSPI_SS_EDGE_LOW - [14:14] - read-only - - - GPIO_QSPI_SS_LEVEL_HIGH - [13:13] - read-only - - - GPIO_QSPI_SS_LEVEL_LOW - [12:12] - read-only - - - GPIO_QSPI_SCLK_EDGE_HIGH - [11:11] - read-only - - - GPIO_QSPI_SCLK_EDGE_LOW - [10:10] - read-only - - - GPIO_QSPI_SCLK_LEVEL_HIGH - [9:9] - read-only - - - GPIO_QSPI_SCLK_LEVEL_LOW - [8:8] - read-only - - - USBPHY_DM_EDGE_HIGH - [7:7] - read-only - - - USBPHY_DM_EDGE_LOW - [6:6] - read-only - - - USBPHY_DM_LEVEL_HIGH - [5:5] - read-only - - - USBPHY_DM_LEVEL_LOW - [4:4] - read-only - - - USBPHY_DP_EDGE_HIGH - [3:3] - read-only - - - USBPHY_DP_EDGE_LOW - [2:2] - read-only - - - USBPHY_DP_LEVEL_HIGH - [1:1] - read-only - - - USBPHY_DP_LEVEL_LOW - [0:0] - read-only - - - - - DORMANT_WAKE_INTE - Interrupt Enable for dormant_wake - 0x234 - 0x00000000 - - - GPIO_QSPI_SD3_EDGE_HIGH - [31:31] - read-write - - - GPIO_QSPI_SD3_EDGE_LOW - [30:30] - read-write - - - GPIO_QSPI_SD3_LEVEL_HIGH - [29:29] - read-write - - - GPIO_QSPI_SD3_LEVEL_LOW - [28:28] - read-write - - - GPIO_QSPI_SD2_EDGE_HIGH - [27:27] - read-write - - - GPIO_QSPI_SD2_EDGE_LOW - [26:26] - read-write - - - GPIO_QSPI_SD2_LEVEL_HIGH - [25:25] - read-write - - - GPIO_QSPI_SD2_LEVEL_LOW - [24:24] - read-write - - - GPIO_QSPI_SD1_EDGE_HIGH - [23:23] - read-write - - - GPIO_QSPI_SD1_EDGE_LOW - [22:22] - read-write - - - GPIO_QSPI_SD1_LEVEL_HIGH - [21:21] - read-write - - - GPIO_QSPI_SD1_LEVEL_LOW - [20:20] - read-write - - - GPIO_QSPI_SD0_EDGE_HIGH - [19:19] - read-write - - - GPIO_QSPI_SD0_EDGE_LOW - [18:18] - read-write - - - GPIO_QSPI_SD0_LEVEL_HIGH - [17:17] - read-write - - - GPIO_QSPI_SD0_LEVEL_LOW - [16:16] - read-write - - - GPIO_QSPI_SS_EDGE_HIGH - [15:15] - read-write - - - GPIO_QSPI_SS_EDGE_LOW - [14:14] - read-write - - - GPIO_QSPI_SS_LEVEL_HIGH - [13:13] - read-write - - - GPIO_QSPI_SS_LEVEL_LOW - [12:12] - read-write - - - GPIO_QSPI_SCLK_EDGE_HIGH - [11:11] - read-write - - - GPIO_QSPI_SCLK_EDGE_LOW - [10:10] - read-write - - - GPIO_QSPI_SCLK_LEVEL_HIGH - [9:9] - read-write - - - GPIO_QSPI_SCLK_LEVEL_LOW - [8:8] - read-write - - - USBPHY_DM_EDGE_HIGH - [7:7] - read-write - - - USBPHY_DM_EDGE_LOW - [6:6] - read-write - - - USBPHY_DM_LEVEL_HIGH - [5:5] - read-write - - - USBPHY_DM_LEVEL_LOW - [4:4] - read-write - - - USBPHY_DP_EDGE_HIGH - [3:3] - read-write - - - USBPHY_DP_EDGE_LOW - [2:2] - read-write - - - USBPHY_DP_LEVEL_HIGH - [1:1] - read-write - - - USBPHY_DP_LEVEL_LOW - [0:0] - read-write - - - - - DORMANT_WAKE_INTF - Interrupt Force for dormant_wake - 0x238 - 0x00000000 - - - GPIO_QSPI_SD3_EDGE_HIGH - [31:31] - read-write - - - GPIO_QSPI_SD3_EDGE_LOW - [30:30] - read-write - - - GPIO_QSPI_SD3_LEVEL_HIGH - [29:29] - read-write - - - GPIO_QSPI_SD3_LEVEL_LOW - [28:28] - read-write - - - GPIO_QSPI_SD2_EDGE_HIGH - [27:27] - read-write - - - GPIO_QSPI_SD2_EDGE_LOW - [26:26] - read-write - - - GPIO_QSPI_SD2_LEVEL_HIGH - [25:25] - read-write - - - GPIO_QSPI_SD2_LEVEL_LOW - [24:24] - read-write - - - GPIO_QSPI_SD1_EDGE_HIGH - [23:23] - read-write - - - GPIO_QSPI_SD1_EDGE_LOW - [22:22] - read-write - - - GPIO_QSPI_SD1_LEVEL_HIGH - [21:21] - read-write - - - GPIO_QSPI_SD1_LEVEL_LOW - [20:20] - read-write - - - GPIO_QSPI_SD0_EDGE_HIGH - [19:19] - read-write - - - GPIO_QSPI_SD0_EDGE_LOW - [18:18] - read-write - - - GPIO_QSPI_SD0_LEVEL_HIGH - [17:17] - read-write - - - GPIO_QSPI_SD0_LEVEL_LOW - [16:16] - read-write - - - GPIO_QSPI_SS_EDGE_HIGH - [15:15] - read-write - - - GPIO_QSPI_SS_EDGE_LOW - [14:14] - read-write - - - GPIO_QSPI_SS_LEVEL_HIGH - [13:13] - read-write - - - GPIO_QSPI_SS_LEVEL_LOW - [12:12] - read-write - - - GPIO_QSPI_SCLK_EDGE_HIGH - [11:11] - read-write - - - GPIO_QSPI_SCLK_EDGE_LOW - [10:10] - read-write - - - GPIO_QSPI_SCLK_LEVEL_HIGH - [9:9] - read-write - - - GPIO_QSPI_SCLK_LEVEL_LOW - [8:8] - read-write - - - USBPHY_DM_EDGE_HIGH - [7:7] - read-write - - - USBPHY_DM_EDGE_LOW - [6:6] - read-write - - - USBPHY_DM_LEVEL_HIGH - [5:5] - read-write - - - USBPHY_DM_LEVEL_LOW - [4:4] - read-write - - - USBPHY_DP_EDGE_HIGH - [3:3] - read-write - - - USBPHY_DP_EDGE_LOW - [2:2] - read-write - - - USBPHY_DP_LEVEL_HIGH - [1:1] - read-write - - - USBPHY_DP_LEVEL_LOW - [0:0] - read-write - - - - - DORMANT_WAKE_INTS - Interrupt status after masking & forcing for dormant_wake - 0x23C - 0x00000000 - - - GPIO_QSPI_SD3_EDGE_HIGH - [31:31] - read-only - - - GPIO_QSPI_SD3_EDGE_LOW - [30:30] - read-only - - - GPIO_QSPI_SD3_LEVEL_HIGH - [29:29] - read-only - - - GPIO_QSPI_SD3_LEVEL_LOW - [28:28] - read-only - - - GPIO_QSPI_SD2_EDGE_HIGH - [27:27] - read-only - - - GPIO_QSPI_SD2_EDGE_LOW - [26:26] - read-only - - - GPIO_QSPI_SD2_LEVEL_HIGH - [25:25] - read-only - - - GPIO_QSPI_SD2_LEVEL_LOW - [24:24] - read-only - - - GPIO_QSPI_SD1_EDGE_HIGH - [23:23] - read-only - - - GPIO_QSPI_SD1_EDGE_LOW - [22:22] - read-only - - - GPIO_QSPI_SD1_LEVEL_HIGH - [21:21] - read-only - - - GPIO_QSPI_SD1_LEVEL_LOW - [20:20] - read-only - - - GPIO_QSPI_SD0_EDGE_HIGH - [19:19] - read-only - - - GPIO_QSPI_SD0_EDGE_LOW - [18:18] - read-only - - - GPIO_QSPI_SD0_LEVEL_HIGH - [17:17] - read-only - - - GPIO_QSPI_SD0_LEVEL_LOW - [16:16] - read-only - - - GPIO_QSPI_SS_EDGE_HIGH - [15:15] - read-only - - - GPIO_QSPI_SS_EDGE_LOW - [14:14] - read-only - - - GPIO_QSPI_SS_LEVEL_HIGH - [13:13] - read-only - - - GPIO_QSPI_SS_LEVEL_LOW - [12:12] - read-only - - - GPIO_QSPI_SCLK_EDGE_HIGH - [11:11] - read-only - - - GPIO_QSPI_SCLK_EDGE_LOW - [10:10] - read-only - - - GPIO_QSPI_SCLK_LEVEL_HIGH - [9:9] - read-only - - - GPIO_QSPI_SCLK_LEVEL_LOW - [8:8] - read-only - - - USBPHY_DM_EDGE_HIGH - [7:7] - read-only - - - USBPHY_DM_EDGE_LOW - [6:6] - read-only - - - USBPHY_DM_LEVEL_HIGH - [5:5] - read-only - - - USBPHY_DM_LEVEL_LOW - [4:4] - read-only - - - USBPHY_DP_EDGE_HIGH - [3:3] - read-only - - - USBPHY_DP_EDGE_LOW - [2:2] - read-only - - - USBPHY_DP_LEVEL_HIGH - [1:1] - read-only - - - USBPHY_DP_LEVEL_LOW - [0:0] - read-only - - - - - - - IO_BANK0 - 0x40028000 - - 0x0 - 0x320 - registers - - - IO_IRQ_BANK0 - 21 - - - IO_IRQ_BANK0_NS - 22 - - - - 48 - 0x8 - 0-47 - GPIO%s - Cluster GPIO%s, containing GPIO*_STATUS, GPIO*_CTRL - 0x0 - - GPIO_STATUS - 0x0 - 0x00000000 - - - IRQTOPROC - interrupt to processors, after override is applied - [26:26] - read-only - - - INFROMPAD - input signal from pad, before filtering and override are applied - [17:17] - read-only - - - OETOPAD - output enable to pad after register override is applied - [13:13] - read-only - - - OUTTOPAD - output signal to pad after register override is applied - [9:9] - read-only - - - - - GPIO_CTRL - 0x4 - 0x0000001F - - - IRQOVER - [29:28] - read-write - - - NORMAL - don't invert the interrupt - 0 - - - INVERT - invert the interrupt - 1 - - - LOW - drive interrupt low - 2 - - - HIGH - drive interrupt high - 3 - - - - - INOVER - [17:16] - read-write - - - NORMAL - don't invert the peri input - 0 - - - INVERT - invert the peri input - 1 - - - LOW - drive peri input low - 2 - - - HIGH - drive peri input high - 3 - - - - - OEOVER - [15:14] - read-write - - - NORMAL - drive output enable from peripheral signal selected by funcsel - 0 - - - INVERT - drive output enable from inverse of peripheral signal selected by funcsel - 1 - - - DISABLE - disable output - 2 - - - ENABLE - enable output - 3 - - - - - OUTOVER - [13:12] - read-write - - - NORMAL - drive output from peripheral signal selected by funcsel - 0 - - - INVERT - drive output from inverse of peripheral signal selected by funcsel - 1 - - - LOW - drive output low - 2 - - - HIGH - drive output high - 3 - - - - - FUNCSEL - 0-31 -> selects pin function according to the GPIO table. Not all options are valid for all GPIO pins. - [4:0] - read-write - - FUNCSEL - - jtag - Connect to JTAG peripheral - 0 - - - spi - Connect to matching SPI peripheral - 1 - - - uart - Connect to matching UART peripheral - 2 - - - i2c - Connect to matching I2C peripheral - 3 - - - pwm - Connect to matching PWM peripheral - 4 - - - sio - Use as a GPIO pin (connect to SIO peripheral) - 5 - - - pio0 - Connect to PIO0 peripheral - 6 - - - pio1 - Connect to PIO1 peripheral - 7 - - - pio2 - Connect to PIO2 peripheral - 8 - - - gpck - Connect to GPCK peripheral - 9 - - - usb - Connect to USB peripheral - 10 - - - uart_aux - Connect to matching UART_AUX peripheral - 11 - - - null - Connect to nothing - 31 - - - - - - - - IRQSUMMARY_PROC0_SECURE0 - 0x200 - 0x00000000 - - - GPIO31 - [31:31] - read-only - - - GPIO30 - [30:30] - read-only - - - GPIO29 - [29:29] - read-only - - - GPIO28 - [28:28] - read-only - - - GPIO27 - [27:27] - read-only - - - GPIO26 - [26:26] - read-only - - - GPIO25 - [25:25] - read-only - - - GPIO24 - [24:24] - read-only - - - GPIO23 - [23:23] - read-only - - - GPIO22 - [22:22] - read-only - - - GPIO21 - [21:21] - read-only - - - GPIO20 - [20:20] - read-only - - - GPIO19 - [19:19] - read-only - - - GPIO18 - [18:18] - read-only - - - GPIO17 - [17:17] - read-only - - - GPIO16 - [16:16] - read-only - - - GPIO15 - [15:15] - read-only - - - GPIO14 - [14:14] - read-only - - - GPIO13 - [13:13] - read-only - - - GPIO12 - [12:12] - read-only - - - GPIO11 - [11:11] - read-only - - - GPIO10 - [10:10] - read-only - - - GPIO9 - [9:9] - read-only - - - GPIO8 - [8:8] - read-only - - - GPIO7 - [7:7] - read-only - - - GPIO6 - [6:6] - read-only - - - GPIO5 - [5:5] - read-only - - - GPIO4 - [4:4] - read-only - - - GPIO3 - [3:3] - read-only - - - GPIO2 - [2:2] - read-only - - - GPIO1 - [1:1] - read-only - - - GPIO0 - [0:0] - read-only - - - - - IRQSUMMARY_PROC0_SECURE1 - 0x204 - 0x00000000 - - - GPIO47 - [15:15] - read-only - - - GPIO46 - [14:14] - read-only - - - GPIO45 - [13:13] - read-only - - - GPIO44 - [12:12] - read-only - - - GPIO43 - [11:11] - read-only - - - GPIO42 - [10:10] - read-only - - - GPIO41 - [9:9] - read-only - - - GPIO40 - [8:8] - read-only - - - GPIO39 - [7:7] - read-only - - - GPIO38 - [6:6] - read-only - - - GPIO37 - [5:5] - read-only - - - GPIO36 - [4:4] - read-only - - - GPIO35 - [3:3] - read-only - - - GPIO34 - [2:2] - read-only - - - GPIO33 - [1:1] - read-only - - - GPIO32 - [0:0] - read-only - - - - - IRQSUMMARY_PROC0_NONSECURE0 - 0x208 - 0x00000000 - - - GPIO31 - [31:31] - read-only - - - GPIO30 - [30:30] - read-only - - - GPIO29 - [29:29] - read-only - - - GPIO28 - [28:28] - read-only - - - GPIO27 - [27:27] - read-only - - - GPIO26 - [26:26] - read-only - - - GPIO25 - [25:25] - read-only - - - GPIO24 - [24:24] - read-only - - - GPIO23 - [23:23] - read-only - - - GPIO22 - [22:22] - read-only - - - GPIO21 - [21:21] - read-only - - - GPIO20 - [20:20] - read-only - - - GPIO19 - [19:19] - read-only - - - GPIO18 - [18:18] - read-only - - - GPIO17 - [17:17] - read-only - - - GPIO16 - [16:16] - read-only - - - GPIO15 - [15:15] - read-only - - - GPIO14 - [14:14] - read-only - - - GPIO13 - [13:13] - read-only - - - GPIO12 - [12:12] - read-only - - - GPIO11 - [11:11] - read-only - - - GPIO10 - [10:10] - read-only - - - GPIO9 - [9:9] - read-only - - - GPIO8 - [8:8] - read-only - - - GPIO7 - [7:7] - read-only - - - GPIO6 - [6:6] - read-only - - - GPIO5 - [5:5] - read-only - - - GPIO4 - [4:4] - read-only - - - GPIO3 - [3:3] - read-only - - - GPIO2 - [2:2] - read-only - - - GPIO1 - [1:1] - read-only - - - GPIO0 - [0:0] - read-only - - - - - IRQSUMMARY_PROC0_NONSECURE1 - 0x20C - 0x00000000 - - - GPIO47 - [15:15] - read-only - - - GPIO46 - [14:14] - read-only - - - GPIO45 - [13:13] - read-only - - - GPIO44 - [12:12] - read-only - - - GPIO43 - [11:11] - read-only - - - GPIO42 - [10:10] - read-only - - - GPIO41 - [9:9] - read-only - - - GPIO40 - [8:8] - read-only - - - GPIO39 - [7:7] - read-only - - - GPIO38 - [6:6] - read-only - - - GPIO37 - [5:5] - read-only - - - GPIO36 - [4:4] - read-only - - - GPIO35 - [3:3] - read-only - - - GPIO34 - [2:2] - read-only - - - GPIO33 - [1:1] - read-only - - - GPIO32 - [0:0] - read-only - - - - - IRQSUMMARY_PROC1_SECURE0 - 0x210 - 0x00000000 - - - GPIO31 - [31:31] - read-only - - - GPIO30 - [30:30] - read-only - - - GPIO29 - [29:29] - read-only - - - GPIO28 - [28:28] - read-only - - - GPIO27 - [27:27] - read-only - - - GPIO26 - [26:26] - read-only - - - GPIO25 - [25:25] - read-only - - - GPIO24 - [24:24] - read-only - - - GPIO23 - [23:23] - read-only - - - GPIO22 - [22:22] - read-only - - - GPIO21 - [21:21] - read-only - - - GPIO20 - [20:20] - read-only - - - GPIO19 - [19:19] - read-only - - - GPIO18 - [18:18] - read-only - - - GPIO17 - [17:17] - read-only - - - GPIO16 - [16:16] - read-only - - - GPIO15 - [15:15] - read-only - - - GPIO14 - [14:14] - read-only - - - GPIO13 - [13:13] - read-only - - - GPIO12 - [12:12] - read-only - - - GPIO11 - [11:11] - read-only - - - GPIO10 - [10:10] - read-only - - - GPIO9 - [9:9] - read-only - - - GPIO8 - [8:8] - read-only - - - GPIO7 - [7:7] - read-only - - - GPIO6 - [6:6] - read-only - - - GPIO5 - [5:5] - read-only - - - GPIO4 - [4:4] - read-only - - - GPIO3 - [3:3] - read-only - - - GPIO2 - [2:2] - read-only - - - GPIO1 - [1:1] - read-only - - - GPIO0 - [0:0] - read-only - - - - - IRQSUMMARY_PROC1_SECURE1 - 0x214 - 0x00000000 - - - GPIO47 - [15:15] - read-only - - - GPIO46 - [14:14] - read-only - - - GPIO45 - [13:13] - read-only - - - GPIO44 - [12:12] - read-only - - - GPIO43 - [11:11] - read-only - - - GPIO42 - [10:10] - read-only - - - GPIO41 - [9:9] - read-only - - - GPIO40 - [8:8] - read-only - - - GPIO39 - [7:7] - read-only - - - GPIO38 - [6:6] - read-only - - - GPIO37 - [5:5] - read-only - - - GPIO36 - [4:4] - read-only - - - GPIO35 - [3:3] - read-only - - - GPIO34 - [2:2] - read-only - - - GPIO33 - [1:1] - read-only - - - GPIO32 - [0:0] - read-only - - - - - IRQSUMMARY_PROC1_NONSECURE0 - 0x218 - 0x00000000 - - - GPIO31 - [31:31] - read-only - - - GPIO30 - [30:30] - read-only - - - GPIO29 - [29:29] - read-only - - - GPIO28 - [28:28] - read-only - - - GPIO27 - [27:27] - read-only - - - GPIO26 - [26:26] - read-only - - - GPIO25 - [25:25] - read-only - - - GPIO24 - [24:24] - read-only - - - GPIO23 - [23:23] - read-only - - - GPIO22 - [22:22] - read-only - - - GPIO21 - [21:21] - read-only - - - GPIO20 - [20:20] - read-only - - - GPIO19 - [19:19] - read-only - - - GPIO18 - [18:18] - read-only - - - GPIO17 - [17:17] - read-only - - - GPIO16 - [16:16] - read-only - - - GPIO15 - [15:15] - read-only - - - GPIO14 - [14:14] - read-only - - - GPIO13 - [13:13] - read-only - - - GPIO12 - [12:12] - read-only - - - GPIO11 - [11:11] - read-only - - - GPIO10 - [10:10] - read-only - - - GPIO9 - [9:9] - read-only - - - GPIO8 - [8:8] - read-only - - - GPIO7 - [7:7] - read-only - - - GPIO6 - [6:6] - read-only - - - GPIO5 - [5:5] - read-only - - - GPIO4 - [4:4] - read-only - - - GPIO3 - [3:3] - read-only - - - GPIO2 - [2:2] - read-only - - - GPIO1 - [1:1] - read-only - - - GPIO0 - [0:0] - read-only - - - - - IRQSUMMARY_PROC1_NONSECURE1 - 0x21C - 0x00000000 - - - GPIO47 - [15:15] - read-only - - - GPIO46 - [14:14] - read-only - - - GPIO45 - [13:13] - read-only - - - GPIO44 - [12:12] - read-only - - - GPIO43 - [11:11] - read-only - - - GPIO42 - [10:10] - read-only - - - GPIO41 - [9:9] - read-only - - - GPIO40 - [8:8] - read-only - - - GPIO39 - [7:7] - read-only - - - GPIO38 - [6:6] - read-only - - - GPIO37 - [5:5] - read-only - - - GPIO36 - [4:4] - read-only - - - GPIO35 - [3:3] - read-only - - - GPIO34 - [2:2] - read-only - - - GPIO33 - [1:1] - read-only - - - GPIO32 - [0:0] - read-only - - - - - IRQSUMMARY_DORMANT_WAKE_SECURE0 - 0x220 - 0x00000000 - - - GPIO31 - [31:31] - read-only - - - GPIO30 - [30:30] - read-only - - - GPIO29 - [29:29] - read-only - - - GPIO28 - [28:28] - read-only - - - GPIO27 - [27:27] - read-only - - - GPIO26 - [26:26] - read-only - - - GPIO25 - [25:25] - read-only - - - GPIO24 - [24:24] - read-only - - - GPIO23 - [23:23] - read-only - - - GPIO22 - [22:22] - read-only - - - GPIO21 - [21:21] - read-only - - - GPIO20 - [20:20] - read-only - - - GPIO19 - [19:19] - read-only - - - GPIO18 - [18:18] - read-only - - - GPIO17 - [17:17] - read-only - - - GPIO16 - [16:16] - read-only - - - GPIO15 - [15:15] - read-only - - - GPIO14 - [14:14] - read-only - - - GPIO13 - [13:13] - read-only - - - GPIO12 - [12:12] - read-only - - - GPIO11 - [11:11] - read-only - - - GPIO10 - [10:10] - read-only - - - GPIO9 - [9:9] - read-only - - - GPIO8 - [8:8] - read-only - - - GPIO7 - [7:7] - read-only - - - GPIO6 - [6:6] - read-only - - - GPIO5 - [5:5] - read-only - - - GPIO4 - [4:4] - read-only - - - GPIO3 - [3:3] - read-only - - - GPIO2 - [2:2] - read-only - - - GPIO1 - [1:1] - read-only - - - GPIO0 - [0:0] - read-only - - - - - IRQSUMMARY_DORMANT_WAKE_SECURE1 - 0x224 - 0x00000000 - - - GPIO47 - [15:15] - read-only - - - GPIO46 - [14:14] - read-only - - - GPIO45 - [13:13] - read-only - - - GPIO44 - [12:12] - read-only - - - GPIO43 - [11:11] - read-only - - - GPIO42 - [10:10] - read-only - - - GPIO41 - [9:9] - read-only - - - GPIO40 - [8:8] - read-only - - - GPIO39 - [7:7] - read-only - - - GPIO38 - [6:6] - read-only - - - GPIO37 - [5:5] - read-only - - - GPIO36 - [4:4] - read-only - - - GPIO35 - [3:3] - read-only - - - GPIO34 - [2:2] - read-only - - - GPIO33 - [1:1] - read-only - - - GPIO32 - [0:0] - read-only - - - - - IRQSUMMARY_DORMANT_WAKE_NONSECURE0 - 0x228 - 0x00000000 - - - GPIO31 - [31:31] - read-only - - - GPIO30 - [30:30] - read-only - - - GPIO29 - [29:29] - read-only - - - GPIO28 - [28:28] - read-only - - - GPIO27 - [27:27] - read-only - - - GPIO26 - [26:26] - read-only - - - GPIO25 - [25:25] - read-only - - - GPIO24 - [24:24] - read-only - - - GPIO23 - [23:23] - read-only - - - GPIO22 - [22:22] - read-only - - - GPIO21 - [21:21] - read-only - - - GPIO20 - [20:20] - read-only - - - GPIO19 - [19:19] - read-only - - - GPIO18 - [18:18] - read-only - - - GPIO17 - [17:17] - read-only - - - GPIO16 - [16:16] - read-only - - - GPIO15 - [15:15] - read-only - - - GPIO14 - [14:14] - read-only - - - GPIO13 - [13:13] - read-only - - - GPIO12 - [12:12] - read-only - - - GPIO11 - [11:11] - read-only - - - GPIO10 - [10:10] - read-only - - - GPIO9 - [9:9] - read-only - - - GPIO8 - [8:8] - read-only - - - GPIO7 - [7:7] - read-only - - - GPIO6 - [6:6] - read-only - - - GPIO5 - [5:5] - read-only - - - GPIO4 - [4:4] - read-only - - - GPIO3 - [3:3] - read-only - - - GPIO2 - [2:2] - read-only - - - GPIO1 - [1:1] - read-only - - - GPIO0 - [0:0] - read-only - - - - - IRQSUMMARY_DORMANT_WAKE_NONSECURE1 - 0x22C - 0x00000000 - - - GPIO47 - [15:15] - read-only - - - GPIO46 - [14:14] - read-only - - - GPIO45 - [13:13] - read-only - - - GPIO44 - [12:12] - read-only - - - GPIO43 - [11:11] - read-only - - - GPIO42 - [10:10] - read-only - - - GPIO41 - [9:9] - read-only - - - GPIO40 - [8:8] - read-only - - - GPIO39 - [7:7] - read-only - - - GPIO38 - [6:6] - read-only - - - GPIO37 - [5:5] - read-only - - - GPIO36 - [4:4] - read-only - - - GPIO35 - [3:3] - read-only - - - GPIO34 - [2:2] - read-only - - - GPIO33 - [1:1] - read-only - - - GPIO32 - [0:0] - read-only - - - - - 6 - 0x4 - 0-5 - INTR%s - Raw Interrupts - 0x230 - 0x00000000 - - - GPIO7_EDGE_HIGH - [31:31] - read-write - oneToClear - - - GPIO7_EDGE_LOW - [30:30] - read-write - oneToClear - - - GPIO7_LEVEL_HIGH - [29:29] - read-only - - - GPIO7_LEVEL_LOW - [28:28] - read-only - - - GPIO6_EDGE_HIGH - [27:27] - read-write - oneToClear - - - GPIO6_EDGE_LOW - [26:26] - read-write - oneToClear - - - GPIO6_LEVEL_HIGH - [25:25] - read-only - - - GPIO6_LEVEL_LOW - [24:24] - read-only - - - GPIO5_EDGE_HIGH - [23:23] - read-write - oneToClear - - - GPIO5_EDGE_LOW - [22:22] - read-write - oneToClear - - - GPIO5_LEVEL_HIGH - [21:21] - read-only - - - GPIO5_LEVEL_LOW - [20:20] - read-only - - - GPIO4_EDGE_HIGH - [19:19] - read-write - oneToClear - - - GPIO4_EDGE_LOW - [18:18] - read-write - oneToClear - - - GPIO4_LEVEL_HIGH - [17:17] - read-only - - - GPIO4_LEVEL_LOW - [16:16] - read-only - - - GPIO3_EDGE_HIGH - [15:15] - read-write - oneToClear - - - GPIO3_EDGE_LOW - [14:14] - read-write - oneToClear - - - GPIO3_LEVEL_HIGH - [13:13] - read-only - - - GPIO3_LEVEL_LOW - [12:12] - read-only - - - GPIO2_EDGE_HIGH - [11:11] - read-write - oneToClear - - - GPIO2_EDGE_LOW - [10:10] - read-write - oneToClear - - - GPIO2_LEVEL_HIGH - [9:9] - read-only - - - GPIO2_LEVEL_LOW - [8:8] - read-only - - - GPIO1_EDGE_HIGH - [7:7] - read-write - oneToClear - - - GPIO1_EDGE_LOW - [6:6] - read-write - oneToClear - - - GPIO1_LEVEL_HIGH - [5:5] - read-only - - - GPIO1_LEVEL_LOW - [4:4] - read-only - - - GPIO0_EDGE_HIGH - [3:3] - read-write - oneToClear - - - GPIO0_EDGE_LOW - [2:2] - read-write - oneToClear - - - GPIO0_LEVEL_HIGH - [1:1] - read-only - - - GPIO0_LEVEL_LOW - [0:0] - read-only - - - - - 6 - 0x4 - 0-5 - PROC0_INTE%s - Interrupt Enable for proc0 - 0x248 - 0x00000000 - - - GPIO7_EDGE_HIGH - [31:31] - read-write - - - GPIO7_EDGE_LOW - [30:30] - read-write - - - GPIO7_LEVEL_HIGH - [29:29] - read-write - - - GPIO7_LEVEL_LOW - [28:28] - read-write - - - GPIO6_EDGE_HIGH - [27:27] - read-write - - - GPIO6_EDGE_LOW - [26:26] - read-write - - - GPIO6_LEVEL_HIGH - [25:25] - read-write - - - GPIO6_LEVEL_LOW - [24:24] - read-write - - - GPIO5_EDGE_HIGH - [23:23] - read-write - - - GPIO5_EDGE_LOW - [22:22] - read-write - - - GPIO5_LEVEL_HIGH - [21:21] - read-write - - - GPIO5_LEVEL_LOW - [20:20] - read-write - - - GPIO4_EDGE_HIGH - [19:19] - read-write - - - GPIO4_EDGE_LOW - [18:18] - read-write - - - GPIO4_LEVEL_HIGH - [17:17] - read-write - - - GPIO4_LEVEL_LOW - [16:16] - read-write - - - GPIO3_EDGE_HIGH - [15:15] - read-write - - - GPIO3_EDGE_LOW - [14:14] - read-write - - - GPIO3_LEVEL_HIGH - [13:13] - read-write - - - GPIO3_LEVEL_LOW - [12:12] - read-write - - - GPIO2_EDGE_HIGH - [11:11] - read-write - - - GPIO2_EDGE_LOW - [10:10] - read-write - - - GPIO2_LEVEL_HIGH - [9:9] - read-write - - - GPIO2_LEVEL_LOW - [8:8] - read-write - - - GPIO1_EDGE_HIGH - [7:7] - read-write - - - GPIO1_EDGE_LOW - [6:6] - read-write - - - GPIO1_LEVEL_HIGH - [5:5] - read-write - - - GPIO1_LEVEL_LOW - [4:4] - read-write - - - GPIO0_EDGE_HIGH - [3:3] - read-write - - - GPIO0_EDGE_LOW - [2:2] - read-write - - - GPIO0_LEVEL_HIGH - [1:1] - read-write - - - GPIO0_LEVEL_LOW - [0:0] - read-write - - - - - 6 - 0x4 - 0-5 - PROC0_INTF%s - Interrupt Force for proc0 - 0x260 - 0x00000000 - - - GPIO7_EDGE_HIGH - [31:31] - read-write - - - GPIO7_EDGE_LOW - [30:30] - read-write - - - GPIO7_LEVEL_HIGH - [29:29] - read-write - - - GPIO7_LEVEL_LOW - [28:28] - read-write - - - GPIO6_EDGE_HIGH - [27:27] - read-write - - - GPIO6_EDGE_LOW - [26:26] - read-write - - - GPIO6_LEVEL_HIGH - [25:25] - read-write - - - GPIO6_LEVEL_LOW - [24:24] - read-write - - - GPIO5_EDGE_HIGH - [23:23] - read-write - - - GPIO5_EDGE_LOW - [22:22] - read-write - - - GPIO5_LEVEL_HIGH - [21:21] - read-write - - - GPIO5_LEVEL_LOW - [20:20] - read-write - - - GPIO4_EDGE_HIGH - [19:19] - read-write - - - GPIO4_EDGE_LOW - [18:18] - read-write - - - GPIO4_LEVEL_HIGH - [17:17] - read-write - - - GPIO4_LEVEL_LOW - [16:16] - read-write - - - GPIO3_EDGE_HIGH - [15:15] - read-write - - - GPIO3_EDGE_LOW - [14:14] - read-write - - - GPIO3_LEVEL_HIGH - [13:13] - read-write - - - GPIO3_LEVEL_LOW - [12:12] - read-write - - - GPIO2_EDGE_HIGH - [11:11] - read-write - - - GPIO2_EDGE_LOW - [10:10] - read-write - - - GPIO2_LEVEL_HIGH - [9:9] - read-write - - - GPIO2_LEVEL_LOW - [8:8] - read-write - - - GPIO1_EDGE_HIGH - [7:7] - read-write - - - GPIO1_EDGE_LOW - [6:6] - read-write - - - GPIO1_LEVEL_HIGH - [5:5] - read-write - - - GPIO1_LEVEL_LOW - [4:4] - read-write - - - GPIO0_EDGE_HIGH - [3:3] - read-write - - - GPIO0_EDGE_LOW - [2:2] - read-write - - - GPIO0_LEVEL_HIGH - [1:1] - read-write - - - GPIO0_LEVEL_LOW - [0:0] - read-write - - - - - 6 - 0x4 - 0-5 - PROC0_INTS%s - Interrupt status after masking & forcing for proc0 - 0x278 - 0x00000000 - - - GPIO7_EDGE_HIGH - [31:31] - read-only - - - GPIO7_EDGE_LOW - [30:30] - read-only - - - GPIO7_LEVEL_HIGH - [29:29] - read-only - - - GPIO7_LEVEL_LOW - [28:28] - read-only - - - GPIO6_EDGE_HIGH - [27:27] - read-only - - - GPIO6_EDGE_LOW - [26:26] - read-only - - - GPIO6_LEVEL_HIGH - [25:25] - read-only - - - GPIO6_LEVEL_LOW - [24:24] - read-only - - - GPIO5_EDGE_HIGH - [23:23] - read-only - - - GPIO5_EDGE_LOW - [22:22] - read-only - - - GPIO5_LEVEL_HIGH - [21:21] - read-only - - - GPIO5_LEVEL_LOW - [20:20] - read-only - - - GPIO4_EDGE_HIGH - [19:19] - read-only - - - GPIO4_EDGE_LOW - [18:18] - read-only - - - GPIO4_LEVEL_HIGH - [17:17] - read-only - - - GPIO4_LEVEL_LOW - [16:16] - read-only - - - GPIO3_EDGE_HIGH - [15:15] - read-only - - - GPIO3_EDGE_LOW - [14:14] - read-only - - - GPIO3_LEVEL_HIGH - [13:13] - read-only - - - GPIO3_LEVEL_LOW - [12:12] - read-only - - - GPIO2_EDGE_HIGH - [11:11] - read-only - - - GPIO2_EDGE_LOW - [10:10] - read-only - - - GPIO2_LEVEL_HIGH - [9:9] - read-only - - - GPIO2_LEVEL_LOW - [8:8] - read-only - - - GPIO1_EDGE_HIGH - [7:7] - read-only - - - GPIO1_EDGE_LOW - [6:6] - read-only - - - GPIO1_LEVEL_HIGH - [5:5] - read-only - - - GPIO1_LEVEL_LOW - [4:4] - read-only - - - GPIO0_EDGE_HIGH - [3:3] - read-only - - - GPIO0_EDGE_LOW - [2:2] - read-only - - - GPIO0_LEVEL_HIGH - [1:1] - read-only - - - GPIO0_LEVEL_LOW - [0:0] - read-only - - - - - 6 - 0x4 - 0-5 - PROC1_INTE%s - Interrupt Enable for proc1 - 0x290 - 0x00000000 - - - GPIO7_EDGE_HIGH - [31:31] - read-write - - - GPIO7_EDGE_LOW - [30:30] - read-write - - - GPIO7_LEVEL_HIGH - [29:29] - read-write - - - GPIO7_LEVEL_LOW - [28:28] - read-write - - - GPIO6_EDGE_HIGH - [27:27] - read-write - - - GPIO6_EDGE_LOW - [26:26] - read-write - - - GPIO6_LEVEL_HIGH - [25:25] - read-write - - - GPIO6_LEVEL_LOW - [24:24] - read-write - - - GPIO5_EDGE_HIGH - [23:23] - read-write - - - GPIO5_EDGE_LOW - [22:22] - read-write - - - GPIO5_LEVEL_HIGH - [21:21] - read-write - - - GPIO5_LEVEL_LOW - [20:20] - read-write - - - GPIO4_EDGE_HIGH - [19:19] - read-write - - - GPIO4_EDGE_LOW - [18:18] - read-write - - - GPIO4_LEVEL_HIGH - [17:17] - read-write - - - GPIO4_LEVEL_LOW - [16:16] - read-write - - - GPIO3_EDGE_HIGH - [15:15] - read-write - - - GPIO3_EDGE_LOW - [14:14] - read-write - - - GPIO3_LEVEL_HIGH - [13:13] - read-write - - - GPIO3_LEVEL_LOW - [12:12] - read-write - - - GPIO2_EDGE_HIGH - [11:11] - read-write - - - GPIO2_EDGE_LOW - [10:10] - read-write - - - GPIO2_LEVEL_HIGH - [9:9] - read-write - - - GPIO2_LEVEL_LOW - [8:8] - read-write - - - GPIO1_EDGE_HIGH - [7:7] - read-write - - - GPIO1_EDGE_LOW - [6:6] - read-write - - - GPIO1_LEVEL_HIGH - [5:5] - read-write - - - GPIO1_LEVEL_LOW - [4:4] - read-write - - - GPIO0_EDGE_HIGH - [3:3] - read-write - - - GPIO0_EDGE_LOW - [2:2] - read-write - - - GPIO0_LEVEL_HIGH - [1:1] - read-write - - - GPIO0_LEVEL_LOW - [0:0] - read-write - - - - - 6 - 0x4 - 0-5 - PROC1_INTF%s - Interrupt Force for proc1 - 0x2A8 - 0x00000000 - - - GPIO7_EDGE_HIGH - [31:31] - read-write - - - GPIO7_EDGE_LOW - [30:30] - read-write - - - GPIO7_LEVEL_HIGH - [29:29] - read-write - - - GPIO7_LEVEL_LOW - [28:28] - read-write - - - GPIO6_EDGE_HIGH - [27:27] - read-write - - - GPIO6_EDGE_LOW - [26:26] - read-write - - - GPIO6_LEVEL_HIGH - [25:25] - read-write - - - GPIO6_LEVEL_LOW - [24:24] - read-write - - - GPIO5_EDGE_HIGH - [23:23] - read-write - - - GPIO5_EDGE_LOW - [22:22] - read-write - - - GPIO5_LEVEL_HIGH - [21:21] - read-write - - - GPIO5_LEVEL_LOW - [20:20] - read-write - - - GPIO4_EDGE_HIGH - [19:19] - read-write - - - GPIO4_EDGE_LOW - [18:18] - read-write - - - GPIO4_LEVEL_HIGH - [17:17] - read-write - - - GPIO4_LEVEL_LOW - [16:16] - read-write - - - GPIO3_EDGE_HIGH - [15:15] - read-write - - - GPIO3_EDGE_LOW - [14:14] - read-write - - - GPIO3_LEVEL_HIGH - [13:13] - read-write - - - GPIO3_LEVEL_LOW - [12:12] - read-write - - - GPIO2_EDGE_HIGH - [11:11] - read-write - - - GPIO2_EDGE_LOW - [10:10] - read-write - - - GPIO2_LEVEL_HIGH - [9:9] - read-write - - - GPIO2_LEVEL_LOW - [8:8] - read-write - - - GPIO1_EDGE_HIGH - [7:7] - read-write - - - GPIO1_EDGE_LOW - [6:6] - read-write - - - GPIO1_LEVEL_HIGH - [5:5] - read-write - - - GPIO1_LEVEL_LOW - [4:4] - read-write - - - GPIO0_EDGE_HIGH - [3:3] - read-write - - - GPIO0_EDGE_LOW - [2:2] - read-write - - - GPIO0_LEVEL_HIGH - [1:1] - read-write - - - GPIO0_LEVEL_LOW - [0:0] - read-write - - - - - 6 - 0x4 - 0-5 - PROC1_INTS%s - Interrupt status after masking & forcing for proc1 - 0x2C0 - 0x00000000 - - - GPIO7_EDGE_HIGH - [31:31] - read-only - - - GPIO7_EDGE_LOW - [30:30] - read-only - - - GPIO7_LEVEL_HIGH - [29:29] - read-only - - - GPIO7_LEVEL_LOW - [28:28] - read-only - - - GPIO6_EDGE_HIGH - [27:27] - read-only - - - GPIO6_EDGE_LOW - [26:26] - read-only - - - GPIO6_LEVEL_HIGH - [25:25] - read-only - - - GPIO6_LEVEL_LOW - [24:24] - read-only - - - GPIO5_EDGE_HIGH - [23:23] - read-only - - - GPIO5_EDGE_LOW - [22:22] - read-only - - - GPIO5_LEVEL_HIGH - [21:21] - read-only - - - GPIO5_LEVEL_LOW - [20:20] - read-only - - - GPIO4_EDGE_HIGH - [19:19] - read-only - - - GPIO4_EDGE_LOW - [18:18] - read-only - - - GPIO4_LEVEL_HIGH - [17:17] - read-only - - - GPIO4_LEVEL_LOW - [16:16] - read-only - - - GPIO3_EDGE_HIGH - [15:15] - read-only - - - GPIO3_EDGE_LOW - [14:14] - read-only - - - GPIO3_LEVEL_HIGH - [13:13] - read-only - - - GPIO3_LEVEL_LOW - [12:12] - read-only - - - GPIO2_EDGE_HIGH - [11:11] - read-only - - - GPIO2_EDGE_LOW - [10:10] - read-only - - - GPIO2_LEVEL_HIGH - [9:9] - read-only - - - GPIO2_LEVEL_LOW - [8:8] - read-only - - - GPIO1_EDGE_HIGH - [7:7] - read-only - - - GPIO1_EDGE_LOW - [6:6] - read-only - - - GPIO1_LEVEL_HIGH - [5:5] - read-only - - - GPIO1_LEVEL_LOW - [4:4] - read-only - - - GPIO0_EDGE_HIGH - [3:3] - read-only - - - GPIO0_EDGE_LOW - [2:2] - read-only - - - GPIO0_LEVEL_HIGH - [1:1] - read-only - - - GPIO0_LEVEL_LOW - [0:0] - read-only - - - - - 6 - 0x4 - 0-5 - DORMANT_WAKE_INTE%s - Interrupt Enable for dormant_wake - 0x2D8 - 0x00000000 - - - GPIO7_EDGE_HIGH - [31:31] - read-write - - - GPIO7_EDGE_LOW - [30:30] - read-write - - - GPIO7_LEVEL_HIGH - [29:29] - read-write - - - GPIO7_LEVEL_LOW - [28:28] - read-write - - - GPIO6_EDGE_HIGH - [27:27] - read-write - - - GPIO6_EDGE_LOW - [26:26] - read-write - - - GPIO6_LEVEL_HIGH - [25:25] - read-write - - - GPIO6_LEVEL_LOW - [24:24] - read-write - - - GPIO5_EDGE_HIGH - [23:23] - read-write - - - GPIO5_EDGE_LOW - [22:22] - read-write - - - GPIO5_LEVEL_HIGH - [21:21] - read-write - - - GPIO5_LEVEL_LOW - [20:20] - read-write - - - GPIO4_EDGE_HIGH - [19:19] - read-write - - - GPIO4_EDGE_LOW - [18:18] - read-write - - - GPIO4_LEVEL_HIGH - [17:17] - read-write - - - GPIO4_LEVEL_LOW - [16:16] - read-write - - - GPIO3_EDGE_HIGH - [15:15] - read-write - - - GPIO3_EDGE_LOW - [14:14] - read-write - - - GPIO3_LEVEL_HIGH - [13:13] - read-write - - - GPIO3_LEVEL_LOW - [12:12] - read-write - - - GPIO2_EDGE_HIGH - [11:11] - read-write - - - GPIO2_EDGE_LOW - [10:10] - read-write - - - GPIO2_LEVEL_HIGH - [9:9] - read-write - - - GPIO2_LEVEL_LOW - [8:8] - read-write - - - GPIO1_EDGE_HIGH - [7:7] - read-write - - - GPIO1_EDGE_LOW - [6:6] - read-write - - - GPIO1_LEVEL_HIGH - [5:5] - read-write - - - GPIO1_LEVEL_LOW - [4:4] - read-write - - - GPIO0_EDGE_HIGH - [3:3] - read-write - - - GPIO0_EDGE_LOW - [2:2] - read-write - - - GPIO0_LEVEL_HIGH - [1:1] - read-write - - - GPIO0_LEVEL_LOW - [0:0] - read-write - - - - - 6 - 0x4 - 0-5 - DORMANT_WAKE_INTF%s - Interrupt Force for dormant_wake - 0x2F0 - 0x00000000 - - - GPIO7_EDGE_HIGH - [31:31] - read-write - - - GPIO7_EDGE_LOW - [30:30] - read-write - - - GPIO7_LEVEL_HIGH - [29:29] - read-write - - - GPIO7_LEVEL_LOW - [28:28] - read-write - - - GPIO6_EDGE_HIGH - [27:27] - read-write - - - GPIO6_EDGE_LOW - [26:26] - read-write - - - GPIO6_LEVEL_HIGH - [25:25] - read-write - - - GPIO6_LEVEL_LOW - [24:24] - read-write - - - GPIO5_EDGE_HIGH - [23:23] - read-write - - - GPIO5_EDGE_LOW - [22:22] - read-write - - - GPIO5_LEVEL_HIGH - [21:21] - read-write - - - GPIO5_LEVEL_LOW - [20:20] - read-write - - - GPIO4_EDGE_HIGH - [19:19] - read-write - - - GPIO4_EDGE_LOW - [18:18] - read-write - - - GPIO4_LEVEL_HIGH - [17:17] - read-write - - - GPIO4_LEVEL_LOW - [16:16] - read-write - - - GPIO3_EDGE_HIGH - [15:15] - read-write - - - GPIO3_EDGE_LOW - [14:14] - read-write - - - GPIO3_LEVEL_HIGH - [13:13] - read-write - - - GPIO3_LEVEL_LOW - [12:12] - read-write - - - GPIO2_EDGE_HIGH - [11:11] - read-write - - - GPIO2_EDGE_LOW - [10:10] - read-write - - - GPIO2_LEVEL_HIGH - [9:9] - read-write - - - GPIO2_LEVEL_LOW - [8:8] - read-write - - - GPIO1_EDGE_HIGH - [7:7] - read-write - - - GPIO1_EDGE_LOW - [6:6] - read-write - - - GPIO1_LEVEL_HIGH - [5:5] - read-write - - - GPIO1_LEVEL_LOW - [4:4] - read-write - - - GPIO0_EDGE_HIGH - [3:3] - read-write - - - GPIO0_EDGE_LOW - [2:2] - read-write - - - GPIO0_LEVEL_HIGH - [1:1] - read-write - - - GPIO0_LEVEL_LOW - [0:0] - read-write - - - - - 6 - 0x4 - 0-5 - DORMANT_WAKE_INTS%s - Interrupt status after masking & forcing for dormant_wake - 0x308 - 0x00000000 - - - GPIO7_EDGE_HIGH - [31:31] - read-only - - - GPIO7_EDGE_LOW - [30:30] - read-only - - - GPIO7_LEVEL_HIGH - [29:29] - read-only - - - GPIO7_LEVEL_LOW - [28:28] - read-only - - - GPIO6_EDGE_HIGH - [27:27] - read-only - - - GPIO6_EDGE_LOW - [26:26] - read-only - - - GPIO6_LEVEL_HIGH - [25:25] - read-only - - - GPIO6_LEVEL_LOW - [24:24] - read-only - - - GPIO5_EDGE_HIGH - [23:23] - read-only - - - GPIO5_EDGE_LOW - [22:22] - read-only - - - GPIO5_LEVEL_HIGH - [21:21] - read-only - - - GPIO5_LEVEL_LOW - [20:20] - read-only - - - GPIO4_EDGE_HIGH - [19:19] - read-only - - - GPIO4_EDGE_LOW - [18:18] - read-only - - - GPIO4_LEVEL_HIGH - [17:17] - read-only - - - GPIO4_LEVEL_LOW - [16:16] - read-only - - - GPIO3_EDGE_HIGH - [15:15] - read-only - - - GPIO3_EDGE_LOW - [14:14] - read-only - - - GPIO3_LEVEL_HIGH - [13:13] - read-only - - - GPIO3_LEVEL_LOW - [12:12] - read-only - - - GPIO2_EDGE_HIGH - [11:11] - read-only - - - GPIO2_EDGE_LOW - [10:10] - read-only - - - GPIO2_LEVEL_HIGH - [9:9] - read-only - - - GPIO2_LEVEL_LOW - [8:8] - read-only - - - GPIO1_EDGE_HIGH - [7:7] - read-only - - - GPIO1_EDGE_LOW - [6:6] - read-only - - - GPIO1_LEVEL_HIGH - [5:5] - read-only - - - GPIO1_LEVEL_LOW - [4:4] - read-only - - - GPIO0_EDGE_HIGH - [3:3] - read-only - - - GPIO0_EDGE_LOW - [2:2] - read-only - - - GPIO0_LEVEL_HIGH - [1:1] - read-only - - - GPIO0_LEVEL_LOW - [0:0] - read-only - - - - - - - SYSINFO - 0x40000000 - - 0x0 - 0x18 - registers - - - - CHIP_ID - JEDEC JEP-106 compliant chip identifier. - 0x0 - 0x00000001 - - - REVISION - [31:28] - read-only - - - PART - [27:12] - read-only - - - MANUFACTURER - [11:1] - read-only - - - STOP_BIT - [0:0] - read-only - - - - - PACKAGE_SEL - 0x4 - 0x00000000 - - - PACKAGE_SEL - [0:0] - read-only - - - - - PLATFORM - Platform register. Allows software to know what environment it is running in during pre-production development. Post-production, the PLATFORM is always ASIC, non-SIM. - 0x8 - 0x00000000 - - - GATESIM - [4:4] - read-only - - - BATCHSIM - [3:3] - read-only - - - HDLSIM - [2:2] - read-only - - - ASIC - [1:1] - read-only - - - FPGA - [0:0] - read-only - - - - - GITREF_RP2350 - Git hash of the chip source. Used to identify chip version. - 0x14 - 0x00000000 - - - GITREF_RP2350 - [31:0] - read-only - - - - - - - SHA256 - SHA-256 hash function implementation - 0x400F8000 - - 0x0 - 0x28 - registers - - - - CSR - Control and status register - 0x0 - 0x00001206 - - - BSWAP - Enable byte swapping of 32-bit values at the point they are committed to the SHA message scheduler. - - This block's bus interface assembles byte/halfword data into message words in little-endian order, so that DMAing the same buffer with different transfer sizes always gives the same result on a little-endian system like RP2350. - - However, when marshalling bytes into blocks, SHA expects that the first byte is the *most significant* in each message word. To resolve this, once the bus interface has accumulated 32 bits of data (either a word write, two halfword writes in little-endian order, or four byte writes in little-endian order) the final value can be byte-swapped before passing to the actual SHA core. - - This feature is enabled by default because using the SHA core to checksum byte buffers is expected to be more common than having preformatted SHA message words lying around. - [12:12] - read-write - - - DMA_SIZE - Configure DREQ logic for the correct DMA data size. Must be configured before the DMA channel is triggered. - - The SHA-256 core's DREQ logic requests one entire block of data at once, since there is no FIFO, and data goes straight into the core's message schedule and digest hardware. Therefore, when transferring data with DMA, CSR_DMA_SIZE must be configured in advance so that the correct number of transfers can be requested per block. - [9:8] - read-write - - - 8bit - 0 - - - 16bit - 1 - - - 32bit - 2 - - - - - ERR_WDATA_NOT_RDY - Set when a write occurs whilst the SHA-256 core is not ready for data (WDATA_RDY is low). Write one to clear. - [4:4] - read-write - oneToClear - - - SUM_VLD - If 1, the SHA-256 checksum presented in registers SUM0 through SUM7 is currently valid. - - Goes low when WDATA is first written, then returns high once 16 words have been written and the digest of the current 512-bit block has subsequently completed. - [2:2] - read-only - - - WDATA_RDY - If 1, the SHA-256 core is ready to accept more data through the WDATA register. - - After writing 16 words, this flag will go low for 57 cycles whilst the core completes its digest. - [1:1] - read-only - - - START - Write 1 to prepare the SHA-256 core for a new checksum. - - The SUMx registers are initialised to the proper values (fractional bits of square roots of first 8 primes) and internal counters are cleared. This immediately forces WDATA_RDY and SUM_VLD high. - - START must be written before initiating a DMA transfer to the SHA-256 core, because the core will always request 16 transfers at a time (1 512-bit block). Additionally, the DMA channel should be configured for a multiple of 16 32-bit transfers. - [0:0] - write-only - - - - - WDATA - Write data register - 0x4 - 0x00000000 - - - WDATA - After pulsing START and writing 16 words of data to this register, WDATA_RDY will go low and the SHA-256 core will complete the digest of the current 512-bit block. - - Software is responsible for ensuring the data is correctly padded and terminated to a whole number of 512-bit blocks. - - After this, WDATA_RDY will return high, and more data can be written (if any). - - This register supports word, halfword and byte writes, so that DMA from non-word-aligned buffers can be supported. The total amount of data per block remains the same (16 words, 32 halfwords or 64 bytes) and byte/halfword transfers must not be mixed within a block. - [31:0] - write-only - - - - - SUM0 - 256-bit checksum result. Contents are undefined when CSR_SUM_VLD is 0. - 0x8 - 0x00000000 - - - SUM0 - [31:0] - read-only - - - - - SUM1 - 256-bit checksum result. Contents are undefined when CSR_SUM_VLD is 0. - 0xC - 0x00000000 - - - SUM1 - [31:0] - read-only - - - - - SUM2 - 256-bit checksum result. Contents are undefined when CSR_SUM_VLD is 0. - 0x10 - 0x00000000 - - - SUM2 - [31:0] - read-only - - - - - SUM3 - 256-bit checksum result. Contents are undefined when CSR_SUM_VLD is 0. - 0x14 - 0x00000000 - - - SUM3 - [31:0] - read-only - - - - - SUM4 - 256-bit checksum result. Contents are undefined when CSR_SUM_VLD is 0. - 0x18 - 0x00000000 - - - SUM4 - [31:0] - read-only - - - - - SUM5 - 256-bit checksum result. Contents are undefined when CSR_SUM_VLD is 0. - 0x1C - 0x00000000 - - - SUM5 - [31:0] - read-only - - - - - SUM6 - 256-bit checksum result. Contents are undefined when CSR_SUM_VLD is 0. - 0x20 - 0x00000000 - - - SUM6 - [31:0] - read-only - - - - - SUM7 - 256-bit checksum result. Contents are undefined when CSR_SUM_VLD is 0. - 0x24 - 0x00000000 - - - SUM7 - [31:0] - read-only - - - - - - - HSTX_FIFO - FIFO status and write access for HSTX - 0x50600000 - - 0x0 - 0x8 - registers - - - - STAT - FIFO status - 0x0 - 0x00000000 - - - WOF - FIFO was written when full. Write 1 to clear. - [10:10] - read-write - oneToClear - - - EMPTY - [9:9] - read-only - - - FULL - [8:8] - read-only - - - LEVEL - [7:0] - read-only - - - - - FIFO - Write access to FIFO - 0x4 - 0x00000000 - - - FIFO - [31:0] - write-only - - - - - - - HSTX_CTRL - Control interface to HSTX. For FIFO write access and status, see the HSTX_FIFO register block. - 0x400C0000 - - 0x0 - 0x2C - registers - - - - CSR - 0x0 - 0x10050600 - - - CLKDIV - Clock period of the generated clock, measured in HSTX clock cycles. Can be odd or even. The generated clock advances only on cycles where the shift register shifts. - - For example, a clkdiv of 5 would generate a complete output clock period for every 5 HSTX clocks (or every 10 half-clocks). - - A CLKDIV value of 0 is mapped to a period of 16 HSTX clock cycles. - [31:28] - read-write - - - CLKPHASE - Set the initial phase of the generated clock. - - A CLKPHASE of 0 means the clock is initially low, and the first rising edge occurs after one half period of the generated clock (i.e. CLKDIV/2 cycles of clk_hstx). Incrementing CLKPHASE by 1 will advance the initial clock phase by one half clk_hstx period. For example, if CLKDIV=2 and CLKPHASE=1: - - * The clock will be initially low - - * The first rising edge will be 0.5 clk_hstx cycles after asserting first data - - * The first falling edge will be 1.5 clk_hstx cycles after asserting first data - - This configuration would be suitable for serialising at a bit rate of clk_hstx with a centre-aligned DDR clock. - - When the HSTX is halted by clearing CSR_EN, the clock generator will return to its initial phase as configured by the CLKPHASE field. - - Note CLKPHASE must be strictly less than double the value of CLKDIV (one full period), else its operation is undefined. - [27:24] - read-write - - - N_SHIFTS - Number of times to shift the shift register before refilling it from the FIFO. (A count of how many times it has been shifted, *not* the total shift distance.) - - A register value of 0 means shift 32 times. - [20:16] - read-write - - - SHIFT - How many bits to right-rotate the shift register by each cycle. - - The use of a rotate rather than a shift allows left shifts to be emulated, by subtracting the left-shift amount from 32. It also allows data to be repeated, when the product of SHIFT and N_SHIFTS is greater than 32. - [12:8] - read-write - - - COUPLED_SEL - Select which PIO to use for coupled mode operation. - [6:5] - read-write - - - COUPLED_MODE - Enable the PIO-to-HSTX 1:1 connection. The HSTX must be clocked *directly* from the system clock (not just from some other clock source of the same frequency) for this synchronous interface to function correctly. - - When COUPLED_MODE is set, BITx_SEL_P and SEL_N indices 24 through 31 will select bits from the 8-bit PIO-to-HSTX path, rather than shifter bits. Indices of 0 through 23 will still index the shift register as normal. - - The PIO outputs connected to the PIO-to-HSTX bus are those same outputs that would appear on the HSTX-capable pins if those pins' FUNCSELs were set to PIO instead of HSTX. - - For example, if HSTX is on GPIOs 12 through 19, then PIO outputs 12 through 19 are connected to the HSTX when coupled mode is engaged. - [4:4] - read-write - - - EXPAND_EN - Enable the command expander. When 0, raw FIFO data is passed directly to the output shift register. When 1, the command expander can perform simple operations such as run length decoding on data between the FIFO and the shift register. - - Do not change CXPD_EN whilst EN is set. It's safe to set CXPD_EN simultaneously with setting EN. - [1:1] - read-write - - - EN - When EN is 1, the HSTX will shift out data as it appears in the FIFO. As long as there is data, the HSTX shift register will shift once per clock cycle, and the frequency of popping from the FIFO is determined by the ratio of SHIFT and SHIFT_THRESH. - - When EN is 0, the FIFO is not popped. The shift counter and clock generator are also reset to their initial state for as long as EN is low. Note the initial phase of the clock generator can be configured by the CLKPHASE field. - - Once the HSTX is enabled again, and data is pushed to the FIFO, the generated clock's first rising edge will be one half-period after the first data is launched. - [0:0] - read-write - - - - - BIT0 - Data control register for output bit 0 - 0x4 - 0x00000000 - - - CLK - Connect this output to the generated clock, rather than the data shift register. SEL_P and SEL_N are ignored if this bit is set, but INV can still be set to generate an antiphase clock. - [17:17] - read-write - - - INV - Invert this data output (logical NOT) - [16:16] - read-write - - - SEL_N - Shift register data bit select for the second half of the HSTX clock cycle - [12:8] - read-write - - - SEL_P - Shift register data bit select for the first half of the HSTX clock cycle - [4:0] - read-write - - - - - BIT1 - Data control register for output bit 1 - 0x8 - 0x00000000 - - - CLK - Connect this output to the generated clock, rather than the data shift register. SEL_P and SEL_N are ignored if this bit is set, but INV can still be set to generate an antiphase clock. - [17:17] - read-write - - - INV - Invert this data output (logical NOT) - [16:16] - read-write - - - SEL_N - Shift register data bit select for the second half of the HSTX clock cycle - [12:8] - read-write - - - SEL_P - Shift register data bit select for the first half of the HSTX clock cycle - [4:0] - read-write - - - - - BIT2 - Data control register for output bit 2 - 0xC - 0x00000000 - - - CLK - Connect this output to the generated clock, rather than the data shift register. SEL_P and SEL_N are ignored if this bit is set, but INV can still be set to generate an antiphase clock. - [17:17] - read-write - - - INV - Invert this data output (logical NOT) - [16:16] - read-write - - - SEL_N - Shift register data bit select for the second half of the HSTX clock cycle - [12:8] - read-write - - - SEL_P - Shift register data bit select for the first half of the HSTX clock cycle - [4:0] - read-write - - - - - BIT3 - Data control register for output bit 3 - 0x10 - 0x00000000 - - - CLK - Connect this output to the generated clock, rather than the data shift register. SEL_P and SEL_N are ignored if this bit is set, but INV can still be set to generate an antiphase clock. - [17:17] - read-write - - - INV - Invert this data output (logical NOT) - [16:16] - read-write - - - SEL_N - Shift register data bit select for the second half of the HSTX clock cycle - [12:8] - read-write - - - SEL_P - Shift register data bit select for the first half of the HSTX clock cycle - [4:0] - read-write - - - - - BIT4 - Data control register for output bit 4 - 0x14 - 0x00000000 - - - CLK - Connect this output to the generated clock, rather than the data shift register. SEL_P and SEL_N are ignored if this bit is set, but INV can still be set to generate an antiphase clock. - [17:17] - read-write - - - INV - Invert this data output (logical NOT) - [16:16] - read-write - - - SEL_N - Shift register data bit select for the second half of the HSTX clock cycle - [12:8] - read-write - - - SEL_P - Shift register data bit select for the first half of the HSTX clock cycle - [4:0] - read-write - - - - - BIT5 - Data control register for output bit 5 - 0x18 - 0x00000000 - - - CLK - Connect this output to the generated clock, rather than the data shift register. SEL_P and SEL_N are ignored if this bit is set, but INV can still be set to generate an antiphase clock. - [17:17] - read-write - - - INV - Invert this data output (logical NOT) - [16:16] - read-write - - - SEL_N - Shift register data bit select for the second half of the HSTX clock cycle - [12:8] - read-write - - - SEL_P - Shift register data bit select for the first half of the HSTX clock cycle - [4:0] - read-write - - - - - BIT6 - Data control register for output bit 6 - 0x1C - 0x00000000 - - - CLK - Connect this output to the generated clock, rather than the data shift register. SEL_P and SEL_N are ignored if this bit is set, but INV can still be set to generate an antiphase clock. - [17:17] - read-write - - - INV - Invert this data output (logical NOT) - [16:16] - read-write - - - SEL_N - Shift register data bit select for the second half of the HSTX clock cycle - [12:8] - read-write - - - SEL_P - Shift register data bit select for the first half of the HSTX clock cycle - [4:0] - read-write - - - - - BIT7 - Data control register for output bit 7 - 0x20 - 0x00000000 - - - CLK - Connect this output to the generated clock, rather than the data shift register. SEL_P and SEL_N are ignored if this bit is set, but INV can still be set to generate an antiphase clock. - [17:17] - read-write - - - INV - Invert this data output (logical NOT) - [16:16] - read-write - - - SEL_N - Shift register data bit select for the second half of the HSTX clock cycle - [12:8] - read-write - - - SEL_P - Shift register data bit select for the first half of the HSTX clock cycle - [4:0] - read-write - - - - - EXPAND_SHIFT - Configure the optional shifter inside the command expander - 0x24 - 0x01000100 - - - ENC_N_SHIFTS - Number of times to consume from the shift register before refilling it from the FIFO, when the current command is an encoded data command (e.g. TMDS). A register value of 0 means shift 32 times. - [28:24] - read-write - - - ENC_SHIFT - How many bits to right-rotate the shift register by each time data is pushed to the output shifter, when the current command is an encoded data command (e.g. TMDS). - [20:16] - read-write - - - RAW_N_SHIFTS - Number of times to consume from the shift register before refilling it from the FIFO, when the current command is a raw data command. A register value of 0 means shift 32 times. - [12:8] - read-write - - - RAW_SHIFT - How many bits to right-rotate the shift register by each time data is pushed to the output shifter, when the current command is a raw data command. - [4:0] - read-write - - - - - EXPAND_TMDS - Configure the optional TMDS encoder inside the command expander - 0x28 - 0x00000000 - - - L2_NBITS - Number of valid data bits for the lane 2 TMDS encoder, starting from bit 7 of the rotated data. Field values of 0 -> 7 encode counts of 1 -> 8 bits. - [23:21] - read-write - - - L2_ROT - Right-rotate applied to the current shifter data before the lane 2 TMDS encoder. - [20:16] - read-write - - - L1_NBITS - Number of valid data bits for the lane 1 TMDS encoder, starting from bit 7 of the rotated data. Field values of 0 -> 7 encode counts of 1 -> 8 bits. - [15:13] - read-write - - - L1_ROT - Right-rotate applied to the current shifter data before the lane 1 TMDS encoder. - [12:8] - read-write - - - L0_NBITS - Number of valid data bits for the lane 0 TMDS encoder, starting from bit 7 of the rotated data. Field values of 0 -> 7 encode counts of 1 -> 8 bits. - [7:5] - read-write - - - L0_ROT - Right-rotate applied to the current shifter data before the lane 0 TMDS encoder. - [4:0] - read-write - - - - - - - EPPB - Cortex-M33 EPPB vendor register block for RP2350 - 0xE0080000 - - 0x0 - 0xC - registers - - - - NMI_MASK0 - NMI mask for IRQs 0 through 31. This register is core-local, and is reset by a processor warm reset. - 0x0 - 0x00000000 - - - NMI_MASK0 - [31:0] - read-write - - - - - NMI_MASK1 - NMI mask for IRQs 0 though 51. This register is core-local, and is reset by a processor warm reset. - 0x4 - 0x00000000 - - - NMI_MASK1 - [19:0] - read-write - - - - - SLEEPCTRL - Nonstandard sleep control register - 0x8 - 0x00000002 - - - WICENACK - Status signal from the processor's interrupt controller. Changes to WICENREQ are eventually reflected in WICENACK. - [2:2] - read-only - - - WICENREQ - Request that the next processor deep sleep is a WIC sleep. After setting this bit, before sleeping, poll WICENACK to ensure the processor interrupt controller has acknowledged the change. - [1:1] - read-write - - - LIGHT_SLEEP - By default, any processor sleep will deassert the system-level clock request. Reenabling the clocks incurs 5 cycles of additional latency on wakeup. - - Setting LIGHT_SLEEP to 1 keeps the clock request asserted during a normal sleep (Arm SCR.SLEEPDEEP = 0), for faster wakeup. Processor deep sleep (Arm SCR.SLEEPDEEP = 1) is not affected, and will always deassert the system-level clock request. - [0:0] - read-write - - - - - - - PPB - TEAL registers accessible through the debug interface - 0xE0000000 - - 0x0 - 0x43000 - registers - - - - ITM_STIM0 - Provides the interface for generating Instrumentation packets - 0x0 - 0x00000000 - - - STIMULUS - Data to write to the Stimulus Port FIFO, for forwarding as an Instrumentation packet. The size of write access determines the type of Instrumentation packet generated. - [31:0] - read-write - - - - - ITM_STIM1 - Provides the interface for generating Instrumentation packets - 0x4 - 0x00000000 - - - STIMULUS - Data to write to the Stimulus Port FIFO, for forwarding as an Instrumentation packet. The size of write access determines the type of Instrumentation packet generated. - [31:0] - read-write - - - - - ITM_STIM2 - Provides the interface for generating Instrumentation packets - 0x8 - 0x00000000 - - - STIMULUS - Data to write to the Stimulus Port FIFO, for forwarding as an Instrumentation packet. The size of write access determines the type of Instrumentation packet generated. - [31:0] - read-write - - - - - ITM_STIM3 - Provides the interface for generating Instrumentation packets - 0xC - 0x00000000 - - - STIMULUS - Data to write to the Stimulus Port FIFO, for forwarding as an Instrumentation packet. The size of write access determines the type of Instrumentation packet generated. - [31:0] - read-write - - - - - ITM_STIM4 - Provides the interface for generating Instrumentation packets - 0x10 - 0x00000000 - - - STIMULUS - Data to write to the Stimulus Port FIFO, for forwarding as an Instrumentation packet. The size of write access determines the type of Instrumentation packet generated. - [31:0] - read-write - - - - - ITM_STIM5 - Provides the interface for generating Instrumentation packets - 0x14 - 0x00000000 - - - STIMULUS - Data to write to the Stimulus Port FIFO, for forwarding as an Instrumentation packet. The size of write access determines the type of Instrumentation packet generated. - [31:0] - read-write - - - - - ITM_STIM6 - Provides the interface for generating Instrumentation packets - 0x18 - 0x00000000 - - - STIMULUS - Data to write to the Stimulus Port FIFO, for forwarding as an Instrumentation packet. The size of write access determines the type of Instrumentation packet generated. - [31:0] - read-write - - - - - ITM_STIM7 - Provides the interface for generating Instrumentation packets - 0x1C - 0x00000000 - - - STIMULUS - Data to write to the Stimulus Port FIFO, for forwarding as an Instrumentation packet. The size of write access determines the type of Instrumentation packet generated. - [31:0] - read-write - - - - - ITM_STIM8 - Provides the interface for generating Instrumentation packets - 0x20 - 0x00000000 - - - STIMULUS - Data to write to the Stimulus Port FIFO, for forwarding as an Instrumentation packet. The size of write access determines the type of Instrumentation packet generated. - [31:0] - read-write - - - - - ITM_STIM9 - Provides the interface for generating Instrumentation packets - 0x24 - 0x00000000 - - - STIMULUS - Data to write to the Stimulus Port FIFO, for forwarding as an Instrumentation packet. The size of write access determines the type of Instrumentation packet generated. - [31:0] - read-write - - - - - ITM_STIM10 - Provides the interface for generating Instrumentation packets - 0x28 - 0x00000000 - - - STIMULUS - Data to write to the Stimulus Port FIFO, for forwarding as an Instrumentation packet. The size of write access determines the type of Instrumentation packet generated. - [31:0] - read-write - - - - - ITM_STIM11 - Provides the interface for generating Instrumentation packets - 0x2C - 0x00000000 - - - STIMULUS - Data to write to the Stimulus Port FIFO, for forwarding as an Instrumentation packet. The size of write access determines the type of Instrumentation packet generated. - [31:0] - read-write - - - - - ITM_STIM12 - Provides the interface for generating Instrumentation packets - 0x30 - 0x00000000 - - - STIMULUS - Data to write to the Stimulus Port FIFO, for forwarding as an Instrumentation packet. The size of write access determines the type of Instrumentation packet generated. - [31:0] - read-write - - - - - ITM_STIM13 - Provides the interface for generating Instrumentation packets - 0x34 - 0x00000000 - - - STIMULUS - Data to write to the Stimulus Port FIFO, for forwarding as an Instrumentation packet. The size of write access determines the type of Instrumentation packet generated. - [31:0] - read-write - - - - - ITM_STIM14 - Provides the interface for generating Instrumentation packets - 0x38 - 0x00000000 - - - STIMULUS - Data to write to the Stimulus Port FIFO, for forwarding as an Instrumentation packet. The size of write access determines the type of Instrumentation packet generated. - [31:0] - read-write - - - - - ITM_STIM15 - Provides the interface for generating Instrumentation packets - 0x3C - 0x00000000 - - - STIMULUS - Data to write to the Stimulus Port FIFO, for forwarding as an Instrumentation packet. The size of write access determines the type of Instrumentation packet generated. - [31:0] - read-write - - - - - ITM_STIM16 - Provides the interface for generating Instrumentation packets - 0x40 - 0x00000000 - - - STIMULUS - Data to write to the Stimulus Port FIFO, for forwarding as an Instrumentation packet. The size of write access determines the type of Instrumentation packet generated. - [31:0] - read-write - - - - - ITM_STIM17 - Provides the interface for generating Instrumentation packets - 0x44 - 0x00000000 - - - STIMULUS - Data to write to the Stimulus Port FIFO, for forwarding as an Instrumentation packet. The size of write access determines the type of Instrumentation packet generated. - [31:0] - read-write - - - - - ITM_STIM18 - Provides the interface for generating Instrumentation packets - 0x48 - 0x00000000 - - - STIMULUS - Data to write to the Stimulus Port FIFO, for forwarding as an Instrumentation packet. The size of write access determines the type of Instrumentation packet generated. - [31:0] - read-write - - - - - ITM_STIM19 - Provides the interface for generating Instrumentation packets - 0x4C - 0x00000000 - - - STIMULUS - Data to write to the Stimulus Port FIFO, for forwarding as an Instrumentation packet. The size of write access determines the type of Instrumentation packet generated. - [31:0] - read-write - - - - - ITM_STIM20 - Provides the interface for generating Instrumentation packets - 0x50 - 0x00000000 - - - STIMULUS - Data to write to the Stimulus Port FIFO, for forwarding as an Instrumentation packet. The size of write access determines the type of Instrumentation packet generated. - [31:0] - read-write - - - - - ITM_STIM21 - Provides the interface for generating Instrumentation packets - 0x54 - 0x00000000 - - - STIMULUS - Data to write to the Stimulus Port FIFO, for forwarding as an Instrumentation packet. The size of write access determines the type of Instrumentation packet generated. - [31:0] - read-write - - - - - ITM_STIM22 - Provides the interface for generating Instrumentation packets - 0x58 - 0x00000000 - - - STIMULUS - Data to write to the Stimulus Port FIFO, for forwarding as an Instrumentation packet. The size of write access determines the type of Instrumentation packet generated. - [31:0] - read-write - - - - - ITM_STIM23 - Provides the interface for generating Instrumentation packets - 0x5C - 0x00000000 - - - STIMULUS - Data to write to the Stimulus Port FIFO, for forwarding as an Instrumentation packet. The size of write access determines the type of Instrumentation packet generated. - [31:0] - read-write - - - - - ITM_STIM24 - Provides the interface for generating Instrumentation packets - 0x60 - 0x00000000 - - - STIMULUS - Data to write to the Stimulus Port FIFO, for forwarding as an Instrumentation packet. The size of write access determines the type of Instrumentation packet generated. - [31:0] - read-write - - - - - ITM_STIM25 - Provides the interface for generating Instrumentation packets - 0x64 - 0x00000000 - - - STIMULUS - Data to write to the Stimulus Port FIFO, for forwarding as an Instrumentation packet. The size of write access determines the type of Instrumentation packet generated. - [31:0] - read-write - - - - - ITM_STIM26 - Provides the interface for generating Instrumentation packets - 0x68 - 0x00000000 - - - STIMULUS - Data to write to the Stimulus Port FIFO, for forwarding as an Instrumentation packet. The size of write access determines the type of Instrumentation packet generated. - [31:0] - read-write - - - - - ITM_STIM27 - Provides the interface for generating Instrumentation packets - 0x6C - 0x00000000 - - - STIMULUS - Data to write to the Stimulus Port FIFO, for forwarding as an Instrumentation packet. The size of write access determines the type of Instrumentation packet generated. - [31:0] - read-write - - - - - ITM_STIM28 - Provides the interface for generating Instrumentation packets - 0x70 - 0x00000000 - - - STIMULUS - Data to write to the Stimulus Port FIFO, for forwarding as an Instrumentation packet. The size of write access determines the type of Instrumentation packet generated. - [31:0] - read-write - - - - - ITM_STIM29 - Provides the interface for generating Instrumentation packets - 0x74 - 0x00000000 - - - STIMULUS - Data to write to the Stimulus Port FIFO, for forwarding as an Instrumentation packet. The size of write access determines the type of Instrumentation packet generated. - [31:0] - read-write - - - - - ITM_STIM30 - Provides the interface for generating Instrumentation packets - 0x78 - 0x00000000 - - - STIMULUS - Data to write to the Stimulus Port FIFO, for forwarding as an Instrumentation packet. The size of write access determines the type of Instrumentation packet generated. - [31:0] - read-write - - - - - ITM_STIM31 - Provides the interface for generating Instrumentation packets - 0x7C - 0x00000000 - - - STIMULUS - Data to write to the Stimulus Port FIFO, for forwarding as an Instrumentation packet. The size of write access determines the type of Instrumentation packet generated. - [31:0] - read-write - - - - - ITM_TER0 - Provide an individual enable bit for each ITM_STIM register - 0xE00 - 0x00000000 - - - STIMENA - For STIMENA[m] in ITM_TER*n, controls whether ITM_STIM(32*n + m) is enabled - [31:0] - read-write - - - - - ITM_TPR - Controls which stimulus ports can be accessed by unprivileged code - 0xE40 - 0x00000000 - - - PRIVMASK - Bit mask to enable tracing on ITM stimulus ports - [3:0] - read-write - - - - - ITM_TCR - Configures and controls transfers through the ITM interface - 0xE80 - 0x00000000 - - - BUSY - Indicates whether the ITM is currently processing events - [23:23] - read-only - - - TRACEBUSID - Identifier for multi-source trace stream formatting. If multi-source trace is in use, the debugger must write a unique non-zero trace ID value to this field - [22:16] - read-write - - - GTSFREQ - Defines how often the ITM generates a global timestamp, based on the global timestamp clock frequency, or disables generation of global timestamps - [11:10] - read-write - - - TSPRESCALE - Local timestamp prescaler, used with the trace packet reference clock - [9:8] - read-write - - - STALLENA - Stall the PE to guarantee delivery of Data Trace packets. - [5:5] - read-write - - - SWOENA - Enables asynchronous clocking of the timestamp counter - [4:4] - read-write - - - TXENA - Enables forwarding of hardware event packet from the DWT unit to the ITM for output to the TPIU - [3:3] - read-write - - - SYNCENA - Enables Synchronization packet transmission for a synchronous TPIU - [2:2] - read-write - - - TSENA - Enables Local timestamp generation - [1:1] - read-write - - - ITMENA - Enables the ITM - [0:0] - read-write - - - - - INT_ATREADY - Integration Mode: Read ATB Ready - 0xEF0 - 0x00000000 - - - AFVALID - A read of this bit returns the value of AFVALID - [1:1] - read-only - - - ATREADY - A read of this bit returns the value of ATREADY - [0:0] - read-only - - - - - INT_ATVALID - Integration Mode: Write ATB Valid - 0xEF8 - 0x00000000 - - - AFREADY - A write to this bit gives the value of AFREADY - [1:1] - read-write - - - ATREADY - A write to this bit gives the value of ATVALID - [0:0] - read-write - - - - - ITM_ITCTRL - Integration Mode Control Register - 0xF00 - 0x00000000 - - - IME - Integration mode enable bit - The possible values are: 0 - The trace unit is not in integration mode. 1 - The trace unit is in integration mode. This mode enables: A debug agent to perform topology detection. SoC test software to perform integration testing. - [0:0] - read-write - - - - - ITM_DEVARCH - Provides CoreSight discovery information for the ITM - 0xFBC - 0x47701A01 - - - ARCHITECT - Defines the architect of the component. Bits [31:28] are the JEP106 continuation code (JEP106 bank ID, minus 1) and bits [27:21] are the JEP106 ID code. - [31:21] - read-only - - - PRESENT - Defines that the DEVARCH register is present - [20:20] - read-only - - - REVISION - Defines the architecture revision of the component - [19:16] - read-only - - - ARCHVER - Defines the architecture version of the component - [15:12] - read-only - - - ARCHPART - Defines the architecture of the component - [11:0] - read-only - - - - - ITM_DEVTYPE - Provides CoreSight discovery information for the ITM - 0xFCC - 0x00000043 - - - SUB - Component sub-type - [7:4] - read-only - - - MAJOR - Component major type - [3:0] - read-only - - - - - ITM_PIDR4 - Provides CoreSight discovery information for the ITM - 0xFD0 - 0x00000004 - - - SIZE - See CoreSight Architecture Specification - [7:4] - read-only - - - DES_2 - See CoreSight Architecture Specification - [3:0] - read-only - - - - - ITM_PIDR5 - Provides CoreSight discovery information for the ITM - 0xFD4 - 0x00000000 - - - ITM_PIDR5 - [31:0] - read-write - - - - - ITM_PIDR6 - Provides CoreSight discovery information for the ITM - 0xFD8 - 0x00000000 - - - ITM_PIDR6 - [31:0] - read-write - - - - - ITM_PIDR7 - Provides CoreSight discovery information for the ITM - 0xFDC - 0x00000000 - - - ITM_PIDR7 - [31:0] - read-write - - - - - ITM_PIDR0 - Provides CoreSight discovery information for the ITM - 0xFE0 - 0x00000021 - - - PART_0 - See CoreSight Architecture Specification - [7:0] - read-only - - - - - ITM_PIDR1 - Provides CoreSight discovery information for the ITM - 0xFE4 - 0x000000BD - - - DES_0 - See CoreSight Architecture Specification - [7:4] - read-only - - - PART_1 - See CoreSight Architecture Specification - [3:0] - read-only - - - - - ITM_PIDR2 - Provides CoreSight discovery information for the ITM - 0xFE8 - 0x0000000B - - - REVISION - See CoreSight Architecture Specification - [7:4] - read-only - - - JEDEC - See CoreSight Architecture Specification - [3:3] - read-only - - - DES_1 - See CoreSight Architecture Specification - [2:0] - read-only - - - - - ITM_PIDR3 - Provides CoreSight discovery information for the ITM - 0xFEC - 0x00000000 - - - REVAND - See CoreSight Architecture Specification - [7:4] - read-only - - - CMOD - See CoreSight Architecture Specification - [3:0] - read-only - - - - - ITM_CIDR0 - Provides CoreSight discovery information for the ITM - 0xFF0 - 0x0000000D - - - PRMBL_0 - See CoreSight Architecture Specification - [7:0] - read-only - - - - - ITM_CIDR1 - Provides CoreSight discovery information for the ITM - 0xFF4 - 0x00000090 - - - CLASS - See CoreSight Architecture Specification - [7:4] - read-only - - - PRMBL_1 - See CoreSight Architecture Specification - [3:0] - read-only - - - - - ITM_CIDR2 - Provides CoreSight discovery information for the ITM - 0xFF8 - 0x00000005 - - - PRMBL_2 - See CoreSight Architecture Specification - [7:0] - read-only - - - - - ITM_CIDR3 - Provides CoreSight discovery information for the ITM - 0xFFC - 0x000000B1 - - - PRMBL_3 - See CoreSight Architecture Specification - [7:0] - read-only - - - - - DWT_CTRL - Provides configuration and status information for the DWT unit, and used to control features of the unit - 0x1000 - 0x73741824 - - - NUMCOMP - Number of DWT comparators implemented - [31:28] - read-only - - - NOTRCPKT - Indicates whether the implementation does not support trace - [27:27] - read-only - - - NOEXTTRIG - Reserved, RAZ - [26:26] - read-only - - - NOCYCCNT - Indicates whether the implementation does not include a cycle counter - [25:25] - read-only - - - NOPRFCNT - Indicates whether the implementation does not include the profiling counters - [24:24] - read-only - - - CYCDISS - Controls whether the cycle counter is disabled in Secure state - [23:23] - read-write - - - CYCEVTENA - Enables Event Counter packet generation on POSTCNT underflow - [22:22] - read-write - - - FOLDEVTENA - Enables DWT_FOLDCNT counter - [21:21] - read-write - - - LSUEVTENA - Enables DWT_LSUCNT counter - [20:20] - read-write - - - SLEEPEVTENA - Enable DWT_SLEEPCNT counter - [19:19] - read-write - - - EXCEVTENA - Enables DWT_EXCCNT counter - [18:18] - read-write - - - CPIEVTENA - Enables DWT_CPICNT counter - [17:17] - read-write - - - EXTTRCENA - Enables generation of Exception Trace packets - [16:16] - read-write - - - PCSAMPLENA - Enables use of POSTCNT counter as a timer for Periodic PC Sample packet generation - [12:12] - read-write - - - SYNCTAP - Selects the position of the synchronization packet counter tap on the CYCCNT counter. This determines the Synchronization packet rate - [11:10] - read-write - - - CYCTAP - Selects the position of the POSTCNT tap on the CYCCNT counter - [9:9] - read-write - - - POSTINIT - Initial value for the POSTCNT counter - [8:5] - read-write - - - POSTPRESET - Reload value for the POSTCNT counter - [4:1] - read-write - - - CYCCNTENA - Enables CYCCNT - [0:0] - read-write - - - - - DWT_CYCCNT - Shows or sets the value of the processor cycle counter, CYCCNT - 0x1004 - 0x00000000 - - - CYCCNT - Increments one on each processor clock cycle when DWT_CTRL.CYCCNTENA == 1 and DEMCR.TRCENA == 1. On overflow, CYCCNT wraps to zero - [31:0] - read-write - - - - - DWT_EXCCNT - Counts the total cycles spent in exception processing - 0x100C - 0x00000000 - - - EXCCNT - Counts one on each cycle when all of the following are true: - DWT_CTRL.EXCEVTENA == 1 and DEMCR.TRCENA == 1. - No instruction is executed, see DWT_CPICNT. - An exception-entry or exception-exit related operation is in progress. - Either SecureNoninvasiveDebugAllowed() == TRUE, or NS-Req for the operation is set to Non-secure and NoninvasiveDebugAllowed() == TRUE. - [7:0] - read-write - - - - - DWT_LSUCNT - Increments on the additional cycles required to execute all load or store instructions - 0x1014 - 0x00000000 - - - LSUCNT - Counts one on each cycle when all of the following are true: - DWT_CTRL.LSUEVTENA == 1 and DEMCR.TRCENA == 1. - No instruction is executed, see DWT_CPICNT. - No exception-entry or exception-exit operation is in progress, see DWT_EXCCNT. - A load-store operation is in progress. - Either SecureNoninvasiveDebugAllowed() == TRUE, or NS-Req for the operation is set to Non-secure and NoninvasiveDebugAllowed() == TRUE. - [7:0] - read-write - - - - - DWT_FOLDCNT - Increments on the additional cycles required to execute all load or store instructions - 0x1018 - 0x00000000 - - - FOLDCNT - Counts on each cycle when all of the following are true: - DWT_CTRL.FOLDEVTENA == 1 and DEMCR.TRCENA == 1. - At least two instructions are executed, see DWT_CPICNT. - Either SecureNoninvasiveDebugAllowed() == TRUE, or the PE is in Non-secure state and NoninvasiveDebugAllowed() == TRUE. The counter is incremented by the number of instructions executed, minus one - [7:0] - read-write - - - - - DWT_COMP0 - Provides a reference value for use by watchpoint comparator 0 - 0x1020 - 0x00000000 - - - DWT_COMP0 - [31:0] - read-write - - - - - DWT_FUNCTION0 - Controls the operation of watchpoint comparator 0 - 0x1028 - 0x58000000 - - - ID - Identifies the capabilities for MATCH for comparator *n - [31:27] - read-only - - - MATCHED - Set to 1 when the comparator matches - [24:24] - read-only - - - DATAVSIZE - Defines the size of the object being watched for by Data Value and Data Address comparators - [11:10] - read-write - - - ACTION - Defines the action on a match. This field is ignored and the comparator generates no actions if it is disabled by MATCH - [5:4] - read-write - - - MATCH - Controls the type of match generated by this comparator - [3:0] - read-write - - - - - DWT_COMP1 - Provides a reference value for use by watchpoint comparator 1 - 0x1030 - 0x00000000 - - - DWT_COMP1 - [31:0] - read-write - - - - - DWT_FUNCTION1 - Controls the operation of watchpoint comparator 1 - 0x1038 - 0x89000828 - - - ID - Identifies the capabilities for MATCH for comparator *n - [31:27] - read-only - - - MATCHED - Set to 1 when the comparator matches - [24:24] - read-only - - - DATAVSIZE - Defines the size of the object being watched for by Data Value and Data Address comparators - [11:10] - read-write - - - ACTION - Defines the action on a match. This field is ignored and the comparator generates no actions if it is disabled by MATCH - [5:4] - read-write - - - MATCH - Controls the type of match generated by this comparator - [3:0] - read-write - - - - - DWT_COMP2 - Provides a reference value for use by watchpoint comparator 2 - 0x1040 - 0x00000000 - - - DWT_COMP2 - [31:0] - read-write - - - - - DWT_FUNCTION2 - Controls the operation of watchpoint comparator 2 - 0x1048 - 0x50000000 - - - ID - Identifies the capabilities for MATCH for comparator *n - [31:27] - read-only - - - MATCHED - Set to 1 when the comparator matches - [24:24] - read-only - - - DATAVSIZE - Defines the size of the object being watched for by Data Value and Data Address comparators - [11:10] - read-write - - - ACTION - Defines the action on a match. This field is ignored and the comparator generates no actions if it is disabled by MATCH - [5:4] - read-write - - - MATCH - Controls the type of match generated by this comparator - [3:0] - read-write - - - - - DWT_COMP3 - Provides a reference value for use by watchpoint comparator 3 - 0x1050 - 0x00000000 - - - DWT_COMP3 - [31:0] - read-write - - - - - DWT_FUNCTION3 - Controls the operation of watchpoint comparator 3 - 0x1058 - 0x20000800 - - - ID - Identifies the capabilities for MATCH for comparator *n - [31:27] - read-only - - - MATCHED - Set to 1 when the comparator matches - [24:24] - read-only - - - DATAVSIZE - Defines the size of the object being watched for by Data Value and Data Address comparators - [11:10] - read-write - - - ACTION - Defines the action on a match. This field is ignored and the comparator generates no actions if it is disabled by MATCH - [5:4] - read-write - - - MATCH - Controls the type of match generated by this comparator - [3:0] - read-write - - - - - DWT_DEVARCH - Provides CoreSight discovery information for the DWT - 0x1FBC - 0x47701A02 - - - ARCHITECT - Defines the architect of the component. Bits [31:28] are the JEP106 continuation code (JEP106 bank ID, minus 1) and bits [27:21] are the JEP106 ID code. - [31:21] - read-only - - - PRESENT - Defines that the DEVARCH register is present - [20:20] - read-only - - - REVISION - Defines the architecture revision of the component - [19:16] - read-only - - - ARCHVER - Defines the architecture version of the component - [15:12] - read-only - - - ARCHPART - Defines the architecture of the component - [11:0] - read-only - - - - - DWT_DEVTYPE - Provides CoreSight discovery information for the DWT - 0x1FCC - 0x00000000 - - - SUB - Component sub-type - [7:4] - read-only - - - MAJOR - Component major type - [3:0] - read-only - - - - - DWT_PIDR4 - Provides CoreSight discovery information for the DWT - 0x1FD0 - 0x00000004 - - - SIZE - See CoreSight Architecture Specification - [7:4] - read-only - - - DES_2 - See CoreSight Architecture Specification - [3:0] - read-only - - - - - DWT_PIDR5 - Provides CoreSight discovery information for the DWT - 0x1FD4 - 0x00000000 - - - DWT_PIDR5 - [31:0] - read-write - - - - - DWT_PIDR6 - Provides CoreSight discovery information for the DWT - 0x1FD8 - 0x00000000 - - - DWT_PIDR6 - [31:0] - read-write - - - - - DWT_PIDR7 - Provides CoreSight discovery information for the DWT - 0x1FDC - 0x00000000 - - - DWT_PIDR7 - [31:0] - read-write - - - - - DWT_PIDR0 - Provides CoreSight discovery information for the DWT - 0x1FE0 - 0x00000021 - - - PART_0 - See CoreSight Architecture Specification - [7:0] - read-only - - - - - DWT_PIDR1 - Provides CoreSight discovery information for the DWT - 0x1FE4 - 0x000000BD - - - DES_0 - See CoreSight Architecture Specification - [7:4] - read-only - - - PART_1 - See CoreSight Architecture Specification - [3:0] - read-only - - - - - DWT_PIDR2 - Provides CoreSight discovery information for the DWT - 0x1FE8 - 0x0000000B - - - REVISION - See CoreSight Architecture Specification - [7:4] - read-only - - - JEDEC - See CoreSight Architecture Specification - [3:3] - read-only - - - DES_1 - See CoreSight Architecture Specification - [2:0] - read-only - - - - - DWT_PIDR3 - Provides CoreSight discovery information for the DWT - 0x1FEC - 0x00000000 - - - REVAND - See CoreSight Architecture Specification - [7:4] - read-only - - - CMOD - See CoreSight Architecture Specification - [3:0] - read-only - - - - - DWT_CIDR0 - Provides CoreSight discovery information for the DWT - 0x1FF0 - 0x0000000D - - - PRMBL_0 - See CoreSight Architecture Specification - [7:0] - read-only - - - - - DWT_CIDR1 - Provides CoreSight discovery information for the DWT - 0x1FF4 - 0x00000090 - - - CLASS - See CoreSight Architecture Specification - [7:4] - read-only - - - PRMBL_1 - See CoreSight Architecture Specification - [3:0] - read-only - - - - - DWT_CIDR2 - Provides CoreSight discovery information for the DWT - 0x1FF8 - 0x00000005 - - - PRMBL_2 - See CoreSight Architecture Specification - [7:0] - read-only - - - - - DWT_CIDR3 - Provides CoreSight discovery information for the DWT - 0x1FFC - 0x000000B1 - - - PRMBL_3 - See CoreSight Architecture Specification - [7:0] - read-only - - - - - FP_CTRL - Provides FPB implementation information, and the global enable for the FPB unit - 0x2000 - 0x60005580 - - - REV - Flash Patch and Breakpoint Unit architecture revision - [31:28] - read-only - - - NUM_CODE_14_12_ - Indicates the number of implemented instruction address comparators. Zero indicates no Instruction Address comparators are implemented. The Instruction Address comparators are numbered from 0 to NUM_CODE - 1 - [14:12] - read-only - - - NUM_LIT - Indicates the number of implemented literal address comparators. The Literal Address comparators are numbered from NUM_CODE to NUM_CODE + NUM_LIT - 1 - [11:8] - read-only - - - NUM_CODE_7_4_ - Indicates the number of implemented instruction address comparators. Zero indicates no Instruction Address comparators are implemented. The Instruction Address comparators are numbered from 0 to NUM_CODE - 1 - [7:4] - read-only - - - KEY - Writes to the FP_CTRL are ignored unless KEY is concurrently written to one - [1:1] - read-write - - - ENABLE - Enables the FPB - [0:0] - read-write - - - - - FP_REMAP - Indicates whether the implementation supports Flash Patch remap and, if it does, holds the target address for remap - 0x2004 - 0x00000000 - - - RMPSPT - Indicates whether the FPB unit supports the Flash Patch remap function - [29:29] - read-only - - - REMAP - Holds the bits[28:5] of the Flash Patch remap address - [28:5] - read-only - - - - - FP_COMP0 - Holds an address for comparison. The effect of the match depends on the configuration of the FPB and whether the comparator is an instruction address comparator or a literal address comparator - 0x2008 - 0x00000000 - - - BE - Selects between flashpatch and breakpoint functionality - [0:0] - read-write - - - - - FP_COMP1 - Holds an address for comparison. The effect of the match depends on the configuration of the FPB and whether the comparator is an instruction address comparator or a literal address comparator - 0x200C - 0x00000000 - - - BE - Selects between flashpatch and breakpoint functionality - [0:0] - read-write - - - - - FP_COMP2 - Holds an address for comparison. The effect of the match depends on the configuration of the FPB and whether the comparator is an instruction address comparator or a literal address comparator - 0x2010 - 0x00000000 - - - BE - Selects between flashpatch and breakpoint functionality - [0:0] - read-write - - - - - FP_COMP3 - Holds an address for comparison. The effect of the match depends on the configuration of the FPB and whether the comparator is an instruction address comparator or a literal address comparator - 0x2014 - 0x00000000 - - - BE - Selects between flashpatch and breakpoint functionality - [0:0] - read-write - - - - - FP_COMP4 - Holds an address for comparison. The effect of the match depends on the configuration of the FPB and whether the comparator is an instruction address comparator or a literal address comparator - 0x2018 - 0x00000000 - - - BE - Selects between flashpatch and breakpoint functionality - [0:0] - read-write - - - - - FP_COMP5 - Holds an address for comparison. The effect of the match depends on the configuration of the FPB and whether the comparator is an instruction address comparator or a literal address comparator - 0x201C - 0x00000000 - - - BE - Selects between flashpatch and breakpoint functionality - [0:0] - read-write - - - - - FP_COMP6 - Holds an address for comparison. The effect of the match depends on the configuration of the FPB and whether the comparator is an instruction address comparator or a literal address comparator - 0x2020 - 0x00000000 - - - BE - Selects between flashpatch and breakpoint functionality - [0:0] - read-write - - - - - FP_COMP7 - Holds an address for comparison. The effect of the match depends on the configuration of the FPB and whether the comparator is an instruction address comparator or a literal address comparator - 0x2024 - 0x00000000 - - - BE - Selects between flashpatch and breakpoint functionality - [0:0] - read-write - - - - - FP_DEVARCH - Provides CoreSight discovery information for the FPB - 0x2FBC - 0x47701A03 - - - ARCHITECT - Defines the architect of the component. Bits [31:28] are the JEP106 continuation code (JEP106 bank ID, minus 1) and bits [27:21] are the JEP106 ID code. - [31:21] - read-only - - - PRESENT - Defines that the DEVARCH register is present - [20:20] - read-only - - - REVISION - Defines the architecture revision of the component - [19:16] - read-only - - - ARCHVER - Defines the architecture version of the component - [15:12] - read-only - - - ARCHPART - Defines the architecture of the component - [11:0] - read-only - - - - - FP_DEVTYPE - Provides CoreSight discovery information for the FPB - 0x2FCC - 0x00000000 - - - SUB - Component sub-type - [7:4] - read-only - - - MAJOR - Component major type - [3:0] - read-only - - - - - FP_PIDR4 - Provides CoreSight discovery information for the FP - 0x2FD0 - 0x00000004 - - - SIZE - See CoreSight Architecture Specification - [7:4] - read-only - - - DES_2 - See CoreSight Architecture Specification - [3:0] - read-only - - - - - FP_PIDR5 - Provides CoreSight discovery information for the FP - 0x2FD4 - 0x00000000 - - - FP_PIDR5 - [31:0] - read-write - - - - - FP_PIDR6 - Provides CoreSight discovery information for the FP - 0x2FD8 - 0x00000000 - - - FP_PIDR6 - [31:0] - read-write - - - - - FP_PIDR7 - Provides CoreSight discovery information for the FP - 0x2FDC - 0x00000000 - - - FP_PIDR7 - [31:0] - read-write - - - - - FP_PIDR0 - Provides CoreSight discovery information for the FP - 0x2FE0 - 0x00000021 - - - PART_0 - See CoreSight Architecture Specification - [7:0] - read-only - - - - - FP_PIDR1 - Provides CoreSight discovery information for the FP - 0x2FE4 - 0x000000BD - - - DES_0 - See CoreSight Architecture Specification - [7:4] - read-only - - - PART_1 - See CoreSight Architecture Specification - [3:0] - read-only - - - - - FP_PIDR2 - Provides CoreSight discovery information for the FP - 0x2FE8 - 0x0000000B - - - REVISION - See CoreSight Architecture Specification - [7:4] - read-only - - - JEDEC - See CoreSight Architecture Specification - [3:3] - read-only - - - DES_1 - See CoreSight Architecture Specification - [2:0] - read-only - - - - - FP_PIDR3 - Provides CoreSight discovery information for the FP - 0x2FEC - 0x00000000 - - - REVAND - See CoreSight Architecture Specification - [7:4] - read-only - - - CMOD - See CoreSight Architecture Specification - [3:0] - read-only - - - - - FP_CIDR0 - Provides CoreSight discovery information for the FP - 0x2FF0 - 0x0000000D - - - PRMBL_0 - See CoreSight Architecture Specification - [7:0] - read-only - - - - - FP_CIDR1 - Provides CoreSight discovery information for the FP - 0x2FF4 - 0x00000090 - - - CLASS - See CoreSight Architecture Specification - [7:4] - read-only - - - PRMBL_1 - See CoreSight Architecture Specification - [3:0] - read-only - - - - - FP_CIDR2 - Provides CoreSight discovery information for the FP - 0x2FF8 - 0x00000005 - - - PRMBL_2 - See CoreSight Architecture Specification - [7:0] - read-only - - - - - FP_CIDR3 - Provides CoreSight discovery information for the FP - 0x2FFC - 0x000000B1 - - - PRMBL_3 - See CoreSight Architecture Specification - [7:0] - read-only - - - - - ICTR - Provides information about the interrupt controller - 0xE004 - 0x00000001 - - - INTLINESNUM - Indicates the number of the highest implemented register in each of the NVIC control register sets, or in the case of NVIC_IPR*n, 4×INTLINESNUM - [3:0] - read-only - - - - - ACTLR - Provides IMPLEMENTATION DEFINED configuration and control options - 0xE008 - 0x00000000 - - - EXTEXCLALL - External Exclusives Allowed with no MPU - [29:29] - read-write - - - DISITMATBFLUSH - Disable ATB Flush - [12:12] - read-write - - - FPEXCODIS - Disable FPU exception outputs - [10:10] - read-write - - - DISOOFP - Disable out-of-order FP instruction completion - [9:9] - read-write - - - DISFOLD - Disable dual-issue. - [2:2] - read-write - - - DISMCYCINT - Disable dual-issue. - [0:0] - read-write - - - - - SYST_CSR - Use the SysTick Control and Status Register to enable the SysTick features. - 0xE010 - 0x00000000 - - - COUNTFLAG - Returns 1 if timer counted to 0 since last time this was read. Clears on read by application or debugger. - [16:16] - read-only - - - CLKSOURCE - SysTick clock source. Always reads as one if SYST_CALIB reports NOREF. - Selects the SysTick timer clock source: - 0 = External reference clock. - 1 = Processor clock. - [2:2] - read-write - - - TICKINT - Enables SysTick exception request: - 0 = Counting down to zero does not assert the SysTick exception request. - 1 = Counting down to zero to asserts the SysTick exception request. - [1:1] - read-write - - - ENABLE - Enable SysTick counter: - 0 = Counter disabled. - 1 = Counter enabled. - [0:0] - read-write - - - - - SYST_RVR - Use the SysTick Reload Value Register to specify the start value to load into the current value register when the counter reaches 0. It can be any value between 0 and 0x00FFFFFF. A start value of 0 is possible, but has no effect because the SysTick interrupt and COUNTFLAG are activated when counting from 1 to 0. The reset value of this register is UNKNOWN. - To generate a multi-shot timer with a period of N processor clock cycles, use a RELOAD value of N-1. For example, if the SysTick interrupt is required every 100 clock pulses, set RELOAD to 99. - 0xE014 - 0x00000000 - - - RELOAD - Value to load into the SysTick Current Value Register when the counter reaches 0. - [23:0] - read-write - - - - - SYST_CVR - Use the SysTick Current Value Register to find the current value in the register. The reset value of this register is UNKNOWN. - 0xE018 - 0x00000000 - - - CURRENT - Reads return the current value of the SysTick counter. This register is write-clear. Writing to it with any value clears the register to 0. Clearing this register also clears the COUNTFLAG bit of the SysTick Control and Status Register. - [23:0] - read-write - - - - - SYST_CALIB - Use the SysTick Calibration Value Register to enable software to scale to any required speed using divide and multiply. - 0xE01C - 0x00000000 - - - NOREF - If reads as 1, the Reference clock is not provided - the CLKSOURCE bit of the SysTick Control and Status register will be forced to 1 and cannot be cleared to 0. - [31:31] - read-only - - - SKEW - If reads as 1, the calibration value for 10ms is inexact (due to clock frequency). - [30:30] - read-only - - - TENMS - An optional Reload value to be used for 10ms (100Hz) timing, subject to system clock skew errors. If the value reads as 0, the calibration value is not known. - [23:0] - read-only - - - - - NVIC_ISER0 - Enables or reads the enabled state of each group of 32 interrupts - 0xE100 - 0x00000000 - - - SETENA - For SETENA[m] in NVIC_ISER*n, indicates whether interrupt 32*n + m is enabled - [31:0] - read-write - - - - - NVIC_ISER1 - Enables or reads the enabled state of each group of 32 interrupts - 0xE104 - 0x00000000 - - - SETENA - For SETENA[m] in NVIC_ISER*n, indicates whether interrupt 32*n + m is enabled - [31:0] - read-write - - - - - NVIC_ICER0 - Clears or reads the enabled state of each group of 32 interrupts - 0xE180 - 0x00000000 - - - CLRENA - For CLRENA[m] in NVIC_ICER*n, indicates whether interrupt 32*n + m is enabled - [31:0] - read-write - - - - - NVIC_ICER1 - Clears or reads the enabled state of each group of 32 interrupts - 0xE184 - 0x00000000 - - - CLRENA - For CLRENA[m] in NVIC_ICER*n, indicates whether interrupt 32*n + m is enabled - [31:0] - read-write - - - - - NVIC_ISPR0 - Enables or reads the pending state of each group of 32 interrupts - 0xE200 - 0x00000000 - - - SETPEND - For SETPEND[m] in NVIC_ISPR*n, indicates whether interrupt 32*n + m is pending - [31:0] - read-write - - - - - NVIC_ISPR1 - Enables or reads the pending state of each group of 32 interrupts - 0xE204 - 0x00000000 - - - SETPEND - For SETPEND[m] in NVIC_ISPR*n, indicates whether interrupt 32*n + m is pending - [31:0] - read-write - - - - - NVIC_ICPR0 - Clears or reads the pending state of each group of 32 interrupts - 0xE280 - 0x00000000 - - - CLRPEND - For CLRPEND[m] in NVIC_ICPR*n, indicates whether interrupt 32*n + m is pending - [31:0] - read-write - - - - - NVIC_ICPR1 - Clears or reads the pending state of each group of 32 interrupts - 0xE284 - 0x00000000 - - - CLRPEND - For CLRPEND[m] in NVIC_ICPR*n, indicates whether interrupt 32*n + m is pending - [31:0] - read-write - - - - - NVIC_IABR0 - For each group of 32 interrupts, shows the active state of each interrupt - 0xE300 - 0x00000000 - - - ACTIVE - For ACTIVE[m] in NVIC_IABR*n, indicates the active state for interrupt 32*n+m - [31:0] - read-write - - - - - NVIC_IABR1 - For each group of 32 interrupts, shows the active state of each interrupt - 0xE304 - 0x00000000 - - - ACTIVE - For ACTIVE[m] in NVIC_IABR*n, indicates the active state for interrupt 32*n+m - [31:0] - read-write - - - - - NVIC_ITNS0 - For each group of 32 interrupts, determines whether each interrupt targets Non-secure or Secure state - 0xE380 - 0x00000000 - - - ITNS - For ITNS[m] in NVIC_ITNS*n, `IAAMO the target Security state for interrupt 32*n+m - [31:0] - read-write - - - - - NVIC_ITNS1 - For each group of 32 interrupts, determines whether each interrupt targets Non-secure or Secure state - 0xE384 - 0x00000000 - - - ITNS - For ITNS[m] in NVIC_ITNS*n, `IAAMO the target Security state for interrupt 32*n+m - [31:0] - read-write - - - - - NVIC_IPR0 - Sets or reads interrupt priorities - 0xE400 - 0x00000000 - - - PRI_N3 - For register NVIC_IPRn, the priority of interrupt number 4*n+3, or RES0 if the PE does not implement this interrupt - [31:28] - read-write - - - PRI_N2 - For register NVIC_IPRn, the priority of interrupt number 4*n+2, or RES0 if the PE does not implement this interrupt - [23:20] - read-write - - - PRI_N1 - For register NVIC_IPRn, the priority of interrupt number 4*n+1, or RES0 if the PE does not implement this interrupt - [15:12] - read-write - - - PRI_N0 - For register NVIC_IPRn, the priority of interrupt number 4*n+0, or RES0 if the PE does not implement this interrupt - [7:4] - read-write - - - - - NVIC_IPR1 - Sets or reads interrupt priorities - 0xE404 - 0x00000000 - - - PRI_N3 - For register NVIC_IPRn, the priority of interrupt number 4*n+3, or RES0 if the PE does not implement this interrupt - [31:28] - read-write - - - PRI_N2 - For register NVIC_IPRn, the priority of interrupt number 4*n+2, or RES0 if the PE does not implement this interrupt - [23:20] - read-write - - - PRI_N1 - For register NVIC_IPRn, the priority of interrupt number 4*n+1, or RES0 if the PE does not implement this interrupt - [15:12] - read-write - - - PRI_N0 - For register NVIC_IPRn, the priority of interrupt number 4*n+0, or RES0 if the PE does not implement this interrupt - [7:4] - read-write - - - - - NVIC_IPR2 - Sets or reads interrupt priorities - 0xE408 - 0x00000000 - - - PRI_N3 - For register NVIC_IPRn, the priority of interrupt number 4*n+3, or RES0 if the PE does not implement this interrupt - [31:28] - read-write - - - PRI_N2 - For register NVIC_IPRn, the priority of interrupt number 4*n+2, or RES0 if the PE does not implement this interrupt - [23:20] - read-write - - - PRI_N1 - For register NVIC_IPRn, the priority of interrupt number 4*n+1, or RES0 if the PE does not implement this interrupt - [15:12] - read-write - - - PRI_N0 - For register NVIC_IPRn, the priority of interrupt number 4*n+0, or RES0 if the PE does not implement this interrupt - [7:4] - read-write - - - - - NVIC_IPR3 - Sets or reads interrupt priorities - 0xE40C - 0x00000000 - - - PRI_N3 - For register NVIC_IPRn, the priority of interrupt number 4*n+3, or RES0 if the PE does not implement this interrupt - [31:28] - read-write - - - PRI_N2 - For register NVIC_IPRn, the priority of interrupt number 4*n+2, or RES0 if the PE does not implement this interrupt - [23:20] - read-write - - - PRI_N1 - For register NVIC_IPRn, the priority of interrupt number 4*n+1, or RES0 if the PE does not implement this interrupt - [15:12] - read-write - - - PRI_N0 - For register NVIC_IPRn, the priority of interrupt number 4*n+0, or RES0 if the PE does not implement this interrupt - [7:4] - read-write - - - - - NVIC_IPR4 - Sets or reads interrupt priorities - 0xE410 - 0x00000000 - - - PRI_N3 - For register NVIC_IPRn, the priority of interrupt number 4*n+3, or RES0 if the PE does not implement this interrupt - [31:28] - read-write - - - PRI_N2 - For register NVIC_IPRn, the priority of interrupt number 4*n+2, or RES0 if the PE does not implement this interrupt - [23:20] - read-write - - - PRI_N1 - For register NVIC_IPRn, the priority of interrupt number 4*n+1, or RES0 if the PE does not implement this interrupt - [15:12] - read-write - - - PRI_N0 - For register NVIC_IPRn, the priority of interrupt number 4*n+0, or RES0 if the PE does not implement this interrupt - [7:4] - read-write - - - - - NVIC_IPR5 - Sets or reads interrupt priorities - 0xE414 - 0x00000000 - - - PRI_N3 - For register NVIC_IPRn, the priority of interrupt number 4*n+3, or RES0 if the PE does not implement this interrupt - [31:28] - read-write - - - PRI_N2 - For register NVIC_IPRn, the priority of interrupt number 4*n+2, or RES0 if the PE does not implement this interrupt - [23:20] - read-write - - - PRI_N1 - For register NVIC_IPRn, the priority of interrupt number 4*n+1, or RES0 if the PE does not implement this interrupt - [15:12] - read-write - - - PRI_N0 - For register NVIC_IPRn, the priority of interrupt number 4*n+0, or RES0 if the PE does not implement this interrupt - [7:4] - read-write - - - - - NVIC_IPR6 - Sets or reads interrupt priorities - 0xE418 - 0x00000000 - - - PRI_N3 - For register NVIC_IPRn, the priority of interrupt number 4*n+3, or RES0 if the PE does not implement this interrupt - [31:28] - read-write - - - PRI_N2 - For register NVIC_IPRn, the priority of interrupt number 4*n+2, or RES0 if the PE does not implement this interrupt - [23:20] - read-write - - - PRI_N1 - For register NVIC_IPRn, the priority of interrupt number 4*n+1, or RES0 if the PE does not implement this interrupt - [15:12] - read-write - - - PRI_N0 - For register NVIC_IPRn, the priority of interrupt number 4*n+0, or RES0 if the PE does not implement this interrupt - [7:4] - read-write - - - - - NVIC_IPR7 - Sets or reads interrupt priorities - 0xE41C - 0x00000000 - - - PRI_N3 - For register NVIC_IPRn, the priority of interrupt number 4*n+3, or RES0 if the PE does not implement this interrupt - [31:28] - read-write - - - PRI_N2 - For register NVIC_IPRn, the priority of interrupt number 4*n+2, or RES0 if the PE does not implement this interrupt - [23:20] - read-write - - - PRI_N1 - For register NVIC_IPRn, the priority of interrupt number 4*n+1, or RES0 if the PE does not implement this interrupt - [15:12] - read-write - - - PRI_N0 - For register NVIC_IPRn, the priority of interrupt number 4*n+0, or RES0 if the PE does not implement this interrupt - [7:4] - read-write - - - - - NVIC_IPR8 - Sets or reads interrupt priorities - 0xE420 - 0x00000000 - - - PRI_N3 - For register NVIC_IPRn, the priority of interrupt number 4*n+3, or RES0 if the PE does not implement this interrupt - [31:28] - read-write - - - PRI_N2 - For register NVIC_IPRn, the priority of interrupt number 4*n+2, or RES0 if the PE does not implement this interrupt - [23:20] - read-write - - - PRI_N1 - For register NVIC_IPRn, the priority of interrupt number 4*n+1, or RES0 if the PE does not implement this interrupt - [15:12] - read-write - - - PRI_N0 - For register NVIC_IPRn, the priority of interrupt number 4*n+0, or RES0 if the PE does not implement this interrupt - [7:4] - read-write - - - - - NVIC_IPR9 - Sets or reads interrupt priorities - 0xE424 - 0x00000000 - - - PRI_N3 - For register NVIC_IPRn, the priority of interrupt number 4*n+3, or RES0 if the PE does not implement this interrupt - [31:28] - read-write - - - PRI_N2 - For register NVIC_IPRn, the priority of interrupt number 4*n+2, or RES0 if the PE does not implement this interrupt - [23:20] - read-write - - - PRI_N1 - For register NVIC_IPRn, the priority of interrupt number 4*n+1, or RES0 if the PE does not implement this interrupt - [15:12] - read-write - - - PRI_N0 - For register NVIC_IPRn, the priority of interrupt number 4*n+0, or RES0 if the PE does not implement this interrupt - [7:4] - read-write - - - - - NVIC_IPR10 - Sets or reads interrupt priorities - 0xE428 - 0x00000000 - - - PRI_N3 - For register NVIC_IPRn, the priority of interrupt number 4*n+3, or RES0 if the PE does not implement this interrupt - [31:28] - read-write - - - PRI_N2 - For register NVIC_IPRn, the priority of interrupt number 4*n+2, or RES0 if the PE does not implement this interrupt - [23:20] - read-write - - - PRI_N1 - For register NVIC_IPRn, the priority of interrupt number 4*n+1, or RES0 if the PE does not implement this interrupt - [15:12] - read-write - - - PRI_N0 - For register NVIC_IPRn, the priority of interrupt number 4*n+0, or RES0 if the PE does not implement this interrupt - [7:4] - read-write - - - - - NVIC_IPR11 - Sets or reads interrupt priorities - 0xE42C - 0x00000000 - - - PRI_N3 - For register NVIC_IPRn, the priority of interrupt number 4*n+3, or RES0 if the PE does not implement this interrupt - [31:28] - read-write - - - PRI_N2 - For register NVIC_IPRn, the priority of interrupt number 4*n+2, or RES0 if the PE does not implement this interrupt - [23:20] - read-write - - - PRI_N1 - For register NVIC_IPRn, the priority of interrupt number 4*n+1, or RES0 if the PE does not implement this interrupt - [15:12] - read-write - - - PRI_N0 - For register NVIC_IPRn, the priority of interrupt number 4*n+0, or RES0 if the PE does not implement this interrupt - [7:4] - read-write - - - - - NVIC_IPR12 - Sets or reads interrupt priorities - 0xE430 - 0x00000000 - - - PRI_N3 - For register NVIC_IPRn, the priority of interrupt number 4*n+3, or RES0 if the PE does not implement this interrupt - [31:28] - read-write - - - PRI_N2 - For register NVIC_IPRn, the priority of interrupt number 4*n+2, or RES0 if the PE does not implement this interrupt - [23:20] - read-write - - - PRI_N1 - For register NVIC_IPRn, the priority of interrupt number 4*n+1, or RES0 if the PE does not implement this interrupt - [15:12] - read-write - - - PRI_N0 - For register NVIC_IPRn, the priority of interrupt number 4*n+0, or RES0 if the PE does not implement this interrupt - [7:4] - read-write - - - - - NVIC_IPR13 - Sets or reads interrupt priorities - 0xE434 - 0x00000000 - - - PRI_N3 - For register NVIC_IPRn, the priority of interrupt number 4*n+3, or RES0 if the PE does not implement this interrupt - [31:28] - read-write - - - PRI_N2 - For register NVIC_IPRn, the priority of interrupt number 4*n+2, or RES0 if the PE does not implement this interrupt - [23:20] - read-write - - - PRI_N1 - For register NVIC_IPRn, the priority of interrupt number 4*n+1, or RES0 if the PE does not implement this interrupt - [15:12] - read-write - - - PRI_N0 - For register NVIC_IPRn, the priority of interrupt number 4*n+0, or RES0 if the PE does not implement this interrupt - [7:4] - read-write - - - - - NVIC_IPR14 - Sets or reads interrupt priorities - 0xE438 - 0x00000000 - - - PRI_N3 - For register NVIC_IPRn, the priority of interrupt number 4*n+3, or RES0 if the PE does not implement this interrupt - [31:28] - read-write - - - PRI_N2 - For register NVIC_IPRn, the priority of interrupt number 4*n+2, or RES0 if the PE does not implement this interrupt - [23:20] - read-write - - - PRI_N1 - For register NVIC_IPRn, the priority of interrupt number 4*n+1, or RES0 if the PE does not implement this interrupt - [15:12] - read-write - - - PRI_N0 - For register NVIC_IPRn, the priority of interrupt number 4*n+0, or RES0 if the PE does not implement this interrupt - [7:4] - read-write - - - - - NVIC_IPR15 - Sets or reads interrupt priorities - 0xE43C - 0x00000000 - - - PRI_N3 - For register NVIC_IPRn, the priority of interrupt number 4*n+3, or RES0 if the PE does not implement this interrupt - [31:28] - read-write - - - PRI_N2 - For register NVIC_IPRn, the priority of interrupt number 4*n+2, or RES0 if the PE does not implement this interrupt - [23:20] - read-write - - - PRI_N1 - For register NVIC_IPRn, the priority of interrupt number 4*n+1, or RES0 if the PE does not implement this interrupt - [15:12] - read-write - - - PRI_N0 - For register NVIC_IPRn, the priority of interrupt number 4*n+0, or RES0 if the PE does not implement this interrupt - [7:4] - read-write - - - - - CPUID - Provides identification information for the PE, including an implementer code for the device and a device ID number - 0xED00 - 0x411FD210 - - - IMPLEMENTER - This field must hold an implementer code that has been assigned by ARM - [31:24] - read-only - - - VARIANT - IMPLEMENTATION DEFINED variant number. Typically, this field is used to distinguish between different product variants, or major revisions of a product - [23:20] - read-only - - - ARCHITECTURE - Defines the Architecture implemented by the PE - [19:16] - read-only - - - PARTNO - IMPLEMENTATION DEFINED primary part number for the device - [15:4] - read-only - - - REVISION - IMPLEMENTATION DEFINED revision number for the device - [3:0] - read-only - - - - - ICSR - Controls and provides status information for NMI, PendSV, SysTick and interrupts - 0xED04 - 0x00000000 - - - PENDNMISET - Indicates whether the NMI exception is pending - [31:31] - read-only - - - PENDNMICLR - Allows the NMI exception pend state to be cleared - [30:30] - read-write - - - PENDSVSET - Indicates whether the PendSV `FTSSS exception is pending - [28:28] - read-only - - - PENDSVCLR - Allows the PendSV exception pend state to be cleared `FTSSS - [27:27] - read-write - - - PENDSTSET - Indicates whether the SysTick `FTSSS exception is pending - [26:26] - read-only - - - PENDSTCLR - Allows the SysTick exception pend state to be cleared `FTSSS - [25:25] - read-write - - - STTNS - Controls whether in a single SysTick implementation, the SysTick is Secure or Non-secure - [24:24] - read-write - - - ISRPREEMPT - Indicates whether a pending exception will be serviced on exit from debug halt state - [23:23] - read-only - - - ISRPENDING - Indicates whether an external interrupt, generated by the NVIC, is pending - [22:22] - read-only - - - VECTPENDING - The exception number of the highest priority pending and enabled interrupt - [20:12] - read-only - - - RETTOBASE - In Handler mode, indicates whether there is more than one active exception - [11:11] - read-only - - - VECTACTIVE - The exception number of the current executing exception - [8:0] - read-only - - - - - VTOR - The VTOR indicates the offset of the vector table base address from memory address 0x00000000. - 0xED08 - 0x00000000 - - - TBLOFF - Vector table base offset field. It contains bits[31:7] of the offset of the table base from the bottom of the memory map. - [31:7] - read-write - - - - - AIRCR - Use the Application Interrupt and Reset Control Register to: determine data endianness, clear all active state information from debug halt mode, request a system reset. - 0xED0C - 0x00000000 - - - VECTKEY - Register key: - Reads as Unknown - On writes, write 0x05FA to VECTKEY, otherwise the write is ignored. - [31:16] - read-write - - - ENDIANESS - Data endianness implemented: - 0 = Little-endian. - [15:15] - read-only - - - PRIS - Prioritize Secure exceptions. The value of this bit defines whether Secure exception priority boosting is enabled. - 0 Priority ranges of Secure and Non-secure exceptions are identical. - 1 Non-secure exceptions are de-prioritized. - [14:14] - read-write - - - BFHFNMINS - BusFault, HardFault, and NMI Non-secure enable. - 0 BusFault, HardFault, and NMI are Secure. - 1 BusFault and NMI are Non-secure and exceptions can target Non-secure HardFault. - [13:13] - read-write - - - PRIGROUP - Interrupt priority grouping field. This field determines the split of group priority from subpriority. - See https://developer.arm.com/documentation/100235/0004/the-cortex-m33-peripherals/system-control-block/application-interrupt-and-reset-control-register?lang=en - [10:8] - read-write - - - SYSRESETREQS - System reset request, Secure state only. - 0 SYSRESETREQ functionality is available to both Security states. - 1 SYSRESETREQ functionality is only available to Secure state. - [3:3] - read-write - - - SYSRESETREQ - Writing 1 to this bit causes the SYSRESETREQ signal to the outer system to be asserted to request a reset. The intention is to force a large system reset of all major components except for debug. The C_HALT bit in the DHCSR is cleared as a result of the system reset requested. The debugger does not lose contact with the device. - [2:2] - read-write - - - VECTCLRACTIVE - Clears all active state information for fixed and configurable exceptions. This bit: is self-clearing, can only be set by the DAP when the core is halted. When set: clears all active exception status of the processor, forces a return to Thread mode, forces an IPSR of 0. A debugger must re-initialize the stack. - [1:1] - read-write - - - - - SCR - System Control Register. Use the System Control Register for power-management functions: signal to the system when the processor can enter a low power state, control how the processor enters and exits low power states. - 0xED10 - 0x00000000 - - - SEVONPEND - Send Event on Pending bit: - 0 = Only enabled interrupts or events can wakeup the processor, disabled interrupts are excluded. - 1 = Enabled events and all interrupts, including disabled interrupts, can wakeup the processor. - When an event or interrupt becomes pending, the event signal wakes up the processor from WFE. If the - processor is not waiting for an event, the event is registered and affects the next WFE. - The processor also wakes up on execution of an SEV instruction or an external event. - [4:4] - read-write - - - SLEEPDEEPS - 0 SLEEPDEEP is available to both security states - 1 SLEEPDEEP is only available to Secure state - [3:3] - read-write - - - SLEEPDEEP - Controls whether the processor uses sleep or deep sleep as its low power mode: - 0 = Sleep. - 1 = Deep sleep. - [2:2] - read-write - - - SLEEPONEXIT - Indicates sleep-on-exit when returning from Handler mode to Thread mode: - 0 = Do not sleep when returning to Thread mode. - 1 = Enter sleep, or deep sleep, on return from an ISR to Thread mode. - Setting this bit to 1 enables an interrupt driven application to avoid returning to an empty main application. - [1:1] - read-write - - - - - CCR - Sets or returns configuration and control data - 0xED14 - 0x00000201 - - - BP - Enables program flow prediction `FTSSS - [18:18] - read-only - - - IC - This is a global enable bit for instruction caches in the selected Security state - [17:17] - read-only - - - DC - Enables data caching of all data accesses to Normal memory `FTSSS - [16:16] - read-only - - - STKOFHFNMIGN - Controls the effect of a stack limit violation while executing at a requested priority less than 0 - [10:10] - read-write - - - RES1 - Reserved, RES1 - [9:9] - read-only - - - BFHFNMIGN - Determines the effect of precise BusFaults on handlers running at a requested priority less than 0 - [8:8] - read-write - - - DIV_0_TRP - Controls the generation of a DIVBYZERO UsageFault when attempting to perform integer division by zero - [4:4] - read-write - - - UNALIGN_TRP - Controls the trapping of unaligned word or halfword accesses - [3:3] - read-write - - - USERSETMPEND - Determines whether unprivileged accesses are permitted to pend interrupts via the STIR - [1:1] - read-write - - - RES1_1 - Reserved, RES1 - [0:0] - read-only - - - - - SHPR1 - Sets or returns priority for system handlers 4 - 7 - 0xED18 - 0x00000000 - - - PRI_7_3 - Priority of system handler 7, SecureFault - [31:29] - read-write - - - PRI_6_3 - Priority of system handler 6, SecureFault - [23:21] - read-write - - - PRI_5_3 - Priority of system handler 5, SecureFault - [15:13] - read-write - - - PRI_4_3 - Priority of system handler 4, SecureFault - [7:5] - read-write - - - - - SHPR2 - Sets or returns priority for system handlers 8 - 11 - 0xED1C - 0x00000000 - - - PRI_11_3 - Priority of system handler 11, SecureFault - [31:29] - read-write - - - PRI_10 - Reserved, RES0 - [23:16] - read-only - - - PRI_9 - Reserved, RES0 - [15:8] - read-only - - - PRI_8 - Reserved, RES0 - [7:0] - read-only - - - - - SHPR3 - Sets or returns priority for system handlers 12 - 15 - 0xED20 - 0x00000000 - - - PRI_15_3 - Priority of system handler 15, SecureFault - [31:29] - read-write - - - PRI_14_3 - Priority of system handler 14, SecureFault - [23:21] - read-write - - - PRI_13 - Reserved, RES0 - [15:8] - read-only - - - PRI_12_3 - Priority of system handler 12, SecureFault - [7:5] - read-write - - - - - SHCSR - Provides access to the active and pending status of system exceptions - 0xED24 - 0x00000000 - - - HARDFAULTPENDED - `IAAMO the pending state of the HardFault exception `CTTSSS - [21:21] - read-write - - - SECUREFAULTPENDED - `IAAMO the pending state of the SecureFault exception - [20:20] - read-write - - - SECUREFAULTENA - `DW the SecureFault exception is enabled - [19:19] - read-write - - - USGFAULTENA - `DW the UsageFault exception is enabled `FTSSS - [18:18] - read-write - - - BUSFAULTENA - `DW the BusFault exception is enabled - [17:17] - read-write - - - MEMFAULTENA - `DW the MemManage exception is enabled `FTSSS - [16:16] - read-write - - - SVCALLPENDED - `IAAMO the pending state of the SVCall exception `FTSSS - [15:15] - read-write - - - BUSFAULTPENDED - `IAAMO the pending state of the BusFault exception - [14:14] - read-write - - - MEMFAULTPENDED - `IAAMO the pending state of the MemManage exception `FTSSS - [13:13] - read-write - - - USGFAULTPENDED - The UsageFault exception is banked between Security states, `IAAMO the pending state of the UsageFault exception `FTSSS - [12:12] - read-write - - - SYSTICKACT - `IAAMO the active state of the SysTick exception `FTSSS - [11:11] - read-write - - - PENDSVACT - `IAAMO the active state of the PendSV exception `FTSSS - [10:10] - read-write - - - MONITORACT - `IAAMO the active state of the DebugMonitor exception - [8:8] - read-write - - - SVCALLACT - `IAAMO the active state of the SVCall exception `FTSSS - [7:7] - read-write - - - NMIACT - `IAAMO the active state of the NMI exception - [5:5] - read-write - - - SECUREFAULTACT - `IAAMO the active state of the SecureFault exception - [4:4] - read-write - - - USGFAULTACT - `IAAMO the active state of the UsageFault exception `FTSSS - [3:3] - read-write - - - HARDFAULTACT - Indicates and allows limited modification of the active state of the HardFault exception `FTSSS - [2:2] - read-write - - - BUSFAULTACT - `IAAMO the active state of the BusFault exception - [1:1] - read-write - - - MEMFAULTACT - `IAAMO the active state of the MemManage exception `FTSSS - [0:0] - read-write - - - - - CFSR - Contains the three Configurable Fault Status Registers. - - 31:16 UFSR: Provides information on UsageFault exceptions - - 15:8 BFSR: Provides information on BusFault exceptions - - 7:0 MMFSR: Provides information on MemManage exceptions - 0xED28 - 0x00000000 - - - UFSR_DIVBYZERO - Sticky flag indicating whether an integer division by zero error has occurred - [25:25] - read-write - - - UFSR_UNALIGNED - Sticky flag indicating whether an unaligned access error has occurred - [24:24] - read-write - - - UFSR_STKOF - Sticky flag indicating whether a stack overflow error has occurred - [20:20] - read-write - - - UFSR_NOCP - Sticky flag indicating whether a coprocessor disabled or not present error has occurred - [19:19] - read-write - - - UFSR_INVPC - Sticky flag indicating whether an integrity check error has occurred - [18:18] - read-write - - - UFSR_INVSTATE - Sticky flag indicating whether an EPSR.T or EPSR.IT validity error has occurred - [17:17] - read-write - - - UFSR_UNDEFINSTR - Sticky flag indicating whether an undefined instruction error has occurred - [16:16] - read-write - - - BFSR_BFARVALID - Indicates validity of the contents of the BFAR register - [15:15] - read-write - - - BFSR_LSPERR - Records whether a BusFault occurred during FP lazy state preservation - [13:13] - read-write - - - BFSR_STKERR - Records whether a derived BusFault occurred during exception entry stacking - [12:12] - read-write - - - BFSR_UNSTKERR - Records whether a derived BusFault occurred during exception return unstacking - [11:11] - read-write - - - BFSR_IMPRECISERR - Records whether an imprecise data access error has occurred - [10:10] - read-write - - - BFSR_PRECISERR - Records whether a precise data access error has occurred - [9:9] - read-write - - - BFSR_IBUSERR - Records whether a BusFault on an instruction prefetch has occurred - [8:8] - read-write - - - MMFSR - Provides information on MemManage exceptions - [7:0] - read-write - - - - - HFSR - Shows the cause of any HardFaults - 0xED2C - 0x00000000 - - - DEBUGEVT - Indicates when a Debug event has occurred - [31:31] - read-write - - - FORCED - Indicates that a fault with configurable priority has been escalated to a HardFault exception, because it could not be made active, because of priority, or because it was disabled - [30:30] - read-write - - - VECTTBL - Indicates when a fault has occurred because of a vector table read error on exception processing - [1:1] - read-write - - - - - DFSR - Shows which debug event occurred - 0xED30 - 0x00000000 - - - EXTERNAL - Sticky flag indicating whether an External debug request debug event has occurred - [4:4] - read-write - - - VCATCH - Sticky flag indicating whether a Vector catch debug event has occurred - [3:3] - read-write - - - DWTTRAP - Sticky flag indicating whether a Watchpoint debug event has occurred - [2:2] - read-write - - - BKPT - Sticky flag indicating whether a Breakpoint debug event has occurred - [1:1] - read-write - - - HALTED - Sticky flag indicating that a Halt request debug event or Step debug event has occurred - [0:0] - read-write - - - - - MMFAR - Shows the address of the memory location that caused an MPU fault - 0xED34 - 0x00000000 - - - ADDRESS - This register is updated with the address of a location that produced a MemManage fault. The MMFSR shows the cause of the fault, and whether this field is valid. This field is valid only when MMFSR.MMARVALID is set, otherwise it is UNKNOWN - [31:0] - read-write - - - - - BFAR - Shows the address associated with a precise data access BusFault - 0xED38 - 0x00000000 - - - ADDRESS - This register is updated with the address of a location that produced a BusFault. The BFSR shows the reason for the fault. This field is valid only when BFSR.BFARVALID is set, otherwise it is UNKNOWN - [31:0] - read-write - - - - - ID_PFR0 - Gives top-level information about the instruction set supported by the PE - 0xED40 - 0x00000030 - - - STATE1 - T32 instruction set support - [7:4] - read-only - - - STATE0 - A32 instruction set support - [3:0] - read-only - - - - - ID_PFR1 - Gives information about the programmers' model and Extensions support - 0xED44 - 0x00000520 - - - MPROGMOD - Identifies support for the M-Profile programmers' model support - [11:8] - read-only - - - SECURITY - Identifies whether the Security Extension is implemented - [7:4] - read-only - - - - - ID_DFR0 - Provides top level information about the debug system - 0xED48 - 0x00200000 - - - MPROFDBG - Indicates the supported M-profile debug architecture - [23:20] - read-only - - - - - ID_AFR0 - Provides information about the IMPLEMENTATION DEFINED features of the PE - 0xED4C - 0x00000000 - - - IMPDEF3 - IMPLEMENTATION DEFINED meaning - [15:12] - read-only - - - IMPDEF2 - IMPLEMENTATION DEFINED meaning - [11:8] - read-only - - - IMPDEF1 - IMPLEMENTATION DEFINED meaning - [7:4] - read-only - - - IMPDEF0 - IMPLEMENTATION DEFINED meaning - [3:0] - read-only - - - - - ID_MMFR0 - Provides information about the implemented memory model and memory management support - 0xED50 - 0x00101F40 - - - AUXREG - Indicates support for Auxiliary Control Registers - [23:20] - read-only - - - TCM - Indicates support for tightly coupled memories (TCMs) - [19:16] - read-only - - - SHARELVL - Indicates the number of shareability levels implemented - [15:12] - read-only - - - OUTERSHR - Indicates the outermost shareability domain implemented - [11:8] - read-only - - - PMSA - Indicates support for the protected memory system architecture (PMSA) - [7:4] - read-only - - - - - ID_MMFR1 - Provides information about the implemented memory model and memory management support - 0xED54 - 0x00000000 - - - ID_MMFR1 - [31:0] - read-write - - - - - ID_MMFR2 - Provides information about the implemented memory model and memory management support - 0xED58 - 0x01000000 - - - WFISTALL - Indicates the support for Wait For Interrupt (WFI) stalling - [27:24] - read-only - - - - - ID_MMFR3 - Provides information about the implemented memory model and memory management support - 0xED5C - 0x00000000 - - - BPMAINT - Indicates the supported branch predictor maintenance - [11:8] - read-only - - - CMAINTSW - Indicates the supported cache maintenance operations by set/way - [7:4] - read-only - - - CMAINTVA - Indicates the supported cache maintenance operations by address - [3:0] - read-only - - - - - ID_ISAR0 - Provides information about the instruction set implemented by the PE - 0xED60 - 0x08092300 - - - DIVIDE - Indicates the supported Divide instructions - [27:24] - read-only - - - DEBUG - Indicates the implemented Debug instructions - [23:20] - read-only - - - COPROC - Indicates the supported Coprocessor instructions - [19:16] - read-only - - - CMPBRANCH - Indicates the supported combined Compare and Branch instructions - [15:12] - read-only - - - BITFIELD - Indicates the supported bit field instructions - [11:8] - read-only - - - BITCOUNT - Indicates the supported bit count instructions - [7:4] - read-only - - - - - ID_ISAR1 - Provides information about the instruction set implemented by the PE - 0xED64 - 0x05725000 - - - INTERWORK - Indicates the implemented Interworking instructions - [27:24] - read-only - - - IMMEDIATE - Indicates the implemented for data-processing instructions with long immediates - [23:20] - read-only - - - IFTHEN - Indicates the implemented If-Then instructions - [19:16] - read-only - - - EXTEND - Indicates the implemented Extend instructions - [15:12] - read-only - - - - - ID_ISAR2 - Provides information about the instruction set implemented by the PE - 0xED68 - 0x30173426 - - - REVERSAL - Indicates the implemented Reversal instructions - [31:28] - read-only - - - MULTU - Indicates the implemented advanced unsigned Multiply instructions - [23:20] - read-only - - - MULTS - Indicates the implemented advanced signed Multiply instructions - [19:16] - read-only - - - MULT - Indicates the implemented additional Multiply instructions - [15:12] - read-only - - - MULTIACCESSINT - Indicates the support for interruptible multi-access instructions - [11:8] - read-only - - - MEMHINT - Indicates the implemented Memory Hint instructions - [7:4] - read-only - - - LOADSTORE - Indicates the implemented additional load/store instructions - [3:0] - read-only - - - - - ID_ISAR3 - Provides information about the instruction set implemented by the PE - 0xED6C - 0x07895729 - - - TRUENOP - Indicates the implemented true NOP instructions - [27:24] - read-only - - - T32COPY - Indicates the support for T32 non flag-setting MOV instructions - [23:20] - read-only - - - TABBRANCH - Indicates the implemented Table Branch instructions - [19:16] - read-only - - - SYNCHPRIM - Used in conjunction with ID_ISAR4.SynchPrim_frac to indicate the implemented Synchronization Primitive instructions - [15:12] - read-only - - - SVC - Indicates the implemented SVC instructions - [11:8] - read-only - - - SIMD - Indicates the implemented SIMD instructions - [7:4] - read-only - - - SATURATE - Indicates the implemented saturating instructions - [3:0] - read-only - - - - - ID_ISAR4 - Provides information about the instruction set implemented by the PE - 0xED70 - 0x01310132 - - - PSR_M - Indicates the implemented M profile instructions to modify the PSRs - [27:24] - read-only - - - SYNCPRIM_FRAC - Used in conjunction with ID_ISAR3.SynchPrim to indicate the implemented Synchronization Primitive instructions - [23:20] - read-only - - - BARRIER - Indicates the implemented Barrier instructions - [19:16] - read-only - - - WRITEBACK - Indicates the support for writeback addressing modes - [11:8] - read-only - - - WITHSHIFTS - Indicates the support for writeback addressing modes - [7:4] - read-only - - - UNPRIV - Indicates the implemented unprivileged instructions - [3:0] - read-only - - - - - ID_ISAR5 - Provides information about the instruction set implemented by the PE - 0xED74 - 0x00000000 - - - ID_ISAR5 - [31:0] - read-write - - - - - CTR - Provides information about the architecture of the caches. CTR is RES0 if CLIDR is zero. - 0xED7C - 0x8000C000 - - - RES1 - Reserved, RES1 - [31:31] - read-only - - - CWG - Log2 of the number of words of the maximum size of memory that can be overwritten as a result of the eviction of a cache entry that has had a memory location in it modified - [27:24] - read-only - - - ERG - Log2 of the number of words of the maximum size of the reservation granule that has been implemented for the Load-Exclusive and Store-Exclusive instructions - [23:20] - read-only - - - DMINLINE - Log2 of the number of words in the smallest cache line of all the data caches and unified caches that are controlled by the PE - [19:16] - read-only - - - RES1_1 - Reserved, RES1 - [15:14] - read-only - - - IMINLINE - Log2 of the number of words in the smallest cache line of all the instruction caches that are controlled by the PE - [3:0] - read-only - - - - - CPACR - Specifies the access privileges for coprocessors and the FP Extension - 0xED88 - 0x00000000 - - - CP11 - The value in this field is ignored. If the implementation does not include the FP Extension, this field is RAZ/WI. If the value of this bit is not programmed to the same value as the CP10 field, then the value is UNKNOWN - [23:22] - read-write - - - CP10 - Defines the access rights for the floating-point functionality - [21:20] - read-write - - - CP7 - Controls access privileges for coprocessor 7 - [15:14] - read-write - - - CP6 - Controls access privileges for coprocessor 6 - [13:12] - read-write - - - CP5 - Controls access privileges for coprocessor 5 - [11:10] - read-write - - - CP4 - Controls access privileges for coprocessor 4 - [9:8] - read-write - - - CP3 - Controls access privileges for coprocessor 3 - [7:6] - read-write - - - CP2 - Controls access privileges for coprocessor 2 - [5:4] - read-write - - - CP1 - Controls access privileges for coprocessor 1 - [3:2] - read-write - - - CP0 - Controls access privileges for coprocessor 0 - [1:0] - read-write - - - - - NSACR - Defines the Non-secure access permissions for both the FP Extension and coprocessors CP0 to CP7 - 0xED8C - 0x00000000 - - - CP11 - Enables Non-secure access to the Floating-point Extension - [11:11] - read-write - - - CP10 - Enables Non-secure access to the Floating-point Extension - [10:10] - read-write - - - CP7 - Enables Non-secure access to coprocessor CP7 - [7:7] - read-write - - - CP6 - Enables Non-secure access to coprocessor CP6 - [6:6] - read-write - - - CP5 - Enables Non-secure access to coprocessor CP5 - [5:5] - read-write - - - CP4 - Enables Non-secure access to coprocessor CP4 - [4:4] - read-write - - - CP3 - Enables Non-secure access to coprocessor CP3 - [3:3] - read-write - - - CP2 - Enables Non-secure access to coprocessor CP2 - [2:2] - read-write - - - CP1 - Enables Non-secure access to coprocessor CP1 - [1:1] - read-write - - - CP0 - Enables Non-secure access to coprocessor CP0 - [0:0] - read-write - - - - - MPU_TYPE - The MPU Type Register indicates how many regions the MPU `FTSSS supports - 0xED90 - 0x00000800 - - - DREGION - Number of regions supported by the MPU - [15:8] - read-only - - - SEPARATE - Indicates support for separate instructions and data address regions - [0:0] - read-only - - - - - MPU_CTRL - Enables the MPU and, when the MPU is enabled, controls whether the default memory map is enabled as a background region for privileged accesses, and whether the MPU is enabled for HardFaults, NMIs, and exception handlers when FAULTMASK is set to 1 - 0xED94 - 0x00000000 - - - PRIVDEFENA - Controls whether the default memory map is enabled for privileged software - [2:2] - read-write - - - HFNMIENA - Controls whether handlers executing with priority less than 0 access memory with the MPU enabled or disabled. This applies to HardFaults, NMIs, and exception handlers when FAULTMASK is set to 1 - [1:1] - read-write - - - ENABLE - Enables the MPU - [0:0] - read-write - - - - - MPU_RNR - Selects the region currently accessed by MPU_RBAR and MPU_RLAR - 0xED98 - 0x00000000 - - - REGION - Indicates the memory region accessed by MPU_RBAR and MPU_RLAR - [2:0] - read-write - - - - - MPU_RBAR - Provides indirect read and write access to the base address of the currently selected MPU region `FTSSS - 0xED9C - 0x00000000 - - - BASE - Contains bits [31:5] of the lower inclusive limit of the selected MPU memory region. This value is zero extended to provide the base address to be checked against - [31:5] - read-write - - - SH - Defines the Shareability domain of this region for Normal memory - [4:3] - read-write - - - AP - Defines the access permissions for this region - [2:1] - read-write - - - XN - Defines whether code can be executed from this region - [0:0] - read-write - - - - - MPU_RLAR - Provides indirect read and write access to the limit address of the currently selected MPU region `FTSSS - 0xEDA0 - 0x00000000 - - - LIMIT - Contains bits [31:5] of the upper inclusive limit of the selected MPU memory region. This value is postfixed with 0x1F to provide the limit address to be checked against - [31:5] - read-write - - - ATTRINDX - Associates a set of attributes in the MPU_MAIR0 and MPU_MAIR1 fields - [3:1] - read-write - - - EN - Region enable - [0:0] - read-write - - - - - MPU_RBAR_A1 - Provides indirect read and write access to the base address of the MPU region selected by MPU_RNR[7:2]:(1[1:0]) `FTSSS - 0xEDA4 - 0x00000000 - - - BASE - Contains bits [31:5] of the lower inclusive limit of the selected MPU memory region. This value is zero extended to provide the base address to be checked against - [31:5] - read-write - - - SH - Defines the Shareability domain of this region for Normal memory - [4:3] - read-write - - - AP - Defines the access permissions for this region - [2:1] - read-write - - - XN - Defines whether code can be executed from this region - [0:0] - read-write - - - - - MPU_RLAR_A1 - Provides indirect read and write access to the limit address of the currently selected MPU region selected by MPU_RNR[7:2]:(1[1:0]) `FTSSS - 0xEDA8 - 0x00000000 - - - LIMIT - Contains bits [31:5] of the upper inclusive limit of the selected MPU memory region. This value is postfixed with 0x1F to provide the limit address to be checked against - [31:5] - read-write - - - ATTRINDX - Associates a set of attributes in the MPU_MAIR0 and MPU_MAIR1 fields - [3:1] - read-write - - - EN - Region enable - [0:0] - read-write - - - - - MPU_RBAR_A2 - Provides indirect read and write access to the base address of the MPU region selected by MPU_RNR[7:2]:(2[1:0]) `FTSSS - 0xEDAC - 0x00000000 - - - BASE - Contains bits [31:5] of the lower inclusive limit of the selected MPU memory region. This value is zero extended to provide the base address to be checked against - [31:5] - read-write - - - SH - Defines the Shareability domain of this region for Normal memory - [4:3] - read-write - - - AP - Defines the access permissions for this region - [2:1] - read-write - - - XN - Defines whether code can be executed from this region - [0:0] - read-write - - - - - MPU_RLAR_A2 - Provides indirect read and write access to the limit address of the currently selected MPU region selected by MPU_RNR[7:2]:(2[1:0]) `FTSSS - 0xEDB0 - 0x00000000 - - - LIMIT - Contains bits [31:5] of the upper inclusive limit of the selected MPU memory region. This value is postfixed with 0x1F to provide the limit address to be checked against - [31:5] - read-write - - - ATTRINDX - Associates a set of attributes in the MPU_MAIR0 and MPU_MAIR1 fields - [3:1] - read-write - - - EN - Region enable - [0:0] - read-write - - - - - MPU_RBAR_A3 - Provides indirect read and write access to the base address of the MPU region selected by MPU_RNR[7:2]:(3[1:0]) `FTSSS - 0xEDB4 - 0x00000000 - - - BASE - Contains bits [31:5] of the lower inclusive limit of the selected MPU memory region. This value is zero extended to provide the base address to be checked against - [31:5] - read-write - - - SH - Defines the Shareability domain of this region for Normal memory - [4:3] - read-write - - - AP - Defines the access permissions for this region - [2:1] - read-write - - - XN - Defines whether code can be executed from this region - [0:0] - read-write - - - - - MPU_RLAR_A3 - Provides indirect read and write access to the limit address of the currently selected MPU region selected by MPU_RNR[7:2]:(3[1:0]) `FTSSS - 0xEDB8 - 0x00000000 - - - LIMIT - Contains bits [31:5] of the upper inclusive limit of the selected MPU memory region. This value is postfixed with 0x1F to provide the limit address to be checked against - [31:5] - read-write - - - ATTRINDX - Associates a set of attributes in the MPU_MAIR0 and MPU_MAIR1 fields - [3:1] - read-write - - - EN - Region enable - [0:0] - read-write - - - - - MPU_MAIR0 - Along with MPU_MAIR1, provides the memory attribute encodings corresponding to the AttrIndex values - 0xEDC0 - 0x00000000 - - - ATTR3 - Memory attribute encoding for MPU regions with an AttrIndex of 3 - [31:24] - read-write - - - ATTR2 - Memory attribute encoding for MPU regions with an AttrIndex of 2 - [23:16] - read-write - - - ATTR1 - Memory attribute encoding for MPU regions with an AttrIndex of 1 - [15:8] - read-write - - - ATTR0 - Memory attribute encoding for MPU regions with an AttrIndex of 0 - [7:0] - read-write - - - - - MPU_MAIR1 - Along with MPU_MAIR0, provides the memory attribute encodings corresponding to the AttrIndex values - 0xEDC4 - 0x00000000 - - - ATTR7 - Memory attribute encoding for MPU regions with an AttrIndex of 7 - [31:24] - read-write - - - ATTR6 - Memory attribute encoding for MPU regions with an AttrIndex of 6 - [23:16] - read-write - - - ATTR5 - Memory attribute encoding for MPU regions with an AttrIndex of 5 - [15:8] - read-write - - - ATTR4 - Memory attribute encoding for MPU regions with an AttrIndex of 4 - [7:0] - read-write - - - - - SAU_CTRL - Allows enabling of the Security Attribution Unit - 0xEDD0 - 0x00000000 - - - ALLNS - When SAU_CTRL.ENABLE is 0 this bit controls if the memory is marked as Non-secure or Secure - [1:1] - read-write - - - ENABLE - Enables the SAU - [0:0] - read-write - - - - - SAU_TYPE - Indicates the number of regions implemented by the Security Attribution Unit - 0xEDD4 - 0x00000008 - - - SREGION - The number of implemented SAU regions - [7:0] - read-only - - - - - SAU_RNR - Selects the region currently accessed by SAU_RBAR and SAU_RLAR - 0xEDD8 - 0x00000000 - - - REGION - Indicates the SAU region accessed by SAU_RBAR and SAU_RLAR - [7:0] - read-write - - - - - SAU_RBAR - Provides indirect read and write access to the base address of the currently selected SAU region - 0xEDDC - 0x00000000 - - - BADDR - Holds bits [31:5] of the base address for the selected SAU region - [31:5] - read-write - - - - - SAU_RLAR - Provides indirect read and write access to the limit address of the currently selected SAU region - 0xEDE0 - 0x00000000 - - - LADDR - Holds bits [31:5] of the limit address for the selected SAU region - [31:5] - read-write - - - NSC - Controls whether Non-secure state is permitted to execute an SG instruction from this region - [1:1] - read-write - - - ENABLE - SAU region enable - [0:0] - read-write - - - - - SFSR - Provides information about any security related faults - 0xEDE4 - 0x00000000 - - - LSERR - Sticky flag indicating that an error occurred during lazy state activation or deactivation - [7:7] - read-write - - - SFARVALID - This bit is set when the SFAR register contains a valid value. As with similar fields, such as BFSR.BFARVALID and MMFSR.MMARVALID, this bit can be cleared by other exceptions, such as BusFault - [6:6] - read-write - - - LSPERR - Stick flag indicating that an SAU or IDAU violation occurred during the lazy preservation of floating-point state - [5:5] - read-write - - - INVTRAN - Sticky flag indicating that an exception was raised due to a branch that was not flagged as being domain crossing causing a transition from Secure to Non-secure memory - [4:4] - read-write - - - AUVIOL - Sticky flag indicating that an attempt was made to access parts of the address space that are marked as Secure with NS-Req for the transaction set to Non-secure. This bit is not set if the violation occurred during lazy state preservation. See LSPERR - [3:3] - read-write - - - INVER - This can be caused by EXC_RETURN.DCRS being set to 0 when returning from an exception in the Non-secure state, or by EXC_RETURN.ES being set to 1 when returning from an exception in the Non-secure state - [2:2] - read-write - - - INVIS - This bit is set if the integrity signature in an exception stack frame is found to be invalid during the unstacking operation - [1:1] - read-write - - - INVEP - This bit is set if a function call from the Non-secure state or exception targets a non-SG instruction in the Secure state. This bit is also set if the target address is a SG instruction, but there is no matching SAU/IDAU region with the NSC flag set - [0:0] - read-write - - - - - SFAR - Shows the address of the memory location that caused a Security violation - 0xEDE8 - 0x00000000 - - - ADDRESS - The address of an access that caused a attribution unit violation. This field is only valid when SFSR.SFARVALID is set. This allows the actual flip flops associated with this register to be shared with other fault address registers. If an implementation chooses to share the storage in this way, care must be taken to not leak Secure address information to the Non-secure state. One way of achieving this is to share the SFAR register with the MMFAR_S register, which is not accessible to the Non-secure state - [31:0] - read-write - - - - - DHCSR - Controls halting debug - 0xEDF0 - 0x00000000 - - - S_RESTART_ST - Indicates the PE has processed a request to clear DHCSR.C_HALT to 0. That is, either a write to DHCSR that clears DHCSR.C_HALT from 1 to 0, or an External Restart Request - [26:26] - read-only - - - S_RESET_ST - Indicates whether the PE has been reset since the last read of the DHCSR - [25:25] - read-only - - - S_RETIRE_ST - Set to 1 every time the PE retires one of more instructions - [24:24] - read-only - - - S_SDE - Indicates whether Secure invasive debug is allowed - [20:20] - read-only - - - S_LOCKUP - Indicates whether the PE is in Lockup state - [19:19] - read-only - - - S_SLEEP - Indicates whether the PE is sleeping - [18:18] - read-only - - - S_HALT - Indicates whether the PE is in Debug state - [17:17] - read-only - - - S_REGRDY - Handshake flag to transfers through the DCRDR - [16:16] - read-only - - - C_SNAPSTALL - Allow imprecise entry to Debug state - [5:5] - read-write - - - C_MASKINTS - When debug is enabled, the debugger can write to this bit to mask PendSV, SysTick and external configurable interrupts - [3:3] - read-write - - - C_STEP - Enable single instruction step - [2:2] - read-write - - - C_HALT - PE enter Debug state halt request - [1:1] - read-write - - - C_DEBUGEN - Enable Halting debug - [0:0] - read-write - - - - - DCRSR - With the DCRDR, provides debug access to the general-purpose registers, special-purpose registers, and the FP extension registers. A write to the DCRSR specifies the register to transfer, whether the transfer is a read or write, and starts the transfer - 0xEDF4 - 0x00000000 - - - REGWNR - Specifies the access type for the transfer - [16:16] - read-write - - - REGSEL - Specifies the general-purpose register, special-purpose register, or FP register to transfer - [6:0] - read-write - - - - - DCRDR - With the DCRSR, provides debug access to the general-purpose registers, special-purpose registers, and the FP Extension registers. If the Main Extension is implemented, it can also be used for message passing between an external debugger and a debug agent running on the PE - 0xEDF8 - 0x00000000 - - - DBGTMP - Provides debug access for reading and writing the general-purpose registers, special-purpose registers, and Floating-point Extension registers - [31:0] - read-write - - - - - DEMCR - Manages vector catch behavior and DebugMonitor handling when debugging - 0xEDFC - 0x00000000 - - - TRCENA - Global enable for all DWT and ITM features - [24:24] - read-write - - - SDME - Indicates whether the DebugMonitor targets the Secure or the Non-secure state and whether debug events are allowed in Secure state - [20:20] - read-only - - - MON_REQ - DebugMonitor semaphore bit - [19:19] - read-write - - - MON_STEP - Enable DebugMonitor stepping - [18:18] - read-write - - - MON_PEND - Sets or clears the pending state of the DebugMonitor exception - [17:17] - read-write - - - MON_EN - Enable the DebugMonitor exception - [16:16] - read-write - - - VC_SFERR - SecureFault exception halting debug vector catch enable - [11:11] - read-write - - - VC_HARDERR - HardFault exception halting debug vector catch enable - [10:10] - read-write - - - VC_INTERR - Enable halting debug vector catch for faults during exception entry and return - [9:9] - read-write - - - VC_BUSERR - BusFault exception halting debug vector catch enable - [8:8] - read-write - - - VC_STATERR - Enable halting debug trap on a UsageFault exception caused by a state information error, for example an Undefined Instruction exception - [7:7] - read-write - - - VC_CHKERR - Enable halting debug trap on a UsageFault exception caused by a checking error, for example an alignment check error - [6:6] - read-write - - - VC_NOCPERR - Enable halting debug trap on a UsageFault caused by an access to a coprocessor - [5:5] - read-write - - - VC_MMERR - Enable halting debug trap on a MemManage exception - [4:4] - read-write - - - VC_CORERESET - Enable Reset Vector Catch. This causes a warm reset to halt a running system - [0:0] - read-write - - - - - DSCSR - Provides control and status information for Secure debug - 0xEE08 - 0x00000000 - - - CDSKEY - Writes to the CDS bit are ignored unless CDSKEY is concurrently written to zero - [17:17] - read-write - - - CDS - This field indicates the current Security state of the processor - [16:16] - read-write - - - SBRSEL - If SBRSELEN is 1 this bit selects whether the Non-secure or the Secure version of the memory-mapped Banked registers are accessible to the debugger - [1:1] - read-write - - - SBRSELEN - Controls whether the SBRSEL field or the current Security state of the processor selects which version of the memory-mapped Banked registers are accessed to the debugger - [0:0] - read-write - - - - - STIR - Provides a mechanism for software to generate an interrupt - 0xEF00 - 0x00000000 - - - INTID - Indicates the interrupt to be pended. The value written is (ExceptionNumber - 16) - [8:0] - read-write - - - - - FPCCR - Holds control data for the Floating-point extension - 0xEF34 - 0x20000472 - - - ASPEN - When this bit is set to 1, execution of a floating-point instruction sets the CONTROL.FPCA bit to 1 - [31:31] - read-write - - - LSPEN - Enables lazy context save of floating-point state - [30:30] - read-write - - - LSPENS - This bit controls whether the LSPEN bit is writeable from the Non-secure state - [29:29] - read-write - - - CLRONRET - Clear floating-point caller saved registers on exception return - [28:28] - read-write - - - CLRONRETS - This bit controls whether the CLRONRET bit is writeable from the Non-secure state - [27:27] - read-write - - - TS - Treat floating-point registers as Secure enable - [26:26] - read-write - - - UFRDY - Indicates whether the software executing when the PE allocated the floating-point stack frame was able to set the UsageFault exception to pending - [10:10] - read-write - - - SPLIMVIOL - This bit is banked between the Security states and indicates whether the floating-point context violates the stack pointer limit that was active when lazy state preservation was activated. SPLIMVIOL modifies the lazy floating-point state preservation behavior - [9:9] - read-write - - - MONRDY - Indicates whether the software executing when the PE allocated the floating-point stack frame was able to set the DebugMonitor exception to pending - [8:8] - read-write - - - SFRDY - Indicates whether the software executing when the PE allocated the floating-point stack frame was able to set the SecureFault exception to pending. This bit is only present in the Secure version of the register, and behaves as RAZ/WI when accessed from the Non-secure state - [7:7] - read-write - - - BFRDY - Indicates whether the software executing when the PE allocated the floating-point stack frame was able to set the BusFault exception to pending - [6:6] - read-write - - - MMRDY - Indicates whether the software executing when the PE allocated the floating-point stack frame was able to set the MemManage exception to pending - [5:5] - read-write - - - HFRDY - Indicates whether the software executing when the PE allocated the floating-point stack frame was able to set the HardFault exception to pending - [4:4] - read-write - - - THREAD - Indicates the PE mode when it allocated the floating-point stack frame - [3:3] - read-write - - - S - Security status of the floating-point context. This bit is only present in the Secure version of the register, and behaves as RAZ/WI when accessed from the Non-secure state. This bit is updated whenever lazy state preservation is activated, or when a floating-point instruction is executed - [2:2] - read-write - - - USER - Indicates the privilege level of the software executing when the PE allocated the floating-point stack frame - [1:1] - read-write - - - LSPACT - Indicates whether lazy preservation of the floating-point state is active - [0:0] - read-write - - - - - FPCAR - Holds the location of the unpopulated floating-point register space allocated on an exception stack frame - 0xEF38 - 0x00000000 - - - ADDRESS - The location of the unpopulated floating-point register space allocated on an exception stack frame - [31:3] - read-write - - - - - FPDSCR - Holds the default values for the floating-point status control data that the PE assigns to the FPSCR when it creates a new floating-point context - 0xEF3C - 0x00000000 - - - AHP - Default value for FPSCR.AHP - [26:26] - read-write - - - DN - Default value for FPSCR.DN - [25:25] - read-write - - - FZ - Default value for FPSCR.FZ - [24:24] - read-write - - - RMODE - Default value for FPSCR.RMode - [23:22] - read-write - - - - - MVFR0 - Describes the features provided by the Floating-point Extension - 0xEF40 - 0x60540601 - - - FPROUND - Indicates the rounding modes supported by the FP Extension - [31:28] - read-only - - - FPSQRT - Indicates the support for FP square root operations - [23:20] - read-only - - - FPDIVIDE - Indicates the support for FP divide operations - [19:16] - read-only - - - FPDP - Indicates support for FP double-precision operations - [11:8] - read-only - - - FPSP - Indicates support for FP single-precision operations - [7:4] - read-only - - - SIMDREG - Indicates size of FP register file - [3:0] - read-only - - - - - MVFR1 - Describes the features provided by the Floating-point Extension - 0xEF44 - 0x85000089 - - - FMAC - Indicates whether the FP Extension implements the fused multiply accumulate instructions - [31:28] - read-only - - - FPHP - Indicates whether the FP Extension implements half-precision FP conversion instructions - [27:24] - read-only - - - FPDNAN - Indicates whether the FP hardware implementation supports NaN propagation - [7:4] - read-only - - - FPFTZ - Indicates whether subnormals are always flushed-to-zero - [3:0] - read-only - - - - - MVFR2 - Describes the features provided by the Floating-point Extension - 0xEF48 - 0x00000060 - - - FPMISC - Indicates support for miscellaneous FP features - [7:4] - read-only - - - - - DDEVARCH - Provides CoreSight discovery information for the SCS - 0xEFBC - 0x47702A04 - - - ARCHITECT - Defines the architect of the component. Bits [31:28] are the JEP106 continuation code (JEP106 bank ID, minus 1) and bits [27:21] are the JEP106 ID code. - [31:21] - read-only - - - PRESENT - Defines that the DEVARCH register is present - [20:20] - read-only - - - REVISION - Defines the architecture revision of the component - [19:16] - read-only - - - ARCHVER - Defines the architecture version of the component - [15:12] - read-only - - - ARCHPART - Defines the architecture of the component - [11:0] - read-only - - - - - DDEVTYPE - Provides CoreSight discovery information for the SCS - 0xEFCC - 0x00000000 - - - SUB - Component sub-type - [7:4] - read-only - - - MAJOR - CoreSight major type - [3:0] - read-only - - - - - DPIDR4 - Provides CoreSight discovery information for the SCS - 0xEFD0 - 0x00000004 - - - SIZE - See CoreSight Architecture Specification - [7:4] - read-only - - - DES_2 - See CoreSight Architecture Specification - [3:0] - read-only - - - - - DPIDR5 - Provides CoreSight discovery information for the SCS - 0xEFD4 - 0x00000000 - - - DPIDR5 - [31:0] - read-write - - - - - DPIDR6 - Provides CoreSight discovery information for the SCS - 0xEFD8 - 0x00000000 - - - DPIDR6 - [31:0] - read-write - - - - - DPIDR7 - Provides CoreSight discovery information for the SCS - 0xEFDC - 0x00000000 - - - DPIDR7 - [31:0] - read-write - - - - - DPIDR0 - Provides CoreSight discovery information for the SCS - 0xEFE0 - 0x00000021 - - - PART_0 - See CoreSight Architecture Specification - [7:0] - read-only - - - - - DPIDR1 - Provides CoreSight discovery information for the SCS - 0xEFE4 - 0x000000BD - - - DES_0 - See CoreSight Architecture Specification - [7:4] - read-only - - - PART_1 - See CoreSight Architecture Specification - [3:0] - read-only - - - - - DPIDR2 - Provides CoreSight discovery information for the SCS - 0xEFE8 - 0x0000000B - - - REVISION - See CoreSight Architecture Specification - [7:4] - read-only - - - JEDEC - See CoreSight Architecture Specification - [3:3] - read-only - - - DES_1 - See CoreSight Architecture Specification - [2:0] - read-only - - - - - DPIDR3 - Provides CoreSight discovery information for the SCS - 0xEFEC - 0x00000000 - - - REVAND - See CoreSight Architecture Specification - [7:4] - read-only - - - CMOD - See CoreSight Architecture Specification - [3:0] - read-only - - - - - DCIDR0 - Provides CoreSight discovery information for the SCS - 0xEFF0 - 0x0000000D - - - PRMBL_0 - See CoreSight Architecture Specification - [7:0] - read-only - - - - - DCIDR1 - Provides CoreSight discovery information for the SCS - 0xEFF4 - 0x00000090 - - - CLASS - See CoreSight Architecture Specification - [7:4] - read-only - - - PRMBL_1 - See CoreSight Architecture Specification - [3:0] - read-only - - - - - DCIDR2 - Provides CoreSight discovery information for the SCS - 0xEFF8 - 0x00000005 - - - PRMBL_2 - See CoreSight Architecture Specification - [7:0] - read-only - - - - - DCIDR3 - Provides CoreSight discovery information for the SCS - 0xEFFC - 0x000000B1 - - - PRMBL_3 - See CoreSight Architecture Specification - [7:0] - read-only - - - - - TRCPRGCTLR - Programming Control Register - 0x41004 - 0x00000000 - - - EN - Trace Unit Enable - [0:0] - read-write - - - - - TRCSTATR - The TRCSTATR indicates the ETM-Teal status - 0x4100C - 0x00000000 - - - PMSTABLE - Indicates whether the ETM-Teal registers are stable and can be read - [1:1] - read-only - - - IDLE - Indicates that the trace unit is inactive - [0:0] - read-only - - - - - TRCCONFIGR - The TRCCONFIGR sets the basic tracing options for the trace unit - 0x41010 - 0x00000000 - - - RS - Return stack enable - [12:12] - read-write - - - TS - Global timestamp tracing - [11:11] - read-write - - - COND - Conditional instruction tracing - [10:5] - read-write - - - CCI - Cycle counting in instruction trace - [4:4] - read-write - - - BB - Branch broadcast mode - [3:3] - read-write - - - - - TRCEVENTCTL0R - The TRCEVENTCTL0R controls the tracing of events in the trace stream. The events also drive the ETM-Teal external outputs. - 0x41020 - 0x00000000 - - - TYPE1 - Selects the resource type for event 1 - [15:15] - read-write - - - SEL1 - Selects the resource number, based on the value of TYPE1: When TYPE1 is 0, selects a single selected resource from 0-15 defined by SEL1[2:0]. When TYPE1 is 1, selects a Boolean combined resource pair from 0-7 defined by SEL1[2:0] - [10:8] - read-write - - - TYPE0 - Selects the resource type for event 0 - [7:7] - read-write - - - SEL0 - Selects the resource number, based on the value of TYPE0: When TYPE1 is 0, selects a single selected resource from 0-15 defined by SEL0[2:0]. When TYPE1 is 1, selects a Boolean combined resource pair from 0-7 defined by SEL0[2:0] - [2:0] - read-write - - - - - TRCEVENTCTL1R - The TRCEVENTCTL1R controls how the events selected by TRCEVENTCTL0R behave - 0x41024 - 0x00000000 - - - LPOVERRIDE - Low power state behavior override - [12:12] - read-write - - - ATB - ATB enabled - [11:11] - read-write - - - INSTEN1 - One bit per event, to enable generation of an event element in the instruction trace stream when the selected event occurs - [1:1] - read-write - - - INSTEN0 - One bit per event, to enable generation of an event element in the instruction trace stream when the selected event occurs - [0:0] - read-write - - - - - TRCSTALLCTLR - The TRCSTALLCTLR enables ETM-Teal to stall the processor if the ETM-Teal FIFO goes over the programmed level to minimize risk of overflow - 0x4102C - 0x00000000 - - - INSTPRIORITY - Reserved, RES0 - [10:10] - read-only - - - ISTALL - Stall processor based on instruction trace buffer space - [8:8] - read-write - - - LEVEL - Threshold at which stalling becomes active. This provides four levels. This level can be varied to optimize the level of invasion caused by stalling, balanced against the risk of a FIFO overflow - [3:2] - read-write - - - - - TRCTSCTLR - The TRCTSCTLR controls the insertion of global timestamps into the trace stream. A timestamp is always inserted into the instruction trace stream - 0x41030 - 0x00000000 - - - TYPE0 - Selects the resource type for event 0 - [7:7] - read-write - - - SEL0 - Selects the resource number, based on the value of TYPE0: When TYPE1 is 0, selects a single selected resource from 0-15 defined by SEL0[2:0]. When TYPE1 is 1, selects a Boolean combined resource pair from 0-7 defined by SEL0[2:0] - [1:0] - read-write - - - - - TRCSYNCPR - The TRCSYNCPR specifies the period of trace synchronization of the trace streams. TRCSYNCPR defines a number of bytes of trace between requests for trace synchronization. This value is always a power of two - 0x41034 - 0x0000000A - - - PERIOD - Defines the number of bytes of trace between trace synchronization requests as a total of the number of bytes generated by the instruction stream. The number of bytes is 2N where N is the value of this field: - A value of zero disables these periodic trace synchronization requests, but does not disable other trace synchronization requests. - The minimum value that can be programmed, other than zero, is 8, providing a minimum trace synchronization period of 256 bytes. - The maximum value is 20, providing a maximum trace synchronization period of 2^20 bytes - [4:0] - read-only - - - - - TRCCCCTLR - The TRCCCCTLR sets the threshold value for instruction trace cycle counting. The threshold represents the minimum interval between cycle count trace packets - 0x41038 - 0x00000000 - - - THRESHOLD - Instruction trace cycle count threshold - [11:0] - read-write - - - - - TRCVICTLR - The TRCVICTLR controls instruction trace filtering - 0x41080 - 0x00000000 - - - EXLEVEL_S3 - In Secure state, each bit controls whether instruction tracing is enabled for the corresponding exception level - [19:19] - read-write - - - EXLEVEL_S0 - In Secure state, each bit controls whether instruction tracing is enabled for the corresponding exception level - [16:16] - read-write - - - TRCERR - Selects whether a system error exception must always be traced - [11:11] - read-write - - - TRCRESET - Selects whether a reset exception must always be traced - [10:10] - read-write - - - SSSTATUS - Indicates the current status of the start/stop logic - [9:9] - read-write - - - TYPE0 - Selects the resource type for event 0 - [7:7] - read-write - - - SEL0 - Selects the resource number, based on the value of TYPE0: When TYPE1 is 0, selects a single selected resource from 0-15 defined by SEL0[2:0]. When TYPE1 is 1, selects a Boolean combined resource pair from 0-7 defined by SEL0[2:0] - [1:0] - read-write - - - - - TRCCNTRLDVR0 - The TRCCNTRLDVR defines the reload value for the reduced function counter - 0x41140 - 0x00000000 - - - VALUE - Defines the reload value for the counter. This value is loaded into the counter each time the reload event occurs - [15:0] - read-write - - - - - TRCIDR8 - TRCIDR8 - 0x41180 - 0x00000000 - - - MAXSPEC - reads as `ImpDef - [31:0] - read-only - - - - - TRCIDR9 - TRCIDR9 - 0x41184 - 0x00000000 - - - NUMP0KEY - reads as `ImpDef - [31:0] - read-only - - - - - TRCIDR10 - TRCIDR10 - 0x41188 - 0x00000000 - - - NUMP1KEY - reads as `ImpDef - [31:0] - read-only - - - - - TRCIDR11 - TRCIDR11 - 0x4118C - 0x00000000 - - - NUMP1SPC - reads as `ImpDef - [31:0] - read-only - - - - - TRCIDR12 - TRCIDR12 - 0x41190 - 0x00000001 - - - NUMCONDKEY - reads as `ImpDef - [31:0] - read-only - - - - - TRCIDR13 - TRCIDR13 - 0x41194 - 0x00000000 - - - NUMCONDSPC - reads as `ImpDef - [31:0] - read-only - - - - - TRCIMSPEC - The TRCIMSPEC shows the presence of any IMPLEMENTATION SPECIFIC features, and enables any features that are provided - 0x411C0 - 0x00000000 - - - SUPPORT - Reserved, RES0 - [3:0] - read-only - - - - - TRCIDR0 - TRCIDR0 - 0x411E0 - 0x280006E1 - - - COMMOPT - reads as `ImpDef - [29:29] - read-only - - - TSSIZE - reads as `ImpDef - [28:24] - read-only - - - TRCEXDATA - reads as `ImpDef - [17:17] - read-only - - - QSUPP - reads as `ImpDef - [16:15] - read-only - - - QFILT - reads as `ImpDef - [14:14] - read-only - - - CONDTYPE - reads as `ImpDef - [13:12] - read-only - - - NUMEVENT - reads as `ImpDef - [11:10] - read-only - - - RETSTACK - reads as `ImpDef - [9:9] - read-only - - - TRCCCI - reads as `ImpDef - [7:7] - read-only - - - TRCCOND - reads as `ImpDef - [6:6] - read-only - - - TRCBB - reads as `ImpDef - [5:5] - read-only - - - TRCDATA - reads as `ImpDef - [4:3] - read-only - - - INSTP0 - reads as `ImpDef - [2:1] - read-only - - - RES1 - Reserved, RES1 - [0:0] - read-only - - - - - TRCIDR1 - TRCIDR1 - 0x411E4 - 0x4100F421 - - - DESIGNER - reads as `ImpDef - [31:24] - read-only - - - RES1 - Reserved, RES1 - [15:12] - read-only - - - TRCARCHMAJ - reads as 0b0100 - [11:8] - read-only - - - TRCARCHMIN - reads as 0b0000 - [7:4] - read-only - - - REVISION - reads as `ImpDef - [3:0] - read-only - - - - - TRCIDR2 - TRCIDR2 - 0x411E8 - 0x00000004 - - - CCSIZE - reads as `ImpDef - [28:25] - read-only - - - DVSIZE - reads as `ImpDef - [24:20] - read-only - - - DASIZE - reads as `ImpDef - [19:15] - read-only - - - VMIDSIZE - reads as `ImpDef - [14:10] - read-only - - - CIDSIZE - reads as `ImpDef - [9:5] - read-only - - - IASIZE - reads as `ImpDef - [4:0] - read-only - - - - - TRCIDR3 - TRCIDR3 - 0x411EC - 0x0F090004 - - - NOOVERFLOW - reads as `ImpDef - [31:31] - read-only - - - NUMPROC - reads as `ImpDef - [30:28] - read-only - - - SYSSTALL - reads as `ImpDef - [27:27] - read-only - - - STALLCTL - reads as `ImpDef - [26:26] - read-only - - - SYNCPR - reads as `ImpDef - [25:25] - read-only - - - TRCERR - reads as `ImpDef - [24:24] - read-only - - - EXLEVEL_NS - reads as `ImpDef - [23:20] - read-only - - - EXLEVEL_S - reads as `ImpDef - [19:16] - read-only - - - CCITMIN - reads as `ImpDef - [11:0] - read-only - - - - - TRCIDR4 - TRCIDR4 - 0x411F0 - 0x00114000 - - - NUMVMIDC - reads as `ImpDef - [31:28] - read-only - - - NUMCIDC - reads as `ImpDef - [27:24] - read-only - - - NUMSSCC - reads as `ImpDef - [23:20] - read-only - - - NUMRSPAIR - reads as `ImpDef - [19:16] - read-only - - - NUMPC - reads as `ImpDef - [15:12] - read-only - - - SUPPDAC - reads as `ImpDef - [8:8] - read-only - - - NUMDVC - reads as `ImpDef - [7:4] - read-only - - - NUMACPAIRS - reads as `ImpDef - [3:0] - read-only - - - - - TRCIDR5 - TRCIDR5 - 0x411F4 - 0x90C70004 - - - REDFUNCNTR - reads as `ImpDef - [31:31] - read-only - - - NUMCNTR - reads as `ImpDef - [30:28] - read-only - - - NUMSEQSTATE - reads as `ImpDef - [27:25] - read-only - - - LPOVERRIDE - reads as `ImpDef - [23:23] - read-only - - - ATBTRIG - reads as `ImpDef - [22:22] - read-only - - - TRACEIDSIZE - reads as 0x07 - [21:16] - read-only - - - NUMEXTINSEL - reads as `ImpDef - [11:9] - read-only - - - NUMEXTIN - reads as `ImpDef - [8:0] - read-only - - - - - TRCIDR6 - TRCIDR6 - 0x411F8 - 0x00000000 - - - TRCIDR6 - [31:0] - read-write - - - - - TRCIDR7 - TRCIDR7 - 0x411FC - 0x00000000 - - - TRCIDR7 - [31:0] - read-write - - - - - TRCRSCTLR2 - The TRCRSCTLR controls the trace resources - 0x41208 - 0x00000000 - - - PAIRINV - Inverts the result of a combined pair of resources. This bit is only implemented on the lower register for a pair of resource selectors - [21:21] - read-write - - - INV - Inverts the selected resources - [20:20] - read-write - - - GROUP - Selects a group of resource - [18:16] - read-write - - - SELECT - Selects one or more resources from the wanted group. One bit is provided per resource from the group - [7:0] - read-write - - - - - TRCRSCTLR3 - The TRCRSCTLR controls the trace resources - 0x4120C - 0x00000000 - - - PAIRINV - Inverts the result of a combined pair of resources. This bit is only implemented on the lower register for a pair of resource selectors - [21:21] - read-write - - - INV - Inverts the selected resources - [20:20] - read-write - - - GROUP - Selects a group of resource - [18:16] - read-write - - - SELECT - Selects one or more resources from the wanted group. One bit is provided per resource from the group - [7:0] - read-write - - - - - TRCSSCSR - Controls the corresponding single-shot comparator resource - 0x412A0 - 0x00000000 - - - STATUS - Single-shot status bit. Indicates if any of the comparators, that TRCSSCCRn.SAC or TRCSSCCRn.ARC selects, have matched - [31:31] - read-write - - - PC - Reserved, RES1 - [3:3] - read-only - - - DV - Reserved, RES0 - [2:2] - read-only - - - DA - Reserved, RES0 - [1:1] - read-only - - - INST - Reserved, RES0 - [0:0] - read-only - - - - - TRCSSPCICR - Selects the PE comparator inputs for Single-shot control - 0x412C0 - 0x00000000 - - - PC - Selects one or more PE comparator inputs for Single-shot control. TRCIDR4.NUMPC defines the size of the PC field. 1 bit is provided for each implemented PE comparator input. For example, if bit[1] == 1 this selects PE comparator input 1 for Single-shot control - [3:0] - read-write - - - - - TRCPDCR - Requests the system to provide power to the trace unit - 0x41310 - 0x00000000 - - - PU - Powerup request bit: - [3:3] - read-write - - - - - TRCPDSR - Returns the following information about the trace unit: - OS Lock status. - Core power domain status. - Power interruption status - 0x41314 - 0x00000003 - - - OSLK - OS Lock status bit: - [5:5] - read-only - - - STICKYPD - Sticky powerdown status bit. Indicates whether the trace register state is valid: - [1:1] - read-only - - - POWER - Power status bit: - [0:0] - read-only - - - - - TRCITATBIDR - Trace Integration ATB Identification Register - 0x41EE4 - 0x00000000 - - - ID - Trace ID - [6:0] - read-write - - - - - TRCITIATBINR - Trace Integration Instruction ATB In Register - 0x41EF4 - 0x00000000 - - - AFVALIDM - Integration Mode instruction AFVALIDM in - [1:1] - read-write - - - ATREADYM - Integration Mode instruction ATREADYM in - [0:0] - read-write - - - - - TRCITIATBOUTR - Trace Integration Instruction ATB Out Register - 0x41EFC - 0x00000000 - - - AFREADY - Integration Mode instruction AFREADY out - [1:1] - read-write - - - ATVALID - Integration Mode instruction ATVALID out - [0:0] - read-write - - - - - TRCCLAIMSET - Claim Tag Set Register - 0x41FA0 - 0x0000000F - - - SET3 - When a write to one of these bits occurs, with the value: - [3:3] - read-write - - - SET2 - When a write to one of these bits occurs, with the value: - [2:2] - read-write - - - SET1 - When a write to one of these bits occurs, with the value: - [1:1] - read-write - - - SET0 - When a write to one of these bits occurs, with the value: - [0:0] - read-write - - - - - TRCCLAIMCLR - Claim Tag Clear Register - 0x41FA4 - 0x00000000 - - - CLR3 - When a write to one of these bits occurs, with the value: - [3:3] - read-write - - - CLR2 - When a write to one of these bits occurs, with the value: - [2:2] - read-write - - - CLR1 - When a write to one of these bits occurs, with the value: - [1:1] - read-write - - - CLR0 - When a write to one of these bits occurs, with the value: - [0:0] - read-write - - - - - TRCAUTHSTATUS - Returns the level of tracing that the trace unit can support - 0x41FB8 - 0x00000000 - - - SNID - Indicates whether the system enables the trace unit to support Secure non-invasive debug: - [7:6] - read-only - - - SID - Indicates whether the trace unit supports Secure invasive debug: - [5:4] - read-only - - - NSNID - Indicates whether the system enables the trace unit to support Non-secure non-invasive debug: - [3:2] - read-only - - - NSID - Indicates whether the trace unit supports Non-secure invasive debug: - [1:0] - read-only - - - - - TRCDEVARCH - TRCDEVARCH - 0x41FBC - 0x47724A13 - - - ARCHITECT - reads as 0b01000111011 - [31:21] - read-only - - - PRESENT - reads as 0b1 - [20:20] - read-only - - - REVISION - reads as 0b0000 - [19:16] - read-only - - - ARCHID - reads as 0b0100101000010011 - [15:0] - read-only - - - - - TRCDEVID - TRCDEVID - 0x41FC8 - 0x00000000 - - - TRCDEVID - [31:0] - read-write - - - - - TRCDEVTYPE - TRCDEVTYPE - 0x41FCC - 0x00000013 - - - SUB - reads as 0b0001 - [7:4] - read-only - - - MAJOR - reads as 0b0011 - [3:0] - read-only - - - - - TRCPIDR4 - TRCPIDR4 - 0x41FD0 - 0x00000004 - - - SIZE - reads as `ImpDef - [7:4] - read-only - - - DES_2 - reads as `ImpDef - [3:0] - read-only - - - - - TRCPIDR5 - TRCPIDR5 - 0x41FD4 - 0x00000000 - - - TRCPIDR5 - [31:0] - read-write - - - - - TRCPIDR6 - TRCPIDR6 - 0x41FD8 - 0x00000000 - - - TRCPIDR6 - [31:0] - read-write - - - - - TRCPIDR7 - TRCPIDR7 - 0x41FDC - 0x00000000 - - - TRCPIDR7 - [31:0] - read-write - - - - - TRCPIDR0 - TRCPIDR0 - 0x41FE0 - 0x00000021 - - - PART_0 - reads as `ImpDef - [7:0] - read-only - - - - - TRCPIDR1 - TRCPIDR1 - 0x41FE4 - 0x000000BD - - - DES_0 - reads as `ImpDef - [7:4] - read-only - - - PART_0 - reads as `ImpDef - [3:0] - read-only - - - - - TRCPIDR2 - TRCPIDR2 - 0x41FE8 - 0x0000002B - - - REVISION - reads as `ImpDef - [7:4] - read-only - - - JEDEC - reads as 0b1 - [3:3] - read-only - - - DES_0 - reads as `ImpDef - [2:0] - read-only - - - - - TRCPIDR3 - TRCPIDR3 - 0x41FEC - 0x00000000 - - - REVAND - reads as `ImpDef - [7:4] - read-only - - - CMOD - reads as `ImpDef - [3:0] - read-only - - - - - TRCCIDR0 - TRCCIDR0 - 0x41FF0 - 0x0000000D - - - PRMBL_0 - reads as 0b00001101 - [7:0] - read-only - - - - - TRCCIDR1 - TRCCIDR1 - 0x41FF4 - 0x00000090 - - - CLASS - reads as 0b1001 - [7:4] - read-only - - - PRMBL_1 - reads as 0b0000 - [3:0] - read-only - - - - - TRCCIDR2 - TRCCIDR2 - 0x41FF8 - 0x00000005 - - - PRMBL_2 - reads as 0b00000101 - [7:0] - read-only - - - - - TRCCIDR3 - TRCCIDR3 - 0x41FFC - 0x000000B1 - - - PRMBL_3 - reads as 0b10110001 - [7:0] - read-only - - - - - CTICONTROL - CTI Control Register - 0x42000 - 0x00000000 - - - GLBEN - Enables or disables the CTI - [0:0] - read-write - - - - - CTIINTACK - CTI Interrupt Acknowledge Register - 0x42010 - 0x00000000 - - - INTACK - Acknowledges the corresponding ctitrigout output. There is one bit of the register for each ctitrigout output. When a 1 is written to a bit in this register, the corresponding ctitrigout is acknowledged, causing it to be cleared. - [7:0] - read-write - - - - - CTIAPPSET - CTI Application Trigger Set Register - 0x42014 - 0x00000000 - - - APPSET - Setting a bit HIGH generates a channel event for the selected channel. There is one bit of the register for each channel - [3:0] - read-write - - - - - CTIAPPCLEAR - CTI Application Trigger Clear Register - 0x42018 - 0x00000000 - - - APPCLEAR - Sets the corresponding bits in the CTIAPPSET to 0. There is one bit of the register for each channel. - [3:0] - read-write - - - - - CTIAPPPULSE - CTI Application Pulse Register - 0x4201C - 0x00000000 - - - APPULSE - Setting a bit HIGH generates a channel event pulse for the selected channel. There is one bit of the register for each channel. - [3:0] - read-write - - - - - CTIINEN0 - CTI Trigger to Channel Enable Registers - 0x42020 - 0x00000000 - - - TRIGINEN - Enables a cross trigger event to the corresponding channel when a ctitrigin input is activated. There is one bit of the field for each of the four channels - [3:0] - read-write - - - - - CTIINEN1 - CTI Trigger to Channel Enable Registers - 0x42024 - 0x00000000 - - - TRIGINEN - Enables a cross trigger event to the corresponding channel when a ctitrigin input is activated. There is one bit of the field for each of the four channels - [3:0] - read-write - - - - - CTIINEN2 - CTI Trigger to Channel Enable Registers - 0x42028 - 0x00000000 - - - TRIGINEN - Enables a cross trigger event to the corresponding channel when a ctitrigin input is activated. There is one bit of the field for each of the four channels - [3:0] - read-write - - - - - CTIINEN3 - CTI Trigger to Channel Enable Registers - 0x4202C - 0x00000000 - - - TRIGINEN - Enables a cross trigger event to the corresponding channel when a ctitrigin input is activated. There is one bit of the field for each of the four channels - [3:0] - read-write - - - - - CTIINEN4 - CTI Trigger to Channel Enable Registers - 0x42030 - 0x00000000 - - - TRIGINEN - Enables a cross trigger event to the corresponding channel when a ctitrigin input is activated. There is one bit of the field for each of the four channels - [3:0] - read-write - - - - - CTIINEN5 - CTI Trigger to Channel Enable Registers - 0x42034 - 0x00000000 - - - TRIGINEN - Enables a cross trigger event to the corresponding channel when a ctitrigin input is activated. There is one bit of the field for each of the four channels - [3:0] - read-write - - - - - CTIINEN6 - CTI Trigger to Channel Enable Registers - 0x42038 - 0x00000000 - - - TRIGINEN - Enables a cross trigger event to the corresponding channel when a ctitrigin input is activated. There is one bit of the field for each of the four channels - [3:0] - read-write - - - - - CTIINEN7 - CTI Trigger to Channel Enable Registers - 0x4203C - 0x00000000 - - - TRIGINEN - Enables a cross trigger event to the corresponding channel when a ctitrigin input is activated. There is one bit of the field for each of the four channels - [3:0] - read-write - - - - - CTIOUTEN0 - CTI Trigger to Channel Enable Registers - 0x420A0 - 0x00000000 - - - TRIGOUTEN - Enables a cross trigger event to ctitrigout when the corresponding channel is activated. There is one bit of the field for each of the four channels. - [3:0] - read-write - - - - - CTIOUTEN1 - CTI Trigger to Channel Enable Registers - 0x420A4 - 0x00000000 - - - TRIGOUTEN - Enables a cross trigger event to ctitrigout when the corresponding channel is activated. There is one bit of the field for each of the four channels. - [3:0] - read-write - - - - - CTIOUTEN2 - CTI Trigger to Channel Enable Registers - 0x420A8 - 0x00000000 - - - TRIGOUTEN - Enables a cross trigger event to ctitrigout when the corresponding channel is activated. There is one bit of the field for each of the four channels. - [3:0] - read-write - - - - - CTIOUTEN3 - CTI Trigger to Channel Enable Registers - 0x420AC - 0x00000000 - - - TRIGOUTEN - Enables a cross trigger event to ctitrigout when the corresponding channel is activated. There is one bit of the field for each of the four channels. - [3:0] - read-write - - - - - CTIOUTEN4 - CTI Trigger to Channel Enable Registers - 0x420B0 - 0x00000000 - - - TRIGOUTEN - Enables a cross trigger event to ctitrigout when the corresponding channel is activated. There is one bit of the field for each of the four channels. - [3:0] - read-write - - - - - CTIOUTEN5 - CTI Trigger to Channel Enable Registers - 0x420B4 - 0x00000000 - - - TRIGOUTEN - Enables a cross trigger event to ctitrigout when the corresponding channel is activated. There is one bit of the field for each of the four channels. - [3:0] - read-write - - - - - CTIOUTEN6 - CTI Trigger to Channel Enable Registers - 0x420B8 - 0x00000000 - - - TRIGOUTEN - Enables a cross trigger event to ctitrigout when the corresponding channel is activated. There is one bit of the field for each of the four channels. - [3:0] - read-write - - - - - CTIOUTEN7 - CTI Trigger to Channel Enable Registers - 0x420BC - 0x00000000 - - - TRIGOUTEN - Enables a cross trigger event to ctitrigout when the corresponding channel is activated. There is one bit of the field for each of the four channels. - [3:0] - read-write - - - - - CTITRIGINSTATUS - CTI Trigger to Channel Enable Registers - 0x42130 - 0x00000000 - - - TRIGINSTATUS - Shows the status of the ctitrigin inputs. There is one bit of the field for each trigger input.Because the register provides a view of the raw ctitrigin inputs, the reset value is UNKNOWN. - [7:0] - read-only - - - - - CTITRIGOUTSTATUS - CTI Trigger In Status Register - 0x42134 - 0x00000000 - - - TRIGOUTSTATUS - Shows the status of the ctitrigout outputs. There is one bit of the field for each trigger output. - [7:0] - read-only - - - - - CTICHINSTATUS - CTI Channel In Status Register - 0x42138 - 0x00000000 - - - CTICHOUTSTATUS - Shows the status of the ctichout outputs. There is one bit of the field for each channel output - [3:0] - read-only - - - - - CTIGATE - Enable CTI Channel Gate register - 0x42140 - 0x0000000F - - - CTIGATEEN3 - Enable ctichout3. Set to 0 to disable channel propagation. - [3:3] - read-write - - - CTIGATEEN2 - Enable ctichout2. Set to 0 to disable channel propagation. - [2:2] - read-write - - - CTIGATEEN1 - Enable ctichout1. Set to 0 to disable channel propagation. - [1:1] - read-write - - - CTIGATEEN0 - Enable ctichout0. Set to 0 to disable channel propagation. - [0:0] - read-write - - - - - ASICCTL - External Multiplexer Control register - 0x42144 - 0x00000000 - - - ASICCTL - [31:0] - read-write - - - - - ITCHOUT - Integration Test Channel Output register - 0x42EE4 - 0x00000000 - - - CTCHOUT - Sets the value of the ctichout outputs - [3:0] - read-write - - - - - ITTRIGOUT - Integration Test Trigger Output register - 0x42EE8 - 0x00000000 - - - CTTRIGOUT - Sets the value of the ctitrigout outputs - [7:0] - read-write - - - - - ITCHIN - Integration Test Channel Input register - 0x42EF4 - 0x00000000 - - - CTCHIN - Reads the value of the ctichin inputs. - [3:0] - read-only - - - - - ITCTRL - Integration Mode Control register - 0x42F00 - 0x00000000 - - - IME - Integration Mode Enable - [0:0] - read-write - - - - - DEVARCH - Device Architecture register - 0x42FBC - 0x47701A14 - - - ARCHITECT - Indicates the component architect - [31:21] - read-only - - - PRESENT - Indicates whether the DEVARCH register is present - [20:20] - read-only - - - REVISION - Indicates the architecture revision - [19:16] - read-only - - - ARCHID - Indicates the component - [15:0] - read-only - - - - - DEVID - Device Configuration register - 0x42FC8 - 0x00040800 - - - NUMCH - Number of ECT channels available - [19:16] - read-only - - - NUMTRIG - Number of ECT triggers available. - [15:8] - read-only - - - EXTMUXNUM - Indicates the number of multiplexers available on Trigger Inputs and Trigger Outputs that are using asicctl. The default value of 0b00000 indicates that no multiplexing is present. This value of this bit depends on the Verilog define EXTMUXNUM that you must change accordingly. - [4:0] - read-only - - - - - DEVTYPE - Device Type Identifier register - 0x42FCC - 0x00000014 - - - SUB - Sub-classification of the type of the debug component as specified in the ARM Architecture Specification within the major classification as specified in the MAJOR field. - [7:4] - read-only - - - MAJOR - Major classification of the type of the debug component as specified in the ARM Architecture Specification for this debug and trace component. - [3:0] - read-only - - - - - PIDR4 - CoreSight Peripheral ID4 - 0x42FD0 - 0x00000004 - - - SIZE - Always 0b0000. Indicates that the device only occupies 4KB of memory - [7:4] - read-only - - - DES_2 - Together, PIDR1.DES_0, PIDR2.DES_1, and PIDR4.DES_2 identify the designer of the component. - [3:0] - read-only - - - - - PIDR5 - CoreSight Peripheral ID5 - 0x42FD4 - 0x00000000 - - - PIDR5 - [31:0] - read-write - - - - - PIDR6 - CoreSight Peripheral ID6 - 0x42FD8 - 0x00000000 - - - PIDR6 - [31:0] - read-write - - - - - PIDR7 - CoreSight Peripheral ID7 - 0x42FDC - 0x00000000 - - - PIDR7 - [31:0] - read-write - - - - - PIDR0 - CoreSight Peripheral ID0 - 0x42FE0 - 0x00000021 - - - PART_0 - Bits[7:0] of the 12-bit part number of the component. The designer of the component assigns this part number. - [7:0] - read-only - - - - - PIDR1 - CoreSight Peripheral ID1 - 0x42FE4 - 0x000000BD - - - DES_0 - Together, PIDR1.DES_0, PIDR2.DES_1, and PIDR4.DES_2 identify the designer of the component. - [7:4] - read-only - - - PART_1 - Bits[11:8] of the 12-bit part number of the component. The designer of the component assigns this part number. - [3:0] - read-only - - - - - PIDR2 - CoreSight Peripheral ID2 - 0x42FE8 - 0x0000000B - - - REVISION - This device is at r1p0 - [7:4] - read-only - - - JEDEC - Always 1. Indicates that the JEDEC-assigned designer ID is used. - [3:3] - read-only - - - DES_1 - Together, PIDR1.DES_0, PIDR2.DES_1, and PIDR4.DES_2 identify the designer of the component. - [2:0] - read-only - - - - - PIDR3 - CoreSight Peripheral ID3 - 0x42FEC - 0x00000000 - - - REVAND - Indicates minor errata fixes specific to the revision of the component being used, for example metal fixes after implementation. In most cases, this field is 0b0000. ARM recommends that the component designers ensure that a metal fix can change this field if required, for example, by driving it from registers that reset to 0b0000. - [7:4] - read-only - - - CMOD - Customer Modified. Indicates whether the customer has modified the behavior of the component. In most cases, this field is 0b0000. Customers change this value when they make authorized modifications to this component. - [3:0] - read-only - - - - - CIDR0 - CoreSight Component ID0 - 0x42FF0 - 0x0000000D - - - PRMBL_0 - Preamble[0]. Contains bits[7:0] of the component identification code - [7:0] - read-only - - - - - CIDR1 - CoreSight Component ID1 - 0x42FF4 - 0x00000090 - - - CLASS - Class of the component, for example, whether the component is a ROM table or a generic CoreSight component. Contains bits[15:12] of the component identification code. - [7:4] - read-only - - - PRMBL_1 - Preamble[1]. Contains bits[11:8] of the component identification code. - [3:0] - read-only - - - - - CIDR2 - CoreSight Component ID2 - 0x42FF8 - 0x00000005 - - - PRMBL_2 - Preamble[2]. Contains bits[23:16] of the component identification code. - [7:0] - read-only - - - - - CIDR3 - CoreSight Component ID3 - 0x42FFC - 0x000000B1 - - - PRMBL_3 - Preamble[3]. Contains bits[31:24] of the component identification code. - [7:0] - read-only - - - - - - - PPB_NS - 0xE0020000 - - - QMI - QSPI Memory Interface. - - Provides a memory-mapped interface to up to two SPI/DSPI/QSPI flash or PSRAM devices. Also provides a serial interface for programming and configuration of the external device. - 0x400D0000 - - 0x0 - 0x54 - registers - - - - DIRECT_CSR - Control and status for direct serial mode - - Direct serial mode allows the processor to send and receive raw serial frames, for programming, configuration and control of the external memory devices. Only SPI mode 0 (CPOL=0 CPHA=0) is supported. - 0x0 - 0x01800000 - - - RXDELAY - Delay the read data sample timing, in units of one half of a system clock cycle. (Not necessarily half of an SCK cycle.) - [31:30] - read-write - - - CLKDIV - Clock divisor for direct serial mode. Divisors of 1..255 are encoded directly, and the maximum divisor of 256 is encoded by a value of CLKDIV=0. - - The clock divisor can be changed on-the-fly by software, without halting or otherwise coordinating with the serial interface. The serial interface will sample the latest clock divisor each time it begins the transmission of a new byte. - [29:22] - read-write - - - RXLEVEL - Current level of DIRECT_RX FIFO - [20:18] - read-only - - - RXFULL - When 1, the DIRECT_RX FIFO is currently full. The serial interface will be stalled until data is popped; the interface will not begin a new serial frame when the DIRECT_TX FIFO is empty or the DIRECT_RX FIFO is full. - [17:17] - read-only - - - RXEMPTY - When 1, the DIRECT_RX FIFO is currently empty. If the processor attempts to read more data, the FIFO state is not affected, but the value returned to the processor is undefined. - [16:16] - read-only - - - TXLEVEL - Current level of DIRECT_TX FIFO - [14:12] - read-only - - - TXEMPTY - When 1, the DIRECT_TX FIFO is currently empty. Unless the processor pushes more data, transmission will stop and BUSY will go low once the current 8-bit serial frame completes. - [11:11] - read-only - - - TXFULL - When 1, the DIRECT_TX FIFO is currently full. If the processor tries to write more data, that data will be ignored. - [10:10] - read-only - - - AUTO_CS1N - When 1, automatically assert the CS1n chip select line whenever the BUSY flag is set. - [7:7] - read-write - - - AUTO_CS0N - When 1, automatically assert the CS0n chip select line whenever the BUSY flag is set. - [6:6] - read-write - - - ASSERT_CS1N - When 1, assert (i.e. drive low) the CS1n chip select line. - - Note that this applies even when DIRECT_CSR_EN is 0. - [3:3] - read-write - - - ASSERT_CS0N - When 1, assert (i.e. drive low) the CS0n chip select line. - - Note that this applies even when DIRECT_CSR_EN is 0. - [2:2] - read-write - - - BUSY - Direct mode busy flag. If 1, data is currently being shifted in/out (or would be if the interface were not stalled on the RX FIFO), and the chip select must not yet be deasserted. - - The busy flag will also be set to 1 if a memory-mapped transfer is still in progress when direct mode is enabled. Direct mode blocks new memory-mapped transfers, but can't halt a transfer that is already in progress. If there is a chance that memory-mapped transfers may be in progress, the busy flag should be polled for 0 before asserting the chip select. - - (In practice you will usually discover this timing condition through other means, because any subsequent memory-mapped transfers when direct mode is enabled will return bus errors, which are difficult to ignore.) - [1:1] - read-only - - - EN - Enable direct mode. - - In direct mode, software controls the chip select lines, and can perform direct SPI transfers by pushing data to the DIRECT_TX FIFO, and popping the same amount of data from the DIRECT_RX FIFO. - - Memory-mapped accesses will generate bus errors when direct serial mode is enabled. - [0:0] - read-write - - - - - DIRECT_TX - Transmit FIFO for direct mode - 0x4 - 0x00000000 - - - NOPUSH - Inhibit the RX FIFO push that would correspond to this TX FIFO entry. - - Useful to avoid garbage appearing in the RX FIFO when pushing the command at the beginning of a SPI transfer. - [20:20] - write-only - - - OE - Output enable (active-high). For single width (SPI), this field is ignored, and SD0 is always set to output, with SD1 always set to input. - - For dual and quad width (DSPI/QSPI), this sets whether the relevant SDx pads are set to output whilst transferring this FIFO record. In this case the command/address should have OE set, and the data transfer should have OE set or clear depending on the direction of the transfer. - [19:19] - write-only - - - DWIDTH - Data width. If 0, hardware will transmit the 8 LSBs of the DIRECT_TX DATA field, and return an 8-bit value in the 8 LSBs of DIRECT_RX. If 1, the full 16-bit width is used. 8-bit and 16-bit transfers can be mixed freely. - [18:18] - write-only - - - IWIDTH - Configure whether this FIFO record is transferred with single/dual/quad interface width (0/1/2). Different widths can be mixed freely. - [17:16] - write-only - - - S - Single width - 0 - - - D - Dual width - 1 - - - Q - Quad width - 2 - - - - - DATA - Data pushed here will be clocked out falling edges of SCK (or before the very first rising edge of SCK, if this is the first pulse). For each byte clocked out, the interface will simultaneously sample one byte, on rising edges of SCK, and push this to the DIRECT_RX FIFO. - - For 16-bit data, the least-significant byte is transmitted first. - [15:0] - write-only - - - - - DIRECT_RX - Receive FIFO for direct mode - 0x8 - 0x00000000 - - - DIRECT_RX - With each byte clocked out on the serial interface, one byte will simultaneously be clocked in, and will appear in this FIFO. The serial interface will stall when this FIFO is full, to avoid dropping data. - - When 16-bit data is pushed into the TX FIFO, the corresponding RX FIFO push will also contain 16 bits of data. The least-significant byte is the first one received. - [15:0] - read-only - modify - - - - - M0_TIMING - Timing configuration register for memory address window 0. - 0xC - 0x40000004 - - - COOLDOWN - Chip select cooldown period. When a memory transfer finishes, the chip select remains asserted for 64 x COOLDOWN system clock cycles, plus half an SCK clock period (rounded up for odd SCK divisors). After this cooldown expires, the chip select is always deasserted to save power. - - If the next memory access arrives within the cooldown period, the QMI may be able to append more SCK cycles to the currently ongoing SPI transfer, rather than starting a new transfer. This reduces access latency and increases bus throughput. - - Specifically, the next access must be in the same direction (read/write), access the same memory window (chip select 0/1), and follow sequentially the address of the last transfer. If any of these are false, the new access will first deassert the chip select, then begin a new transfer. - - If COOLDOWN is 0, the address alignment configured by PAGEBREAK has been reached, or the total chip select assertion limit MAX_SELECT has been reached, the cooldown period is skipped, and the chip select will always be deasserted one half SCK period after the transfer finishes. - [31:30] - read-write - - - PAGEBREAK - When page break is enabled, chip select will automatically deassert when crossing certain power-of-2-aligned address boundaries. The next access will always begin a new read/write SPI burst, even if the address of the next access follows in sequence with the last access before the page boundary. - - Some flash and PSRAM devices forbid crossing page boundaries with a single read/write transfer, or restrict the operating frequency for transfers that do cross page a boundary. This option allows the QMI to safely support those devices. - - This field has no effect when COOLDOWN is disabled. - [29:28] - read-write - - - NONE - No page boundary is enforced - 0 - - - 256 - Break bursts crossing a 256-byte page boundary - 1 - - - 1024 - Break bursts crossing a 1024-byte quad-page boundary - 2 - - - 4096 - Break bursts crossing a 4096-byte sector boundary - 3 - - - - - SELECT_SETUP - Add up to one additional system clock cycle of setup between chip select assertion and the first rising edge of SCK. - - The default setup time is one half SCK period, which is usually sufficient except for very high SCK frequencies with some flash devices. - [25:25] - read-write - - - SELECT_HOLD - Add up to three additional system clock cycles of active hold between the last falling edge of SCK and the deassertion of this window's chip select. - - The default hold time is one system clock cycle. Note that flash datasheets usually give chip select active hold time from the last *rising* edge of SCK, and so even zero hold from the last falling edge would be safe. - - Note that this is a minimum hold time guaranteed by the QMI: the actual chip select active hold may be slightly longer for read transfers with low clock divisors and/or high sample delays. Specifically, if the point two cycles after the last RX data sample is later than the last SCK falling edge, then the hold time is measured from *this* point. - - Note also that, in case the final SCK pulse is masked to save energy (true for non-DTR reads when COOLDOWN is disabled or PAGE_BREAK is reached), all of QMI's timing logic behaves as though the clock pulse were still present. The SELECT_HOLD time is applied from the point where the last SCK falling edge would be if the clock pulse were not masked. - [24:23] - read-write - - - MAX_SELECT - Enforce a maximum assertion duration for this window's chip select, in units of 64 system clock cycles. If 0, the QMI is permitted to keep the chip select asserted indefinitely when servicing sequential memory accesses (see COOLDOWN). - - This feature is required to meet timing constraints of PSRAM devices, which specify a maximum chip select assertion so they can perform DRAM refresh cycles. See also MIN_DESELECT, which can enforce a minimum deselect time. - - If a memory access is in progress at the time MAX_SELECT is reached, the QMI will wait for the access to complete before deasserting the chip select. This additional time must be accounted for to calculate a safe MAX_SELECT value. In the worst case, this may be a fully-formed serial transfer, including command prefix and address, with a data payload as large as one cache line. - [22:17] - read-write - - - MIN_DESELECT - After this window's chip select is deasserted, it remains deasserted for half an SCK cycle (rounded up to an integer number of system clock cycles), plus MIN_DESELECT additional system clock cycles, before the QMI reasserts either chip select pin. - - Nonzero values may be required for PSRAM devices which enforce a longer minimum CS deselect time, so that they can perform internal DRAM refresh cycles whilst deselected. - [16:12] - read-write - - - RXDELAY - Delay the read data sample timing, in units of one half of a system clock cycle. (Not necessarily half of an SCK cycle.) An RXDELAY of 0 means the sample is captured at the SDI input registers simultaneously with the rising edge of SCK launched from the SCK output register. - - At higher SCK frequencies, RXDELAY may need to be increased to account for the round trip delay of the pads, and the clock-to-Q delay of the QSPI memory device. - [10:8] - read-write - - - CLKDIV - Clock divisor. Odd and even divisors are supported. Defines the SCK clock period in units of 1 system clock cycle. Divisors 1..255 are encoded directly, and a divisor of 256 is encoded with a value of CLKDIV=0. - - The clock divisor can be changed on-the-fly, even when the QMI is currently accessing memory in this address window. All other parameters must only be changed when the QMI is idle. - - If software is increasing CLKDIV in anticipation of an increase in the system clock frequency, a dummy access to either memory window (and appropriate processor barriers/fences) must be inserted after the Mx_TIMING write to ensure the SCK divisor change is in effect _before_ the system clock is changed. - [7:0] - read-write - - - - - M0_RFMT - Read transfer format configuration for memory address window 0. - - Configure the bus width of each transfer phase individually, and configure the length or presence of the command prefix, command suffix and dummy/turnaround transfer phases. Only 24-bit addresses are supported. - - The reset value of the M0_RFMT register is configured to support a basic 03h serial read transfer with no additional configuration. - 0x10 - 0x00001000 - - - DTR - Enable double transfer rate (DTR) for read commands: address, suffix and read data phases are active on both edges of SCK. SDO data is launched centre-aligned on each SCK edge, and SDI data is captured on the SCK edge that follows its launch. - - DTR is implemented by halving the clock rate; SCK has a period of 2 x CLK_DIV throughout the transfer. The prefix and dummy phases are still single transfer rate. - - If the suffix is quad-width, it must be 0 or 8 bits in length, to ensure an even number of SCK edges. - [28:28] - read-write - - - DUMMY_LEN - Length of dummy phase between command suffix and data phase, in units of 4 bits. (i.e. 1 cycle for quad width, 2 for dual, 4 for single) - [18:16] - read-write - - - NONE - No dummy phase - 0 - - - 4 - 4 dummy bits - 1 - - - 8 - 8 dummy bits - 2 - - - 12 - 12 dummy bits - 3 - - - 16 - 16 dummy bits - 4 - - - 20 - 20 dummy bits - 5 - - - 24 - 24 dummy bits - 6 - - - 28 - 28 dummy bits - 7 - - - - - SUFFIX_LEN - Length of post-address command suffix, in units of 4 bits. (i.e. 1 cycle for quad width, 2 for dual, 4 for single) - - Only values of 0 and 8 bits are supported. - [15:14] - read-write - - - NONE - No suffix - 0 - - - 8 - 8-bit suffix - 2 - - - - - PREFIX_LEN - Length of command prefix, in units of 8 bits. (i.e. 2 cycles for quad width, 4 for dual, 8 for single) - [12:12] - read-write - - - NONE - No prefix - 0 - - - 8 - 8-bit prefix - 1 - - - - - DATA_WIDTH - The width used for the data transfer - [9:8] - read-write - - - S - Single width - 0 - - - D - Dual width - 1 - - - Q - Quad width - 2 - - - - - DUMMY_WIDTH - The width used for the dummy phase, if any. - - If width is single, SD0/MOSI is held asserted low during the dummy phase, and SD1...SD3 are tristated. If width is dual/quad, all IOs are tristated during the dummy phase. - [7:6] - read-write - - - S - Single width - 0 - - - D - Dual width - 1 - - - Q - Quad width - 2 - - - - - SUFFIX_WIDTH - The width used for the post-address command suffix, if any - [5:4] - read-write - - - S - Single width - 0 - - - D - Dual width - 1 - - - Q - Quad width - 2 - - - - - ADDR_WIDTH - The transfer width used for the address. The address phase always transfers 24 bits in total. - [3:2] - read-write - - - S - Single width - 0 - - - D - Dual width - 1 - - - Q - Quad width - 2 - - - - - PREFIX_WIDTH - The transfer width used for the command prefix, if any - [1:0] - read-write - - - S - Single width - 0 - - - D - Dual width - 1 - - - Q - Quad width - 2 - - - - - - - M0_RCMD - Command constants used for reads from memory address window 0. - - The reset value of the M0_RCMD register is configured to support a basic 03h serial read transfer with no additional configuration. - 0x14 - 0x0000A003 - - - SUFFIX - The command suffix bits following the address, if Mx_RFMT_SUFFIX_LEN is nonzero. - [15:8] - read-write - - - PREFIX - The command prefix bits to prepend on each new transfer, if Mx_RFMT_PREFIX_LEN is nonzero. - [7:0] - read-write - - - - - M0_WFMT - Write transfer format configuration for memory address window 0. - - Configure the bus width of each transfer phase individually, and configure the length or presence of the command prefix, command suffix and dummy/turnaround transfer phases. Only 24-bit addresses are supported. - - The reset value of the M0_WFMT register is configured to support a basic 02h serial write transfer. However, writes to this window must first be enabled via the XIP_CTRL_WRITABLE_M0 bit, as XIP memory is read-only by default. - 0x18 - 0x00001000 - - - DTR - Enable double transfer rate (DTR) for write commands: address, suffix and write data phases are active on both edges of SCK. SDO data is launched centre-aligned on each SCK edge, and SDI data is captured on the SCK edge that follows its launch. - - DTR is implemented by halving the clock rate; SCK has a period of 2 x CLK_DIV throughout the transfer. The prefix and dummy phases are still single transfer rate. - - If the suffix is quad-width, it must be 0 or 8 bits in length, to ensure an even number of SCK edges. - [28:28] - read-write - - - DUMMY_LEN - Length of dummy phase between command suffix and data phase, in units of 4 bits. (i.e. 1 cycle for quad width, 2 for dual, 4 for single) - [18:16] - read-write - - - NONE - No dummy phase - 0 - - - 4 - 4 dummy bits - 1 - - - 8 - 8 dummy bits - 2 - - - 12 - 12 dummy bits - 3 - - - 16 - 16 dummy bits - 4 - - - 20 - 20 dummy bits - 5 - - - 24 - 24 dummy bits - 6 - - - 28 - 28 dummy bits - 7 - - - - - SUFFIX_LEN - Length of post-address command suffix, in units of 4 bits. (i.e. 1 cycle for quad width, 2 for dual, 4 for single) - - Only values of 0 and 8 bits are supported. - [15:14] - read-write - - - NONE - No suffix - 0 - - - 8 - 8-bit suffix - 2 - - - - - PREFIX_LEN - Length of command prefix, in units of 8 bits. (i.e. 2 cycles for quad width, 4 for dual, 8 for single) - [12:12] - read-write - - - NONE - No prefix - 0 - - - 8 - 8-bit prefix - 1 - - - - - DATA_WIDTH - The width used for the data transfer - [9:8] - read-write - - - S - Single width - 0 - - - D - Dual width - 1 - - - Q - Quad width - 2 - - - - - DUMMY_WIDTH - The width used for the dummy phase, if any. - - If width is single, SD0/MOSI is held asserted low during the dummy phase, and SD1...SD3 are tristated. If width is dual/quad, all IOs are tristated during the dummy phase. - [7:6] - read-write - - - S - Single width - 0 - - - D - Dual width - 1 - - - Q - Quad width - 2 - - - - - SUFFIX_WIDTH - The width used for the post-address command suffix, if any - [5:4] - read-write - - - S - Single width - 0 - - - D - Dual width - 1 - - - Q - Quad width - 2 - - - - - ADDR_WIDTH - The transfer width used for the address. The address phase always transfers 24 bits in total. - [3:2] - read-write - - - S - Single width - 0 - - - D - Dual width - 1 - - - Q - Quad width - 2 - - - - - PREFIX_WIDTH - The transfer width used for the command prefix, if any - [1:0] - read-write - - - S - Single width - 0 - - - D - Dual width - 1 - - - Q - Quad width - 2 - - - - - - - M0_WCMD - Command constants used for writes to memory address window 0. - - The reset value of the M0_WCMD register is configured to support a basic 02h serial write transfer with no additional configuration. - 0x1C - 0x0000A002 - - - SUFFIX - The command suffix bits following the address, if Mx_WFMT_SUFFIX_LEN is nonzero. - [15:8] - read-write - - - PREFIX - The command prefix bits to prepend on each new transfer, if Mx_WFMT_PREFIX_LEN is nonzero. - [7:0] - read-write - - - - - M1_TIMING - Timing configuration register for memory address window 1. - 0x20 - 0x40000004 - - - COOLDOWN - Chip select cooldown period. When a memory transfer finishes, the chip select remains asserted for 64 x COOLDOWN system clock cycles, plus half an SCK clock period (rounded up for odd SCK divisors). After this cooldown expires, the chip select is always deasserted to save power. - - If the next memory access arrives within the cooldown period, the QMI may be able to append more SCK cycles to the currently ongoing SPI transfer, rather than starting a new transfer. This reduces access latency and increases bus throughput. - - Specifically, the next access must be in the same direction (read/write), access the same memory window (chip select 0/1), and follow sequentially the address of the last transfer. If any of these are false, the new access will first deassert the chip select, then begin a new transfer. - - If COOLDOWN is 0, the address alignment configured by PAGEBREAK has been reached, or the total chip select assertion limit MAX_SELECT has been reached, the cooldown period is skipped, and the chip select will always be deasserted one half SCK period after the transfer finishes. - [31:30] - read-write - - - PAGEBREAK - When page break is enabled, chip select will automatically deassert when crossing certain power-of-2-aligned address boundaries. The next access will always begin a new read/write SPI burst, even if the address of the next access follows in sequence with the last access before the page boundary. - - Some flash and PSRAM devices forbid crossing page boundaries with a single read/write transfer, or restrict the operating frequency for transfers that do cross page a boundary. This option allows the QMI to safely support those devices. - - This field has no effect when COOLDOWN is disabled. - [29:28] - read-write - - - NONE - No page boundary is enforced - 0 - - - 256 - Break bursts crossing a 256-byte page boundary - 1 - - - 1024 - Break bursts crossing a 1024-byte quad-page boundary - 2 - - - 4096 - Break bursts crossing a 4096-byte sector boundary - 3 - - - - - SELECT_SETUP - Add up to one additional system clock cycle of setup between chip select assertion and the first rising edge of SCK. - - The default setup time is one half SCK period, which is usually sufficient except for very high SCK frequencies with some flash devices. - [25:25] - read-write - - - SELECT_HOLD - Add up to three additional system clock cycles of active hold between the last falling edge of SCK and the deassertion of this window's chip select. - - The default hold time is one system clock cycle. Note that flash datasheets usually give chip select active hold time from the last *rising* edge of SCK, and so even zero hold from the last falling edge would be safe. - - Note that this is a minimum hold time guaranteed by the QMI: the actual chip select active hold may be slightly longer for read transfers with low clock divisors and/or high sample delays. Specifically, if the point two cycles after the last RX data sample is later than the last SCK falling edge, then the hold time is measured from *this* point. - - Note also that, in case the final SCK pulse is masked to save energy (true for non-DTR reads when COOLDOWN is disabled or PAGE_BREAK is reached), all of QMI's timing logic behaves as though the clock pulse were still present. The SELECT_HOLD time is applied from the point where the last SCK falling edge would be if the clock pulse were not masked. - [24:23] - read-write - - - MAX_SELECT - Enforce a maximum assertion duration for this window's chip select, in units of 64 system clock cycles. If 0, the QMI is permitted to keep the chip select asserted indefinitely when servicing sequential memory accesses (see COOLDOWN). - - This feature is required to meet timing constraints of PSRAM devices, which specify a maximum chip select assertion so they can perform DRAM refresh cycles. See also MIN_DESELECT, which can enforce a minimum deselect time. - - If a memory access is in progress at the time MAX_SELECT is reached, the QMI will wait for the access to complete before deasserting the chip select. This additional time must be accounted for to calculate a safe MAX_SELECT value. In the worst case, this may be a fully-formed serial transfer, including command prefix and address, with a data payload as large as one cache line. - [22:17] - read-write - - - MIN_DESELECT - After this window's chip select is deasserted, it remains deasserted for half an SCK cycle (rounded up to an integer number of system clock cycles), plus MIN_DESELECT additional system clock cycles, before the QMI reasserts either chip select pin. - - Nonzero values may be required for PSRAM devices which enforce a longer minimum CS deselect time, so that they can perform internal DRAM refresh cycles whilst deselected. - [16:12] - read-write - - - RXDELAY - Delay the read data sample timing, in units of one half of a system clock cycle. (Not necessarily half of an SCK cycle.) An RXDELAY of 0 means the sample is captured at the SDI input registers simultaneously with the rising edge of SCK launched from the SCK output register. - - At higher SCK frequencies, RXDELAY may need to be increased to account for the round trip delay of the pads, and the clock-to-Q delay of the QSPI memory device. - [10:8] - read-write - - - CLKDIV - Clock divisor. Odd and even divisors are supported. Defines the SCK clock period in units of 1 system clock cycle. Divisors 1..255 are encoded directly, and a divisor of 256 is encoded with a value of CLKDIV=0. - - The clock divisor can be changed on-the-fly, even when the QMI is currently accessing memory in this address window. All other parameters must only be changed when the QMI is idle. - - If software is increasing CLKDIV in anticipation of an increase in the system clock frequency, a dummy access to either memory window (and appropriate processor barriers/fences) must be inserted after the Mx_TIMING write to ensure the SCK divisor change is in effect _before_ the system clock is changed. - [7:0] - read-write - - - - - M1_RFMT - Read transfer format configuration for memory address window 1. - - Configure the bus width of each transfer phase individually, and configure the length or presence of the command prefix, command suffix and dummy/turnaround transfer phases. Only 24-bit addresses are supported. - - The reset value of the M1_RFMT register is configured to support a basic 03h serial read transfer with no additional configuration. - 0x24 - 0x00001000 - - - DTR - Enable double transfer rate (DTR) for read commands: address, suffix and read data phases are active on both edges of SCK. SDO data is launched centre-aligned on each SCK edge, and SDI data is captured on the SCK edge that follows its launch. - - DTR is implemented by halving the clock rate; SCK has a period of 2 x CLK_DIV throughout the transfer. The prefix and dummy phases are still single transfer rate. - - If the suffix is quad-width, it must be 0 or 8 bits in length, to ensure an even number of SCK edges. - [28:28] - read-write - - - DUMMY_LEN - Length of dummy phase between command suffix and data phase, in units of 4 bits. (i.e. 1 cycle for quad width, 2 for dual, 4 for single) - [18:16] - read-write - - - NONE - No dummy phase - 0 - - - 4 - 4 dummy bits - 1 - - - 8 - 8 dummy bits - 2 - - - 12 - 12 dummy bits - 3 - - - 16 - 16 dummy bits - 4 - - - 20 - 20 dummy bits - 5 - - - 24 - 24 dummy bits - 6 - - - 28 - 28 dummy bits - 7 - - - - - SUFFIX_LEN - Length of post-address command suffix, in units of 4 bits. (i.e. 1 cycle for quad width, 2 for dual, 4 for single) - - Only values of 0 and 8 bits are supported. - [15:14] - read-write - - - NONE - No suffix - 0 - - - 8 - 8-bit suffix - 2 - - - - - PREFIX_LEN - Length of command prefix, in units of 8 bits. (i.e. 2 cycles for quad width, 4 for dual, 8 for single) - [12:12] - read-write - - - NONE - No prefix - 0 - - - 8 - 8-bit prefix - 1 - - - - - DATA_WIDTH - The width used for the data transfer - [9:8] - read-write - - - S - Single width - 0 - - - D - Dual width - 1 - - - Q - Quad width - 2 - - - - - DUMMY_WIDTH - The width used for the dummy phase, if any. - - If width is single, SD0/MOSI is held asserted low during the dummy phase, and SD1...SD3 are tristated. If width is dual/quad, all IOs are tristated during the dummy phase. - [7:6] - read-write - - - S - Single width - 0 - - - D - Dual width - 1 - - - Q - Quad width - 2 - - - - - SUFFIX_WIDTH - The width used for the post-address command suffix, if any - [5:4] - read-write - - - S - Single width - 0 - - - D - Dual width - 1 - - - Q - Quad width - 2 - - - - - ADDR_WIDTH - The transfer width used for the address. The address phase always transfers 24 bits in total. - [3:2] - read-write - - - S - Single width - 0 - - - D - Dual width - 1 - - - Q - Quad width - 2 - - - - - PREFIX_WIDTH - The transfer width used for the command prefix, if any - [1:0] - read-write - - - S - Single width - 0 - - - D - Dual width - 1 - - - Q - Quad width - 2 - - - - - - - M1_RCMD - Command constants used for reads from memory address window 1. - - The reset value of the M1_RCMD register is configured to support a basic 03h serial read transfer with no additional configuration. - 0x28 - 0x0000A003 - - - SUFFIX - The command suffix bits following the address, if Mx_RFMT_SUFFIX_LEN is nonzero. - [15:8] - read-write - - - PREFIX - The command prefix bits to prepend on each new transfer, if Mx_RFMT_PREFIX_LEN is nonzero. - [7:0] - read-write - - - - - M1_WFMT - Write transfer format configuration for memory address window 1. - - Configure the bus width of each transfer phase individually, and configure the length or presence of the command prefix, command suffix and dummy/turnaround transfer phases. Only 24-bit addresses are supported. - - The reset value of the M1_WFMT register is configured to support a basic 02h serial write transfer. However, writes to this window must first be enabled via the XIP_CTRL_WRITABLE_M1 bit, as XIP memory is read-only by default. - 0x2C - 0x00001000 - - - DTR - Enable double transfer rate (DTR) for write commands: address, suffix and write data phases are active on both edges of SCK. SDO data is launched centre-aligned on each SCK edge, and SDI data is captured on the SCK edge that follows its launch. - - DTR is implemented by halving the clock rate; SCK has a period of 2 x CLK_DIV throughout the transfer. The prefix and dummy phases are still single transfer rate. - - If the suffix is quad-width, it must be 0 or 8 bits in length, to ensure an even number of SCK edges. - [28:28] - read-write - - - DUMMY_LEN - Length of dummy phase between command suffix and data phase, in units of 4 bits. (i.e. 1 cycle for quad width, 2 for dual, 4 for single) - [18:16] - read-write - - - NONE - No dummy phase - 0 - - - 4 - 4 dummy bits - 1 - - - 8 - 8 dummy bits - 2 - - - 12 - 12 dummy bits - 3 - - - 16 - 16 dummy bits - 4 - - - 20 - 20 dummy bits - 5 - - - 24 - 24 dummy bits - 6 - - - 28 - 28 dummy bits - 7 - - - - - SUFFIX_LEN - Length of post-address command suffix, in units of 4 bits. (i.e. 1 cycle for quad width, 2 for dual, 4 for single) - - Only values of 0 and 8 bits are supported. - [15:14] - read-write - - - NONE - No suffix - 0 - - - 8 - 8-bit suffix - 2 - - - - - PREFIX_LEN - Length of command prefix, in units of 8 bits. (i.e. 2 cycles for quad width, 4 for dual, 8 for single) - [12:12] - read-write - - - NONE - No prefix - 0 - - - 8 - 8-bit prefix - 1 - - - - - DATA_WIDTH - The width used for the data transfer - [9:8] - read-write - - - S - Single width - 0 - - - D - Dual width - 1 - - - Q - Quad width - 2 - - - - - DUMMY_WIDTH - The width used for the dummy phase, if any. - - If width is single, SD0/MOSI is held asserted low during the dummy phase, and SD1...SD3 are tristated. If width is dual/quad, all IOs are tristated during the dummy phase. - [7:6] - read-write - - - S - Single width - 0 - - - D - Dual width - 1 - - - Q - Quad width - 2 - - - - - SUFFIX_WIDTH - The width used for the post-address command suffix, if any - [5:4] - read-write - - - S - Single width - 0 - - - D - Dual width - 1 - - - Q - Quad width - 2 - - - - - ADDR_WIDTH - The transfer width used for the address. The address phase always transfers 24 bits in total. - [3:2] - read-write - - - S - Single width - 0 - - - D - Dual width - 1 - - - Q - Quad width - 2 - - - - - PREFIX_WIDTH - The transfer width used for the command prefix, if any - [1:0] - read-write - - - S - Single width - 0 - - - D - Dual width - 1 - - - Q - Quad width - 2 - - - - - - - M1_WCMD - Command constants used for writes to memory address window 1. - - The reset value of the M1_WCMD register is configured to support a basic 02h serial write transfer with no additional configuration. - 0x30 - 0x0000A002 - - - SUFFIX - The command suffix bits following the address, if Mx_WFMT_SUFFIX_LEN is nonzero. - [15:8] - read-write - - - PREFIX - The command prefix bits to prepend on each new transfer, if Mx_WFMT_PREFIX_LEN is nonzero. - [7:0] - read-write - - - - - ATRANS0 - Configure address translation for XIP virtual addresses 0x000000 through 0x3fffff (a 4 MiB window starting at +0 MiB). - - Address translation allows a program image to be executed in place at multiple physical flash addresses (for example, a double-buffered flash image for over-the-air updates), without the overhead of position-independent code. - - At reset, the address translation registers are initialised to an identity mapping, so that they can be ignored if address translation is not required. - - Note that the XIP cache is fully virtually addressed, so a cache flush is required after changing the address translation. - 0x34 - 0x04000000 - - - SIZE - Translation aperture size for this virtual address range, in units of 4 kiB (one flash sector). - - Bits 21:12 of the virtual address are compared to SIZE. Offsets greater than SIZE return a bus error, and do not cause a QSPI access. - [26:16] - read-write - - - BASE - Physical address base for this virtual address range, in units of 4 kiB (one flash sector). - - Taking a 24-bit virtual address, firstly bits 23:22 (the two MSBs) are masked to zero, and then BASE is added to bits 23:12 (the upper 12 bits) to form the physical address. Translation wraps on a 16 MiB boundary. - [11:0] - read-write - - - - - ATRANS1 - Configure address translation for XIP virtual addresses 0x400000 through 0x7fffff (a 4 MiB window starting at +4 MiB). - - Address translation allows a program image to be executed in place at multiple physical flash addresses (for example, a double-buffered flash image for over-the-air updates), without the overhead of position-independent code. - - At reset, the address translation registers are initialised to an identity mapping, so that they can be ignored if address translation is not required. - - Note that the XIP cache is fully virtually addressed, so a cache flush is required after changing the address translation. - 0x38 - 0x04000400 - - - SIZE - Translation aperture size for this virtual address range, in units of 4 kiB (one flash sector). - - Bits 21:12 of the virtual address are compared to SIZE. Offsets greater than SIZE return a bus error, and do not cause a QSPI access. - [26:16] - read-write - - - BASE - Physical address base for this virtual address range, in units of 4 kiB (one flash sector). - - Taking a 24-bit virtual address, firstly bits 23:22 (the two MSBs) are masked to zero, and then BASE is added to bits 23:12 (the upper 12 bits) to form the physical address. Translation wraps on a 16 MiB boundary. - [11:0] - read-write - - - - - ATRANS2 - Configure address translation for XIP virtual addresses 0x800000 through 0xbfffff (a 4 MiB window starting at +8 MiB). - - Address translation allows a program image to be executed in place at multiple physical flash addresses (for example, a double-buffered flash image for over-the-air updates), without the overhead of position-independent code. - - At reset, the address translation registers are initialised to an identity mapping, so that they can be ignored if address translation is not required. - - Note that the XIP cache is fully virtually addressed, so a cache flush is required after changing the address translation. - 0x3C - 0x04000800 - - - SIZE - Translation aperture size for this virtual address range, in units of 4 kiB (one flash sector). - - Bits 21:12 of the virtual address are compared to SIZE. Offsets greater than SIZE return a bus error, and do not cause a QSPI access. - [26:16] - read-write - - - BASE - Physical address base for this virtual address range, in units of 4 kiB (one flash sector). - - Taking a 24-bit virtual address, firstly bits 23:22 (the two MSBs) are masked to zero, and then BASE is added to bits 23:12 (the upper 12 bits) to form the physical address. Translation wraps on a 16 MiB boundary. - [11:0] - read-write - - - - - ATRANS3 - Configure address translation for XIP virtual addresses 0xc00000 through 0xffffff (a 4 MiB window starting at +12 MiB). - - Address translation allows a program image to be executed in place at multiple physical flash addresses (for example, a double-buffered flash image for over-the-air updates), without the overhead of position-independent code. - - At reset, the address translation registers are initialised to an identity mapping, so that they can be ignored if address translation is not required. - - Note that the XIP cache is fully virtually addressed, so a cache flush is required after changing the address translation. - 0x40 - 0x04000C00 - - - SIZE - Translation aperture size for this virtual address range, in units of 4 kiB (one flash sector). - - Bits 21:12 of the virtual address are compared to SIZE. Offsets greater than SIZE return a bus error, and do not cause a QSPI access. - [26:16] - read-write - - - BASE - Physical address base for this virtual address range, in units of 4 kiB (one flash sector). - - Taking a 24-bit virtual address, firstly bits 23:22 (the two MSBs) are masked to zero, and then BASE is added to bits 23:12 (the upper 12 bits) to form the physical address. Translation wraps on a 16 MiB boundary. - [11:0] - read-write - - - - - ATRANS4 - Configure address translation for XIP virtual addresses 0x1000000 through 0x13fffff (a 4 MiB window starting at +16 MiB). - - Address translation allows a program image to be executed in place at multiple physical flash addresses (for example, a double-buffered flash image for over-the-air updates), without the overhead of position-independent code. - - At reset, the address translation registers are initialised to an identity mapping, so that they can be ignored if address translation is not required. - - Note that the XIP cache is fully virtually addressed, so a cache flush is required after changing the address translation. - 0x44 - 0x04000000 - - - SIZE - Translation aperture size for this virtual address range, in units of 4 kiB (one flash sector). - - Bits 21:12 of the virtual address are compared to SIZE. Offsets greater than SIZE return a bus error, and do not cause a QSPI access. - [26:16] - read-write - - - BASE - Physical address base for this virtual address range, in units of 4 kiB (one flash sector). - - Taking a 24-bit virtual address, firstly bits 23:22 (the two MSBs) are masked to zero, and then BASE is added to bits 23:12 (the upper 12 bits) to form the physical address. Translation wraps on a 16 MiB boundary. - [11:0] - read-write - - - - - ATRANS5 - Configure address translation for XIP virtual addresses 0x1400000 through 0x17fffff (a 4 MiB window starting at +20 MiB). - - Address translation allows a program image to be executed in place at multiple physical flash addresses (for example, a double-buffered flash image for over-the-air updates), without the overhead of position-independent code. - - At reset, the address translation registers are initialised to an identity mapping, so that they can be ignored if address translation is not required. - - Note that the XIP cache is fully virtually addressed, so a cache flush is required after changing the address translation. - 0x48 - 0x04000400 - - - SIZE - Translation aperture size for this virtual address range, in units of 4 kiB (one flash sector). - - Bits 21:12 of the virtual address are compared to SIZE. Offsets greater than SIZE return a bus error, and do not cause a QSPI access. - [26:16] - read-write - - - BASE - Physical address base for this virtual address range, in units of 4 kiB (one flash sector). - - Taking a 24-bit virtual address, firstly bits 23:22 (the two MSBs) are masked to zero, and then BASE is added to bits 23:12 (the upper 12 bits) to form the physical address. Translation wraps on a 16 MiB boundary. - [11:0] - read-write - - - - - ATRANS6 - Configure address translation for XIP virtual addresses 0x1800000 through 0x1bfffff (a 4 MiB window starting at +24 MiB). - - Address translation allows a program image to be executed in place at multiple physical flash addresses (for example, a double-buffered flash image for over-the-air updates), without the overhead of position-independent code. - - At reset, the address translation registers are initialised to an identity mapping, so that they can be ignored if address translation is not required. - - Note that the XIP cache is fully virtually addressed, so a cache flush is required after changing the address translation. - 0x4C - 0x04000800 - - - SIZE - Translation aperture size for this virtual address range, in units of 4 kiB (one flash sector). - - Bits 21:12 of the virtual address are compared to SIZE. Offsets greater than SIZE return a bus error, and do not cause a QSPI access. - [26:16] - read-write - - - BASE - Physical address base for this virtual address range, in units of 4 kiB (one flash sector). - - Taking a 24-bit virtual address, firstly bits 23:22 (the two MSBs) are masked to zero, and then BASE is added to bits 23:12 (the upper 12 bits) to form the physical address. Translation wraps on a 16 MiB boundary. - [11:0] - read-write - - - - - ATRANS7 - Configure address translation for XIP virtual addresses 0x1c00000 through 0x1ffffff (a 4 MiB window starting at +28 MiB). - - Address translation allows a program image to be executed in place at multiple physical flash addresses (for example, a double-buffered flash image for over-the-air updates), without the overhead of position-independent code. - - At reset, the address translation registers are initialised to an identity mapping, so that they can be ignored if address translation is not required. - - Note that the XIP cache is fully virtually addressed, so a cache flush is required after changing the address translation. - 0x50 - 0x04000C00 - - - SIZE - Translation aperture size for this virtual address range, in units of 4 kiB (one flash sector). - - Bits 21:12 of the virtual address are compared to SIZE. Offsets greater than SIZE return a bus error, and do not cause a QSPI access. - [26:16] - read-write - - - BASE - Physical address base for this virtual address range, in units of 4 kiB (one flash sector). - - Taking a 24-bit virtual address, firstly bits 23:22 (the two MSBs) are masked to zero, and then BASE is added to bits 23:12 (the upper 12 bits) to form the physical address. Translation wraps on a 16 MiB boundary. - [11:0] - read-write - - - - - - - XIP_CTRL - QSPI flash execute-in-place block - 0x400C8000 - - 0x0 - 0x20 - registers - - - - CTRL - Cache control register. Read-only from a Non-secure context. - 0x0 - 0x00000083 - - - WRITABLE_M1 - If 1, enable writes to XIP memory window 1 (addresses 0x11000000 through 0x11ffffff, and their uncached mirrors). If 0, this region is read-only. - - XIP memory is *read-only by default*. This bit must be set to enable writes if a RAM device is attached on QSPI chip select 1. - - The default read-only behaviour avoids two issues with writing to a read-only QSPI device (e.g. flash). First, a write will initially appear to succeed due to caching, but the data will eventually be lost when the written line is evicted, causing unpredictable behaviour. - - Second, when a written line is evicted, it will cause a write command to be issued to the flash, which can break the flash out of its continuous read mode. After this point, flash reads will return garbage. This is a security concern, as it allows Non-secure software to break Secure flash reads if it has permission to write to any flash address. - - Note the read-only behaviour is implemented by downgrading writes to reads, so writes will still cause allocation of an address, but have no other effect. - [11:11] - read-write - - - WRITABLE_M0 - If 1, enable writes to XIP memory window 0 (addresses 0x10000000 through 0x10ffffff, and their uncached mirrors). If 0, this region is read-only. - - XIP memory is *read-only by default*. This bit must be set to enable writes if a RAM device is attached on QSPI chip select 0. - - The default read-only behaviour avoids two issues with writing to a read-only QSPI device (e.g. flash). First, a write will initially appear to succeed due to caching, but the data will eventually be lost when the written line is evicted, causing unpredictable behaviour. - - Second, when a written line is evicted, it will cause a write command to be issued to the flash, which can break the flash out of its continuous read mode. After this point, flash reads will return garbage. This is a security concern, as it allows Non-secure software to break Secure flash reads if it has permission to write to any flash address. - - Note the read-only behaviour is implemented by downgrading writes to reads, so writes will still cause allocation of an address, but have no other effect. - [10:10] - read-write - - - SPLIT_WAYS - When 1, route all cached+Secure accesses to way 0 of the cache, and route all cached+Non-secure accesses to way 1 of the cache. - - This partitions the cache into two half-sized direct-mapped regions, such that Non-secure code can not observe cache line state changes caused by Secure execution. - - A full cache flush is required when changing the value of SPLIT_WAYS. The flush should be performed whilst SPLIT_WAYS is 0, so that both cache ways are accessible for invalidation. - [9:9] - read-write - - - MAINT_NONSEC - When 0, Non-secure accesses to the cache maintenance address window (addr[27] == 1, addr[26] == 0) will generate a bus error. When 1, Non-secure accesses can perform cache maintenance operations by writing to the cache maintenance address window. - - Cache maintenance operations may be used to corrupt Secure data by invalidating cache lines inappropriately, or map Secure content into a Non-secure region by pinning cache lines. Therefore this bit should generally be set to 0, unless Secure code is not using the cache. - - Care should also be taken to clear the cache data memory and tag memory before granting maintenance operations to Non-secure code. - [8:8] - read-write - - - NO_UNTRANSLATED_NONSEC - When 1, Non-secure accesses to the uncached, untranslated window (addr[27:26] == 3) will generate a bus error. - [7:7] - read-write - - - NO_UNTRANSLATED_SEC - When 1, Secure accesses to the uncached, untranslated window (addr[27:26] == 3) will generate a bus error. - [6:6] - read-write - - - NO_UNCACHED_NONSEC - When 1, Non-secure accesses to the uncached window (addr[27:26] == 1) will generate a bus error. This may reduce the number of SAU/MPU/PMP regions required to protect flash contents. - - Note this does not disable access to the uncached, untranslated window -- see NO_UNTRANSLATED_SEC. - [5:5] - read-write - - - NO_UNCACHED_SEC - When 1, Secure accesses to the uncached window (addr[27:26] == 1) will generate a bus error. This may reduce the number of SAU/MPU/PMP regions required to protect flash contents. - - Note this does not disable access to the uncached, untranslated window -- see NO_UNTRANSLATED_SEC. - [4:4] - read-write - - - POWER_DOWN - When 1, the cache memories are powered down. They retain state, but can not be accessed. This reduces static power dissipation. Writing 1 to this bit forces CTRL_EN_SECURE and CTRL_EN_NONSECURE to 0, i.e. the cache cannot be enabled when powered down. - [3:3] - read-write - - - EN_NONSECURE - When 1, enable the cache for Non-secure accesses. When enabled, Non-secure XIP accesses to the cached (addr[26] == 0) window will query the cache, and QSPI accesses are performed only if the requested data is not present. When disabled, Secure access ignore the cache contents, and always access the QSPI interface. - - Accesses to the uncached (addr[26] == 1) window will never query the cache, irrespective of this bit. - [1:1] - read-write - - - EN_SECURE - When 1, enable the cache for Secure accesses. When enabled, Secure XIP accesses to the cached (addr[26] == 0) window will query the cache, and QSPI accesses are performed only if the requested data is not present. When disabled, Secure access ignore the cache contents, and always access the QSPI interface. - - Accesses to the uncached (addr[26] == 1) window will never query the cache, irrespective of this bit. - - There is no cache-as-SRAM address window. Cache lines are allocated for SRAM-like use by individually pinning them, and keeping the cache enabled. - [0:0] - read-write - - - - - STAT - 0x8 - 0x00000002 - - - FIFO_FULL - When 1, indicates the XIP streaming FIFO is completely full. - The streaming FIFO is 2 entries deep, so the full and empty - flag allow its level to be ascertained. - [2:2] - read-only - - - FIFO_EMPTY - When 1, indicates the XIP streaming FIFO is completely empty. - [1:1] - read-only - - - - - CTR_HIT - Cache Hit counter - 0xC - 0x00000000 - - - CTR_HIT - A 32 bit saturating counter that increments upon each cache hit, - i.e. when an XIP access is serviced directly from cached data. - Write any value to clear. - [31:0] - read-write - oneToClear - - - - - CTR_ACC - Cache Access counter - 0x10 - 0x00000000 - - - CTR_ACC - A 32 bit saturating counter that increments upon each XIP access, - whether the cache is hit or not. This includes noncacheable accesses. - Write any value to clear. - [31:0] - read-write - oneToClear - - - - - STREAM_ADDR - FIFO stream address - 0x14 - 0x00000000 - - - STREAM_ADDR - The address of the next word to be streamed from flash to the streaming FIFO. - Increments automatically after each flash access. - Write the initial access address here before starting a streaming read. - [31:2] - read-write - - - - - STREAM_CTR - FIFO stream control - 0x18 - 0x00000000 - - - STREAM_CTR - Write a nonzero value to start a streaming read. This will then - progress in the background, using flash idle cycles to transfer - a linear data block from flash to the streaming FIFO. - Decrements automatically (1 at a time) as the stream - progresses, and halts on reaching 0. - Write 0 to halt an in-progress stream, and discard any in-flight - read, so that a new stream can immediately be started (after - draining the FIFO and reinitialising STREAM_ADDR) - [21:0] - read-write - - - - - STREAM_FIFO - FIFO stream data - 0x1C - 0x00000000 - - - STREAM_FIFO - Streamed data is buffered here, for retrieval by the system DMA. - This FIFO can also be accessed via the XIP_AUX slave, to avoid exposing - the DMA to bus stalls caused by other XIP traffic. - [31:0] - read-only - modify - - - - - - - XIP_AUX - Auxiliary DMA access to XIP FIFOs, via fast AHB bus access - 0x50500000 - - 0x0 - 0xC - registers - - - - STREAM - Read the XIP stream FIFO (fast bus access to XIP_CTRL_STREAM_FIFO) - 0x0 - 0x00000000 - - - STREAM - [31:0] - read-only - modify - - - - - QMI_DIRECT_TX - Write to the QMI direct-mode TX FIFO (fast bus access to QMI_DIRECT_TX) - 0x4 - 0x00000000 - - - NOPUSH - Inhibit the RX FIFO push that would correspond to this TX FIFO entry. - - Useful to avoid garbage appearing in the RX FIFO when pushing the command at the beginning of a SPI transfer. - [20:20] - write-only - - - OE - Output enable (active-high). For single width (SPI), this field is ignored, and SD0 is always set to output, with SD1 always set to input. - - For dual and quad width (DSPI/QSPI), this sets whether the relevant SDx pads are set to output whilst transferring this FIFO record. In this case the command/address should have OE set, and the data transfer should have OE set or clear depending on the direction of the transfer. - [19:19] - write-only - - - DWIDTH - Data width. If 0, hardware will transmit the 8 LSBs of the DIRECT_TX DATA field, and return an 8-bit value in the 8 LSBs of DIRECT_RX. If 1, the full 16-bit width is used. 8-bit and 16-bit transfers can be mixed freely. - [18:18] - write-only - - - IWIDTH - Configure whether this FIFO record is transferred with single/dual/quad interface width (0/1/2). Different widths can be mixed freely. - [17:16] - write-only - - - S - Single width - 0 - - - D - Dual width - 1 - - - Q - Quad width - 2 - - - - - DATA - Data pushed here will be clocked out falling edges of SCK (or before the very first rising edge of SCK, if this is the first pulse). For each byte clocked out, the interface will simultaneously sample one byte, on rising edges of SCK, and push this to the DIRECT_RX FIFO. - - For 16-bit data, the least-significant byte is transmitted first. - [15:0] - write-only - - - - - QMI_DIRECT_RX - Read from the QMI direct-mode RX FIFO (fast bus access to QMI_DIRECT_RX) - 0x8 - 0x00000000 - - - QMI_DIRECT_RX - With each byte clocked out on the serial interface, one byte will simultaneously be clocked in, and will appear in this FIFO. The serial interface will stall when this FIFO is full, to avoid dropping data. - - When 16-bit data is pushed into the TX FIFO, the corresponding RX FIFO push will also contain 16 bits of data. The least-significant byte is the first one received. - [15:0] - read-only - modify - - - - - - - SYSCFG - Register block for various chip control signals - 0x40008000 - - 0x0 - 0x18 - registers - - - - PROC_CONFIG - Configuration for processors - 0x0 - 0x00000000 - - - PROC1_HALTED - Indication that proc1 has halted - [1:1] - read-only - - - PROC0_HALTED - Indication that proc0 has halted - [0:0] - read-only - - - - - PROC_IN_SYNC_BYPASS - For each bit, if 1, bypass the input synchronizer between that GPIO - and the GPIO input register in the SIO. The input synchronizers should - generally be unbypassed, to avoid injecting metastabilities into processors. - If you're feeling brave, you can bypass to save two cycles of input - latency. This register applies to GPIO 0...31. - 0x4 - 0x00000000 - - - GPIO - [31:0] - read-write - - - - - PROC_IN_SYNC_BYPASS_HI - For each bit, if 1, bypass the input synchronizer between that GPIO - and the GPIO input register in the SIO. The input synchronizers should - generally be unbypassed, to avoid injecting metastabilities into processors. - If you're feeling brave, you can bypass to save two cycles of input - latency. This register applies to GPIO 32...47. USB GPIO 56..57 QSPI GPIO 58..63 - 0x8 - 0x00000000 - - - QSPI_SD - [31:28] - read-write - - - QSPI_CSN - [27:27] - read-write - - - QSPI_SCK - [26:26] - read-write - - - USB_DM - [25:25] - read-write - - - USB_DP - [24:24] - read-write - - - GPIO - [15:0] - read-write - - - - - DBGFORCE - Directly control the chip SWD debug port - 0xC - 0x00000006 - - - ATTACH - Attach chip debug port to syscfg controls, and disconnect it from external SWD pads. - [3:3] - read-write - - - SWCLK - Directly drive SWCLK, if ATTACH is set - [2:2] - read-write - - - SWDI - Directly drive SWDIO input, if ATTACH is set - [1:1] - read-write - - - SWDO - Observe the value of SWDIO output. - [0:0] - read-only - - - - - MEMPOWERDOWN - Control PD pins to memories. - Set high to put memories to a low power state. In this state the memories will retain contents but not be accessible - Use with caution - 0x10 - 0x00000000 - - - BOOTRAM - [12:12] - read-write - - - ROM - [11:11] - read-write - - - USB - [10:10] - read-write - - - SRAM9 - [9:9] - read-write - - - SRAM8 - [8:8] - read-write - - - SRAM7 - [7:7] - read-write - - - SRAM6 - [6:6] - read-write - - - SRAM5 - [5:5] - read-write - - - SRAM4 - [4:4] - read-write - - - SRAM3 - [3:3] - read-write - - - SRAM2 - [2:2] - read-write - - - SRAM1 - [1:1] - read-write - - - SRAM0 - [0:0] - read-write - - - - - AUXCTRL - Auxiliary system control register - 0x14 - 0x00000000 - - - AUXCTRL - * Bits 7:2: Reserved - - * Bit 1: When clear, the LPOSC output is XORed into the TRNG ROSC output as an additional, uncorrelated entropy source. When set, this behaviour is disabled. - - * Bit 0: Force POWMAN clock to switch to LPOSC, by asserting its WDRESET input. This must be set before initiating a watchdog reset of the RSM from a stage that includes CLOCKS, if POWMAN is running from clk_ref at the point that the watchdog reset takes place. Otherwise, the short pulse generated on clk_ref by the reset of the CLOCKS block may affect POWMAN register state. - [7:0] - read-write - - - - - - - XOSC - Controls the crystal oscillator - 0x40048000 - - 0x0 - 0x14 - registers - - - - CTRL - Crystal Oscillator Control - 0x0 - 0x00000000 - - - ENABLE - On power-up this field is initialised to DISABLE and the chip runs from the ROSC. - If the chip has subsequently been programmed to run from the XOSC then setting this field to DISABLE may lock-up the chip. If this is a concern then run the clk_ref from the ROSC and enable the clk_sys RESUS feature. - The 12-bit code is intended to give some protection against accidental writes. An invalid setting will retain the previous value. The actual value being used can be read from STATUS_ENABLED - [23:12] - read-write - - - DISABLE - 3358 - - - ENABLE - 4011 - - - - - FREQ_RANGE - The 12-bit code is intended to give some protection against accidental writes. An invalid setting will retain the previous value. The actual value being used can be read from STATUS_FREQ_RANGE - [11:0] - read-write - - - 1_15MHZ - 2720 - - - 10_30MHZ - 2721 - - - 25_60MHZ - 2722 - - - 40_100MHZ - 2723 - - - - - - - STATUS - Crystal Oscillator Status - 0x4 - 0x00000000 - - - STABLE - Oscillator is running and stable - [31:31] - read-only - - - BADWRITE - An invalid value has been written to CTRL_ENABLE or CTRL_FREQ_RANGE or DORMANT - [24:24] - read-write - oneToClear - - - ENABLED - Oscillator is enabled but not necessarily running and stable, resets to 0 - [12:12] - read-only - - - FREQ_RANGE - The current frequency range setting - [1:0] - read-only - - - 1_15MHZ - 0 - - - 10_30MHZ - 1 - - - 25_60MHZ - 2 - - - 40_100MHZ - 3 - - - - - - - DORMANT - Crystal Oscillator pause control - 0x8 - 0x00000000 - - - DORMANT - This is used to save power by pausing the XOSC - On power-up this field is initialised to WAKE - An invalid write will also select WAKE - Warning: stop the PLLs before selecting dormant mode - Warning: setup the irq before selecting dormant mode - [31:0] - read-write - - - dormant - 1668246881 - - - WAKE - 2002873189 - - - - - - - STARTUP - Controls the startup delay - 0xC - 0x00000000 - - - X4 - Multiplies the startup_delay by 4, just in case. The reset value is controlled by a mask-programmable tiecell and is provided in case we are booting from XOSC and the default startup delay is insufficient. The reset value is 0x0. - [20:20] - read-write - - - DELAY - in multiples of 256*xtal_period. The reset value of 0xc4 corresponds to approx 50 000 cycles. - [13:0] - read-write - - - - - COUNT - A down counter running at the xosc frequency which counts to zero and stops. - Can be used for short software pauses when setting up time sensitive hardware. - To start the counter, write a non-zero value. Reads will return 1 while the count is running and 0 when it has finished. - Minimum count value is 4. Count values <4 will be treated as count value =4. - Note that synchronisation to the register clock domain costs 2 register clock cycles and the counter cannot compensate for that. - 0x10 - 0x00000000 - - - COUNT - [15:0] - read-write - - - - - - - PLL_SYS - 0x40050000 - - 0x0 - 0x20 - registers - - - PLL_SYS_IRQ - 42 - - - - CS - Control and Status - GENERAL CONSTRAINTS: - Reference clock frequency min=5MHz, max=800MHz - Feedback divider min=16, max=320 - VCO frequency min=750MHz, max=1600MHz - 0x0 - 0x00000001 - - - LOCK - PLL is locked - [31:31] - read-only - - - LOCK_N - PLL is not locked - Ideally this is cleared when PLL lock is seen and this should never normally be set - [30:30] - read-write - oneToClear - - - BYPASS - Passes the reference clock to the output instead of the divided VCO. The VCO continues to run so the user can switch between the reference clock and the divided VCO but the output will glitch when doing so. - [8:8] - read-write - - - REFDIV - Divides the PLL input reference clock. - Behaviour is undefined for div=0. - PLL output will be unpredictable during refdiv changes, wait for lock=1 before using it. - [5:0] - read-write - - - - - PWR - Controls the PLL power modes. - 0x4 - 0x0000002D - - - VCOPD - PLL VCO powerdown - To save power set high when PLL output not required or bypass=1. - [5:5] - read-write - - - POSTDIVPD - PLL post divider powerdown - To save power set high when PLL output not required or bypass=1. - [3:3] - read-write - - - DSMPD - PLL DSM powerdown - Nothing is achieved by setting this low. - [2:2] - read-write - - - PD - PLL powerdown - To save power set high when PLL output not required. - [0:0] - read-write - - - - - FBDIV_INT - Feedback divisor - (note: this PLL does not support fractional division) - 0x8 - 0x00000000 - - - FBDIV_INT - see ctrl reg description for constraints - [11:0] - read-write - - - - - PRIM - Controls the PLL post dividers for the primary output - (note: this PLL does not have a secondary output) - the primary output is driven from VCO divided by postdiv1*postdiv2 - 0xC - 0x00077000 - - - POSTDIV1 - divide by 1-7 - [18:16] - read-write - - - POSTDIV2 - divide by 1-7 - [14:12] - read-write - - - - - INTR - Raw Interrupts - 0x10 - 0x00000000 - - - LOCK_N_STICKY - [0:0] - read-write - oneToClear - - - - - INTE - Interrupt Enable - 0x14 - 0x00000000 - - - LOCK_N_STICKY - [0:0] - read-write - - - - - INTF - Interrupt Force - 0x18 - 0x00000000 - - - LOCK_N_STICKY - [0:0] - read-write - - - - - INTS - Interrupt status after masking & forcing - 0x1C - 0x00000000 - - - LOCK_N_STICKY - [0:0] - read-only - - - - - - - PLL_USB - 0x40058000 - - PLL_USB_IRQ - 43 - - - - ACCESSCTRL - Hardware access control registers - 0x40060000 - - 0x0 - 0xEC - registers - - - - LOCK - Once a LOCK bit is written to 1, ACCESSCTRL silently ignores writes from that master. LOCK is writable only by a Secure, Privileged processor or debugger. - - LOCK bits are only writable when their value is zero. Once set, they can never be cleared, except by a full reset of ACCESSCTRL - - Setting the LOCK bit does not affect whether an access raises a bus error. Unprivileged writes, or writes from the DMA, will continue to raise bus errors. All other accesses will continue not to. - 0x0 - 0x00000004 - - - DEBUG - [3:3] - read-write - - - DMA - [2:2] - read-only - - - CORE1 - [1:1] - read-write - - - CORE0 - [0:0] - read-write - - - - - FORCE_CORE_NS - Force core 1's bus accesses to always be Non-secure, no matter the core's internal state. - - Useful for schemes where one core is designated as the Non-secure core, since some peripherals may filter individual registers internally based on security state but not on master ID. - 0x4 - 0x00000000 - - - CORE1 - [1:1] - read-write - - - - - CFGRESET - Write 1 to reset all ACCESSCTRL configuration, except for the LOCK and FORCE_CORE_NS registers. - - This bit is used in the RP2350 bootrom to quickly restore ACCESSCTRL to a known state during the boot path. - - Note that, like all registers in ACCESSCTRL, this register is not writable when the writer's corresponding LOCK bit is set, therefore a master which has been locked out of ACCESSCTRL can not use the CFGRESET register to disturb its contents. - 0x8 - 0x00000000 - - - CFGRESET - [0:0] - write-only - - - - - GPIO_NSMASK0 - Control whether GPIO0...31 are accessible to Non-secure code. Writable only by a Secure, Privileged processor or debugger. - - 0 -> Secure access only - - 1 -> Secure + Non-secure access - 0xC - 0x00000000 - - - GPIO_NSMASK0 - [31:0] - read-write - - - - - GPIO_NSMASK1 - Control whether GPIO32..47 are accessible to Non-secure code, and whether QSPI and USB bitbang are accessible through the Non-secure SIO. Writable only by a Secure, Privileged processor or debugger. - 0x10 - 0x00000000 - - - QSPI_SD - [31:28] - read-write - - - QSPI_CSN - [27:27] - read-write - - - QSPI_SCK - [26:26] - read-write - - - USB_DM - [25:25] - read-write - - - USB_DP - [24:24] - read-write - - - GPIO - [15:0] - read-write - - - - - ROM - Control whether debugger, DMA, core 0 and core 1 can access ROM, and at what security/privilege levels they can do so. - - Defaults to fully open access. - - This register is writable only from a Secure, Privileged processor or debugger, with the exception of the NSU bit, which becomes Non-secure-Privileged-writable when the NSP bit is set. - 0x14 - 0x000000FF - - - DBG - If 1, ROM can be accessed by the debugger, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [7:7] - read-write - - - DMA - If 1, ROM can be accessed by the DMA, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [6:6] - read-write - - - CORE1 - If 1, ROM can be accessed by core 1, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [5:5] - read-write - - - CORE0 - If 1, ROM can be accessed by core 0, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [4:4] - read-write - - - SP - If 1, ROM can be accessed from a Secure, Privileged context. - [3:3] - read-write - - - SU - If 1, and SP is also set, ROM can be accessed from a Secure, Unprivileged context. - [2:2] - read-write - - - NSP - If 1, ROM can be accessed from a Non-secure, Privileged context. - [1:1] - read-write - - - NSU - If 1, and NSP is also set, ROM can be accessed from a Non-secure, Unprivileged context. - - This bit is writable from a Non-secure, Privileged context, if and only if the NSP bit is set. - [0:0] - read-write - - - - - XIP_MAIN - Control whether debugger, DMA, core 0 and core 1 can access XIP_MAIN, and at what security/privilege levels they can do so. - - Defaults to fully open access. - - This register is writable only from a Secure, Privileged processor or debugger, with the exception of the NSU bit, which becomes Non-secure-Privileged-writable when the NSP bit is set. - 0x18 - 0x000000FF - - - DBG - If 1, XIP_MAIN can be accessed by the debugger, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [7:7] - read-write - - - DMA - If 1, XIP_MAIN can be accessed by the DMA, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [6:6] - read-write - - - CORE1 - If 1, XIP_MAIN can be accessed by core 1, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [5:5] - read-write - - - CORE0 - If 1, XIP_MAIN can be accessed by core 0, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [4:4] - read-write - - - SP - If 1, XIP_MAIN can be accessed from a Secure, Privileged context. - [3:3] - read-write - - - SU - If 1, and SP is also set, XIP_MAIN can be accessed from a Secure, Unprivileged context. - [2:2] - read-write - - - NSP - If 1, XIP_MAIN can be accessed from a Non-secure, Privileged context. - [1:1] - read-write - - - NSU - If 1, and NSP is also set, XIP_MAIN can be accessed from a Non-secure, Unprivileged context. - - This bit is writable from a Non-secure, Privileged context, if and only if the NSP bit is set. - [0:0] - read-write - - - - - SRAM0 - Control whether debugger, DMA, core 0 and core 1 can access SRAM0, and at what security/privilege levels they can do so. - - Defaults to fully open access. - - This register is writable only from a Secure, Privileged processor or debugger, with the exception of the NSU bit, which becomes Non-secure-Privileged-writable when the NSP bit is set. - 0x1C - 0x000000FF - - - DBG - If 1, SRAM0 can be accessed by the debugger, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [7:7] - read-write - - - DMA - If 1, SRAM0 can be accessed by the DMA, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [6:6] - read-write - - - CORE1 - If 1, SRAM0 can be accessed by core 1, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [5:5] - read-write - - - CORE0 - If 1, SRAM0 can be accessed by core 0, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [4:4] - read-write - - - SP - If 1, SRAM0 can be accessed from a Secure, Privileged context. - [3:3] - read-write - - - SU - If 1, and SP is also set, SRAM0 can be accessed from a Secure, Unprivileged context. - [2:2] - read-write - - - NSP - If 1, SRAM0 can be accessed from a Non-secure, Privileged context. - [1:1] - read-write - - - NSU - If 1, and NSP is also set, SRAM0 can be accessed from a Non-secure, Unprivileged context. - - This bit is writable from a Non-secure, Privileged context, if and only if the NSP bit is set. - [0:0] - read-write - - - - - SRAM1 - Control whether debugger, DMA, core 0 and core 1 can access SRAM1, and at what security/privilege levels they can do so. - - Defaults to fully open access. - - This register is writable only from a Secure, Privileged processor or debugger, with the exception of the NSU bit, which becomes Non-secure-Privileged-writable when the NSP bit is set. - 0x20 - 0x000000FF - - - DBG - If 1, SRAM1 can be accessed by the debugger, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [7:7] - read-write - - - DMA - If 1, SRAM1 can be accessed by the DMA, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [6:6] - read-write - - - CORE1 - If 1, SRAM1 can be accessed by core 1, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [5:5] - read-write - - - CORE0 - If 1, SRAM1 can be accessed by core 0, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [4:4] - read-write - - - SP - If 1, SRAM1 can be accessed from a Secure, Privileged context. - [3:3] - read-write - - - SU - If 1, and SP is also set, SRAM1 can be accessed from a Secure, Unprivileged context. - [2:2] - read-write - - - NSP - If 1, SRAM1 can be accessed from a Non-secure, Privileged context. - [1:1] - read-write - - - NSU - If 1, and NSP is also set, SRAM1 can be accessed from a Non-secure, Unprivileged context. - - This bit is writable from a Non-secure, Privileged context, if and only if the NSP bit is set. - [0:0] - read-write - - - - - SRAM2 - Control whether debugger, DMA, core 0 and core 1 can access SRAM2, and at what security/privilege levels they can do so. - - Defaults to fully open access. - - This register is writable only from a Secure, Privileged processor or debugger, with the exception of the NSU bit, which becomes Non-secure-Privileged-writable when the NSP bit is set. - 0x24 - 0x000000FF - - - DBG - If 1, SRAM2 can be accessed by the debugger, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [7:7] - read-write - - - DMA - If 1, SRAM2 can be accessed by the DMA, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [6:6] - read-write - - - CORE1 - If 1, SRAM2 can be accessed by core 1, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [5:5] - read-write - - - CORE0 - If 1, SRAM2 can be accessed by core 0, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [4:4] - read-write - - - SP - If 1, SRAM2 can be accessed from a Secure, Privileged context. - [3:3] - read-write - - - SU - If 1, and SP is also set, SRAM2 can be accessed from a Secure, Unprivileged context. - [2:2] - read-write - - - NSP - If 1, SRAM2 can be accessed from a Non-secure, Privileged context. - [1:1] - read-write - - - NSU - If 1, and NSP is also set, SRAM2 can be accessed from a Non-secure, Unprivileged context. - - This bit is writable from a Non-secure, Privileged context, if and only if the NSP bit is set. - [0:0] - read-write - - - - - SRAM3 - Control whether debugger, DMA, core 0 and core 1 can access SRAM3, and at what security/privilege levels they can do so. - - Defaults to fully open access. - - This register is writable only from a Secure, Privileged processor or debugger, with the exception of the NSU bit, which becomes Non-secure-Privileged-writable when the NSP bit is set. - 0x28 - 0x000000FF - - - DBG - If 1, SRAM3 can be accessed by the debugger, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [7:7] - read-write - - - DMA - If 1, SRAM3 can be accessed by the DMA, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [6:6] - read-write - - - CORE1 - If 1, SRAM3 can be accessed by core 1, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [5:5] - read-write - - - CORE0 - If 1, SRAM3 can be accessed by core 0, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [4:4] - read-write - - - SP - If 1, SRAM3 can be accessed from a Secure, Privileged context. - [3:3] - read-write - - - SU - If 1, and SP is also set, SRAM3 can be accessed from a Secure, Unprivileged context. - [2:2] - read-write - - - NSP - If 1, SRAM3 can be accessed from a Non-secure, Privileged context. - [1:1] - read-write - - - NSU - If 1, and NSP is also set, SRAM3 can be accessed from a Non-secure, Unprivileged context. - - This bit is writable from a Non-secure, Privileged context, if and only if the NSP bit is set. - [0:0] - read-write - - - - - SRAM4 - Control whether debugger, DMA, core 0 and core 1 can access SRAM4, and at what security/privilege levels they can do so. - - Defaults to fully open access. - - This register is writable only from a Secure, Privileged processor or debugger, with the exception of the NSU bit, which becomes Non-secure-Privileged-writable when the NSP bit is set. - 0x2C - 0x000000FF - - - DBG - If 1, SRAM4 can be accessed by the debugger, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [7:7] - read-write - - - DMA - If 1, SRAM4 can be accessed by the DMA, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [6:6] - read-write - - - CORE1 - If 1, SRAM4 can be accessed by core 1, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [5:5] - read-write - - - CORE0 - If 1, SRAM4 can be accessed by core 0, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [4:4] - read-write - - - SP - If 1, SRAM4 can be accessed from a Secure, Privileged context. - [3:3] - read-write - - - SU - If 1, and SP is also set, SRAM4 can be accessed from a Secure, Unprivileged context. - [2:2] - read-write - - - NSP - If 1, SRAM4 can be accessed from a Non-secure, Privileged context. - [1:1] - read-write - - - NSU - If 1, and NSP is also set, SRAM4 can be accessed from a Non-secure, Unprivileged context. - - This bit is writable from a Non-secure, Privileged context, if and only if the NSP bit is set. - [0:0] - read-write - - - - - SRAM5 - Control whether debugger, DMA, core 0 and core 1 can access SRAM5, and at what security/privilege levels they can do so. - - Defaults to fully open access. - - This register is writable only from a Secure, Privileged processor or debugger, with the exception of the NSU bit, which becomes Non-secure-Privileged-writable when the NSP bit is set. - 0x30 - 0x000000FF - - - DBG - If 1, SRAM5 can be accessed by the debugger, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [7:7] - read-write - - - DMA - If 1, SRAM5 can be accessed by the DMA, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [6:6] - read-write - - - CORE1 - If 1, SRAM5 can be accessed by core 1, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [5:5] - read-write - - - CORE0 - If 1, SRAM5 can be accessed by core 0, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [4:4] - read-write - - - SP - If 1, SRAM5 can be accessed from a Secure, Privileged context. - [3:3] - read-write - - - SU - If 1, and SP is also set, SRAM5 can be accessed from a Secure, Unprivileged context. - [2:2] - read-write - - - NSP - If 1, SRAM5 can be accessed from a Non-secure, Privileged context. - [1:1] - read-write - - - NSU - If 1, and NSP is also set, SRAM5 can be accessed from a Non-secure, Unprivileged context. - - This bit is writable from a Non-secure, Privileged context, if and only if the NSP bit is set. - [0:0] - read-write - - - - - SRAM6 - Control whether debugger, DMA, core 0 and core 1 can access SRAM6, and at what security/privilege levels they can do so. - - Defaults to fully open access. - - This register is writable only from a Secure, Privileged processor or debugger, with the exception of the NSU bit, which becomes Non-secure-Privileged-writable when the NSP bit is set. - 0x34 - 0x000000FF - - - DBG - If 1, SRAM6 can be accessed by the debugger, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [7:7] - read-write - - - DMA - If 1, SRAM6 can be accessed by the DMA, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [6:6] - read-write - - - CORE1 - If 1, SRAM6 can be accessed by core 1, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [5:5] - read-write - - - CORE0 - If 1, SRAM6 can be accessed by core 0, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [4:4] - read-write - - - SP - If 1, SRAM6 can be accessed from a Secure, Privileged context. - [3:3] - read-write - - - SU - If 1, and SP is also set, SRAM6 can be accessed from a Secure, Unprivileged context. - [2:2] - read-write - - - NSP - If 1, SRAM6 can be accessed from a Non-secure, Privileged context. - [1:1] - read-write - - - NSU - If 1, and NSP is also set, SRAM6 can be accessed from a Non-secure, Unprivileged context. - - This bit is writable from a Non-secure, Privileged context, if and only if the NSP bit is set. - [0:0] - read-write - - - - - SRAM7 - Control whether debugger, DMA, core 0 and core 1 can access SRAM7, and at what security/privilege levels they can do so. - - Defaults to fully open access. - - This register is writable only from a Secure, Privileged processor or debugger, with the exception of the NSU bit, which becomes Non-secure-Privileged-writable when the NSP bit is set. - 0x38 - 0x000000FF - - - DBG - If 1, SRAM7 can be accessed by the debugger, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [7:7] - read-write - - - DMA - If 1, SRAM7 can be accessed by the DMA, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [6:6] - read-write - - - CORE1 - If 1, SRAM7 can be accessed by core 1, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [5:5] - read-write - - - CORE0 - If 1, SRAM7 can be accessed by core 0, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [4:4] - read-write - - - SP - If 1, SRAM7 can be accessed from a Secure, Privileged context. - [3:3] - read-write - - - SU - If 1, and SP is also set, SRAM7 can be accessed from a Secure, Unprivileged context. - [2:2] - read-write - - - NSP - If 1, SRAM7 can be accessed from a Non-secure, Privileged context. - [1:1] - read-write - - - NSU - If 1, and NSP is also set, SRAM7 can be accessed from a Non-secure, Unprivileged context. - - This bit is writable from a Non-secure, Privileged context, if and only if the NSP bit is set. - [0:0] - read-write - - - - - SRAM8 - Control whether debugger, DMA, core 0 and core 1 can access SRAM8, and at what security/privilege levels they can do so. - - Defaults to fully open access. - - This register is writable only from a Secure, Privileged processor or debugger, with the exception of the NSU bit, which becomes Non-secure-Privileged-writable when the NSP bit is set. - 0x3C - 0x000000FF - - - DBG - If 1, SRAM8 can be accessed by the debugger, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [7:7] - read-write - - - DMA - If 1, SRAM8 can be accessed by the DMA, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [6:6] - read-write - - - CORE1 - If 1, SRAM8 can be accessed by core 1, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [5:5] - read-write - - - CORE0 - If 1, SRAM8 can be accessed by core 0, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [4:4] - read-write - - - SP - If 1, SRAM8 can be accessed from a Secure, Privileged context. - [3:3] - read-write - - - SU - If 1, and SP is also set, SRAM8 can be accessed from a Secure, Unprivileged context. - [2:2] - read-write - - - NSP - If 1, SRAM8 can be accessed from a Non-secure, Privileged context. - [1:1] - read-write - - - NSU - If 1, and NSP is also set, SRAM8 can be accessed from a Non-secure, Unprivileged context. - - This bit is writable from a Non-secure, Privileged context, if and only if the NSP bit is set. - [0:0] - read-write - - - - - SRAM9 - Control whether debugger, DMA, core 0 and core 1 can access SRAM9, and at what security/privilege levels they can do so. - - Defaults to fully open access. - - This register is writable only from a Secure, Privileged processor or debugger, with the exception of the NSU bit, which becomes Non-secure-Privileged-writable when the NSP bit is set. - 0x40 - 0x000000FF - - - DBG - If 1, SRAM9 can be accessed by the debugger, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [7:7] - read-write - - - DMA - If 1, SRAM9 can be accessed by the DMA, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [6:6] - read-write - - - CORE1 - If 1, SRAM9 can be accessed by core 1, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [5:5] - read-write - - - CORE0 - If 1, SRAM9 can be accessed by core 0, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [4:4] - read-write - - - SP - If 1, SRAM9 can be accessed from a Secure, Privileged context. - [3:3] - read-write - - - SU - If 1, and SP is also set, SRAM9 can be accessed from a Secure, Unprivileged context. - [2:2] - read-write - - - NSP - If 1, SRAM9 can be accessed from a Non-secure, Privileged context. - [1:1] - read-write - - - NSU - If 1, and NSP is also set, SRAM9 can be accessed from a Non-secure, Unprivileged context. - - This bit is writable from a Non-secure, Privileged context, if and only if the NSP bit is set. - [0:0] - read-write - - - - - DMA - Control whether debugger, DMA, core 0 and core 1 can access DMA, and at what security/privilege levels they can do so. - - Defaults to Secure access from any master. - - This register is writable only from a Secure, Privileged processor or debugger, with the exception of the NSU bit, which becomes Non-secure-Privileged-writable when the NSP bit is set. - 0x44 - 0x000000FC - - - DBG - If 1, DMA can be accessed by the debugger, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [7:7] - read-write - - - DMA - If 1, DMA can be accessed by the DMA, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [6:6] - read-write - - - CORE1 - If 1, DMA can be accessed by core 1, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [5:5] - read-write - - - CORE0 - If 1, DMA can be accessed by core 0, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [4:4] - read-write - - - SP - If 1, DMA can be accessed from a Secure, Privileged context. - [3:3] - read-write - - - SU - If 1, and SP is also set, DMA can be accessed from a Secure, Unprivileged context. - [2:2] - read-write - - - NSP - If 1, DMA can be accessed from a Non-secure, Privileged context. - [1:1] - read-write - - - NSU - If 1, and NSP is also set, DMA can be accessed from a Non-secure, Unprivileged context. - - This bit is writable from a Non-secure, Privileged context, if and only if the NSP bit is set. - [0:0] - read-write - - - - - USBCTRL - Control whether debugger, DMA, core 0 and core 1 can access USBCTRL, and at what security/privilege levels they can do so. - - Defaults to Secure access from any master. - - This register is writable only from a Secure, Privileged processor or debugger, with the exception of the NSU bit, which becomes Non-secure-Privileged-writable when the NSP bit is set. - 0x48 - 0x000000FC - - - DBG - If 1, USBCTRL can be accessed by the debugger, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [7:7] - read-write - - - DMA - If 1, USBCTRL can be accessed by the DMA, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [6:6] - read-write - - - CORE1 - If 1, USBCTRL can be accessed by core 1, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [5:5] - read-write - - - CORE0 - If 1, USBCTRL can be accessed by core 0, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [4:4] - read-write - - - SP - If 1, USBCTRL can be accessed from a Secure, Privileged context. - [3:3] - read-write - - - SU - If 1, and SP is also set, USBCTRL can be accessed from a Secure, Unprivileged context. - [2:2] - read-write - - - NSP - If 1, USBCTRL can be accessed from a Non-secure, Privileged context. - [1:1] - read-write - - - NSU - If 1, and NSP is also set, USBCTRL can be accessed from a Non-secure, Unprivileged context. - - This bit is writable from a Non-secure, Privileged context, if and only if the NSP bit is set. - [0:0] - read-write - - - - - PIO0 - Control whether debugger, DMA, core 0 and core 1 can access PIO0, and at what security/privilege levels they can do so. - - Defaults to Secure access from any master. - - This register is writable only from a Secure, Privileged processor or debugger, with the exception of the NSU bit, which becomes Non-secure-Privileged-writable when the NSP bit is set. - 0x4C - 0x000000FC - - - DBG - If 1, PIO0 can be accessed by the debugger, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [7:7] - read-write - - - DMA - If 1, PIO0 can be accessed by the DMA, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [6:6] - read-write - - - CORE1 - If 1, PIO0 can be accessed by core 1, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [5:5] - read-write - - - CORE0 - If 1, PIO0 can be accessed by core 0, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [4:4] - read-write - - - SP - If 1, PIO0 can be accessed from a Secure, Privileged context. - [3:3] - read-write - - - SU - If 1, and SP is also set, PIO0 can be accessed from a Secure, Unprivileged context. - [2:2] - read-write - - - NSP - If 1, PIO0 can be accessed from a Non-secure, Privileged context. - [1:1] - read-write - - - NSU - If 1, and NSP is also set, PIO0 can be accessed from a Non-secure, Unprivileged context. - - This bit is writable from a Non-secure, Privileged context, if and only if the NSP bit is set. - [0:0] - read-write - - - - - PIO1 - Control whether debugger, DMA, core 0 and core 1 can access PIO1, and at what security/privilege levels they can do so. - - Defaults to Secure access from any master. - - This register is writable only from a Secure, Privileged processor or debugger, with the exception of the NSU bit, which becomes Non-secure-Privileged-writable when the NSP bit is set. - 0x50 - 0x000000FC - - - DBG - If 1, PIO1 can be accessed by the debugger, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [7:7] - read-write - - - DMA - If 1, PIO1 can be accessed by the DMA, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [6:6] - read-write - - - CORE1 - If 1, PIO1 can be accessed by core 1, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [5:5] - read-write - - - CORE0 - If 1, PIO1 can be accessed by core 0, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [4:4] - read-write - - - SP - If 1, PIO1 can be accessed from a Secure, Privileged context. - [3:3] - read-write - - - SU - If 1, and SP is also set, PIO1 can be accessed from a Secure, Unprivileged context. - [2:2] - read-write - - - NSP - If 1, PIO1 can be accessed from a Non-secure, Privileged context. - [1:1] - read-write - - - NSU - If 1, and NSP is also set, PIO1 can be accessed from a Non-secure, Unprivileged context. - - This bit is writable from a Non-secure, Privileged context, if and only if the NSP bit is set. - [0:0] - read-write - - - - - PIO2 - Control whether debugger, DMA, core 0 and core 1 can access PIO2, and at what security/privilege levels they can do so. - - Defaults to Secure access from any master. - - This register is writable only from a Secure, Privileged processor or debugger, with the exception of the NSU bit, which becomes Non-secure-Privileged-writable when the NSP bit is set. - 0x54 - 0x000000FC - - - DBG - If 1, PIO2 can be accessed by the debugger, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [7:7] - read-write - - - DMA - If 1, PIO2 can be accessed by the DMA, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [6:6] - read-write - - - CORE1 - If 1, PIO2 can be accessed by core 1, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [5:5] - read-write - - - CORE0 - If 1, PIO2 can be accessed by core 0, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [4:4] - read-write - - - SP - If 1, PIO2 can be accessed from a Secure, Privileged context. - [3:3] - read-write - - - SU - If 1, and SP is also set, PIO2 can be accessed from a Secure, Unprivileged context. - [2:2] - read-write - - - NSP - If 1, PIO2 can be accessed from a Non-secure, Privileged context. - [1:1] - read-write - - - NSU - If 1, and NSP is also set, PIO2 can be accessed from a Non-secure, Unprivileged context. - - This bit is writable from a Non-secure, Privileged context, if and only if the NSP bit is set. - [0:0] - read-write - - - - - CORESIGHT_TRACE - Control whether debugger, DMA, core 0 and core 1 can access CORESIGHT_TRACE, and at what security/privilege levels they can do so. - - Defaults to Secure, Privileged processor or debug access only. - - This register is writable only from a Secure, Privileged processor or debugger, with the exception of the NSU bit, which becomes Non-secure-Privileged-writable when the NSP bit is set. - 0x58 - 0x000000B8 - - - DBG - If 1, CORESIGHT_TRACE can be accessed by the debugger, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [7:7] - read-write - - - DMA - If 1, CORESIGHT_TRACE can be accessed by the DMA, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [6:6] - read-write - - - CORE1 - If 1, CORESIGHT_TRACE can be accessed by core 1, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [5:5] - read-write - - - CORE0 - If 1, CORESIGHT_TRACE can be accessed by core 0, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [4:4] - read-write - - - SP - If 1, CORESIGHT_TRACE can be accessed from a Secure, Privileged context. - [3:3] - read-write - - - SU - If 1, and SP is also set, CORESIGHT_TRACE can be accessed from a Secure, Unprivileged context. - [2:2] - read-write - - - NSP - If 1, CORESIGHT_TRACE can be accessed from a Non-secure, Privileged context. - [1:1] - read-write - - - NSU - If 1, and NSP is also set, CORESIGHT_TRACE can be accessed from a Non-secure, Unprivileged context. - - This bit is writable from a Non-secure, Privileged context, if and only if the NSP bit is set. - [0:0] - read-write - - - - - CORESIGHT_PERIPH - Control whether debugger, DMA, core 0 and core 1 can access CORESIGHT_PERIPH, and at what security/privilege levels they can do so. - - Defaults to Secure, Privileged processor or debug access only. - - This register is writable only from a Secure, Privileged processor or debugger, with the exception of the NSU bit, which becomes Non-secure-Privileged-writable when the NSP bit is set. - 0x5C - 0x000000B8 - - - DBG - If 1, CORESIGHT_PERIPH can be accessed by the debugger, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [7:7] - read-write - - - DMA - If 1, CORESIGHT_PERIPH can be accessed by the DMA, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [6:6] - read-write - - - CORE1 - If 1, CORESIGHT_PERIPH can be accessed by core 1, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [5:5] - read-write - - - CORE0 - If 1, CORESIGHT_PERIPH can be accessed by core 0, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [4:4] - read-write - - - SP - If 1, CORESIGHT_PERIPH can be accessed from a Secure, Privileged context. - [3:3] - read-write - - - SU - If 1, and SP is also set, CORESIGHT_PERIPH can be accessed from a Secure, Unprivileged context. - [2:2] - read-write - - - NSP - If 1, CORESIGHT_PERIPH can be accessed from a Non-secure, Privileged context. - [1:1] - read-write - - - NSU - If 1, and NSP is also set, CORESIGHT_PERIPH can be accessed from a Non-secure, Unprivileged context. - - This bit is writable from a Non-secure, Privileged context, if and only if the NSP bit is set. - [0:0] - read-write - - - - - SYSINFO - Control whether debugger, DMA, core 0 and core 1 can access SYSINFO, and at what security/privilege levels they can do so. - - Defaults to fully open access. - - This register is writable only from a Secure, Privileged processor or debugger, with the exception of the NSU bit, which becomes Non-secure-Privileged-writable when the NSP bit is set. - 0x60 - 0x000000FF - - - DBG - If 1, SYSINFO can be accessed by the debugger, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [7:7] - read-write - - - DMA - If 1, SYSINFO can be accessed by the DMA, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [6:6] - read-write - - - CORE1 - If 1, SYSINFO can be accessed by core 1, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [5:5] - read-write - - - CORE0 - If 1, SYSINFO can be accessed by core 0, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [4:4] - read-write - - - SP - If 1, SYSINFO can be accessed from a Secure, Privileged context. - [3:3] - read-write - - - SU - If 1, and SP is also set, SYSINFO can be accessed from a Secure, Unprivileged context. - [2:2] - read-write - - - NSP - If 1, SYSINFO can be accessed from a Non-secure, Privileged context. - [1:1] - read-write - - - NSU - If 1, and NSP is also set, SYSINFO can be accessed from a Non-secure, Unprivileged context. - - This bit is writable from a Non-secure, Privileged context, if and only if the NSP bit is set. - [0:0] - read-write - - - - - RESETS - Control whether debugger, DMA, core 0 and core 1 can access RESETS, and at what security/privilege levels they can do so. - - Defaults to Secure access from any master. - - This register is writable only from a Secure, Privileged processor or debugger, with the exception of the NSU bit, which becomes Non-secure-Privileged-writable when the NSP bit is set. - 0x64 - 0x000000FC - - - DBG - If 1, RESETS can be accessed by the debugger, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [7:7] - read-write - - - DMA - If 1, RESETS can be accessed by the DMA, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [6:6] - read-write - - - CORE1 - If 1, RESETS can be accessed by core 1, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [5:5] - read-write - - - CORE0 - If 1, RESETS can be accessed by core 0, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [4:4] - read-write - - - SP - If 1, RESETS can be accessed from a Secure, Privileged context. - [3:3] - read-write - - - SU - If 1, and SP is also set, RESETS can be accessed from a Secure, Unprivileged context. - [2:2] - read-write - - - NSP - If 1, RESETS can be accessed from a Non-secure, Privileged context. - [1:1] - read-write - - - NSU - If 1, and NSP is also set, RESETS can be accessed from a Non-secure, Unprivileged context. - - This bit is writable from a Non-secure, Privileged context, if and only if the NSP bit is set. - [0:0] - read-write - - - - - IO_BANK0 - Control whether debugger, DMA, core 0 and core 1 can access IO_BANK0, and at what security/privilege levels they can do so. - - Defaults to Secure access from any master. - - This register is writable only from a Secure, Privileged processor or debugger, with the exception of the NSU bit, which becomes Non-secure-Privileged-writable when the NSP bit is set. - 0x68 - 0x000000FC - - - DBG - If 1, IO_BANK0 can be accessed by the debugger, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [7:7] - read-write - - - DMA - If 1, IO_BANK0 can be accessed by the DMA, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [6:6] - read-write - - - CORE1 - If 1, IO_BANK0 can be accessed by core 1, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [5:5] - read-write - - - CORE0 - If 1, IO_BANK0 can be accessed by core 0, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [4:4] - read-write - - - SP - If 1, IO_BANK0 can be accessed from a Secure, Privileged context. - [3:3] - read-write - - - SU - If 1, and SP is also set, IO_BANK0 can be accessed from a Secure, Unprivileged context. - [2:2] - read-write - - - NSP - If 1, IO_BANK0 can be accessed from a Non-secure, Privileged context. - [1:1] - read-write - - - NSU - If 1, and NSP is also set, IO_BANK0 can be accessed from a Non-secure, Unprivileged context. - - This bit is writable from a Non-secure, Privileged context, if and only if the NSP bit is set. - [0:0] - read-write - - - - - IO_BANK1 - Control whether debugger, DMA, core 0 and core 1 can access IO_BANK1, and at what security/privilege levels they can do so. - - Defaults to Secure access from any master. - - This register is writable only from a Secure, Privileged processor or debugger, with the exception of the NSU bit, which becomes Non-secure-Privileged-writable when the NSP bit is set. - 0x6C - 0x000000FC - - - DBG - If 1, IO_BANK1 can be accessed by the debugger, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [7:7] - read-write - - - DMA - If 1, IO_BANK1 can be accessed by the DMA, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [6:6] - read-write - - - CORE1 - If 1, IO_BANK1 can be accessed by core 1, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [5:5] - read-write - - - CORE0 - If 1, IO_BANK1 can be accessed by core 0, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [4:4] - read-write - - - SP - If 1, IO_BANK1 can be accessed from a Secure, Privileged context. - [3:3] - read-write - - - SU - If 1, and SP is also set, IO_BANK1 can be accessed from a Secure, Unprivileged context. - [2:2] - read-write - - - NSP - If 1, IO_BANK1 can be accessed from a Non-secure, Privileged context. - [1:1] - read-write - - - NSU - If 1, and NSP is also set, IO_BANK1 can be accessed from a Non-secure, Unprivileged context. - - This bit is writable from a Non-secure, Privileged context, if and only if the NSP bit is set. - [0:0] - read-write - - - - - PADS_BANK0 - Control whether debugger, DMA, core 0 and core 1 can access PADS_BANK0, and at what security/privilege levels they can do so. - - Defaults to Secure access from any master. - - This register is writable only from a Secure, Privileged processor or debugger, with the exception of the NSU bit, which becomes Non-secure-Privileged-writable when the NSP bit is set. - 0x70 - 0x000000FC - - - DBG - If 1, PADS_BANK0 can be accessed by the debugger, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [7:7] - read-write - - - DMA - If 1, PADS_BANK0 can be accessed by the DMA, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [6:6] - read-write - - - CORE1 - If 1, PADS_BANK0 can be accessed by core 1, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [5:5] - read-write - - - CORE0 - If 1, PADS_BANK0 can be accessed by core 0, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [4:4] - read-write - - - SP - If 1, PADS_BANK0 can be accessed from a Secure, Privileged context. - [3:3] - read-write - - - SU - If 1, and SP is also set, PADS_BANK0 can be accessed from a Secure, Unprivileged context. - [2:2] - read-write - - - NSP - If 1, PADS_BANK0 can be accessed from a Non-secure, Privileged context. - [1:1] - read-write - - - NSU - If 1, and NSP is also set, PADS_BANK0 can be accessed from a Non-secure, Unprivileged context. - - This bit is writable from a Non-secure, Privileged context, if and only if the NSP bit is set. - [0:0] - read-write - - - - - PADS_QSPI - Control whether debugger, DMA, core 0 and core 1 can access PADS_QSPI, and at what security/privilege levels they can do so. - - Defaults to Secure access from any master. - - This register is writable only from a Secure, Privileged processor or debugger, with the exception of the NSU bit, which becomes Non-secure-Privileged-writable when the NSP bit is set. - 0x74 - 0x000000FC - - - DBG - If 1, PADS_QSPI can be accessed by the debugger, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [7:7] - read-write - - - DMA - If 1, PADS_QSPI can be accessed by the DMA, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [6:6] - read-write - - - CORE1 - If 1, PADS_QSPI can be accessed by core 1, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [5:5] - read-write - - - CORE0 - If 1, PADS_QSPI can be accessed by core 0, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [4:4] - read-write - - - SP - If 1, PADS_QSPI can be accessed from a Secure, Privileged context. - [3:3] - read-write - - - SU - If 1, and SP is also set, PADS_QSPI can be accessed from a Secure, Unprivileged context. - [2:2] - read-write - - - NSP - If 1, PADS_QSPI can be accessed from a Non-secure, Privileged context. - [1:1] - read-write - - - NSU - If 1, and NSP is also set, PADS_QSPI can be accessed from a Non-secure, Unprivileged context. - - This bit is writable from a Non-secure, Privileged context, if and only if the NSP bit is set. - [0:0] - read-write - - - - - BUSCTRL - Control whether debugger, DMA, core 0 and core 1 can access BUSCTRL, and at what security/privilege levels they can do so. - - Defaults to Secure access from any master. - - This register is writable only from a Secure, Privileged processor or debugger, with the exception of the NSU bit, which becomes Non-secure-Privileged-writable when the NSP bit is set. - 0x78 - 0x000000FC - - - DBG - If 1, BUSCTRL can be accessed by the debugger, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [7:7] - read-write - - - DMA - If 1, BUSCTRL can be accessed by the DMA, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [6:6] - read-write - - - CORE1 - If 1, BUSCTRL can be accessed by core 1, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [5:5] - read-write - - - CORE0 - If 1, BUSCTRL can be accessed by core 0, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [4:4] - read-write - - - SP - If 1, BUSCTRL can be accessed from a Secure, Privileged context. - [3:3] - read-write - - - SU - If 1, and SP is also set, BUSCTRL can be accessed from a Secure, Unprivileged context. - [2:2] - read-write - - - NSP - If 1, BUSCTRL can be accessed from a Non-secure, Privileged context. - [1:1] - read-write - - - NSU - If 1, and NSP is also set, BUSCTRL can be accessed from a Non-secure, Unprivileged context. - - This bit is writable from a Non-secure, Privileged context, if and only if the NSP bit is set. - [0:0] - read-write - - - - - ADC0 - Control whether debugger, DMA, core 0 and core 1 can access ADC0, and at what security/privilege levels they can do so. - - Defaults to Secure access from any master. - - This register is writable only from a Secure, Privileged processor or debugger, with the exception of the NSU bit, which becomes Non-secure-Privileged-writable when the NSP bit is set. - 0x7C - 0x000000FC - - - DBG - If 1, ADC0 can be accessed by the debugger, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [7:7] - read-write - - - DMA - If 1, ADC0 can be accessed by the DMA, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [6:6] - read-write - - - CORE1 - If 1, ADC0 can be accessed by core 1, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [5:5] - read-write - - - CORE0 - If 1, ADC0 can be accessed by core 0, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [4:4] - read-write - - - SP - If 1, ADC0 can be accessed from a Secure, Privileged context. - [3:3] - read-write - - - SU - If 1, and SP is also set, ADC0 can be accessed from a Secure, Unprivileged context. - [2:2] - read-write - - - NSP - If 1, ADC0 can be accessed from a Non-secure, Privileged context. - [1:1] - read-write - - - NSU - If 1, and NSP is also set, ADC0 can be accessed from a Non-secure, Unprivileged context. - - This bit is writable from a Non-secure, Privileged context, if and only if the NSP bit is set. - [0:0] - read-write - - - - - HSTX - Control whether debugger, DMA, core 0 and core 1 can access HSTX, and at what security/privilege levels they can do so. - - Defaults to Secure access from any master. - - This register is writable only from a Secure, Privileged processor or debugger, with the exception of the NSU bit, which becomes Non-secure-Privileged-writable when the NSP bit is set. - 0x80 - 0x000000FC - - - DBG - If 1, HSTX can be accessed by the debugger, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [7:7] - read-write - - - DMA - If 1, HSTX can be accessed by the DMA, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [6:6] - read-write - - - CORE1 - If 1, HSTX can be accessed by core 1, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [5:5] - read-write - - - CORE0 - If 1, HSTX can be accessed by core 0, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [4:4] - read-write - - - SP - If 1, HSTX can be accessed from a Secure, Privileged context. - [3:3] - read-write - - - SU - If 1, and SP is also set, HSTX can be accessed from a Secure, Unprivileged context. - [2:2] - read-write - - - NSP - If 1, HSTX can be accessed from a Non-secure, Privileged context. - [1:1] - read-write - - - NSU - If 1, and NSP is also set, HSTX can be accessed from a Non-secure, Unprivileged context. - - This bit is writable from a Non-secure, Privileged context, if and only if the NSP bit is set. - [0:0] - read-write - - - - - I2C0 - Control whether debugger, DMA, core 0 and core 1 can access I2C0, and at what security/privilege levels they can do so. - - Defaults to Secure access from any master. - - This register is writable only from a Secure, Privileged processor or debugger, with the exception of the NSU bit, which becomes Non-secure-Privileged-writable when the NSP bit is set. - 0x84 - 0x000000FC - - - DBG - If 1, I2C0 can be accessed by the debugger, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [7:7] - read-write - - - DMA - If 1, I2C0 can be accessed by the DMA, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [6:6] - read-write - - - CORE1 - If 1, I2C0 can be accessed by core 1, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [5:5] - read-write - - - CORE0 - If 1, I2C0 can be accessed by core 0, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [4:4] - read-write - - - SP - If 1, I2C0 can be accessed from a Secure, Privileged context. - [3:3] - read-write - - - SU - If 1, and SP is also set, I2C0 can be accessed from a Secure, Unprivileged context. - [2:2] - read-write - - - NSP - If 1, I2C0 can be accessed from a Non-secure, Privileged context. - [1:1] - read-write - - - NSU - If 1, and NSP is also set, I2C0 can be accessed from a Non-secure, Unprivileged context. - - This bit is writable from a Non-secure, Privileged context, if and only if the NSP bit is set. - [0:0] - read-write - - - - - I2C1 - Control whether debugger, DMA, core 0 and core 1 can access I2C1, and at what security/privilege levels they can do so. - - Defaults to Secure access from any master. - - This register is writable only from a Secure, Privileged processor or debugger, with the exception of the NSU bit, which becomes Non-secure-Privileged-writable when the NSP bit is set. - 0x88 - 0x000000FC - - - DBG - If 1, I2C1 can be accessed by the debugger, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [7:7] - read-write - - - DMA - If 1, I2C1 can be accessed by the DMA, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [6:6] - read-write - - - CORE1 - If 1, I2C1 can be accessed by core 1, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [5:5] - read-write - - - CORE0 - If 1, I2C1 can be accessed by core 0, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [4:4] - read-write - - - SP - If 1, I2C1 can be accessed from a Secure, Privileged context. - [3:3] - read-write - - - SU - If 1, and SP is also set, I2C1 can be accessed from a Secure, Unprivileged context. - [2:2] - read-write - - - NSP - If 1, I2C1 can be accessed from a Non-secure, Privileged context. - [1:1] - read-write - - - NSU - If 1, and NSP is also set, I2C1 can be accessed from a Non-secure, Unprivileged context. - - This bit is writable from a Non-secure, Privileged context, if and only if the NSP bit is set. - [0:0] - read-write - - - - - PWM - Control whether debugger, DMA, core 0 and core 1 can access PWM, and at what security/privilege levels they can do so. - - Defaults to Secure access from any master. - - This register is writable only from a Secure, Privileged processor or debugger, with the exception of the NSU bit, which becomes Non-secure-Privileged-writable when the NSP bit is set. - 0x8C - 0x000000FC - - - DBG - If 1, PWM can be accessed by the debugger, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [7:7] - read-write - - - DMA - If 1, PWM can be accessed by the DMA, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [6:6] - read-write - - - CORE1 - If 1, PWM can be accessed by core 1, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [5:5] - read-write - - - CORE0 - If 1, PWM can be accessed by core 0, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [4:4] - read-write - - - SP - If 1, PWM can be accessed from a Secure, Privileged context. - [3:3] - read-write - - - SU - If 1, and SP is also set, PWM can be accessed from a Secure, Unprivileged context. - [2:2] - read-write - - - NSP - If 1, PWM can be accessed from a Non-secure, Privileged context. - [1:1] - read-write - - - NSU - If 1, and NSP is also set, PWM can be accessed from a Non-secure, Unprivileged context. - - This bit is writable from a Non-secure, Privileged context, if and only if the NSP bit is set. - [0:0] - read-write - - - - - SPI0 - Control whether debugger, DMA, core 0 and core 1 can access SPI0, and at what security/privilege levels they can do so. - - Defaults to Secure access from any master. - - This register is writable only from a Secure, Privileged processor or debugger, with the exception of the NSU bit, which becomes Non-secure-Privileged-writable when the NSP bit is set. - 0x90 - 0x000000FC - - - DBG - If 1, SPI0 can be accessed by the debugger, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [7:7] - read-write - - - DMA - If 1, SPI0 can be accessed by the DMA, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [6:6] - read-write - - - CORE1 - If 1, SPI0 can be accessed by core 1, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [5:5] - read-write - - - CORE0 - If 1, SPI0 can be accessed by core 0, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [4:4] - read-write - - - SP - If 1, SPI0 can be accessed from a Secure, Privileged context. - [3:3] - read-write - - - SU - If 1, and SP is also set, SPI0 can be accessed from a Secure, Unprivileged context. - [2:2] - read-write - - - NSP - If 1, SPI0 can be accessed from a Non-secure, Privileged context. - [1:1] - read-write - - - NSU - If 1, and NSP is also set, SPI0 can be accessed from a Non-secure, Unprivileged context. - - This bit is writable from a Non-secure, Privileged context, if and only if the NSP bit is set. - [0:0] - read-write - - - - - SPI1 - Control whether debugger, DMA, core 0 and core 1 can access SPI1, and at what security/privilege levels they can do so. - - Defaults to Secure access from any master. - - This register is writable only from a Secure, Privileged processor or debugger, with the exception of the NSU bit, which becomes Non-secure-Privileged-writable when the NSP bit is set. - 0x94 - 0x000000FC - - - DBG - If 1, SPI1 can be accessed by the debugger, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [7:7] - read-write - - - DMA - If 1, SPI1 can be accessed by the DMA, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [6:6] - read-write - - - CORE1 - If 1, SPI1 can be accessed by core 1, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [5:5] - read-write - - - CORE0 - If 1, SPI1 can be accessed by core 0, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [4:4] - read-write - - - SP - If 1, SPI1 can be accessed from a Secure, Privileged context. - [3:3] - read-write - - - SU - If 1, and SP is also set, SPI1 can be accessed from a Secure, Unprivileged context. - [2:2] - read-write - - - NSP - If 1, SPI1 can be accessed from a Non-secure, Privileged context. - [1:1] - read-write - - - NSU - If 1, and NSP is also set, SPI1 can be accessed from a Non-secure, Unprivileged context. - - This bit is writable from a Non-secure, Privileged context, if and only if the NSP bit is set. - [0:0] - read-write - - - - - TIMER0 - Control whether debugger, DMA, core 0 and core 1 can access TIMER0, and at what security/privilege levels they can do so. - - Defaults to Secure access from any master. - - This register is writable only from a Secure, Privileged processor or debugger, with the exception of the NSU bit, which becomes Non-secure-Privileged-writable when the NSP bit is set. - 0x98 - 0x000000FC - - - DBG - If 1, TIMER0 can be accessed by the debugger, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [7:7] - read-write - - - DMA - If 1, TIMER0 can be accessed by the DMA, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [6:6] - read-write - - - CORE1 - If 1, TIMER0 can be accessed by core 1, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [5:5] - read-write - - - CORE0 - If 1, TIMER0 can be accessed by core 0, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [4:4] - read-write - - - SP - If 1, TIMER0 can be accessed from a Secure, Privileged context. - [3:3] - read-write - - - SU - If 1, and SP is also set, TIMER0 can be accessed from a Secure, Unprivileged context. - [2:2] - read-write - - - NSP - If 1, TIMER0 can be accessed from a Non-secure, Privileged context. - [1:1] - read-write - - - NSU - If 1, and NSP is also set, TIMER0 can be accessed from a Non-secure, Unprivileged context. - - This bit is writable from a Non-secure, Privileged context, if and only if the NSP bit is set. - [0:0] - read-write - - - - - TIMER1 - Control whether debugger, DMA, core 0 and core 1 can access TIMER1, and at what security/privilege levels they can do so. - - Defaults to Secure access from any master. - - This register is writable only from a Secure, Privileged processor or debugger, with the exception of the NSU bit, which becomes Non-secure-Privileged-writable when the NSP bit is set. - 0x9C - 0x000000FC - - - DBG - If 1, TIMER1 can be accessed by the debugger, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [7:7] - read-write - - - DMA - If 1, TIMER1 can be accessed by the DMA, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [6:6] - read-write - - - CORE1 - If 1, TIMER1 can be accessed by core 1, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [5:5] - read-write - - - CORE0 - If 1, TIMER1 can be accessed by core 0, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [4:4] - read-write - - - SP - If 1, TIMER1 can be accessed from a Secure, Privileged context. - [3:3] - read-write - - - SU - If 1, and SP is also set, TIMER1 can be accessed from a Secure, Unprivileged context. - [2:2] - read-write - - - NSP - If 1, TIMER1 can be accessed from a Non-secure, Privileged context. - [1:1] - read-write - - - NSU - If 1, and NSP is also set, TIMER1 can be accessed from a Non-secure, Unprivileged context. - - This bit is writable from a Non-secure, Privileged context, if and only if the NSP bit is set. - [0:0] - read-write - - - - - UART0 - Control whether debugger, DMA, core 0 and core 1 can access UART0, and at what security/privilege levels they can do so. - - Defaults to Secure access from any master. - - This register is writable only from a Secure, Privileged processor or debugger, with the exception of the NSU bit, which becomes Non-secure-Privileged-writable when the NSP bit is set. - 0xA0 - 0x000000FC - - - DBG - If 1, UART0 can be accessed by the debugger, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [7:7] - read-write - - - DMA - If 1, UART0 can be accessed by the DMA, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [6:6] - read-write - - - CORE1 - If 1, UART0 can be accessed by core 1, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [5:5] - read-write - - - CORE0 - If 1, UART0 can be accessed by core 0, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [4:4] - read-write - - - SP - If 1, UART0 can be accessed from a Secure, Privileged context. - [3:3] - read-write - - - SU - If 1, and SP is also set, UART0 can be accessed from a Secure, Unprivileged context. - [2:2] - read-write - - - NSP - If 1, UART0 can be accessed from a Non-secure, Privileged context. - [1:1] - read-write - - - NSU - If 1, and NSP is also set, UART0 can be accessed from a Non-secure, Unprivileged context. - - This bit is writable from a Non-secure, Privileged context, if and only if the NSP bit is set. - [0:0] - read-write - - - - - UART1 - Control whether debugger, DMA, core 0 and core 1 can access UART1, and at what security/privilege levels they can do so. - - Defaults to Secure access from any master. - - This register is writable only from a Secure, Privileged processor or debugger, with the exception of the NSU bit, which becomes Non-secure-Privileged-writable when the NSP bit is set. - 0xA4 - 0x000000FC - - - DBG - If 1, UART1 can be accessed by the debugger, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [7:7] - read-write - - - DMA - If 1, UART1 can be accessed by the DMA, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [6:6] - read-write - - - CORE1 - If 1, UART1 can be accessed by core 1, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [5:5] - read-write - - - CORE0 - If 1, UART1 can be accessed by core 0, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [4:4] - read-write - - - SP - If 1, UART1 can be accessed from a Secure, Privileged context. - [3:3] - read-write - - - SU - If 1, and SP is also set, UART1 can be accessed from a Secure, Unprivileged context. - [2:2] - read-write - - - NSP - If 1, UART1 can be accessed from a Non-secure, Privileged context. - [1:1] - read-write - - - NSU - If 1, and NSP is also set, UART1 can be accessed from a Non-secure, Unprivileged context. - - This bit is writable from a Non-secure, Privileged context, if and only if the NSP bit is set. - [0:0] - read-write - - - - - OTP - Control whether debugger, DMA, core 0 and core 1 can access OTP, and at what security/privilege levels they can do so. - - Defaults to Secure access from any master. - - This register is writable only from a Secure, Privileged processor or debugger, with the exception of the NSU bit, which becomes Non-secure-Privileged-writable when the NSP bit is set. - 0xA8 - 0x000000FC - - - DBG - If 1, OTP can be accessed by the debugger, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [7:7] - read-write - - - DMA - If 1, OTP can be accessed by the DMA, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [6:6] - read-write - - - CORE1 - If 1, OTP can be accessed by core 1, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [5:5] - read-write - - - CORE0 - If 1, OTP can be accessed by core 0, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [4:4] - read-write - - - SP - If 1, OTP can be accessed from a Secure, Privileged context. - [3:3] - read-write - - - SU - If 1, and SP is also set, OTP can be accessed from a Secure, Unprivileged context. - [2:2] - read-write - - - NSP - If 1, OTP can be accessed from a Non-secure, Privileged context. - [1:1] - read-write - - - NSU - If 1, and NSP is also set, OTP can be accessed from a Non-secure, Unprivileged context. - - This bit is writable from a Non-secure, Privileged context, if and only if the NSP bit is set. - [0:0] - read-write - - - - - TBMAN - Control whether debugger, DMA, core 0 and core 1 can access TBMAN, and at what security/privilege levels they can do so. - - Defaults to Secure access from any master. - - This register is writable only from a Secure, Privileged processor or debugger, with the exception of the NSU bit, which becomes Non-secure-Privileged-writable when the NSP bit is set. - 0xAC - 0x000000FC - - - DBG - If 1, TBMAN can be accessed by the debugger, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [7:7] - read-write - - - DMA - If 1, TBMAN can be accessed by the DMA, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [6:6] - read-write - - - CORE1 - If 1, TBMAN can be accessed by core 1, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [5:5] - read-write - - - CORE0 - If 1, TBMAN can be accessed by core 0, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [4:4] - read-write - - - SP - If 1, TBMAN can be accessed from a Secure, Privileged context. - [3:3] - read-write - - - SU - If 1, and SP is also set, TBMAN can be accessed from a Secure, Unprivileged context. - [2:2] - read-write - - - NSP - If 1, TBMAN can be accessed from a Non-secure, Privileged context. - [1:1] - read-write - - - NSU - If 1, and NSP is also set, TBMAN can be accessed from a Non-secure, Unprivileged context. - - This bit is writable from a Non-secure, Privileged context, if and only if the NSP bit is set. - [0:0] - read-write - - - - - POWMAN - Control whether debugger, DMA, core 0 and core 1 can access POWMAN, and at what security/privilege levels they can do so. - - Defaults to Secure, Privileged processor or debug access only. - - This register is writable only from a Secure, Privileged processor or debugger, with the exception of the NSU bit, which becomes Non-secure-Privileged-writable when the NSP bit is set. - 0xB0 - 0x000000B8 - - - DBG - If 1, POWMAN can be accessed by the debugger, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [7:7] - read-write - - - DMA - If 1, POWMAN can be accessed by the DMA, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [6:6] - read-write - - - CORE1 - If 1, POWMAN can be accessed by core 1, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [5:5] - read-write - - - CORE0 - If 1, POWMAN can be accessed by core 0, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [4:4] - read-write - - - SP - If 1, POWMAN can be accessed from a Secure, Privileged context. - [3:3] - read-write - - - SU - If 1, and SP is also set, POWMAN can be accessed from a Secure, Unprivileged context. - [2:2] - read-write - - - NSP - If 1, POWMAN can be accessed from a Non-secure, Privileged context. - [1:1] - read-write - - - NSU - If 1, and NSP is also set, POWMAN can be accessed from a Non-secure, Unprivileged context. - - This bit is writable from a Non-secure, Privileged context, if and only if the NSP bit is set. - [0:0] - read-write - - - - - TRNG - Control whether debugger, DMA, core 0 and core 1 can access TRNG, and at what security/privilege levels they can do so. - - Defaults to Secure, Privileged processor or debug access only. - - This register is writable only from a Secure, Privileged processor or debugger, with the exception of the NSU bit, which becomes Non-secure-Privileged-writable when the NSP bit is set. - 0xB4 - 0x000000B8 - - - DBG - If 1, TRNG can be accessed by the debugger, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [7:7] - read-write - - - DMA - If 1, TRNG can be accessed by the DMA, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [6:6] - read-write - - - CORE1 - If 1, TRNG can be accessed by core 1, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [5:5] - read-write - - - CORE0 - If 1, TRNG can be accessed by core 0, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [4:4] - read-write - - - SP - If 1, TRNG can be accessed from a Secure, Privileged context. - [3:3] - read-write - - - SU - If 1, and SP is also set, TRNG can be accessed from a Secure, Unprivileged context. - [2:2] - read-write - - - NSP - If 1, TRNG can be accessed from a Non-secure, Privileged context. - [1:1] - read-write - - - NSU - If 1, and NSP is also set, TRNG can be accessed from a Non-secure, Unprivileged context. - - This bit is writable from a Non-secure, Privileged context, if and only if the NSP bit is set. - [0:0] - read-write - - - - - SHA256 - Control whether debugger, DMA, core 0 and core 1 can access SHA256, and at what security/privilege levels they can do so. - - Defaults to Secure, Privileged access only. - - This register is writable only from a Secure, Privileged processor or debugger, with the exception of the NSU bit, which becomes Non-secure-Privileged-writable when the NSP bit is set. - 0xB8 - 0x000000F8 - - - DBG - If 1, SHA256 can be accessed by the debugger, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [7:7] - read-write - - - DMA - If 1, SHA256 can be accessed by the DMA, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [6:6] - read-write - - - CORE1 - If 1, SHA256 can be accessed by core 1, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [5:5] - read-write - - - CORE0 - If 1, SHA256 can be accessed by core 0, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [4:4] - read-write - - - SP - If 1, SHA256 can be accessed from a Secure, Privileged context. - [3:3] - read-write - - - SU - If 1, and SP is also set, SHA256 can be accessed from a Secure, Unprivileged context. - [2:2] - read-write - - - NSP - If 1, SHA256 can be accessed from a Non-secure, Privileged context. - [1:1] - read-write - - - NSU - If 1, and NSP is also set, SHA256 can be accessed from a Non-secure, Unprivileged context. - - This bit is writable from a Non-secure, Privileged context, if and only if the NSP bit is set. - [0:0] - read-write - - - - - SYSCFG - Control whether debugger, DMA, core 0 and core 1 can access SYSCFG, and at what security/privilege levels they can do so. - - Defaults to Secure, Privileged processor or debug access only. - - This register is writable only from a Secure, Privileged processor or debugger, with the exception of the NSU bit, which becomes Non-secure-Privileged-writable when the NSP bit is set. - 0xBC - 0x000000B8 - - - DBG - If 1, SYSCFG can be accessed by the debugger, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [7:7] - read-write - - - DMA - If 1, SYSCFG can be accessed by the DMA, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [6:6] - read-write - - - CORE1 - If 1, SYSCFG can be accessed by core 1, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [5:5] - read-write - - - CORE0 - If 1, SYSCFG can be accessed by core 0, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [4:4] - read-write - - - SP - If 1, SYSCFG can be accessed from a Secure, Privileged context. - [3:3] - read-write - - - SU - If 1, and SP is also set, SYSCFG can be accessed from a Secure, Unprivileged context. - [2:2] - read-write - - - NSP - If 1, SYSCFG can be accessed from a Non-secure, Privileged context. - [1:1] - read-write - - - NSU - If 1, and NSP is also set, SYSCFG can be accessed from a Non-secure, Unprivileged context. - - This bit is writable from a Non-secure, Privileged context, if and only if the NSP bit is set. - [0:0] - read-write - - - - - CLOCKS - Control whether debugger, DMA, core 0 and core 1 can access CLOCKS, and at what security/privilege levels they can do so. - - Defaults to Secure, Privileged processor or debug access only. - - This register is writable only from a Secure, Privileged processor or debugger, with the exception of the NSU bit, which becomes Non-secure-Privileged-writable when the NSP bit is set. - 0xC0 - 0x000000B8 - - - DBG - If 1, CLOCKS can be accessed by the debugger, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [7:7] - read-write - - - DMA - If 1, CLOCKS can be accessed by the DMA, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [6:6] - read-write - - - CORE1 - If 1, CLOCKS can be accessed by core 1, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [5:5] - read-write - - - CORE0 - If 1, CLOCKS can be accessed by core 0, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [4:4] - read-write - - - SP - If 1, CLOCKS can be accessed from a Secure, Privileged context. - [3:3] - read-write - - - SU - If 1, and SP is also set, CLOCKS can be accessed from a Secure, Unprivileged context. - [2:2] - read-write - - - NSP - If 1, CLOCKS can be accessed from a Non-secure, Privileged context. - [1:1] - read-write - - - NSU - If 1, and NSP is also set, CLOCKS can be accessed from a Non-secure, Unprivileged context. - - This bit is writable from a Non-secure, Privileged context, if and only if the NSP bit is set. - [0:0] - read-write - - - - - XOSC - Control whether debugger, DMA, core 0 and core 1 can access XOSC, and at what security/privilege levels they can do so. - - Defaults to Secure, Privileged processor or debug access only. - - This register is writable only from a Secure, Privileged processor or debugger, with the exception of the NSU bit, which becomes Non-secure-Privileged-writable when the NSP bit is set. - 0xC4 - 0x000000B8 - - - DBG - If 1, XOSC can be accessed by the debugger, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [7:7] - read-write - - - DMA - If 1, XOSC can be accessed by the DMA, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [6:6] - read-write - - - CORE1 - If 1, XOSC can be accessed by core 1, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [5:5] - read-write - - - CORE0 - If 1, XOSC can be accessed by core 0, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [4:4] - read-write - - - SP - If 1, XOSC can be accessed from a Secure, Privileged context. - [3:3] - read-write - - - SU - If 1, and SP is also set, XOSC can be accessed from a Secure, Unprivileged context. - [2:2] - read-write - - - NSP - If 1, XOSC can be accessed from a Non-secure, Privileged context. - [1:1] - read-write - - - NSU - If 1, and NSP is also set, XOSC can be accessed from a Non-secure, Unprivileged context. - - This bit is writable from a Non-secure, Privileged context, if and only if the NSP bit is set. - [0:0] - read-write - - - - - ROSC - Control whether debugger, DMA, core 0 and core 1 can access ROSC, and at what security/privilege levels they can do so. - - Defaults to Secure, Privileged processor or debug access only. - - This register is writable only from a Secure, Privileged processor or debugger, with the exception of the NSU bit, which becomes Non-secure-Privileged-writable when the NSP bit is set. - 0xC8 - 0x000000B8 - - - DBG - If 1, ROSC can be accessed by the debugger, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [7:7] - read-write - - - DMA - If 1, ROSC can be accessed by the DMA, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [6:6] - read-write - - - CORE1 - If 1, ROSC can be accessed by core 1, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [5:5] - read-write - - - CORE0 - If 1, ROSC can be accessed by core 0, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [4:4] - read-write - - - SP - If 1, ROSC can be accessed from a Secure, Privileged context. - [3:3] - read-write - - - SU - If 1, and SP is also set, ROSC can be accessed from a Secure, Unprivileged context. - [2:2] - read-write - - - NSP - If 1, ROSC can be accessed from a Non-secure, Privileged context. - [1:1] - read-write - - - NSU - If 1, and NSP is also set, ROSC can be accessed from a Non-secure, Unprivileged context. - - This bit is writable from a Non-secure, Privileged context, if and only if the NSP bit is set. - [0:0] - read-write - - - - - PLL_SYS - Control whether debugger, DMA, core 0 and core 1 can access PLL_SYS, and at what security/privilege levels they can do so. - - Defaults to Secure, Privileged processor or debug access only. - - This register is writable only from a Secure, Privileged processor or debugger, with the exception of the NSU bit, which becomes Non-secure-Privileged-writable when the NSP bit is set. - 0xCC - 0x000000B8 - - - DBG - If 1, PLL_SYS can be accessed by the debugger, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [7:7] - read-write - - - DMA - If 1, PLL_SYS can be accessed by the DMA, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [6:6] - read-write - - - CORE1 - If 1, PLL_SYS can be accessed by core 1, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [5:5] - read-write - - - CORE0 - If 1, PLL_SYS can be accessed by core 0, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [4:4] - read-write - - - SP - If 1, PLL_SYS can be accessed from a Secure, Privileged context. - [3:3] - read-write - - - SU - If 1, and SP is also set, PLL_SYS can be accessed from a Secure, Unprivileged context. - [2:2] - read-write - - - NSP - If 1, PLL_SYS can be accessed from a Non-secure, Privileged context. - [1:1] - read-write - - - NSU - If 1, and NSP is also set, PLL_SYS can be accessed from a Non-secure, Unprivileged context. - - This bit is writable from a Non-secure, Privileged context, if and only if the NSP bit is set. - [0:0] - read-write - - - - - PLL_USB - Control whether debugger, DMA, core 0 and core 1 can access PLL_USB, and at what security/privilege levels they can do so. - - Defaults to Secure, Privileged processor or debug access only. - - This register is writable only from a Secure, Privileged processor or debugger, with the exception of the NSU bit, which becomes Non-secure-Privileged-writable when the NSP bit is set. - 0xD0 - 0x000000B8 - - - DBG - If 1, PLL_USB can be accessed by the debugger, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [7:7] - read-write - - - DMA - If 1, PLL_USB can be accessed by the DMA, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [6:6] - read-write - - - CORE1 - If 1, PLL_USB can be accessed by core 1, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [5:5] - read-write - - - CORE0 - If 1, PLL_USB can be accessed by core 0, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [4:4] - read-write - - - SP - If 1, PLL_USB can be accessed from a Secure, Privileged context. - [3:3] - read-write - - - SU - If 1, and SP is also set, PLL_USB can be accessed from a Secure, Unprivileged context. - [2:2] - read-write - - - NSP - If 1, PLL_USB can be accessed from a Non-secure, Privileged context. - [1:1] - read-write - - - NSU - If 1, and NSP is also set, PLL_USB can be accessed from a Non-secure, Unprivileged context. - - This bit is writable from a Non-secure, Privileged context, if and only if the NSP bit is set. - [0:0] - read-write - - - - - TICKS - Control whether debugger, DMA, core 0 and core 1 can access TICKS, and at what security/privilege levels they can do so. - - Defaults to Secure, Privileged processor or debug access only. - - This register is writable only from a Secure, Privileged processor or debugger, with the exception of the NSU bit, which becomes Non-secure-Privileged-writable when the NSP bit is set. - 0xD4 - 0x000000B8 - - - DBG - If 1, TICKS can be accessed by the debugger, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [7:7] - read-write - - - DMA - If 1, TICKS can be accessed by the DMA, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [6:6] - read-write - - - CORE1 - If 1, TICKS can be accessed by core 1, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [5:5] - read-write - - - CORE0 - If 1, TICKS can be accessed by core 0, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [4:4] - read-write - - - SP - If 1, TICKS can be accessed from a Secure, Privileged context. - [3:3] - read-write - - - SU - If 1, and SP is also set, TICKS can be accessed from a Secure, Unprivileged context. - [2:2] - read-write - - - NSP - If 1, TICKS can be accessed from a Non-secure, Privileged context. - [1:1] - read-write - - - NSU - If 1, and NSP is also set, TICKS can be accessed from a Non-secure, Unprivileged context. - - This bit is writable from a Non-secure, Privileged context, if and only if the NSP bit is set. - [0:0] - read-write - - - - - WATCHDOG - Control whether debugger, DMA, core 0 and core 1 can access WATCHDOG, and at what security/privilege levels they can do so. - - Defaults to Secure, Privileged processor or debug access only. - - This register is writable only from a Secure, Privileged processor or debugger, with the exception of the NSU bit, which becomes Non-secure-Privileged-writable when the NSP bit is set. - 0xD8 - 0x000000B8 - - - DBG - If 1, WATCHDOG can be accessed by the debugger, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [7:7] - read-write - - - DMA - If 1, WATCHDOG can be accessed by the DMA, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [6:6] - read-write - - - CORE1 - If 1, WATCHDOG can be accessed by core 1, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [5:5] - read-write - - - CORE0 - If 1, WATCHDOG can be accessed by core 0, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [4:4] - read-write - - - SP - If 1, WATCHDOG can be accessed from a Secure, Privileged context. - [3:3] - read-write - - - SU - If 1, and SP is also set, WATCHDOG can be accessed from a Secure, Unprivileged context. - [2:2] - read-write - - - NSP - If 1, WATCHDOG can be accessed from a Non-secure, Privileged context. - [1:1] - read-write - - - NSU - If 1, and NSP is also set, WATCHDOG can be accessed from a Non-secure, Unprivileged context. - - This bit is writable from a Non-secure, Privileged context, if and only if the NSP bit is set. - [0:0] - read-write - - - - - RSM - Control whether debugger, DMA, core 0 and core 1 can access RSM, and at what security/privilege levels they can do so. - - Defaults to Secure, Privileged processor or debug access only. - - This register is writable only from a Secure, Privileged processor or debugger, with the exception of the NSU bit, which becomes Non-secure-Privileged-writable when the NSP bit is set. - 0xDC - 0x000000B8 - - - DBG - If 1, RSM can be accessed by the debugger, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [7:7] - read-write - - - DMA - If 1, RSM can be accessed by the DMA, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [6:6] - read-write - - - CORE1 - If 1, RSM can be accessed by core 1, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [5:5] - read-write - - - CORE0 - If 1, RSM can be accessed by core 0, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [4:4] - read-write - - - SP - If 1, RSM can be accessed from a Secure, Privileged context. - [3:3] - read-write - - - SU - If 1, and SP is also set, RSM can be accessed from a Secure, Unprivileged context. - [2:2] - read-write - - - NSP - If 1, RSM can be accessed from a Non-secure, Privileged context. - [1:1] - read-write - - - NSU - If 1, and NSP is also set, RSM can be accessed from a Non-secure, Unprivileged context. - - This bit is writable from a Non-secure, Privileged context, if and only if the NSP bit is set. - [0:0] - read-write - - - - - XIP_CTRL - Control whether debugger, DMA, core 0 and core 1 can access XIP_CTRL, and at what security/privilege levels they can do so. - - Defaults to Secure, Privileged processor or debug access only. - - This register is writable only from a Secure, Privileged processor or debugger, with the exception of the NSU bit, which becomes Non-secure-Privileged-writable when the NSP bit is set. - 0xE0 - 0x000000B8 - - - DBG - If 1, XIP_CTRL can be accessed by the debugger, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [7:7] - read-write - - - DMA - If 1, XIP_CTRL can be accessed by the DMA, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [6:6] - read-write - - - CORE1 - If 1, XIP_CTRL can be accessed by core 1, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [5:5] - read-write - - - CORE0 - If 1, XIP_CTRL can be accessed by core 0, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [4:4] - read-write - - - SP - If 1, XIP_CTRL can be accessed from a Secure, Privileged context. - [3:3] - read-write - - - SU - If 1, and SP is also set, XIP_CTRL can be accessed from a Secure, Unprivileged context. - [2:2] - read-write - - - NSP - If 1, XIP_CTRL can be accessed from a Non-secure, Privileged context. - [1:1] - read-write - - - NSU - If 1, and NSP is also set, XIP_CTRL can be accessed from a Non-secure, Unprivileged context. - - This bit is writable from a Non-secure, Privileged context, if and only if the NSP bit is set. - [0:0] - read-write - - - - - XIP_QMI - Control whether debugger, DMA, core 0 and core 1 can access XIP_QMI, and at what security/privilege levels they can do so. - - Defaults to Secure, Privileged processor or debug access only. - - This register is writable only from a Secure, Privileged processor or debugger, with the exception of the NSU bit, which becomes Non-secure-Privileged-writable when the NSP bit is set. - 0xE4 - 0x000000B8 - - - DBG - If 1, XIP_QMI can be accessed by the debugger, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [7:7] - read-write - - - DMA - If 1, XIP_QMI can be accessed by the DMA, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [6:6] - read-write - - - CORE1 - If 1, XIP_QMI can be accessed by core 1, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [5:5] - read-write - - - CORE0 - If 1, XIP_QMI can be accessed by core 0, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [4:4] - read-write - - - SP - If 1, XIP_QMI can be accessed from a Secure, Privileged context. - [3:3] - read-write - - - SU - If 1, and SP is also set, XIP_QMI can be accessed from a Secure, Unprivileged context. - [2:2] - read-write - - - NSP - If 1, XIP_QMI can be accessed from a Non-secure, Privileged context. - [1:1] - read-write - - - NSU - If 1, and NSP is also set, XIP_QMI can be accessed from a Non-secure, Unprivileged context. - - This bit is writable from a Non-secure, Privileged context, if and only if the NSP bit is set. - [0:0] - read-write - - - - - XIP_AUX - Control whether debugger, DMA, core 0 and core 1 can access XIP_AUX, and at what security/privilege levels they can do so. - - Defaults to Secure, Privileged access only. - - This register is writable only from a Secure, Privileged processor or debugger, with the exception of the NSU bit, which becomes Non-secure-Privileged-writable when the NSP bit is set. - 0xE8 - 0x000000F8 - - - DBG - If 1, XIP_AUX can be accessed by the debugger, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [7:7] - read-write - - - DMA - If 1, XIP_AUX can be accessed by the DMA, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [6:6] - read-write - - - CORE1 - If 1, XIP_AUX can be accessed by core 1, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [5:5] - read-write - - - CORE0 - If 1, XIP_AUX can be accessed by core 0, at security/privilege levels permitted by SP/NSP/SU/NSU in this register. - [4:4] - read-write - - - SP - If 1, XIP_AUX can be accessed from a Secure, Privileged context. - [3:3] - read-write - - - SU - If 1, and SP is also set, XIP_AUX can be accessed from a Secure, Unprivileged context. - [2:2] - read-write - - - NSP - If 1, XIP_AUX can be accessed from a Non-secure, Privileged context. - [1:1] - read-write - - - NSU - If 1, and NSP is also set, XIP_AUX can be accessed from a Non-secure, Unprivileged context. - - This bit is writable from a Non-secure, Privileged context, if and only if the NSP bit is set. - [0:0] - read-write - - - - - - - UART0 - 0x40070000 - - 0x0 - 0x1000 - registers - - - UART0_IRQ - 33 - - - - UARTDR - Data Register, UARTDR - 0x0 - 0x00000000 - - - OE - Overrun error. This bit is set to 1 if data is received and the receive FIFO is already full. This is cleared to 0 once there is an empty space in the FIFO and a new character can be written to it. - [11:11] - read-only - - - BE - Break error. This bit is set to 1 if a break condition was detected, indicating that the received data input was held LOW for longer than a full-word transmission time (defined as start, data, parity and stop bits). In FIFO mode, this error is associated with the character at the top of the FIFO. When a break occurs, only one 0 character is loaded into the FIFO. The next character is only enabled after the receive data input goes to a 1 (marking state), and the next valid start bit is received. - [10:10] - read-only - - - PE - Parity error. When set to 1, it indicates that the parity of the received data character does not match the parity that the EPS and SPS bits in the Line Control Register, UARTLCR_H. In FIFO mode, this error is associated with the character at the top of the FIFO. - [9:9] - read-only - - - FE - Framing error. When set to 1, it indicates that the received character did not have a valid stop bit (a valid stop bit is 1). In FIFO mode, this error is associated with the character at the top of the FIFO. - [8:8] - read-only - - - DATA - Receive (read) data character. Transmit (write) data character. - [7:0] - read-write - modify - - - - - UARTRSR - Receive Status Register/Error Clear Register, UARTRSR/UARTECR - 0x4 - 0x00000000 - - - OE - Overrun error. This bit is set to 1 if data is received and the FIFO is already full. This bit is cleared to 0 by a write to UARTECR. The FIFO contents remain valid because no more data is written when the FIFO is full, only the contents of the shift register are overwritten. The CPU must now read the data, to empty the FIFO. - [3:3] - read-write - oneToClear - - - BE - Break error. This bit is set to 1 if a break condition was detected, indicating that the received data input was held LOW for longer than a full-word transmission time (defined as start, data, parity, and stop bits). This bit is cleared to 0 after a write to UARTECR. In FIFO mode, this error is associated with the character at the top of the FIFO. When a break occurs, only one 0 character is loaded into the FIFO. The next character is only enabled after the receive data input goes to a 1 (marking state) and the next valid start bit is received. - [2:2] - read-write - oneToClear - - - PE - Parity error. When set to 1, it indicates that the parity of the received data character does not match the parity that the EPS and SPS bits in the Line Control Register, UARTLCR_H. This bit is cleared to 0 by a write to UARTECR. In FIFO mode, this error is associated with the character at the top of the FIFO. - [1:1] - read-write - oneToClear - - - FE - Framing error. When set to 1, it indicates that the received character did not have a valid stop bit (a valid stop bit is 1). This bit is cleared to 0 by a write to UARTECR. In FIFO mode, this error is associated with the character at the top of the FIFO. - [0:0] - read-write - oneToClear - - - - - UARTFR - Flag Register, UARTFR - 0x18 - 0x00000090 - - - RI - Ring indicator. This bit is the complement of the UART ring indicator, nUARTRI, modem status input. That is, the bit is 1 when nUARTRI is LOW. - [8:8] - read-only - - - TXFE - Transmit FIFO empty. The meaning of this bit depends on the state of the FEN bit in the Line Control Register, UARTLCR_H. If the FIFO is disabled, this bit is set when the transmit holding register is empty. If the FIFO is enabled, the TXFE bit is set when the transmit FIFO is empty. This bit does not indicate if there is data in the transmit shift register. - [7:7] - read-only - - - RXFF - Receive FIFO full. The meaning of this bit depends on the state of the FEN bit in the UARTLCR_H Register. If the FIFO is disabled, this bit is set when the receive holding register is full. If the FIFO is enabled, the RXFF bit is set when the receive FIFO is full. - [6:6] - read-only - - - TXFF - Transmit FIFO full. The meaning of this bit depends on the state of the FEN bit in the UARTLCR_H Register. If the FIFO is disabled, this bit is set when the transmit holding register is full. If the FIFO is enabled, the TXFF bit is set when the transmit FIFO is full. - [5:5] - read-only - - - RXFE - Receive FIFO empty. The meaning of this bit depends on the state of the FEN bit in the UARTLCR_H Register. If the FIFO is disabled, this bit is set when the receive holding register is empty. If the FIFO is enabled, the RXFE bit is set when the receive FIFO is empty. - [4:4] - read-only - - - BUSY - UART busy. If this bit is set to 1, the UART is busy transmitting data. This bit remains set until the complete byte, including all the stop bits, has been sent from the shift register. This bit is set as soon as the transmit FIFO becomes non-empty, regardless of whether the UART is enabled or not. - [3:3] - read-only - - - DCD - Data carrier detect. This bit is the complement of the UART data carrier detect, nUARTDCD, modem status input. That is, the bit is 1 when nUARTDCD is LOW. - [2:2] - read-only - - - DSR - Data set ready. This bit is the complement of the UART data set ready, nUARTDSR, modem status input. That is, the bit is 1 when nUARTDSR is LOW. - [1:1] - read-only - - - CTS - Clear to send. This bit is the complement of the UART clear to send, nUARTCTS, modem status input. That is, the bit is 1 when nUARTCTS is LOW. - [0:0] - read-only - - - - - UARTILPR - IrDA Low-Power Counter Register, UARTILPR - 0x20 - 0x00000000 - - - ILPDVSR - 8-bit low-power divisor value. These bits are cleared to 0 at reset. - [7:0] - read-write - - - - - UARTIBRD - Integer Baud Rate Register, UARTIBRD - 0x24 - 0x00000000 - - - BAUD_DIVINT - The integer baud rate divisor. These bits are cleared to 0 on reset. - [15:0] - read-write - - - - - UARTFBRD - Fractional Baud Rate Register, UARTFBRD - 0x28 - 0x00000000 - - - BAUD_DIVFRAC - The fractional baud rate divisor. These bits are cleared to 0 on reset. - [5:0] - read-write - - - - - UARTLCR_H - Line Control Register, UARTLCR_H - 0x2C - 0x00000000 - - - SPS - Stick parity select. 0 = stick parity is disabled 1 = either: * if the EPS bit is 0 then the parity bit is transmitted and checked as a 1 * if the EPS bit is 1 then the parity bit is transmitted and checked as a 0. This bit has no effect when the PEN bit disables parity checking and generation. - [7:7] - read-write - - - WLEN - Word length. These bits indicate the number of data bits transmitted or received in a frame as follows: b11 = 8 bits b10 = 7 bits b01 = 6 bits b00 = 5 bits. - [6:5] - read-write - - - FEN - Enable FIFOs: 0 = FIFOs are disabled (character mode) that is, the FIFOs become 1-byte-deep holding registers 1 = transmit and receive FIFO buffers are enabled (FIFO mode). - [4:4] - read-write - - - STP2 - Two stop bits select. If this bit is set to 1, two stop bits are transmitted at the end of the frame. The receive logic does not check for two stop bits being received. - [3:3] - read-write - - - EPS - Even parity select. Controls the type of parity the UART uses during transmission and reception: 0 = odd parity. The UART generates or checks for an odd number of 1s in the data and parity bits. 1 = even parity. The UART generates or checks for an even number of 1s in the data and parity bits. This bit has no effect when the PEN bit disables parity checking and generation. - [2:2] - read-write - - - PEN - Parity enable: 0 = parity is disabled and no parity bit added to the data frame 1 = parity checking and generation is enabled. - [1:1] - read-write - - - BRK - Send break. If this bit is set to 1, a low-level is continually output on the UARTTXD output, after completing transmission of the current character. For the proper execution of the break command, the software must set this bit for at least two complete frames. For normal use, this bit must be cleared to 0. - [0:0] - read-write - - - - - UARTCR - Control Register, UARTCR - 0x30 - 0x00000300 - - - CTSEN - CTS hardware flow control enable. If this bit is set to 1, CTS hardware flow control is enabled. Data is only transmitted when the nUARTCTS signal is asserted. - [15:15] - read-write - - - RTSEN - RTS hardware flow control enable. If this bit is set to 1, RTS hardware flow control is enabled. Data is only requested when there is space in the receive FIFO for it to be received. - [14:14] - read-write - - - OUT2 - This bit is the complement of the UART Out2 (nUARTOut2) modem status output. That is, when the bit is programmed to a 1, the output is 0. For DTE this can be used as Ring Indicator (RI). - [13:13] - read-write - - - OUT1 - This bit is the complement of the UART Out1 (nUARTOut1) modem status output. That is, when the bit is programmed to a 1 the output is 0. For DTE this can be used as Data Carrier Detect (DCD). - [12:12] - read-write - - - RTS - Request to send. This bit is the complement of the UART request to send, nUARTRTS, modem status output. That is, when the bit is programmed to a 1 then nUARTRTS is LOW. - [11:11] - read-write - - - DTR - Data transmit ready. This bit is the complement of the UART data transmit ready, nUARTDTR, modem status output. That is, when the bit is programmed to a 1 then nUARTDTR is LOW. - [10:10] - read-write - - - RXE - Receive enable. If this bit is set to 1, the receive section of the UART is enabled. Data reception occurs for either UART signals or SIR signals depending on the setting of the SIREN bit. When the UART is disabled in the middle of reception, it completes the current character before stopping. - [9:9] - read-write - - - TXE - Transmit enable. If this bit is set to 1, the transmit section of the UART is enabled. Data transmission occurs for either UART signals, or SIR signals depending on the setting of the SIREN bit. When the UART is disabled in the middle of transmission, it completes the current character before stopping. - [8:8] - read-write - - - LBE - Loopback enable. If this bit is set to 1 and the SIREN bit is set to 1 and the SIRTEST bit in the Test Control Register, UARTTCR is set to 1, then the nSIROUT path is inverted, and fed through to the SIRIN path. The SIRTEST bit in the test register must be set to 1 to override the normal half-duplex SIR operation. This must be the requirement for accessing the test registers during normal operation, and SIRTEST must be cleared to 0 when loopback testing is finished. This feature reduces the amount of external coupling required during system test. If this bit is set to 1, and the SIRTEST bit is set to 0, the UARTTXD path is fed through to the UARTRXD path. In either SIR mode or UART mode, when this bit is set, the modem outputs are also fed through to the modem inputs. This bit is cleared to 0 on reset, to disable loopback. - [7:7] - read-write - - - SIRLP - SIR low-power IrDA mode. This bit selects the IrDA encoding mode. If this bit is cleared to 0, low-level bits are transmitted as an active high pulse with a width of 3 / 16th of the bit period. If this bit is set to 1, low-level bits are transmitted with a pulse width that is 3 times the period of the IrLPBaud16 input signal, regardless of the selected bit rate. Setting this bit uses less power, but might reduce transmission distances. - [2:2] - read-write - - - SIREN - SIR enable: 0 = IrDA SIR ENDEC is disabled. nSIROUT remains LOW (no light pulse generated), and signal transitions on SIRIN have no effect. 1 = IrDA SIR ENDEC is enabled. Data is transmitted and received on nSIROUT and SIRIN. UARTTXD remains HIGH, in the marking state. Signal transitions on UARTRXD or modem status inputs have no effect. This bit has no effect if the UARTEN bit disables the UART. - [1:1] - read-write - - - UARTEN - UART enable: 0 = UART is disabled. If the UART is disabled in the middle of transmission or reception, it completes the current character before stopping. 1 = the UART is enabled. Data transmission and reception occurs for either UART signals or SIR signals depending on the setting of the SIREN bit. - [0:0] - read-write - - - - - UARTIFLS - Interrupt FIFO Level Select Register, UARTIFLS - 0x34 - 0x00000012 - - - RXIFLSEL - Receive interrupt FIFO level select. The trigger points for the receive interrupt are as follows: b000 = Receive FIFO becomes >= 1 / 8 full b001 = Receive FIFO becomes >= 1 / 4 full b010 = Receive FIFO becomes >= 1 / 2 full b011 = Receive FIFO becomes >= 3 / 4 full b100 = Receive FIFO becomes >= 7 / 8 full b101-b111 = reserved. - [5:3] - read-write - - - TXIFLSEL - Transmit interrupt FIFO level select. The trigger points for the transmit interrupt are as follows: b000 = Transmit FIFO becomes <= 1 / 8 full b001 = Transmit FIFO becomes <= 1 / 4 full b010 = Transmit FIFO becomes <= 1 / 2 full b011 = Transmit FIFO becomes <= 3 / 4 full b100 = Transmit FIFO becomes <= 7 / 8 full b101-b111 = reserved. - [2:0] - read-write - - - - - UARTIMSC - Interrupt Mask Set/Clear Register, UARTIMSC - 0x38 - 0x00000000 - - - OEIM - Overrun error interrupt mask. A read returns the current mask for the UARTOEINTR interrupt. On a write of 1, the mask of the UARTOEINTR interrupt is set. A write of 0 clears the mask. - [10:10] - read-write - - - BEIM - Break error interrupt mask. A read returns the current mask for the UARTBEINTR interrupt. On a write of 1, the mask of the UARTBEINTR interrupt is set. A write of 0 clears the mask. - [9:9] - read-write - - - PEIM - Parity error interrupt mask. A read returns the current mask for the UARTPEINTR interrupt. On a write of 1, the mask of the UARTPEINTR interrupt is set. A write of 0 clears the mask. - [8:8] - read-write - - - FEIM - Framing error interrupt mask. A read returns the current mask for the UARTFEINTR interrupt. On a write of 1, the mask of the UARTFEINTR interrupt is set. A write of 0 clears the mask. - [7:7] - read-write - - - RTIM - Receive timeout interrupt mask. A read returns the current mask for the UARTRTINTR interrupt. On a write of 1, the mask of the UARTRTINTR interrupt is set. A write of 0 clears the mask. - [6:6] - read-write - - - TXIM - Transmit interrupt mask. A read returns the current mask for the UARTTXINTR interrupt. On a write of 1, the mask of the UARTTXINTR interrupt is set. A write of 0 clears the mask. - [5:5] - read-write - - - RXIM - Receive interrupt mask. A read returns the current mask for the UARTRXINTR interrupt. On a write of 1, the mask of the UARTRXINTR interrupt is set. A write of 0 clears the mask. - [4:4] - read-write - - - DSRMIM - nUARTDSR modem interrupt mask. A read returns the current mask for the UARTDSRINTR interrupt. On a write of 1, the mask of the UARTDSRINTR interrupt is set. A write of 0 clears the mask. - [3:3] - read-write - - - DCDMIM - nUARTDCD modem interrupt mask. A read returns the current mask for the UARTDCDINTR interrupt. On a write of 1, the mask of the UARTDCDINTR interrupt is set. A write of 0 clears the mask. - [2:2] - read-write - - - CTSMIM - nUARTCTS modem interrupt mask. A read returns the current mask for the UARTCTSINTR interrupt. On a write of 1, the mask of the UARTCTSINTR interrupt is set. A write of 0 clears the mask. - [1:1] - read-write - - - RIMIM - nUARTRI modem interrupt mask. A read returns the current mask for the UARTRIINTR interrupt. On a write of 1, the mask of the UARTRIINTR interrupt is set. A write of 0 clears the mask. - [0:0] - read-write - - - - - UARTRIS - Raw Interrupt Status Register, UARTRIS - 0x3C - 0x00000000 - - - OERIS - Overrun error interrupt status. Returns the raw interrupt state of the UARTOEINTR interrupt. - [10:10] - read-only - - - BERIS - Break error interrupt status. Returns the raw interrupt state of the UARTBEINTR interrupt. - [9:9] - read-only - - - PERIS - Parity error interrupt status. Returns the raw interrupt state of the UARTPEINTR interrupt. - [8:8] - read-only - - - FERIS - Framing error interrupt status. Returns the raw interrupt state of the UARTFEINTR interrupt. - [7:7] - read-only - - - RTRIS - Receive timeout interrupt status. Returns the raw interrupt state of the UARTRTINTR interrupt. a - [6:6] - read-only - - - TXRIS - Transmit interrupt status. Returns the raw interrupt state of the UARTTXINTR interrupt. - [5:5] - read-only - - - RXRIS - Receive interrupt status. Returns the raw interrupt state of the UARTRXINTR interrupt. - [4:4] - read-only - - - DSRRMIS - nUARTDSR modem interrupt status. Returns the raw interrupt state of the UARTDSRINTR interrupt. - [3:3] - read-only - - - DCDRMIS - nUARTDCD modem interrupt status. Returns the raw interrupt state of the UARTDCDINTR interrupt. - [2:2] - read-only - - - CTSRMIS - nUARTCTS modem interrupt status. Returns the raw interrupt state of the UARTCTSINTR interrupt. - [1:1] - read-only - - - RIRMIS - nUARTRI modem interrupt status. Returns the raw interrupt state of the UARTRIINTR interrupt. - [0:0] - read-only - - - - - UARTMIS - Masked Interrupt Status Register, UARTMIS - 0x40 - 0x00000000 - - - OEMIS - Overrun error masked interrupt status. Returns the masked interrupt state of the UARTOEINTR interrupt. - [10:10] - read-only - - - BEMIS - Break error masked interrupt status. Returns the masked interrupt state of the UARTBEINTR interrupt. - [9:9] - read-only - - - PEMIS - Parity error masked interrupt status. Returns the masked interrupt state of the UARTPEINTR interrupt. - [8:8] - read-only - - - FEMIS - Framing error masked interrupt status. Returns the masked interrupt state of the UARTFEINTR interrupt. - [7:7] - read-only - - - RTMIS - Receive timeout masked interrupt status. Returns the masked interrupt state of the UARTRTINTR interrupt. - [6:6] - read-only - - - TXMIS - Transmit masked interrupt status. Returns the masked interrupt state of the UARTTXINTR interrupt. - [5:5] - read-only - - - RXMIS - Receive masked interrupt status. Returns the masked interrupt state of the UARTRXINTR interrupt. - [4:4] - read-only - - - DSRMMIS - nUARTDSR modem masked interrupt status. Returns the masked interrupt state of the UARTDSRINTR interrupt. - [3:3] - read-only - - - DCDMMIS - nUARTDCD modem masked interrupt status. Returns the masked interrupt state of the UARTDCDINTR interrupt. - [2:2] - read-only - - - CTSMMIS - nUARTCTS modem masked interrupt status. Returns the masked interrupt state of the UARTCTSINTR interrupt. - [1:1] - read-only - - - RIMMIS - nUARTRI modem masked interrupt status. Returns the masked interrupt state of the UARTRIINTR interrupt. - [0:0] - read-only - - - - - UARTICR - Interrupt Clear Register, UARTICR - 0x44 - 0x00000000 - - - OEIC - Overrun error interrupt clear. Clears the UARTOEINTR interrupt. - [10:10] - read-write - oneToClear - - - BEIC - Break error interrupt clear. Clears the UARTBEINTR interrupt. - [9:9] - read-write - oneToClear - - - PEIC - Parity error interrupt clear. Clears the UARTPEINTR interrupt. - [8:8] - read-write - oneToClear - - - FEIC - Framing error interrupt clear. Clears the UARTFEINTR interrupt. - [7:7] - read-write - oneToClear - - - RTIC - Receive timeout interrupt clear. Clears the UARTRTINTR interrupt. - [6:6] - read-write - oneToClear - - - TXIC - Transmit interrupt clear. Clears the UARTTXINTR interrupt. - [5:5] - read-write - oneToClear - - - RXIC - Receive interrupt clear. Clears the UARTRXINTR interrupt. - [4:4] - read-write - oneToClear - - - DSRMIC - nUARTDSR modem interrupt clear. Clears the UARTDSRINTR interrupt. - [3:3] - read-write - oneToClear - - - DCDMIC - nUARTDCD modem interrupt clear. Clears the UARTDCDINTR interrupt. - [2:2] - read-write - oneToClear - - - CTSMIC - nUARTCTS modem interrupt clear. Clears the UARTCTSINTR interrupt. - [1:1] - read-write - oneToClear - - - RIMIC - nUARTRI modem interrupt clear. Clears the UARTRIINTR interrupt. - [0:0] - read-write - oneToClear - - - - - UARTDMACR - DMA Control Register, UARTDMACR - 0x48 - 0x00000000 - - - DMAONERR - DMA on error. If this bit is set to 1, the DMA receive request outputs, UARTRXDMASREQ or UARTRXDMABREQ, are disabled when the UART error interrupt is asserted. - [2:2] - read-write - - - TXDMAE - Transmit DMA enable. If this bit is set to 1, DMA for the transmit FIFO is enabled. - [1:1] - read-write - - - RXDMAE - Receive DMA enable. If this bit is set to 1, DMA for the receive FIFO is enabled. - [0:0] - read-write - - - - - UARTPERIPHID0 - UARTPeriphID0 Register - 0xFE0 - 0x00000011 - - - PARTNUMBER0 - These bits read back as 0x11 - [7:0] - read-only - - - - - UARTPERIPHID1 - UARTPeriphID1 Register - 0xFE4 - 0x00000010 - - - DESIGNER0 - These bits read back as 0x1 - [7:4] - read-only - - - PARTNUMBER1 - These bits read back as 0x0 - [3:0] - read-only - - - - - UARTPERIPHID2 - UARTPeriphID2 Register - 0xFE8 - 0x00000034 - - - REVISION - This field depends on the revision of the UART: r1p0 0x0 r1p1 0x1 r1p3 0x2 r1p4 0x2 r1p5 0x3 - [7:4] - read-only - - - DESIGNER1 - These bits read back as 0x4 - [3:0] - read-only - - - - - UARTPERIPHID3 - UARTPeriphID3 Register - 0xFEC - 0x00000000 - - - CONFIGURATION - These bits read back as 0x00 - [7:0] - read-only - - - - - UARTPCELLID0 - UARTPCellID0 Register - 0xFF0 - 0x0000000D - - - UARTPCELLID0 - These bits read back as 0x0D - [7:0] - read-only - - - - - UARTPCELLID1 - UARTPCellID1 Register - 0xFF4 - 0x000000F0 - - - UARTPCELLID1 - These bits read back as 0xF0 - [7:0] - read-only - - - - - UARTPCELLID2 - UARTPCellID2 Register - 0xFF8 - 0x00000005 - - - UARTPCELLID2 - These bits read back as 0x05 - [7:0] - read-only - - - - - UARTPCELLID3 - UARTPCellID3 Register - 0xFFC - 0x000000B1 - - - UARTPCELLID3 - These bits read back as 0xB1 - [7:0] - read-only - - - - - - - UART1 - 0x40078000 - - UART1_IRQ - 34 - - - - ROSC - 0x400E8000 - - 0x0 - 0x28 - registers - - - - CTRL - Ring Oscillator control - 0x0 - 0x00000AA0 - - - ENABLE - On power-up this field is initialised to ENABLE - The system clock must be switched to another source before setting this field to DISABLE otherwise the chip will lock up - The 12-bit code is intended to give some protection against accidental writes. An invalid setting will enable the oscillator. - [23:12] - read-write - - - DISABLE - 3358 - - - ENABLE - 4011 - - - - - FREQ_RANGE - Controls the number of delay stages in the ROSC ring - LOW uses stages 0 to 7 - MEDIUM uses stages 2 to 7 - HIGH uses stages 4 to 7 - TOOHIGH uses stages 6 to 7 and should not be used because its frequency exceeds design specifications - The clock output will not glitch when changing the range up one step at a time - The clock output will glitch when changing the range down - Note: the values here are gray coded which is why HIGH comes before TOOHIGH - [11:0] - read-write - - - LOW - 4004 - - - MEDIUM - 4005 - - - HIGH - 4007 - - - TOOHIGH - 4006 - - - - - - - FREQA - The FREQA & FREQB registers control the frequency by controlling the drive strength of each stage - The drive strength has 4 levels determined by the number of bits set - Increasing the number of bits set increases the drive strength and increases the oscillation frequency - 0 bits set is the default drive strength - 1 bit set doubles the drive strength - 2 bits set triples drive strength - 3 bits set quadruples drive strength - For frequency randomisation set both DS0_RANDOM=1 & DS1_RANDOM=1 - 0x4 - 0x00000000 - - - PASSWD - Set to 0x9696 to apply the settings - Any other value in this field will set all drive strengths to 0 - [31:16] - read-write - - - PASS - 38550 - - - - - DS3 - Stage 3 drive strength - [14:12] - read-write - - - DS2 - Stage 2 drive strength - [10:8] - read-write - - - DS1_RANDOM - Randomises the stage 1 drive strength - [7:7] - read-write - - - DS1 - Stage 1 drive strength - [6:4] - read-write - - - DS0_RANDOM - Randomises the stage 0 drive strength - [3:3] - read-write - - - DS0 - Stage 0 drive strength - [2:0] - read-write - - - - - FREQB - For a detailed description see freqa register - 0x8 - 0x00000000 - - - PASSWD - Set to 0x9696 to apply the settings - Any other value in this field will set all drive strengths to 0 - [31:16] - read-write - - - PASS - 38550 - - - - - DS7 - Stage 7 drive strength - [14:12] - read-write - - - DS6 - Stage 6 drive strength - [10:8] - read-write - - - DS5 - Stage 5 drive strength - [6:4] - read-write - - - DS4 - Stage 4 drive strength - [2:0] - read-write - - - - - RANDOM - Loads a value to the LFSR randomiser - 0xC - 0x3F04B16D - - - SEED - [31:0] - read-write - - - - - DORMANT - Ring Oscillator pause control - 0x10 - 0x00000000 - - - DORMANT - This is used to save power by pausing the ROSC - On power-up this field is initialised to WAKE - An invalid write will also select WAKE - Warning: setup the irq before selecting dormant mode - [31:0] - read-write - - - dormant - 1668246881 - - - WAKE - 2002873189 - - - - - - - DIV - Controls the output divider - 0x14 - 0x00000000 - - - DIV - set to 0xaa00 + div where - div = 0 divides by 128 - div = 1-127 divides by div - any other value sets div=128 - this register resets to div=32 - [15:0] - read-write - - - PASS - 43520 - - - - - - - PHASE - Controls the phase shifted output - 0x18 - 0x00000008 - - - PASSWD - set to 0xaa - any other value enables the output with shift=0 - [11:4] - read-write - - - ENABLE - enable the phase-shifted output - this can be changed on-the-fly - [3:3] - read-write - - - FLIP - invert the phase-shifted output - this is ignored when div=1 - [2:2] - read-write - - - SHIFT - phase shift the phase-shifted output by SHIFT input clocks - this can be changed on-the-fly - must be set to 0 before setting div=1 - [1:0] - read-write - - - - - STATUS - Ring Oscillator Status - 0x1C - 0x00000000 - - - STABLE - Oscillator is running and stable - [31:31] - read-only - - - BADWRITE - An invalid value has been written to CTRL_ENABLE or CTRL_FREQ_RANGE or FREQA or FREQB or DIV or PHASE or DORMANT - [24:24] - read-write - oneToClear - - - DIV_RUNNING - post-divider is running - this resets to 0 but transitions to 1 during chip startup - [16:16] - read-only - - - ENABLED - Oscillator is enabled but not necessarily running and stable - this resets to 0 but transitions to 1 during chip startup - [12:12] - read-only - - - - - RANDOMBIT - This just reads the state of the oscillator output so randomness is compromised if the ring oscillator is stopped or run at a harmonic of the bus frequency - 0x20 - 0x00000001 - - - RANDOMBIT - [0:0] - read-only - - - - - COUNT - A down counter running at the ROSC frequency which counts to zero and stops. - To start the counter write a non-zero value. - Can be used for short software pauses when setting up time sensitive hardware. - 0x24 - 0x00000000 - - - COUNT - [15:0] - read-write - - - - - - - POWMAN - Controls vreg, bor, lposc, chip resets & xosc startup, powman and provides scratch register for general use and for bootcode use - 0x40100000 - - 0x0 - 0xF0 - registers - - - POWMAN_IRQ_POW - 44 - - - POWMAN_IRQ_TIMER - 45 - - - - BADPASSWD - Indicates a bad password has been used - 0x0 - 0x00000000 - - - BADPASSWD - [0:0] - read-write - oneToClear - - - - - VREG_CTRL - Voltage Regulator Control - 0x4 - 0x00008050 - - - RST_N - returns the regulator to its startup settings - 0 - reset - 1 - not reset (default) - [15:15] - read-write - - - UNLOCK - unlocks the VREG control interface after power up - 0 - Locked (default) - 1 - Unlocked - It cannot be relocked when it is unlocked. - [13:13] - read-write - - - ISOLATE - isolates the VREG control interface - 0 - not isolated (default) - 1 - isolated - [12:12] - read-write - - - DISABLE_VOLTAGE_LIMIT - 0=not disabled, 1=enabled - [8:8] - read-write - - - HT_TH - high temperature protection threshold - regulator power transistors are disabled when junction temperature exceeds threshold - 000 - 100C - 001 - 105C - 010 - 110C - 011 - 115C - 100 - 120C - 101 - 125C - 110 - 135C - 111 - 150C - [6:4] - read-write - - - - - VREG_STS - Voltage Regulator Status - 0x8 - 0x00000000 - - - VOUT_OK - output regulation status - 0=not in regulation, 1=in regulation - [4:4] - read-only - - - STARTUP - startup status - 0=startup complete, 1=starting up - [0:0] - read-only - - - - - VREG - Voltage Regulator Settings - 0xC - 0x000000B0 - - - UPDATE_IN_PROGRESS - regulator state is being updated - writes to the vreg register will be ignored when this field is set - [15:15] - read-only - - - VSEL - output voltage select - the regulator output voltage is limited to 1.3V unless the voltage limit - is disabled using the disable_voltage_limit field in the vreg_ctrl register - 00000 - 0.55V - 00001 - 0.60V - 00010 - 0.65V - 00011 - 0.70V - 00100 - 0.75V - 00101 - 0.80V - 00110 - 0.85V - 00111 - 0.90V - 01000 - 0.95V - 01001 - 1.00V - 01010 - 1.05V - 01011 - 1.10V (default) - 01100 - 1.15V - 01101 - 1.20V - 01110 - 1.25V - 01111 - 1.30V - 10000 - 1.35V - 10001 - 1.40V - 10010 - 1.50V - 10011 - 1.60V - 10100 - 1.65V - 10101 - 1.70V - 10110 - 1.80V - 10111 - 1.90V - 11000 - 2.00V - 11001 - 2.35V - 11010 - 2.50V - 11011 - 2.65V - 11100 - 2.80V - 11101 - 3.00V - 11110 - 3.15V - 11111 - 3.30V - [8:4] - read-write - - - HIZ - high impedance mode select - 0=not in high impedance mode, 1=in high impedance mode - [1:1] - read-write - - - - - VREG_LP_ENTRY - Voltage Regulator Low Power Entry Settings - 0x10 - 0x000000B4 - - - VSEL - output voltage select - the regulator output voltage is limited to 1.3V unless the voltage limit - is disabled using the disable_voltage_limit field in the vreg_ctrl register - 00000 - 0.55V - 00001 - 0.60V - 00010 - 0.65V - 00011 - 0.70V - 00100 - 0.75V - 00101 - 0.80V - 00110 - 0.85V - 00111 - 0.90V - 01000 - 0.95V - 01001 - 1.00V - 01010 - 1.05V - 01011 - 1.10V (default) - 01100 - 1.15V - 01101 - 1.20V - 01110 - 1.25V - 01111 - 1.30V - 10000 - 1.35V - 10001 - 1.40V - 10010 - 1.50V - 10011 - 1.60V - 10100 - 1.65V - 10101 - 1.70V - 10110 - 1.80V - 10111 - 1.90V - 11000 - 2.00V - 11001 - 2.35V - 11010 - 2.50V - 11011 - 2.65V - 11100 - 2.80V - 11101 - 3.00V - 11110 - 3.15V - 11111 - 3.30V - [8:4] - read-write - - - MODE - selects either normal (switching) mode or low power (linear) mode - low power mode can only be selected for output voltages up to 1.3V - 0 = normal mode (switching) - 1 = low power mode (linear) - [2:2] - read-write - - - HIZ - high impedance mode select - 0=not in high impedance mode, 1=in high impedance mode - [1:1] - read-write - - - - - VREG_LP_EXIT - Voltage Regulator Low Power Exit Settings - 0x14 - 0x000000B0 - - - VSEL - output voltage select - the regulator output voltage is limited to 1.3V unless the voltage limit - is disabled using the disable_voltage_limit field in the vreg_ctrl register - 00000 - 0.55V - 00001 - 0.60V - 00010 - 0.65V - 00011 - 0.70V - 00100 - 0.75V - 00101 - 0.80V - 00110 - 0.85V - 00111 - 0.90V - 01000 - 0.95V - 01001 - 1.00V - 01010 - 1.05V - 01011 - 1.10V (default) - 01100 - 1.15V - 01101 - 1.20V - 01110 - 1.25V - 01111 - 1.30V - 10000 - 1.35V - 10001 - 1.40V - 10010 - 1.50V - 10011 - 1.60V - 10100 - 1.65V - 10101 - 1.70V - 10110 - 1.80V - 10111 - 1.90V - 11000 - 2.00V - 11001 - 2.35V - 11010 - 2.50V - 11011 - 2.65V - 11100 - 2.80V - 11101 - 3.00V - 11110 - 3.15V - 11111 - 3.30V - [8:4] - read-write - - - MODE - selects either normal (switching) mode or low power (linear) mode - low power mode can only be selected for output voltages up to 1.3V - 0 = normal mode (switching) - 1 = low power mode (linear) - [2:2] - read-write - - - HIZ - high impedance mode select - 0=not in high impedance mode, 1=in high impedance mode - [1:1] - read-write - - - - - BOD_CTRL - Brown-out Detection Control - 0x18 - 0x00000000 - - - ISOLATE - isolates the brown-out detection control interface - 0 - not isolated (default) - 1 - isolated - [12:12] - read-write - - - - - BOD - Brown-out Detection Settings - 0x1C - 0x000000B1 - - - VSEL - threshold select - 00000 - 0.473V - 00001 - 0.516V - 00010 - 0.559V - 00011 - 0.602V - 00100 - 0.645VS - 00101 - 0.688V - 00110 - 0.731V - 00111 - 0.774V - 01000 - 0.817V - 01001 - 0.860V (default) - 01010 - 0.903V - 01011 - 0.946V - 01100 - 0.989V - 01101 - 1.032V - 01110 - 1.075V - 01111 - 1.118V - 10000 - 1.161 - 10001 - 1.204V - [8:4] - read-write - - - EN - enable brown-out detection - 0=not enabled, 1=enabled - [0:0] - read-write - - - - - BOD_LP_ENTRY - Brown-out Detection Low Power Entry Settings - 0x20 - 0x000000B0 - - - VSEL - threshold select - 00000 - 0.473V - 00001 - 0.516V - 00010 - 0.559V - 00011 - 0.602V - 00100 - 0.645VS - 00101 - 0.688V - 00110 - 0.731V - 00111 - 0.774V - 01000 - 0.817V - 01001 - 0.860V (default) - 01010 - 0.903V - 01011 - 0.946V - 01100 - 0.989V - 01101 - 1.032V - 01110 - 1.075V - 01111 - 1.118V - 10000 - 1.161 - 10001 - 1.204V - [8:4] - read-write - - - EN - enable brown-out detection - 0=not enabled, 1=enabled - [0:0] - read-write - - - - - BOD_LP_EXIT - Brown-out Detection Low Power Exit Settings - 0x24 - 0x000000B1 - - - VSEL - threshold select - 00000 - 0.473V - 00001 - 0.516V - 00010 - 0.559V - 00011 - 0.602V - 00100 - 0.645VS - 00101 - 0.688V - 00110 - 0.731V - 00111 - 0.774V - 01000 - 0.817V - 01001 - 0.860V (default) - 01010 - 0.903V - 01011 - 0.946V - 01100 - 0.989V - 01101 - 1.032V - 01110 - 1.075V - 01111 - 1.118V - 10000 - 1.161 - 10001 - 1.204V - [8:4] - read-write - - - EN - enable brown-out detection - 0=not enabled, 1=enabled - [0:0] - read-write - - - - - LPOSC - Low power oscillator control register. - 0x28 - 0x00000203 - - - TRIM - Frequency trim - the trim step is typically 1% of the reset frequency, but can be up to 3% - [9:4] - read-write - - - MODE - This feature has been removed - [1:0] - read-write - - - - - CHIP_RESET - Chip reset control and status - 0x2C - 0x00000000 - - - HAD_WATCHDOG_RESET_RSM - Last reset was a watchdog timeout which was configured to reset the power-on state machine - This resets: - double_tap flag no - DP no - RPAP no - rescue_flag no - timer no - powman no - swcore no - psm yes - and does not change the power state - [28:28] - read-only - - - HAD_HZD_SYS_RESET_REQ - Last reset was a system reset from the hazard debugger - This resets: - double_tap flag no - DP no - RPAP no - rescue_flag no - timer no - powman no - swcore no - psm yes - and does not change the power state - [27:27] - read-only - - - HAD_GLITCH_DETECT - Last reset was due to a power supply glitch - This resets: - double_tap flag no - DP no - RPAP no - rescue_flag no - timer no - powman no - swcore no - psm yes - and does not change the power state - [26:26] - read-only - - - HAD_SWCORE_PD - Last reset was a switched core powerdown - This resets: - double_tap flag no - DP no - RPAP no - rescue_flag no - timer no - powman no - swcore yes - psm yes - then starts the power sequencer - [25:25] - read-only - - - HAD_WATCHDOG_RESET_SWCORE - Last reset was a watchdog timeout which was configured to reset the switched-core - This resets: - double_tap flag no - DP no - RPAP no - rescue_flag no - timer no - powman no - swcore yes - psm yes - then starts the power sequencer - [24:24] - read-only - - - HAD_WATCHDOG_RESET_POWMAN - Last reset was a watchdog timeout which was configured to reset the power manager - This resets: - double_tap flag no - DP no - RPAP no - rescue_flag no - timer yes - powman yes - swcore yes - psm yes - then starts the power sequencer - [23:23] - read-only - - - HAD_WATCHDOG_RESET_POWMAN_ASYNC - Last reset was a watchdog timeout which was configured to reset the power manager asynchronously - This resets: - double_tap flag no - DP no - RPAP no - rescue_flag no - timer yes - powman yes - swcore yes - psm yes - then starts the power sequencer - [22:22] - read-only - - - HAD_RESCUE - Last reset was a rescue reset from the debugger - This resets: - double_tap flag no - DP no - RPAP no - rescue_flag no, it sets this flag - timer yes - powman yes - swcore yes - psm yes - then starts the power sequencer - [21:21] - read-only - - - HAD_DP_RESET_REQ - Last reset was an reset request from the arm debugger - This resets: - double_tap flag no - DP no - RPAP no - rescue_flag yes - timer yes - powman yes - swcore yes - psm yes - then starts the power sequencer - [19:19] - read-only - - - HAD_RUN_LOW - Last reset was from the RUN pin - This resets: - double_tap flag no - DP yes - RPAP yes - rescue_flag yes - timer yes - powman yes - swcore yes - psm yes - then starts the power sequencer - [18:18] - read-only - - - HAD_BOR - Last reset was from the brown-out detection block - This resets: - double_tap flag yes - DP yes - RPAP yes - rescue_flag yes - timer yes - powman yes - swcore yes - psm yes - then starts the power sequencer - [17:17] - read-only - - - HAD_POR - Last reset was from the power-on reset - This resets: - double_tap flag yes - DP yes - RPAP yes - rescue_flag yes - timer yes - powman yes - swcore yes - psm yes - then starts the power sequencer - [16:16] - read-only - - - RESCUE_FLAG - This is set by a rescue reset from the RP-AP. - Its purpose is to halt before the bootrom before booting from flash in order to recover from a boot lock-up. - The debugger can then attach once the bootrom has been halted and flash some working code that does not lock up. - [4:4] - read-write - oneToClear - - - DOUBLE_TAP - This flag is set by double-tapping RUN. It tells bootcode to go into the bootloader. - [0:0] - read-write - - - - - WDSEL - Allows a watchdog reset to reset the internal state of powman in addition to the power-on state machine (PSM). - Note that powman ignores watchdog resets that do not select at least the CLOCKS stage or earlier stages in the PSM. If using these bits, it's recommended to set PSM_WDSEL to all-ones in addition to the desired bits in this register. Failing to select CLOCKS or earlier will result in the POWMAN_WDSEL register having no effect. - 0x30 - 0x00000000 - - - RESET_RSM - If set to 1, a watchdog reset will run the full power-on state machine (PSM) sequence - From a user perspective it is the same as setting RSM_WDSEL_PROC_COLD - From a hardware debug perspective it has the same effect as a reset from a glitch detector - [12:12] - read-write - - - RESET_SWCORE - If set to 1, a watchdog reset will reset the switched core power domain and run the full power-on state machine (PSM) sequence - From a user perspective it is the same as setting RSM_WDSEL_PROC_COLD - From a hardware debug perspective it has the same effect as a power-on reset for the switched core power domain - [8:8] - read-write - - - RESET_POWMAN - If set to 1, a watchdog reset will restore powman defaults, reset the timer, reset the switched core power domain - and run the full power-on state machine (PSM) sequence - This relies on clk_ref running. Use reset_powman_async if that may not be true - [4:4] - read-write - - - RESET_POWMAN_ASYNC - If set to 1, a watchdog reset will restore powman defaults, reset the timer, - reset the switched core domain and run the full power-on state machine (PSM) sequence - This does not rely on clk_ref running - [0:0] - read-write - - - - - SEQ_CFG - For configuration of the power sequencer - Writes are ignored while POWMAN_STATE_CHANGING=1 - 0x34 - 0x001011F0 - - - USING_FAST_POWCK - 0 indicates the POWMAN clock is running from the low power oscillator (32kHz) - 1 indicates the POWMAN clock is running from the reference clock (2-50MHz) - [20:20] - read-only - - - USING_BOD_LP - Indicates the brown-out detector (BOD) mode - 0 = BOD high power mode which is the default - 1 = BOD low power mode - [17:17] - read-only - - - USING_VREG_LP - Indicates the voltage regulator (VREG) mode - 0 = VREG high power mode which is the default - 1 = VREG low power mode - [16:16] - read-only - - - USE_FAST_POWCK - selects the reference clock (clk_ref) as the source of the POWMAN clock when switched-core is powered. The POWMAN clock always switches to the slow clock (lposc) when switched-core is powered down because the fast clock stops running. - 0 always run the POWMAN clock from the slow clock (lposc) - 1 run the POWMAN clock from the fast clock when available - This setting takes effect when a power up sequence is next run - [12:12] - read-write - - - RUN_LPOSC_IN_LP - Set to 0 to stop the low power osc when the switched-core is powered down, which is unwise if using it to clock the timer - This setting takes effect when the swcore is next powered down - [8:8] - read-write - - - USE_BOD_HP - Set to 0 to prevent automatic switching to bod high power mode when switched-core is powered up - This setting takes effect when the swcore is next powered up - [7:7] - read-write - - - USE_BOD_LP - Set to 0 to prevent automatic switching to bod low power mode when switched-core is powered down - This setting takes effect when the swcore is next powered down - [6:6] - read-write - - - USE_VREG_HP - Set to 0 to prevent automatic switching to vreg high power mode when switched-core is powered up - This setting takes effect when the swcore is next powered up - [5:5] - read-write - - - USE_VREG_LP - Set to 0 to prevent automatic switching to vreg low power mode when switched-core is powered down - This setting takes effect when the swcore is next powered down - [4:4] - read-write - - - HW_PWRUP_SRAM0 - Specifies the power state of SRAM0 when powering up swcore from a low power state (P1.xxx) to a high power state (P0.0xx). - 0=power-up - 1=no change - [1:1] - read-write - - - HW_PWRUP_SRAM1 - Specifies the power state of SRAM1 when powering up swcore from a low power state (P1.xxx) to a high power state (P0.0xx). - 0=power-up - 1=no change - [0:0] - read-write - - - - - STATE - This register controls the power state of the 4 power domains. - The current power state is indicated in POWMAN_STATE_CURRENT which is read-only. - To change the state, write to POWMAN_STATE_REQ. - The coding of POWMAN_STATE_CURRENT & POWMAN_STATE_REQ corresponds to the power states - defined in the datasheet: - bit 3 = SWCORE - bit 2 = XIP cache - bit 1 = SRAM0 - bit 0 = SRAM1 - 0 = powered up - 1 = powered down - When POWMAN_STATE_REQ is written, the POWMAN_STATE_WAITING flag is set while the Power Manager determines what is required. If an invalid transition is requested the Power Manager will still register the request in POWMAN_STATE_REQ but will also set the POWMAN_BAD_REQ flag. It will then implement the power-up requests and ignore the power down requests. To do nothing would risk entering an unrecoverable lock-up state. Invalid requests are: any combination of power up and power down requests any request that results in swcore boing powered and xip unpowered If the request is to power down the switched-core domain then POWMAN_STATE_WAITING stays active until the processors halt. During this time the POWMAN_STATE_REQ field can be re-written to change or cancel the request. When the power state transition begins the POWMAN_STATE_WAITING_flag is cleared, the POWMAN_STATE_CHANGING flag is set and POWMAN register writes are ignored until the transition completes. - 0x38 - 0x0000000F - - - CHANGING - [13:13] - read-only - - - WAITING - [12:12] - read-only - - - BAD_HW_REQ - Bad hardware initiated state request. Went back to state 0 (i.e. everything powered up) - [11:11] - read-only - - - BAD_SW_REQ - Bad software initiated state request. No action taken. - [10:10] - read-only - - - PWRUP_WHILE_WAITING - Request ignored because of a pending pwrup request. See current_pwrup_req. Note this blocks powering up AND powering down. - [9:9] - read-write - oneToClear - - - REQ_IGNORED - [8:8] - read-write - oneToClear - - - REQ - [7:4] - read-write - - - CURRENT - [3:0] - read-only - - - - - POW_FASTDIV - 0x3C - 0x00000040 - - - POW_FASTDIV - divides the POWMAN clock to provide a tick for the delay module and state machines - when clk_pow is running from the slow clock it is not divided - when clk_pow is running from the fast clock it is divided by tick_div - [10:0] - read-write - - - - - POW_DELAY - power state machine delays - 0x40 - 0x00002011 - - - SRAM_STEP - timing between the sram0 and sram1 power state machine steps - measured in units of the powman tick period (>=1us), 0 gives a delay of 1 unit - [15:8] - read-write - - - XIP_STEP - timing between the xip power state machine steps - measured in units of the lposc period, 0 gives a delay of 1 unit - [7:4] - read-write - - - SWCORE_STEP - timing between the swcore power state machine steps - measured in units of the lposc period, 0 gives a delay of 1 unit - [3:0] - read-write - - - - - EXT_CTRL0 - Configures a gpio as a power mode aware control output - 0x44 - 0x0000003F - - - LP_EXIT_STATE - output level when exiting the low power state - [14:14] - read-write - - - LP_ENTRY_STATE - output level when entering the low power state - [13:13] - read-write - - - INIT_STATE - [12:12] - read-write - - - INIT - [8:8] - read-write - - - GPIO_SELECT - selects from gpio 0->30 - set to 31 to disable this feature - [5:0] - read-write - - - - - EXT_CTRL1 - Configures a gpio as a power mode aware control output - 0x48 - 0x0000003F - - - LP_EXIT_STATE - output level when exiting the low power state - [14:14] - read-write - - - LP_ENTRY_STATE - output level when entering the low power state - [13:13] - read-write - - - INIT_STATE - [12:12] - read-write - - - INIT - [8:8] - read-write - - - GPIO_SELECT - selects from gpio 0->30 - set to 31 to disable this feature - [5:0] - read-write - - - - - EXT_TIME_REF - Select a GPIO to use as a time reference, the source can be used to drive the low power clock at 32kHz, or to provide a 1ms tick to the timer, or provide a 1Hz tick to the timer. The tick selection is controlled by the POWMAN_TIMER register. - 0x4C - 0x00000000 - - - DRIVE_LPCK - Use the selected GPIO to drive the 32kHz low power clock, in place of LPOSC. This field must only be written when POWMAN_TIMER_RUN=0 - [4:4] - read-write - - - SOURCE_SEL - 0 -> gpio12 - 1 -> gpio20 - 2 -> gpio14 - 3 -> gpio22 - [1:0] - read-write - - - - - LPOSC_FREQ_KHZ_INT - Informs the AON Timer of the integer component of the clock frequency when running off the LPOSC. - 0x50 - 0x00000020 - - - LPOSC_FREQ_KHZ_INT - Integer component of the LPOSC or GPIO clock source frequency in kHz. Default = 32 This field must only be written when POWMAN_TIMER_RUN=0 or POWMAN_TIMER_USING_XOSC=1 - [5:0] - read-write - - - - - LPOSC_FREQ_KHZ_FRAC - Informs the AON Timer of the fractional component of the clock frequency when running off the LPOSC. - 0x54 - 0x0000C49C - - - LPOSC_FREQ_KHZ_FRAC - Fractional component of the LPOSC or GPIO clock source frequency in kHz. Default = 0.768 This field must only be written when POWMAN_TIMER_RUN=0 or POWMAN_TIMER_USING_XOSC=1 - [15:0] - read-write - - - - - XOSC_FREQ_KHZ_INT - Informs the AON Timer of the integer component of the clock frequency when running off the XOSC. - 0x58 - 0x00002EE0 - - - XOSC_FREQ_KHZ_INT - Integer component of the XOSC frequency in kHz. Default = 12000 Must be >1 This field must only be written when POWMAN_TIMER_RUN=0 or POWMAN_TIMER_USING_XOSC=0 - [15:0] - read-write - - - - - XOSC_FREQ_KHZ_FRAC - Informs the AON Timer of the fractional component of the clock frequency when running off the XOSC. - 0x5C - 0x00000000 - - - XOSC_FREQ_KHZ_FRAC - Fractional component of the XOSC frequency in kHz. This field must only be written when POWMAN_TIMER_RUN=0 or POWMAN_TIMER_USING_XOSC=0 - [15:0] - read-write - - - - - SET_TIME_63TO48 - 0x60 - 0x00000000 - - - SET_TIME_63TO48 - For setting the time, do not use for reading the time, use POWMAN_READ_TIME_UPPER and POWMAN_READ_TIME_LOWER. This field must only be written when POWMAN_TIMER_RUN=0 - [15:0] - read-write - - - - - SET_TIME_47TO32 - 0x64 - 0x00000000 - - - SET_TIME_47TO32 - For setting the time, do not use for reading the time, use POWMAN_READ_TIME_UPPER and POWMAN_READ_TIME_LOWER. This field must only be written when POWMAN_TIMER_RUN=0 - [15:0] - read-write - - - - - SET_TIME_31TO16 - 0x68 - 0x00000000 - - - SET_TIME_31TO16 - For setting the time, do not use for reading the time, use POWMAN_READ_TIME_UPPER and POWMAN_READ_TIME_LOWER. This field must only be written when POWMAN_TIMER_RUN=0 - [15:0] - read-write - - - - - SET_TIME_15TO0 - 0x6C - 0x00000000 - - - SET_TIME_15TO0 - For setting the time, do not use for reading the time, use POWMAN_READ_TIME_UPPER and POWMAN_READ_TIME_LOWER. This field must only be written when POWMAN_TIMER_RUN=0 - [15:0] - read-write - - - - - READ_TIME_UPPER - 0x70 - 0x00000000 - - - READ_TIME_UPPER - For reading bits 63:32 of the timer. When reading all 64 bits it is possible for the LOWER count to rollover during the read. It is recommended to read UPPER, then LOWER, then re-read UPPER and, if it has changed, re-read LOWER. - [31:0] - read-only - - - - - READ_TIME_LOWER - 0x74 - 0x00000000 - - - READ_TIME_LOWER - For reading bits 31:0 of the timer. - [31:0] - read-only - - - - - ALARM_TIME_63TO48 - 0x78 - 0x00000000 - - - ALARM_TIME_63TO48 - This field must only be written when POWMAN_ALARM_ENAB=0 - [15:0] - read-write - - - - - ALARM_TIME_47TO32 - 0x7C - 0x00000000 - - - ALARM_TIME_47TO32 - This field must only be written when POWMAN_ALARM_ENAB=0 - [15:0] - read-write - - - - - ALARM_TIME_31TO16 - 0x80 - 0x00000000 - - - ALARM_TIME_31TO16 - This field must only be written when POWMAN_ALARM_ENAB=0 - [15:0] - read-write - - - - - ALARM_TIME_15TO0 - 0x84 - 0x00000000 - - - ALARM_TIME_15TO0 - This field must only be written when POWMAN_ALARM_ENAB=0 - [15:0] - read-write - - - - - TIMER - 0x88 - 0x00000000 - - - USING_GPIO_1HZ - Timer is synchronised to a 1hz gpio source - [19:19] - read-only - - - USING_GPIO_1KHZ - Timer is running from a 1khz gpio source - [18:18] - read-only - - - USING_LPOSC - Timer is running from lposc - [17:17] - read-only - - - USING_XOSC - Timer is running from xosc - [16:16] - read-only - - - USE_GPIO_1HZ - Selects the gpio source as the reference for the sec counter. The msec counter will continue to use the lposc or xosc reference. - [13:13] - read-write - - - USE_GPIO_1KHZ - switch to gpio as the source of the 1kHz timer tick - [10:10] - write-only - - - USE_XOSC - switch to xosc as the source of the 1kHz timer tick - [9:9] - write-only - - - USE_LPOSC - Switch to lposc as the source of the 1kHz timer tick - [8:8] - write-only - - - ALARM - Alarm has fired. Write to 1 to clear the alarm. - [6:6] - read-write - oneToClear - - - PWRUP_ON_ALARM - Alarm wakes the chip from low power mode - [5:5] - read-write - - - ALARM_ENAB - Enables the alarm. The alarm must be disabled while writing the alarm time. - [4:4] - read-write - - - CLEAR - Clears the timer, does not disable the timer and does not affect the alarm. This control can be written at any time. - [2:2] - write-only - - - RUN - Timer enable. Setting this bit causes the timer to begin counting up from its current value. Clearing this bit stops the timer from counting. - - Before enabling the timer, set the POWMAN_LPOSC_FREQ* and POWMAN_XOSC_FREQ* registers to configure the count rate, and initialise the current time by writing to SET_TIME_63TO48 through SET_TIME_15TO0. You must not write to the SET_TIME_x registers when the timer is running. - - Once configured, start the timer by setting POWMAN_TIMER_RUN=1. This will start the timer running from the LPOSC. When the XOSC is available switch the reference clock to XOSC then select it as the timer clock by setting POWMAN_TIMER_USE_XOSC=1 - [1:1] - read-write - - - NONSEC_WRITE - Control whether Non-secure software can write to the timer registers. All other registers are hardwired to be inaccessible to Non-secure. - [0:0] - read-write - - - - - PWRUP0 - 4 GPIO powerup events can be configured to wake the chip up from a low power state. - The pwrups are level/edge sensitive and can be set to trigger on a high/rising or low/falling event - The number of gpios available depends on the package option. An invalid selection will be ignored - source = 0 selects gpio0 - . - . - source = 47 selects gpio47 - source = 48 selects qspi_ss - source = 49 selects qspi_sd0 - source = 50 selects qspi_sd1 - source = 51 selects qspi_sd2 - source = 52 selects qspi_sd3 - source = 53 selects qspi_sclk - level = 0 triggers the pwrup when the source is low - level = 1 triggers the pwrup when the source is high - 0x8C - 0x0000003F - - - RAW_STATUS - Value of selected gpio pin (only if enable == 1) - [10:10] - read-only - - - STATUS - Status of gpio wakeup. Write to 1 to clear a latched edge detect. - [9:9] - read-write - oneToClear - - - MODE - Edge or level detect. Edge will detect a 0 to 1 transition (or 1 to 0 transition). Level will detect a 1 or 0. Both types of event get latched into the current_pwrup_req register. - [8:8] - read-write - - - level - 0 - - - edge - 1 - - - - - DIRECTION - [7:7] - read-write - - - low_falling - 0 - - - high_rising - 1 - - - - - ENABLE - Set to 1 to enable the wakeup source. Set to 0 to disable the wakeup source and clear a pending wakeup event. - If using edge detect a latched edge needs to be cleared by writing 1 to the status register also. - [6:6] - read-write - - - SOURCE - [5:0] - read-write - - - - - PWRUP1 - 4 GPIO powerup events can be configured to wake the chip up from a low power state. - The pwrups are level/edge sensitive and can be set to trigger on a high/rising or low/falling event - The number of gpios available depends on the package option. An invalid selection will be ignored - source = 0 selects gpio0 - . - . - source = 47 selects gpio47 - source = 48 selects qspi_ss - source = 49 selects qspi_sd0 - source = 50 selects qspi_sd1 - source = 51 selects qspi_sd2 - source = 52 selects qspi_sd3 - source = 53 selects qspi_sclk - level = 0 triggers the pwrup when the source is low - level = 1 triggers the pwrup when the source is high - 0x90 - 0x0000003F - - - RAW_STATUS - Value of selected gpio pin (only if enable == 1) - [10:10] - read-only - - - STATUS - Status of gpio wakeup. Write to 1 to clear a latched edge detect. - [9:9] - read-write - oneToClear - - - MODE - Edge or level detect. Edge will detect a 0 to 1 transition (or 1 to 0 transition). Level will detect a 1 or 0. Both types of event get latched into the current_pwrup_req register. - [8:8] - read-write - - - level - 0 - - - edge - 1 - - - - - DIRECTION - [7:7] - read-write - - - low_falling - 0 - - - high_rising - 1 - - - - - ENABLE - Set to 1 to enable the wakeup source. Set to 0 to disable the wakeup source and clear a pending wakeup event. - If using edge detect a latched edge needs to be cleared by writing 1 to the status register also. - [6:6] - read-write - - - SOURCE - [5:0] - read-write - - - - - PWRUP2 - 4 GPIO powerup events can be configured to wake the chip up from a low power state. - The pwrups are level/edge sensitive and can be set to trigger on a high/rising or low/falling event - The number of gpios available depends on the package option. An invalid selection will be ignored - source = 0 selects gpio0 - . - . - source = 47 selects gpio47 - source = 48 selects qspi_ss - source = 49 selects qspi_sd0 - source = 50 selects qspi_sd1 - source = 51 selects qspi_sd2 - source = 52 selects qspi_sd3 - source = 53 selects qspi_sclk - level = 0 triggers the pwrup when the source is low - level = 1 triggers the pwrup when the source is high - 0x94 - 0x0000003F - - - RAW_STATUS - Value of selected gpio pin (only if enable == 1) - [10:10] - read-only - - - STATUS - Status of gpio wakeup. Write to 1 to clear a latched edge detect. - [9:9] - read-write - oneToClear - - - MODE - Edge or level detect. Edge will detect a 0 to 1 transition (or 1 to 0 transition). Level will detect a 1 or 0. Both types of event get latched into the current_pwrup_req register. - [8:8] - read-write - - - level - 0 - - - edge - 1 - - - - - DIRECTION - [7:7] - read-write - - - low_falling - 0 - - - high_rising - 1 - - - - - ENABLE - Set to 1 to enable the wakeup source. Set to 0 to disable the wakeup source and clear a pending wakeup event. - If using edge detect a latched edge needs to be cleared by writing 1 to the status register also. - [6:6] - read-write - - - SOURCE - [5:0] - read-write - - - - - PWRUP3 - 4 GPIO powerup events can be configured to wake the chip up from a low power state. - The pwrups are level/edge sensitive and can be set to trigger on a high/rising or low/falling event - The number of gpios available depends on the package option. An invalid selection will be ignored - source = 0 selects gpio0 - . - . - source = 47 selects gpio47 - source = 48 selects qspi_ss - source = 49 selects qspi_sd0 - source = 50 selects qspi_sd1 - source = 51 selects qspi_sd2 - source = 52 selects qspi_sd3 - source = 53 selects qspi_sclk - level = 0 triggers the pwrup when the source is low - level = 1 triggers the pwrup when the source is high - 0x98 - 0x0000003F - - - RAW_STATUS - Value of selected gpio pin (only if enable == 1) - [10:10] - read-only - - - STATUS - Status of gpio wakeup. Write to 1 to clear a latched edge detect. - [9:9] - read-write - oneToClear - - - MODE - Edge or level detect. Edge will detect a 0 to 1 transition (or 1 to 0 transition). Level will detect a 1 or 0. Both types of event get latched into the current_pwrup_req register. - [8:8] - read-write - - - level - 0 - - - edge - 1 - - - - - DIRECTION - [7:7] - read-write - - - low_falling - 0 - - - high_rising - 1 - - - - - ENABLE - Set to 1 to enable the wakeup source. Set to 0 to disable the wakeup source and clear a pending wakeup event. - If using edge detect a latched edge needs to be cleared by writing 1 to the status register also. - [6:6] - read-write - - - SOURCE - [5:0] - read-write - - - - - CURRENT_PWRUP_REQ - Indicates current powerup request state - pwrup events can be cleared by removing the enable from the pwrup register. The alarm pwrup req can be cleared by clearing timer.alarm_enab - 0 = chip reset, for the source of the last reset see POWMAN_CHIP_RESET - 1 = pwrup0 - 2 = pwrup1 - 3 = pwrup2 - 4 = pwrup3 - 5 = coresight_pwrup - 6 = alarm_pwrup - 0x9C - 0x00000000 - - - CURRENT_PWRUP_REQ - [6:0] - read-only - - - - - LAST_SWCORE_PWRUP - Indicates which pwrup source triggered the last switched-core power up - 0 = chip reset, for the source of the last reset see POWMAN_CHIP_RESET - 1 = pwrup0 - 2 = pwrup1 - 3 = pwrup2 - 4 = pwrup3 - 5 = coresight_pwrup - 6 = alarm_pwrup - 0xA0 - 0x00000000 - - - LAST_SWCORE_PWRUP - [6:0] - read-only - - - - - DBG_PWRCFG - 0xA4 - 0x00000000 - - - IGNORE - Ignore pwrup req from debugger. If pwrup req is asserted then this will prevent power down and set powerdown blocked. Set ignore to stop paying attention to pwrup_req - [0:0] - read-write - - - - - BOOTDIS - Tell the bootrom to ignore the BOOT0..3 registers following the next RSM reset (e.g. the next core power down/up). - - If an early boot stage has soft-locked some OTP pages in order to protect their contents from later stages, there is a risk that Secure code running at a later stage can unlock the pages by powering the core up and down. - - This register can be used to ensure that the bootloader runs as normal on the next power up, preventing Secure code at a later stage from accessing OTP in its unlocked state. - - Should be used in conjunction with the OTP BOOTDIS register. - 0xA8 - 0x00000000 - - - NEXT - This flag always ORs writes into its current contents. It can be set but not cleared by software. - - The BOOTDIS_NEXT bit is OR'd into the BOOTDIS_NOW bit when the core is powered down. Simultaneously, the BOOTDIS_NEXT bit is cleared. Setting this bit means that the BOOT0..3 registers will be ignored following the next reset of the RSM by powman. - - This flag should be set by an early boot stage that has soft-locked OTP pages, to prevent later stages from unlocking it by power cycling. - [1:1] - read-write - - - NOW - When powman resets the RSM, the current value of BOOTDIS_NEXT is OR'd into BOOTDIS_NOW, and BOOTDIS_NEXT is cleared. - - The bootrom checks this flag before reading the BOOT0..3 registers. If it is set, the bootrom clears it, and ignores the BOOT registers. This prevents Secure software from diverting the boot path before a bootloader has had the chance to soft lock OTP pages containing sensitive data. - [0:0] - read-write - oneToClear - - - - - DBGCONFIG - 0xAC - 0x00000000 - - - DP_INSTID - Configure DP instance ID for SWD multidrop selection. - Recommend that this is NOT changed until you require debug access in multi-chip environment - [3:0] - read-write - - - - - SCRATCH0 - Scratch register. Information persists in low power mode - 0xB0 - 0x00000000 - - - SCRATCH0 - [31:0] - read-write - - - - - SCRATCH1 - Scratch register. Information persists in low power mode - 0xB4 - 0x00000000 - - - SCRATCH1 - [31:0] - read-write - - - - - SCRATCH2 - Scratch register. Information persists in low power mode - 0xB8 - 0x00000000 - - - SCRATCH2 - [31:0] - read-write - - - - - SCRATCH3 - Scratch register. Information persists in low power mode - 0xBC - 0x00000000 - - - SCRATCH3 - [31:0] - read-write - - - - - SCRATCH4 - Scratch register. Information persists in low power mode - 0xC0 - 0x00000000 - - - SCRATCH4 - [31:0] - read-write - - - - - SCRATCH5 - Scratch register. Information persists in low power mode - 0xC4 - 0x00000000 - - - SCRATCH5 - [31:0] - read-write - - - - - SCRATCH6 - Scratch register. Information persists in low power mode - 0xC8 - 0x00000000 - - - SCRATCH6 - [31:0] - read-write - - - - - SCRATCH7 - Scratch register. Information persists in low power mode - 0xCC - 0x00000000 - - - SCRATCH7 - [31:0] - read-write - - - - - BOOT0 - Scratch register. Information persists in low power mode - 0xD0 - 0x00000000 - - - BOOT0 - [31:0] - read-write - - - - - BOOT1 - Scratch register. Information persists in low power mode - 0xD4 - 0x00000000 - - - BOOT1 - [31:0] - read-write - - - - - BOOT2 - Scratch register. Information persists in low power mode - 0xD8 - 0x00000000 - - - BOOT2 - [31:0] - read-write - - - - - BOOT3 - Scratch register. Information persists in low power mode - 0xDC - 0x00000000 - - - BOOT3 - [31:0] - read-write - - - - - INTR - Raw Interrupts - 0xE0 - 0x00000000 - - - PWRUP_WHILE_WAITING - Source is state.pwrup_while_waiting - [3:3] - read-only - - - STATE_REQ_IGNORED - Source is state.req_ignored - [2:2] - read-only - - - TIMER - [1:1] - read-only - - - VREG_OUTPUT_LOW - [0:0] - read-write - oneToClear - - - - - INTE - Interrupt Enable - 0xE4 - 0x00000000 - - - PWRUP_WHILE_WAITING - Source is state.pwrup_while_waiting - [3:3] - read-write - - - STATE_REQ_IGNORED - Source is state.req_ignored - [2:2] - read-write - - - TIMER - [1:1] - read-write - - - VREG_OUTPUT_LOW - [0:0] - read-write - - - - - INTF - Interrupt Force - 0xE8 - 0x00000000 - - - PWRUP_WHILE_WAITING - Source is state.pwrup_while_waiting - [3:3] - read-write - - - STATE_REQ_IGNORED - Source is state.req_ignored - [2:2] - read-write - - - TIMER - [1:1] - read-write - - - VREG_OUTPUT_LOW - [0:0] - read-write - - - - - INTS - Interrupt status after masking & forcing - 0xEC - 0x00000000 - - - PWRUP_WHILE_WAITING - Source is state.pwrup_while_waiting - [3:3] - read-only - - - STATE_REQ_IGNORED - Source is state.req_ignored - [2:2] - read-only - - - TIMER - [1:1] - read-only - - - VREG_OUTPUT_LOW - [0:0] - read-only - - - - - - - WATCHDOG - 0x400D8000 - - 0x0 - 0x2C - registers - - - - CTRL - Watchdog control - The rst_wdsel register determines which subsystems are reset when the watchdog is triggered. - The watchdog can be triggered in software. - 0x0 - 0x07000000 - - - TRIGGER - Trigger a watchdog reset - [31:31] - write-only - - - ENABLE - When not enabled the watchdog timer is paused - [30:30] - read-write - - - PAUSE_DBG1 - Pause the watchdog timer when processor 1 is in debug mode - [26:26] - read-write - - - PAUSE_DBG0 - Pause the watchdog timer when processor 0 is in debug mode - [25:25] - read-write - - - PAUSE_JTAG - Pause the watchdog timer when JTAG is accessing the bus fabric - [24:24] - read-write - - - TIME - Indicates the time in usec before a watchdog reset will be triggered - [23:0] - read-only - - - - - LOAD - Load the watchdog timer. The maximum setting is 0xffffff which corresponds to approximately 16 seconds. - 0x4 - 0x00000000 - - - LOAD - [23:0] - write-only - - - - - REASON - Logs the reason for the last reset. Both bits are zero for the case of a hardware reset. - - Additionally, as of RP2350, a debugger warm reset of either core (SYSRESETREQ or hartreset) will also clear the watchdog reason register, so that software loaded under the debugger following a watchdog timeout will not continue to see the timeout condition. - 0x8 - 0x00000000 - - - FORCE - [1:1] - read-only - - - TIMER - [0:0] - read-only - - - - - SCRATCH0 - Scratch register. Information persists through soft reset of the chip. - 0xC - 0x00000000 - - - SCRATCH0 - [31:0] - read-write - - - - - SCRATCH1 - Scratch register. Information persists through soft reset of the chip. - 0x10 - 0x00000000 - - - SCRATCH1 - [31:0] - read-write - - - - - SCRATCH2 - Scratch register. Information persists through soft reset of the chip. - 0x14 - 0x00000000 - - - SCRATCH2 - [31:0] - read-write - - - - - SCRATCH3 - Scratch register. Information persists through soft reset of the chip. - 0x18 - 0x00000000 - - - SCRATCH3 - [31:0] - read-write - - - - - SCRATCH4 - Scratch register. Information persists through soft reset of the chip. - 0x1C - 0x00000000 - - - SCRATCH4 - [31:0] - read-write - - - - - SCRATCH5 - Scratch register. Information persists through soft reset of the chip. - 0x20 - 0x00000000 - - - SCRATCH5 - [31:0] - read-write - - - - - SCRATCH6 - Scratch register. Information persists through soft reset of the chip. - 0x24 - 0x00000000 - - - SCRATCH6 - [31:0] - read-write - - - - - SCRATCH7 - Scratch register. Information persists through soft reset of the chip. - 0x28 - 0x00000000 - - - SCRATCH7 - [31:0] - read-write - - - - - - - DMA - DMA with separate read and write masters - 0x50000000 - - 0x0 - 0xBC8 - registers - - - DMA_IRQ_0 - 10 - - - DMA_IRQ_1 - 11 - - - DMA_IRQ_2 - 12 - - - DMA_IRQ_3 - 13 - - - - 16 - 0x40 - 0-15 - CH%s - Cluster CH%s, containing CH?_READ_ADDR,CH??_READ_ADDR, CH?_WRITE_ADDR,CH??_WRITE_ADDR, CH?_TRANS_COUNT,CH??_TRANS_COUNT, CH?_CTRL_TRIG,CH??_CTRL_TRIG, CH?_AL1_CTRL,CH??_AL1_CTRL, CH?_AL1_READ_ADDR,CH??_AL1_READ_ADDR, CH?_AL1_WRITE_ADDR,CH??_AL1_WRITE_ADDR, CH?_AL1_TRANS_COUNT_TRIG,CH??_AL1_TRANS_COUNT_TRIG, CH?_AL2_CTRL,CH??_AL2_CTRL, CH?_AL2_TRANS_COUNT,CH??_AL2_TRANS_COUNT, CH?_AL2_READ_ADDR,CH??_AL2_READ_ADDR, CH?_AL2_WRITE_ADDR_TRIG,CH??_AL2_WRITE_ADDR_TRIG, CH?_AL3_CTRL,CH??_AL3_CTRL, CH?_AL3_WRITE_ADDR,CH??_AL3_WRITE_ADDR, CH?_AL3_TRANS_COUNT,CH??_AL3_TRANS_COUNT, CH?_AL3_READ_ADDR_TRIG,CH??_AL3_READ_ADDR_TRIG - 0x0 - - CH_READ_ADDR - DMA Channel 0 Read Address pointer - 0x0 - 0x00000000 - - - CH0_READ_ADDR - This register updates automatically each time a read completes. The current value is the next address to be read by this channel. - [31:0] - read-write - - - - - CH_WRITE_ADDR - DMA Channel 0 Write Address pointer - 0x4 - 0x00000000 - - - CH0_WRITE_ADDR - This register updates automatically each time a write completes. The current value is the next address to be written by this channel. - [31:0] - read-write - - - - - CH_TRANS_COUNT - DMA Channel 0 Transfer Count - 0x8 - 0x00000000 - - - MODE - When MODE is 0x0, the transfer count decrements with each transfer until 0, and then the channel triggers the next channel indicated by CTRL_CHAIN_TO. - - When MODE is 0x1, the transfer count decrements with each transfer until 0, and then the channel re-triggers itself, in addition to the trigger indicated by CTRL_CHAIN_TO. This is useful for e.g. an endless ring-buffer DMA with periodic interrupts. - - When MODE is 0xf, the transfer count does not decrement. The DMA channel performs an endless sequence of transfers, never triggering other channels or raising interrupts, until an ABORT is raised. - - All other values are reserved. - [31:28] - read-write - - - NORMAL - 0 - - - TRIGGER_SELF - 1 - - - ENDLESS - 15 - - - - - COUNT - 28-bit transfer count (256 million transfers maximum). - - Program the number of bus transfers a channel will perform before halting. Note that, if transfers are larger than one byte in size, this is not equal to the number of bytes transferred (see CTRL_DATA_SIZE). - - When the channel is active, reading this register shows the number of transfers remaining, updating automatically each time a write transfer completes. - - Writing this register sets the RELOAD value for the transfer counter. Each time this channel is triggered, the RELOAD value is copied into the live transfer counter. The channel can be started multiple times, and will perform the same number of transfers each time, as programmed by most recent write. - - The RELOAD value can be observed at CHx_DBG_TCR. If TRANS_COUNT is used as a trigger, the written value is used immediately as the length of the new transfer sequence, as well as being written to RELOAD. - [27:0] - read-write - - - - - CH_CTRL_TRIG - DMA Channel 0 Control and Status - 0xC - 0x00000000 - - - AHB_ERROR - Logical OR of the READ_ERROR and WRITE_ERROR flags. The channel halts when it encounters any bus error, and always raises its channel IRQ flag. - [31:31] - read-only - - - READ_ERROR - If 1, the channel received a read bus error. Write one to clear. - READ_ADDR shows the approximate address where the bus error was encountered (will not be earlier, or more than 3 transfers later) - [30:30] - read-write - oneToClear - - - WRITE_ERROR - If 1, the channel received a write bus error. Write one to clear. - WRITE_ADDR shows the approximate address where the bus error was encountered (will not be earlier, or more than 5 transfers later) - [29:29] - read-write - oneToClear - - - BUSY - This flag goes high when the channel starts a new transfer sequence, and low when the last transfer of that sequence completes. Clearing EN while BUSY is high pauses the channel, and BUSY will stay high while paused. - - To terminate a sequence early (and clear the BUSY flag), see CHAN_ABORT. - [26:26] - read-only - - - SNIFF_EN - If 1, this channel's data transfers are visible to the sniff hardware, and each transfer will advance the state of the checksum. This only applies if the sniff hardware is enabled, and has this channel selected. - - This allows checksum to be enabled or disabled on a per-control- block basis. - [25:25] - read-write - - - BSWAP - Apply byte-swap transformation to DMA data. - For byte data, this has no effect. For halfword data, the two bytes of each halfword are swapped. For word data, the four bytes of each word are swapped to reverse order. - [24:24] - read-write - - - IRQ_QUIET - In QUIET mode, the channel does not generate IRQs at the end of every transfer block. Instead, an IRQ is raised when NULL is written to a trigger register, indicating the end of a control block chain. - - This reduces the number of interrupts to be serviced by the CPU when transferring a DMA chain of many small control blocks. - [23:23] - read-write - - - TREQ_SEL - Select a Transfer Request signal. - The channel uses the transfer request signal to pace its data transfer rate. Sources for TREQ signals are internal (TIMERS) or external (DREQ, a Data Request from the system). - 0x0 to 0x3a -> select DREQ n as TREQ - [22:17] - read-write - - TREQ_SEL - - PIO0_TX0 - Select PIO0's TX FIFO 0 as TREQ - 0 - - - PIO0_TX1 - Select PIO0's TX FIFO 1 as TREQ - 1 - - - PIO0_TX2 - Select PIO0's TX FIFO 2 as TREQ - 2 - - - PIO0_TX3 - Select PIO0's TX FIFO 3 as TREQ - 3 - - - PIO0_RX0 - Select PIO0's RX FIFO 0 as TREQ - 4 - - - PIO0_RX1 - Select PIO0's RX FIFO 1 as TREQ - 5 - - - PIO0_RX2 - Select PIO0's RX FIFO 2 as TREQ - 6 - - - PIO0_RX3 - Select PIO0's RX FIFO 3 as TREQ - 7 - - - PIO1_TX0 - Select PIO1's TX FIFO 0 as TREQ - 8 - - - PIO1_TX1 - Select PIO1's TX FIFO 1 as TREQ - 9 - - - PIO1_TX2 - Select PIO1's TX FIFO 2 as TREQ - 10 - - - PIO1_TX3 - Select PIO1's TX FIFO 3 as TREQ - 11 - - - PIO1_RX0 - Select PIO1's RX FIFO 0 as TREQ - 12 - - - PIO1_RX1 - Select PIO1's RX FIFO 1 as TREQ - 13 - - - PIO1_RX2 - Select PIO1's RX FIFO 2 as TREQ - 14 - - - PIO1_RX3 - Select PIO1's RX FIFO 3 as TREQ - 15 - - - PIO2_TX0 - Select PIO2's TX FIFO 0 as TREQ - 16 - - - PIO2_TX1 - Select PIO2's TX FIFO 1 as TREQ - 17 - - - PIO2_TX2 - Select PIO2's TX FIFO 2 as TREQ - 18 - - - PIO2_TX3 - Select PIO2's TX FIFO 3 as TREQ - 19 - - - PIO2_RX0 - Select PIO2's RX FIFO 0 as TREQ - 20 - - - PIO2_RX1 - Select PIO2's RX FIFO 1 as TREQ - 21 - - - PIO2_RX2 - Select PIO2's RX FIFO 2 as TREQ - 22 - - - PIO2_RX3 - Select PIO2's RX FIFO 3 as TREQ - 23 - - - SPI0_TX - Select SPI0's TX FIFO as TREQ - 24 - - - SPI0_RX - Select SPI0's RX FIFO as TREQ - 25 - - - SPI1_TX - Select SPI1's TX FIFO as TREQ - 26 - - - SPI1_RX - Select SPI1's RX FIFO as TREQ - 27 - - - UART0_TX - Select UART0's TX FIFO as TREQ - 28 - - - UART0_RX - Select UART0's RX FIFO as TREQ - 29 - - - UART1_TX - Select UART1's TX FIFO as TREQ - 30 - - - UART1_RX - Select UART1's RX FIFO as TREQ - 31 - - - PWM_WRAP0 - Select PWM Counter 0's Wrap Value as TREQ - 32 - - - PWM_WRAP1 - Select PWM Counter 1's Wrap Value as TREQ - 33 - - - PWM_WRAP2 - Select PWM Counter 2's Wrap Value as TREQ - 34 - - - PWM_WRAP3 - Select PWM Counter 3's Wrap Value as TREQ - 35 - - - PWM_WRAP4 - Select PWM Counter 4's Wrap Value as TREQ - 36 - - - PWM_WRAP5 - Select PWM Counter 5's Wrap Value as TREQ - 37 - - - PWM_WRAP6 - Select PWM Counter 6's Wrap Value as TREQ - 38 - - - PWM_WRAP7 - Select PWM Counter 7's Wrap Value as TREQ - 39 - - - PWM_WRAP8 - Select PWM Counter 8's Wrap Value as TREQ - 40 - - - PWM_WRAP9 - Select PWM Counter 9's Wrap Value as TREQ - 41 - - - PWM_WRAP10 - Select PWM Counter 10's Wrap Value as TREQ - 42 - - - PWM_WRAP11 - Select PWM Counter 11's Wrap Value as TREQ - 43 - - - I2C0_TX - Select I2C0's TX FIFO as TREQ - 44 - - - I2C0_RX - Select I2C0's RX FIFO as TREQ - 45 - - - I2C1_TX - Select I2C1's TX FIFO as TREQ - 46 - - - I2C1_RX - Select I2C1's RX FIFO as TREQ - 47 - - - ADC - Select ADC as TREQ - 48 - - - XIP_STREAM - Select XIP_STREAM as TREQ - 49 - - - XIP_QMITX - Select XIP_QMI's TX FIFO as TREQ - 50 - - - XIP_QMIRX - Select XIP_QMI's RX FIFO as TREQ - 51 - - - HSTX - Select HSTX as TREQ - 52 - - - CORESIGHT - Select CORESIGHT as TREQ - 53 - - - SHA256 - Select SHA256 as TREQ - 54 - - - TIMER0 - Select Timer 0 as TREQ - 59 - - - TIMER1 - Select Timer 1 as TREQ - 60 - - - TIMER2 - Select Timer 2 as TREQ (Optional) - 61 - - - TIMER3 - Select Timer 3 as TREQ (Optional) - 62 - - - PERMANENT - Permanent request, for unpaced transfers. - 63 - - - - - CHAIN_TO - When this channel completes, it will trigger the channel indicated by CHAIN_TO. Disable by setting CHAIN_TO = _(this channel)_. \n Reset value is 0, which means for channels 1 and above the default will be to chain to channel 0 - set this field to avoid this behaviour. - [16:13] - read-write - - - RING_SEL - Select whether RING_SIZE applies to read or write addresses. - If 0, read addresses are wrapped on a (1 << RING_SIZE) boundary. If 1, write addresses are wrapped. - [12:12] - read-write - - - RING_SIZE - Size of address wrap region. If 0, don't wrap. For values n > 0, only the lower n bits of the address will change. This wraps the address on a (1 << n) byte boundary, facilitating access to naturally-aligned ring buffers. - - Ring sizes between 2 and 32768 bytes are possible. This can apply to either read or write addresses, based on value of RING_SEL. - [11:8] - read-write - - - RING_NONE - 0 - - - - - INCR_WRITE_REV - If 1, and INCR_WRITE is 1, the write address is decremented rather than incremented with each transfer. - - If 1, and INCR_WRITE is 0, this otherwise-unused combination causes the write address to be incremented by twice the transfer size, i.e. skipping over alternate addresses. - [7:7] - read-write - - - INCR_WRITE - If 1, the write address increments with each transfer. If 0, each write is directed to the same, initial address. - - Generally this should be disabled for memory-to-peripheral transfers. - [6:6] - read-write - - - INCR_READ_REV - If 1, and INCR_READ is 1, the read address is decremented rather than incremented with each transfer. - - If 1, and INCR_READ is 0, this otherwise-unused combination causes the read address to be incremented by twice the transfer size, i.e. skipping over alternate addresses. - [5:5] - read-write - - - INCR_READ - If 1, the read address increments with each transfer. If 0, each read is directed to the same, initial address. - - Generally this should be disabled for peripheral-to-memory transfers. - [4:4] - read-write - - - DATA_SIZE - Set the size of each bus transfer (byte/halfword/word). READ_ADDR and WRITE_ADDR advance by this amount (1/2/4 bytes) with each transfer. - [3:2] - read-write - - - SIZE_BYTE - 0 - - - SIZE_HALFWORD - 1 - - - SIZE_WORD - 2 - - - - - HIGH_PRIORITY - HIGH_PRIORITY gives a channel preferential treatment in issue scheduling: in each scheduling round, all high priority channels are considered first, and then only a single low priority channel, before returning to the high priority channels. - - This only affects the order in which the DMA schedules channels. The DMA's bus priority is not changed. If the DMA is not saturated then a low priority channel will see no loss of throughput. - [1:1] - read-write - - - EN - DMA Channel Enable. - When 1, the channel will respond to triggering events, which will cause it to become BUSY and start transferring data. When 0, the channel will ignore triggers, stop issuing transfers, and pause the current transfer sequence (i.e. BUSY will remain high if already high) - [0:0] - read-write - - - - - CH_AL1_CTRL - DMA Channel 0 Control and Status - 0x10 - 0x00000000 - - - AHB_ERROR - Logical OR of the READ_ERROR and WRITE_ERROR flags. The channel halts when it encounters any bus error, and always raises its channel IRQ flag. - [31:31] - read-only - - - READ_ERROR - If 1, the channel received a read bus error. Write one to clear. - READ_ADDR shows the approximate address where the bus error was encountered (will not be earlier, or more than 3 transfers later) - [30:30] - read-write - oneToClear - - - WRITE_ERROR - If 1, the channel received a write bus error. Write one to clear. - WRITE_ADDR shows the approximate address where the bus error was encountered (will not be earlier, or more than 5 transfers later) - [29:29] - read-write - oneToClear - - - BUSY - This flag goes high when the channel starts a new transfer sequence, and low when the last transfer of that sequence completes. Clearing EN while BUSY is high pauses the channel, and BUSY will stay high while paused. - - To terminate a sequence early (and clear the BUSY flag), see CHAN_ABORT. - [26:26] - read-only - - - SNIFF_EN - If 1, this channel's data transfers are visible to the sniff hardware, and each transfer will advance the state of the checksum. This only applies if the sniff hardware is enabled, and has this channel selected. - - This allows checksum to be enabled or disabled on a per-control- block basis. - [25:25] - read-write - - - BSWAP - Apply byte-swap transformation to DMA data. - For byte data, this has no effect. For halfword data, the two bytes of each halfword are swapped. For word data, the four bytes of each word are swapped to reverse order. - [24:24] - read-write - - - IRQ_QUIET - In QUIET mode, the channel does not generate IRQs at the end of every transfer block. Instead, an IRQ is raised when NULL is written to a trigger register, indicating the end of a control block chain. - - This reduces the number of interrupts to be serviced by the CPU when transferring a DMA chain of many small control blocks. - [23:23] - read-write - - - TREQ_SEL - Select a Transfer Request signal. - The channel uses the transfer request signal to pace its data transfer rate. Sources for TREQ signals are internal (TIMERS) or external (DREQ, a Data Request from the system). - 0x0 to 0x3a -> select DREQ n as TREQ - [22:17] - read-write - - TREQ_SEL - - PIO0_TX0 - Select PIO0's TX FIFO 0 as TREQ - 0 - - - PIO0_TX1 - Select PIO0's TX FIFO 1 as TREQ - 1 - - - PIO0_TX2 - Select PIO0's TX FIFO 2 as TREQ - 2 - - - PIO0_TX3 - Select PIO0's TX FIFO 3 as TREQ - 3 - - - PIO0_RX0 - Select PIO0's RX FIFO 0 as TREQ - 4 - - - PIO0_RX1 - Select PIO0's RX FIFO 1 as TREQ - 5 - - - PIO0_RX2 - Select PIO0's RX FIFO 2 as TREQ - 6 - - - PIO0_RX3 - Select PIO0's RX FIFO 3 as TREQ - 7 - - - PIO1_TX0 - Select PIO1's TX FIFO 0 as TREQ - 8 - - - PIO1_TX1 - Select PIO1's TX FIFO 1 as TREQ - 9 - - - PIO1_TX2 - Select PIO1's TX FIFO 2 as TREQ - 10 - - - PIO1_TX3 - Select PIO1's TX FIFO 3 as TREQ - 11 - - - PIO1_RX0 - Select PIO1's RX FIFO 0 as TREQ - 12 - - - PIO1_RX1 - Select PIO1's RX FIFO 1 as TREQ - 13 - - - PIO1_RX2 - Select PIO1's RX FIFO 2 as TREQ - 14 - - - PIO1_RX3 - Select PIO1's RX FIFO 3 as TREQ - 15 - - - PIO2_TX0 - Select PIO2's TX FIFO 0 as TREQ - 16 - - - PIO2_TX1 - Select PIO2's TX FIFO 1 as TREQ - 17 - - - PIO2_TX2 - Select PIO2's TX FIFO 2 as TREQ - 18 - - - PIO2_TX3 - Select PIO2's TX FIFO 3 as TREQ - 19 - - - PIO2_RX0 - Select PIO2's RX FIFO 0 as TREQ - 20 - - - PIO2_RX1 - Select PIO2's RX FIFO 1 as TREQ - 21 - - - PIO2_RX2 - Select PIO2's RX FIFO 2 as TREQ - 22 - - - PIO2_RX3 - Select PIO2's RX FIFO 3 as TREQ - 23 - - - SPI0_TX - Select SPI0's TX FIFO as TREQ - 24 - - - SPI0_RX - Select SPI0's RX FIFO as TREQ - 25 - - - SPI1_TX - Select SPI1's TX FIFO as TREQ - 26 - - - SPI1_RX - Select SPI1's RX FIFO as TREQ - 27 - - - UART0_TX - Select UART0's TX FIFO as TREQ - 28 - - - UART0_RX - Select UART0's RX FIFO as TREQ - 29 - - - UART1_TX - Select UART1's TX FIFO as TREQ - 30 - - - UART1_RX - Select UART1's RX FIFO as TREQ - 31 - - - PWM_WRAP0 - Select PWM Counter 0's Wrap Value as TREQ - 32 - - - PWM_WRAP1 - Select PWM Counter 1's Wrap Value as TREQ - 33 - - - PWM_WRAP2 - Select PWM Counter 2's Wrap Value as TREQ - 34 - - - PWM_WRAP3 - Select PWM Counter 3's Wrap Value as TREQ - 35 - - - PWM_WRAP4 - Select PWM Counter 4's Wrap Value as TREQ - 36 - - - PWM_WRAP5 - Select PWM Counter 5's Wrap Value as TREQ - 37 - - - PWM_WRAP6 - Select PWM Counter 6's Wrap Value as TREQ - 38 - - - PWM_WRAP7 - Select PWM Counter 7's Wrap Value as TREQ - 39 - - - PWM_WRAP8 - Select PWM Counter 8's Wrap Value as TREQ - 40 - - - PWM_WRAP9 - Select PWM Counter 9's Wrap Value as TREQ - 41 - - - PWM_WRAP10 - Select PWM Counter 10's Wrap Value as TREQ - 42 - - - PWM_WRAP11 - Select PWM Counter 11's Wrap Value as TREQ - 43 - - - I2C0_TX - Select I2C0's TX FIFO as TREQ - 44 - - - I2C0_RX - Select I2C0's RX FIFO as TREQ - 45 - - - I2C1_TX - Select I2C1's TX FIFO as TREQ - 46 - - - I2C1_RX - Select I2C1's RX FIFO as TREQ - 47 - - - ADC - Select ADC as TREQ - 48 - - - XIP_STREAM - Select XIP_STREAM as TREQ - 49 - - - XIP_QMITX - Select XIP_QMI's TX FIFO as TREQ - 50 - - - XIP_QMIRX - Select XIP_QMI's RX FIFO as TREQ - 51 - - - HSTX - Select HSTX as TREQ - 52 - - - CORESIGHT - Select CORESIGHT as TREQ - 53 - - - SHA256 - Select SHA256 as TREQ - 54 - - - TIMER0 - Select Timer 0 as TREQ - 59 - - - TIMER1 - Select Timer 1 as TREQ - 60 - - - TIMER2 - Select Timer 2 as TREQ (Optional) - 61 - - - TIMER3 - Select Timer 3 as TREQ (Optional) - 62 - - - PERMANENT - Permanent request, for unpaced transfers. - 63 - - - - - CHAIN_TO - When this channel completes, it will trigger the channel indicated by CHAIN_TO. Disable by setting CHAIN_TO = _(this channel)_. \n Reset value is 0, which means for channels 1 and above the default will be to chain to channel 0 - set this field to avoid this behaviour. - [16:13] - read-write - - - RING_SEL - Select whether RING_SIZE applies to read or write addresses. - If 0, read addresses are wrapped on a (1 << RING_SIZE) boundary. If 1, write addresses are wrapped. - [12:12] - read-write - - - RING_SIZE - Size of address wrap region. If 0, don't wrap. For values n > 0, only the lower n bits of the address will change. This wraps the address on a (1 << n) byte boundary, facilitating access to naturally-aligned ring buffers. - - Ring sizes between 2 and 32768 bytes are possible. This can apply to either read or write addresses, based on value of RING_SEL. - [11:8] - read-write - - - RING_NONE - 0 - - - - - INCR_WRITE_REV - If 1, and INCR_WRITE is 1, the write address is decremented rather than incremented with each transfer. - - If 1, and INCR_WRITE is 0, this otherwise-unused combination causes the write address to be incremented by twice the transfer size, i.e. skipping over alternate addresses. - [7:7] - read-write - - - INCR_WRITE - If 1, the write address increments with each transfer. If 0, each write is directed to the same, initial address. - - Generally this should be disabled for memory-to-peripheral transfers. - [6:6] - read-write - - - INCR_READ_REV - If 1, and INCR_READ is 1, the read address is decremented rather than incremented with each transfer. - - If 1, and INCR_READ is 0, this otherwise-unused combination causes the read address to be incremented by twice the transfer size, i.e. skipping over alternate addresses. - [5:5] - read-write - - - INCR_READ - If 1, the read address increments with each transfer. If 0, each read is directed to the same, initial address. - - Generally this should be disabled for peripheral-to-memory transfers. - [4:4] - read-write - - - DATA_SIZE - Set the size of each bus transfer (byte/halfword/word). READ_ADDR and WRITE_ADDR advance by this amount (1/2/4 bytes) with each transfer. - [3:2] - read-write - - - SIZE_BYTE - 0 - - - SIZE_HALFWORD - 1 - - - SIZE_WORD - 2 - - - - - HIGH_PRIORITY - HIGH_PRIORITY gives a channel preferential treatment in issue scheduling: in each scheduling round, all high priority channels are considered first, and then only a single low priority channel, before returning to the high priority channels. - - This only affects the order in which the DMA schedules channels. The DMA's bus priority is not changed. If the DMA is not saturated then a low priority channel will see no loss of throughput. - [1:1] - read-write - - - EN - DMA Channel Enable. - When 1, the channel will respond to triggering events, which will cause it to become BUSY and start transferring data. When 0, the channel will ignore triggers, stop issuing transfers, and pause the current transfer sequence (i.e. BUSY will remain high if already high) - [0:0] - read-write - - - - - CH_AL1_READ_ADDR - Alias for channel 0 READ_ADDR register - 0x14 - 0x00000000 - - - CH0_AL1_READ_ADDR - [31:0] - read-write - - - - - CH_AL1_WRITE_ADDR - Alias for channel 0 WRITE_ADDR register - 0x18 - 0x00000000 - - - CH0_AL1_WRITE_ADDR - [31:0] - read-write - - - - - CH_AL1_TRANS_COUNT_TRIG - Alias for channel 0 TRANS_COUNT register - This is a trigger register (0xc). Writing a nonzero value will - reload the channel counter and start the channel. - 0x1C - 0x00000000 - - - CH0_AL1_TRANS_COUNT_TRIG - [31:0] - read-write - - - - - CH_AL2_CTRL - DMA Channel 0 Control and Status - 0x20 - 0x00000000 - - - AHB_ERROR - Logical OR of the READ_ERROR and WRITE_ERROR flags. The channel halts when it encounters any bus error, and always raises its channel IRQ flag. - [31:31] - read-only - - - READ_ERROR - If 1, the channel received a read bus error. Write one to clear. - READ_ADDR shows the approximate address where the bus error was encountered (will not be earlier, or more than 3 transfers later) - [30:30] - read-write - oneToClear - - - WRITE_ERROR - If 1, the channel received a write bus error. Write one to clear. - WRITE_ADDR shows the approximate address where the bus error was encountered (will not be earlier, or more than 5 transfers later) - [29:29] - read-write - oneToClear - - - BUSY - This flag goes high when the channel starts a new transfer sequence, and low when the last transfer of that sequence completes. Clearing EN while BUSY is high pauses the channel, and BUSY will stay high while paused. - - To terminate a sequence early (and clear the BUSY flag), see CHAN_ABORT. - [26:26] - read-only - - - SNIFF_EN - If 1, this channel's data transfers are visible to the sniff hardware, and each transfer will advance the state of the checksum. This only applies if the sniff hardware is enabled, and has this channel selected. - - This allows checksum to be enabled or disabled on a per-control- block basis. - [25:25] - read-write - - - BSWAP - Apply byte-swap transformation to DMA data. - For byte data, this has no effect. For halfword data, the two bytes of each halfword are swapped. For word data, the four bytes of each word are swapped to reverse order. - [24:24] - read-write - - - IRQ_QUIET - In QUIET mode, the channel does not generate IRQs at the end of every transfer block. Instead, an IRQ is raised when NULL is written to a trigger register, indicating the end of a control block chain. - - This reduces the number of interrupts to be serviced by the CPU when transferring a DMA chain of many small control blocks. - [23:23] - read-write - - - TREQ_SEL - Select a Transfer Request signal. - The channel uses the transfer request signal to pace its data transfer rate. Sources for TREQ signals are internal (TIMERS) or external (DREQ, a Data Request from the system). - 0x0 to 0x3a -> select DREQ n as TREQ - [22:17] - read-write - - TREQ_SEL - - PIO0_TX0 - Select PIO0's TX FIFO 0 as TREQ - 0 - - - PIO0_TX1 - Select PIO0's TX FIFO 1 as TREQ - 1 - - - PIO0_TX2 - Select PIO0's TX FIFO 2 as TREQ - 2 - - - PIO0_TX3 - Select PIO0's TX FIFO 3 as TREQ - 3 - - - PIO0_RX0 - Select PIO0's RX FIFO 0 as TREQ - 4 - - - PIO0_RX1 - Select PIO0's RX FIFO 1 as TREQ - 5 - - - PIO0_RX2 - Select PIO0's RX FIFO 2 as TREQ - 6 - - - PIO0_RX3 - Select PIO0's RX FIFO 3 as TREQ - 7 - - - PIO1_TX0 - Select PIO1's TX FIFO 0 as TREQ - 8 - - - PIO1_TX1 - Select PIO1's TX FIFO 1 as TREQ - 9 - - - PIO1_TX2 - Select PIO1's TX FIFO 2 as TREQ - 10 - - - PIO1_TX3 - Select PIO1's TX FIFO 3 as TREQ - 11 - - - PIO1_RX0 - Select PIO1's RX FIFO 0 as TREQ - 12 - - - PIO1_RX1 - Select PIO1's RX FIFO 1 as TREQ - 13 - - - PIO1_RX2 - Select PIO1's RX FIFO 2 as TREQ - 14 - - - PIO1_RX3 - Select PIO1's RX FIFO 3 as TREQ - 15 - - - PIO2_TX0 - Select PIO2's TX FIFO 0 as TREQ - 16 - - - PIO2_TX1 - Select PIO2's TX FIFO 1 as TREQ - 17 - - - PIO2_TX2 - Select PIO2's TX FIFO 2 as TREQ - 18 - - - PIO2_TX3 - Select PIO2's TX FIFO 3 as TREQ - 19 - - - PIO2_RX0 - Select PIO2's RX FIFO 0 as TREQ - 20 - - - PIO2_RX1 - Select PIO2's RX FIFO 1 as TREQ - 21 - - - PIO2_RX2 - Select PIO2's RX FIFO 2 as TREQ - 22 - - - PIO2_RX3 - Select PIO2's RX FIFO 3 as TREQ - 23 - - - SPI0_TX - Select SPI0's TX FIFO as TREQ - 24 - - - SPI0_RX - Select SPI0's RX FIFO as TREQ - 25 - - - SPI1_TX - Select SPI1's TX FIFO as TREQ - 26 - - - SPI1_RX - Select SPI1's RX FIFO as TREQ - 27 - - - UART0_TX - Select UART0's TX FIFO as TREQ - 28 - - - UART0_RX - Select UART0's RX FIFO as TREQ - 29 - - - UART1_TX - Select UART1's TX FIFO as TREQ - 30 - - - UART1_RX - Select UART1's RX FIFO as TREQ - 31 - - - PWM_WRAP0 - Select PWM Counter 0's Wrap Value as TREQ - 32 - - - PWM_WRAP1 - Select PWM Counter 1's Wrap Value as TREQ - 33 - - - PWM_WRAP2 - Select PWM Counter 2's Wrap Value as TREQ - 34 - - - PWM_WRAP3 - Select PWM Counter 3's Wrap Value as TREQ - 35 - - - PWM_WRAP4 - Select PWM Counter 4's Wrap Value as TREQ - 36 - - - PWM_WRAP5 - Select PWM Counter 5's Wrap Value as TREQ - 37 - - - PWM_WRAP6 - Select PWM Counter 6's Wrap Value as TREQ - 38 - - - PWM_WRAP7 - Select PWM Counter 7's Wrap Value as TREQ - 39 - - - PWM_WRAP8 - Select PWM Counter 8's Wrap Value as TREQ - 40 - - - PWM_WRAP9 - Select PWM Counter 9's Wrap Value as TREQ - 41 - - - PWM_WRAP10 - Select PWM Counter 10's Wrap Value as TREQ - 42 - - - PWM_WRAP11 - Select PWM Counter 11's Wrap Value as TREQ - 43 - - - I2C0_TX - Select I2C0's TX FIFO as TREQ - 44 - - - I2C0_RX - Select I2C0's RX FIFO as TREQ - 45 - - - I2C1_TX - Select I2C1's TX FIFO as TREQ - 46 - - - I2C1_RX - Select I2C1's RX FIFO as TREQ - 47 - - - ADC - Select ADC as TREQ - 48 - - - XIP_STREAM - Select XIP_STREAM as TREQ - 49 - - - XIP_QMITX - Select XIP_QMI's TX FIFO as TREQ - 50 - - - XIP_QMIRX - Select XIP_QMI's RX FIFO as TREQ - 51 - - - HSTX - Select HSTX as TREQ - 52 - - - CORESIGHT - Select CORESIGHT as TREQ - 53 - - - SHA256 - Select SHA256 as TREQ - 54 - - - TIMER0 - Select Timer 0 as TREQ - 59 - - - TIMER1 - Select Timer 1 as TREQ - 60 - - - TIMER2 - Select Timer 2 as TREQ (Optional) - 61 - - - TIMER3 - Select Timer 3 as TREQ (Optional) - 62 - - - PERMANENT - Permanent request, for unpaced transfers. - 63 - - - - - CHAIN_TO - When this channel completes, it will trigger the channel indicated by CHAIN_TO. Disable by setting CHAIN_TO = _(this channel)_. \n Reset value is 0, which means for channels 1 and above the default will be to chain to channel 0 - set this field to avoid this behaviour. - [16:13] - read-write - - - RING_SEL - Select whether RING_SIZE applies to read or write addresses. - If 0, read addresses are wrapped on a (1 << RING_SIZE) boundary. If 1, write addresses are wrapped. - [12:12] - read-write - - - RING_SIZE - Size of address wrap region. If 0, don't wrap. For values n > 0, only the lower n bits of the address will change. This wraps the address on a (1 << n) byte boundary, facilitating access to naturally-aligned ring buffers. - - Ring sizes between 2 and 32768 bytes are possible. This can apply to either read or write addresses, based on value of RING_SEL. - [11:8] - read-write - - - RING_NONE - 0 - - - - - INCR_WRITE_REV - If 1, and INCR_WRITE is 1, the write address is decremented rather than incremented with each transfer. - - If 1, and INCR_WRITE is 0, this otherwise-unused combination causes the write address to be incremented by twice the transfer size, i.e. skipping over alternate addresses. - [7:7] - read-write - - - INCR_WRITE - If 1, the write address increments with each transfer. If 0, each write is directed to the same, initial address. - - Generally this should be disabled for memory-to-peripheral transfers. - [6:6] - read-write - - - INCR_READ_REV - If 1, and INCR_READ is 1, the read address is decremented rather than incremented with each transfer. - - If 1, and INCR_READ is 0, this otherwise-unused combination causes the read address to be incremented by twice the transfer size, i.e. skipping over alternate addresses. - [5:5] - read-write - - - INCR_READ - If 1, the read address increments with each transfer. If 0, each read is directed to the same, initial address. - - Generally this should be disabled for peripheral-to-memory transfers. - [4:4] - read-write - - - DATA_SIZE - Set the size of each bus transfer (byte/halfword/word). READ_ADDR and WRITE_ADDR advance by this amount (1/2/4 bytes) with each transfer. - [3:2] - read-write - - - SIZE_BYTE - 0 - - - SIZE_HALFWORD - 1 - - - SIZE_WORD - 2 - - - - - HIGH_PRIORITY - HIGH_PRIORITY gives a channel preferential treatment in issue scheduling: in each scheduling round, all high priority channels are considered first, and then only a single low priority channel, before returning to the high priority channels. - - This only affects the order in which the DMA schedules channels. The DMA's bus priority is not changed. If the DMA is not saturated then a low priority channel will see no loss of throughput. - [1:1] - read-write - - - EN - DMA Channel Enable. - When 1, the channel will respond to triggering events, which will cause it to become BUSY and start transferring data. When 0, the channel will ignore triggers, stop issuing transfers, and pause the current transfer sequence (i.e. BUSY will remain high if already high) - [0:0] - read-write - - - - - CH_AL2_TRANS_COUNT - Alias for channel 0 TRANS_COUNT register - 0x24 - 0x00000000 - - - CH0_AL2_TRANS_COUNT - [31:0] - read-write - - - - - CH_AL2_READ_ADDR - Alias for channel 0 READ_ADDR register - 0x28 - 0x00000000 - - - CH0_AL2_READ_ADDR - [31:0] - read-write - - - - - CH_AL2_WRITE_ADDR_TRIG - Alias for channel 0 WRITE_ADDR register - This is a trigger register (0xc). Writing a nonzero value will - reload the channel counter and start the channel. - 0x2C - 0x00000000 - - - CH0_AL2_WRITE_ADDR_TRIG - [31:0] - read-write - - - - - CH_AL3_CTRL - DMA Channel 0 Control and Status - 0x30 - 0x00000000 - - - AHB_ERROR - Logical OR of the READ_ERROR and WRITE_ERROR flags. The channel halts when it encounters any bus error, and always raises its channel IRQ flag. - [31:31] - read-only - - - READ_ERROR - If 1, the channel received a read bus error. Write one to clear. - READ_ADDR shows the approximate address where the bus error was encountered (will not be earlier, or more than 3 transfers later) - [30:30] - read-write - oneToClear - - - WRITE_ERROR - If 1, the channel received a write bus error. Write one to clear. - WRITE_ADDR shows the approximate address where the bus error was encountered (will not be earlier, or more than 5 transfers later) - [29:29] - read-write - oneToClear - - - BUSY - This flag goes high when the channel starts a new transfer sequence, and low when the last transfer of that sequence completes. Clearing EN while BUSY is high pauses the channel, and BUSY will stay high while paused. - - To terminate a sequence early (and clear the BUSY flag), see CHAN_ABORT. - [26:26] - read-only - - - SNIFF_EN - If 1, this channel's data transfers are visible to the sniff hardware, and each transfer will advance the state of the checksum. This only applies if the sniff hardware is enabled, and has this channel selected. - - This allows checksum to be enabled or disabled on a per-control- block basis. - [25:25] - read-write - - - BSWAP - Apply byte-swap transformation to DMA data. - For byte data, this has no effect. For halfword data, the two bytes of each halfword are swapped. For word data, the four bytes of each word are swapped to reverse order. - [24:24] - read-write - - - IRQ_QUIET - In QUIET mode, the channel does not generate IRQs at the end of every transfer block. Instead, an IRQ is raised when NULL is written to a trigger register, indicating the end of a control block chain. - - This reduces the number of interrupts to be serviced by the CPU when transferring a DMA chain of many small control blocks. - [23:23] - read-write - - - TREQ_SEL - Select a Transfer Request signal. - The channel uses the transfer request signal to pace its data transfer rate. Sources for TREQ signals are internal (TIMERS) or external (DREQ, a Data Request from the system). - 0x0 to 0x3a -> select DREQ n as TREQ - [22:17] - read-write - - TREQ_SEL - - PIO0_TX0 - Select PIO0's TX FIFO 0 as TREQ - 0 - - - PIO0_TX1 - Select PIO0's TX FIFO 1 as TREQ - 1 - - - PIO0_TX2 - Select PIO0's TX FIFO 2 as TREQ - 2 - - - PIO0_TX3 - Select PIO0's TX FIFO 3 as TREQ - 3 - - - PIO0_RX0 - Select PIO0's RX FIFO 0 as TREQ - 4 - - - PIO0_RX1 - Select PIO0's RX FIFO 1 as TREQ - 5 - - - PIO0_RX2 - Select PIO0's RX FIFO 2 as TREQ - 6 - - - PIO0_RX3 - Select PIO0's RX FIFO 3 as TREQ - 7 - - - PIO1_TX0 - Select PIO1's TX FIFO 0 as TREQ - 8 - - - PIO1_TX1 - Select PIO1's TX FIFO 1 as TREQ - 9 - - - PIO1_TX2 - Select PIO1's TX FIFO 2 as TREQ - 10 - - - PIO1_TX3 - Select PIO1's TX FIFO 3 as TREQ - 11 - - - PIO1_RX0 - Select PIO1's RX FIFO 0 as TREQ - 12 - - - PIO1_RX1 - Select PIO1's RX FIFO 1 as TREQ - 13 - - - PIO1_RX2 - Select PIO1's RX FIFO 2 as TREQ - 14 - - - PIO1_RX3 - Select PIO1's RX FIFO 3 as TREQ - 15 - - - PIO2_TX0 - Select PIO2's TX FIFO 0 as TREQ - 16 - - - PIO2_TX1 - Select PIO2's TX FIFO 1 as TREQ - 17 - - - PIO2_TX2 - Select PIO2's TX FIFO 2 as TREQ - 18 - - - PIO2_TX3 - Select PIO2's TX FIFO 3 as TREQ - 19 - - - PIO2_RX0 - Select PIO2's RX FIFO 0 as TREQ - 20 - - - PIO2_RX1 - Select PIO2's RX FIFO 1 as TREQ - 21 - - - PIO2_RX2 - Select PIO2's RX FIFO 2 as TREQ - 22 - - - PIO2_RX3 - Select PIO2's RX FIFO 3 as TREQ - 23 - - - SPI0_TX - Select SPI0's TX FIFO as TREQ - 24 - - - SPI0_RX - Select SPI0's RX FIFO as TREQ - 25 - - - SPI1_TX - Select SPI1's TX FIFO as TREQ - 26 - - - SPI1_RX - Select SPI1's RX FIFO as TREQ - 27 - - - UART0_TX - Select UART0's TX FIFO as TREQ - 28 - - - UART0_RX - Select UART0's RX FIFO as TREQ - 29 - - - UART1_TX - Select UART1's TX FIFO as TREQ - 30 - - - UART1_RX - Select UART1's RX FIFO as TREQ - 31 - - - PWM_WRAP0 - Select PWM Counter 0's Wrap Value as TREQ - 32 - - - PWM_WRAP1 - Select PWM Counter 1's Wrap Value as TREQ - 33 - - - PWM_WRAP2 - Select PWM Counter 2's Wrap Value as TREQ - 34 - - - PWM_WRAP3 - Select PWM Counter 3's Wrap Value as TREQ - 35 - - - PWM_WRAP4 - Select PWM Counter 4's Wrap Value as TREQ - 36 - - - PWM_WRAP5 - Select PWM Counter 5's Wrap Value as TREQ - 37 - - - PWM_WRAP6 - Select PWM Counter 6's Wrap Value as TREQ - 38 - - - PWM_WRAP7 - Select PWM Counter 7's Wrap Value as TREQ - 39 - - - PWM_WRAP8 - Select PWM Counter 8's Wrap Value as TREQ - 40 - - - PWM_WRAP9 - Select PWM Counter 9's Wrap Value as TREQ - 41 - - - PWM_WRAP10 - Select PWM Counter 10's Wrap Value as TREQ - 42 - - - PWM_WRAP11 - Select PWM Counter 11's Wrap Value as TREQ - 43 - - - I2C0_TX - Select I2C0's TX FIFO as TREQ - 44 - - - I2C0_RX - Select I2C0's RX FIFO as TREQ - 45 - - - I2C1_TX - Select I2C1's TX FIFO as TREQ - 46 - - - I2C1_RX - Select I2C1's RX FIFO as TREQ - 47 - - - ADC - Select ADC as TREQ - 48 - - - XIP_STREAM - Select XIP_STREAM as TREQ - 49 - - - XIP_QMITX - Select XIP_QMI's TX FIFO as TREQ - 50 - - - XIP_QMIRX - Select XIP_QMI's RX FIFO as TREQ - 51 - - - HSTX - Select HSTX as TREQ - 52 - - - CORESIGHT - Select CORESIGHT as TREQ - 53 - - - SHA256 - Select SHA256 as TREQ - 54 - - - TIMER0 - Select Timer 0 as TREQ - 59 - - - TIMER1 - Select Timer 1 as TREQ - 60 - - - TIMER2 - Select Timer 2 as TREQ (Optional) - 61 - - - TIMER3 - Select Timer 3 as TREQ (Optional) - 62 - - - PERMANENT - Permanent request, for unpaced transfers. - 63 - - - - - CHAIN_TO - When this channel completes, it will trigger the channel indicated by CHAIN_TO. Disable by setting CHAIN_TO = _(this channel)_. \n Reset value is 0, which means for channels 1 and above the default will be to chain to channel 0 - set this field to avoid this behaviour. - [16:13] - read-write - - - RING_SEL - Select whether RING_SIZE applies to read or write addresses. - If 0, read addresses are wrapped on a (1 << RING_SIZE) boundary. If 1, write addresses are wrapped. - [12:12] - read-write - - - RING_SIZE - Size of address wrap region. If 0, don't wrap. For values n > 0, only the lower n bits of the address will change. This wraps the address on a (1 << n) byte boundary, facilitating access to naturally-aligned ring buffers. - - Ring sizes between 2 and 32768 bytes are possible. This can apply to either read or write addresses, based on value of RING_SEL. - [11:8] - read-write - - - RING_NONE - 0 - - - - - INCR_WRITE_REV - If 1, and INCR_WRITE is 1, the write address is decremented rather than incremented with each transfer. - - If 1, and INCR_WRITE is 0, this otherwise-unused combination causes the write address to be incremented by twice the transfer size, i.e. skipping over alternate addresses. - [7:7] - read-write - - - INCR_WRITE - If 1, the write address increments with each transfer. If 0, each write is directed to the same, initial address. - - Generally this should be disabled for memory-to-peripheral transfers. - [6:6] - read-write - - - INCR_READ_REV - If 1, and INCR_READ is 1, the read address is decremented rather than incremented with each transfer. - - If 1, and INCR_READ is 0, this otherwise-unused combination causes the read address to be incremented by twice the transfer size, i.e. skipping over alternate addresses. - [5:5] - read-write - - - INCR_READ - If 1, the read address increments with each transfer. If 0, each read is directed to the same, initial address. - - Generally this should be disabled for peripheral-to-memory transfers. - [4:4] - read-write - - - DATA_SIZE - Set the size of each bus transfer (byte/halfword/word). READ_ADDR and WRITE_ADDR advance by this amount (1/2/4 bytes) with each transfer. - [3:2] - read-write - - - SIZE_BYTE - 0 - - - SIZE_HALFWORD - 1 - - - SIZE_WORD - 2 - - - - - HIGH_PRIORITY - HIGH_PRIORITY gives a channel preferential treatment in issue scheduling: in each scheduling round, all high priority channels are considered first, and then only a single low priority channel, before returning to the high priority channels. - - This only affects the order in which the DMA schedules channels. The DMA's bus priority is not changed. If the DMA is not saturated then a low priority channel will see no loss of throughput. - [1:1] - read-write - - - EN - DMA Channel Enable. - When 1, the channel will respond to triggering events, which will cause it to become BUSY and start transferring data. When 0, the channel will ignore triggers, stop issuing transfers, and pause the current transfer sequence (i.e. BUSY will remain high if already high) - [0:0] - read-write - - - - - CH_AL3_WRITE_ADDR - Alias for channel 0 WRITE_ADDR register - 0x34 - 0x00000000 - - - CH0_AL3_WRITE_ADDR - [31:0] - read-write - - - - - CH_AL3_TRANS_COUNT - Alias for channel 0 TRANS_COUNT register - 0x38 - 0x00000000 - - - CH0_AL3_TRANS_COUNT - [31:0] - read-write - - - - - CH_AL3_READ_ADDR_TRIG - Alias for channel 0 READ_ADDR register - This is a trigger register (0xc). Writing a nonzero value will - reload the channel counter and start the channel. - 0x3C - 0x00000000 - - - CH0_AL3_READ_ADDR_TRIG - [31:0] - read-write - - - - - - INTR - Interrupt Status (raw) - 0x400 - 0x00000000 - - - INTR - Raw interrupt status for DMA Channels 0..15. Bit n corresponds to channel n. Ignores any masking or forcing. Channel interrupts can be cleared by writing a bit mask to INTR or INTS0/1/2/3. - - Channel interrupts can be routed to either of four system-level IRQs based on INTE0, INTE1, INTE2 and INTE3. - - The multiple system-level interrupts might be used to allow NVIC IRQ preemption for more time-critical channels, to spread IRQ load across different cores, or to target IRQs to different security domains. - - It is also valid to ignore the multiple IRQs, and just use INTE0/INTS0/IRQ 0. - - If this register is accessed at a security/privilege level less than that of a given channel (as defined by that channel's SECCFG_CHx register), then that channel's interrupt status will read as 0, ignore writes. - [15:0] - read-write - oneToClear - - - - - INTE0 - Interrupt Enables for IRQ 0 - 0x404 - 0x00000000 - - - INTE0 - Set bit n to pass interrupts from channel n to DMA IRQ 0. - - Note this bit has no effect if the channel security/privilege level, defined by SECCFG_CHx, is greater than the IRQ security/privilege defined by SECCFG_IRQ0. - [15:0] - read-write - - - - - INTF0 - Force Interrupts - 0x408 - 0x00000000 - - - INTF0 - Write 1s to force the corresponding bits in INTS0. The interrupt remains asserted until INTF0 is cleared. - [15:0] - read-write - - - - - INTS0 - Interrupt Status for IRQ 0 - 0x40C - 0x00000000 - - - INTS0 - Indicates active channel interrupt requests which are currently causing IRQ 0 to be asserted. - Channel interrupts can be cleared by writing a bit mask here. - - Channels with a security/privilege (SECCFG_CHx) greater SECCFG_IRQ0) read as 0 in this register, and ignore writes. - [15:0] - read-write - oneToClear - - - - - INTR1 - Interrupt Status (raw) - 0x410 - 0x00000000 - - - INTR1 - Raw interrupt status for DMA Channels 0..15. Bit n corresponds to channel n. Ignores any masking or forcing. Channel interrupts can be cleared by writing a bit mask to INTR or INTS0/1/2/3. - - Channel interrupts can be routed to either of four system-level IRQs based on INTE0, INTE1, INTE2 and INTE3. - - The multiple system-level interrupts might be used to allow NVIC IRQ preemption for more time-critical channels, to spread IRQ load across different cores, or to target IRQs to different security domains. - - It is also valid to ignore the multiple IRQs, and just use INTE0/INTS0/IRQ 0. - - If this register is accessed at a security/privilege level less than that of a given channel (as defined by that channel's SECCFG_CHx register), then that channel's interrupt status will read as 0, ignore writes. - [15:0] - read-write - oneToClear - - - - - INTE1 - Interrupt Enables for IRQ 1 - 0x414 - 0x00000000 - - - INTE1 - Set bit n to pass interrupts from channel n to DMA IRQ 1. - - Note this bit has no effect if the channel security/privilege level, defined by SECCFG_CHx, is greater than the IRQ security/privilege defined by SECCFG_IRQ1. - [15:0] - read-write - - - - - INTF1 - Force Interrupts - 0x418 - 0x00000000 - - - INTF1 - Write 1s to force the corresponding bits in INTS1. The interrupt remains asserted until INTF1 is cleared. - [15:0] - read-write - - - - - INTS1 - Interrupt Status for IRQ 1 - 0x41C - 0x00000000 - - - INTS1 - Indicates active channel interrupt requests which are currently causing IRQ 1 to be asserted. - Channel interrupts can be cleared by writing a bit mask here. - - Channels with a security/privilege (SECCFG_CHx) greater SECCFG_IRQ1) read as 0 in this register, and ignore writes. - [15:0] - read-write - oneToClear - - - - - INTR2 - Interrupt Status (raw) - 0x420 - 0x00000000 - - - INTR2 - Raw interrupt status for DMA Channels 0..15. Bit n corresponds to channel n. Ignores any masking or forcing. Channel interrupts can be cleared by writing a bit mask to INTR or INTS0/1/2/3. - - Channel interrupts can be routed to either of four system-level IRQs based on INTE0, INTE1, INTE2 and INTE3. - - The multiple system-level interrupts might be used to allow NVIC IRQ preemption for more time-critical channels, to spread IRQ load across different cores, or to target IRQs to different security domains. - - It is also valid to ignore the multiple IRQs, and just use INTE0/INTS0/IRQ 0. - - If this register is accessed at a security/privilege level less than that of a given channel (as defined by that channel's SECCFG_CHx register), then that channel's interrupt status will read as 0, ignore writes. - [15:0] - read-write - oneToClear - - - - - INTE2 - Interrupt Enables for IRQ 2 - 0x424 - 0x00000000 - - - INTE2 - Set bit n to pass interrupts from channel n to DMA IRQ 2. - - Note this bit has no effect if the channel security/privilege level, defined by SECCFG_CHx, is greater than the IRQ security/privilege defined by SECCFG_IRQ2. - [15:0] - read-write - - - - - INTF2 - Force Interrupts - 0x428 - 0x00000000 - - - INTF2 - Write 1s to force the corresponding bits in INTS2. The interrupt remains asserted until INTF2 is cleared. - [15:0] - read-write - - - - - INTS2 - Interrupt Status for IRQ 2 - 0x42C - 0x00000000 - - - INTS2 - Indicates active channel interrupt requests which are currently causing IRQ 2 to be asserted. - Channel interrupts can be cleared by writing a bit mask here. - - Channels with a security/privilege (SECCFG_CHx) greater SECCFG_IRQ2) read as 0 in this register, and ignore writes. - [15:0] - read-write - oneToClear - - - - - INTR3 - Interrupt Status (raw) - 0x430 - 0x00000000 - - - INTR3 - Raw interrupt status for DMA Channels 0..15. Bit n corresponds to channel n. Ignores any masking or forcing. Channel interrupts can be cleared by writing a bit mask to INTR or INTS0/1/2/3. - - Channel interrupts can be routed to either of four system-level IRQs based on INTE0, INTE1, INTE2 and INTE3. - - The multiple system-level interrupts might be used to allow NVIC IRQ preemption for more time-critical channels, to spread IRQ load across different cores, or to target IRQs to different security domains. - - It is also valid to ignore the multiple IRQs, and just use INTE0/INTS0/IRQ 0. - - If this register is accessed at a security/privilege level less than that of a given channel (as defined by that channel's SECCFG_CHx register), then that channel's interrupt status will read as 0, ignore writes. - [15:0] - read-write - oneToClear - - - - - INTE3 - Interrupt Enables for IRQ 3 - 0x434 - 0x00000000 - - - INTE3 - Set bit n to pass interrupts from channel n to DMA IRQ 3. - - Note this bit has no effect if the channel security/privilege level, defined by SECCFG_CHx, is greater than the IRQ security/privilege defined by SECCFG_IRQ3. - [15:0] - read-write - - - - - INTF3 - Force Interrupts - 0x438 - 0x00000000 - - - INTF3 - Write 1s to force the corresponding bits in INTS3. The interrupt remains asserted until INTF3 is cleared. - [15:0] - read-write - - - - - INTS3 - Interrupt Status for IRQ 3 - 0x43C - 0x00000000 - - - INTS3 - Indicates active channel interrupt requests which are currently causing IRQ 3 to be asserted. - Channel interrupts can be cleared by writing a bit mask here. - - Channels with a security/privilege (SECCFG_CHx) greater SECCFG_IRQ3) read as 0 in this register, and ignore writes. - [15:0] - read-write - oneToClear - - - - - TIMER0 - Pacing (X/Y) fractional timer - The pacing timer produces TREQ assertions at a rate set by ((X/Y) * sys_clk). This equation is evaluated every sys_clk cycles and therefore can only generate TREQs at a rate of 1 per sys_clk (i.e. permanent TREQ) or less. - 0x440 - 0x00000000 - - - X - Pacing Timer Dividend. Specifies the X value for the (X/Y) fractional timer. - [31:16] - read-write - - - Y - Pacing Timer Divisor. Specifies the Y value for the (X/Y) fractional timer. - [15:0] - read-write - - - - - TIMER1 - Pacing (X/Y) fractional timer - The pacing timer produces TREQ assertions at a rate set by ((X/Y) * sys_clk). This equation is evaluated every sys_clk cycles and therefore can only generate TREQs at a rate of 1 per sys_clk (i.e. permanent TREQ) or less. - 0x444 - 0x00000000 - - - X - Pacing Timer Dividend. Specifies the X value for the (X/Y) fractional timer. - [31:16] - read-write - - - Y - Pacing Timer Divisor. Specifies the Y value for the (X/Y) fractional timer. - [15:0] - read-write - - - - - TIMER2 - Pacing (X/Y) fractional timer - The pacing timer produces TREQ assertions at a rate set by ((X/Y) * sys_clk). This equation is evaluated every sys_clk cycles and therefore can only generate TREQs at a rate of 1 per sys_clk (i.e. permanent TREQ) or less. - 0x448 - 0x00000000 - - - X - Pacing Timer Dividend. Specifies the X value for the (X/Y) fractional timer. - [31:16] - read-write - - - Y - Pacing Timer Divisor. Specifies the Y value for the (X/Y) fractional timer. - [15:0] - read-write - - - - - TIMER3 - Pacing (X/Y) fractional timer - The pacing timer produces TREQ assertions at a rate set by ((X/Y) * sys_clk). This equation is evaluated every sys_clk cycles and therefore can only generate TREQs at a rate of 1 per sys_clk (i.e. permanent TREQ) or less. - 0x44C - 0x00000000 - - - X - Pacing Timer Dividend. Specifies the X value for the (X/Y) fractional timer. - [31:16] - read-write - - - Y - Pacing Timer Divisor. Specifies the Y value for the (X/Y) fractional timer. - [15:0] - read-write - - - - - MULTI_CHAN_TRIGGER - Trigger one or more channels simultaneously - 0x450 - 0x00000000 - - - MULTI_CHAN_TRIGGER - Each bit in this register corresponds to a DMA channel. Writing a 1 to the relevant bit is the same as writing to that channel's trigger register; the channel will start if it is currently enabled and not already busy. - [15:0] - write-only - - - - - SNIFF_CTRL - Sniffer Control - 0x454 - 0x00000000 - - - OUT_INV - If set, the result appears inverted (bitwise complement) when read. This does not affect the way the checksum is calculated; the result is transformed on-the-fly between the result register and the bus. - [11:11] - read-write - - - OUT_REV - If set, the result appears bit-reversed when read. This does not affect the way the checksum is calculated; the result is transformed on-the-fly between the result register and the bus. - [10:10] - read-write - - - BSWAP - Locally perform a byte reverse on the sniffed data, before feeding into checksum. - - Note that the sniff hardware is downstream of the DMA channel byteswap performed in the read master: if channel CTRL_BSWAP and SNIFF_CTRL_BSWAP are both enabled, their effects cancel from the sniffer's point of view. - [9:9] - read-write - - - CALC - [8:5] - read-write - - - CRC32 - Calculate a CRC-32 (IEEE802.3 polynomial) - 0 - - - CRC32R - Calculate a CRC-32 (IEEE802.3 polynomial) with bit reversed data - 1 - - - CRC16 - Calculate a CRC-16-CCITT - 2 - - - CRC16R - Calculate a CRC-16-CCITT with bit reversed data - 3 - - - EVEN - XOR reduction over all data. == 1 if the total 1 population count is odd. - 14 - - - SUM - Calculate a simple 32-bit checksum (addition with a 32 bit accumulator) - 15 - - - - - DMACH - DMA channel for Sniffer to observe - [4:1] - read-write - - - EN - Enable sniffer - [0:0] - read-write - - - - - SNIFF_DATA - Data accumulator for sniff hardware - 0x458 - 0x00000000 - - - SNIFF_DATA - Write an initial seed value here before starting a DMA transfer on the channel indicated by SNIFF_CTRL_DMACH. The hardware will update this register each time it observes a read from the indicated channel. Once the channel completes, the final result can be read from this register. - [31:0] - read-write - - - - - FIFO_LEVELS - Debug RAF, WAF, TDF levels - 0x460 - 0x00000000 - - - RAF_LVL - Current Read-Address-FIFO fill level - [23:16] - read-only - - - WAF_LVL - Current Write-Address-FIFO fill level - [15:8] - read-only - - - TDF_LVL - Current Transfer-Data-FIFO fill level - [7:0] - read-only - - - - - CHAN_ABORT - Abort an in-progress transfer sequence on one or more channels - 0x464 - 0x00000000 - - - CHAN_ABORT - Each bit corresponds to a channel. Writing a 1 aborts whatever transfer sequence is in progress on that channel. The bit will remain high until any in-flight transfers have been flushed through the address and data FIFOs. - - After writing, this register must be polled until it returns all-zero. Until this point, it is unsafe to restart the channel. - [15:0] - write-only - - - - - N_CHANNELS - The number of channels this DMA instance is equipped with. This DMA supports up to 16 hardware channels, but can be configured with as few as one, to minimise silicon area. - 0x468 - 0x00000000 - - - N_CHANNELS - [4:0] - read-only - - - - - SECCFG_CH0 - Security configuration for channel 0. Control whether this channel performs Secure/Non-secure and Privileged/Unprivileged bus accesses. - - If this channel generates bus accesses of some security level, an access of at least that level (in the order S+P > S+U > NS+P > NS+U) is required to program, trigger, abort, check the status of, interrupt on or acknowledge the interrupt of this channel. - - This register automatically locks down (becomes read-only) once software starts to configure the channel. - - This register is world-readable, but is writable only from a Secure, Privileged context. - 0x480 - 0x00000003 - - - LOCK - LOCK is 0 at reset, and is set to 1 automatically upon a successful write to this channel's control registers. That is, a write to CTRL, READ_ADDR, WRITE_ADDR, TRANS_COUNT and their aliases. - - Once its LOCK bit is set, this register becomes read-only. - - A failed write, for example due to the write's privilege being lower than that specified in the channel's SECCFG register, will not set the LOCK bit. - [2:2] - read-write - - - S - Secure channel. If 1, this channel performs Secure bus accesses. If 0, it performs Non-secure bus accesses. - - If 1, this channel is controllable only from a Secure context. - [1:1] - read-write - - - P - Privileged channel. If 1, this channel performs Privileged bus accesses. If 0, it performs Unprivileged bus accesses. - - If 1, this channel is controllable only from a Privileged context of the same Secure/Non-secure level, or any context of a higher Secure/Non-secure level. - [0:0] - read-write - - - - - SECCFG_CH1 - Security configuration for channel 1. Control whether this channel performs Secure/Non-secure and Privileged/Unprivileged bus accesses. - - If this channel generates bus accesses of some security level, an access of at least that level (in the order S+P > S+U > NS+P > NS+U) is required to program, trigger, abort, check the status of, interrupt on or acknowledge the interrupt of this channel. - - This register automatically locks down (becomes read-only) once software starts to configure the channel. - - This register is world-readable, but is writable only from a Secure, Privileged context. - 0x484 - 0x00000003 - - - LOCK - LOCK is 0 at reset, and is set to 1 automatically upon a successful write to this channel's control registers. That is, a write to CTRL, READ_ADDR, WRITE_ADDR, TRANS_COUNT and their aliases. - - Once its LOCK bit is set, this register becomes read-only. - - A failed write, for example due to the write's privilege being lower than that specified in the channel's SECCFG register, will not set the LOCK bit. - [2:2] - read-write - - - S - Secure channel. If 1, this channel performs Secure bus accesses. If 0, it performs Non-secure bus accesses. - - If 1, this channel is controllable only from a Secure context. - [1:1] - read-write - - - P - Privileged channel. If 1, this channel performs Privileged bus accesses. If 0, it performs Unprivileged bus accesses. - - If 1, this channel is controllable only from a Privileged context of the same Secure/Non-secure level, or any context of a higher Secure/Non-secure level. - [0:0] - read-write - - - - - SECCFG_CH2 - Security configuration for channel 2. Control whether this channel performs Secure/Non-secure and Privileged/Unprivileged bus accesses. - - If this channel generates bus accesses of some security level, an access of at least that level (in the order S+P > S+U > NS+P > NS+U) is required to program, trigger, abort, check the status of, interrupt on or acknowledge the interrupt of this channel. - - This register automatically locks down (becomes read-only) once software starts to configure the channel. - - This register is world-readable, but is writable only from a Secure, Privileged context. - 0x488 - 0x00000003 - - - LOCK - LOCK is 0 at reset, and is set to 1 automatically upon a successful write to this channel's control registers. That is, a write to CTRL, READ_ADDR, WRITE_ADDR, TRANS_COUNT and their aliases. - - Once its LOCK bit is set, this register becomes read-only. - - A failed write, for example due to the write's privilege being lower than that specified in the channel's SECCFG register, will not set the LOCK bit. - [2:2] - read-write - - - S - Secure channel. If 1, this channel performs Secure bus accesses. If 0, it performs Non-secure bus accesses. - - If 1, this channel is controllable only from a Secure context. - [1:1] - read-write - - - P - Privileged channel. If 1, this channel performs Privileged bus accesses. If 0, it performs Unprivileged bus accesses. - - If 1, this channel is controllable only from a Privileged context of the same Secure/Non-secure level, or any context of a higher Secure/Non-secure level. - [0:0] - read-write - - - - - SECCFG_CH3 - Security configuration for channel 3. Control whether this channel performs Secure/Non-secure and Privileged/Unprivileged bus accesses. - - If this channel generates bus accesses of some security level, an access of at least that level (in the order S+P > S+U > NS+P > NS+U) is required to program, trigger, abort, check the status of, interrupt on or acknowledge the interrupt of this channel. - - This register automatically locks down (becomes read-only) once software starts to configure the channel. - - This register is world-readable, but is writable only from a Secure, Privileged context. - 0x48C - 0x00000003 - - - LOCK - LOCK is 0 at reset, and is set to 1 automatically upon a successful write to this channel's control registers. That is, a write to CTRL, READ_ADDR, WRITE_ADDR, TRANS_COUNT and their aliases. - - Once its LOCK bit is set, this register becomes read-only. - - A failed write, for example due to the write's privilege being lower than that specified in the channel's SECCFG register, will not set the LOCK bit. - [2:2] - read-write - - - S - Secure channel. If 1, this channel performs Secure bus accesses. If 0, it performs Non-secure bus accesses. - - If 1, this channel is controllable only from a Secure context. - [1:1] - read-write - - - P - Privileged channel. If 1, this channel performs Privileged bus accesses. If 0, it performs Unprivileged bus accesses. - - If 1, this channel is controllable only from a Privileged context of the same Secure/Non-secure level, or any context of a higher Secure/Non-secure level. - [0:0] - read-write - - - - - SECCFG_CH4 - Security configuration for channel 4. Control whether this channel performs Secure/Non-secure and Privileged/Unprivileged bus accesses. - - If this channel generates bus accesses of some security level, an access of at least that level (in the order S+P > S+U > NS+P > NS+U) is required to program, trigger, abort, check the status of, interrupt on or acknowledge the interrupt of this channel. - - This register automatically locks down (becomes read-only) once software starts to configure the channel. - - This register is world-readable, but is writable only from a Secure, Privileged context. - 0x490 - 0x00000003 - - - LOCK - LOCK is 0 at reset, and is set to 1 automatically upon a successful write to this channel's control registers. That is, a write to CTRL, READ_ADDR, WRITE_ADDR, TRANS_COUNT and their aliases. - - Once its LOCK bit is set, this register becomes read-only. - - A failed write, for example due to the write's privilege being lower than that specified in the channel's SECCFG register, will not set the LOCK bit. - [2:2] - read-write - - - S - Secure channel. If 1, this channel performs Secure bus accesses. If 0, it performs Non-secure bus accesses. - - If 1, this channel is controllable only from a Secure context. - [1:1] - read-write - - - P - Privileged channel. If 1, this channel performs Privileged bus accesses. If 0, it performs Unprivileged bus accesses. - - If 1, this channel is controllable only from a Privileged context of the same Secure/Non-secure level, or any context of a higher Secure/Non-secure level. - [0:0] - read-write - - - - - SECCFG_CH5 - Security configuration for channel 5. Control whether this channel performs Secure/Non-secure and Privileged/Unprivileged bus accesses. - - If this channel generates bus accesses of some security level, an access of at least that level (in the order S+P > S+U > NS+P > NS+U) is required to program, trigger, abort, check the status of, interrupt on or acknowledge the interrupt of this channel. - - This register automatically locks down (becomes read-only) once software starts to configure the channel. - - This register is world-readable, but is writable only from a Secure, Privileged context. - 0x494 - 0x00000003 - - - LOCK - LOCK is 0 at reset, and is set to 1 automatically upon a successful write to this channel's control registers. That is, a write to CTRL, READ_ADDR, WRITE_ADDR, TRANS_COUNT and their aliases. - - Once its LOCK bit is set, this register becomes read-only. - - A failed write, for example due to the write's privilege being lower than that specified in the channel's SECCFG register, will not set the LOCK bit. - [2:2] - read-write - - - S - Secure channel. If 1, this channel performs Secure bus accesses. If 0, it performs Non-secure bus accesses. - - If 1, this channel is controllable only from a Secure context. - [1:1] - read-write - - - P - Privileged channel. If 1, this channel performs Privileged bus accesses. If 0, it performs Unprivileged bus accesses. - - If 1, this channel is controllable only from a Privileged context of the same Secure/Non-secure level, or any context of a higher Secure/Non-secure level. - [0:0] - read-write - - - - - SECCFG_CH6 - Security configuration for channel 6. Control whether this channel performs Secure/Non-secure and Privileged/Unprivileged bus accesses. - - If this channel generates bus accesses of some security level, an access of at least that level (in the order S+P > S+U > NS+P > NS+U) is required to program, trigger, abort, check the status of, interrupt on or acknowledge the interrupt of this channel. - - This register automatically locks down (becomes read-only) once software starts to configure the channel. - - This register is world-readable, but is writable only from a Secure, Privileged context. - 0x498 - 0x00000003 - - - LOCK - LOCK is 0 at reset, and is set to 1 automatically upon a successful write to this channel's control registers. That is, a write to CTRL, READ_ADDR, WRITE_ADDR, TRANS_COUNT and their aliases. - - Once its LOCK bit is set, this register becomes read-only. - - A failed write, for example due to the write's privilege being lower than that specified in the channel's SECCFG register, will not set the LOCK bit. - [2:2] - read-write - - - S - Secure channel. If 1, this channel performs Secure bus accesses. If 0, it performs Non-secure bus accesses. - - If 1, this channel is controllable only from a Secure context. - [1:1] - read-write - - - P - Privileged channel. If 1, this channel performs Privileged bus accesses. If 0, it performs Unprivileged bus accesses. - - If 1, this channel is controllable only from a Privileged context of the same Secure/Non-secure level, or any context of a higher Secure/Non-secure level. - [0:0] - read-write - - - - - SECCFG_CH7 - Security configuration for channel 7. Control whether this channel performs Secure/Non-secure and Privileged/Unprivileged bus accesses. - - If this channel generates bus accesses of some security level, an access of at least that level (in the order S+P > S+U > NS+P > NS+U) is required to program, trigger, abort, check the status of, interrupt on or acknowledge the interrupt of this channel. - - This register automatically locks down (becomes read-only) once software starts to configure the channel. - - This register is world-readable, but is writable only from a Secure, Privileged context. - 0x49C - 0x00000003 - - - LOCK - LOCK is 0 at reset, and is set to 1 automatically upon a successful write to this channel's control registers. That is, a write to CTRL, READ_ADDR, WRITE_ADDR, TRANS_COUNT and their aliases. - - Once its LOCK bit is set, this register becomes read-only. - - A failed write, for example due to the write's privilege being lower than that specified in the channel's SECCFG register, will not set the LOCK bit. - [2:2] - read-write - - - S - Secure channel. If 1, this channel performs Secure bus accesses. If 0, it performs Non-secure bus accesses. - - If 1, this channel is controllable only from a Secure context. - [1:1] - read-write - - - P - Privileged channel. If 1, this channel performs Privileged bus accesses. If 0, it performs Unprivileged bus accesses. - - If 1, this channel is controllable only from a Privileged context of the same Secure/Non-secure level, or any context of a higher Secure/Non-secure level. - [0:0] - read-write - - - - - SECCFG_CH8 - Security configuration for channel 8. Control whether this channel performs Secure/Non-secure and Privileged/Unprivileged bus accesses. - - If this channel generates bus accesses of some security level, an access of at least that level (in the order S+P > S+U > NS+P > NS+U) is required to program, trigger, abort, check the status of, interrupt on or acknowledge the interrupt of this channel. - - This register automatically locks down (becomes read-only) once software starts to configure the channel. - - This register is world-readable, but is writable only from a Secure, Privileged context. - 0x4A0 - 0x00000003 - - - LOCK - LOCK is 0 at reset, and is set to 1 automatically upon a successful write to this channel's control registers. That is, a write to CTRL, READ_ADDR, WRITE_ADDR, TRANS_COUNT and their aliases. - - Once its LOCK bit is set, this register becomes read-only. - - A failed write, for example due to the write's privilege being lower than that specified in the channel's SECCFG register, will not set the LOCK bit. - [2:2] - read-write - - - S - Secure channel. If 1, this channel performs Secure bus accesses. If 0, it performs Non-secure bus accesses. - - If 1, this channel is controllable only from a Secure context. - [1:1] - read-write - - - P - Privileged channel. If 1, this channel performs Privileged bus accesses. If 0, it performs Unprivileged bus accesses. - - If 1, this channel is controllable only from a Privileged context of the same Secure/Non-secure level, or any context of a higher Secure/Non-secure level. - [0:0] - read-write - - - - - SECCFG_CH9 - Security configuration for channel 9. Control whether this channel performs Secure/Non-secure and Privileged/Unprivileged bus accesses. - - If this channel generates bus accesses of some security level, an access of at least that level (in the order S+P > S+U > NS+P > NS+U) is required to program, trigger, abort, check the status of, interrupt on or acknowledge the interrupt of this channel. - - This register automatically locks down (becomes read-only) once software starts to configure the channel. - - This register is world-readable, but is writable only from a Secure, Privileged context. - 0x4A4 - 0x00000003 - - - LOCK - LOCK is 0 at reset, and is set to 1 automatically upon a successful write to this channel's control registers. That is, a write to CTRL, READ_ADDR, WRITE_ADDR, TRANS_COUNT and their aliases. - - Once its LOCK bit is set, this register becomes read-only. - - A failed write, for example due to the write's privilege being lower than that specified in the channel's SECCFG register, will not set the LOCK bit. - [2:2] - read-write - - - S - Secure channel. If 1, this channel performs Secure bus accesses. If 0, it performs Non-secure bus accesses. - - If 1, this channel is controllable only from a Secure context. - [1:1] - read-write - - - P - Privileged channel. If 1, this channel performs Privileged bus accesses. If 0, it performs Unprivileged bus accesses. - - If 1, this channel is controllable only from a Privileged context of the same Secure/Non-secure level, or any context of a higher Secure/Non-secure level. - [0:0] - read-write - - - - - SECCFG_CH10 - Security configuration for channel 10. Control whether this channel performs Secure/Non-secure and Privileged/Unprivileged bus accesses. - - If this channel generates bus accesses of some security level, an access of at least that level (in the order S+P > S+U > NS+P > NS+U) is required to program, trigger, abort, check the status of, interrupt on or acknowledge the interrupt of this channel. - - This register automatically locks down (becomes read-only) once software starts to configure the channel. - - This register is world-readable, but is writable only from a Secure, Privileged context. - 0x4A8 - 0x00000003 - - - LOCK - LOCK is 0 at reset, and is set to 1 automatically upon a successful write to this channel's control registers. That is, a write to CTRL, READ_ADDR, WRITE_ADDR, TRANS_COUNT and their aliases. - - Once its LOCK bit is set, this register becomes read-only. - - A failed write, for example due to the write's privilege being lower than that specified in the channel's SECCFG register, will not set the LOCK bit. - [2:2] - read-write - - - S - Secure channel. If 1, this channel performs Secure bus accesses. If 0, it performs Non-secure bus accesses. - - If 1, this channel is controllable only from a Secure context. - [1:1] - read-write - - - P - Privileged channel. If 1, this channel performs Privileged bus accesses. If 0, it performs Unprivileged bus accesses. - - If 1, this channel is controllable only from a Privileged context of the same Secure/Non-secure level, or any context of a higher Secure/Non-secure level. - [0:0] - read-write - - - - - SECCFG_CH11 - Security configuration for channel 11. Control whether this channel performs Secure/Non-secure and Privileged/Unprivileged bus accesses. - - If this channel generates bus accesses of some security level, an access of at least that level (in the order S+P > S+U > NS+P > NS+U) is required to program, trigger, abort, check the status of, interrupt on or acknowledge the interrupt of this channel. - - This register automatically locks down (becomes read-only) once software starts to configure the channel. - - This register is world-readable, but is writable only from a Secure, Privileged context. - 0x4AC - 0x00000003 - - - LOCK - LOCK is 0 at reset, and is set to 1 automatically upon a successful write to this channel's control registers. That is, a write to CTRL, READ_ADDR, WRITE_ADDR, TRANS_COUNT and their aliases. - - Once its LOCK bit is set, this register becomes read-only. - - A failed write, for example due to the write's privilege being lower than that specified in the channel's SECCFG register, will not set the LOCK bit. - [2:2] - read-write - - - S - Secure channel. If 1, this channel performs Secure bus accesses. If 0, it performs Non-secure bus accesses. - - If 1, this channel is controllable only from a Secure context. - [1:1] - read-write - - - P - Privileged channel. If 1, this channel performs Privileged bus accesses. If 0, it performs Unprivileged bus accesses. - - If 1, this channel is controllable only from a Privileged context of the same Secure/Non-secure level, or any context of a higher Secure/Non-secure level. - [0:0] - read-write - - - - - SECCFG_CH12 - Security configuration for channel 12. Control whether this channel performs Secure/Non-secure and Privileged/Unprivileged bus accesses. - - If this channel generates bus accesses of some security level, an access of at least that level (in the order S+P > S+U > NS+P > NS+U) is required to program, trigger, abort, check the status of, interrupt on or acknowledge the interrupt of this channel. - - This register automatically locks down (becomes read-only) once software starts to configure the channel. - - This register is world-readable, but is writable only from a Secure, Privileged context. - 0x4B0 - 0x00000003 - - - LOCK - LOCK is 0 at reset, and is set to 1 automatically upon a successful write to this channel's control registers. That is, a write to CTRL, READ_ADDR, WRITE_ADDR, TRANS_COUNT and their aliases. - - Once its LOCK bit is set, this register becomes read-only. - - A failed write, for example due to the write's privilege being lower than that specified in the channel's SECCFG register, will not set the LOCK bit. - [2:2] - read-write - - - S - Secure channel. If 1, this channel performs Secure bus accesses. If 0, it performs Non-secure bus accesses. - - If 1, this channel is controllable only from a Secure context. - [1:1] - read-write - - - P - Privileged channel. If 1, this channel performs Privileged bus accesses. If 0, it performs Unprivileged bus accesses. - - If 1, this channel is controllable only from a Privileged context of the same Secure/Non-secure level, or any context of a higher Secure/Non-secure level. - [0:0] - read-write - - - - - SECCFG_CH13 - Security configuration for channel 13. Control whether this channel performs Secure/Non-secure and Privileged/Unprivileged bus accesses. - - If this channel generates bus accesses of some security level, an access of at least that level (in the order S+P > S+U > NS+P > NS+U) is required to program, trigger, abort, check the status of, interrupt on or acknowledge the interrupt of this channel. - - This register automatically locks down (becomes read-only) once software starts to configure the channel. - - This register is world-readable, but is writable only from a Secure, Privileged context. - 0x4B4 - 0x00000003 - - - LOCK - LOCK is 0 at reset, and is set to 1 automatically upon a successful write to this channel's control registers. That is, a write to CTRL, READ_ADDR, WRITE_ADDR, TRANS_COUNT and their aliases. - - Once its LOCK bit is set, this register becomes read-only. - - A failed write, for example due to the write's privilege being lower than that specified in the channel's SECCFG register, will not set the LOCK bit. - [2:2] - read-write - - - S - Secure channel. If 1, this channel performs Secure bus accesses. If 0, it performs Non-secure bus accesses. - - If 1, this channel is controllable only from a Secure context. - [1:1] - read-write - - - P - Privileged channel. If 1, this channel performs Privileged bus accesses. If 0, it performs Unprivileged bus accesses. - - If 1, this channel is controllable only from a Privileged context of the same Secure/Non-secure level, or any context of a higher Secure/Non-secure level. - [0:0] - read-write - - - - - SECCFG_CH14 - Security configuration for channel 14. Control whether this channel performs Secure/Non-secure and Privileged/Unprivileged bus accesses. - - If this channel generates bus accesses of some security level, an access of at least that level (in the order S+P > S+U > NS+P > NS+U) is required to program, trigger, abort, check the status of, interrupt on or acknowledge the interrupt of this channel. - - This register automatically locks down (becomes read-only) once software starts to configure the channel. - - This register is world-readable, but is writable only from a Secure, Privileged context. - 0x4B8 - 0x00000003 - - - LOCK - LOCK is 0 at reset, and is set to 1 automatically upon a successful write to this channel's control registers. That is, a write to CTRL, READ_ADDR, WRITE_ADDR, TRANS_COUNT and their aliases. - - Once its LOCK bit is set, this register becomes read-only. - - A failed write, for example due to the write's privilege being lower than that specified in the channel's SECCFG register, will not set the LOCK bit. - [2:2] - read-write - - - S - Secure channel. If 1, this channel performs Secure bus accesses. If 0, it performs Non-secure bus accesses. - - If 1, this channel is controllable only from a Secure context. - [1:1] - read-write - - - P - Privileged channel. If 1, this channel performs Privileged bus accesses. If 0, it performs Unprivileged bus accesses. - - If 1, this channel is controllable only from a Privileged context of the same Secure/Non-secure level, or any context of a higher Secure/Non-secure level. - [0:0] - read-write - - - - - SECCFG_CH15 - Security configuration for channel 15. Control whether this channel performs Secure/Non-secure and Privileged/Unprivileged bus accesses. - - If this channel generates bus accesses of some security level, an access of at least that level (in the order S+P > S+U > NS+P > NS+U) is required to program, trigger, abort, check the status of, interrupt on or acknowledge the interrupt of this channel. - - This register automatically locks down (becomes read-only) once software starts to configure the channel. - - This register is world-readable, but is writable only from a Secure, Privileged context. - 0x4BC - 0x00000003 - - - LOCK - LOCK is 0 at reset, and is set to 1 automatically upon a successful write to this channel's control registers. That is, a write to CTRL, READ_ADDR, WRITE_ADDR, TRANS_COUNT and their aliases. - - Once its LOCK bit is set, this register becomes read-only. - - A failed write, for example due to the write's privilege being lower than that specified in the channel's SECCFG register, will not set the LOCK bit. - [2:2] - read-write - - - S - Secure channel. If 1, this channel performs Secure bus accesses. If 0, it performs Non-secure bus accesses. - - If 1, this channel is controllable only from a Secure context. - [1:1] - read-write - - - P - Privileged channel. If 1, this channel performs Privileged bus accesses. If 0, it performs Unprivileged bus accesses. - - If 1, this channel is controllable only from a Privileged context of the same Secure/Non-secure level, or any context of a higher Secure/Non-secure level. - [0:0] - read-write - - - - - SECCFG_IRQ0 - Security configuration for IRQ 0. Control whether the IRQ permits configuration by Non-secure/Unprivileged contexts, and whether it can observe Secure/Privileged channel interrupt flags. - 0x4C0 - 0x00000003 - - - S - Secure IRQ. If 1, this IRQ's control registers can only be accessed from a Secure context. - - If 0, this IRQ's control registers can be accessed from a Non-secure context, but Secure channels (as per SECCFG_CHx) are masked from the IRQ status, and this IRQ's registers can not be used to acknowledge the channel interrupts of Secure channels. - [1:1] - read-write - - - P - Privileged IRQ. If 1, this IRQ's control registers can only be accessed from a Privileged context. - - If 0, this IRQ's control registers can be accessed from an Unprivileged context, but Privileged channels (as per SECCFG_CHx) are masked from the IRQ status, and this IRQ's registers can not be used to acknowledge the channel interrupts of Privileged channels. - [0:0] - read-write - - - - - SECCFG_IRQ1 - Security configuration for IRQ 1. Control whether the IRQ permits configuration by Non-secure/Unprivileged contexts, and whether it can observe Secure/Privileged channel interrupt flags. - 0x4C4 - 0x00000003 - - - S - Secure IRQ. If 1, this IRQ's control registers can only be accessed from a Secure context. - - If 0, this IRQ's control registers can be accessed from a Non-secure context, but Secure channels (as per SECCFG_CHx) are masked from the IRQ status, and this IRQ's registers can not be used to acknowledge the channel interrupts of Secure channels. - [1:1] - read-write - - - P - Privileged IRQ. If 1, this IRQ's control registers can only be accessed from a Privileged context. - - If 0, this IRQ's control registers can be accessed from an Unprivileged context, but Privileged channels (as per SECCFG_CHx) are masked from the IRQ status, and this IRQ's registers can not be used to acknowledge the channel interrupts of Privileged channels. - [0:0] - read-write - - - - - SECCFG_IRQ2 - Security configuration for IRQ 2. Control whether the IRQ permits configuration by Non-secure/Unprivileged contexts, and whether it can observe Secure/Privileged channel interrupt flags. - 0x4C8 - 0x00000003 - - - S - Secure IRQ. If 1, this IRQ's control registers can only be accessed from a Secure context. - - If 0, this IRQ's control registers can be accessed from a Non-secure context, but Secure channels (as per SECCFG_CHx) are masked from the IRQ status, and this IRQ's registers can not be used to acknowledge the channel interrupts of Secure channels. - [1:1] - read-write - - - P - Privileged IRQ. If 1, this IRQ's control registers can only be accessed from a Privileged context. - - If 0, this IRQ's control registers can be accessed from an Unprivileged context, but Privileged channels (as per SECCFG_CHx) are masked from the IRQ status, and this IRQ's registers can not be used to acknowledge the channel interrupts of Privileged channels. - [0:0] - read-write - - - - - SECCFG_IRQ3 - Security configuration for IRQ 3. Control whether the IRQ permits configuration by Non-secure/Unprivileged contexts, and whether it can observe Secure/Privileged channel interrupt flags. - 0x4CC - 0x00000003 - - - S - Secure IRQ. If 1, this IRQ's control registers can only be accessed from a Secure context. - - If 0, this IRQ's control registers can be accessed from a Non-secure context, but Secure channels (as per SECCFG_CHx) are masked from the IRQ status, and this IRQ's registers can not be used to acknowledge the channel interrupts of Secure channels. - [1:1] - read-write - - - P - Privileged IRQ. If 1, this IRQ's control registers can only be accessed from a Privileged context. - - If 0, this IRQ's control registers can be accessed from an Unprivileged context, but Privileged channels (as per SECCFG_CHx) are masked from the IRQ status, and this IRQ's registers can not be used to acknowledge the channel interrupts of Privileged channels. - [0:0] - read-write - - - - - SECCFG_MISC - Miscellaneous security configuration - 0x4D0 - 0x000003FF - - - TIMER3_S - If 1, the TIMER3 register is only accessible from a Secure context, and timer DREQ 3 is only visible to Secure channels. - [9:9] - read-write - - - TIMER3_P - If 1, the TIMER3 register is only accessible from a Privileged (or more Secure) context, and timer DREQ 3 is only visible to Privileged (or more Secure) channels. - [8:8] - read-write - - - TIMER2_S - If 1, the TIMER2 register is only accessible from a Secure context, and timer DREQ 2 is only visible to Secure channels. - [7:7] - read-write - - - TIMER2_P - If 1, the TIMER2 register is only accessible from a Privileged (or more Secure) context, and timer DREQ 2 is only visible to Privileged (or more Secure) channels. - [6:6] - read-write - - - TIMER1_S - If 1, the TIMER1 register is only accessible from a Secure context, and timer DREQ 1 is only visible to Secure channels. - [5:5] - read-write - - - TIMER1_P - If 1, the TIMER1 register is only accessible from a Privileged (or more Secure) context, and timer DREQ 1 is only visible to Privileged (or more Secure) channels. - [4:4] - read-write - - - TIMER0_S - If 1, the TIMER0 register is only accessible from a Secure context, and timer DREQ 0 is only visible to Secure channels. - [3:3] - read-write - - - TIMER0_P - If 1, the TIMER0 register is only accessible from a Privileged (or more Secure) context, and timer DREQ 0 is only visible to Privileged (or more Secure) channels. - [2:2] - read-write - - - SNIFF_S - If 1, the sniffer can see data transfers from Secure channels, and can itself only be accessed from a Secure context. - - If 0, the sniffer can be accessed from either a Secure or Non-secure context, but can not see data transfers of Secure channels. - [1:1] - read-write - - - SNIFF_P - If 1, the sniffer can see data transfers from Privileged channels, and can itself only be accessed from a privileged context, or from a Secure context when SNIFF_S is 0. - - If 0, the sniffer can be accessed from either a Privileged or Unprivileged context (with sufficient security level) but can not see transfers from Privileged channels. - [0:0] - read-write - - - - - MPU_CTRL - Control register for DMA MPU. Accessible only from a Privileged context. - 0x500 - 0x00000000 - - - NS_HIDE_ADDR - By default, when a region's S bit is clear, Non-secure-Privileged reads can see the region's base address and limit address. Set this bit to make the addresses appear as 0 to Non-secure reads, even when the region is Non-secure, to avoid leaking information about the processor SAU map. - [3:3] - read-write - - - S - Determine whether an address not covered by an active MPU region is Secure (1) or Non-secure (0) - [2:2] - read-write - - - P - Determine whether an address not covered by an active MPU region is Privileged (1) or Unprivileged (0) - [1:1] - read-write - - - - - MPU_BAR0 - Base address register for MPU region 0. Writable only from a Secure, Privileged context. - 0x504 - 0x00000000 - - - ADDR - This MPU region matches addresses where addr[31:5] (the 27 most significant bits) are greater than or equal to BAR_ADDR, and less than or equal to LAR_ADDR. - - Readable from any Privileged context, if and only if this region's S bit is clear, and MPU_CTRL_NS_HIDE_ADDR is clear. Otherwise readable only from a Secure, Privileged context. - [31:5] - read-write - - - - - MPU_LAR0 - Limit address register for MPU region 0. Writable only from a Secure, Privileged context, with the exception of the P bit. - 0x508 - 0x00000000 - - - ADDR - Limit address bits 31:5. Readable from any Privileged context, if and only if this region's S bit is clear, and MPU_CTRL_NS_HIDE_ADDR is clear. Otherwise readable only from a Secure, Privileged context. - [31:5] - read-write - - - S - Determines the Secure/Non-secure (=1/0) status of addresses matching this region, if this region is enabled. - [2:2] - read-write - - - P - Determines the Privileged/Unprivileged (=1/0) status of addresses matching this region, if this region is enabled. Writable from any Privileged context, if and only if the S bit is clear. Otherwise, writable only from a Secure, Privileged context. - [1:1] - read-write - - - EN - Region enable. If 1, any address within range specified by the base address (BAR_ADDR) and limit address (LAR_ADDR) has the attributes specified by S and P. - [0:0] - read-write - - - - - MPU_BAR1 - Base address register for MPU region 1. Writable only from a Secure, Privileged context. - 0x50C - 0x00000000 - - - ADDR - This MPU region matches addresses where addr[31:5] (the 27 most significant bits) are greater than or equal to BAR_ADDR, and less than or equal to LAR_ADDR. - - Readable from any Privileged context, if and only if this region's S bit is clear, and MPU_CTRL_NS_HIDE_ADDR is clear. Otherwise readable only from a Secure, Privileged context. - [31:5] - read-write - - - - - MPU_LAR1 - Limit address register for MPU region 1. Writable only from a Secure, Privileged context, with the exception of the P bit. - 0x510 - 0x00000000 - - - ADDR - Limit address bits 31:5. Readable from any Privileged context, if and only if this region's S bit is clear, and MPU_CTRL_NS_HIDE_ADDR is clear. Otherwise readable only from a Secure, Privileged context. - [31:5] - read-write - - - S - Determines the Secure/Non-secure (=1/0) status of addresses matching this region, if this region is enabled. - [2:2] - read-write - - - P - Determines the Privileged/Unprivileged (=1/0) status of addresses matching this region, if this region is enabled. Writable from any Privileged context, if and only if the S bit is clear. Otherwise, writable only from a Secure, Privileged context. - [1:1] - read-write - - - EN - Region enable. If 1, any address within range specified by the base address (BAR_ADDR) and limit address (LAR_ADDR) has the attributes specified by S and P. - [0:0] - read-write - - - - - MPU_BAR2 - Base address register for MPU region 2. Writable only from a Secure, Privileged context. - 0x514 - 0x00000000 - - - ADDR - This MPU region matches addresses where addr[31:5] (the 27 most significant bits) are greater than or equal to BAR_ADDR, and less than or equal to LAR_ADDR. - - Readable from any Privileged context, if and only if this region's S bit is clear, and MPU_CTRL_NS_HIDE_ADDR is clear. Otherwise readable only from a Secure, Privileged context. - [31:5] - read-write - - - - - MPU_LAR2 - Limit address register for MPU region 2. Writable only from a Secure, Privileged context, with the exception of the P bit. - 0x518 - 0x00000000 - - - ADDR - Limit address bits 31:5. Readable from any Privileged context, if and only if this region's S bit is clear, and MPU_CTRL_NS_HIDE_ADDR is clear. Otherwise readable only from a Secure, Privileged context. - [31:5] - read-write - - - S - Determines the Secure/Non-secure (=1/0) status of addresses matching this region, if this region is enabled. - [2:2] - read-write - - - P - Determines the Privileged/Unprivileged (=1/0) status of addresses matching this region, if this region is enabled. Writable from any Privileged context, if and only if the S bit is clear. Otherwise, writable only from a Secure, Privileged context. - [1:1] - read-write - - - EN - Region enable. If 1, any address within range specified by the base address (BAR_ADDR) and limit address (LAR_ADDR) has the attributes specified by S and P. - [0:0] - read-write - - - - - MPU_BAR3 - Base address register for MPU region 3. Writable only from a Secure, Privileged context. - 0x51C - 0x00000000 - - - ADDR - This MPU region matches addresses where addr[31:5] (the 27 most significant bits) are greater than or equal to BAR_ADDR, and less than or equal to LAR_ADDR. - - Readable from any Privileged context, if and only if this region's S bit is clear, and MPU_CTRL_NS_HIDE_ADDR is clear. Otherwise readable only from a Secure, Privileged context. - [31:5] - read-write - - - - - MPU_LAR3 - Limit address register for MPU region 3. Writable only from a Secure, Privileged context, with the exception of the P bit. - 0x520 - 0x00000000 - - - ADDR - Limit address bits 31:5. Readable from any Privileged context, if and only if this region's S bit is clear, and MPU_CTRL_NS_HIDE_ADDR is clear. Otherwise readable only from a Secure, Privileged context. - [31:5] - read-write - - - S - Determines the Secure/Non-secure (=1/0) status of addresses matching this region, if this region is enabled. - [2:2] - read-write - - - P - Determines the Privileged/Unprivileged (=1/0) status of addresses matching this region, if this region is enabled. Writable from any Privileged context, if and only if the S bit is clear. Otherwise, writable only from a Secure, Privileged context. - [1:1] - read-write - - - EN - Region enable. If 1, any address within range specified by the base address (BAR_ADDR) and limit address (LAR_ADDR) has the attributes specified by S and P. - [0:0] - read-write - - - - - MPU_BAR4 - Base address register for MPU region 4. Writable only from a Secure, Privileged context. - 0x524 - 0x00000000 - - - ADDR - This MPU region matches addresses where addr[31:5] (the 27 most significant bits) are greater than or equal to BAR_ADDR, and less than or equal to LAR_ADDR. - - Readable from any Privileged context, if and only if this region's S bit is clear, and MPU_CTRL_NS_HIDE_ADDR is clear. Otherwise readable only from a Secure, Privileged context. - [31:5] - read-write - - - - - MPU_LAR4 - Limit address register for MPU region 4. Writable only from a Secure, Privileged context, with the exception of the P bit. - 0x528 - 0x00000000 - - - ADDR - Limit address bits 31:5. Readable from any Privileged context, if and only if this region's S bit is clear, and MPU_CTRL_NS_HIDE_ADDR is clear. Otherwise readable only from a Secure, Privileged context. - [31:5] - read-write - - - S - Determines the Secure/Non-secure (=1/0) status of addresses matching this region, if this region is enabled. - [2:2] - read-write - - - P - Determines the Privileged/Unprivileged (=1/0) status of addresses matching this region, if this region is enabled. Writable from any Privileged context, if and only if the S bit is clear. Otherwise, writable only from a Secure, Privileged context. - [1:1] - read-write - - - EN - Region enable. If 1, any address within range specified by the base address (BAR_ADDR) and limit address (LAR_ADDR) has the attributes specified by S and P. - [0:0] - read-write - - - - - MPU_BAR5 - Base address register for MPU region 5. Writable only from a Secure, Privileged context. - 0x52C - 0x00000000 - - - ADDR - This MPU region matches addresses where addr[31:5] (the 27 most significant bits) are greater than or equal to BAR_ADDR, and less than or equal to LAR_ADDR. - - Readable from any Privileged context, if and only if this region's S bit is clear, and MPU_CTRL_NS_HIDE_ADDR is clear. Otherwise readable only from a Secure, Privileged context. - [31:5] - read-write - - - - - MPU_LAR5 - Limit address register for MPU region 5. Writable only from a Secure, Privileged context, with the exception of the P bit. - 0x530 - 0x00000000 - - - ADDR - Limit address bits 31:5. Readable from any Privileged context, if and only if this region's S bit is clear, and MPU_CTRL_NS_HIDE_ADDR is clear. Otherwise readable only from a Secure, Privileged context. - [31:5] - read-write - - - S - Determines the Secure/Non-secure (=1/0) status of addresses matching this region, if this region is enabled. - [2:2] - read-write - - - P - Determines the Privileged/Unprivileged (=1/0) status of addresses matching this region, if this region is enabled. Writable from any Privileged context, if and only if the S bit is clear. Otherwise, writable only from a Secure, Privileged context. - [1:1] - read-write - - - EN - Region enable. If 1, any address within range specified by the base address (BAR_ADDR) and limit address (LAR_ADDR) has the attributes specified by S and P. - [0:0] - read-write - - - - - MPU_BAR6 - Base address register for MPU region 6. Writable only from a Secure, Privileged context. - 0x534 - 0x00000000 - - - ADDR - This MPU region matches addresses where addr[31:5] (the 27 most significant bits) are greater than or equal to BAR_ADDR, and less than or equal to LAR_ADDR. - - Readable from any Privileged context, if and only if this region's S bit is clear, and MPU_CTRL_NS_HIDE_ADDR is clear. Otherwise readable only from a Secure, Privileged context. - [31:5] - read-write - - - - - MPU_LAR6 - Limit address register for MPU region 6. Writable only from a Secure, Privileged context, with the exception of the P bit. - 0x538 - 0x00000000 - - - ADDR - Limit address bits 31:5. Readable from any Privileged context, if and only if this region's S bit is clear, and MPU_CTRL_NS_HIDE_ADDR is clear. Otherwise readable only from a Secure, Privileged context. - [31:5] - read-write - - - S - Determines the Secure/Non-secure (=1/0) status of addresses matching this region, if this region is enabled. - [2:2] - read-write - - - P - Determines the Privileged/Unprivileged (=1/0) status of addresses matching this region, if this region is enabled. Writable from any Privileged context, if and only if the S bit is clear. Otherwise, writable only from a Secure, Privileged context. - [1:1] - read-write - - - EN - Region enable. If 1, any address within range specified by the base address (BAR_ADDR) and limit address (LAR_ADDR) has the attributes specified by S and P. - [0:0] - read-write - - - - - MPU_BAR7 - Base address register for MPU region 7. Writable only from a Secure, Privileged context. - 0x53C - 0x00000000 - - - ADDR - This MPU region matches addresses where addr[31:5] (the 27 most significant bits) are greater than or equal to BAR_ADDR, and less than or equal to LAR_ADDR. - - Readable from any Privileged context, if and only if this region's S bit is clear, and MPU_CTRL_NS_HIDE_ADDR is clear. Otherwise readable only from a Secure, Privileged context. - [31:5] - read-write - - - - - MPU_LAR7 - Limit address register for MPU region 7. Writable only from a Secure, Privileged context, with the exception of the P bit. - 0x540 - 0x00000000 - - - ADDR - Limit address bits 31:5. Readable from any Privileged context, if and only if this region's S bit is clear, and MPU_CTRL_NS_HIDE_ADDR is clear. Otherwise readable only from a Secure, Privileged context. - [31:5] - read-write - - - S - Determines the Secure/Non-secure (=1/0) status of addresses matching this region, if this region is enabled. - [2:2] - read-write - - - P - Determines the Privileged/Unprivileged (=1/0) status of addresses matching this region, if this region is enabled. Writable from any Privileged context, if and only if the S bit is clear. Otherwise, writable only from a Secure, Privileged context. - [1:1] - read-write - - - EN - Region enable. If 1, any address within range specified by the base address (BAR_ADDR) and limit address (LAR_ADDR) has the attributes specified by S and P. - [0:0] - read-write - - - - - CH0_DBG_CTDREQ - Read: get channel DREQ counter (i.e. how many accesses the DMA expects it can perform on the peripheral without overflow/underflow. Write any value: clears the counter, and cause channel to re-initiate DREQ handshake. - 0x800 - 0x00000000 - - - CH0_DBG_CTDREQ - [5:0] - read-write - oneToClear - - - - - CH0_DBG_TCR - Read to get channel TRANS_COUNT reload value, i.e. the length of the next transfer - 0x804 - 0x00000000 - - - CH0_DBG_TCR - [31:0] - read-only - - - - - CH1_DBG_CTDREQ - Read: get channel DREQ counter (i.e. how many accesses the DMA expects it can perform on the peripheral without overflow/underflow. Write any value: clears the counter, and cause channel to re-initiate DREQ handshake. - 0x840 - 0x00000000 - - - CH1_DBG_CTDREQ - [5:0] - read-write - oneToClear - - - - - CH1_DBG_TCR - Read to get channel TRANS_COUNT reload value, i.e. the length of the next transfer - 0x844 - 0x00000000 - - - CH1_DBG_TCR - [31:0] - read-only - - - - - CH2_DBG_CTDREQ - Read: get channel DREQ counter (i.e. how many accesses the DMA expects it can perform on the peripheral without overflow/underflow. Write any value: clears the counter, and cause channel to re-initiate DREQ handshake. - 0x880 - 0x00000000 - - - CH2_DBG_CTDREQ - [5:0] - read-write - oneToClear - - - - - CH2_DBG_TCR - Read to get channel TRANS_COUNT reload value, i.e. the length of the next transfer - 0x884 - 0x00000000 - - - CH2_DBG_TCR - [31:0] - read-only - - - - - CH3_DBG_CTDREQ - Read: get channel DREQ counter (i.e. how many accesses the DMA expects it can perform on the peripheral without overflow/underflow. Write any value: clears the counter, and cause channel to re-initiate DREQ handshake. - 0x8C0 - 0x00000000 - - - CH3_DBG_CTDREQ - [5:0] - read-write - oneToClear - - - - - CH3_DBG_TCR - Read to get channel TRANS_COUNT reload value, i.e. the length of the next transfer - 0x8C4 - 0x00000000 - - - CH3_DBG_TCR - [31:0] - read-only - - - - - CH4_DBG_CTDREQ - Read: get channel DREQ counter (i.e. how many accesses the DMA expects it can perform on the peripheral without overflow/underflow. Write any value: clears the counter, and cause channel to re-initiate DREQ handshake. - 0x900 - 0x00000000 - - - CH4_DBG_CTDREQ - [5:0] - read-write - oneToClear - - - - - CH4_DBG_TCR - Read to get channel TRANS_COUNT reload value, i.e. the length of the next transfer - 0x904 - 0x00000000 - - - CH4_DBG_TCR - [31:0] - read-only - - - - - CH5_DBG_CTDREQ - Read: get channel DREQ counter (i.e. how many accesses the DMA expects it can perform on the peripheral without overflow/underflow. Write any value: clears the counter, and cause channel to re-initiate DREQ handshake. - 0x940 - 0x00000000 - - - CH5_DBG_CTDREQ - [5:0] - read-write - oneToClear - - - - - CH5_DBG_TCR - Read to get channel TRANS_COUNT reload value, i.e. the length of the next transfer - 0x944 - 0x00000000 - - - CH5_DBG_TCR - [31:0] - read-only - - - - - CH6_DBG_CTDREQ - Read: get channel DREQ counter (i.e. how many accesses the DMA expects it can perform on the peripheral without overflow/underflow. Write any value: clears the counter, and cause channel to re-initiate DREQ handshake. - 0x980 - 0x00000000 - - - CH6_DBG_CTDREQ - [5:0] - read-write - oneToClear - - - - - CH6_DBG_TCR - Read to get channel TRANS_COUNT reload value, i.e. the length of the next transfer - 0x984 - 0x00000000 - - - CH6_DBG_TCR - [31:0] - read-only - - - - - CH7_DBG_CTDREQ - Read: get channel DREQ counter (i.e. how many accesses the DMA expects it can perform on the peripheral without overflow/underflow. Write any value: clears the counter, and cause channel to re-initiate DREQ handshake. - 0x9C0 - 0x00000000 - - - CH7_DBG_CTDREQ - [5:0] - read-write - oneToClear - - - - - CH7_DBG_TCR - Read to get channel TRANS_COUNT reload value, i.e. the length of the next transfer - 0x9C4 - 0x00000000 - - - CH7_DBG_TCR - [31:0] - read-only - - - - - CH8_DBG_CTDREQ - Read: get channel DREQ counter (i.e. how many accesses the DMA expects it can perform on the peripheral without overflow/underflow. Write any value: clears the counter, and cause channel to re-initiate DREQ handshake. - 0xA00 - 0x00000000 - - - CH8_DBG_CTDREQ - [5:0] - read-write - oneToClear - - - - - CH8_DBG_TCR - Read to get channel TRANS_COUNT reload value, i.e. the length of the next transfer - 0xA04 - 0x00000000 - - - CH8_DBG_TCR - [31:0] - read-only - - - - - CH9_DBG_CTDREQ - Read: get channel DREQ counter (i.e. how many accesses the DMA expects it can perform on the peripheral without overflow/underflow. Write any value: clears the counter, and cause channel to re-initiate DREQ handshake. - 0xA40 - 0x00000000 - - - CH9_DBG_CTDREQ - [5:0] - read-write - oneToClear - - - - - CH9_DBG_TCR - Read to get channel TRANS_COUNT reload value, i.e. the length of the next transfer - 0xA44 - 0x00000000 - - - CH9_DBG_TCR - [31:0] - read-only - - - - - CH10_DBG_CTDREQ - Read: get channel DREQ counter (i.e. how many accesses the DMA expects it can perform on the peripheral without overflow/underflow. Write any value: clears the counter, and cause channel to re-initiate DREQ handshake. - 0xA80 - 0x00000000 - - - CH10_DBG_CTDREQ - [5:0] - read-write - oneToClear - - - - - CH10_DBG_TCR - Read to get channel TRANS_COUNT reload value, i.e. the length of the next transfer - 0xA84 - 0x00000000 - - - CH10_DBG_TCR - [31:0] - read-only - - - - - CH11_DBG_CTDREQ - Read: get channel DREQ counter (i.e. how many accesses the DMA expects it can perform on the peripheral without overflow/underflow. Write any value: clears the counter, and cause channel to re-initiate DREQ handshake. - 0xAC0 - 0x00000000 - - - CH11_DBG_CTDREQ - [5:0] - read-write - oneToClear - - - - - CH11_DBG_TCR - Read to get channel TRANS_COUNT reload value, i.e. the length of the next transfer - 0xAC4 - 0x00000000 - - - CH11_DBG_TCR - [31:0] - read-only - - - - - CH12_DBG_CTDREQ - Read: get channel DREQ counter (i.e. how many accesses the DMA expects it can perform on the peripheral without overflow/underflow. Write any value: clears the counter, and cause channel to re-initiate DREQ handshake. - 0xB00 - 0x00000000 - - - CH12_DBG_CTDREQ - [5:0] - read-write - oneToClear - - - - - CH12_DBG_TCR - Read to get channel TRANS_COUNT reload value, i.e. the length of the next transfer - 0xB04 - 0x00000000 - - - CH12_DBG_TCR - [31:0] - read-only - - - - - CH13_DBG_CTDREQ - Read: get channel DREQ counter (i.e. how many accesses the DMA expects it can perform on the peripheral without overflow/underflow. Write any value: clears the counter, and cause channel to re-initiate DREQ handshake. - 0xB40 - 0x00000000 - - - CH13_DBG_CTDREQ - [5:0] - read-write - oneToClear - - - - - CH13_DBG_TCR - Read to get channel TRANS_COUNT reload value, i.e. the length of the next transfer - 0xB44 - 0x00000000 - - - CH13_DBG_TCR - [31:0] - read-only - - - - - CH14_DBG_CTDREQ - Read: get channel DREQ counter (i.e. how many accesses the DMA expects it can perform on the peripheral without overflow/underflow. Write any value: clears the counter, and cause channel to re-initiate DREQ handshake. - 0xB80 - 0x00000000 - - - CH14_DBG_CTDREQ - [5:0] - read-write - oneToClear - - - - - CH14_DBG_TCR - Read to get channel TRANS_COUNT reload value, i.e. the length of the next transfer - 0xB84 - 0x00000000 - - - CH14_DBG_TCR - [31:0] - read-only - - - - - CH15_DBG_CTDREQ - Read: get channel DREQ counter (i.e. how many accesses the DMA expects it can perform on the peripheral without overflow/underflow. Write any value: clears the counter, and cause channel to re-initiate DREQ handshake. - 0xBC0 - 0x00000000 - - - CH15_DBG_CTDREQ - [5:0] - read-write - oneToClear - - - - - CH15_DBG_TCR - Read to get channel TRANS_COUNT reload value, i.e. the length of the next transfer - 0xBC4 - 0x00000000 - - - CH15_DBG_TCR - [31:0] - read-only - - - - - - - TIMER0 - Controls time and alarms - - time is a 64 bit value indicating the time since power-on - - timeh is the top 32 bits of time & timel is the bottom 32 bits to change time write to timelw before timehw to read time read from timelr before timehr - - An alarm is set by setting alarm_enable and writing to the corresponding alarm register When an alarm is pending, the corresponding alarm_running signal will be high An alarm can be cancelled before it has finished by clearing the alarm_enable When an alarm fires, the corresponding alarm_irq is set and alarm_running is cleared To clear the interrupt write a 1 to the corresponding alarm_irq The timer can be locked to prevent writing - 0x400B0000 - - 0x0 - 0x4C - registers - - - TIMER0_IRQ_0 - 0 - - - TIMER0_IRQ_1 - 1 - - - TIMER0_IRQ_2 - 2 - - - TIMER0_IRQ_3 - 3 - - - - TIMEHW - Write to bits 63:32 of time always write timelw before timehw - 0x0 - 0x00000000 - - - TIMEHW - [31:0] - write-only - - - - - TIMELW - Write to bits 31:0 of time writes do not get copied to time until timehw is written - 0x4 - 0x00000000 - - - TIMELW - [31:0] - write-only - - - - - TIMEHR - Read from bits 63:32 of time always read timelr before timehr - 0x8 - 0x00000000 - - - TIMEHR - [31:0] - read-only - - - - - TIMELR - Read from bits 31:0 of time - 0xC - 0x00000000 - - - TIMELR - [31:0] - read-only - modify - - - - - ALARM0 - Arm alarm 0, and configure the time it will fire. Once armed, the alarm fires when TIMER_ALARM0 == TIMELR. The alarm will disarm itself once it fires, and can be disarmed early using the ARMED status register. - 0x10 - 0x00000000 - - - ALARM0 - [31:0] - read-write - - - - - ALARM1 - Arm alarm 1, and configure the time it will fire. Once armed, the alarm fires when TIMER_ALARM1 == TIMELR. The alarm will disarm itself once it fires, and can be disarmed early using the ARMED status register. - 0x14 - 0x00000000 - - - ALARM1 - [31:0] - read-write - - - - - ALARM2 - Arm alarm 2, and configure the time it will fire. Once armed, the alarm fires when TIMER_ALARM2 == TIMELR. The alarm will disarm itself once it fires, and can be disarmed early using the ARMED status register. - 0x18 - 0x00000000 - - - ALARM2 - [31:0] - read-write - - - - - ALARM3 - Arm alarm 3, and configure the time it will fire. Once armed, the alarm fires when TIMER_ALARM3 == TIMELR. The alarm will disarm itself once it fires, and can be disarmed early using the ARMED status register. - 0x1C - 0x00000000 - - - ALARM3 - [31:0] - read-write - - - - - ARMED - Indicates the armed/disarmed status of each alarm. A write to the corresponding ALARMx register arms the alarm. Alarms automatically disarm upon firing, but writing ones here will disarm immediately without waiting to fire. - 0x20 - 0x00000000 - - - ARMED - [3:0] - read-write - oneToClear - - - - - TIMERAWH - Raw read from bits 63:32 of time (no side effects) - 0x24 - 0x00000000 - - - TIMERAWH - [31:0] - read-only - - - - - TIMERAWL - Raw read from bits 31:0 of time (no side effects) - 0x28 - 0x00000000 - - - TIMERAWL - [31:0] - read-only - - - - - DBGPAUSE - Set bits high to enable pause when the corresponding debug ports are active - 0x2C - 0x00000007 - - - DBG1 - Pause when processor 1 is in debug mode - [2:2] - read-write - - - DBG0 - Pause when processor 0 is in debug mode - [1:1] - read-write - - - - - PAUSE - Set high to pause the timer - 0x30 - 0x00000000 - - - PAUSE - [0:0] - read-write - - - - - LOCKED - Set locked bit to disable write access to timer Once set, cannot be cleared (without a reset) - 0x34 - 0x00000000 - - - LOCKED - [0:0] - read-write - - - - - SOURCE - Selects the source for the timer. Defaults to the normal tick configured in the ticks block (typically configured to 1 microsecond). Writing to 1 will ignore the tick and count clk_sys cycles instead. - 0x38 - 0x00000000 - - - CLK_SYS - [0:0] - read-write - - - TICK - 0 - - - CLK_SYS - 1 - - - - - - - INTR - Raw Interrupts - 0x3C - 0x00000000 - - - ALARM_3 - [3:3] - read-write - oneToClear - - - ALARM_2 - [2:2] - read-write - oneToClear - - - ALARM_1 - [1:1] - read-write - oneToClear - - - ALARM_0 - [0:0] - read-write - oneToClear - - - - - INTE - Interrupt Enable - 0x40 - 0x00000000 - - - ALARM_3 - [3:3] - read-write - - - ALARM_2 - [2:2] - read-write - - - ALARM_1 - [1:1] - read-write - - - ALARM_0 - [0:0] - read-write - - - - - INTF - Interrupt Force - 0x44 - 0x00000000 - - - ALARM_3 - [3:3] - read-write - - - ALARM_2 - [2:2] - read-write - - - ALARM_1 - [1:1] - read-write - - - ALARM_0 - [0:0] - read-write - - - - - INTS - Interrupt status after masking & forcing - 0x48 - 0x00000000 - - - ALARM_3 - [3:3] - read-only - - - ALARM_2 - [2:2] - read-only - - - ALARM_1 - [1:1] - read-only - - - ALARM_0 - [0:0] - read-only - - - - - - - TIMER1 - 0x400B8000 - - TIMER1_IRQ_0 - 4 - - - TIMER1_IRQ_1 - 5 - - - TIMER1_IRQ_2 - 6 - - - TIMER1_IRQ_3 - 7 - - - - PWM - Simple PWM - 0x400A8000 - - 0x0 - 0x110 - registers - - - PWM_IRQ_WRAP_0 - 8 - - - PWM_IRQ_WRAP_1 - 9 - - - - 12 - 0x14 - 0-11 - CH%s - Cluster CH%s, containing CH*_CC, CH*_CSR, CH*_CTR, CH*_DIV, CH*_TOP - 0x0 - - CC - Counter compare values - 0xC - 0x00000000 - - - B - [31:16] - read-write - - - A - [15:0] - read-write - - - - - CSR - Control and status register - 0x0 - 0x00000000 - - - PH_ADV - Advance the phase of the counter by 1 count, while it is running. - Self-clearing. Write a 1, and poll until low. Counter must be running - at less than full speed (div_int + div_frac / 16 > 1) - [7:7] - write-only - - - PH_RET - Retard the phase of the counter by 1 count, while it is running. - Self-clearing. Write a 1, and poll until low. Counter must be running. - [6:6] - write-only - - - DIVMODE - [5:4] - read-write - - - div - Free-running counting at rate dictated by fractional divider - 0 - - - level - Fractional divider operation is gated by the PWM B pin. - 1 - - - rise - Counter advances with each rising edge of the PWM B pin. - 2 - - - fall - Counter advances with each falling edge of the PWM B pin. - 3 - - - - - B_INV - Invert output B - [3:3] - read-write - - - A_INV - Invert output A - [2:2] - read-write - - - PH_CORRECT - 1: Enable phase-correct modulation. 0: Trailing-edge - [1:1] - read-write - - - EN - Enable the PWM channel. - [0:0] - read-write - - - - - CTR - Direct access to the PWM counter - 0x8 - 0x00000000 - - - CTR - [15:0] - read-write - - - - - DIV - INT and FRAC form a fixed-point fractional number. - Counting rate is system clock frequency divided by this number. - Fractional division uses simple 1st-order sigma-delta. - 0x4 - 0x00000010 - - - INT - [11:4] - read-write - - - FRAC - [3:0] - read-write - - - - - TOP - Counter wrap value - 0x10 - 0x0000FFFF - - - TOP - [15:0] - read-write - - - - - - EN - This register aliases the CSR_EN bits for all channels. - Writing to this register allows multiple channels to be enabled - or disabled simultaneously, so they can run in perfect sync. - For each channel, there is only one physical EN register bit, - which can be accessed through here or CHx_CSR. - 0xF0 - 0x00000000 - - - CH11 - [11:11] - read-write - - - CH10 - [10:10] - read-write - - - CH9 - [9:9] - read-write - - - CH8 - [8:8] - read-write - - - CH7 - [7:7] - read-write - - - CH6 - [6:6] - read-write - - - CH5 - [5:5] - read-write - - - CH4 - [4:4] - read-write - - - CH3 - [3:3] - read-write - - - CH2 - [2:2] - read-write - - - CH1 - [1:1] - read-write - - - CH0 - [0:0] - read-write - - - - - INTR - Raw Interrupts - 0xF4 - 0x00000000 - - - CH11 - [11:11] - read-write - oneToClear - - - CH10 - [10:10] - read-write - oneToClear - - - CH9 - [9:9] - read-write - oneToClear - - - CH8 - [8:8] - read-write - oneToClear - - - CH7 - [7:7] - read-write - oneToClear - - - CH6 - [6:6] - read-write - oneToClear - - - CH5 - [5:5] - read-write - oneToClear - - - CH4 - [4:4] - read-write - oneToClear - - - CH3 - [3:3] - read-write - oneToClear - - - CH2 - [2:2] - read-write - oneToClear - - - CH1 - [1:1] - read-write - oneToClear - - - CH0 - [0:0] - read-write - oneToClear - - - - - IRQ0_INTE - Interrupt Enable for irq0 - 0xF8 - 0x00000000 - - - CH11 - [11:11] - read-write - - - CH10 - [10:10] - read-write - - - CH9 - [9:9] - read-write - - - CH8 - [8:8] - read-write - - - CH7 - [7:7] - read-write - - - CH6 - [6:6] - read-write - - - CH5 - [5:5] - read-write - - - CH4 - [4:4] - read-write - - - CH3 - [3:3] - read-write - - - CH2 - [2:2] - read-write - - - CH1 - [1:1] - read-write - - - CH0 - [0:0] - read-write - - - - - IRQ0_INTF - Interrupt Force for irq0 - 0xFC - 0x00000000 - - - CH11 - [11:11] - read-write - - - CH10 - [10:10] - read-write - - - CH9 - [9:9] - read-write - - - CH8 - [8:8] - read-write - - - CH7 - [7:7] - read-write - - - CH6 - [6:6] - read-write - - - CH5 - [5:5] - read-write - - - CH4 - [4:4] - read-write - - - CH3 - [3:3] - read-write - - - CH2 - [2:2] - read-write - - - CH1 - [1:1] - read-write - - - CH0 - [0:0] - read-write - - - - - IRQ0_INTS - Interrupt status after masking & forcing for irq0 - 0x100 - 0x00000000 - - - CH11 - [11:11] - read-only - - - CH10 - [10:10] - read-only - - - CH9 - [9:9] - read-only - - - CH8 - [8:8] - read-only - - - CH7 - [7:7] - read-only - - - CH6 - [6:6] - read-only - - - CH5 - [5:5] - read-only - - - CH4 - [4:4] - read-only - - - CH3 - [3:3] - read-only - - - CH2 - [2:2] - read-only - - - CH1 - [1:1] - read-only - - - CH0 - [0:0] - read-only - - - - - IRQ1_INTE - Interrupt Enable for irq1 - 0x104 - 0x00000000 - - - CH11 - [11:11] - read-write - - - CH10 - [10:10] - read-write - - - CH9 - [9:9] - read-write - - - CH8 - [8:8] - read-write - - - CH7 - [7:7] - read-write - - - CH6 - [6:6] - read-write - - - CH5 - [5:5] - read-write - - - CH4 - [4:4] - read-write - - - CH3 - [3:3] - read-write - - - CH2 - [2:2] - read-write - - - CH1 - [1:1] - read-write - - - CH0 - [0:0] - read-write - - - - - IRQ1_INTF - Interrupt Force for irq1 - 0x108 - 0x00000000 - - - CH11 - [11:11] - read-write - - - CH10 - [10:10] - read-write - - - CH9 - [9:9] - read-write - - - CH8 - [8:8] - read-write - - - CH7 - [7:7] - read-write - - - CH6 - [6:6] - read-write - - - CH5 - [5:5] - read-write - - - CH4 - [4:4] - read-write - - - CH3 - [3:3] - read-write - - - CH2 - [2:2] - read-write - - - CH1 - [1:1] - read-write - - - CH0 - [0:0] - read-write - - - - - IRQ1_INTS - Interrupt status after masking & forcing for irq1 - 0x10C - 0x00000000 - - - CH11 - [11:11] - read-only - - - CH10 - [10:10] - read-only - - - CH9 - [9:9] - read-only - - - CH8 - [8:8] - read-only - - - CH7 - [7:7] - read-only - - - CH6 - [6:6] - read-only - - - CH5 - [5:5] - read-only - - - CH4 - [4:4] - read-only - - - CH3 - [3:3] - read-only - - - CH2 - [2:2] - read-only - - - CH1 - [1:1] - read-only - - - CH0 - [0:0] - read-only - - - - - - - ADC - Control and data interface to SAR ADC - 0x400A0000 - - 0x0 - 0x24 - registers - - - ADC_IRQ_FIFO - 35 - - - - CS - ADC Control and Status - 0x0 - 0x00000000 - - - RROBIN - Round-robin sampling. 1 bit per channel. Set all bits to 0 to disable. - Otherwise, the ADC will cycle through each enabled channel in a round-robin fashion. - The first channel to be sampled will be the one currently indicated by AINSEL. - AINSEL will be updated after each conversion with the newly-selected channel. - [24:16] - read-write - - - AINSEL - Select analog mux input. Updated automatically in round-robin mode. - This is corrected for the package option so only ADC channels which are bonded are available, and in the correct order - [15:12] - read-write - - - ERR_STICKY - Some past ADC conversion encountered an error. Write 1 to clear. - [10:10] - read-write - oneToClear - - - ERR - The most recent ADC conversion encountered an error; result is undefined or noisy. - [9:9] - read-only - - - READY - 1 if the ADC is ready to start a new conversion. Implies any previous conversion has completed. - 0 whilst conversion in progress. - [8:8] - read-only - - - START_MANY - Continuously perform conversions whilst this bit is 1. A new conversion will start immediately after the previous finishes. - [3:3] - read-write - - - START_ONCE - Start a single conversion. Self-clearing. Ignored if start_many is asserted. - [2:2] - write-only - - - TS_EN - Power on temperature sensor. 1 - enabled. 0 - disabled. - [1:1] - read-write - - - EN - Power on ADC and enable its clock. - 1 - enabled. 0 - disabled. - [0:0] - read-write - - - - - RESULT - Result of most recent ADC conversion - 0x4 - 0x00000000 - - - RESULT - [11:0] - read-only - - - - - FCS - FIFO control and status - 0x8 - 0x00000000 - - - THRESH - DREQ/IRQ asserted when level >= threshold - [27:24] - read-write - - - LEVEL - The number of conversion results currently waiting in the FIFO - [19:16] - read-only - - - OVER - 1 if the FIFO has been overflowed. Write 1 to clear. - [11:11] - read-write - oneToClear - - - UNDER - 1 if the FIFO has been underflowed. Write 1 to clear. - [10:10] - read-write - oneToClear - - - FULL - [9:9] - read-only - - - EMPTY - [8:8] - read-only - - - DREQ_EN - If 1: assert DMA requests when FIFO contains data - [3:3] - read-write - - - ERR - If 1: conversion error bit appears in the FIFO alongside the result - [2:2] - read-write - - - SHIFT - If 1: FIFO results are right-shifted to be one byte in size. Enables DMA to byte buffers. - [1:1] - read-write - - - EN - If 1: write result to the FIFO after each conversion. - [0:0] - read-write - - - - - FIFO - Conversion result FIFO - 0xC - 0x00000000 - - - ERR - 1 if this particular sample experienced a conversion error. Remains in the same location if the sample is shifted. - [15:15] - read-only - modify - - - VAL - [11:0] - read-only - modify - - - - - DIV - Clock divider. If non-zero, CS_START_MANY will start conversions - at regular intervals rather than back-to-back. - The divider is reset when either of these fields are written. - Total period is 1 + INT + FRAC / 256 - 0x10 - 0x00000000 - - - INT - Integer part of clock divisor. - [23:8] - read-write - - - FRAC - Fractional part of clock divisor. First-order delta-sigma. - [7:0] - read-write - - - - - INTR - Raw Interrupts - 0x14 - 0x00000000 - - - FIFO - Triggered when the sample FIFO reaches a certain level. - This level can be programmed via the FCS_THRESH field. - [0:0] - read-only - - - - - INTE - Interrupt Enable - 0x18 - 0x00000000 - - - FIFO - Triggered when the sample FIFO reaches a certain level. - This level can be programmed via the FCS_THRESH field. - [0:0] - read-write - - - - - INTF - Interrupt Force - 0x1C - 0x00000000 - - - FIFO - Triggered when the sample FIFO reaches a certain level. - This level can be programmed via the FCS_THRESH field. - [0:0] - read-write - - - - - INTS - Interrupt status after masking & forcing - 0x20 - 0x00000000 - - - FIFO - Triggered when the sample FIFO reaches a certain level. - This level can be programmed via the FCS_THRESH field. - [0:0] - read-only - - - - - - - I2C0 - DW_apb_i2c address block - - List of configuration constants for the Synopsys I2C hardware (you may see references to these in I2C register header; these are *fixed* values, set at hardware design time): - - IC_ULTRA_FAST_MODE ................ 0x0 - IC_UFM_TBUF_CNT_DEFAULT ........... 0x8 - IC_UFM_SCL_LOW_COUNT .............. 0x0008 - IC_UFM_SCL_HIGH_COUNT ............. 0x0006 - IC_TX_TL .......................... 0x0 - IC_TX_CMD_BLOCK ................... 0x1 - IC_HAS_DMA ........................ 0x1 - IC_HAS_ASYNC_FIFO ................. 0x0 - IC_SMBUS_ARP ...................... 0x0 - IC_FIRST_DATA_BYTE_STATUS ......... 0x1 - IC_INTR_IO ........................ 0x1 - IC_MASTER_MODE .................... 0x1 - IC_DEFAULT_ACK_GENERAL_CALL ....... 0x1 - IC_INTR_POL ....................... 0x1 - IC_OPTIONAL_SAR ................... 0x0 - IC_DEFAULT_TAR_SLAVE_ADDR ......... 0x055 - IC_DEFAULT_SLAVE_ADDR ............. 0x055 - IC_DEFAULT_HS_SPKLEN .............. 0x1 - IC_FS_SCL_HIGH_COUNT .............. 0x0006 - IC_HS_SCL_LOW_COUNT ............... 0x0008 - IC_DEVICE_ID_VALUE ................ 0x0 - IC_10BITADDR_MASTER ............... 0x0 - IC_CLK_FREQ_OPTIMIZATION .......... 0x0 - IC_DEFAULT_FS_SPKLEN .............. 0x7 - IC_ADD_ENCODED_PARAMS ............. 0x0 - IC_DEFAULT_SDA_HOLD ............... 0x000001 - IC_DEFAULT_SDA_SETUP .............. 0x64 - IC_AVOID_RX_FIFO_FLUSH_ON_TX_ABRT . 0x0 - IC_CLOCK_PERIOD ................... 100 - IC_EMPTYFIFO_HOLD_MASTER_EN ....... 1 - IC_RESTART_EN ..................... 0x1 - IC_TX_CMD_BLOCK_DEFAULT ........... 0x0 - IC_BUS_CLEAR_FEATURE .............. 0x0 - IC_CAP_LOADING .................... 100 - IC_FS_SCL_LOW_COUNT ............... 0x000d - APB_DATA_WIDTH .................... 32 - IC_SDA_STUCK_TIMEOUT_DEFAULT ...... 0xffffffff - IC_SLV_DATA_NACK_ONLY ............. 0x1 - IC_10BITADDR_SLAVE ................ 0x0 - IC_CLK_TYPE ....................... 0x0 - IC_SMBUS_UDID_MSB ................. 0x0 - IC_SMBUS_SUSPEND_ALERT ............ 0x0 - IC_HS_SCL_HIGH_COUNT .............. 0x0006 - IC_SLV_RESTART_DET_EN ............. 0x1 - IC_SMBUS .......................... 0x0 - IC_OPTIONAL_SAR_DEFAULT ........... 0x0 - IC_PERSISTANT_SLV_ADDR_DEFAULT .... 0x0 - IC_USE_COUNTS ..................... 0x0 - IC_RX_BUFFER_DEPTH ................ 16 - IC_SCL_STUCK_TIMEOUT_DEFAULT ...... 0xffffffff - IC_RX_FULL_HLD_BUS_EN ............. 0x1 - IC_SLAVE_DISABLE .................. 0x1 - IC_RX_TL .......................... 0x0 - IC_DEVICE_ID ...................... 0x0 - IC_HC_COUNT_VALUES ................ 0x0 - I2C_DYNAMIC_TAR_UPDATE ............ 0 - IC_SMBUS_CLK_LOW_MEXT_DEFAULT ..... 0xffffffff - IC_SMBUS_CLK_LOW_SEXT_DEFAULT ..... 0xffffffff - IC_HS_MASTER_CODE ................. 0x1 - IC_SMBUS_RST_IDLE_CNT_DEFAULT ..... 0xffff - IC_SMBUS_UDID_LSB_DEFAULT ......... 0xffffffff - IC_SS_SCL_HIGH_COUNT .............. 0x0028 - IC_SS_SCL_LOW_COUNT ............... 0x002f - IC_MAX_SPEED_MODE ................. 0x2 - IC_STAT_FOR_CLK_STRETCH ........... 0x0 - IC_STOP_DET_IF_MASTER_ACTIVE ...... 0x0 - IC_DEFAULT_UFM_SPKLEN ............. 0x1 - IC_TX_BUFFER_DEPTH ................ 16 - 0x40090000 - - 0x0 - 0x100 - registers - - - I2C0_IRQ - 36 - - - - IC_CON - I2C Control Register. This register can be written only when the DW_apb_i2c is disabled, which corresponds to the IC_ENABLE[0] register being set to 0. Writes at other times have no effect. - - Read/Write Access: - bit 10 is read only. - bit 11 is read only - bit 16 is read only - bit 17 is read only - bits 18 and 19 are read only. - 0x0 - 0x00000065 - - - STOP_DET_IF_MASTER_ACTIVE - Master issues the STOP_DET interrupt irrespective of whether master is active or not - [10:10] - read-only - - - RX_FIFO_FULL_HLD_CTRL - This bit controls whether DW_apb_i2c should hold the bus when the Rx FIFO is physically full to its RX_BUFFER_DEPTH, as described in the IC_RX_FULL_HLD_BUS_EN parameter. - - Reset value: 0x0. - [9:9] - read-write - - - DISABLED - Overflow when RX_FIFO is full - 0 - - - ENABLED - Hold bus when RX_FIFO is full - 1 - - - - - TX_EMPTY_CTRL - This bit controls the generation of the TX_EMPTY interrupt, as described in the IC_RAW_INTR_STAT register. - - Reset value: 0x0. - [8:8] - read-write - - - DISABLED - Default behaviour of TX_EMPTY interrupt - 0 - - - ENABLED - Controlled generation of TX_EMPTY interrupt - 1 - - - - - STOP_DET_IFADDRESSED - In slave mode: - 1'b1: issues the STOP_DET interrupt only when it is addressed. - 1'b0: issues the STOP_DET irrespective of whether it's addressed or not. Reset value: 0x0 - - NOTE: During a general call address, this slave does not issue the STOP_DET interrupt if STOP_DET_IF_ADDRESSED = 1'b1, even if the slave responds to the general call address by generating ACK. The STOP_DET interrupt is generated only when the transmitted address matches the slave address (SAR). - [7:7] - read-write - - - DISABLED - slave issues STOP_DET intr always - 0 - - - ENABLED - slave issues STOP_DET intr only if addressed - 1 - - - - - IC_SLAVE_DISABLE - This bit controls whether I2C has its slave disabled, which means once the presetn signal is applied, then this bit is set and the slave is disabled. - - If this bit is set (slave is disabled), DW_apb_i2c functions only as a master and does not perform any action that requires a slave. - - NOTE: Software should ensure that if this bit is written with 0, then bit 0 should also be written with a 0. - [6:6] - read-write - - - SLAVE_ENABLED - Slave mode is enabled - 0 - - - SLAVE_DISABLED - Slave mode is disabled - 1 - - - - - IC_RESTART_EN - Determines whether RESTART conditions may be sent when acting as a master. Some older slaves do not support handling RESTART conditions; however, RESTART conditions are used in several DW_apb_i2c operations. When RESTART is disabled, the master is prohibited from performing the following functions: - Sending a START BYTE - Performing any high-speed mode operation - High-speed mode operation - Performing direction changes in combined format mode - Performing a read operation with a 10-bit address By replacing RESTART condition followed by a STOP and a subsequent START condition, split operations are broken down into multiple DW_apb_i2c transfers. If the above operations are performed, it will result in setting bit 6 (TX_ABRT) of the IC_RAW_INTR_STAT register. - - Reset value: ENABLED - [5:5] - read-write - - - DISABLED - Master restart disabled - 0 - - - ENABLED - Master restart enabled - 1 - - - - - IC_10BITADDR_MASTER - Controls whether the DW_apb_i2c starts its transfers in 7- or 10-bit addressing mode when acting as a master. - 0: 7-bit addressing - 1: 10-bit addressing - [4:4] - read-write - - - ADDR_7BITS - Master 7Bit addressing mode - 0 - - - ADDR_10BITS - Master 10Bit addressing mode - 1 - - - - - IC_10BITADDR_SLAVE - When acting as a slave, this bit controls whether the DW_apb_i2c responds to 7- or 10-bit addresses. - 0: 7-bit addressing. The DW_apb_i2c ignores transactions that involve 10-bit addressing; for 7-bit addressing, only the lower 7 bits of the IC_SAR register are compared. - 1: 10-bit addressing. The DW_apb_i2c responds to only 10-bit addressing transfers that match the full 10 bits of the IC_SAR register. - [3:3] - read-write - - - ADDR_7BITS - Slave 7Bit addressing - 0 - - - ADDR_10BITS - Slave 10Bit addressing - 1 - - - - - SPEED - These bits control at which speed the DW_apb_i2c operates; its setting is relevant only if one is operating the DW_apb_i2c in master mode. Hardware protects against illegal values being programmed by software. These bits must be programmed appropriately for slave mode also, as it is used to capture correct value of spike filter as per the speed mode. - - This register should be programmed only with a value in the range of 1 to IC_MAX_SPEED_MODE; otherwise, hardware updates this register with the value of IC_MAX_SPEED_MODE. - - 1: standard mode (100 kbit/s) - - 2: fast mode (<=400 kbit/s) or fast mode plus (<=1000Kbit/s) - - 3: high speed mode (3.4 Mbit/s) - - Note: This field is not applicable when IC_ULTRA_FAST_MODE=1 - [2:1] - read-write - - - STANDARD - Standard Speed mode of operation - 1 - - - FAST - Fast or Fast Plus mode of operation - 2 - - - HIGH - High Speed mode of operation - 3 - - - - - MASTER_MODE - This bit controls whether the DW_apb_i2c master is enabled. - - NOTE: Software should ensure that if this bit is written with '1' then bit 6 should also be written with a '1'. - [0:0] - read-write - - - DISABLED - Master mode is disabled - 0 - - - ENABLED - Master mode is enabled - 1 - - - - - - - IC_TAR - I2C Target Address Register - - This register is 12 bits wide, and bits 31:12 are reserved. This register can be written to only when IC_ENABLE[0] is set to 0. - - Note: If the software or application is aware that the DW_apb_i2c is not using the TAR address for the pending commands in the Tx FIFO, then it is possible to update the TAR address even while the Tx FIFO has entries (IC_STATUS[2]= 0). - It is not necessary to perform any write to this register if DW_apb_i2c is enabled as an I2C slave only. - 0x4 - 0x00000055 - - - SPECIAL - This bit indicates whether software performs a Device-ID or General Call or START BYTE command. - 0: ignore bit 10 GC_OR_START and use IC_TAR normally - 1: perform special I2C command as specified in Device_ID or GC_OR_START bit Reset value: 0x0 - [11:11] - read-write - - - DISABLED - Disables programming of GENERAL_CALL or START_BYTE transmission - 0 - - - ENABLED - Enables programming of GENERAL_CALL or START_BYTE transmission - 1 - - - - - GC_OR_START - If bit 11 (SPECIAL) is set to 1 and bit 13(Device-ID) is set to 0, then this bit indicates whether a General Call or START byte command is to be performed by the DW_apb_i2c. - 0: General Call Address - after issuing a General Call, only writes may be performed. Attempting to issue a read command results in setting bit 6 (TX_ABRT) of the IC_RAW_INTR_STAT register. The DW_apb_i2c remains in General Call mode until the SPECIAL bit value (bit 11) is cleared. - 1: START BYTE Reset value: 0x0 - [10:10] - read-write - - - GENERAL_CALL - GENERAL_CALL byte transmission - 0 - - - START_BYTE - START byte transmission - 1 - - - - - IC_TAR - This is the target address for any master transaction. When transmitting a General Call, these bits are ignored. To generate a START BYTE, the CPU needs to write only once into these bits. - - If the IC_TAR and IC_SAR are the same, loopback exists but the FIFOs are shared between master and slave, so full loopback is not feasible. Only one direction loopback mode is supported (simplex), not duplex. A master cannot transmit to itself; it can transmit to only a slave. - [9:0] - read-write - - - - - IC_SAR - I2C Slave Address Register - 0x8 - 0x00000055 - - - IC_SAR - The IC_SAR holds the slave address when the I2C is operating as a slave. For 7-bit addressing, only IC_SAR[6:0] is used. - - This register can be written only when the I2C interface is disabled, which corresponds to the IC_ENABLE[0] register being set to 0. Writes at other times have no effect. - - Note: The default values cannot be any of the reserved address locations: that is, 0x00 to 0x07, or 0x78 to 0x7f. The correct operation of the device is not guaranteed if you program the IC_SAR or IC_TAR to a reserved value. Refer to <<table_I2C_firstbyte_bit_defs>> for a complete list of these reserved values. - [9:0] - read-write - - - - - IC_DATA_CMD - I2C Rx/Tx Data Buffer and Command Register; this is the register the CPU writes to when filling the TX FIFO and the CPU reads from when retrieving bytes from RX FIFO. - - The size of the register changes as follows: - - Write: - 11 bits when IC_EMPTYFIFO_HOLD_MASTER_EN=1 - 9 bits when IC_EMPTYFIFO_HOLD_MASTER_EN=0 Read: - 12 bits when IC_FIRST_DATA_BYTE_STATUS = 1 - 8 bits when IC_FIRST_DATA_BYTE_STATUS = 0 Note: In order for the DW_apb_i2c to continue acknowledging reads, a read command should be written for every byte that is to be received; otherwise the DW_apb_i2c will stop acknowledging. - 0x10 - 0x00000000 - - - FIRST_DATA_BYTE - Indicates the first data byte received after the address phase for receive transfer in Master receiver or Slave receiver mode. - - Reset value : 0x0 - - NOTE: In case of APB_DATA_WIDTH=8, - - 1. The user has to perform two APB Reads to IC_DATA_CMD in order to get status on 11 bit. - - 2. In order to read the 11 bit, the user has to perform the first data byte read [7:0] (offset 0x10) and then perform the second read [15:8] (offset 0x11) in order to know the status of 11 bit (whether the data received in previous read is a first data byte or not). - - 3. The 11th bit is an optional read field, user can ignore 2nd byte read [15:8] (offset 0x11) if not interested in FIRST_DATA_BYTE status. - [11:11] - read-only - - - INACTIVE - Sequential data byte received - 0 - - - ACTIVE - Non sequential data byte received - 1 - - - - - RESTART - This bit controls whether a RESTART is issued before the byte is sent or received. - - 1 - If IC_RESTART_EN is 1, a RESTART is issued before the data is sent/received (according to the value of CMD), regardless of whether or not the transfer direction is changing from the previous command; if IC_RESTART_EN is 0, a STOP followed by a START is issued instead. - - 0 - If IC_RESTART_EN is 1, a RESTART is issued only if the transfer direction is changing from the previous command; if IC_RESTART_EN is 0, a STOP followed by a START is issued instead. - - Reset value: 0x0 - [10:10] - write-only - - - DISABLE - Don't Issue RESTART before this command - 0 - - - ENABLE - Issue RESTART before this command - 1 - - - - - STOP - This bit controls whether a STOP is issued after the byte is sent or received. - - - 1 - STOP is issued after this byte, regardless of whether or not the Tx FIFO is empty. If the Tx FIFO is not empty, the master immediately tries to start a new transfer by issuing a START and arbitrating for the bus. - 0 - STOP is not issued after this byte, regardless of whether or not the Tx FIFO is empty. If the Tx FIFO is not empty, the master continues the current transfer by sending/receiving data bytes according to the value of the CMD bit. If the Tx FIFO is empty, the master holds the SCL line low and stalls the bus until a new command is available in the Tx FIFO. Reset value: 0x0 - [9:9] - write-only - - - DISABLE - Don't Issue STOP after this command - 0 - - - ENABLE - Issue STOP after this command - 1 - - - - - CMD - This bit controls whether a read or a write is performed. This bit does not control the direction when the DW_apb_i2con acts as a slave. It controls only the direction when it acts as a master. - - When a command is entered in the TX FIFO, this bit distinguishes the write and read commands. In slave-receiver mode, this bit is a 'don't care' because writes to this register are not required. In slave-transmitter mode, a '0' indicates that the data in IC_DATA_CMD is to be transmitted. - - When programming this bit, you should remember the following: attempting to perform a read operation after a General Call command has been sent results in a TX_ABRT interrupt (bit 6 of the IC_RAW_INTR_STAT register), unless bit 11 (SPECIAL) in the IC_TAR register has been cleared. If a '1' is written to this bit after receiving a RD_REQ interrupt, then a TX_ABRT interrupt occurs. - - Reset value: 0x0 - [8:8] - write-only - - - WRITE - Master Write Command - 0 - - - READ - Master Read Command - 1 - - - - - DAT - This register contains the data to be transmitted or received on the I2C bus. If you are writing to this register and want to perform a read, bits 7:0 (DAT) are ignored by the DW_apb_i2c. However, when you read this register, these bits return the value of data received on the DW_apb_i2c interface. - - Reset value: 0x0 - [7:0] - read-write - - - - - IC_SS_SCL_HCNT - Standard Speed I2C Clock SCL High Count Register - 0x14 - 0x00000028 - - - IC_SS_SCL_HCNT - This register must be set before any I2C bus transaction can take place to ensure proper I/O timing. This register sets the SCL clock high-period count for standard speed. For more information, refer to 'IC_CLK Frequency Configuration'. - - This register can be written only when the I2C interface is disabled which corresponds to the IC_ENABLE[0] register being set to 0. Writes at other times have no effect. - - The minimum valid value is 6; hardware prevents values less than this being written, and if attempted results in 6 being set. For designs with APB_DATA_WIDTH = 8, the order of programming is important to ensure the correct operation of the DW_apb_i2c. The lower byte must be programmed first. Then the upper byte is programmed. - - NOTE: This register must not be programmed to a value higher than 65525, because DW_apb_i2c uses a 16-bit counter to flag an I2C bus idle condition when this counter reaches a value of IC_SS_SCL_HCNT + 10. - [15:0] - read-write - - - - - IC_SS_SCL_LCNT - Standard Speed I2C Clock SCL Low Count Register - 0x18 - 0x0000002F - - - IC_SS_SCL_LCNT - This register must be set before any I2C bus transaction can take place to ensure proper I/O timing. This register sets the SCL clock low period count for standard speed. For more information, refer to 'IC_CLK Frequency Configuration' - - This register can be written only when the I2C interface is disabled which corresponds to the IC_ENABLE[0] register being set to 0. Writes at other times have no effect. - - The minimum valid value is 8; hardware prevents values less than this being written, and if attempted, results in 8 being set. For designs with APB_DATA_WIDTH = 8, the order of programming is important to ensure the correct operation of DW_apb_i2c. The lower byte must be programmed first, and then the upper byte is programmed. - [15:0] - read-write - - - - - IC_FS_SCL_HCNT - Fast Mode or Fast Mode Plus I2C Clock SCL High Count Register - 0x1C - 0x00000006 - - - IC_FS_SCL_HCNT - This register must be set before any I2C bus transaction can take place to ensure proper I/O timing. This register sets the SCL clock high-period count for fast mode or fast mode plus. It is used in high-speed mode to send the Master Code and START BYTE or General CALL. For more information, refer to 'IC_CLK Frequency Configuration'. - - This register goes away and becomes read-only returning 0s if IC_MAX_SPEED_MODE = standard. This register can be written only when the I2C interface is disabled, which corresponds to the IC_ENABLE[0] register being set to 0. Writes at other times have no effect. - - The minimum valid value is 6; hardware prevents values less than this being written, and if attempted results in 6 being set. For designs with APB_DATA_WIDTH == 8 the order of programming is important to ensure the correct operation of the DW_apb_i2c. The lower byte must be programmed first. Then the upper byte is programmed. - [15:0] - read-write - - - - - IC_FS_SCL_LCNT - Fast Mode or Fast Mode Plus I2C Clock SCL Low Count Register - 0x20 - 0x0000000D - - - IC_FS_SCL_LCNT - This register must be set before any I2C bus transaction can take place to ensure proper I/O timing. This register sets the SCL clock low period count for fast speed. It is used in high-speed mode to send the Master Code and START BYTE or General CALL. For more information, refer to 'IC_CLK Frequency Configuration'. - - This register goes away and becomes read-only returning 0s if IC_MAX_SPEED_MODE = standard. - - This register can be written only when the I2C interface is disabled, which corresponds to the IC_ENABLE[0] register being set to 0. Writes at other times have no effect. - - The minimum valid value is 8; hardware prevents values less than this being written, and if attempted results in 8 being set. For designs with APB_DATA_WIDTH = 8 the order of programming is important to ensure the correct operation of the DW_apb_i2c. The lower byte must be programmed first. Then the upper byte is programmed. If the value is less than 8 then the count value gets changed to 8. - [15:0] - read-write - - - - - IC_INTR_STAT - I2C Interrupt Status Register - - Each bit in this register has a corresponding mask bit in the IC_INTR_MASK register. These bits are cleared by reading the matching interrupt clear register. The unmasked raw versions of these bits are available in the IC_RAW_INTR_STAT register. - 0x2C - 0x00000000 - - - R_RESTART_DET - See IC_RAW_INTR_STAT for a detailed description of R_RESTART_DET bit. - - Reset value: 0x0 - [12:12] - read-only - - - INACTIVE - R_RESTART_DET interrupt is inactive - 0 - - - ACTIVE - R_RESTART_DET interrupt is active - 1 - - - - - R_GEN_CALL - See IC_RAW_INTR_STAT for a detailed description of R_GEN_CALL bit. - - Reset value: 0x0 - [11:11] - read-only - - - INACTIVE - R_GEN_CALL interrupt is inactive - 0 - - - ACTIVE - R_GEN_CALL interrupt is active - 1 - - - - - R_START_DET - See IC_RAW_INTR_STAT for a detailed description of R_START_DET bit. - - Reset value: 0x0 - [10:10] - read-only - - - INACTIVE - R_START_DET interrupt is inactive - 0 - - - ACTIVE - R_START_DET interrupt is active - 1 - - - - - R_STOP_DET - See IC_RAW_INTR_STAT for a detailed description of R_STOP_DET bit. - - Reset value: 0x0 - [9:9] - read-only - - - INACTIVE - R_STOP_DET interrupt is inactive - 0 - - - ACTIVE - R_STOP_DET interrupt is active - 1 - - - - - R_ACTIVITY - See IC_RAW_INTR_STAT for a detailed description of R_ACTIVITY bit. - - Reset value: 0x0 - [8:8] - read-only - - - INACTIVE - R_ACTIVITY interrupt is inactive - 0 - - - ACTIVE - R_ACTIVITY interrupt is active - 1 - - - - - R_RX_DONE - See IC_RAW_INTR_STAT for a detailed description of R_RX_DONE bit. - - Reset value: 0x0 - [7:7] - read-only - - - INACTIVE - R_RX_DONE interrupt is inactive - 0 - - - ACTIVE - R_RX_DONE interrupt is active - 1 - - - - - R_TX_ABRT - See IC_RAW_INTR_STAT for a detailed description of R_TX_ABRT bit. - - Reset value: 0x0 - [6:6] - read-only - - - INACTIVE - R_TX_ABRT interrupt is inactive - 0 - - - ACTIVE - R_TX_ABRT interrupt is active - 1 - - - - - R_RD_REQ - See IC_RAW_INTR_STAT for a detailed description of R_RD_REQ bit. - - Reset value: 0x0 - [5:5] - read-only - - - INACTIVE - R_RD_REQ interrupt is inactive - 0 - - - ACTIVE - R_RD_REQ interrupt is active - 1 - - - - - R_TX_EMPTY - See IC_RAW_INTR_STAT for a detailed description of R_TX_EMPTY bit. - - Reset value: 0x0 - [4:4] - read-only - - - INACTIVE - R_TX_EMPTY interrupt is inactive - 0 - - - ACTIVE - R_TX_EMPTY interrupt is active - 1 - - - - - R_TX_OVER - See IC_RAW_INTR_STAT for a detailed description of R_TX_OVER bit. - - Reset value: 0x0 - [3:3] - read-only - - - INACTIVE - R_TX_OVER interrupt is inactive - 0 - - - ACTIVE - R_TX_OVER interrupt is active - 1 - - - - - R_RX_FULL - See IC_RAW_INTR_STAT for a detailed description of R_RX_FULL bit. - - Reset value: 0x0 - [2:2] - read-only - - - INACTIVE - R_RX_FULL interrupt is inactive - 0 - - - ACTIVE - R_RX_FULL interrupt is active - 1 - - - - - R_RX_OVER - See IC_RAW_INTR_STAT for a detailed description of R_RX_OVER bit. - - Reset value: 0x0 - [1:1] - read-only - - - INACTIVE - R_RX_OVER interrupt is inactive - 0 - - - ACTIVE - R_RX_OVER interrupt is active - 1 - - - - - R_RX_UNDER - See IC_RAW_INTR_STAT for a detailed description of R_RX_UNDER bit. - - Reset value: 0x0 - [0:0] - read-only - - - INACTIVE - RX_UNDER interrupt is inactive - 0 - - - ACTIVE - RX_UNDER interrupt is active - 1 - - - - - - - IC_INTR_MASK - I2C Interrupt Mask Register. - - These bits mask their corresponding interrupt status bits. This register is active low; a value of 0 masks the interrupt, whereas a value of 1 unmasks the interrupt. - 0x30 - 0x000008FF - - - M_RESTART_DET - This bit masks the R_RESTART_DET interrupt in IC_INTR_STAT register. - - Reset value: 0x0 - [12:12] - read-write - - - ENABLED - RESTART_DET interrupt is masked - 0 - - - DISABLED - RESTART_DET interrupt is unmasked - 1 - - - - - M_GEN_CALL - This bit masks the R_GEN_CALL interrupt in IC_INTR_STAT register. - - Reset value: 0x1 - [11:11] - read-write - - - ENABLED - GEN_CALL interrupt is masked - 0 - - - DISABLED - GEN_CALL interrupt is unmasked - 1 - - - - - M_START_DET - This bit masks the R_START_DET interrupt in IC_INTR_STAT register. - - Reset value: 0x0 - [10:10] - read-write - - - ENABLED - START_DET interrupt is masked - 0 - - - DISABLED - START_DET interrupt is unmasked - 1 - - - - - M_STOP_DET - This bit masks the R_STOP_DET interrupt in IC_INTR_STAT register. - - Reset value: 0x0 - [9:9] - read-write - - - ENABLED - STOP_DET interrupt is masked - 0 - - - DISABLED - STOP_DET interrupt is unmasked - 1 - - - - - M_ACTIVITY - This bit masks the R_ACTIVITY interrupt in IC_INTR_STAT register. - - Reset value: 0x0 - [8:8] - read-write - - - ENABLED - ACTIVITY interrupt is masked - 0 - - - DISABLED - ACTIVITY interrupt is unmasked - 1 - - - - - M_RX_DONE - This bit masks the R_RX_DONE interrupt in IC_INTR_STAT register. - - Reset value: 0x1 - [7:7] - read-write - - - ENABLED - RX_DONE interrupt is masked - 0 - - - DISABLED - RX_DONE interrupt is unmasked - 1 - - - - - M_TX_ABRT - This bit masks the R_TX_ABRT interrupt in IC_INTR_STAT register. - - Reset value: 0x1 - [6:6] - read-write - - - ENABLED - TX_ABORT interrupt is masked - 0 - - - DISABLED - TX_ABORT interrupt is unmasked - 1 - - - - - M_RD_REQ - This bit masks the R_RD_REQ interrupt in IC_INTR_STAT register. - - Reset value: 0x1 - [5:5] - read-write - - - ENABLED - RD_REQ interrupt is masked - 0 - - - DISABLED - RD_REQ interrupt is unmasked - 1 - - - - - M_TX_EMPTY - This bit masks the R_TX_EMPTY interrupt in IC_INTR_STAT register. - - Reset value: 0x1 - [4:4] - read-write - - - ENABLED - TX_EMPTY interrupt is masked - 0 - - - DISABLED - TX_EMPTY interrupt is unmasked - 1 - - - - - M_TX_OVER - This bit masks the R_TX_OVER interrupt in IC_INTR_STAT register. - - Reset value: 0x1 - [3:3] - read-write - - - ENABLED - TX_OVER interrupt is masked - 0 - - - DISABLED - TX_OVER interrupt is unmasked - 1 - - - - - M_RX_FULL - This bit masks the R_RX_FULL interrupt in IC_INTR_STAT register. - - Reset value: 0x1 - [2:2] - read-write - - - ENABLED - RX_FULL interrupt is masked - 0 - - - DISABLED - RX_FULL interrupt is unmasked - 1 - - - - - M_RX_OVER - This bit masks the R_RX_OVER interrupt in IC_INTR_STAT register. - - Reset value: 0x1 - [1:1] - read-write - - - ENABLED - RX_OVER interrupt is masked - 0 - - - DISABLED - RX_OVER interrupt is unmasked - 1 - - - - - M_RX_UNDER - This bit masks the R_RX_UNDER interrupt in IC_INTR_STAT register. - - Reset value: 0x1 - [0:0] - read-write - - - ENABLED - RX_UNDER interrupt is masked - 0 - - - DISABLED - RX_UNDER interrupt is unmasked - 1 - - - - - - - IC_RAW_INTR_STAT - I2C Raw Interrupt Status Register - - Unlike the IC_INTR_STAT register, these bits are not masked so they always show the true status of the DW_apb_i2c. - 0x34 - 0x00000000 - - - RESTART_DET - Indicates whether a RESTART condition has occurred on the I2C interface when DW_apb_i2c is operating in Slave mode and the slave is being addressed. Enabled only when IC_SLV_RESTART_DET_EN=1. - - Note: However, in high-speed mode or during a START BYTE transfer, the RESTART comes before the address field as per the I2C protocol. In this case, the slave is not the addressed slave when the RESTART is issued, therefore DW_apb_i2c does not generate the RESTART_DET interrupt. - - Reset value: 0x0 - [12:12] - read-only - - - INACTIVE - RESTART_DET interrupt is inactive - 0 - - - ACTIVE - RESTART_DET interrupt is active - 1 - - - - - GEN_CALL - Set only when a General Call address is received and it is acknowledged. It stays set until it is cleared either by disabling DW_apb_i2c or when the CPU reads bit 0 of the IC_CLR_GEN_CALL register. DW_apb_i2c stores the received data in the Rx buffer. - - Reset value: 0x0 - [11:11] - read-only - - - INACTIVE - GEN_CALL interrupt is inactive - 0 - - - ACTIVE - GEN_CALL interrupt is active - 1 - - - - - START_DET - Indicates whether a START or RESTART condition has occurred on the I2C interface regardless of whether DW_apb_i2c is operating in slave or master mode. - - Reset value: 0x0 - [10:10] - read-only - - - INACTIVE - START_DET interrupt is inactive - 0 - - - ACTIVE - START_DET interrupt is active - 1 - - - - - STOP_DET - Indicates whether a STOP condition has occurred on the I2C interface regardless of whether DW_apb_i2c is operating in slave or master mode. - - In Slave Mode: - If IC_CON[7]=1'b1 (STOP_DET_IFADDRESSED), the STOP_DET interrupt will be issued only if slave is addressed. Note: During a general call address, this slave does not issue a STOP_DET interrupt if STOP_DET_IF_ADDRESSED=1'b1, even if the slave responds to the general call address by generating ACK. The STOP_DET interrupt is generated only when the transmitted address matches the slave address (SAR). - If IC_CON[7]=1'b0 (STOP_DET_IFADDRESSED), the STOP_DET interrupt is issued irrespective of whether it is being addressed. In Master Mode: - If IC_CON[10]=1'b1 (STOP_DET_IF_MASTER_ACTIVE),the STOP_DET interrupt will be issued only if Master is active. - If IC_CON[10]=1'b0 (STOP_DET_IFADDRESSED),the STOP_DET interrupt will be issued irrespective of whether master is active or not. Reset value: 0x0 - [9:9] - read-only - - - INACTIVE - STOP_DET interrupt is inactive - 0 - - - ACTIVE - STOP_DET interrupt is active - 1 - - - - - ACTIVITY - This bit captures DW_apb_i2c activity and stays set until it is cleared. There are four ways to clear it: - Disabling the DW_apb_i2c - Reading the IC_CLR_ACTIVITY register - Reading the IC_CLR_INTR register - System reset Once this bit is set, it stays set unless one of the four methods is used to clear it. Even if the DW_apb_i2c module is idle, this bit remains set until cleared, indicating that there was activity on the bus. - - Reset value: 0x0 - [8:8] - read-only - - - INACTIVE - RAW_INTR_ACTIVITY interrupt is inactive - 0 - - - ACTIVE - RAW_INTR_ACTIVITY interrupt is active - 1 - - - - - RX_DONE - When the DW_apb_i2c is acting as a slave-transmitter, this bit is set to 1 if the master does not acknowledge a transmitted byte. This occurs on the last byte of the transmission, indicating that the transmission is done. - - Reset value: 0x0 - [7:7] - read-only - - - INACTIVE - RX_DONE interrupt is inactive - 0 - - - ACTIVE - RX_DONE interrupt is active - 1 - - - - - TX_ABRT - This bit indicates if DW_apb_i2c, as an I2C transmitter, is unable to complete the intended actions on the contents of the transmit FIFO. This situation can occur both as an I2C master or an I2C slave, and is referred to as a 'transmit abort'. When this bit is set to 1, the IC_TX_ABRT_SOURCE register indicates the reason why the transmit abort takes places. - - Note: The DW_apb_i2c flushes/resets/empties the TX_FIFO and RX_FIFO whenever there is a transmit abort caused by any of the events tracked by the IC_TX_ABRT_SOURCE register. The FIFOs remains in this flushed state until the register IC_CLR_TX_ABRT is read. Once this read is performed, the Tx FIFO is then ready to accept more data bytes from the APB interface. - - Reset value: 0x0 - [6:6] - read-only - - - INACTIVE - TX_ABRT interrupt is inactive - 0 - - - ACTIVE - TX_ABRT interrupt is active - 1 - - - - - RD_REQ - This bit is set to 1 when DW_apb_i2c is acting as a slave and another I2C master is attempting to read data from DW_apb_i2c. The DW_apb_i2c holds the I2C bus in a wait state (SCL=0) until this interrupt is serviced, which means that the slave has been addressed by a remote master that is asking for data to be transferred. The processor must respond to this interrupt and then write the requested data to the IC_DATA_CMD register. This bit is set to 0 just after the processor reads the IC_CLR_RD_REQ register. - - Reset value: 0x0 - [5:5] - read-only - - - INACTIVE - RD_REQ interrupt is inactive - 0 - - - ACTIVE - RD_REQ interrupt is active - 1 - - - - - TX_EMPTY - The behavior of the TX_EMPTY interrupt status differs based on the TX_EMPTY_CTRL selection in the IC_CON register. - When TX_EMPTY_CTRL = 0: This bit is set to 1 when the transmit buffer is at or below the threshold value set in the IC_TX_TL register. - When TX_EMPTY_CTRL = 1: This bit is set to 1 when the transmit buffer is at or below the threshold value set in the IC_TX_TL register and the transmission of the address/data from the internal shift register for the most recently popped command is completed. It is automatically cleared by hardware when the buffer level goes above the threshold. When IC_ENABLE[0] is set to 0, the TX FIFO is flushed and held in reset. There the TX FIFO looks like it has no data within it, so this bit is set to 1, provided there is activity in the master or slave state machines. When there is no longer any activity, then with ic_en=0, this bit is set to 0. - - Reset value: 0x0. - [4:4] - read-only - - - INACTIVE - TX_EMPTY interrupt is inactive - 0 - - - ACTIVE - TX_EMPTY interrupt is active - 1 - - - - - TX_OVER - Set during transmit if the transmit buffer is filled to IC_TX_BUFFER_DEPTH and the processor attempts to issue another I2C command by writing to the IC_DATA_CMD register. When the module is disabled, this bit keeps its level until the master or slave state machines go into idle, and when ic_en goes to 0, this interrupt is cleared. - - Reset value: 0x0 - [3:3] - read-only - - - INACTIVE - TX_OVER interrupt is inactive - 0 - - - ACTIVE - TX_OVER interrupt is active - 1 - - - - - RX_FULL - Set when the receive buffer reaches or goes above the RX_TL threshold in the IC_RX_TL register. It is automatically cleared by hardware when buffer level goes below the threshold. If the module is disabled (IC_ENABLE[0]=0), the RX FIFO is flushed and held in reset; therefore the RX FIFO is not full. So this bit is cleared once the IC_ENABLE bit 0 is programmed with a 0, regardless of the activity that continues. - - Reset value: 0x0 - [2:2] - read-only - - - INACTIVE - RX_FULL interrupt is inactive - 0 - - - ACTIVE - RX_FULL interrupt is active - 1 - - - - - RX_OVER - Set if the receive buffer is completely filled to IC_RX_BUFFER_DEPTH and an additional byte is received from an external I2C device. The DW_apb_i2c acknowledges this, but any data bytes received after the FIFO is full are lost. If the module is disabled (IC_ENABLE[0]=0), this bit keeps its level until the master or slave state machines go into idle, and when ic_en goes to 0, this interrupt is cleared. - - Note: If bit 9 of the IC_CON register (RX_FIFO_FULL_HLD_CTRL) is programmed to HIGH, then the RX_OVER interrupt never occurs, because the Rx FIFO never overflows. - - Reset value: 0x0 - [1:1] - read-only - - - INACTIVE - RX_OVER interrupt is inactive - 0 - - - ACTIVE - RX_OVER interrupt is active - 1 - - - - - RX_UNDER - Set if the processor attempts to read the receive buffer when it is empty by reading from the IC_DATA_CMD register. If the module is disabled (IC_ENABLE[0]=0), this bit keeps its level until the master or slave state machines go into idle, and when ic_en goes to 0, this interrupt is cleared. - - Reset value: 0x0 - [0:0] - read-only - - - INACTIVE - RX_UNDER interrupt is inactive - 0 - - - ACTIVE - RX_UNDER interrupt is active - 1 - - - - - - - IC_RX_TL - I2C Receive FIFO Threshold Register - 0x38 - 0x00000000 - - - RX_TL - Receive FIFO Threshold Level. - - Controls the level of entries (or above) that triggers the RX_FULL interrupt (bit 2 in IC_RAW_INTR_STAT register). The valid range is 0-255, with the additional restriction that hardware does not allow this value to be set to a value larger than the depth of the buffer. If an attempt is made to do that, the actual value set will be the maximum depth of the buffer. A value of 0 sets the threshold for 1 entry, and a value of 255 sets the threshold for 256 entries. - [7:0] - read-write - - - - - IC_TX_TL - I2C Transmit FIFO Threshold Register - 0x3C - 0x00000000 - - - TX_TL - Transmit FIFO Threshold Level. - - Controls the level of entries (or below) that trigger the TX_EMPTY interrupt (bit 4 in IC_RAW_INTR_STAT register). The valid range is 0-255, with the additional restriction that it may not be set to value larger than the depth of the buffer. If an attempt is made to do that, the actual value set will be the maximum depth of the buffer. A value of 0 sets the threshold for 0 entries, and a value of 255 sets the threshold for 255 entries. - [7:0] - read-write - - - - - IC_CLR_INTR - Clear Combined and Individual Interrupt Register - 0x40 - 0x00000000 - - - CLR_INTR - Read this register to clear the combined interrupt, all individual interrupts, and the IC_TX_ABRT_SOURCE register. This bit does not clear hardware clearable interrupts but software clearable interrupts. Refer to Bit 9 of the IC_TX_ABRT_SOURCE register for an exception to clearing IC_TX_ABRT_SOURCE. - - Reset value: 0x0 - [0:0] - read-only - - - - - IC_CLR_RX_UNDER - Clear RX_UNDER Interrupt Register - 0x44 - 0x00000000 - - - CLR_RX_UNDER - Read this register to clear the RX_UNDER interrupt (bit 0) of the IC_RAW_INTR_STAT register. - - Reset value: 0x0 - [0:0] - read-only - - - - - IC_CLR_RX_OVER - Clear RX_OVER Interrupt Register - 0x48 - 0x00000000 - - - CLR_RX_OVER - Read this register to clear the RX_OVER interrupt (bit 1) of the IC_RAW_INTR_STAT register. - - Reset value: 0x0 - [0:0] - read-only - - - - - IC_CLR_TX_OVER - Clear TX_OVER Interrupt Register - 0x4C - 0x00000000 - - - CLR_TX_OVER - Read this register to clear the TX_OVER interrupt (bit 3) of the IC_RAW_INTR_STAT register. - - Reset value: 0x0 - [0:0] - read-only - - - - - IC_CLR_RD_REQ - Clear RD_REQ Interrupt Register - 0x50 - 0x00000000 - - - CLR_RD_REQ - Read this register to clear the RD_REQ interrupt (bit 5) of the IC_RAW_INTR_STAT register. - - Reset value: 0x0 - [0:0] - read-only - - - - - IC_CLR_TX_ABRT - Clear TX_ABRT Interrupt Register - 0x54 - 0x00000000 - - - CLR_TX_ABRT - Read this register to clear the TX_ABRT interrupt (bit 6) of the IC_RAW_INTR_STAT register, and the IC_TX_ABRT_SOURCE register. This also releases the TX FIFO from the flushed/reset state, allowing more writes to the TX FIFO. Refer to Bit 9 of the IC_TX_ABRT_SOURCE register for an exception to clearing IC_TX_ABRT_SOURCE. - - Reset value: 0x0 - [0:0] - read-only - - - - - IC_CLR_RX_DONE - Clear RX_DONE Interrupt Register - 0x58 - 0x00000000 - - - CLR_RX_DONE - Read this register to clear the RX_DONE interrupt (bit 7) of the IC_RAW_INTR_STAT register. - - Reset value: 0x0 - [0:0] - read-only - - - - - IC_CLR_ACTIVITY - Clear ACTIVITY Interrupt Register - 0x5C - 0x00000000 - - - CLR_ACTIVITY - Reading this register clears the ACTIVITY interrupt if the I2C is not active anymore. If the I2C module is still active on the bus, the ACTIVITY interrupt bit continues to be set. It is automatically cleared by hardware if the module is disabled and if there is no further activity on the bus. The value read from this register to get status of the ACTIVITY interrupt (bit 8) of the IC_RAW_INTR_STAT register. - - Reset value: 0x0 - [0:0] - read-only - - - - - IC_CLR_STOP_DET - Clear STOP_DET Interrupt Register - 0x60 - 0x00000000 - - - CLR_STOP_DET - Read this register to clear the STOP_DET interrupt (bit 9) of the IC_RAW_INTR_STAT register. - - Reset value: 0x0 - [0:0] - read-only - - - - - IC_CLR_START_DET - Clear START_DET Interrupt Register - 0x64 - 0x00000000 - - - CLR_START_DET - Read this register to clear the START_DET interrupt (bit 10) of the IC_RAW_INTR_STAT register. - - Reset value: 0x0 - [0:0] - read-only - - - - - IC_CLR_GEN_CALL - Clear GEN_CALL Interrupt Register - 0x68 - 0x00000000 - - - CLR_GEN_CALL - Read this register to clear the GEN_CALL interrupt (bit 11) of IC_RAW_INTR_STAT register. - - Reset value: 0x0 - [0:0] - read-only - - - - - IC_ENABLE - I2C Enable Register - 0x6C - 0x00000000 - - - TX_CMD_BLOCK - In Master mode: - 1'b1: Blocks the transmission of data on I2C bus even if Tx FIFO has data to transmit. - 1'b0: The transmission of data starts on I2C bus automatically, as soon as the first data is available in the Tx FIFO. Note: To block the execution of Master commands, set the TX_CMD_BLOCK bit only when Tx FIFO is empty (IC_STATUS[2]==1) and Master is in Idle state (IC_STATUS[5] == 0). Any further commands put in the Tx FIFO are not executed until TX_CMD_BLOCK bit is unset. Reset value: IC_TX_CMD_BLOCK_DEFAULT - [2:2] - read-write - - - NOT_BLOCKED - Tx Command execution not blocked - 0 - - - BLOCKED - Tx Command execution blocked - 1 - - - - - ABORT - When set, the controller initiates the transfer abort. - 0: ABORT not initiated or ABORT done - 1: ABORT operation in progress The software can abort the I2C transfer in master mode by setting this bit. The software can set this bit only when ENABLE is already set; otherwise, the controller ignores any write to ABORT bit. The software cannot clear the ABORT bit once set. In response to an ABORT, the controller issues a STOP and flushes the Tx FIFO after completing the current transfer, then sets the TX_ABORT interrupt after the abort operation. The ABORT bit is cleared automatically after the abort operation. - - For a detailed description on how to abort I2C transfers, refer to 'Aborting I2C Transfers'. - - Reset value: 0x0 - [1:1] - read-write - - - DISABLE - ABORT operation not in progress - 0 - - - ENABLED - ABORT operation in progress - 1 - - - - - ENABLE - Controls whether the DW_apb_i2c is enabled. - 0: Disables DW_apb_i2c (TX and RX FIFOs are held in an erased state) - 1: Enables DW_apb_i2c Software can disable DW_apb_i2c while it is active. However, it is important that care be taken to ensure that DW_apb_i2c is disabled properly. A recommended procedure is described in 'Disabling DW_apb_i2c'. - - When DW_apb_i2c is disabled, the following occurs: - The TX FIFO and RX FIFO get flushed. - Status bits in the IC_INTR_STAT register are still active until DW_apb_i2c goes into IDLE state. If the module is transmitting, it stops as well as deletes the contents of the transmit buffer after the current transfer is complete. If the module is receiving, the DW_apb_i2c stops the current transfer at the end of the current byte and does not acknowledge the transfer. - - In systems with asynchronous pclk and ic_clk when IC_CLK_TYPE parameter set to asynchronous (1), there is a two ic_clk delay when enabling or disabling the DW_apb_i2c. For a detailed description on how to disable DW_apb_i2c, refer to 'Disabling DW_apb_i2c' - - Reset value: 0x0 - [0:0] - read-write - - - DISABLED - I2C is disabled - 0 - - - ENABLED - I2C is enabled - 1 - - - - - - - IC_STATUS - I2C Status Register - - This is a read-only register used to indicate the current transfer status and FIFO status. The status register may be read at any time. None of the bits in this register request an interrupt. - - When the I2C is disabled by writing 0 in bit 0 of the IC_ENABLE register: - Bits 1 and 2 are set to 1 - Bits 3 and 10 are set to 0 When the master or slave state machines goes to idle and ic_en=0: - Bits 5 and 6 are set to 0 - 0x70 - 0x00000006 - - - SLV_ACTIVITY - Slave FSM Activity Status. When the Slave Finite State Machine (FSM) is not in the IDLE state, this bit is set. - 0: Slave FSM is in IDLE state so the Slave part of DW_apb_i2c is not Active - 1: Slave FSM is not in IDLE state so the Slave part of DW_apb_i2c is Active Reset value: 0x0 - [6:6] - read-only - - - IDLE - Slave is idle - 0 - - - ACTIVE - Slave not idle - 1 - - - - - MST_ACTIVITY - Master FSM Activity Status. When the Master Finite State Machine (FSM) is not in the IDLE state, this bit is set. - 0: Master FSM is in IDLE state so the Master part of DW_apb_i2c is not Active - 1: Master FSM is not in IDLE state so the Master part of DW_apb_i2c is Active Note: IC_STATUS[0]-that is, ACTIVITY bit-is the OR of SLV_ACTIVITY and MST_ACTIVITY bits. - - Reset value: 0x0 - [5:5] - read-only - - - IDLE - Master is idle - 0 - - - ACTIVE - Master not idle - 1 - - - - - RFF - Receive FIFO Completely Full. When the receive FIFO is completely full, this bit is set. When the receive FIFO contains one or more empty location, this bit is cleared. - 0: Receive FIFO is not full - 1: Receive FIFO is full Reset value: 0x0 - [4:4] - read-only - - - NOT_FULL - Rx FIFO not full - 0 - - - FULL - Rx FIFO is full - 1 - - - - - RFNE - Receive FIFO Not Empty. This bit is set when the receive FIFO contains one or more entries; it is cleared when the receive FIFO is empty. - 0: Receive FIFO is empty - 1: Receive FIFO is not empty Reset value: 0x0 - [3:3] - read-only - - - EMPTY - Rx FIFO is empty - 0 - - - NOT_EMPTY - Rx FIFO not empty - 1 - - - - - TFE - Transmit FIFO Completely Empty. When the transmit FIFO is completely empty, this bit is set. When it contains one or more valid entries, this bit is cleared. This bit field does not request an interrupt. - 0: Transmit FIFO is not empty - 1: Transmit FIFO is empty Reset value: 0x1 - [2:2] - read-only - - - NON_EMPTY - Tx FIFO not empty - 0 - - - EMPTY - Tx FIFO is empty - 1 - - - - - TFNF - Transmit FIFO Not Full. Set when the transmit FIFO contains one or more empty locations, and is cleared when the FIFO is full. - 0: Transmit FIFO is full - 1: Transmit FIFO is not full Reset value: 0x1 - [1:1] - read-only - - - FULL - Tx FIFO is full - 0 - - - NOT_FULL - Tx FIFO not full - 1 - - - - - ACTIVITY - I2C Activity Status. Reset value: 0x0 - [0:0] - read-only - - - INACTIVE - I2C is idle - 0 - - - ACTIVE - I2C is active - 1 - - - - - - - IC_TXFLR - I2C Transmit FIFO Level Register This register contains the number of valid data entries in the transmit FIFO buffer. It is cleared whenever: - The I2C is disabled - There is a transmit abort - that is, TX_ABRT bit is set in the IC_RAW_INTR_STAT register - The slave bulk transmit mode is aborted The register increments whenever data is placed into the transmit FIFO and decrements when data is taken from the transmit FIFO. - 0x74 - 0x00000000 - - - TXFLR - Transmit FIFO Level. Contains the number of valid data entries in the transmit FIFO. - - Reset value: 0x0 - [4:0] - read-only - - - - - IC_RXFLR - I2C Receive FIFO Level Register This register contains the number of valid data entries in the receive FIFO buffer. It is cleared whenever: - The I2C is disabled - Whenever there is a transmit abort caused by any of the events tracked in IC_TX_ABRT_SOURCE The register increments whenever data is placed into the receive FIFO and decrements when data is taken from the receive FIFO. - 0x78 - 0x00000000 - - - RXFLR - Receive FIFO Level. Contains the number of valid data entries in the receive FIFO. - - Reset value: 0x0 - [4:0] - read-only - - - - - IC_SDA_HOLD - I2C SDA Hold Time Length Register - - The bits [15:0] of this register are used to control the hold time of SDA during transmit in both slave and master mode (after SCL goes from HIGH to LOW). - - The bits [23:16] of this register are used to extend the SDA transition (if any) whenever SCL is HIGH in the receiver in either master or slave mode. - - Writes to this register succeed only when IC_ENABLE[0]=0. - - The values in this register are in units of ic_clk period. The value programmed in IC_SDA_TX_HOLD must be greater than the minimum hold time in each mode (one cycle in master mode, seven cycles in slave mode) for the value to be implemented. - - The programmed SDA hold time during transmit (IC_SDA_TX_HOLD) cannot exceed at any time the duration of the low part of scl. Therefore the programmed value cannot be larger than N_SCL_LOW-2, where N_SCL_LOW is the duration of the low part of the scl period measured in ic_clk cycles. - 0x7C - 0x00000001 - - - IC_SDA_RX_HOLD - Sets the required SDA hold time in units of ic_clk period, when DW_apb_i2c acts as a receiver. - - Reset value: IC_DEFAULT_SDA_HOLD[23:16]. - [23:16] - read-write - - - IC_SDA_TX_HOLD - Sets the required SDA hold time in units of ic_clk period, when DW_apb_i2c acts as a transmitter. - - Reset value: IC_DEFAULT_SDA_HOLD[15:0]. - [15:0] - read-write - - - - - IC_TX_ABRT_SOURCE - I2C Transmit Abort Source Register - - This register has 32 bits that indicate the source of the TX_ABRT bit. Except for Bit 9, this register is cleared whenever the IC_CLR_TX_ABRT register or the IC_CLR_INTR register is read. To clear Bit 9, the source of the ABRT_SBYTE_NORSTRT must be fixed first; RESTART must be enabled (IC_CON[5]=1), the SPECIAL bit must be cleared (IC_TAR[11]), or the GC_OR_START bit must be cleared (IC_TAR[10]). - - Once the source of the ABRT_SBYTE_NORSTRT is fixed, then this bit can be cleared in the same manner as other bits in this register. If the source of the ABRT_SBYTE_NORSTRT is not fixed before attempting to clear this bit, Bit 9 clears for one cycle and is then re-asserted. - 0x80 - 0x00000000 - - - TX_FLUSH_CNT - This field indicates the number of Tx FIFO Data Commands which are flushed due to TX_ABRT interrupt. It is cleared whenever I2C is disabled. - - Reset value: 0x0 - - Role of DW_apb_i2c: Master-Transmitter or Slave-Transmitter - [31:23] - read-only - - - ABRT_USER_ABRT - This is a master-mode-only bit. Master has detected the transfer abort (IC_ENABLE[1]) - - Reset value: 0x0 - - Role of DW_apb_i2c: Master-Transmitter - [16:16] - read-only - - - ABRT_USER_ABRT_VOID - Transfer abort detected by master- scenario not present - 0 - - - ABRT_USER_ABRT_GENERATED - Transfer abort detected by master - 1 - - - - - ABRT_SLVRD_INTX - 1: When the processor side responds to a slave mode request for data to be transmitted to a remote master and user writes a 1 in CMD (bit 8) of IC_DATA_CMD register. - - Reset value: 0x0 - - Role of DW_apb_i2c: Slave-Transmitter - [15:15] - read-only - - - ABRT_SLVRD_INTX_VOID - Slave trying to transmit to remote master in read mode- scenario not present - 0 - - - ABRT_SLVRD_INTX_GENERATED - Slave trying to transmit to remote master in read mode - 1 - - - - - ABRT_SLV_ARBLOST - This field indicates that a Slave has lost the bus while transmitting data to a remote master. IC_TX_ABRT_SOURCE[12] is set at the same time. Note: Even though the slave never 'owns' the bus, something could go wrong on the bus. This is a fail safe check. For instance, during a data transmission at the low-to-high transition of SCL, if what is on the data bus is not what is supposed to be transmitted, then DW_apb_i2c no longer own the bus. - - Reset value: 0x0 - - Role of DW_apb_i2c: Slave-Transmitter - [14:14] - read-only - - - ABRT_SLV_ARBLOST_VOID - Slave lost arbitration to remote master- scenario not present - 0 - - - ABRT_SLV_ARBLOST_GENERATED - Slave lost arbitration to remote master - 1 - - - - - ABRT_SLVFLUSH_TXFIFO - This field specifies that the Slave has received a read command and some data exists in the TX FIFO, so the slave issues a TX_ABRT interrupt to flush old data in TX FIFO. - - Reset value: 0x0 - - Role of DW_apb_i2c: Slave-Transmitter - [13:13] - read-only - - - ABRT_SLVFLUSH_TXFIFO_VOID - Slave flushes existing data in TX-FIFO upon getting read command- scenario not present - 0 - - - ABRT_SLVFLUSH_TXFIFO_GENERATED - Slave flushes existing data in TX-FIFO upon getting read command - 1 - - - - - ARB_LOST - This field specifies that the Master has lost arbitration, or if IC_TX_ABRT_SOURCE[14] is also set, then the slave transmitter has lost arbitration. - - Reset value: 0x0 - - Role of DW_apb_i2c: Master-Transmitter or Slave-Transmitter - [12:12] - read-only - - - ABRT_LOST_VOID - Master or Slave-Transmitter lost arbitration- scenario not present - 0 - - - ABRT_LOST_GENERATED - Master or Slave-Transmitter lost arbitration - 1 - - - - - ABRT_MASTER_DIS - This field indicates that the User tries to initiate a Master operation with the Master mode disabled. - - Reset value: 0x0 - - Role of DW_apb_i2c: Master-Transmitter or Master-Receiver - [11:11] - read-only - - - ABRT_MASTER_DIS_VOID - User initiating master operation when MASTER disabled- scenario not present - 0 - - - ABRT_MASTER_DIS_GENERATED - User initiating master operation when MASTER disabled - 1 - - - - - ABRT_10B_RD_NORSTRT - This field indicates that the restart is disabled (IC_RESTART_EN bit (IC_CON[5]) =0) and the master sends a read command in 10-bit addressing mode. - - Reset value: 0x0 - - Role of DW_apb_i2c: Master-Receiver - [10:10] - read-only - - - ABRT_10B_RD_VOID - Master not trying to read in 10Bit addressing mode when RESTART disabled - 0 - - - ABRT_10B_RD_GENERATED - Master trying to read in 10Bit addressing mode when RESTART disabled - 1 - - - - - ABRT_SBYTE_NORSTRT - To clear Bit 9, the source of the ABRT_SBYTE_NORSTRT must be fixed first; restart must be enabled (IC_CON[5]=1), the SPECIAL bit must be cleared (IC_TAR[11]), or the GC_OR_START bit must be cleared (IC_TAR[10]). Once the source of the ABRT_SBYTE_NORSTRT is fixed, then this bit can be cleared in the same manner as other bits in this register. If the source of the ABRT_SBYTE_NORSTRT is not fixed before attempting to clear this bit, bit 9 clears for one cycle and then gets reasserted. When this field is set to 1, the restart is disabled (IC_RESTART_EN bit (IC_CON[5]) =0) and the user is trying to send a START Byte. - - Reset value: 0x0 - - Role of DW_apb_i2c: Master - [9:9] - read-only - - - ABRT_SBYTE_NORSTRT_VOID - User trying to send START byte when RESTART disabled- scenario not present - 0 - - - ABRT_SBYTE_NORSTRT_GENERATED - User trying to send START byte when RESTART disabled - 1 - - - - - ABRT_HS_NORSTRT - This field indicates that the restart is disabled (IC_RESTART_EN bit (IC_CON[5]) =0) and the user is trying to use the master to transfer data in High Speed mode. - - Reset value: 0x0 - - Role of DW_apb_i2c: Master-Transmitter or Master-Receiver - [8:8] - read-only - - - ABRT_HS_NORSTRT_VOID - User trying to switch Master to HS mode when RESTART disabled- scenario not present - 0 - - - ABRT_HS_NORSTRT_GENERATED - User trying to switch Master to HS mode when RESTART disabled - 1 - - - - - ABRT_SBYTE_ACKDET - This field indicates that the Master has sent a START Byte and the START Byte was acknowledged (wrong behavior). - - Reset value: 0x0 - - Role of DW_apb_i2c: Master - [7:7] - read-only - - - ABRT_SBYTE_ACKDET_VOID - ACK detected for START byte- scenario not present - 0 - - - ABRT_SBYTE_ACKDET_GENERATED - ACK detected for START byte - 1 - - - - - ABRT_HS_ACKDET - This field indicates that the Master is in High Speed mode and the High Speed Master code was acknowledged (wrong behavior). - - Reset value: 0x0 - - Role of DW_apb_i2c: Master - [6:6] - read-only - - - ABRT_HS_ACK_VOID - HS Master code ACKed in HS Mode- scenario not present - 0 - - - ABRT_HS_ACK_GENERATED - HS Master code ACKed in HS Mode - 1 - - - - - ABRT_GCALL_READ - This field indicates that DW_apb_i2c in the master mode has sent a General Call but the user programmed the byte following the General Call to be a read from the bus (IC_DATA_CMD[9] is set to 1). - - Reset value: 0x0 - - Role of DW_apb_i2c: Master-Transmitter - [5:5] - read-only - - - ABRT_GCALL_READ_VOID - GCALL is followed by read from bus-scenario not present - 0 - - - ABRT_GCALL_READ_GENERATED - GCALL is followed by read from bus - 1 - - - - - ABRT_GCALL_NOACK - This field indicates that DW_apb_i2c in master mode has sent a General Call and no slave on the bus acknowledged the General Call. - - Reset value: 0x0 - - Role of DW_apb_i2c: Master-Transmitter - [4:4] - read-only - - - ABRT_GCALL_NOACK_VOID - GCALL not ACKed by any slave-scenario not present - 0 - - - ABRT_GCALL_NOACK_GENERATED - GCALL not ACKed by any slave - 1 - - - - - ABRT_TXDATA_NOACK - This field indicates the master-mode only bit. When the master receives an acknowledgement for the address, but when it sends data byte(s) following the address, it did not receive an acknowledge from the remote slave(s). - - Reset value: 0x0 - - Role of DW_apb_i2c: Master-Transmitter - [3:3] - read-only - - - ABRT_TXDATA_NOACK_VOID - Transmitted data non-ACKed by addressed slave-scenario not present - 0 - - - ABRT_TXDATA_NOACK_GENERATED - Transmitted data not ACKed by addressed slave - 1 - - - - - ABRT_10ADDR2_NOACK - This field indicates that the Master is in 10-bit address mode and that the second address byte of the 10-bit address was not acknowledged by any slave. - - Reset value: 0x0 - - Role of DW_apb_i2c: Master-Transmitter or Master-Receiver - [2:2] - read-only - - - INACTIVE - This abort is not generated - 0 - - - ACTIVE - Byte 2 of 10Bit Address not ACKed by any slave - 1 - - - - - ABRT_10ADDR1_NOACK - This field indicates that the Master is in 10-bit address mode and the first 10-bit address byte was not acknowledged by any slave. - - Reset value: 0x0 - - Role of DW_apb_i2c: Master-Transmitter or Master-Receiver - [1:1] - read-only - - - INACTIVE - This abort is not generated - 0 - - - ACTIVE - Byte 1 of 10Bit Address not ACKed by any slave - 1 - - - - - ABRT_7B_ADDR_NOACK - This field indicates that the Master is in 7-bit addressing mode and the address sent was not acknowledged by any slave. - - Reset value: 0x0 - - Role of DW_apb_i2c: Master-Transmitter or Master-Receiver - [0:0] - read-only - - - INACTIVE - This abort is not generated - 0 - - - ACTIVE - This abort is generated because of NOACK for 7-bit address - 1 - - - - - - - IC_SLV_DATA_NACK_ONLY - Generate Slave Data NACK Register - - The register is used to generate a NACK for the data part of a transfer when DW_apb_i2c is acting as a slave-receiver. This register only exists when the IC_SLV_DATA_NACK_ONLY parameter is set to 1. When this parameter disabled, this register does not exist and writing to the register's address has no effect. - - A write can occur on this register if both of the following conditions are met: - DW_apb_i2c is disabled (IC_ENABLE[0] = 0) - Slave part is inactive (IC_STATUS[6] = 0) Note: The IC_STATUS[6] is a register read-back location for the internal slv_activity signal; the user should poll this before writing the ic_slv_data_nack_only bit. - 0x84 - 0x00000000 - - - NACK - Generate NACK. This NACK generation only occurs when DW_apb_i2c is a slave-receiver. If this register is set to a value of 1, it can only generate a NACK after a data byte is received; hence, the data transfer is aborted and the data received is not pushed to the receive buffer. - - When the register is set to a value of 0, it generates NACK/ACK, depending on normal criteria. - 1: generate NACK after data byte received - 0: generate NACK/ACK normally Reset value: 0x0 - [0:0] - read-write - - - DISABLED - Slave receiver generates NACK normally - 0 - - - ENABLED - Slave receiver generates NACK upon data reception only - 1 - - - - - - - IC_DMA_CR - DMA Control Register - - The register is used to enable the DMA Controller interface operation. There is a separate bit for transmit and receive. This can be programmed regardless of the state of IC_ENABLE. - 0x88 - 0x00000000 - - - TDMAE - Transmit DMA Enable. This bit enables/disables the transmit FIFO DMA channel. Reset value: 0x0 - [1:1] - read-write - - - DISABLED - transmit FIFO DMA channel disabled - 0 - - - ENABLED - Transmit FIFO DMA channel enabled - 1 - - - - - RDMAE - Receive DMA Enable. This bit enables/disables the receive FIFO DMA channel. Reset value: 0x0 - [0:0] - read-write - - - DISABLED - Receive FIFO DMA channel disabled - 0 - - - ENABLED - Receive FIFO DMA channel enabled - 1 - - - - - - - IC_DMA_TDLR - DMA Transmit Data Level Register - 0x8C - 0x00000000 - - - DMATDL - Transmit Data Level. This bit field controls the level at which a DMA request is made by the transmit logic. It is equal to the watermark level; that is, the dma_tx_req signal is generated when the number of valid data entries in the transmit FIFO is equal to or below this field value, and TDMAE = 1. - - Reset value: 0x0 - [3:0] - read-write - - - - - IC_DMA_RDLR - I2C Receive Data Level Register - 0x90 - 0x00000000 - - - DMARDL - Receive Data Level. This bit field controls the level at which a DMA request is made by the receive logic. The watermark level = DMARDL+1; that is, dma_rx_req is generated when the number of valid data entries in the receive FIFO is equal to or more than this field value + 1, and RDMAE =1. For instance, when DMARDL is 0, then dma_rx_req is asserted when 1 or more data entries are present in the receive FIFO. - - Reset value: 0x0 - [3:0] - read-write - - - - - IC_SDA_SETUP - I2C SDA Setup Register - - This register controls the amount of time delay (in terms of number of ic_clk clock periods) introduced in the rising edge of SCL - relative to SDA changing - when DW_apb_i2c services a read request in a slave-transmitter operation. The relevant I2C requirement is tSU:DAT (note 4) as detailed in the I2C Bus Specification. This register must be programmed with a value equal to or greater than 2. - - Writes to this register succeed only when IC_ENABLE[0] = 0. - - Note: The length of setup time is calculated using [(IC_SDA_SETUP - 1) * (ic_clk_period)], so if the user requires 10 ic_clk periods of setup time, they should program a value of 11. The IC_SDA_SETUP register is only used by the DW_apb_i2c when operating as a slave transmitter. - 0x94 - 0x00000064 - - - SDA_SETUP - SDA Setup. It is recommended that if the required delay is 1000ns, then for an ic_clk frequency of 10 MHz, IC_SDA_SETUP should be programmed to a value of 11. IC_SDA_SETUP must be programmed with a minimum value of 2. - [7:0] - read-write - - - - - IC_ACK_GENERAL_CALL - I2C ACK General Call Register - - The register controls whether DW_apb_i2c responds with a ACK or NACK when it receives an I2C General Call address. - - This register is applicable only when the DW_apb_i2c is in slave mode. - 0x98 - 0x00000001 - - - ACK_GEN_CALL - ACK General Call. When set to 1, DW_apb_i2c responds with a ACK (by asserting ic_data_oe) when it receives a General Call. Otherwise, DW_apb_i2c responds with a NACK (by negating ic_data_oe). - [0:0] - read-write - - - DISABLED - Generate NACK for a General Call - 0 - - - ENABLED - Generate ACK for a General Call - 1 - - - - - - - IC_ENABLE_STATUS - I2C Enable Status Register - - The register is used to report the DW_apb_i2c hardware status when the IC_ENABLE[0] register is set from 1 to 0; that is, when DW_apb_i2c is disabled. - - If IC_ENABLE[0] has been set to 1, bits 2:1 are forced to 0, and bit 0 is forced to 1. - - If IC_ENABLE[0] has been set to 0, bits 2:1 is only be valid as soon as bit 0 is read as '0'. - - Note: When IC_ENABLE[0] has been set to 0, a delay occurs for bit 0 to be read as 0 because disabling the DW_apb_i2c depends on I2C bus activities. - 0x9C - 0x00000000 - - - SLV_RX_DATA_LOST - Slave Received Data Lost. This bit indicates if a Slave-Receiver operation has been aborted with at least one data byte received from an I2C transfer due to the setting bit 0 of IC_ENABLE from 1 to 0. When read as 1, DW_apb_i2c is deemed to have been actively engaged in an aborted I2C transfer (with matching address) and the data phase of the I2C transfer has been entered, even though a data byte has been responded with a NACK. - - Note: If the remote I2C master terminates the transfer with a STOP condition before the DW_apb_i2c has a chance to NACK a transfer, and IC_ENABLE[0] has been set to 0, then this bit is also set to 1. - - When read as 0, DW_apb_i2c is deemed to have been disabled without being actively involved in the data phase of a Slave-Receiver transfer. - - Note: The CPU can safely read this bit when IC_EN (bit 0) is read as 0. - - Reset value: 0x0 - [2:2] - read-only - - - INACTIVE - Slave RX Data is not lost - 0 - - - ACTIVE - Slave RX Data is lost - 1 - - - - - SLV_DISABLED_WHILE_BUSY - Slave Disabled While Busy (Transmit, Receive). This bit indicates if a potential or active Slave operation has been aborted due to the setting bit 0 of the IC_ENABLE register from 1 to 0. This bit is set when the CPU writes a 0 to the IC_ENABLE register while: - - (a) DW_apb_i2c is receiving the address byte of the Slave-Transmitter operation from a remote master; - - OR, - - (b) address and data bytes of the Slave-Receiver operation from a remote master. - - When read as 1, DW_apb_i2c is deemed to have forced a NACK during any part of an I2C transfer, irrespective of whether the I2C address matches the slave address set in DW_apb_i2c (IC_SAR register) OR if the transfer is completed before IC_ENABLE is set to 0 but has not taken effect. - - Note: If the remote I2C master terminates the transfer with a STOP condition before the DW_apb_i2c has a chance to NACK a transfer, and IC_ENABLE[0] has been set to 0, then this bit will also be set to 1. - - When read as 0, DW_apb_i2c is deemed to have been disabled when there is master activity, or when the I2C bus is idle. - - Note: The CPU can safely read this bit when IC_EN (bit 0) is read as 0. - - Reset value: 0x0 - [1:1] - read-only - - - INACTIVE - Slave is disabled when it is idle - 0 - - - ACTIVE - Slave is disabled when it is active - 1 - - - - - IC_EN - ic_en Status. This bit always reflects the value driven on the output port ic_en. - When read as 1, DW_apb_i2c is deemed to be in an enabled state. - When read as 0, DW_apb_i2c is deemed completely inactive. Note: The CPU can safely read this bit anytime. When this bit is read as 0, the CPU can safely read SLV_RX_DATA_LOST (bit 2) and SLV_DISABLED_WHILE_BUSY (bit 1). - - Reset value: 0x0 - [0:0] - read-only - - - DISABLED - I2C disabled - 0 - - - ENABLED - I2C enabled - 1 - - - - - - - IC_FS_SPKLEN - I2C SS, FS or FM+ spike suppression limit - - This register is used to store the duration, measured in ic_clk cycles, of the longest spike that is filtered out by the spike suppression logic when the component is operating in SS, FS or FM+ modes. The relevant I2C requirement is tSP (table 4) as detailed in the I2C Bus Specification. This register must be programmed with a minimum value of 1. - 0xA0 - 0x00000007 - - - IC_FS_SPKLEN - This register must be set before any I2C bus transaction can take place to ensure stable operation. This register sets the duration, measured in ic_clk cycles, of the longest spike in the SCL or SDA lines that will be filtered out by the spike suppression logic. This register can be written only when the I2C interface is disabled which corresponds to the IC_ENABLE[0] register being set to 0. Writes at other times have no effect. The minimum valid value is 1; hardware prevents values less than this being written, and if attempted results in 1 being set. or more information, refer to 'Spike Suppression'. - [7:0] - read-write - - - - - IC_CLR_RESTART_DET - Clear RESTART_DET Interrupt Register - 0xA8 - 0x00000000 - - - CLR_RESTART_DET - Read this register to clear the RESTART_DET interrupt (bit 12) of IC_RAW_INTR_STAT register. - - Reset value: 0x0 - [0:0] - read-only - - - - - IC_COMP_PARAM_1 - Component Parameter Register 1 - - Note This register is not implemented and therefore reads as 0. If it was implemented it would be a constant read-only register that contains encoded information about the component's parameter settings. Fields shown below are the settings for those parameters - 0xF4 - 0x00000000 - - - TX_BUFFER_DEPTH - TX Buffer Depth = 16 - [23:16] - read-only - - - RX_BUFFER_DEPTH - RX Buffer Depth = 16 - [15:8] - read-only - - - ADD_ENCODED_PARAMS - Encoded parameters not visible - [7:7] - read-only - - - HAS_DMA - DMA handshaking signals are enabled - [6:6] - read-only - - - INTR_IO - COMBINED Interrupt outputs - [5:5] - read-only - - - HC_COUNT_VALUES - Programmable count values for each mode. - [4:4] - read-only - - - MAX_SPEED_MODE - MAX SPEED MODE = FAST MODE - [3:2] - read-only - - - APB_DATA_WIDTH - APB data bus width is 32 bits - [1:0] - read-only - - - - - IC_COMP_VERSION - I2C Component Version Register - 0xF8 - 0x3230312A - - - IC_COMP_VERSION - [31:0] - read-only - - - - - IC_COMP_TYPE - I2C Component Type Register - 0xFC - 0x44570140 - - - IC_COMP_TYPE - Designware Component Type number = 0x44_57_01_40. This assigned unique hex value is constant and is derived from the two ASCII letters 'DW' followed by a 16-bit unsigned number. - [31:0] - read-only - - - - - - - I2C1 - 0x40098000 - - I2C1_IRQ - 37 - - - - SPI0 - 0x40080000 - - 0x0 - 0x1000 - registers - - - SPI0_IRQ - 31 - - - - SSPCR0 - Control register 0, SSPCR0 on page 3-4 - 0x0 - 0x00000000 - - - SCR - Serial clock rate. The value SCR is used to generate the transmit and receive bit rate of the PrimeCell SSP. The bit rate is: F SSPCLK CPSDVSR x (1+SCR) where CPSDVSR is an even value from 2-254, programmed through the SSPCPSR register and SCR is a value from 0-255. - [15:8] - read-write - - - SPH - SSPCLKOUT phase, applicable to Motorola SPI frame format only. See Motorola SPI frame format on page 2-10. - [7:7] - read-write - - - SPO - SSPCLKOUT polarity, applicable to Motorola SPI frame format only. See Motorola SPI frame format on page 2-10. - [6:6] - read-write - - - FRF - Frame format. - [5:4] - read-write - - FRF - - Motorola - Motorola SPI frame format - 0 - - - Texas_Instruments - Texas Instruments synchronous serial frame format - 1 - - - National_Semiconductor_Microwire - National Semiconductor Microwire frame format - 2 - - - - - DSS - Data Size Select: 0000 Reserved, undefined operation. 0001 Reserved, undefined operation. 0010 Reserved, undefined operation. 0011 4-bit data. 0100 5-bit data. 0101 6-bit data. 0110 7-bit data. 0111 8-bit data. 1000 9-bit data. 1001 10-bit data. 1010 11-bit data. 1011 12-bit data. 1100 13-bit data. 1101 14-bit data. 1110 15-bit data. 1111 16-bit data. - [3:0] - read-write - - - - - SSPCR1 - Control register 1, SSPCR1 on page 3-5 - 0x4 - 0x00000000 - - - SOD - Slave-mode output disable. This bit is relevant only in the slave mode, MS=1. In multiple-slave systems, it is possible for an PrimeCell SSP master to broadcast a message to all slaves in the system while ensuring that only one slave drives data onto its serial output line. In such systems the RXD lines from multiple slaves could be tied together. To operate in such systems, the SOD bit can be set if the PrimeCell SSP slave is not supposed to drive the SSPTXD line: 0 SSP can drive the SSPTXD output in slave mode. 1 SSP must not drive the SSPTXD output in slave mode. - [3:3] - read-write - - - MS - Master or slave mode select. This bit can be modified only when the PrimeCell SSP is disabled, SSE=0: 0 Device configured as master, default. 1 Device configured as slave. - [2:2] - read-write - - - SSE - Synchronous serial port enable: 0 SSP operation disabled. 1 SSP operation enabled. - [1:1] - read-write - - - LBM - Loop back mode: 0 Normal serial port operation enabled. 1 Output of transmit serial shifter is connected to input of receive serial shifter internally. - [0:0] - read-write - - - - - SSPDR - Data register, SSPDR on page 3-6 - 0x8 - 0x00000000 - - - DATA - Transmit/Receive FIFO: Read Receive FIFO. Write Transmit FIFO. You must right-justify data when the PrimeCell SSP is programmed for a data size that is less than 16 bits. Unused bits at the top are ignored by transmit logic. The receive logic automatically right-justifies. - [15:0] - read-write - modify - - - - - SSPSR - Status register, SSPSR on page 3-7 - 0xC - 0x00000003 - - - BSY - PrimeCell SSP busy flag, RO: 0 SSP is idle. 1 SSP is currently transmitting and/or receiving a frame or the transmit FIFO is not empty. - [4:4] - read-only - - - RFF - Receive FIFO full, RO: 0 Receive FIFO is not full. 1 Receive FIFO is full. - [3:3] - read-only - - - RNE - Receive FIFO not empty, RO: 0 Receive FIFO is empty. 1 Receive FIFO is not empty. - [2:2] - read-only - - - TNF - Transmit FIFO not full, RO: 0 Transmit FIFO is full. 1 Transmit FIFO is not full. - [1:1] - read-only - - - TFE - Transmit FIFO empty, RO: 0 Transmit FIFO is not empty. 1 Transmit FIFO is empty. - [0:0] - read-only - - - - - SSPCPSR - Clock prescale register, SSPCPSR on page 3-8 - 0x10 - 0x00000000 - - - CPSDVSR - Clock prescale divisor. Must be an even number from 2-254, depending on the frequency of SSPCLK. The least significant bit always returns zero on reads. - [7:0] - read-write - - - - - SSPIMSC - Interrupt mask set or clear register, SSPIMSC on page 3-9 - 0x14 - 0x00000000 - - - TXIM - Transmit FIFO interrupt mask: 0 Transmit FIFO half empty or less condition interrupt is masked. 1 Transmit FIFO half empty or less condition interrupt is not masked. - [3:3] - read-write - - - RXIM - Receive FIFO interrupt mask: 0 Receive FIFO half full or less condition interrupt is masked. 1 Receive FIFO half full or less condition interrupt is not masked. - [2:2] - read-write - - - RTIM - Receive timeout interrupt mask: 0 Receive FIFO not empty and no read prior to timeout period interrupt is masked. 1 Receive FIFO not empty and no read prior to timeout period interrupt is not masked. - [1:1] - read-write - - - RORIM - Receive overrun interrupt mask: 0 Receive FIFO written to while full condition interrupt is masked. 1 Receive FIFO written to while full condition interrupt is not masked. - [0:0] - read-write - - - - - SSPRIS - Raw interrupt status register, SSPRIS on page 3-10 - 0x18 - 0x00000008 - - - TXRIS - Gives the raw interrupt state, prior to masking, of the SSPTXINTR interrupt - [3:3] - read-only - - - RXRIS - Gives the raw interrupt state, prior to masking, of the SSPRXINTR interrupt - [2:2] - read-only - - - RTRIS - Gives the raw interrupt state, prior to masking, of the SSPRTINTR interrupt - [1:1] - read-only - - - RORRIS - Gives the raw interrupt state, prior to masking, of the SSPRORINTR interrupt - [0:0] - read-only - - - - - SSPMIS - Masked interrupt status register, SSPMIS on page 3-11 - 0x1C - 0x00000000 - - - TXMIS - Gives the transmit FIFO masked interrupt state, after masking, of the SSPTXINTR interrupt - [3:3] - read-only - - - RXMIS - Gives the receive FIFO masked interrupt state, after masking, of the SSPRXINTR interrupt - [2:2] - read-only - - - RTMIS - Gives the receive timeout masked interrupt state, after masking, of the SSPRTINTR interrupt - [1:1] - read-only - - - RORMIS - Gives the receive over run masked interrupt status, after masking, of the SSPRORINTR interrupt - [0:0] - read-only - - - - - SSPICR - Interrupt clear register, SSPICR on page 3-11 - 0x20 - 0x00000000 - - - RTIC - Clears the SSPRTINTR interrupt - [1:1] - read-write - oneToClear - - - RORIC - Clears the SSPRORINTR interrupt - [0:0] - read-write - oneToClear - - - - - SSPDMACR - DMA control register, SSPDMACR on page 3-12 - 0x24 - 0x00000000 - - - TXDMAE - Transmit DMA Enable. If this bit is set to 1, DMA for the transmit FIFO is enabled. - [1:1] - read-write - - - RXDMAE - Receive DMA Enable. If this bit is set to 1, DMA for the receive FIFO is enabled. - [0:0] - read-write - - - - - SSPPERIPHID0 - Peripheral identification registers, SSPPeriphID0-3 on page 3-13 - 0xFE0 - 0x00000022 - - - PARTNUMBER0 - These bits read back as 0x22 - [7:0] - read-only - - - - - SSPPERIPHID1 - Peripheral identification registers, SSPPeriphID0-3 on page 3-13 - 0xFE4 - 0x00000010 - - - DESIGNER0 - These bits read back as 0x1 - [7:4] - read-only - - - PARTNUMBER1 - These bits read back as 0x0 - [3:0] - read-only - - - - - SSPPERIPHID2 - Peripheral identification registers, SSPPeriphID0-3 on page 3-13 - 0xFE8 - 0x00000034 - - - REVISION - These bits return the peripheral revision - [7:4] - read-only - - - DESIGNER1 - These bits read back as 0x4 - [3:0] - read-only - - - - - SSPPERIPHID3 - Peripheral identification registers, SSPPeriphID0-3 on page 3-13 - 0xFEC - 0x00000000 - - - CONFIGURATION - These bits read back as 0x00 - [7:0] - read-only - - - - - SSPPCELLID0 - PrimeCell identification registers, SSPPCellID0-3 on page 3-16 - 0xFF0 - 0x0000000D - - - SSPPCELLID0 - These bits read back as 0x0D - [7:0] - read-only - - - - - SSPPCELLID1 - PrimeCell identification registers, SSPPCellID0-3 on page 3-16 - 0xFF4 - 0x000000F0 - - - SSPPCELLID1 - These bits read back as 0xF0 - [7:0] - read-only - - - - - SSPPCELLID2 - PrimeCell identification registers, SSPPCellID0-3 on page 3-16 - 0xFF8 - 0x00000005 - - - SSPPCELLID2 - These bits read back as 0x05 - [7:0] - read-only - - - - - SSPPCELLID3 - PrimeCell identification registers, SSPPCellID0-3 on page 3-16 - 0xFFC - 0x000000B1 - - - SSPPCELLID3 - These bits read back as 0xB1 - [7:0] - read-only - - - - - - - SPI1 - 0x40088000 - - SPI1_IRQ - 32 - - - - PIO0 - Programmable IO block - 0x50200000 - - 0x0 - 0x188 - registers - - - PIO0_IRQ_0 - 15 - - - PIO0_IRQ_1 - 16 - - - - CTRL - PIO control register - 0x0 - 0x00000000 - - - NEXTPREV_CLKDIV_RESTART - Write 1 to restart the clock dividers of state machines in neighbouring PIO blocks, as specified by NEXT_PIO_MASK and PREV_PIO_MASK in the same write. - - This is equivalent to writing 1 to the corresponding CLKDIV_RESTART bits in those PIOs' CTRL registers. - [26:26] - write-only - - - NEXTPREV_SM_DISABLE - Write 1 to disable state machines in neighbouring PIO blocks, as specified by NEXT_PIO_MASK and PREV_PIO_MASK in the same write. - - This is equivalent to clearing the corresponding SM_ENABLE bits in those PIOs' CTRL registers. - [25:25] - write-only - - - NEXTPREV_SM_ENABLE - Write 1 to enable state machines in neighbouring PIO blocks, as specified by NEXT_PIO_MASK and PREV_PIO_MASK in the same write. - - This is equivalent to setting the corresponding SM_ENABLE bits in those PIOs' CTRL registers. - - If both OTHERS_SM_ENABLE and OTHERS_SM_DISABLE are set, the disable takes precedence. - [24:24] - write-only - - - NEXT_PIO_MASK - A mask of state machines in the neighbouring higher-numbered PIO block in the system (or PIO block 0 if this is the highest-numbered PIO block) to which to apply the operations specified by NEXTPREV_CLKDIV_RESTART, NEXTPREV_SM_ENABLE, and NEXTPREV_SM_DISABLE in the same write. - - This allows state machines in a neighbouring PIO block to be started/stopped/clock-synced exactly simultaneously with a write to this PIO block's CTRL register. - - Note that in a system with two PIOs, NEXT_PIO_MASK and PREV_PIO_MASK actually indicate the same PIO block. In this case the effects are applied cumulatively (as though the masks were OR'd together). - - Neighbouring PIO blocks are disconnected (status signals tied to 0 and control signals ignored) if one block is accessible to NonSecure code, and one is not. - [23:20] - write-only - - - PREV_PIO_MASK - A mask of state machines in the neighbouring lower-numbered PIO block in the system (or the highest-numbered PIO block if this is PIO block 0) to which to apply the operations specified by OP_CLKDIV_RESTART, OP_ENABLE, OP_DISABLE in the same write. - - This allows state machines in a neighbouring PIO block to be started/stopped/clock-synced exactly simultaneously with a write to this PIO block's CTRL register. - - Neighbouring PIO blocks are disconnected (status signals tied to 0 and control signals ignored) if one block is accessible to NonSecure code, and one is not. - [19:16] - write-only - - - CLKDIV_RESTART - Restart a state machine's clock divider from an initial phase of 0. Clock dividers are free-running, so once started, their output (including fractional jitter) is completely determined by the integer/fractional divisor configured in SMx_CLKDIV. This means that, if multiple clock dividers with the same divisor are restarted simultaneously, by writing multiple 1 bits to this field, the execution clocks of those state machines will run in precise lockstep. - - Note that setting/clearing SM_ENABLE does not stop the clock divider from running, so once multiple state machines' clocks are synchronised, it is safe to disable/reenable a state machine, whilst keeping the clock dividers in sync. - - Note also that CLKDIV_RESTART can be written to whilst the state machine is running, and this is useful to resynchronise clock dividers after the divisors (SMx_CLKDIV) have been changed on-the-fly. - [11:8] - write-only - - - SM_RESTART - Write 1 to instantly clear internal SM state which may be otherwise difficult to access and will affect future execution. - - Specifically, the following are cleared: input and output shift counters; the contents of the input shift register; the delay counter; the waiting-on-IRQ state; any stalled instruction written to SMx_INSTR or run by OUT/MOV EXEC; any pin write left asserted due to OUT_STICKY. - - The contents of the output shift register and the X/Y scratch registers are not affected. - [7:4] - write-only - - - SM_ENABLE - Enable/disable each of the four state machines by writing 1/0 to each of these four bits. When disabled, a state machine will cease executing instructions, except those written directly to SMx_INSTR by the system. Multiple bits can be set/cleared at once to run/halt multiple state machines simultaneously. - [3:0] - read-write - - - - - FSTAT - FIFO status register - 0x4 - 0x0F000F00 - - - TXEMPTY - State machine TX FIFO is empty - [27:24] - read-only - - - TXFULL - State machine TX FIFO is full - [19:16] - read-only - - - RXEMPTY - State machine RX FIFO is empty - [11:8] - read-only - - - RXFULL - State machine RX FIFO is full - [3:0] - read-only - - - - - FDEBUG - FIFO debug register - 0x8 - 0x00000000 - - - TXSTALL - State machine has stalled on empty TX FIFO during a blocking PULL, or an OUT with autopull enabled. Write 1 to clear. - [27:24] - read-write - oneToClear - - - TXOVER - TX FIFO overflow (i.e. write-on-full by the system) has occurred. Write 1 to clear. Note that write-on-full does not alter the state or contents of the FIFO in any way, but the data that the system attempted to write is dropped, so if this flag is set, your software has quite likely dropped some data on the floor. - [19:16] - read-write - oneToClear - - - RXUNDER - RX FIFO underflow (i.e. read-on-empty by the system) has occurred. Write 1 to clear. Note that read-on-empty does not perturb the state of the FIFO in any way, but the data returned by reading from an empty FIFO is undefined, so this flag generally only becomes set due to some kind of software error. - [11:8] - read-write - oneToClear - - - RXSTALL - State machine has stalled on full RX FIFO during a blocking PUSH, or an IN with autopush enabled. This flag is also set when a nonblocking PUSH to a full FIFO took place, in which case the state machine has dropped data. Write 1 to clear. - [3:0] - read-write - oneToClear - - - - - FLEVEL - FIFO levels - 0xC - 0x00000000 - - - RX3 - [31:28] - read-only - - - TX3 - [27:24] - read-only - - - RX2 - [23:20] - read-only - - - TX2 - [19:16] - read-only - - - RX1 - [15:12] - read-only - - - TX1 - [11:8] - read-only - - - RX0 - [7:4] - read-only - - - TX0 - [3:0] - read-only - - - - - 4 - 0x4 - 0-3 - TXF%s - Direct write access to the TX FIFO for this state machine. Each write pushes one word to the FIFO. Attempting to write to a full FIFO has no effect on the FIFO state or contents, and sets the sticky FDEBUG_TXOVER error flag for this FIFO. - 0x10 - 0x00000000 - - - TXF0 - [31:0] - write-only - - - - - 4 - 0x4 - 0-3 - RXF%s - Direct read access to the RX FIFO for this state machine. Each read pops one word from the FIFO. Attempting to read from an empty FIFO has no effect on the FIFO state, and sets the sticky FDEBUG_RXUNDER error flag for this FIFO. The data returned to the system on a read from an empty FIFO is undefined. - 0x20 - 0x00000000 - - - RXF0 - [31:0] - read-only - modify - - - - - IRQ - State machine IRQ flags register. Write 1 to clear. There are eight state machine IRQ flags, which can be set, cleared, and waited on by the state machines. There's no fixed association between flags and state machines -- any state machine can use any flag. - - Any of the eight flags can be used for timing synchronisation between state machines, using IRQ and WAIT instructions. Any combination of the eight flags can also routed out to either of the two system-level interrupt requests, alongside FIFO status interrupts -- see e.g. IRQ0_INTE. - 0x30 - 0x00000000 - - - IRQ - [7:0] - read-write - oneToClear - - - - - IRQ_FORCE - Writing a 1 to each of these bits will forcibly assert the corresponding IRQ. Note this is different to the INTF register: writing here affects PIO internal state. INTF just asserts the processor-facing IRQ signal for testing ISRs, and is not visible to the state machines. - 0x34 - 0x00000000 - - - IRQ_FORCE - [7:0] - write-only - - - - - INPUT_SYNC_BYPASS - There is a 2-flipflop synchronizer on each GPIO input, which protects PIO logic from metastabilities. This increases input delay, and for fast synchronous IO (e.g. SPI) these synchronizers may need to be bypassed. Each bit in this register corresponds to one GPIO. - 0 -> input is synchronized (default) - 1 -> synchronizer is bypassed - If in doubt, leave this register as all zeroes. - 0x38 - 0x00000000 - - - INPUT_SYNC_BYPASS - [31:0] - read-write - - - - - DBG_PADOUT - Read to sample the pad output values PIO is currently driving to the GPIOs. On RP2040 there are 30 GPIOs, so the two most significant bits are hardwired to 0. - 0x3C - 0x00000000 - - - DBG_PADOUT - [31:0] - read-only - - - - - DBG_PADOE - Read to sample the pad output enables (direction) PIO is currently driving to the GPIOs. On RP2040 there are 30 GPIOs, so the two most significant bits are hardwired to 0. - 0x40 - 0x00000000 - - - DBG_PADOE - [31:0] - read-only - - - - - DBG_CFGINFO - The PIO hardware has some free parameters that may vary between chip products. - These should be provided in the chip datasheet, but are also exposed here. - 0x44 - 0x10000000 - - - VERSION - Version of the core PIO hardware. - [31:28] - read-only - - - v0 - Version 0 (RP2040) - 0 - - - v1 - Version 1 (RP2350) - 1 - - - - - IMEM_SIZE - The size of the instruction memory, measured in units of one instruction - [21:16] - read-only - - - SM_COUNT - The number of state machines this PIO instance is equipped with. - [11:8] - read-only - - - FIFO_DEPTH - The depth of the state machine TX/RX FIFOs, measured in words. - Joining fifos via SHIFTCTRL_FJOIN gives one FIFO with double - this depth. - [5:0] - read-only - - - - - 32 - 0x4 - 0-31 - INSTR_MEM%s - Write-only access to instruction memory location %s - 0x48 - 0x00000000 - - - INSTR_MEM0 - [15:0] - write-only - - - - - 4 - 0x18 - 0-3 - SM%s - Cluster SM%s, containing SM*_CLKDIV, SM*_EXECCTRL, SM*_SHIFTCTRL, SM*_ADDR, SM*_INSTR, SM*_PINCTRL - 0xC8 - - SM_CLKDIV - Clock divisor register for state machine 0 - Frequency = clock freq / (CLKDIV_INT + CLKDIV_FRAC / 256) - 0x0 - 0x00010000 - - - INT - Effective frequency is sysclk/(int + frac/256). - Value of 0 is interpreted as 65536. If INT is 0, FRAC must also be 0. - [31:16] - read-write - - - FRAC - Fractional part of clock divisor - [15:8] - read-write - - - - - SM_EXECCTRL - Execution/behavioural settings for state machine 0 - 0x4 - 0x0001F000 - - - EXEC_STALLED - If 1, an instruction written to SMx_INSTR is stalled, and latched by the state machine. Will clear to 0 once this instruction completes. - [31:31] - read-only - - - SIDE_EN - If 1, the MSB of the Delay/Side-set instruction field is used as side-set enable, rather than a side-set data bit. This allows instructions to perform side-set optionally, rather than on every instruction, but the maximum possible side-set width is reduced from 5 to 4. Note that the value of PINCTRL_SIDESET_COUNT is inclusive of this enable bit. - [30:30] - read-write - - - SIDE_PINDIR - If 1, side-set data is asserted to pin directions, instead of pin values - [29:29] - read-write - - - JMP_PIN - The GPIO number to use as condition for JMP PIN. Unaffected by input mapping. - [28:24] - read-write - - - OUT_EN_SEL - Which data bit to use for inline OUT enable - [23:19] - read-write - - - INLINE_OUT_EN - If 1, use a bit of OUT data as an auxiliary write enable - When used in conjunction with OUT_STICKY, writes with an enable of 0 will - deassert the latest pin write. This can create useful masking/override behaviour - due to the priority ordering of state machine pin writes (SM0 < SM1 < ...) - [18:18] - read-write - - - OUT_STICKY - Continuously assert the most recent OUT/SET to the pins - [17:17] - read-write - - - WRAP_TOP - After reaching this address, execution is wrapped to wrap_bottom. - If the instruction is a jump, and the jump condition is true, the jump takes priority. - [16:12] - read-write - - - WRAP_BOTTOM - After reaching wrap_top, execution is wrapped to this address. - [11:7] - read-write - - - STATUS_SEL - Comparison used for the MOV x, STATUS instruction. - [6:5] - read-write - - - TXLEVEL - All-ones if TX FIFO level < N, otherwise all-zeroes - 0 - - - RXLEVEL - All-ones if RX FIFO level < N, otherwise all-zeroes - 1 - - - IRQ - All-ones if the indexed IRQ flag is raised, otherwise all-zeroes - 2 - - - - - STATUS_N - Comparison level or IRQ index for the MOV x, STATUS instruction. - - If STATUS_SEL is TXLEVEL or RXLEVEL, then values of STATUS_N greater than the current FIFO depth are reserved, and have undefined behaviour. - [4:0] - read-write - - - IRQ - Index 0-7 of an IRQ flag in this PIO block - 0 - - - IRQ_PREVPIO - Index 0-7 of an IRQ flag in the next lower-numbered PIO block - 8 - - - IRQ_NEXTPIO - Index 0-7 of an IRQ flag in the next higher-numbered PIO block - 16 - - - - - - - SM_SHIFTCTRL - Control behaviour of the input/output shift registers for state machine 0 - 0x8 - 0x000C0000 - - - FJOIN_RX - When 1, RX FIFO steals the TX FIFO's storage, and becomes twice as deep. - TX FIFO is disabled as a result (always reads as both full and empty). - FIFOs are flushed when this bit is changed. - [31:31] - read-write - - - FJOIN_TX - When 1, TX FIFO steals the RX FIFO's storage, and becomes twice as deep. - RX FIFO is disabled as a result (always reads as both full and empty). - FIFOs are flushed when this bit is changed. - [30:30] - read-write - - - PULL_THRESH - Number of bits shifted out of OSR before autopull, or conditional pull (PULL IFEMPTY), will take place. - Write 0 for value of 32. - [29:25] - read-write - - - PUSH_THRESH - Number of bits shifted into ISR before autopush, or conditional push (PUSH IFFULL), will take place. - Write 0 for value of 32. - [24:20] - read-write - - - OUT_SHIFTDIR - 1 = shift out of output shift register to right. 0 = to left. - [19:19] - read-write - - - IN_SHIFTDIR - 1 = shift input shift register to right (data enters from left). 0 = to left. - [18:18] - read-write - - - AUTOPULL - Pull automatically when the output shift register is emptied, i.e. on or following an OUT instruction which causes the output shift counter to reach or exceed PULL_THRESH. - [17:17] - read-write - - - AUTOPUSH - Push automatically when the input shift register is filled, i.e. on an IN instruction which causes the input shift counter to reach or exceed PUSH_THRESH. - [16:16] - read-write - - - FJOIN_RX_PUT - If 1, disable this state machine's RX FIFO, make its storage available for random write access by the state machine (using the `put` instruction) and, unless FJOIN_RX_GET is also set, random read access by the processor (through the RXFx_PUTGETy registers). - - If FJOIN_RX_PUT and FJOIN_RX_GET are both set, then the RX FIFO's registers can be randomly read/written by the state machine, but are completely inaccessible to the processor. - - Setting this bit will clear the FJOIN_TX and FJOIN_RX bits. - [15:15] - read-write - - - FJOIN_RX_GET - If 1, disable this state machine's RX FIFO, make its storage available for random read access by the state machine (using the `get` instruction) and, unless FJOIN_RX_PUT is also set, random write access by the processor (through the RXFx_PUTGETy registers). - - If FJOIN_RX_PUT and FJOIN_RX_GET are both set, then the RX FIFO's registers can be randomly read/written by the state machine, but are completely inaccessible to the processor. - - Setting this bit will clear the FJOIN_TX and FJOIN_RX bits. - [14:14] - read-write - - - IN_COUNT - Set the number of pins which are not masked to 0 when read by an IN PINS, WAIT PIN or MOV x, PINS instruction. - - For example, an IN_COUNT of 5 means that the 5 LSBs of the IN pin group are visible (bits 4:0), but the remaining 27 MSBs are masked to 0. A count of 32 is encoded with a field value of 0, so the default behaviour is to not perform any masking. - - Note this masking is applied in addition to the masking usually performed by the IN instruction. This is mainly useful for the MOV x, PINS instruction, which otherwise has no way of masking pins. - [4:0] - read-write - - - - - SM_ADDR - Current instruction address of state machine 0 - 0xC - 0x00000000 - - - SM0_ADDR - [4:0] - read-only - - - - - SM_INSTR - Read to see the instruction currently addressed by state machine 0's program counter - Write to execute an instruction immediately (including jumps) and then resume execution. - 0x10 - 0x00000000 - - - SM0_INSTR - [15:0] - read-write - - - - - SM_PINCTRL - State machine pin control - 0x14 - 0x14000000 - - - SIDESET_COUNT - The number of MSBs of the Delay/Side-set instruction field which are used for side-set. Inclusive of the enable bit, if present. Minimum of 0 (all delay bits, no side-set) and maximum of 5 (all side-set, no delay). - [31:29] - read-write - - - SET_COUNT - The number of pins asserted by a SET. In the range 0 to 5 inclusive. - [28:26] - read-write - - - OUT_COUNT - The number of pins asserted by an OUT PINS, OUT PINDIRS or MOV PINS instruction. In the range 0 to 32 inclusive. - [25:20] - read-write - - - IN_BASE - The pin which is mapped to the least-significant bit of a state machine's IN data bus. Higher-numbered pins are mapped to consecutively more-significant data bits, with a modulo of 32 applied to pin number. - [19:15] - read-write - - - SIDESET_BASE - The lowest-numbered pin that will be affected by a side-set operation. The MSBs of an instruction's side-set/delay field (up to 5, determined by SIDESET_COUNT) are used for side-set data, with the remaining LSBs used for delay. The least-significant bit of the side-set portion is the bit written to this pin, with more-significant bits written to higher-numbered pins. - [14:10] - read-write - - - SET_BASE - The lowest-numbered pin that will be affected by a SET PINS or SET PINDIRS instruction. The data written to this pin is the least-significant bit of the SET data. - [9:5] - read-write - - - OUT_BASE - The lowest-numbered pin that will be affected by an OUT PINS, OUT PINDIRS or MOV PINS instruction. The data written to this pin will always be the least-significant bit of the OUT or MOV data. - [4:0] - read-write - - - - - - 4 - 0x4 - 0-3 - RXF0_PUTGET%s - Direct read/write access to entry %s of SM0's RX FIFO, if SHIFTCTRL_FJOIN_RX_PUT xor SHIFTCTRL_FJOIN_RX_GET is set. - 0x128 - 0x00000000 - - - RXF0_PUTGET0 - [31:0] - read-write - - - - - 4 - 0x4 - 0-3 - RXF1_PUTGET%s - Direct read/write access to entry %s of SM1's RX FIFO, if SHIFTCTRL_FJOIN_RX_PUT xor SHIFTCTRL_FJOIN_RX_GET is set. - 0x138 - 0x00000000 - - - RXF1_PUTGET0 - [31:0] - read-write - - - - - 4 - 0x4 - 0-3 - RXF2_PUTGET%s - Direct read/write access to entry %s of SM2's RX FIFO, if SHIFTCTRL_FJOIN_RX_PUT xor SHIFTCTRL_FJOIN_RX_GET is set. - 0x148 - 0x00000000 - - - RXF2_PUTGET0 - [31:0] - read-write - - - - - 4 - 0x4 - 0-3 - RXF3_PUTGET%s - Direct read/write access to entry %s of SM3's RX FIFO, if SHIFTCTRL_FJOIN_RX_PUT xor SHIFTCTRL_FJOIN_RX_GET is set. - 0x158 - 0x00000000 - - - RXF3_PUTGET0 - [31:0] - read-write - - - - - GPIOBASE - Relocate GPIO 0 (from PIO's point of view) in the system GPIO numbering, to access more than 32 GPIOs from PIO. - - Only the values 0 and 16 are supported (only bit 4 is writable). - 0x168 - 0x00000000 - - - GPIOBASE - [4:4] - read-write - - - - - INTR - Raw Interrupts - 0x16C - 0x00000000 - - - SM7 - [15:15] - read-only - - - SM6 - [14:14] - read-only - - - SM5 - [13:13] - read-only - - - SM4 - [12:12] - read-only - - - SM3 - [11:11] - read-only - - - SM2 - [10:10] - read-only - - - SM1 - [9:9] - read-only - - - SM0 - [8:8] - read-only - - - SM3_TXNFULL - [7:7] - read-only - - - SM2_TXNFULL - [6:6] - read-only - - - SM1_TXNFULL - [5:5] - read-only - - - SM0_TXNFULL - [4:4] - read-only - - - SM3_RXNEMPTY - [3:3] - read-only - - - SM2_RXNEMPTY - [2:2] - read-only - - - SM1_RXNEMPTY - [1:1] - read-only - - - SM0_RXNEMPTY - [0:0] - read-only - - - - - 2 - 0xC - 0-1 - SM_IRQ%s - Cluster SM_IRQ%s, containing IRQ*_INTE, IRQ*_INTF, IRQ*_INTS - 0x170 - - IRQ_INTE - Interrupt Enable for irq0 - 0x0 - 0x00000000 - - - SM7 - [15:15] - read-write - - - SM6 - [14:14] - read-write - - - SM5 - [13:13] - read-write - - - SM4 - [12:12] - read-write - - - SM3 - [11:11] - read-write - - - SM2 - [10:10] - read-write - - - SM1 - [9:9] - read-write - - - SM0 - [8:8] - read-write - - - SM3_TXNFULL - [7:7] - read-write - - - SM2_TXNFULL - [6:6] - read-write - - - SM1_TXNFULL - [5:5] - read-write - - - SM0_TXNFULL - [4:4] - read-write - - - SM3_RXNEMPTY - [3:3] - read-write - - - SM2_RXNEMPTY - [2:2] - read-write - - - SM1_RXNEMPTY - [1:1] - read-write - - - SM0_RXNEMPTY - [0:0] - read-write - - - - - IRQ_INTF - Interrupt Force for irq0 - 0x4 - 0x00000000 - - - SM7 - [15:15] - read-write - - - SM6 - [14:14] - read-write - - - SM5 - [13:13] - read-write - - - SM4 - [12:12] - read-write - - - SM3 - [11:11] - read-write - - - SM2 - [10:10] - read-write - - - SM1 - [9:9] - read-write - - - SM0 - [8:8] - read-write - - - SM3_TXNFULL - [7:7] - read-write - - - SM2_TXNFULL - [6:6] - read-write - - - SM1_TXNFULL - [5:5] - read-write - - - SM0_TXNFULL - [4:4] - read-write - - - SM3_RXNEMPTY - [3:3] - read-write - - - SM2_RXNEMPTY - [2:2] - read-write - - - SM1_RXNEMPTY - [1:1] - read-write - - - SM0_RXNEMPTY - [0:0] - read-write - - - - - IRQ_INTS - Interrupt status after masking & forcing for irq0 - 0x8 - 0x00000000 - - - SM7 - [15:15] - read-only - - - SM6 - [14:14] - read-only - - - SM5 - [13:13] - read-only - - - SM4 - [12:12] - read-only - - - SM3 - [11:11] - read-only - - - SM2 - [10:10] - read-only - - - SM1 - [9:9] - read-only - - - SM0 - [8:8] - read-only - - - SM3_TXNFULL - [7:7] - read-only - - - SM2_TXNFULL - [6:6] - read-only - - - SM1_TXNFULL - [5:5] - read-only - - - SM0_TXNFULL - [4:4] - read-only - - - SM3_RXNEMPTY - [3:3] - read-only - - - SM2_RXNEMPTY - [2:2] - read-only - - - SM1_RXNEMPTY - [1:1] - read-only - - - SM0_RXNEMPTY - [0:0] - read-only - - - - - - - - PIO1 - 0x50300000 - - PIO1_IRQ_0 - 17 - - - PIO1_IRQ_1 - 18 - - - - PIO2 - 0x50400000 - - PIO2_IRQ_0 - 19 - - - PIO2_IRQ_1 - 20 - - - - BUSCTRL - Register block for busfabric control signals and performance counters - 0x40068000 - - 0x0 - 0x2C - registers - - - - BUS_PRIORITY - Set the priority of each master for bus arbitration. - 0x0 - 0x00000000 - - - DMA_W - 0 - low priority, 1 - high priority - [12:12] - read-write - - - DMA_R - 0 - low priority, 1 - high priority - [8:8] - read-write - - - PROC1 - 0 - low priority, 1 - high priority - [4:4] - read-write - - - PROC0 - 0 - low priority, 1 - high priority - [0:0] - read-write - - - - - BUS_PRIORITY_ACK - Bus priority acknowledge - 0x4 - 0x00000000 - - - BUS_PRIORITY_ACK - Goes to 1 once all arbiters have registered the new global priority levels. - Arbiters update their local priority when servicing a new nonsequential access. - In normal circumstances this will happen almost immediately. - [0:0] - read-only - - - - - PERFCTR_EN - Enable the performance counters. If 0, the performance counters do not increment. This can be used to precisely start/stop event sampling around the profiled section of code. - - The performance counters are initially disabled, to save energy. - 0x8 - 0x00000000 - - - PERFCTR_EN - [0:0] - read-write - - - - - PERFCTR0 - Bus fabric performance counter 0 - 0xC - 0x00000000 - - - PERFCTR0 - Busfabric saturating performance counter 0 - Count some event signal from the busfabric arbiters, if PERFCTR_EN is set. - Write any value to clear. Select an event to count using PERFSEL0 - [23:0] - read-write - oneToClear - - - - - PERFSEL0 - Bus fabric performance event select for PERFCTR0 - 0x10 - 0x0000001F - - - PERFSEL0 - Select an event for PERFCTR0. For each downstream port of the main crossbar, four events are available: ACCESS, an access took place; ACCESS_CONTESTED, an access took place that previously stalled due to contention from other masters; STALL_DOWNSTREAM, count cycles where any master stalled due to a stall on the downstream bus; STALL_UPSTREAM, count cycles where any master stalled for any reason, including contention from other masters. - [6:0] - read-write - - - siob_proc1_stall_upstream - 0 - - - siob_proc1_stall_downstream - 1 - - - siob_proc1_access_contested - 2 - - - siob_proc1_access - 3 - - - siob_proc0_stall_upstream - 4 - - - siob_proc0_stall_downstream - 5 - - - siob_proc0_access_contested - 6 - - - siob_proc0_access - 7 - - - apb_stall_upstream - 8 - - - apb_stall_downstream - 9 - - - apb_access_contested - 10 - - - apb_access - 11 - - - fastperi_stall_upstream - 12 - - - fastperi_stall_downstream - 13 - - - fastperi_access_contested - 14 - - - fastperi_access - 15 - - - sram9_stall_upstream - 16 - - - sram9_stall_downstream - 17 - - - sram9_access_contested - 18 - - - sram9_access - 19 - - - sram8_stall_upstream - 20 - - - sram8_stall_downstream - 21 - - - sram8_access_contested - 22 - - - sram8_access - 23 - - - sram7_stall_upstream - 24 - - - sram7_stall_downstream - 25 - - - sram7_access_contested - 26 - - - sram7_access - 27 - - - sram6_stall_upstream - 28 - - - sram6_stall_downstream - 29 - - - sram6_access_contested - 30 - - - sram6_access - 31 - - - sram5_stall_upstream - 32 - - - sram5_stall_downstream - 33 - - - sram5_access_contested - 34 - - - sram5_access - 35 - - - sram4_stall_upstream - 36 - - - sram4_stall_downstream - 37 - - - sram4_access_contested - 38 - - - sram4_access - 39 - - - sram3_stall_upstream - 40 - - - sram3_stall_downstream - 41 - - - sram3_access_contested - 42 - - - sram3_access - 43 - - - sram2_stall_upstream - 44 - - - sram2_stall_downstream - 45 - - - sram2_access_contested - 46 - - - sram2_access - 47 - - - sram1_stall_upstream - 48 - - - sram1_stall_downstream - 49 - - - sram1_access_contested - 50 - - - sram1_access - 51 - - - sram0_stall_upstream - 52 - - - sram0_stall_downstream - 53 - - - sram0_access_contested - 54 - - - sram0_access - 55 - - - xip_main1_stall_upstream - 56 - - - xip_main1_stall_downstream - 57 - - - xip_main1_access_contested - 58 - - - xip_main1_access - 59 - - - xip_main0_stall_upstream - 60 - - - xip_main0_stall_downstream - 61 - - - xip_main0_access_contested - 62 - - - xip_main0_access - 63 - - - rom_stall_upstream - 64 - - - rom_stall_downstream - 65 - - - rom_access_contested - 66 - - - rom_access - 67 - - - - - - - PERFCTR1 - Bus fabric performance counter 1 - 0x14 - 0x00000000 - - - PERFCTR1 - Busfabric saturating performance counter 1 - Count some event signal from the busfabric arbiters, if PERFCTR_EN is set. - Write any value to clear. Select an event to count using PERFSEL1 - [23:0] - read-write - oneToClear - - - - - PERFSEL1 - Bus fabric performance event select for PERFCTR1 - 0x18 - 0x0000001F - - - PERFSEL1 - Select an event for PERFCTR1. For each downstream port of the main crossbar, four events are available: ACCESS, an access took place; ACCESS_CONTESTED, an access took place that previously stalled due to contention from other masters; STALL_DOWNSTREAM, count cycles where any master stalled due to a stall on the downstream bus; STALL_UPSTREAM, count cycles where any master stalled for any reason, including contention from other masters. - [6:0] - read-write - - - siob_proc1_stall_upstream - 0 - - - siob_proc1_stall_downstream - 1 - - - siob_proc1_access_contested - 2 - - - siob_proc1_access - 3 - - - siob_proc0_stall_upstream - 4 - - - siob_proc0_stall_downstream - 5 - - - siob_proc0_access_contested - 6 - - - siob_proc0_access - 7 - - - apb_stall_upstream - 8 - - - apb_stall_downstream - 9 - - - apb_access_contested - 10 - - - apb_access - 11 - - - fastperi_stall_upstream - 12 - - - fastperi_stall_downstream - 13 - - - fastperi_access_contested - 14 - - - fastperi_access - 15 - - - sram9_stall_upstream - 16 - - - sram9_stall_downstream - 17 - - - sram9_access_contested - 18 - - - sram9_access - 19 - - - sram8_stall_upstream - 20 - - - sram8_stall_downstream - 21 - - - sram8_access_contested - 22 - - - sram8_access - 23 - - - sram7_stall_upstream - 24 - - - sram7_stall_downstream - 25 - - - sram7_access_contested - 26 - - - sram7_access - 27 - - - sram6_stall_upstream - 28 - - - sram6_stall_downstream - 29 - - - sram6_access_contested - 30 - - - sram6_access - 31 - - - sram5_stall_upstream - 32 - - - sram5_stall_downstream - 33 - - - sram5_access_contested - 34 - - - sram5_access - 35 - - - sram4_stall_upstream - 36 - - - sram4_stall_downstream - 37 - - - sram4_access_contested - 38 - - - sram4_access - 39 - - - sram3_stall_upstream - 40 - - - sram3_stall_downstream - 41 - - - sram3_access_contested - 42 - - - sram3_access - 43 - - - sram2_stall_upstream - 44 - - - sram2_stall_downstream - 45 - - - sram2_access_contested - 46 - - - sram2_access - 47 - - - sram1_stall_upstream - 48 - - - sram1_stall_downstream - 49 - - - sram1_access_contested - 50 - - - sram1_access - 51 - - - sram0_stall_upstream - 52 - - - sram0_stall_downstream - 53 - - - sram0_access_contested - 54 - - - sram0_access - 55 - - - xip_main1_stall_upstream - 56 - - - xip_main1_stall_downstream - 57 - - - xip_main1_access_contested - 58 - - - xip_main1_access - 59 - - - xip_main0_stall_upstream - 60 - - - xip_main0_stall_downstream - 61 - - - xip_main0_access_contested - 62 - - - xip_main0_access - 63 - - - rom_stall_upstream - 64 - - - rom_stall_downstream - 65 - - - rom_access_contested - 66 - - - rom_access - 67 - - - - - - - PERFCTR2 - Bus fabric performance counter 2 - 0x1C - 0x00000000 - - - PERFCTR2 - Busfabric saturating performance counter 2 - Count some event signal from the busfabric arbiters, if PERFCTR_EN is set. - Write any value to clear. Select an event to count using PERFSEL2 - [23:0] - read-write - oneToClear - - - - - PERFSEL2 - Bus fabric performance event select for PERFCTR2 - 0x20 - 0x0000001F - - - PERFSEL2 - Select an event for PERFCTR2. For each downstream port of the main crossbar, four events are available: ACCESS, an access took place; ACCESS_CONTESTED, an access took place that previously stalled due to contention from other masters; STALL_DOWNSTREAM, count cycles where any master stalled due to a stall on the downstream bus; STALL_UPSTREAM, count cycles where any master stalled for any reason, including contention from other masters. - [6:0] - read-write - - - siob_proc1_stall_upstream - 0 - - - siob_proc1_stall_downstream - 1 - - - siob_proc1_access_contested - 2 - - - siob_proc1_access - 3 - - - siob_proc0_stall_upstream - 4 - - - siob_proc0_stall_downstream - 5 - - - siob_proc0_access_contested - 6 - - - siob_proc0_access - 7 - - - apb_stall_upstream - 8 - - - apb_stall_downstream - 9 - - - apb_access_contested - 10 - - - apb_access - 11 - - - fastperi_stall_upstream - 12 - - - fastperi_stall_downstream - 13 - - - fastperi_access_contested - 14 - - - fastperi_access - 15 - - - sram9_stall_upstream - 16 - - - sram9_stall_downstream - 17 - - - sram9_access_contested - 18 - - - sram9_access - 19 - - - sram8_stall_upstream - 20 - - - sram8_stall_downstream - 21 - - - sram8_access_contested - 22 - - - sram8_access - 23 - - - sram7_stall_upstream - 24 - - - sram7_stall_downstream - 25 - - - sram7_access_contested - 26 - - - sram7_access - 27 - - - sram6_stall_upstream - 28 - - - sram6_stall_downstream - 29 - - - sram6_access_contested - 30 - - - sram6_access - 31 - - - sram5_stall_upstream - 32 - - - sram5_stall_downstream - 33 - - - sram5_access_contested - 34 - - - sram5_access - 35 - - - sram4_stall_upstream - 36 - - - sram4_stall_downstream - 37 - - - sram4_access_contested - 38 - - - sram4_access - 39 - - - sram3_stall_upstream - 40 - - - sram3_stall_downstream - 41 - - - sram3_access_contested - 42 - - - sram3_access - 43 - - - sram2_stall_upstream - 44 - - - sram2_stall_downstream - 45 - - - sram2_access_contested - 46 - - - sram2_access - 47 - - - sram1_stall_upstream - 48 - - - sram1_stall_downstream - 49 - - - sram1_access_contested - 50 - - - sram1_access - 51 - - - sram0_stall_upstream - 52 - - - sram0_stall_downstream - 53 - - - sram0_access_contested - 54 - - - sram0_access - 55 - - - xip_main1_stall_upstream - 56 - - - xip_main1_stall_downstream - 57 - - - xip_main1_access_contested - 58 - - - xip_main1_access - 59 - - - xip_main0_stall_upstream - 60 - - - xip_main0_stall_downstream - 61 - - - xip_main0_access_contested - 62 - - - xip_main0_access - 63 - - - rom_stall_upstream - 64 - - - rom_stall_downstream - 65 - - - rom_access_contested - 66 - - - rom_access - 67 - - - - - - - PERFCTR3 - Bus fabric performance counter 3 - 0x24 - 0x00000000 - - - PERFCTR3 - Busfabric saturating performance counter 3 - Count some event signal from the busfabric arbiters, if PERFCTR_EN is set. - Write any value to clear. Select an event to count using PERFSEL3 - [23:0] - read-write - oneToClear - - - - - PERFSEL3 - Bus fabric performance event select for PERFCTR3 - 0x28 - 0x0000001F - - - PERFSEL3 - Select an event for PERFCTR3. For each downstream port of the main crossbar, four events are available: ACCESS, an access took place; ACCESS_CONTESTED, an access took place that previously stalled due to contention from other masters; STALL_DOWNSTREAM, count cycles where any master stalled due to a stall on the downstream bus; STALL_UPSTREAM, count cycles where any master stalled for any reason, including contention from other masters. - [6:0] - read-write - - - siob_proc1_stall_upstream - 0 - - - siob_proc1_stall_downstream - 1 - - - siob_proc1_access_contested - 2 - - - siob_proc1_access - 3 - - - siob_proc0_stall_upstream - 4 - - - siob_proc0_stall_downstream - 5 - - - siob_proc0_access_contested - 6 - - - siob_proc0_access - 7 - - - apb_stall_upstream - 8 - - - apb_stall_downstream - 9 - - - apb_access_contested - 10 - - - apb_access - 11 - - - fastperi_stall_upstream - 12 - - - fastperi_stall_downstream - 13 - - - fastperi_access_contested - 14 - - - fastperi_access - 15 - - - sram9_stall_upstream - 16 - - - sram9_stall_downstream - 17 - - - sram9_access_contested - 18 - - - sram9_access - 19 - - - sram8_stall_upstream - 20 - - - sram8_stall_downstream - 21 - - - sram8_access_contested - 22 - - - sram8_access - 23 - - - sram7_stall_upstream - 24 - - - sram7_stall_downstream - 25 - - - sram7_access_contested - 26 - - - sram7_access - 27 - - - sram6_stall_upstream - 28 - - - sram6_stall_downstream - 29 - - - sram6_access_contested - 30 - - - sram6_access - 31 - - - sram5_stall_upstream - 32 - - - sram5_stall_downstream - 33 - - - sram5_access_contested - 34 - - - sram5_access - 35 - - - sram4_stall_upstream - 36 - - - sram4_stall_downstream - 37 - - - sram4_access_contested - 38 - - - sram4_access - 39 - - - sram3_stall_upstream - 40 - - - sram3_stall_downstream - 41 - - - sram3_access_contested - 42 - - - sram3_access - 43 - - - sram2_stall_upstream - 44 - - - sram2_stall_downstream - 45 - - - sram2_access_contested - 46 - - - sram2_access - 47 - - - sram1_stall_upstream - 48 - - - sram1_stall_downstream - 49 - - - sram1_access_contested - 50 - - - sram1_access - 51 - - - sram0_stall_upstream - 52 - - - sram0_stall_downstream - 53 - - - sram0_access_contested - 54 - - - sram0_access - 55 - - - xip_main1_stall_upstream - 56 - - - xip_main1_stall_downstream - 57 - - - xip_main1_access_contested - 58 - - - xip_main1_access - 59 - - - xip_main0_stall_upstream - 60 - - - xip_main0_stall_downstream - 61 - - - xip_main0_access_contested - 62 - - - xip_main0_access - 63 - - - rom_stall_upstream - 64 - - - rom_stall_downstream - 65 - - - rom_access_contested - 66 - - - rom_access - 67 - - - - - - - - - SIO - Single-cycle IO block - Provides core-local and inter-core hardware for the two processors, with single-cycle access. - 0xD0000000 - - 0x0 - 0x1E8 - registers - - - SIO_IRQ_FIFO - 25 - - - SIO_IRQ_BELL - 26 - - - SIO_IRQ_FIFO_NS - 27 - - - SIO_IRQ_BELL_NS - 28 - - - SIO_IRQ_MTIMECMP - 29 - - - - CPUID - Processor core identifier - 0x0 - 0x00000000 - - - CPUID - Value is 0 when read from processor core 0, and 1 when read from processor core 1. - [31:0] - read-only - - - - - GPIO_IN - Input value for GPIO0...31. - - In the Non-secure SIO, Secure-only GPIOs (as per ACCESSCTRL) appear as zero. - 0x4 - 0x00000000 - - - GPIO_IN - [31:0] - read-only - - - - - GPIO_HI_IN - Input value on GPIO32...47, QSPI IOs and USB pins - - In the Non-secure SIO, Secure-only GPIOs (as per ACCESSCTRL) appear as zero. - 0x8 - 0x00000000 - - - QSPI_SD - Input value on QSPI SD0 (MOSI), SD1 (MISO), SD2 and SD3 pins - [31:28] - read-only - - - QSPI_CSN - Input value on QSPI CSn pin - [27:27] - read-only - - - QSPI_SCK - Input value on QSPI SCK pin - [26:26] - read-only - - - USB_DM - Input value on USB D- pin - [25:25] - read-only - - - USB_DP - Input value on USB D+ pin - [24:24] - read-only - - - GPIO - Input value on GPIO32...47 - [15:0] - read-only - - - - - GPIO_OUT - GPIO0...31 output value - 0x10 - 0x00000000 - - - GPIO_OUT - Set output level (1/0 -> high/low) for GPIO0...31. Reading back gives the last value written, NOT the input value from the pins. - - If core 0 and core 1 both write to GPIO_OUT simultaneously (or to a SET/CLR/XOR alias), the result is as though the write from core 0 took place first, and the write from core 1 was then applied to that intermediate result. - - In the Non-secure SIO, Secure-only GPIOs (as per ACCESSCTRL) ignore writes, and their output status reads back as zero. This is also true for SET/CLR/XOR aliases of this register. - [31:0] - read-write - - - - - GPIO_HI_OUT - Output value for GPIO32...47, QSPI IOs and USB pins. - - Write to set output level (1/0 -> high/low). Reading back gives the last value written, NOT the input value from the pins. If core 0 and core 1 both write to GPIO_HI_OUT simultaneously (or to a SET/CLR/XOR alias), the result is as though the write from core 0 took place first, and the write from core 1 was then applied to that intermediate result. - - In the Non-secure SIO, Secure-only GPIOs (as per ACCESSCTRL) ignore writes, and their output status reads back as zero. This is also true for SET/CLR/XOR aliases of this register. - 0x14 - 0x00000000 - - - QSPI_SD - Output value for QSPI SD0 (MOSI), SD1 (MISO), SD2 and SD3 pins - [31:28] - read-write - - - QSPI_CSN - Output value for QSPI CSn pin - [27:27] - read-write - - - QSPI_SCK - Output value for QSPI SCK pin - [26:26] - read-write - - - USB_DM - Output value for USB D- pin - [25:25] - read-write - - - USB_DP - Output value for USB D+ pin - [24:24] - read-write - - - GPIO - Output value for GPIO32...47 - [15:0] - read-write - - - - - GPIO_OUT_SET - GPIO0...31 output value set - 0x18 - 0x00000000 - - - GPIO_OUT_SET - Perform an atomic bit-set on GPIO_OUT, i.e. `GPIO_OUT |= wdata` - [31:0] - write-only - - - - - GPIO_HI_OUT_SET - Output value set for GPIO32..47, QSPI IOs and USB pins. - Perform an atomic bit-set on GPIO_HI_OUT, i.e. `GPIO_HI_OUT |= wdata` - 0x1C - 0x00000000 - - - QSPI_SD - [31:28] - write-only - - - QSPI_CSN - [27:27] - write-only - - - QSPI_SCK - [26:26] - write-only - - - USB_DM - [25:25] - write-only - - - USB_DP - [24:24] - write-only - - - GPIO - [15:0] - write-only - - - - - GPIO_OUT_CLR - GPIO0...31 output value clear - 0x20 - 0x00000000 - - - GPIO_OUT_CLR - Perform an atomic bit-clear on GPIO_OUT, i.e. `GPIO_OUT &= ~wdata` - [31:0] - write-only - - - - - GPIO_HI_OUT_CLR - Output value clear for GPIO32..47, QSPI IOs and USB pins. - Perform an atomic bit-clear on GPIO_HI_OUT, i.e. `GPIO_HI_OUT &= ~wdata` - 0x24 - 0x00000000 - - - QSPI_SD - [31:28] - write-only - - - QSPI_CSN - [27:27] - write-only - - - QSPI_SCK - [26:26] - write-only - - - USB_DM - [25:25] - write-only - - - USB_DP - [24:24] - write-only - - - GPIO - [15:0] - write-only - - - - - GPIO_OUT_XOR - GPIO0...31 output value XOR - 0x28 - 0x00000000 - - - GPIO_OUT_XOR - Perform an atomic bitwise XOR on GPIO_OUT, i.e. `GPIO_OUT ^= wdata` - [31:0] - write-only - - - - - GPIO_HI_OUT_XOR - Output value XOR for GPIO32..47, QSPI IOs and USB pins. - Perform an atomic bitwise XOR on GPIO_HI_OUT, i.e. `GPIO_HI_OUT ^= wdata` - 0x2C - 0x00000000 - - - QSPI_SD - [31:28] - write-only - - - QSPI_CSN - [27:27] - write-only - - - QSPI_SCK - [26:26] - write-only - - - USB_DM - [25:25] - write-only - - - USB_DP - [24:24] - write-only - - - GPIO - [15:0] - write-only - - - - - GPIO_OE - GPIO0...31 output enable - 0x30 - 0x00000000 - - - GPIO_OE - Set output enable (1/0 -> output/input) for GPIO0...31. Reading back gives the last value written. - - If core 0 and core 1 both write to GPIO_OE simultaneously (or to a SET/CLR/XOR alias), the result is as though the write from core 0 took place first, and the write from core 1 was then applied to that intermediate result. - - In the Non-secure SIO, Secure-only GPIOs (as per ACCESSCTRL) ignore writes, and their output status reads back as zero. This is also true for SET/CLR/XOR aliases of this register. - [31:0] - read-write - - - - - GPIO_HI_OE - Output enable value for GPIO32...47, QSPI IOs and USB pins. - - Write output enable (1/0 -> output/input). Reading back gives the last value written. If core 0 and core 1 both write to GPIO_HI_OE simultaneously (or to a SET/CLR/XOR alias), the result is as though the write from core 0 took place first, and the write from core 1 was then applied to that intermediate result. - - In the Non-secure SIO, Secure-only GPIOs (as per ACCESSCTRL) ignore writes, and their output status reads back as zero. This is also true for SET/CLR/XOR aliases of this register. - 0x34 - 0x00000000 - - - QSPI_SD - Output enable value for QSPI SD0 (MOSI), SD1 (MISO), SD2 and SD3 pins - [31:28] - read-write - - - QSPI_CSN - Output enable value for QSPI CSn pin - [27:27] - read-write - - - QSPI_SCK - Output enable value for QSPI SCK pin - [26:26] - read-write - - - USB_DM - Output enable value for USB D- pin - [25:25] - read-write - - - USB_DP - Output enable value for USB D+ pin - [24:24] - read-write - - - GPIO - Output enable value for GPIO32...47 - [15:0] - read-write - - - - - GPIO_OE_SET - GPIO0...31 output enable set - 0x38 - 0x00000000 - - - GPIO_OE_SET - Perform an atomic bit-set on GPIO_OE, i.e. `GPIO_OE |= wdata` - [31:0] - write-only - - - - - GPIO_HI_OE_SET - Output enable set for GPIO32...47, QSPI IOs and USB pins. - Perform an atomic bit-set on GPIO_HI_OE, i.e. `GPIO_HI_OE |= wdata` - 0x3C - 0x00000000 - - - QSPI_SD - [31:28] - write-only - - - QSPI_CSN - [27:27] - write-only - - - QSPI_SCK - [26:26] - write-only - - - USB_DM - [25:25] - write-only - - - USB_DP - [24:24] - write-only - - - GPIO - [15:0] - write-only - - - - - GPIO_OE_CLR - GPIO0...31 output enable clear - 0x40 - 0x00000000 - - - GPIO_OE_CLR - Perform an atomic bit-clear on GPIO_OE, i.e. `GPIO_OE &= ~wdata` - [31:0] - write-only - - - - - GPIO_HI_OE_CLR - Output enable clear for GPIO32...47, QSPI IOs and USB pins. - Perform an atomic bit-clear on GPIO_HI_OE, i.e. `GPIO_HI_OE &= ~wdata` - 0x44 - 0x00000000 - - - QSPI_SD - [31:28] - write-only - - - QSPI_CSN - [27:27] - write-only - - - QSPI_SCK - [26:26] - write-only - - - USB_DM - [25:25] - write-only - - - USB_DP - [24:24] - write-only - - - GPIO - [15:0] - write-only - - - - - GPIO_OE_XOR - GPIO0...31 output enable XOR - 0x48 - 0x00000000 - - - GPIO_OE_XOR - Perform an atomic bitwise XOR on GPIO_OE, i.e. `GPIO_OE ^= wdata` - [31:0] - write-only - - - - - GPIO_HI_OE_XOR - Output enable XOR for GPIO32...47, QSPI IOs and USB pins. - Perform an atomic bitwise XOR on GPIO_HI_OE, i.e. `GPIO_HI_OE ^= wdata` - 0x4C - 0x00000000 - - - QSPI_SD - [31:28] - write-only - - - QSPI_CSN - [27:27] - write-only - - - QSPI_SCK - [26:26] - write-only - - - USB_DM - [25:25] - write-only - - - USB_DP - [24:24] - write-only - - - GPIO - [15:0] - write-only - - - - - FIFO_ST - Status register for inter-core FIFOs (mailboxes). - There is one FIFO in the core 0 -> core 1 direction, and one core 1 -> core 0. Both are 32 bits wide and 8 words deep. - Core 0 can see the read side of the 1->0 FIFO (RX), and the write side of 0->1 FIFO (TX). - Core 1 can see the read side of the 0->1 FIFO (RX), and the write side of 1->0 FIFO (TX). - The SIO IRQ for each core is the logical OR of the VLD, WOF and ROE fields of its FIFO_ST register. - 0x50 - 0x00000002 - - - ROE - Sticky flag indicating the RX FIFO was read when empty. This read was ignored by the FIFO. - [3:3] - read-write - oneToClear - - - WOF - Sticky flag indicating the TX FIFO was written when full. This write was ignored by the FIFO. - [2:2] - read-write - oneToClear - - - RDY - Value is 1 if this core's TX FIFO is not full (i.e. if FIFO_WR is ready for more data) - [1:1] - read-only - - - VLD - Value is 1 if this core's RX FIFO is not empty (i.e. if FIFO_RD is valid) - [0:0] - read-only - - - - - FIFO_WR - Write access to this core's TX FIFO - 0x54 - 0x00000000 - - - FIFO_WR - [31:0] - write-only - - - - - FIFO_RD - Read access to this core's RX FIFO - 0x58 - 0x00000000 - - - FIFO_RD - [31:0] - read-only - modify - - - - - SPINLOCK_ST - Spinlock state - A bitmap containing the state of all 32 spinlocks (1=locked). - Mainly intended for debugging. - 0x5C - 0x00000000 - - - SPINLOCK_ST - [31:0] - read-only - - - - - INTERP0_ACCUM0 - Read/write access to accumulator 0 - 0x80 - 0x00000000 - - - INTERP0_ACCUM0 - [31:0] - read-write - - - - - INTERP0_ACCUM1 - Read/write access to accumulator 1 - 0x84 - 0x00000000 - - - INTERP0_ACCUM1 - [31:0] - read-write - - - - - INTERP0_BASE0 - Read/write access to BASE0 register. - 0x88 - 0x00000000 - - - INTERP0_BASE0 - [31:0] - read-write - - - - - INTERP0_BASE1 - Read/write access to BASE1 register. - 0x8C - 0x00000000 - - - INTERP0_BASE1 - [31:0] - read-write - - - - - INTERP0_BASE2 - Read/write access to BASE2 register. - 0x90 - 0x00000000 - - - INTERP0_BASE2 - [31:0] - read-write - - - - - INTERP0_POP_LANE0 - Read LANE0 result, and simultaneously write lane results to both accumulators (POP). - 0x94 - 0x00000000 - - - INTERP0_POP_LANE0 - [31:0] - read-only - - - - - INTERP0_POP_LANE1 - Read LANE1 result, and simultaneously write lane results to both accumulators (POP). - 0x98 - 0x00000000 - - - INTERP0_POP_LANE1 - [31:0] - read-only - - - - - INTERP0_POP_FULL - Read FULL result, and simultaneously write lane results to both accumulators (POP). - 0x9C - 0x00000000 - - - INTERP0_POP_FULL - [31:0] - read-only - - - - - INTERP0_PEEK_LANE0 - Read LANE0 result, without altering any internal state (PEEK). - 0xA0 - 0x00000000 - - - INTERP0_PEEK_LANE0 - [31:0] - read-only - - - - - INTERP0_PEEK_LANE1 - Read LANE1 result, without altering any internal state (PEEK). - 0xA4 - 0x00000000 - - - INTERP0_PEEK_LANE1 - [31:0] - read-only - - - - - INTERP0_PEEK_FULL - Read FULL result, without altering any internal state (PEEK). - 0xA8 - 0x00000000 - - - INTERP0_PEEK_FULL - [31:0] - read-only - - - - - INTERP0_CTRL_LANE0 - Control register for lane 0 - 0xAC - 0x00000000 - - - OVERF - Set if either OVERF0 or OVERF1 is set. - [25:25] - read-only - - - OVERF1 - Indicates if any masked-off MSBs in ACCUM1 are set. - [24:24] - read-only - - - OVERF0 - Indicates if any masked-off MSBs in ACCUM0 are set. - [23:23] - read-only - - - BLEND - Only present on INTERP0 on each core. If BLEND mode is enabled: - - LANE1 result is a linear interpolation between BASE0 and BASE1, controlled - by the 8 LSBs of lane 1 shift and mask value (a fractional number between - 0 and 255/256ths) - - LANE0 result does not have BASE0 added (yields only the 8 LSBs of lane 1 shift+mask value) - - FULL result does not have lane 1 shift+mask value added (BASE2 + lane 0 shift+mask) - LANE1 SIGNED flag controls whether the interpolation is signed or unsigned. - [21:21] - read-write - - - FORCE_MSB - ORed into bits 29:28 of the lane result presented to the processor on the bus. - No effect on the internal 32-bit datapath. Handy for using a lane to generate sequence - of pointers into flash or SRAM. - [20:19] - read-write - - - ADD_RAW - If 1, mask + shift is bypassed for LANE0 result. This does not affect FULL result. - [18:18] - read-write - - - CROSS_RESULT - If 1, feed the opposite lane's result into this lane's accumulator on POP. - [17:17] - read-write - - - CROSS_INPUT - If 1, feed the opposite lane's accumulator into this lane's shift + mask hardware. - Takes effect even if ADD_RAW is set (the CROSS_INPUT mux is before the shift+mask bypass) - [16:16] - read-write - - - SIGNED - If SIGNED is set, the shifted and masked accumulator value is sign-extended to 32 bits - before adding to BASE0, and LANE0 PEEK/POP appear extended to 32 bits when read by processor. - [15:15] - read-write - - - MASK_MSB - The most-significant bit allowed to pass by the mask (inclusive) - Setting MSB < LSB may cause chip to turn inside-out - [14:10] - read-write - - - MASK_LSB - The least-significant bit allowed to pass by the mask (inclusive) - [9:5] - read-write - - - SHIFT - Right-rotate applied to accumulator before masking. By appropriately configuring the masks, left and right shifts can be synthesised. - [4:0] - read-write - - - - - INTERP0_CTRL_LANE1 - Control register for lane 1 - 0xB0 - 0x00000000 - - - FORCE_MSB - ORed into bits 29:28 of the lane result presented to the processor on the bus. - No effect on the internal 32-bit datapath. Handy for using a lane to generate sequence - of pointers into flash or SRAM. - [20:19] - read-write - - - ADD_RAW - If 1, mask + shift is bypassed for LANE1 result. This does not affect FULL result. - [18:18] - read-write - - - CROSS_RESULT - If 1, feed the opposite lane's result into this lane's accumulator on POP. - [17:17] - read-write - - - CROSS_INPUT - If 1, feed the opposite lane's accumulator into this lane's shift + mask hardware. - Takes effect even if ADD_RAW is set (the CROSS_INPUT mux is before the shift+mask bypass) - [16:16] - read-write - - - SIGNED - If SIGNED is set, the shifted and masked accumulator value is sign-extended to 32 bits - before adding to BASE1, and LANE1 PEEK/POP appear extended to 32 bits when read by processor. - [15:15] - read-write - - - MASK_MSB - The most-significant bit allowed to pass by the mask (inclusive) - Setting MSB < LSB may cause chip to turn inside-out - [14:10] - read-write - - - MASK_LSB - The least-significant bit allowed to pass by the mask (inclusive) - [9:5] - read-write - - - SHIFT - Right-rotate applied to accumulator before masking. By appropriately configuring the masks, left and right shifts can be synthesised. - [4:0] - read-write - - - - - INTERP0_ACCUM0_ADD - Values written here are atomically added to ACCUM0 - Reading yields lane 0's raw shift and mask value (BASE0 not added). - 0xB4 - 0x00000000 - - - INTERP0_ACCUM0_ADD - [23:0] - read-write - - - - - INTERP0_ACCUM1_ADD - Values written here are atomically added to ACCUM1 - Reading yields lane 1's raw shift and mask value (BASE1 not added). - 0xB8 - 0x00000000 - - - INTERP0_ACCUM1_ADD - [23:0] - read-write - - - - - INTERP0_BASE_1AND0 - On write, the lower 16 bits go to BASE0, upper bits to BASE1 simultaneously. - Each half is sign-extended to 32 bits if that lane's SIGNED flag is set. - 0xBC - 0x00000000 - - - INTERP0_BASE_1AND0 - [31:0] - write-only - - - - - INTERP1_ACCUM0 - Read/write access to accumulator 0 - 0xC0 - 0x00000000 - - - INTERP1_ACCUM0 - [31:0] - read-write - - - - - INTERP1_ACCUM1 - Read/write access to accumulator 1 - 0xC4 - 0x00000000 - - - INTERP1_ACCUM1 - [31:0] - read-write - - - - - INTERP1_BASE0 - Read/write access to BASE0 register. - 0xC8 - 0x00000000 - - - INTERP1_BASE0 - [31:0] - read-write - - - - - INTERP1_BASE1 - Read/write access to BASE1 register. - 0xCC - 0x00000000 - - - INTERP1_BASE1 - [31:0] - read-write - - - - - INTERP1_BASE2 - Read/write access to BASE2 register. - 0xD0 - 0x00000000 - - - INTERP1_BASE2 - [31:0] - read-write - - - - - INTERP1_POP_LANE0 - Read LANE0 result, and simultaneously write lane results to both accumulators (POP). - 0xD4 - 0x00000000 - - - INTERP1_POP_LANE0 - [31:0] - read-only - - - - - INTERP1_POP_LANE1 - Read LANE1 result, and simultaneously write lane results to both accumulators (POP). - 0xD8 - 0x00000000 - - - INTERP1_POP_LANE1 - [31:0] - read-only - - - - - INTERP1_POP_FULL - Read FULL result, and simultaneously write lane results to both accumulators (POP). - 0xDC - 0x00000000 - - - INTERP1_POP_FULL - [31:0] - read-only - - - - - INTERP1_PEEK_LANE0 - Read LANE0 result, without altering any internal state (PEEK). - 0xE0 - 0x00000000 - - - INTERP1_PEEK_LANE0 - [31:0] - read-only - - - - - INTERP1_PEEK_LANE1 - Read LANE1 result, without altering any internal state (PEEK). - 0xE4 - 0x00000000 - - - INTERP1_PEEK_LANE1 - [31:0] - read-only - - - - - INTERP1_PEEK_FULL - Read FULL result, without altering any internal state (PEEK). - 0xE8 - 0x00000000 - - - INTERP1_PEEK_FULL - [31:0] - read-only - - - - - INTERP1_CTRL_LANE0 - Control register for lane 0 - 0xEC - 0x00000000 - - - OVERF - Set if either OVERF0 or OVERF1 is set. - [25:25] - read-only - - - OVERF1 - Indicates if any masked-off MSBs in ACCUM1 are set. - [24:24] - read-only - - - OVERF0 - Indicates if any masked-off MSBs in ACCUM0 are set. - [23:23] - read-only - - - CLAMP - Only present on INTERP1 on each core. If CLAMP mode is enabled: - - LANE0 result is shifted and masked ACCUM0, clamped by a lower bound of - BASE0 and an upper bound of BASE1. - - Signedness of these comparisons is determined by LANE0_CTRL_SIGNED - [22:22] - read-write - - - FORCE_MSB - ORed into bits 29:28 of the lane result presented to the processor on the bus. - No effect on the internal 32-bit datapath. Handy for using a lane to generate sequence - of pointers into flash or SRAM. - [20:19] - read-write - - - ADD_RAW - If 1, mask + shift is bypassed for LANE0 result. This does not affect FULL result. - [18:18] - read-write - - - CROSS_RESULT - If 1, feed the opposite lane's result into this lane's accumulator on POP. - [17:17] - read-write - - - CROSS_INPUT - If 1, feed the opposite lane's accumulator into this lane's shift + mask hardware. - Takes effect even if ADD_RAW is set (the CROSS_INPUT mux is before the shift+mask bypass) - [16:16] - read-write - - - SIGNED - If SIGNED is set, the shifted and masked accumulator value is sign-extended to 32 bits - before adding to BASE0, and LANE0 PEEK/POP appear extended to 32 bits when read by processor. - [15:15] - read-write - - - MASK_MSB - The most-significant bit allowed to pass by the mask (inclusive) - Setting MSB < LSB may cause chip to turn inside-out - [14:10] - read-write - - - MASK_LSB - The least-significant bit allowed to pass by the mask (inclusive) - [9:5] - read-write - - - SHIFT - Right-rotate applied to accumulator before masking. By appropriately configuring the masks, left and right shifts can be synthesised. - [4:0] - read-write - - - - - INTERP1_CTRL_LANE1 - Control register for lane 1 - 0xF0 - 0x00000000 - - - FORCE_MSB - ORed into bits 29:28 of the lane result presented to the processor on the bus. - No effect on the internal 32-bit datapath. Handy for using a lane to generate sequence - of pointers into flash or SRAM. - [20:19] - read-write - - - ADD_RAW - If 1, mask + shift is bypassed for LANE1 result. This does not affect FULL result. - [18:18] - read-write - - - CROSS_RESULT - If 1, feed the opposite lane's result into this lane's accumulator on POP. - [17:17] - read-write - - - CROSS_INPUT - If 1, feed the opposite lane's accumulator into this lane's shift + mask hardware. - Takes effect even if ADD_RAW is set (the CROSS_INPUT mux is before the shift+mask bypass) - [16:16] - read-write - - - SIGNED - If SIGNED is set, the shifted and masked accumulator value is sign-extended to 32 bits - before adding to BASE1, and LANE1 PEEK/POP appear extended to 32 bits when read by processor. - [15:15] - read-write - - - MASK_MSB - The most-significant bit allowed to pass by the mask (inclusive) - Setting MSB < LSB may cause chip to turn inside-out - [14:10] - read-write - - - MASK_LSB - The least-significant bit allowed to pass by the mask (inclusive) - [9:5] - read-write - - - SHIFT - Right-rotate applied to accumulator before masking. By appropriately configuring the masks, left and right shifts can be synthesised. - [4:0] - read-write - - - - - INTERP1_ACCUM0_ADD - Values written here are atomically added to ACCUM0 - Reading yields lane 0's raw shift and mask value (BASE0 not added). - 0xF4 - 0x00000000 - - - INTERP1_ACCUM0_ADD - [23:0] - read-write - - - - - INTERP1_ACCUM1_ADD - Values written here are atomically added to ACCUM1 - Reading yields lane 1's raw shift and mask value (BASE1 not added). - 0xF8 - 0x00000000 - - - INTERP1_ACCUM1_ADD - [23:0] - read-write - - - - - INTERP1_BASE_1AND0 - On write, the lower 16 bits go to BASE0, upper bits to BASE1 simultaneously. - Each half is sign-extended to 32 bits if that lane's SIGNED flag is set. - 0xFC - 0x00000000 - - - INTERP1_BASE_1AND0 - [31:0] - write-only - - - - - 32 - 0x4 - 0-31 - SPINLOCK%s - Reading from a spinlock address will: - - Return 0 if lock is already locked - - Otherwise return nonzero, and simultaneously claim the lock - - Writing (any value) releases the lock. - If core 0 and core 1 attempt to claim the same lock simultaneously, core 0 wins. - The value returned on success is 0x1 << lock number. - 0x100 - read-write - 0x00000000 - - - SPINLOCK0 - [31:0] - read-write - modify - - - - - DOORBELL_OUT_SET - Trigger a doorbell interrupt on the opposite core. - - Write 1 to a bit to set the corresponding bit in DOORBELL_IN on the opposite core. This raises the opposite core's doorbell interrupt. - - Read to get the status of the doorbells currently asserted on the opposite core. This is equivalent to that core reading its own DOORBELL_IN status. - 0x180 - 0x00000000 - - - DOORBELL_OUT_SET - [7:0] - read-write - - - - - DOORBELL_OUT_CLR - Clear doorbells which have been posted to the opposite core. This register is intended for debugging and initialisation purposes. - - Writing 1 to a bit in DOORBELL_OUT_CLR clears the corresponding bit in DOORBELL_IN on the opposite core. Clearing all bits will cause that core's doorbell interrupt to deassert. Since the usual order of events is for software to send events using DOORBELL_OUT_SET, and acknowledge incoming events by writing to DOORBELL_IN_CLR, this register should be used with caution to avoid race conditions. - - Reading returns the status of the doorbells currently asserted on the other core, i.e. is equivalent to that core reading its own DOORBELL_IN status. - 0x184 - 0x00000000 - - - DOORBELL_OUT_CLR - [7:0] - read-write - oneToClear - - - - - DOORBELL_IN_SET - Write 1s to trigger doorbell interrupts on this core. Read to get status of doorbells currently asserted on this core. - 0x188 - 0x00000000 - - - DOORBELL_IN_SET - [7:0] - read-write - - - - - DOORBELL_IN_CLR - Check and acknowledge doorbells posted to this core. This core's doorbell interrupt is asserted when any bit in this register is 1. - - Write 1 to each bit to clear that bit. The doorbell interrupt deasserts once all bits are cleared. Read to get status of doorbells currently asserted on this core. - 0x18C - 0x00000000 - - - DOORBELL_IN_CLR - [7:0] - read-write - oneToClear - - - - - PERI_NONSEC - Detach certain core-local peripherals from Secure SIO, and attach them to Non-secure SIO, so that Non-secure software can use them. Attempting to access one of these peripherals from the Secure SIO when it is attached to the Non-secure SIO, or vice versa, will generate a bus error. - - This register is per-core, and is only present on the Secure SIO. - - Most SIO hardware is duplicated across the Secure and Non-secure SIO, so is not listed in this register. - 0x190 - 0x00000000 - - - TMDS - IF 1, detach TMDS encoder (of this core) from the Secure SIO, and attach to the Non-secure SIO. - [5:5] - read-write - - - INTERP1 - If 1, detach interpolator 1 (of this core) from the Secure SIO, and attach to the Non-secure SIO. - [1:1] - read-write - - - INTERP0 - If 1, detach interpolator 0 (of this core) from the Secure SIO, and attach to the Non-secure SIO. - [0:0] - read-write - - - - - RISCV_SOFTIRQ - Control the assertion of the standard software interrupt (MIP.MSIP) on the RISC-V cores. - - Unlike the RISC-V timer, this interrupt is not routed to a normal system-level interrupt line, so can not be used by the Arm cores. - - It is safe for both cores to write to this register on the same cycle. The set/clear effect is accumulated across both cores, and then applied. If a flag is both set and cleared on the same cycle, only the set takes effect. - 0x1A0 - 0x00000000 - - - CORE1_CLR - Write 1 to atomically clear the core 1 software interrupt flag. Read to get the status of this flag. - [9:9] - read-write - - - CORE0_CLR - Write 1 to atomically clear the core 0 software interrupt flag. Read to get the status of this flag. - [8:8] - read-write - - - CORE1_SET - Write 1 to atomically set the core 1 software interrupt flag. Read to get the status of this flag. - [1:1] - read-write - - - CORE0_SET - Write 1 to atomically set the core 0 software interrupt flag. Read to get the status of this flag. - [0:0] - read-write - - - - - MTIME_CTRL - Control register for the RISC-V 64-bit Machine-mode timer. This timer is only present in the Secure SIO, so is only accessible to an Arm core in Secure mode or a RISC-V core in Machine mode. - - Note whilst this timer follows the RISC-V privileged specification, it is equally usable by the Arm cores. The interrupts are routed to normal system-level interrupt lines as well as to the MIP.MTIP inputs on the RISC-V cores. - 0x1A4 - 0x0000000D - - - DBGPAUSE_CORE1 - If 1, the timer pauses when core 1 is in the debug halt state. - [3:3] - read-write - - - DBGPAUSE_CORE0 - If 1, the timer pauses when core 0 is in the debug halt state. - [2:2] - read-write - - - FULLSPEED - If 1, increment the timer every cycle (i.e. run directly from the system clock), rather than incrementing on the system-level timer tick input. - [1:1] - read-write - - - EN - Timer enable bit. When 0, the timer will not increment automatically. - [0:0] - read-write - - - - - MTIME - Read/write access to the high half of RISC-V Machine-mode timer. This register is shared between both cores. If both cores write on the same cycle, core 1 takes precedence. - 0x1B0 - 0x00000000 - - - MTIME - [31:0] - read-write - - - - - MTIMEH - Read/write access to the high half of RISC-V Machine-mode timer. This register is shared between both cores. If both cores write on the same cycle, core 1 takes precedence. - 0x1B4 - 0x00000000 - - - MTIMEH - [31:0] - read-write - - - - - MTIMECMP - Low half of RISC-V Machine-mode timer comparator. This register is core-local, i.e., each core gets a copy of this register, with the comparison result routed to its own interrupt line. - - The timer interrupt is asserted whenever MTIME is greater than or equal to MTIMECMP. This comparison is unsigned, and performed on the full 64-bit values. - 0x1B8 - 0xFFFFFFFF - - - MTIMECMP - [31:0] - read-write - - - - - MTIMECMPH - High half of RISC-V Machine-mode timer comparator. This register is core-local. - - The timer interrupt is asserted whenever MTIME is greater than or equal to MTIMECMP. This comparison is unsigned, and performed on the full 64-bit values. - 0x1BC - 0xFFFFFFFF - - - MTIMECMPH - [31:0] - read-write - - - - - TMDS_CTRL - Control register for TMDS encoder. - 0x1C0 - 0x00000000 - - - CLEAR_BALANCE - Clear the running DC balance state of the TMDS encoders. This bit should be written once at the beginning of each scanline. - [28:28] - write-only - - - PIX2_NOSHIFT - When encoding two pixels's worth of symbols in one cycle (a read of a PEEK/POP_DOUBLE register), the second encoder sees a shifted version of the colour data register. - - This control disables that shift, so that both encoder layers see the same pixel data. This is used for pixel doubling. - [27:27] - read-write - - - PIX_SHIFT - Shift applied to the colour data register with each read of a POP alias register. - - Reading from the POP_SINGLE register, or reading from the POP_DOUBLE register with PIX2_NOSHIFT set (for pixel doubling), shifts by the indicated amount. - - Reading from a POP_DOUBLE register when PIX2_NOSHIFT is clear will shift by double the indicated amount. (Shift by 32 means no shift.) - [26:24] - read-write - - - 0 - Do not shift the colour data register. - 0 - - - 1 - Shift the colour data register by 1 bit - 1 - - - 2 - Shift the colour data register by 2 bits - 2 - - - 4 - Shift the colour data register by 4 bits - 3 - - - 8 - Shift the colour data register by 8 bits - 4 - - - 16 - Shift the colour data register by 16 bits - 5 - - - - - INTERLEAVE - Enable lane interleaving for reads of PEEK_SINGLE/POP_SINGLE. - - When interleaving is disabled, each of the 3 symbols appears as a contiguous 10-bit field, with lane 0 being the least-significant and starting at bit 0 of the register. - - When interleaving is enabled, the symbols are packed into 5 chunks of 3 lanes times 2 bits (30 bits total). Each chunk contains two bits of a TMDS symbol per lane, with lane 0 being the least significant. - [23:23] - read-write - - - L2_NBITS - Number of valid colour MSBs for lane 2 (1-8 bits, encoded as 0 through 7). Remaining LSBs are masked to 0 after the rotate. - [20:18] - read-write - - - L1_NBITS - Number of valid colour MSBs for lane 1 (1-8 bits, encoded as 0 through 7). Remaining LSBs are masked to 0 after the rotate. - [17:15] - read-write - - - L0_NBITS - Number of valid colour MSBs for lane 0 (1-8 bits, encoded as 0 through 7). Remaining LSBs are masked to 0 after the rotate. - [14:12] - read-write - - - L2_ROT - Right-rotate the 16 LSBs of the colour accumulator by 0-15 bits, in order to get the MSB of the lane 2 (red) colour data aligned with the MSB of the 8-bit encoder input. - - For example, for RGB565 (red most significant), red is bits 15:11, so should be right-rotated by 8 bits to align with bits 7:3 of the encoder input. - [11:8] - read-write - - - L1_ROT - Right-rotate the 16 LSBs of the colour accumulator by 0-15 bits, in order to get the MSB of the lane 1 (green) colour data aligned with the MSB of the 8-bit encoder input. - - For example, for RGB565, green is bits 10:5, so should be right-rotated by 3 bits to align with bits 7:2 of the encoder input. - [7:4] - read-write - - - L0_ROT - Right-rotate the 16 LSBs of the colour accumulator by 0-15 bits, in order to get the MSB of the lane 0 (blue) colour data aligned with the MSB of the 8-bit encoder input. - - For example, for RGB565 (red most significant), blue is bits 4:0, so should be right-rotated by 13 to align with bits 7:3 of the encoder input. - [3:0] - read-write - - - - - TMDS_WDATA - Write-only access to the TMDS colour data register. - 0x1C4 - 0x00000000 - - - TMDS_WDATA - [31:0] - write-only - - - - - TMDS_PEEK_SINGLE - Get the encoding of one pixel's worth of colour data, packed into a 32-bit value (3x10-bit symbols). - - The PEEK alias does not shift the colour register when read, but still advances the running DC balance state of each encoder. This is useful for pixel doubling. - 0x1C8 - 0x00000000 - - - TMDS_PEEK_SINGLE - [31:0] - read-only - modify - - - - - TMDS_POP_SINGLE - Get the encoding of one pixel's worth of colour data, packed into a 32-bit value. The packing is 5 chunks of 3 lanes times 2 bits (30 bits total). Each chunk contains two bits of a TMDS symbol per lane. This format is intended for shifting out with the HSTX peripheral on RP2350. - - The POP alias shifts the colour register when read, as well as advancing the running DC balance state of each encoder. - 0x1CC - 0x00000000 - - - TMDS_POP_SINGLE - [31:0] - read-only - modify - - - - - TMDS_PEEK_DOUBLE_L0 - Get lane 0 of the encoding of two pixels' worth of colour data. Two 10-bit TMDS symbols are packed at the bottom of a 32-bit word. - - The PEEK alias does not shift the colour register when read, but still advances the lane 0 DC balance state. This is useful if all 3 lanes' worth of encode are to be read at once, rather than processing the entire scanline for one lane before moving to the next lane. - 0x1D0 - 0x00000000 - - - TMDS_PEEK_DOUBLE_L0 - [31:0] - read-only - modify - - - - - TMDS_POP_DOUBLE_L0 - Get lane 0 of the encoding of two pixels' worth of colour data. Two 10-bit TMDS symbols are packed at the bottom of a 32-bit word. - - The POP alias shifts the colour register when read, according to the values of PIX_SHIFT and PIX2_NOSHIFT. - 0x1D4 - 0x00000000 - - - TMDS_POP_DOUBLE_L0 - [31:0] - read-only - modify - - - - - TMDS_PEEK_DOUBLE_L1 - Get lane 1 of the encoding of two pixels' worth of colour data. Two 10-bit TMDS symbols are packed at the bottom of a 32-bit word. - - The PEEK alias does not shift the colour register when read, but still advances the lane 1 DC balance state. This is useful if all 3 lanes' worth of encode are to be read at once, rather than processing the entire scanline for one lane before moving to the next lane. - 0x1D8 - 0x00000000 - - - TMDS_PEEK_DOUBLE_L1 - [31:0] - read-only - modify - - - - - TMDS_POP_DOUBLE_L1 - Get lane 1 of the encoding of two pixels' worth of colour data. Two 10-bit TMDS symbols are packed at the bottom of a 32-bit word. - - The POP alias shifts the colour register when read, according to the values of PIX_SHIFT and PIX2_NOSHIFT. - 0x1DC - 0x00000000 - - - TMDS_POP_DOUBLE_L1 - [31:0] - read-only - modify - - - - - TMDS_PEEK_DOUBLE_L2 - Get lane 2 of the encoding of two pixels' worth of colour data. Two 10-bit TMDS symbols are packed at the bottom of a 32-bit word. - - The PEEK alias does not shift the colour register when read, but still advances the lane 2 DC balance state. This is useful if all 3 lanes' worth of encode are to be read at once, rather than processing the entire scanline for one lane before moving to the next lane. - 0x1E0 - 0x00000000 - - - TMDS_PEEK_DOUBLE_L2 - [31:0] - read-only - modify - - - - - TMDS_POP_DOUBLE_L2 - Get lane 2 of the encoding of two pixels' worth of colour data. Two 10-bit TMDS symbols are packed at the bottom of a 32-bit word. - - The POP alias shifts the colour register when read, according to the values of PIX_SHIFT and PIX2_NOSHIFT. - 0x1E4 - 0x00000000 - - - TMDS_POP_DOUBLE_L2 - [31:0] - read-only - modify - - - - - - - SIO_NS - 0xD0020000 - - - BOOTRAM - Additional registers mapped adjacent to the bootram, for use by the bootrom. - 0x400E0000 - - 0x0 - 0x82C - registers - - - - WRITE_ONCE0 - This registers always ORs writes into its current contents. Once a bit is set, it can only be cleared by a reset. - 0x800 - 0x00000000 - - - WRITE_ONCE0 - [31:0] - read-write - - - - - WRITE_ONCE1 - This registers always ORs writes into its current contents. Once a bit is set, it can only be cleared by a reset. - 0x804 - 0x00000000 - - - WRITE_ONCE1 - [31:0] - read-write - - - - - BOOTLOCK_STAT - Bootlock status register. 1=unclaimed, 0=claimed. These locks function identically to the SIO spinlocks, but are reserved for bootrom use. - 0x808 - 0x000000FF - - - BOOTLOCK_STAT - [7:0] - read-write - - - - - BOOTLOCK0 - Read to claim and check. Write to unclaim. The value returned on successful claim is 1 << n, and on failed claim is zero. - 0x80C - 0x00000000 - - - BOOTLOCK0 - [31:0] - read-write - - - - - BOOTLOCK1 - Read to claim and check. Write to unclaim. The value returned on successful claim is 1 << n, and on failed claim is zero. - 0x810 - 0x00000000 - - - BOOTLOCK1 - [31:0] - read-write - - - - - BOOTLOCK2 - Read to claim and check. Write to unclaim. The value returned on successful claim is 1 << n, and on failed claim is zero. - 0x814 - 0x00000000 - - - BOOTLOCK2 - [31:0] - read-write - - - - - BOOTLOCK3 - Read to claim and check. Write to unclaim. The value returned on successful claim is 1 << n, and on failed claim is zero. - 0x818 - 0x00000000 - - - BOOTLOCK3 - [31:0] - read-write - - - - - BOOTLOCK4 - Read to claim and check. Write to unclaim. The value returned on successful claim is 1 << n, and on failed claim is zero. - 0x81C - 0x00000000 - - - BOOTLOCK4 - [31:0] - read-write - - - - - BOOTLOCK5 - Read to claim and check. Write to unclaim. The value returned on successful claim is 1 << n, and on failed claim is zero. - 0x820 - 0x00000000 - - - BOOTLOCK5 - [31:0] - read-write - - - - - BOOTLOCK6 - Read to claim and check. Write to unclaim. The value returned on successful claim is 1 << n, and on failed claim is zero. - 0x824 - 0x00000000 - - - BOOTLOCK6 - [31:0] - read-write - - - - - BOOTLOCK7 - Read to claim and check. Write to unclaim. The value returned on successful claim is 1 << n, and on failed claim is zero. - 0x828 - 0x00000000 - - - BOOTLOCK7 - [31:0] - read-write - - - - - - - CORESIGHT_TRACE - Coresight block - RP specific registers - 0x50700000 - - 0x0 - 0x8 - registers - - - - CTRL_STATUS - Control and status register - 0x0 - 0x00000001 - - - TRACE_CAPTURE_FIFO_OVERFLOW - This status flag is set high when trace data has been dropped due to the FIFO being full at the point trace data was sampled. Write 1 to acknowledge and clear the bit. - [1:1] - read-write - - - TRACE_CAPTURE_FIFO_FLUSH - Set to 1 to continuously hold the trace FIFO in a flushed state and prevent overflow. - - Before clearing this flag, configure and start a DMA channel with the correct DREQ for the TRACE_CAPTURE_FIFO register. - - Clear this flag to begin sampling trace data, and set once again once the trace capture buffer is full. You must configure the TPIU in order to generate trace packets to be captured, as well as components like the ETM further upstream to generate the event stream propagated to the TPIU. - [0:0] - read-write - - - - - TRACE_CAPTURE_FIFO - FIFO for trace data captured from the TPIU - 0x4 - 0x00000000 - - - RDATA - Read from an 8 x 32-bit FIFO containing trace data captured from the TPIU. - - Hardware pushes to the FIFO on rising edges of clk_sys, when either of the following is true: - - * TPIU TRACECTL output is low (normal trace data) - - * TPIU TRACETCL output is high, and TPIU TRACEDATA0 and TRACEDATA1 are both low (trigger packet) - - These conditions are in accordance with Arm Coresight Architecture Spec v3.0 section D3.3.3: Decoding requirements for Trace Capture Devices - - The data captured into the FIFO is the full 32-bit TRACEDATA bus output by the TPIU. Note that the TPIU is a DDR output at half of clk_sys, therefore this interface can capture the full 32-bit TPIU DDR output bandwidth as it samples once per active edge of the TPIU output clock. - [31:0] - read-only - modify - - - - - - - USB - USB FS/LS controller device registers - 0x50110000 - - 0x0 - 0x118 - registers - - - USBCTRL_IRQ - 14 - - - - ADDR_ENDP - Device address and endpoint control - 0x0 - 0x00000000 - - - ENDPOINT - Device endpoint to send data to. Only valid for HOST mode. - [19:16] - read-write - - - ADDRESS - In device mode, the address that the device should respond to. Set in response to a SET_ADDR setup packet from the host. In host mode set to the address of the device to communicate with. - [6:0] - read-write - - - - - 15 - 0x4 - 1-15 - HOST_ADDR_ENDP%s - Interrupt endpoints. Only valid in HOST mode. - 0x4 - 0x00000000 - - - INTEP_PREAMBLE - Interrupt EP requires preamble (is a low speed device on a full speed hub) - [26:26] - read-write - - - INTEP_DIR - Direction of the interrupt endpoint. In=0, Out=1 - [25:25] - read-write - - - ENDPOINT - Endpoint number of the interrupt endpoint - [19:16] - read-write - - - ADDRESS - Device address - [6:0] - read-write - - - - - MAIN_CTRL - Main control register - 0x40 - 0x00000004 - - - SIM_TIMING - Reduced timings for simulation - [31:31] - read-write - - - PHY_ISO - Isolates USB phy after controller power-up - Remove isolation once software has configured the controller - Not isolated = 0, Isolated = 1 - [2:2] - read-write - - - HOST_NDEVICE - Device mode = 0, Host mode = 1 - [1:1] - read-write - - - CONTROLLER_EN - Enable controller - [0:0] - read-write - - - - - SOF_WR - Set the SOF (Start of Frame) frame number in the host controller. The SOF packet is sent every 1ms and the host will increment the frame number by 1 each time. - 0x44 - 0x00000000 - - - COUNT - [10:0] - write-only - - - - - SOF_RD - Read the last SOF (Start of Frame) frame number seen. In device mode the last SOF received from the host. In host mode the last SOF sent by the host. - 0x48 - 0x00000000 - - - COUNT - [10:0] - read-only - - - - - SIE_CTRL - SIE control register - 0x4C - 0x00008000 - - - EP0_INT_STALL - Device: Set bit in EP_STATUS_STALL_NAK when EP0 sends a STALL - [31:31] - read-write - - - EP0_DOUBLE_BUF - Device: EP0 single buffered = 0, double buffered = 1 - [30:30] - read-write - - - EP0_INT_1BUF - Device: Set bit in BUFF_STATUS for every buffer completed on EP0 - [29:29] - read-write - - - EP0_INT_2BUF - Device: Set bit in BUFF_STATUS for every 2 buffers completed on EP0 - [28:28] - read-write - - - EP0_INT_NAK - Device: Set bit in EP_STATUS_STALL_NAK when EP0 sends a NAK - [27:27] - read-write - - - DIRECT_EN - Direct bus drive enable - [26:26] - read-write - - - DIRECT_DP - Direct control of DP - [25:25] - read-write - - - DIRECT_DM - Direct control of DM - [24:24] - read-write - - - EP0_STOP_ON_SHORT_PACKET - Device: Stop EP0 on a short packet. - [19:19] - read-write - - - TRANSCEIVER_PD - Power down bus transceiver - [18:18] - read-write - - - RPU_OPT - Device: Pull-up strength (0=1K2, 1=2k3) - [17:17] - read-write - - - PULLUP_EN - Device: Enable pull up resistor - [16:16] - read-write - - - PULLDOWN_EN - Host: Enable pull down resistors - [15:15] - read-write - - - RESET_BUS - Host: Reset bus - [13:13] - write-only - - - RESUME - Device: Remote wakeup. Device can initiate its own resume after suspend. - [12:12] - write-only - - - VBUS_EN - Host: Enable VBUS - [11:11] - read-write - - - KEEP_ALIVE_EN - Host: Enable keep alive packet (for low speed bus) - [10:10] - read-write - - - SOF_EN - Host: Enable SOF generation (for full speed bus) - [9:9] - read-write - - - SOF_SYNC - Host: Delay packet(s) until after SOF - [8:8] - read-write - - - PREAMBLE_EN - Host: Preable enable for LS device on FS hub - [6:6] - read-write - - - STOP_TRANS - Host: Stop transaction - [4:4] - write-only - - - RECEIVE_DATA - Host: Receive transaction (IN to host) - [3:3] - read-write - - - SEND_DATA - Host: Send transaction (OUT from host) - [2:2] - read-write - - - SEND_SETUP - Host: Send Setup packet - [1:1] - read-write - - - START_TRANS - Host: Start transaction - [0:0] - write-only - - - - - SIE_STATUS - SIE status register - 0x50 - 0x00000000 - - - DATA_SEQ_ERROR - Data Sequence Error. - - The device can raise a sequence error in the following conditions: - - * A SETUP packet is received followed by a DATA1 packet (data phase should always be DATA0) * An OUT packet is received from the host but doesn't match the data pid in the buffer control register read from DPSRAM - - The host can raise a data sequence error in the following conditions: - - * An IN packet from the device has the wrong data PID - [31:31] - read-write - oneToClear - - - ACK_REC - ACK received. Raised by both host and device. - [30:30] - read-write - oneToClear - - - STALL_REC - Host: STALL received - [29:29] - read-write - oneToClear - - - NAK_REC - Host: NAK received - [28:28] - read-write - oneToClear - - - RX_TIMEOUT - RX timeout is raised by both the host and device if an ACK is not received in the maximum time specified by the USB spec. - [27:27] - read-write - oneToClear - - - RX_OVERFLOW - RX overflow is raised by the Serial RX engine if the incoming data is too fast. - [26:26] - read-write - oneToClear - - - BIT_STUFF_ERROR - Bit Stuff Error. Raised by the Serial RX engine. - [25:25] - read-write - oneToClear - - - CRC_ERROR - CRC Error. Raised by the Serial RX engine. - [24:24] - read-write - oneToClear - - - ENDPOINT_ERROR - An endpoint has encountered an error. Read the ep_rx_error and ep_tx_error registers to find out which endpoint had an error. - [23:23] - read-write - oneToClear - - - BUS_RESET - Device: bus reset received - [19:19] - read-write - oneToClear - - - TRANS_COMPLETE - Transaction complete. - - Raised by device if: - - * An IN or OUT packet is sent with the `LAST_BUFF` bit set in the buffer control register - - Raised by host if: - - * A setup packet is sent when no data in or data out transaction follows * An IN packet is received and the `LAST_BUFF` bit is set in the buffer control register * An IN packet is received with zero length * An OUT packet is sent and the `LAST_BUFF` bit is set - [18:18] - read-write - oneToClear - - - SETUP_REC - Device: Setup packet received - [17:17] - read-write - oneToClear - - - CONNECTED - Device: connected - [16:16] - read-only - - - RX_SHORT_PACKET - Device or Host has received a short packet. This is when the data received is less than configured in the buffer control register. Device: If using double buffered mode on device the buffer select will not be toggled after writing status back to the buffer control register. This is to prevent any further transactions on that endpoint until the user has reset the buffer control registers. Host: the current transfer will be stopped early. - [12:12] - read-write - oneToClear - - - RESUME - Host: Device has initiated a remote resume. Device: host has initiated a resume. - [11:11] - read-write - oneToClear - - - VBUS_OVER_CURR - VBUS over current detected - [10:10] - read-only - - - SPEED - Host: device speed. Disconnected = 00, LS = 01, FS = 10 - [9:8] - read-only - - - SUSPENDED - Bus in suspended state. Valid for device. Device will go into suspend if neither Keep Alive / SOF frames are enabled. - [4:4] - read-write - oneToClear - - - LINE_STATE - USB bus line state - [3:2] - read-only - - LINE_STATE - - SE0 - SE0 - 0 - - - J - J - 1 - - - K - K - 2 - - - SE1 - SE1 - 3 - - - - - VBUS_DETECTED - Device: VBUS Detected - [0:0] - read-only - - - - - INT_EP_CTRL - interrupt endpoint control register - 0x54 - 0x00000000 - - - INT_EP_ACTIVE - Host: Enable interrupt endpoint 1 -> 15 - [15:1] - read-write - - - - - BUFF_STATUS - Buffer status register. A bit set here indicates that a buffer has completed on the endpoint (if the buffer interrupt is enabled). It is possible for 2 buffers to be completed, so clearing the buffer status bit may instantly re set it on the next clock cycle. - 0x58 - 0x00000000 - - - EP15_OUT - [31:31] - read-write - oneToClear - - - EP15_IN - [30:30] - read-write - oneToClear - - - EP14_OUT - [29:29] - read-write - oneToClear - - - EP14_IN - [28:28] - read-write - oneToClear - - - EP13_OUT - [27:27] - read-write - oneToClear - - - EP13_IN - [26:26] - read-write - oneToClear - - - EP12_OUT - [25:25] - read-write - oneToClear - - - EP12_IN - [24:24] - read-write - oneToClear - - - EP11_OUT - [23:23] - read-write - oneToClear - - - EP11_IN - [22:22] - read-write - oneToClear - - - EP10_OUT - [21:21] - read-write - oneToClear - - - EP10_IN - [20:20] - read-write - oneToClear - - - EP9_OUT - [19:19] - read-write - oneToClear - - - EP9_IN - [18:18] - read-write - oneToClear - - - EP8_OUT - [17:17] - read-write - oneToClear - - - EP8_IN - [16:16] - read-write - oneToClear - - - EP7_OUT - [15:15] - read-write - oneToClear - - - EP7_IN - [14:14] - read-write - oneToClear - - - EP6_OUT - [13:13] - read-write - oneToClear - - - EP6_IN - [12:12] - read-write - oneToClear - - - EP5_OUT - [11:11] - read-write - oneToClear - - - EP5_IN - [10:10] - read-write - oneToClear - - - EP4_OUT - [9:9] - read-write - oneToClear - - - EP4_IN - [8:8] - read-write - oneToClear - - - EP3_OUT - [7:7] - read-write - oneToClear - - - EP3_IN - [6:6] - read-write - oneToClear - - - EP2_OUT - [5:5] - read-write - oneToClear - - - EP2_IN - [4:4] - read-write - oneToClear - - - EP1_OUT - [3:3] - read-write - oneToClear - - - EP1_IN - [2:2] - read-write - oneToClear - - - EP0_OUT - [1:1] - read-write - oneToClear - - - EP0_IN - [0:0] - read-write - oneToClear - - - - - BUFF_CPU_SHOULD_HANDLE - Which of the double buffers should be handled. Only valid if using an interrupt per buffer (i.e. not per 2 buffers). Not valid for host interrupt endpoint polling because they are only single buffered. - 0x5C - 0x00000000 - - - EP15_OUT - [31:31] - read-only - - - EP15_IN - [30:30] - read-only - - - EP14_OUT - [29:29] - read-only - - - EP14_IN - [28:28] - read-only - - - EP13_OUT - [27:27] - read-only - - - EP13_IN - [26:26] - read-only - - - EP12_OUT - [25:25] - read-only - - - EP12_IN - [24:24] - read-only - - - EP11_OUT - [23:23] - read-only - - - EP11_IN - [22:22] - read-only - - - EP10_OUT - [21:21] - read-only - - - EP10_IN - [20:20] - read-only - - - EP9_OUT - [19:19] - read-only - - - EP9_IN - [18:18] - read-only - - - EP8_OUT - [17:17] - read-only - - - EP8_IN - [16:16] - read-only - - - EP7_OUT - [15:15] - read-only - - - EP7_IN - [14:14] - read-only - - - EP6_OUT - [13:13] - read-only - - - EP6_IN - [12:12] - read-only - - - EP5_OUT - [11:11] - read-only - - - EP5_IN - [10:10] - read-only - - - EP4_OUT - [9:9] - read-only - - - EP4_IN - [8:8] - read-only - - - EP3_OUT - [7:7] - read-only - - - EP3_IN - [6:6] - read-only - - - EP2_OUT - [5:5] - read-only - - - EP2_IN - [4:4] - read-only - - - EP1_OUT - [3:3] - read-only - - - EP1_IN - [2:2] - read-only - - - EP0_OUT - [1:1] - read-only - - - EP0_IN - [0:0] - read-only - - - - - EP_ABORT - Device only: Can be set to ignore the buffer control register for this endpoint in case you would like to revoke a buffer. A NAK will be sent for every access to the endpoint until this bit is cleared. A corresponding bit in `EP_ABORT_DONE` is set when it is safe to modify the buffer control register. - 0x60 - 0x00000000 - - - EP15_OUT - [31:31] - read-write - - - EP15_IN - [30:30] - read-write - - - EP14_OUT - [29:29] - read-write - - - EP14_IN - [28:28] - read-write - - - EP13_OUT - [27:27] - read-write - - - EP13_IN - [26:26] - read-write - - - EP12_OUT - [25:25] - read-write - - - EP12_IN - [24:24] - read-write - - - EP11_OUT - [23:23] - read-write - - - EP11_IN - [22:22] - read-write - - - EP10_OUT - [21:21] - read-write - - - EP10_IN - [20:20] - read-write - - - EP9_OUT - [19:19] - read-write - - - EP9_IN - [18:18] - read-write - - - EP8_OUT - [17:17] - read-write - - - EP8_IN - [16:16] - read-write - - - EP7_OUT - [15:15] - read-write - - - EP7_IN - [14:14] - read-write - - - EP6_OUT - [13:13] - read-write - - - EP6_IN - [12:12] - read-write - - - EP5_OUT - [11:11] - read-write - - - EP5_IN - [10:10] - read-write - - - EP4_OUT - [9:9] - read-write - - - EP4_IN - [8:8] - read-write - - - EP3_OUT - [7:7] - read-write - - - EP3_IN - [6:6] - read-write - - - EP2_OUT - [5:5] - read-write - - - EP2_IN - [4:4] - read-write - - - EP1_OUT - [3:3] - read-write - - - EP1_IN - [2:2] - read-write - - - EP0_OUT - [1:1] - read-write - - - EP0_IN - [0:0] - read-write - - - - - EP_ABORT_DONE - Device only: Used in conjunction with `EP_ABORT`. Set once an endpoint is idle so the programmer knows it is safe to modify the buffer control register. - 0x64 - 0x00000000 - - - EP15_OUT - [31:31] - read-write - oneToClear - - - EP15_IN - [30:30] - read-write - oneToClear - - - EP14_OUT - [29:29] - read-write - oneToClear - - - EP14_IN - [28:28] - read-write - oneToClear - - - EP13_OUT - [27:27] - read-write - oneToClear - - - EP13_IN - [26:26] - read-write - oneToClear - - - EP12_OUT - [25:25] - read-write - oneToClear - - - EP12_IN - [24:24] - read-write - oneToClear - - - EP11_OUT - [23:23] - read-write - oneToClear - - - EP11_IN - [22:22] - read-write - oneToClear - - - EP10_OUT - [21:21] - read-write - oneToClear - - - EP10_IN - [20:20] - read-write - oneToClear - - - EP9_OUT - [19:19] - read-write - oneToClear - - - EP9_IN - [18:18] - read-write - oneToClear - - - EP8_OUT - [17:17] - read-write - oneToClear - - - EP8_IN - [16:16] - read-write - oneToClear - - - EP7_OUT - [15:15] - read-write - oneToClear - - - EP7_IN - [14:14] - read-write - oneToClear - - - EP6_OUT - [13:13] - read-write - oneToClear - - - EP6_IN - [12:12] - read-write - oneToClear - - - EP5_OUT - [11:11] - read-write - oneToClear - - - EP5_IN - [10:10] - read-write - oneToClear - - - EP4_OUT - [9:9] - read-write - oneToClear - - - EP4_IN - [8:8] - read-write - oneToClear - - - EP3_OUT - [7:7] - read-write - oneToClear - - - EP3_IN - [6:6] - read-write - oneToClear - - - EP2_OUT - [5:5] - read-write - oneToClear - - - EP2_IN - [4:4] - read-write - oneToClear - - - EP1_OUT - [3:3] - read-write - oneToClear - - - EP1_IN - [2:2] - read-write - oneToClear - - - EP0_OUT - [1:1] - read-write - oneToClear - - - EP0_IN - [0:0] - read-write - oneToClear - - - - - EP_STALL_ARM - Device: this bit must be set in conjunction with the `STALL` bit in the buffer control register to send a STALL on EP0. The device controller clears these bits when a SETUP packet is received because the USB spec requires that a STALL condition is cleared when a SETUP packet is received. - 0x68 - 0x00000000 - - - EP0_OUT - [1:1] - read-write - - - EP0_IN - [0:0] - read-write - - - - - NAK_POLL - Used by the host controller. Sets the wait time in microseconds before trying again if the device replies with a NAK. - 0x6C - 0x00100010 - - - RETRY_COUNT_HI - Bits 9:6 of nak_retry count - [31:28] - read-only - - - EPX_STOPPED_ON_NAK - EPX polling has stopped because a nak was received - [27:27] - read-write - oneToClear - - - STOP_EPX_ON_NAK - Stop polling epx when a nak is received - [26:26] - read-write - - - DELAY_FS - NAK polling interval for a full speed device - [25:16] - read-write - - - RETRY_COUNT_LO - Bits 5:0 of nak_retry_count - [15:10] - read-only - - - DELAY_LS - NAK polling interval for a low speed device - [9:0] - read-write - - - - - EP_STATUS_STALL_NAK - Device: bits are set when the `IRQ_ON_NAK` or `IRQ_ON_STALL` bits are set. For EP0 this comes from `SIE_CTRL`. For all other endpoints it comes from the endpoint control register. - 0x70 - 0x00000000 - - - EP15_OUT - [31:31] - read-write - oneToClear - - - EP15_IN - [30:30] - read-write - oneToClear - - - EP14_OUT - [29:29] - read-write - oneToClear - - - EP14_IN - [28:28] - read-write - oneToClear - - - EP13_OUT - [27:27] - read-write - oneToClear - - - EP13_IN - [26:26] - read-write - oneToClear - - - EP12_OUT - [25:25] - read-write - oneToClear - - - EP12_IN - [24:24] - read-write - oneToClear - - - EP11_OUT - [23:23] - read-write - oneToClear - - - EP11_IN - [22:22] - read-write - oneToClear - - - EP10_OUT - [21:21] - read-write - oneToClear - - - EP10_IN - [20:20] - read-write - oneToClear - - - EP9_OUT - [19:19] - read-write - oneToClear - - - EP9_IN - [18:18] - read-write - oneToClear - - - EP8_OUT - [17:17] - read-write - oneToClear - - - EP8_IN - [16:16] - read-write - oneToClear - - - EP7_OUT - [15:15] - read-write - oneToClear - - - EP7_IN - [14:14] - read-write - oneToClear - - - EP6_OUT - [13:13] - read-write - oneToClear - - - EP6_IN - [12:12] - read-write - oneToClear - - - EP5_OUT - [11:11] - read-write - oneToClear - - - EP5_IN - [10:10] - read-write - oneToClear - - - EP4_OUT - [9:9] - read-write - oneToClear - - - EP4_IN - [8:8] - read-write - oneToClear - - - EP3_OUT - [7:7] - read-write - oneToClear - - - EP3_IN - [6:6] - read-write - oneToClear - - - EP2_OUT - [5:5] - read-write - oneToClear - - - EP2_IN - [4:4] - read-write - oneToClear - - - EP1_OUT - [3:3] - read-write - oneToClear - - - EP1_IN - [2:2] - read-write - oneToClear - - - EP0_OUT - [1:1] - read-write - oneToClear - - - EP0_IN - [0:0] - read-write - oneToClear - - - - - USB_MUXING - Where to connect the USB controller. Should be to_phy by default. - 0x74 - 0x00000001 - - - SWAP_DPDM - Swap the USB PHY DP and DM pins and all related controls and flip receive differential data. Can be used to switch USB DP/DP on the PCB. - This is done at a low level so overrides all other controls. - [31:31] - read-write - - - USBPHY_AS_GPIO - Use the usb DP and DM pins as GPIO pins instead of connecting them to the USB controller. - [4:4] - read-write - - - SOFTCON - [3:3] - read-write - - - TO_DIGITAL_PAD - [2:2] - read-write - - - TO_EXTPHY - [1:1] - read-write - - - TO_PHY - [0:0] - read-write - - - - - USB_PWR - Overrides for the power signals in the event that the VBUS signals are not hooked up to GPIO. Set the value of the override and then the override enable to switch over to the override value. - 0x78 - 0x00000000 - - - OVERCURR_DETECT_EN - [5:5] - read-write - - - OVERCURR_DETECT - [4:4] - read-write - - - VBUS_DETECT_OVERRIDE_EN - [3:3] - read-write - - - VBUS_DETECT - [2:2] - read-write - - - VBUS_EN_OVERRIDE_EN - [1:1] - read-write - - - VBUS_EN - [0:0] - read-write - - - - - USBPHY_DIRECT - This register allows for direct control of the USB phy. Use in conjunction with usbphy_direct_override register to enable each override bit. - 0x7C - 0x00000000 - - - RX_DM_OVERRIDE - Override rx_dm value into controller - [25:25] - read-write - - - RX_DP_OVERRIDE - Override rx_dp value into controller - [24:24] - read-write - - - RX_DD_OVERRIDE - Override rx_dd value into controller - [23:23] - read-write - - - DM_OVV - DM over voltage - [22:22] - read-only - - - DP_OVV - DP over voltage - [21:21] - read-only - - - DM_OVCN - DM overcurrent - [20:20] - read-only - - - DP_OVCN - DP overcurrent - [19:19] - read-only - - - RX_DM - DPM pin state - [18:18] - read-only - - - RX_DP - DPP pin state - [17:17] - read-only - - - RX_DD - Differential RX - [16:16] - read-only - - - TX_DIFFMODE - TX_DIFFMODE=0: Single ended mode - TX_DIFFMODE=1: Differential drive mode (TX_DM, TX_DM_OE ignored) - [15:15] - read-write - - - TX_FSSLEW - TX_FSSLEW=0: Low speed slew rate - TX_FSSLEW=1: Full speed slew rate - [14:14] - read-write - - - TX_PD - TX power down override (if override enable is set). 1 = powered down. - [13:13] - read-write - - - RX_PD - RX power down override (if override enable is set). 1 = powered down. - [12:12] - read-write - - - TX_DM - Output data. TX_DIFFMODE=1, Ignored - TX_DIFFMODE=0, Drives DPM only. TX_DM_OE=1 to enable drive. DPM=TX_DM - [11:11] - read-write - - - TX_DP - Output data. If TX_DIFFMODE=1, Drives DPP/DPM diff pair. TX_DP_OE=1 to enable drive. DPP=TX_DP, DPM=~TX_DP - If TX_DIFFMODE=0, Drives DPP only. TX_DP_OE=1 to enable drive. DPP=TX_DP - [10:10] - read-write - - - TX_DM_OE - Output enable. If TX_DIFFMODE=1, Ignored. - If TX_DIFFMODE=0, OE for DPM only. 0 - DPM in Hi-Z state; 1 - DPM driving - [9:9] - read-write - - - TX_DP_OE - Output enable. If TX_DIFFMODE=1, OE for DPP/DPM diff pair. 0 - DPP/DPM in Hi-Z state; 1 - DPP/DPM driving - If TX_DIFFMODE=0, OE for DPP only. 0 - DPP in Hi-Z state; 1 - DPP driving - [8:8] - read-write - - - DM_PULLDN_EN - DM pull down enable - [6:6] - read-write - - - DM_PULLUP_EN - DM pull up enable - [5:5] - read-write - - - DM_PULLUP_HISEL - Enable the second DM pull up resistor. 0 - Pull = Rpu2; 1 - Pull = Rpu1 + Rpu2 - [4:4] - read-write - - - DP_PULLDN_EN - DP pull down enable - [2:2] - read-write - - - DP_PULLUP_EN - DP pull up enable - [1:1] - read-write - - - DP_PULLUP_HISEL - Enable the second DP pull up resistor. 0 - Pull = Rpu2; 1 - Pull = Rpu1 + Rpu2 - [0:0] - read-write - - - - - USBPHY_DIRECT_OVERRIDE - Override enable for each control in usbphy_direct - 0x80 - 0x00000000 - - - RX_DM_OVERRIDE_EN - [18:18] - read-write - - - RX_DP_OVERRIDE_EN - [17:17] - read-write - - - RX_DD_OVERRIDE_EN - [16:16] - read-write - - - TX_DIFFMODE_OVERRIDE_EN - [15:15] - read-write - - - DM_PULLUP_OVERRIDE_EN - [12:12] - read-write - - - TX_FSSLEW_OVERRIDE_EN - [11:11] - read-write - - - TX_PD_OVERRIDE_EN - [10:10] - read-write - - - RX_PD_OVERRIDE_EN - [9:9] - read-write - - - TX_DM_OVERRIDE_EN - [8:8] - read-write - - - TX_DP_OVERRIDE_EN - [7:7] - read-write - - - TX_DM_OE_OVERRIDE_EN - [6:6] - read-write - - - TX_DP_OE_OVERRIDE_EN - [5:5] - read-write - - - DM_PULLDN_EN_OVERRIDE_EN - [4:4] - read-write - - - DP_PULLDN_EN_OVERRIDE_EN - [3:3] - read-write - - - DP_PULLUP_EN_OVERRIDE_EN - [2:2] - read-write - - - DM_PULLUP_HISEL_OVERRIDE_EN - [1:1] - read-write - - - DP_PULLUP_HISEL_OVERRIDE_EN - [0:0] - read-write - - - - - USBPHY_TRIM - Used to adjust trim values of USB phy pull down resistors. - 0x84 - 0x00001F1F - - - DM_PULLDN_TRIM - Value to drive to USB PHY - DM pulldown resistor trim control - Experimental data suggests that the reset value will work, but this register allows adjustment if required - [12:8] - read-write - - - DP_PULLDN_TRIM - Value to drive to USB PHY - DP pulldown resistor trim control - Experimental data suggests that the reset value will work, but this register allows adjustment if required - [4:0] - read-write - - - - - LINESTATE_TUNING - Used for debug only. - 0x88 - 0x000000F8 - - - SPARE_FIX - [11:8] - read-write - - - DEV_LS_WAKE_FIX - Device - exit suspend on any non-idle signalling, not qualified with a 1ms timer - [7:7] - read-write - - - DEV_RX_ERR_QUIESCE - Device - suppress repeated errors until the device FSM is next in the process of decoding an inbound packet. - [6:6] - read-write - - - SIE_RX_CHATTER_SE0_FIX - RX - when recovering from line chatter or bitstuff errors, treat SE0 as the end of chatter as well as - 8 consecutive idle bits. - [5:5] - read-write - - - SIE_RX_BITSTUFF_FIX - RX - when a bitstuff error is signalled by rx_dasm, unconditionally terminate RX decode to - avoid a hang during certain packet phases. - [4:4] - read-write - - - DEV_BUFF_CONTROL_DOUBLE_READ_FIX - Device - the controller FSM performs two reads of the buffer status memory address to - avoid sampling metastable data. An enabled buffer is only used if both reads match. - [3:3] - read-write - - - MULTI_HUB_FIX - Host - increase inter-packet and turnaround timeouts to accommodate worst-case hub delays. - [2:2] - read-write - - - LINESTATE_DELAY - Device/Host - add an extra 1-bit debounce of linestate sampling. - [1:1] - read-write - - - RCV_DELAY - Device - register the received data to account for hub bit dribble before EOP. Only affects certain hubs. - [0:0] - read-write - - - - - INTR - Raw Interrupts - 0x8C - 0x00000000 - - - EPX_STOPPED_ON_NAK - Source: NAK_POLL.EPX_STOPPED_ON_NAK - [23:23] - read-only - - - DEV_SM_WATCHDOG_FIRED - Source: DEV_SM_WATCHDOG.FIRED - [22:22] - read-only - - - ENDPOINT_ERROR - Source: SIE_STATUS.ENDPOINT_ERROR - [21:21] - read-only - - - RX_SHORT_PACKET - Source: SIE_STATUS.RX_SHORT_PACKET - [20:20] - read-only - - - EP_STALL_NAK - Raised when any bit in EP_STATUS_STALL_NAK is set. Clear by clearing all bits in EP_STATUS_STALL_NAK. - [19:19] - read-only - - - ABORT_DONE - Raised when any bit in ABORT_DONE is set. Clear by clearing all bits in ABORT_DONE. - [18:18] - read-only - - - DEV_SOF - Set every time the device receives a SOF (Start of Frame) packet. Cleared by reading SOF_RD - [17:17] - read-only - - - SETUP_REQ - Device. Source: SIE_STATUS.SETUP_REC - [16:16] - read-only - - - DEV_RESUME_FROM_HOST - Set when the device receives a resume from the host. Cleared by writing to SIE_STATUS.RESUME - [15:15] - read-only - - - DEV_SUSPEND - Set when the device suspend state changes. Cleared by writing to SIE_STATUS.SUSPENDED - [14:14] - read-only - - - DEV_CONN_DIS - Set when the device connection state changes. Cleared by writing to SIE_STATUS.CONNECTED - [13:13] - read-only - - - BUS_RESET - Source: SIE_STATUS.BUS_RESET - [12:12] - read-only - - - VBUS_DETECT - Source: SIE_STATUS.VBUS_DETECTED - [11:11] - read-only - - - STALL - Source: SIE_STATUS.STALL_REC - [10:10] - read-only - - - ERROR_CRC - Source: SIE_STATUS.CRC_ERROR - [9:9] - read-only - - - ERROR_BIT_STUFF - Source: SIE_STATUS.BIT_STUFF_ERROR - [8:8] - read-only - - - ERROR_RX_OVERFLOW - Source: SIE_STATUS.RX_OVERFLOW - [7:7] - read-only - - - ERROR_RX_TIMEOUT - Source: SIE_STATUS.RX_TIMEOUT - [6:6] - read-only - - - ERROR_DATA_SEQ - Source: SIE_STATUS.DATA_SEQ_ERROR - [5:5] - read-only - - - BUFF_STATUS - Raised when any bit in BUFF_STATUS is set. Clear by clearing all bits in BUFF_STATUS. - [4:4] - read-only - - - TRANS_COMPLETE - Raised every time SIE_STATUS.TRANS_COMPLETE is set. Clear by writing to this bit. - [3:3] - read-only - - - HOST_SOF - Host: raised every time the host sends a SOF (Start of Frame). Cleared by reading SOF_RD - [2:2] - read-only - - - HOST_RESUME - Host: raised when a device wakes up the host. Cleared by writing to SIE_STATUS.RESUME - [1:1] - read-only - - - HOST_CONN_DIS - Host: raised when a device is connected or disconnected (i.e. when SIE_STATUS.SPEED changes). Cleared by writing to SIE_STATUS.SPEED - [0:0] - read-only - - - - - INTE - Interrupt Enable - 0x90 - 0x00000000 - - - EPX_STOPPED_ON_NAK - Source: NAK_POLL.EPX_STOPPED_ON_NAK - [23:23] - read-write - - - DEV_SM_WATCHDOG_FIRED - Source: DEV_SM_WATCHDOG.FIRED - [22:22] - read-write - - - ENDPOINT_ERROR - Source: SIE_STATUS.ENDPOINT_ERROR - [21:21] - read-write - - - RX_SHORT_PACKET - Source: SIE_STATUS.RX_SHORT_PACKET - [20:20] - read-write - - - EP_STALL_NAK - Raised when any bit in EP_STATUS_STALL_NAK is set. Clear by clearing all bits in EP_STATUS_STALL_NAK. - [19:19] - read-write - - - ABORT_DONE - Raised when any bit in ABORT_DONE is set. Clear by clearing all bits in ABORT_DONE. - [18:18] - read-write - - - DEV_SOF - Set every time the device receives a SOF (Start of Frame) packet. Cleared by reading SOF_RD - [17:17] - read-write - - - SETUP_REQ - Device. Source: SIE_STATUS.SETUP_REC - [16:16] - read-write - - - DEV_RESUME_FROM_HOST - Set when the device receives a resume from the host. Cleared by writing to SIE_STATUS.RESUME - [15:15] - read-write - - - DEV_SUSPEND - Set when the device suspend state changes. Cleared by writing to SIE_STATUS.SUSPENDED - [14:14] - read-write - - - DEV_CONN_DIS - Set when the device connection state changes. Cleared by writing to SIE_STATUS.CONNECTED - [13:13] - read-write - - - BUS_RESET - Source: SIE_STATUS.BUS_RESET - [12:12] - read-write - - - VBUS_DETECT - Source: SIE_STATUS.VBUS_DETECTED - [11:11] - read-write - - - STALL - Source: SIE_STATUS.STALL_REC - [10:10] - read-write - - - ERROR_CRC - Source: SIE_STATUS.CRC_ERROR - [9:9] - read-write - - - ERROR_BIT_STUFF - Source: SIE_STATUS.BIT_STUFF_ERROR - [8:8] - read-write - - - ERROR_RX_OVERFLOW - Source: SIE_STATUS.RX_OVERFLOW - [7:7] - read-write - - - ERROR_RX_TIMEOUT - Source: SIE_STATUS.RX_TIMEOUT - [6:6] - read-write - - - ERROR_DATA_SEQ - Source: SIE_STATUS.DATA_SEQ_ERROR - [5:5] - read-write - - - BUFF_STATUS - Raised when any bit in BUFF_STATUS is set. Clear by clearing all bits in BUFF_STATUS. - [4:4] - read-write - - - TRANS_COMPLETE - Raised every time SIE_STATUS.TRANS_COMPLETE is set. Clear by writing to this bit. - [3:3] - read-write - - - HOST_SOF - Host: raised every time the host sends a SOF (Start of Frame). Cleared by reading SOF_RD - [2:2] - read-write - - - HOST_RESUME - Host: raised when a device wakes up the host. Cleared by writing to SIE_STATUS.RESUME - [1:1] - read-write - - - HOST_CONN_DIS - Host: raised when a device is connected or disconnected (i.e. when SIE_STATUS.SPEED changes). Cleared by writing to SIE_STATUS.SPEED - [0:0] - read-write - - - - - INTF - Interrupt Force - 0x94 - 0x00000000 - - - EPX_STOPPED_ON_NAK - Source: NAK_POLL.EPX_STOPPED_ON_NAK - [23:23] - read-write - - - DEV_SM_WATCHDOG_FIRED - Source: DEV_SM_WATCHDOG.FIRED - [22:22] - read-write - - - ENDPOINT_ERROR - Source: SIE_STATUS.ENDPOINT_ERROR - [21:21] - read-write - - - RX_SHORT_PACKET - Source: SIE_STATUS.RX_SHORT_PACKET - [20:20] - read-write - - - EP_STALL_NAK - Raised when any bit in EP_STATUS_STALL_NAK is set. Clear by clearing all bits in EP_STATUS_STALL_NAK. - [19:19] - read-write - - - ABORT_DONE - Raised when any bit in ABORT_DONE is set. Clear by clearing all bits in ABORT_DONE. - [18:18] - read-write - - - DEV_SOF - Set every time the device receives a SOF (Start of Frame) packet. Cleared by reading SOF_RD - [17:17] - read-write - - - SETUP_REQ - Device. Source: SIE_STATUS.SETUP_REC - [16:16] - read-write - - - DEV_RESUME_FROM_HOST - Set when the device receives a resume from the host. Cleared by writing to SIE_STATUS.RESUME - [15:15] - read-write - - - DEV_SUSPEND - Set when the device suspend state changes. Cleared by writing to SIE_STATUS.SUSPENDED - [14:14] - read-write - - - DEV_CONN_DIS - Set when the device connection state changes. Cleared by writing to SIE_STATUS.CONNECTED - [13:13] - read-write - - - BUS_RESET - Source: SIE_STATUS.BUS_RESET - [12:12] - read-write - - - VBUS_DETECT - Source: SIE_STATUS.VBUS_DETECTED - [11:11] - read-write - - - STALL - Source: SIE_STATUS.STALL_REC - [10:10] - read-write - - - ERROR_CRC - Source: SIE_STATUS.CRC_ERROR - [9:9] - read-write - - - ERROR_BIT_STUFF - Source: SIE_STATUS.BIT_STUFF_ERROR - [8:8] - read-write - - - ERROR_RX_OVERFLOW - Source: SIE_STATUS.RX_OVERFLOW - [7:7] - read-write - - - ERROR_RX_TIMEOUT - Source: SIE_STATUS.RX_TIMEOUT - [6:6] - read-write - - - ERROR_DATA_SEQ - Source: SIE_STATUS.DATA_SEQ_ERROR - [5:5] - read-write - - - BUFF_STATUS - Raised when any bit in BUFF_STATUS is set. Clear by clearing all bits in BUFF_STATUS. - [4:4] - read-write - - - TRANS_COMPLETE - Raised every time SIE_STATUS.TRANS_COMPLETE is set. Clear by writing to this bit. - [3:3] - read-write - - - HOST_SOF - Host: raised every time the host sends a SOF (Start of Frame). Cleared by reading SOF_RD - [2:2] - read-write - - - HOST_RESUME - Host: raised when a device wakes up the host. Cleared by writing to SIE_STATUS.RESUME - [1:1] - read-write - - - HOST_CONN_DIS - Host: raised when a device is connected or disconnected (i.e. when SIE_STATUS.SPEED changes). Cleared by writing to SIE_STATUS.SPEED - [0:0] - read-write - - - - - INTS - Interrupt status after masking & forcing - 0x98 - 0x00000000 - - - EPX_STOPPED_ON_NAK - Source: NAK_POLL.EPX_STOPPED_ON_NAK - [23:23] - read-only - - - DEV_SM_WATCHDOG_FIRED - Source: DEV_SM_WATCHDOG.FIRED - [22:22] - read-only - - - ENDPOINT_ERROR - Source: SIE_STATUS.ENDPOINT_ERROR - [21:21] - read-only - - - RX_SHORT_PACKET - Source: SIE_STATUS.RX_SHORT_PACKET - [20:20] - read-only - - - EP_STALL_NAK - Raised when any bit in EP_STATUS_STALL_NAK is set. Clear by clearing all bits in EP_STATUS_STALL_NAK. - [19:19] - read-only - - - ABORT_DONE - Raised when any bit in ABORT_DONE is set. Clear by clearing all bits in ABORT_DONE. - [18:18] - read-only - - - DEV_SOF - Set every time the device receives a SOF (Start of Frame) packet. Cleared by reading SOF_RD - [17:17] - read-only - - - SETUP_REQ - Device. Source: SIE_STATUS.SETUP_REC - [16:16] - read-only - - - DEV_RESUME_FROM_HOST - Set when the device receives a resume from the host. Cleared by writing to SIE_STATUS.RESUME - [15:15] - read-only - - - DEV_SUSPEND - Set when the device suspend state changes. Cleared by writing to SIE_STATUS.SUSPENDED - [14:14] - read-only - - - DEV_CONN_DIS - Set when the device connection state changes. Cleared by writing to SIE_STATUS.CONNECTED - [13:13] - read-only - - - BUS_RESET - Source: SIE_STATUS.BUS_RESET - [12:12] - read-only - - - VBUS_DETECT - Source: SIE_STATUS.VBUS_DETECTED - [11:11] - read-only - - - STALL - Source: SIE_STATUS.STALL_REC - [10:10] - read-only - - - ERROR_CRC - Source: SIE_STATUS.CRC_ERROR - [9:9] - read-only - - - ERROR_BIT_STUFF - Source: SIE_STATUS.BIT_STUFF_ERROR - [8:8] - read-only - - - ERROR_RX_OVERFLOW - Source: SIE_STATUS.RX_OVERFLOW - [7:7] - read-only - - - ERROR_RX_TIMEOUT - Source: SIE_STATUS.RX_TIMEOUT - [6:6] - read-only - - - ERROR_DATA_SEQ - Source: SIE_STATUS.DATA_SEQ_ERROR - [5:5] - read-only - - - BUFF_STATUS - Raised when any bit in BUFF_STATUS is set. Clear by clearing all bits in BUFF_STATUS. - [4:4] - read-only - - - TRANS_COMPLETE - Raised every time SIE_STATUS.TRANS_COMPLETE is set. Clear by writing to this bit. - [3:3] - read-only - - - HOST_SOF - Host: raised every time the host sends a SOF (Start of Frame). Cleared by reading SOF_RD - [2:2] - read-only - - - HOST_RESUME - Host: raised when a device wakes up the host. Cleared by writing to SIE_STATUS.RESUME - [1:1] - read-only - - - HOST_CONN_DIS - Host: raised when a device is connected or disconnected (i.e. when SIE_STATUS.SPEED changes). Cleared by writing to SIE_STATUS.SPEED - [0:0] - read-only - - - - - SOF_TIMESTAMP_RAW - Device only. Raw value of free-running PHY clock counter @48MHz. Used to calculate time between SOF events. - 0x100 - 0x00000000 - - - SOF_TIMESTAMP_RAW - [20:0] - read-only - - - - - SOF_TIMESTAMP_LAST - Device only. Value of free-running PHY clock counter @48MHz when last SOF event occurred. - 0x104 - 0x00000000 - - - SOF_TIMESTAMP_LAST - [20:0] - read-only - - - - - SM_STATE - 0x108 - 0x00000000 - - - RX_DASM - [11:8] - read-only - - - BC_STATE - [7:5] - read-only - - - STATE - [4:0] - read-only - - - - - EP_TX_ERROR - TX error count for each endpoint. Write to each field to reset the counter to 0. - 0x10C - 0x00000000 - - - EP15 - [31:30] - read-write - oneToClear - - - EP14 - [29:28] - read-write - oneToClear - - - EP13 - [27:26] - read-write - oneToClear - - - EP12 - [25:24] - read-write - oneToClear - - - EP11 - [23:22] - read-write - oneToClear - - - EP10 - [21:20] - read-write - oneToClear - - - EP9 - [19:18] - read-write - oneToClear - - - EP8 - [17:16] - read-write - oneToClear - - - EP7 - [15:14] - read-write - oneToClear - - - EP6 - [13:12] - read-write - oneToClear - - - EP5 - [11:10] - read-write - oneToClear - - - EP4 - [9:8] - read-write - oneToClear - - - EP3 - [7:6] - read-write - oneToClear - - - EP2 - [5:4] - read-write - oneToClear - - - EP1 - [3:2] - read-write - oneToClear - - - EP0 - [1:0] - read-write - oneToClear - - - - - EP_RX_ERROR - RX error count for each endpoint. Write to each field to reset the counter to 0. - 0x110 - 0x00000000 - - - EP15_SEQ - [31:31] - read-write - oneToClear - - - EP15_TRANSACTION - [30:30] - read-write - oneToClear - - - EP14_SEQ - [29:29] - read-write - oneToClear - - - EP14_TRANSACTION - [28:28] - read-write - oneToClear - - - EP13_SEQ - [27:27] - read-write - oneToClear - - - EP13_TRANSACTION - [26:26] - read-write - oneToClear - - - EP12_SEQ - [25:25] - read-write - oneToClear - - - EP12_TRANSACTION - [24:24] - read-write - oneToClear - - - EP11_SEQ - [23:23] - read-write - oneToClear - - - EP11_TRANSACTION - [22:22] - read-write - oneToClear - - - EP10_SEQ - [21:21] - read-write - oneToClear - - - EP10_TRANSACTION - [20:20] - read-write - oneToClear - - - EP9_SEQ - [19:19] - read-write - oneToClear - - - EP9_TRANSACTION - [18:18] - read-write - oneToClear - - - EP8_SEQ - [17:17] - read-write - oneToClear - - - EP8_TRANSACTION - [16:16] - read-write - oneToClear - - - EP7_SEQ - [15:15] - read-write - oneToClear - - - EP7_TRANSACTION - [14:14] - read-write - oneToClear - - - EP6_SEQ - [13:13] - read-write - oneToClear - - - EP6_TRANSACTION - [12:12] - read-write - oneToClear - - - EP5_SEQ - [11:11] - read-write - oneToClear - - - EP5_TRANSACTION - [10:10] - read-write - oneToClear - - - EP4_SEQ - [9:9] - read-write - oneToClear - - - EP4_TRANSACTION - [8:8] - read-write - oneToClear - - - EP3_SEQ - [7:7] - read-write - oneToClear - - - EP3_TRANSACTION - [6:6] - read-write - oneToClear - - - EP2_SEQ - [5:5] - read-write - oneToClear - - - EP2_TRANSACTION - [4:4] - read-write - oneToClear - - - EP1_SEQ - [3:3] - read-write - oneToClear - - - EP1_TRANSACTION - [2:2] - read-write - oneToClear - - - EP0_SEQ - [1:1] - read-write - oneToClear - - - EP0_TRANSACTION - [0:0] - read-write - oneToClear - - - - - DEV_SM_WATCHDOG - Watchdog that forces the device state machine to idle and raises an interrupt if the device stays in a state that isn't idle for the configured limit. The counter is reset on every state transition. - Set limit while enable is low and then set the enable. - 0x114 - 0x00000000 - - - FIRED - [20:20] - read-write - oneToClear - - - RESET - Set to 1 to forcibly reset the device state machine on watchdog expiry - [19:19] - read-write - - - ENABLE - [18:18] - read-write - - - LIMIT - [17:0] - read-write - - - - - - - TRNG - ARM TrustZone RNG register block - 0x400F0000 - - 0x0 - 0x1EC - registers - - - TRNG_IRQ - 39 - - - - RNG_IMR - Interrupt masking. - 0x100 - 0x0000000F - - - RESERVED - RESERVED - [31:4] - read-only - - - VN_ERR_INT_MASK - 1'b1-mask interrupt, no interrupt will be generated. See RNG_ISR for an explanation on this interrupt. - [3:3] - read-write - - - CRNGT_ERR_INT_MASK - 1'b1-mask interrupt, no interrupt will be generated. See RNG_ISR for an explanation on this interrupt. - [2:2] - read-write - - - AUTOCORR_ERR_INT_MASK - 1'b1-mask interrupt, no interrupt will be generated. See RNG_ISR for an explanation on this interrupt. - [1:1] - read-write - - - EHR_VALID_INT_MASK - 1'b1-mask interrupt, no interrupt will be generated. See RNG_ISR for an explanation on this interrupt. - [0:0] - read-write - - - - - RNG_ISR - RNG status register. If corresponding RNG_IMR bit is unmasked, an interrupt will be generated. - 0x104 - 0x00000000 - - - RESERVED - RESERVED - [31:4] - read-only - - - VN_ERR - 1'b1 indicates Von Neuman error. Error in von Neuman occurs if 32 consecutive collected bits are identical, ZERO or ONE. - [3:3] - read-only - - - CRNGT_ERR - 1'b1 indicates CRNGT in the RNG test failed. Failure occurs when two consecutive blocks of 16 collected bits are equal. - [2:2] - read-only - - - AUTOCORR_ERR - 1'b1 indicates Autocorrelation test failed four times in a row. When set, RNG cease from functioning until next reset. - [1:1] - read-only - - - EHR_VALID - 1'b1 indicates that 192 bits have been collected in the RNG, and are ready to be read. - [0:0] - read-only - - - - - RNG_ICR - Interrupt/status bit clear Register. - 0x108 - 0x00000000 - - - RESERVED - RESERVED - [31:4] - read-only - - - VN_ERR - Write 1'b1 - clear corresponding bit in RNG_ISR. - [3:3] - read-write - - - CRNGT_ERR - Write 1'b1 - clear corresponding bit in RNG_ISR. - [2:2] - read-write - - - AUTOCORR_ERR - Cannot be cleared by SW! Only RNG reset clears this bit. - [1:1] - read-write - - - EHR_VALID - Write 1'b1 - clear corresponding bit in RNG_ISR. - [0:0] - read-write - - - - - TRNG_CONFIG - Selecting the inverter-chain length. - 0x10C - 0x00000000 - - - RESERVED - RESERVED - [31:2] - read-only - - - RND_SRC_SEL - Selects the number of inverters (out of four possible selections) in the ring oscillator (the entropy source). - [1:0] - read-write - - - - - TRNG_VALID - 192 bit collection indication. - 0x110 - 0x00000000 - - - RESERVED - RESERVED - [31:1] - read-only - - - EHR_VALID - 1'b1 indicates that collection of bits in the RNG is completed, and data can be read from EHR_DATA register. - [0:0] - read-only - - - - - EHR_DATA0 - RNG collected bits. - 0x114 - 0x00000000 - - - EHR_DATA0 - Bits [31:0] of Entropy Holding Register (EHR) - RNG output register - [31:0] - read-only - - - - - EHR_DATA1 - RNG collected bits. - 0x118 - 0x00000000 - - - EHR_DATA1 - Bits [63:32] of Entropy Holding Register (EHR) - RNG output register - [31:0] - read-only - - - - - EHR_DATA2 - RNG collected bits. - 0x11C - 0x00000000 - - - EHR_DATA2 - Bits [95:64] of Entropy Holding Register (EHR) - RNG output register - [31:0] - read-only - - - - - EHR_DATA3 - RNG collected bits. - 0x120 - 0x00000000 - - - EHR_DATA3 - Bits [127:96] of Entropy Holding Register (EHR) - RNG output register - [31:0] - read-only - - - - - EHR_DATA4 - RNG collected bits. - 0x124 - 0x00000000 - - - EHR_DATA4 - Bits [159:128] of Entropy Holding Register (EHR) - RNG output register - [31:0] - read-only - - - - - EHR_DATA5 - RNG collected bits. - 0x128 - 0x00000000 - - - EHR_DATA5 - Bits [191:160] of Entropy Holding Register (EHR) - RNG output register - [31:0] - read-only - - - - - RND_SOURCE_ENABLE - Enable signal for the random source. - 0x12C - 0x00000000 - - - RESERVED - RESERVED - [31:1] - read-only - - - RND_SRC_EN - * 1'b1 - entropy source is enabled. *1'b0 - entropy source is disabled - [0:0] - read-write - - - - - SAMPLE_CNT1 - Counts clocks between sampling of random bit. - 0x130 - 0x0000FFFF - - - SAMPLE_CNTR1 - Sets the number of rng_clk cycles between two consecutive ring oscillator samples. Note! If the Von-Neuman is bypassed, the minimum value for sample counter must not be less then decimal seventeen - [31:0] - read-write - - - - - AUTOCORR_STATISTIC - Statistic about Autocorrelation test activations. - 0x134 - 0x00000000 - - - RESERVED - RESERVED - [31:22] - read-only - - - AUTOCORR_FAILS - Count each time an autocorrelation test fails. Any write to the register reset the counter. Stop collecting statistic if one of the counters reached the limit. - [21:14] - read-write - - - AUTOCORR_TRYS - Count each time an autocorrelation test starts. Any write to the register reset the counter. Stop collecting statistic if one of the counters reached the limit. - [13:0] - read-write - - - - - TRNG_DEBUG_CONTROL - Debug register. - 0x138 - 0x00000000 - - - AUTO_CORRELATE_BYPASS - When set, the autocorrelation test in the TRNG module is bypassed. - [3:3] - read-write - - - TRNG_CRNGT_BYPASS - When set, the CRNGT test in the RNG is bypassed. - [2:2] - read-write - - - VNC_BYPASS - When set, the Von-Neuman balancer is bypassed (including the 32 consecutive bits test). - [1:1] - read-write - - - RESERVED - N/A - [0:0] - read-only - - - - - TRNG_SW_RESET - Generate internal SW reset within the RNG block. - 0x140 - 0x00000000 - - - RESERVED - RESERVED - [31:1] - read-only - - - TRNG_SW_RESET - Writing 1'b1 to this register causes an internal RNG reset. - [0:0] - read-write - - - - - RNG_DEBUG_EN_INPUT - Enable the RNG debug mode - 0x1B4 - 0x00000000 - - - RESERVED - RESERVED - [31:1] - read-only - - - RNG_DEBUG_EN - * 1'b1 - debug mode is enabled. *1'b0 - debug mode is disabled - [0:0] - read-write - - - - - TRNG_BUSY - RNG Busy indication. - 0x1B8 - 0x00000000 - - - RESERVED - RESERVED - [31:1] - read-only - - - TRNG_BUSY - Reflects rng_busy status. - [0:0] - read-only - - - - - RST_BITS_COUNTER - Reset the counter of collected bits in the RNG. - 0x1BC - 0x00000000 - - - RESERVED - RESERVED - [31:1] - read-only - - - RST_BITS_COUNTER - Writing any value to this address will reset the bits counter and RNG valid registers. RND_SORCE_ENABLE register must be unset in order for the reset to take place. - [0:0] - read-write - - - - - RNG_VERSION - Displays the version settings of the TRNG. - 0x1C0 - 0x00000000 - - - RESERVED - RESERVED - [31:8] - read-only - - - RNG_USE_5_SBOXES - * 1'b1 - 5 SBOX AES. *1'b0 - 20 SBOX AES - [7:7] - read-only - - - RESEEDING_EXISTS - * 1'b1 - Exists. *1'b0 - Does not exist - [6:6] - read-only - - - KAT_EXISTS - * 1'b1 - Exists. *1'b0 - Does not exist - [5:5] - read-only - - - PRNG_EXISTS - * 1'b1 - Exists. *1'b0 - Does not exist - [4:4] - read-only - - - TRNG_TESTS_BYPASS_EN - * 1'b1 - Exists. *1'b0 - Does not exist - [3:3] - read-only - - - AUTOCORR_EXISTS - * 1'b1 - Exists. *1'b0 - Does not exist - [2:2] - read-only - - - CRNGT_EXISTS - * 1'b1 - Exists. *1'b0 - Does not exist - [1:1] - read-only - - - EHR_WIDTH_192 - * 1'b1 - 192-bit EHR. *1'b0 - 128-bit EHR - [0:0] - read-only - - - - - RNG_BIST_CNTR_0 - Collected BIST results. - 0x1E0 - 0x00000000 - - - RESERVED - RESERVED - [31:22] - read-only - - - ROSC_CNTR_VAL - Reflects the results of RNG BIST counter. - [21:0] - read-only - - - - - RNG_BIST_CNTR_1 - Collected BIST results. - 0x1E4 - 0x00000000 - - - RESERVED - RESERVED - [31:22] - read-only - - - ROSC_CNTR_VAL - Reflects the results of RNG BIST counter. - [21:0] - read-only - - - - - RNG_BIST_CNTR_2 - Collected BIST results. - 0x1E8 - 0x00000000 - - - RESERVED - RESERVED - [31:22] - read-only - - - ROSC_CNTR_VAL - Reflects the results of RNG BIST counter. - [21:0] - read-only - - - - - - - GLITCH_DETECTOR - Glitch detector controls - 0x40158000 - - 0x0 - 0x18 - registers - - - - ARM - Forcibly arm the glitch detectors, if they are not already armed by OTP. When armed, any individual detector trigger will cause a restart of the switched core power domain's power-on reset state machine. - - Glitch detector triggers are recorded accumulatively in TRIG_STATUS. If the system is reset by a glitch detector trigger, this is recorded in POWMAN_CHIP_RESET. - - This register is Secure read/write only. - 0x0 - 0x00005BAD - - - ARM - [15:0] - read-write - - - no - Do not force the glitch detectors to be armed - 23469 - - - yes - Force the glitch detectors to be armed. (Any value other than ARM_NO counts as YES) - 0 - - - - - - - DISARM - 0x4 - 0x00000000 - - - DISARM - Forcibly disarm the glitch detectors, if they are armed by OTP. Ignored if ARM is YES. - - This register is Secure read/write only. - [15:0] - read-write - - - no - Do not disarm the glitch detectors. (Any value other than DISARM_YES counts as NO) - 0 - - - yes - Disarm the glitch detectors - 56495 - - - - - - - SENSITIVITY - Adjust the sensitivity of glitch detectors to values other than their OTP-provided defaults. - - This register is Secure read/write only. - 0x8 - 0x00000000 - - - DEFAULT - [31:24] - read-write - - - yes - Use the default sensitivity configured in OTP for all detectors. (Any value other than DEFAULT_NO counts as YES) - 0 - - - no - Do not use the default sensitivity configured in OTP. Instead use the value from this register. - 222 - - - - - DET3_INV - Must be the inverse of DET3, else the default value is used. - [15:14] - read-write - - - DET2_INV - Must be the inverse of DET2, else the default value is used. - [13:12] - read-write - - - DET1_INV - Must be the inverse of DET1, else the default value is used. - [11:10] - read-write - - - DET0_INV - Must be the inverse of DET0, else the default value is used. - [9:8] - read-write - - - DET3 - Set sensitivity for detector 3. Higher values are more sensitive. - [7:6] - read-write - - - DET2 - Set sensitivity for detector 2. Higher values are more sensitive. - [5:4] - read-write - - - DET1 - Set sensitivity for detector 1. Higher values are more sensitive. - [3:2] - read-write - - - DET0 - Set sensitivity for detector 0. Higher values are more sensitive. - [1:0] - read-write - - - - - LOCK - 0xC - 0x00000000 - - - LOCK - Write any nonzero value to disable writes to ARM, DISARM, SENSITIVITY and LOCK. This register is Secure read/write only. - [7:0] - read-write - - - - - TRIG_STATUS - Set when a detector output triggers. Write-1-clear. - - (May immediately return high if the detector remains in a failed state. Detectors can only be cleared by a full reset of the switched core power domain.) - - This register is Secure read/write only. - 0x10 - 0x00000000 - - - DET3 - [3:3] - read-write - oneToClear - - - DET2 - [2:2] - read-write - oneToClear - - - DET1 - [1:1] - read-write - oneToClear - - - DET0 - [0:0] - read-write - oneToClear - - - - - TRIG_FORCE - Simulate the firing of one or more detectors. Writing ones to this register will set the matching bits in STATUS_TRIG. - - If the glitch detectors are currently armed, writing ones will also immediately reset the switched core power domain, and set the reset reason latches in POWMAN_CHIP_RESET to indicate a glitch detector resets. - - This register is Secure read/write only. - 0x14 - 0x00000000 - - - TRIG_FORCE - [3:0] - write-only - - - - - - - OTP - SNPS OTP control IF (SBPI and RPi wrapper control) - 0x40120000 - - 0x0 - 0x174 - registers - - - OTP_IRQ - 38 - - - - SW_LOCK0 - Software lock register for page 0. - - Locks are initialised from the OTP lock pages at reset. This register can be written to further advance the lock state of each page (until next reset), and read to check the current lock state of a page. - 0x0 - 0x00000000 - - - NSEC - Non-secure lock status. Writes are OR'd with the current value. - [3:2] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - SEC - Secure lock status. Writes are OR'd with the current value. This field is read-only to Non-secure code. - [1:0] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - - - SW_LOCK1 - Software lock register for page 1. - - Locks are initialised from the OTP lock pages at reset. This register can be written to further advance the lock state of each page (until next reset), and read to check the current lock state of a page. - 0x4 - 0x00000000 - - - NSEC - Non-secure lock status. Writes are OR'd with the current value. - [3:2] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - SEC - Secure lock status. Writes are OR'd with the current value. This field is read-only to Non-secure code. - [1:0] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - - - SW_LOCK2 - Software lock register for page 2. - - Locks are initialised from the OTP lock pages at reset. This register can be written to further advance the lock state of each page (until next reset), and read to check the current lock state of a page. - 0x8 - 0x00000000 - - - NSEC - Non-secure lock status. Writes are OR'd with the current value. - [3:2] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - SEC - Secure lock status. Writes are OR'd with the current value. This field is read-only to Non-secure code. - [1:0] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - - - SW_LOCK3 - Software lock register for page 3. - - Locks are initialised from the OTP lock pages at reset. This register can be written to further advance the lock state of each page (until next reset), and read to check the current lock state of a page. - 0xC - 0x00000000 - - - NSEC - Non-secure lock status. Writes are OR'd with the current value. - [3:2] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - SEC - Secure lock status. Writes are OR'd with the current value. This field is read-only to Non-secure code. - [1:0] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - - - SW_LOCK4 - Software lock register for page 4. - - Locks are initialised from the OTP lock pages at reset. This register can be written to further advance the lock state of each page (until next reset), and read to check the current lock state of a page. - 0x10 - 0x00000000 - - - NSEC - Non-secure lock status. Writes are OR'd with the current value. - [3:2] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - SEC - Secure lock status. Writes are OR'd with the current value. This field is read-only to Non-secure code. - [1:0] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - - - SW_LOCK5 - Software lock register for page 5. - - Locks are initialised from the OTP lock pages at reset. This register can be written to further advance the lock state of each page (until next reset), and read to check the current lock state of a page. - 0x14 - 0x00000000 - - - NSEC - Non-secure lock status. Writes are OR'd with the current value. - [3:2] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - SEC - Secure lock status. Writes are OR'd with the current value. This field is read-only to Non-secure code. - [1:0] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - - - SW_LOCK6 - Software lock register for page 6. - - Locks are initialised from the OTP lock pages at reset. This register can be written to further advance the lock state of each page (until next reset), and read to check the current lock state of a page. - 0x18 - 0x00000000 - - - NSEC - Non-secure lock status. Writes are OR'd with the current value. - [3:2] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - SEC - Secure lock status. Writes are OR'd with the current value. This field is read-only to Non-secure code. - [1:0] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - - - SW_LOCK7 - Software lock register for page 7. - - Locks are initialised from the OTP lock pages at reset. This register can be written to further advance the lock state of each page (until next reset), and read to check the current lock state of a page. - 0x1C - 0x00000000 - - - NSEC - Non-secure lock status. Writes are OR'd with the current value. - [3:2] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - SEC - Secure lock status. Writes are OR'd with the current value. This field is read-only to Non-secure code. - [1:0] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - - - SW_LOCK8 - Software lock register for page 8. - - Locks are initialised from the OTP lock pages at reset. This register can be written to further advance the lock state of each page (until next reset), and read to check the current lock state of a page. - 0x20 - 0x00000000 - - - NSEC - Non-secure lock status. Writes are OR'd with the current value. - [3:2] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - SEC - Secure lock status. Writes are OR'd with the current value. This field is read-only to Non-secure code. - [1:0] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - - - SW_LOCK9 - Software lock register for page 9. - - Locks are initialised from the OTP lock pages at reset. This register can be written to further advance the lock state of each page (until next reset), and read to check the current lock state of a page. - 0x24 - 0x00000000 - - - NSEC - Non-secure lock status. Writes are OR'd with the current value. - [3:2] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - SEC - Secure lock status. Writes are OR'd with the current value. This field is read-only to Non-secure code. - [1:0] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - - - SW_LOCK10 - Software lock register for page 10. - - Locks are initialised from the OTP lock pages at reset. This register can be written to further advance the lock state of each page (until next reset), and read to check the current lock state of a page. - 0x28 - 0x00000000 - - - NSEC - Non-secure lock status. Writes are OR'd with the current value. - [3:2] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - SEC - Secure lock status. Writes are OR'd with the current value. This field is read-only to Non-secure code. - [1:0] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - - - SW_LOCK11 - Software lock register for page 11. - - Locks are initialised from the OTP lock pages at reset. This register can be written to further advance the lock state of each page (until next reset), and read to check the current lock state of a page. - 0x2C - 0x00000000 - - - NSEC - Non-secure lock status. Writes are OR'd with the current value. - [3:2] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - SEC - Secure lock status. Writes are OR'd with the current value. This field is read-only to Non-secure code. - [1:0] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - - - SW_LOCK12 - Software lock register for page 12. - - Locks are initialised from the OTP lock pages at reset. This register can be written to further advance the lock state of each page (until next reset), and read to check the current lock state of a page. - 0x30 - 0x00000000 - - - NSEC - Non-secure lock status. Writes are OR'd with the current value. - [3:2] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - SEC - Secure lock status. Writes are OR'd with the current value. This field is read-only to Non-secure code. - [1:0] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - - - SW_LOCK13 - Software lock register for page 13. - - Locks are initialised from the OTP lock pages at reset. This register can be written to further advance the lock state of each page (until next reset), and read to check the current lock state of a page. - 0x34 - 0x00000000 - - - NSEC - Non-secure lock status. Writes are OR'd with the current value. - [3:2] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - SEC - Secure lock status. Writes are OR'd with the current value. This field is read-only to Non-secure code. - [1:0] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - - - SW_LOCK14 - Software lock register for page 14. - - Locks are initialised from the OTP lock pages at reset. This register can be written to further advance the lock state of each page (until next reset), and read to check the current lock state of a page. - 0x38 - 0x00000000 - - - NSEC - Non-secure lock status. Writes are OR'd with the current value. - [3:2] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - SEC - Secure lock status. Writes are OR'd with the current value. This field is read-only to Non-secure code. - [1:0] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - - - SW_LOCK15 - Software lock register for page 15. - - Locks are initialised from the OTP lock pages at reset. This register can be written to further advance the lock state of each page (until next reset), and read to check the current lock state of a page. - 0x3C - 0x00000000 - - - NSEC - Non-secure lock status. Writes are OR'd with the current value. - [3:2] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - SEC - Secure lock status. Writes are OR'd with the current value. This field is read-only to Non-secure code. - [1:0] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - - - SW_LOCK16 - Software lock register for page 16. - - Locks are initialised from the OTP lock pages at reset. This register can be written to further advance the lock state of each page (until next reset), and read to check the current lock state of a page. - 0x40 - 0x00000000 - - - NSEC - Non-secure lock status. Writes are OR'd with the current value. - [3:2] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - SEC - Secure lock status. Writes are OR'd with the current value. This field is read-only to Non-secure code. - [1:0] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - - - SW_LOCK17 - Software lock register for page 17. - - Locks are initialised from the OTP lock pages at reset. This register can be written to further advance the lock state of each page (until next reset), and read to check the current lock state of a page. - 0x44 - 0x00000000 - - - NSEC - Non-secure lock status. Writes are OR'd with the current value. - [3:2] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - SEC - Secure lock status. Writes are OR'd with the current value. This field is read-only to Non-secure code. - [1:0] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - - - SW_LOCK18 - Software lock register for page 18. - - Locks are initialised from the OTP lock pages at reset. This register can be written to further advance the lock state of each page (until next reset), and read to check the current lock state of a page. - 0x48 - 0x00000000 - - - NSEC - Non-secure lock status. Writes are OR'd with the current value. - [3:2] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - SEC - Secure lock status. Writes are OR'd with the current value. This field is read-only to Non-secure code. - [1:0] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - - - SW_LOCK19 - Software lock register for page 19. - - Locks are initialised from the OTP lock pages at reset. This register can be written to further advance the lock state of each page (until next reset), and read to check the current lock state of a page. - 0x4C - 0x00000000 - - - NSEC - Non-secure lock status. Writes are OR'd with the current value. - [3:2] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - SEC - Secure lock status. Writes are OR'd with the current value. This field is read-only to Non-secure code. - [1:0] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - - - SW_LOCK20 - Software lock register for page 20. - - Locks are initialised from the OTP lock pages at reset. This register can be written to further advance the lock state of each page (until next reset), and read to check the current lock state of a page. - 0x50 - 0x00000000 - - - NSEC - Non-secure lock status. Writes are OR'd with the current value. - [3:2] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - SEC - Secure lock status. Writes are OR'd with the current value. This field is read-only to Non-secure code. - [1:0] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - - - SW_LOCK21 - Software lock register for page 21. - - Locks are initialised from the OTP lock pages at reset. This register can be written to further advance the lock state of each page (until next reset), and read to check the current lock state of a page. - 0x54 - 0x00000000 - - - NSEC - Non-secure lock status. Writes are OR'd with the current value. - [3:2] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - SEC - Secure lock status. Writes are OR'd with the current value. This field is read-only to Non-secure code. - [1:0] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - - - SW_LOCK22 - Software lock register for page 22. - - Locks are initialised from the OTP lock pages at reset. This register can be written to further advance the lock state of each page (until next reset), and read to check the current lock state of a page. - 0x58 - 0x00000000 - - - NSEC - Non-secure lock status. Writes are OR'd with the current value. - [3:2] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - SEC - Secure lock status. Writes are OR'd with the current value. This field is read-only to Non-secure code. - [1:0] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - - - SW_LOCK23 - Software lock register for page 23. - - Locks are initialised from the OTP lock pages at reset. This register can be written to further advance the lock state of each page (until next reset), and read to check the current lock state of a page. - 0x5C - 0x00000000 - - - NSEC - Non-secure lock status. Writes are OR'd with the current value. - [3:2] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - SEC - Secure lock status. Writes are OR'd with the current value. This field is read-only to Non-secure code. - [1:0] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - - - SW_LOCK24 - Software lock register for page 24. - - Locks are initialised from the OTP lock pages at reset. This register can be written to further advance the lock state of each page (until next reset), and read to check the current lock state of a page. - 0x60 - 0x00000000 - - - NSEC - Non-secure lock status. Writes are OR'd with the current value. - [3:2] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - SEC - Secure lock status. Writes are OR'd with the current value. This field is read-only to Non-secure code. - [1:0] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - - - SW_LOCK25 - Software lock register for page 25. - - Locks are initialised from the OTP lock pages at reset. This register can be written to further advance the lock state of each page (until next reset), and read to check the current lock state of a page. - 0x64 - 0x00000000 - - - NSEC - Non-secure lock status. Writes are OR'd with the current value. - [3:2] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - SEC - Secure lock status. Writes are OR'd with the current value. This field is read-only to Non-secure code. - [1:0] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - - - SW_LOCK26 - Software lock register for page 26. - - Locks are initialised from the OTP lock pages at reset. This register can be written to further advance the lock state of each page (until next reset), and read to check the current lock state of a page. - 0x68 - 0x00000000 - - - NSEC - Non-secure lock status. Writes are OR'd with the current value. - [3:2] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - SEC - Secure lock status. Writes are OR'd with the current value. This field is read-only to Non-secure code. - [1:0] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - - - SW_LOCK27 - Software lock register for page 27. - - Locks are initialised from the OTP lock pages at reset. This register can be written to further advance the lock state of each page (until next reset), and read to check the current lock state of a page. - 0x6C - 0x00000000 - - - NSEC - Non-secure lock status. Writes are OR'd with the current value. - [3:2] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - SEC - Secure lock status. Writes are OR'd with the current value. This field is read-only to Non-secure code. - [1:0] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - - - SW_LOCK28 - Software lock register for page 28. - - Locks are initialised from the OTP lock pages at reset. This register can be written to further advance the lock state of each page (until next reset), and read to check the current lock state of a page. - 0x70 - 0x00000000 - - - NSEC - Non-secure lock status. Writes are OR'd with the current value. - [3:2] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - SEC - Secure lock status. Writes are OR'd with the current value. This field is read-only to Non-secure code. - [1:0] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - - - SW_LOCK29 - Software lock register for page 29. - - Locks are initialised from the OTP lock pages at reset. This register can be written to further advance the lock state of each page (until next reset), and read to check the current lock state of a page. - 0x74 - 0x00000000 - - - NSEC - Non-secure lock status. Writes are OR'd with the current value. - [3:2] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - SEC - Secure lock status. Writes are OR'd with the current value. This field is read-only to Non-secure code. - [1:0] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - - - SW_LOCK30 - Software lock register for page 30. - - Locks are initialised from the OTP lock pages at reset. This register can be written to further advance the lock state of each page (until next reset), and read to check the current lock state of a page. - 0x78 - 0x00000000 - - - NSEC - Non-secure lock status. Writes are OR'd with the current value. - [3:2] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - SEC - Secure lock status. Writes are OR'd with the current value. This field is read-only to Non-secure code. - [1:0] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - - - SW_LOCK31 - Software lock register for page 31. - - Locks are initialised from the OTP lock pages at reset. This register can be written to further advance the lock state of each page (until next reset), and read to check the current lock state of a page. - 0x7C - 0x00000000 - - - NSEC - Non-secure lock status. Writes are OR'd with the current value. - [3:2] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - SEC - Secure lock status. Writes are OR'd with the current value. This field is read-only to Non-secure code. - [1:0] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - - - SW_LOCK32 - Software lock register for page 32. - - Locks are initialised from the OTP lock pages at reset. This register can be written to further advance the lock state of each page (until next reset), and read to check the current lock state of a page. - 0x80 - 0x00000000 - - - NSEC - Non-secure lock status. Writes are OR'd with the current value. - [3:2] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - SEC - Secure lock status. Writes are OR'd with the current value. This field is read-only to Non-secure code. - [1:0] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - - - SW_LOCK33 - Software lock register for page 33. - - Locks are initialised from the OTP lock pages at reset. This register can be written to further advance the lock state of each page (until next reset), and read to check the current lock state of a page. - 0x84 - 0x00000000 - - - NSEC - Non-secure lock status. Writes are OR'd with the current value. - [3:2] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - SEC - Secure lock status. Writes are OR'd with the current value. This field is read-only to Non-secure code. - [1:0] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - - - SW_LOCK34 - Software lock register for page 34. - - Locks are initialised from the OTP lock pages at reset. This register can be written to further advance the lock state of each page (until next reset), and read to check the current lock state of a page. - 0x88 - 0x00000000 - - - NSEC - Non-secure lock status. Writes are OR'd with the current value. - [3:2] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - SEC - Secure lock status. Writes are OR'd with the current value. This field is read-only to Non-secure code. - [1:0] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - - - SW_LOCK35 - Software lock register for page 35. - - Locks are initialised from the OTP lock pages at reset. This register can be written to further advance the lock state of each page (until next reset), and read to check the current lock state of a page. - 0x8C - 0x00000000 - - - NSEC - Non-secure lock status. Writes are OR'd with the current value. - [3:2] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - SEC - Secure lock status. Writes are OR'd with the current value. This field is read-only to Non-secure code. - [1:0] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - - - SW_LOCK36 - Software lock register for page 36. - - Locks are initialised from the OTP lock pages at reset. This register can be written to further advance the lock state of each page (until next reset), and read to check the current lock state of a page. - 0x90 - 0x00000000 - - - NSEC - Non-secure lock status. Writes are OR'd with the current value. - [3:2] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - SEC - Secure lock status. Writes are OR'd with the current value. This field is read-only to Non-secure code. - [1:0] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - - - SW_LOCK37 - Software lock register for page 37. - - Locks are initialised from the OTP lock pages at reset. This register can be written to further advance the lock state of each page (until next reset), and read to check the current lock state of a page. - 0x94 - 0x00000000 - - - NSEC - Non-secure lock status. Writes are OR'd with the current value. - [3:2] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - SEC - Secure lock status. Writes are OR'd with the current value. This field is read-only to Non-secure code. - [1:0] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - - - SW_LOCK38 - Software lock register for page 38. - - Locks are initialised from the OTP lock pages at reset. This register can be written to further advance the lock state of each page (until next reset), and read to check the current lock state of a page. - 0x98 - 0x00000000 - - - NSEC - Non-secure lock status. Writes are OR'd with the current value. - [3:2] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - SEC - Secure lock status. Writes are OR'd with the current value. This field is read-only to Non-secure code. - [1:0] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - - - SW_LOCK39 - Software lock register for page 39. - - Locks are initialised from the OTP lock pages at reset. This register can be written to further advance the lock state of each page (until next reset), and read to check the current lock state of a page. - 0x9C - 0x00000000 - - - NSEC - Non-secure lock status. Writes are OR'd with the current value. - [3:2] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - SEC - Secure lock status. Writes are OR'd with the current value. This field is read-only to Non-secure code. - [1:0] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - - - SW_LOCK40 - Software lock register for page 40. - - Locks are initialised from the OTP lock pages at reset. This register can be written to further advance the lock state of each page (until next reset), and read to check the current lock state of a page. - 0xA0 - 0x00000000 - - - NSEC - Non-secure lock status. Writes are OR'd with the current value. - [3:2] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - SEC - Secure lock status. Writes are OR'd with the current value. This field is read-only to Non-secure code. - [1:0] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - - - SW_LOCK41 - Software lock register for page 41. - - Locks are initialised from the OTP lock pages at reset. This register can be written to further advance the lock state of each page (until next reset), and read to check the current lock state of a page. - 0xA4 - 0x00000000 - - - NSEC - Non-secure lock status. Writes are OR'd with the current value. - [3:2] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - SEC - Secure lock status. Writes are OR'd with the current value. This field is read-only to Non-secure code. - [1:0] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - - - SW_LOCK42 - Software lock register for page 42. - - Locks are initialised from the OTP lock pages at reset. This register can be written to further advance the lock state of each page (until next reset), and read to check the current lock state of a page. - 0xA8 - 0x00000000 - - - NSEC - Non-secure lock status. Writes are OR'd with the current value. - [3:2] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - SEC - Secure lock status. Writes are OR'd with the current value. This field is read-only to Non-secure code. - [1:0] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - - - SW_LOCK43 - Software lock register for page 43. - - Locks are initialised from the OTP lock pages at reset. This register can be written to further advance the lock state of each page (until next reset), and read to check the current lock state of a page. - 0xAC - 0x00000000 - - - NSEC - Non-secure lock status. Writes are OR'd with the current value. - [3:2] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - SEC - Secure lock status. Writes are OR'd with the current value. This field is read-only to Non-secure code. - [1:0] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - - - SW_LOCK44 - Software lock register for page 44. - - Locks are initialised from the OTP lock pages at reset. This register can be written to further advance the lock state of each page (until next reset), and read to check the current lock state of a page. - 0xB0 - 0x00000000 - - - NSEC - Non-secure lock status. Writes are OR'd with the current value. - [3:2] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - SEC - Secure lock status. Writes are OR'd with the current value. This field is read-only to Non-secure code. - [1:0] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - - - SW_LOCK45 - Software lock register for page 45. - - Locks are initialised from the OTP lock pages at reset. This register can be written to further advance the lock state of each page (until next reset), and read to check the current lock state of a page. - 0xB4 - 0x00000000 - - - NSEC - Non-secure lock status. Writes are OR'd with the current value. - [3:2] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - SEC - Secure lock status. Writes are OR'd with the current value. This field is read-only to Non-secure code. - [1:0] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - - - SW_LOCK46 - Software lock register for page 46. - - Locks are initialised from the OTP lock pages at reset. This register can be written to further advance the lock state of each page (until next reset), and read to check the current lock state of a page. - 0xB8 - 0x00000000 - - - NSEC - Non-secure lock status. Writes are OR'd with the current value. - [3:2] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - SEC - Secure lock status. Writes are OR'd with the current value. This field is read-only to Non-secure code. - [1:0] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - - - SW_LOCK47 - Software lock register for page 47. - - Locks are initialised from the OTP lock pages at reset. This register can be written to further advance the lock state of each page (until next reset), and read to check the current lock state of a page. - 0xBC - 0x00000000 - - - NSEC - Non-secure lock status. Writes are OR'd with the current value. - [3:2] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - SEC - Secure lock status. Writes are OR'd with the current value. This field is read-only to Non-secure code. - [1:0] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - - - SW_LOCK48 - Software lock register for page 48. - - Locks are initialised from the OTP lock pages at reset. This register can be written to further advance the lock state of each page (until next reset), and read to check the current lock state of a page. - 0xC0 - 0x00000000 - - - NSEC - Non-secure lock status. Writes are OR'd with the current value. - [3:2] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - SEC - Secure lock status. Writes are OR'd with the current value. This field is read-only to Non-secure code. - [1:0] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - - - SW_LOCK49 - Software lock register for page 49. - - Locks are initialised from the OTP lock pages at reset. This register can be written to further advance the lock state of each page (until next reset), and read to check the current lock state of a page. - 0xC4 - 0x00000000 - - - NSEC - Non-secure lock status. Writes are OR'd with the current value. - [3:2] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - SEC - Secure lock status. Writes are OR'd with the current value. This field is read-only to Non-secure code. - [1:0] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - - - SW_LOCK50 - Software lock register for page 50. - - Locks are initialised from the OTP lock pages at reset. This register can be written to further advance the lock state of each page (until next reset), and read to check the current lock state of a page. - 0xC8 - 0x00000000 - - - NSEC - Non-secure lock status. Writes are OR'd with the current value. - [3:2] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - SEC - Secure lock status. Writes are OR'd with the current value. This field is read-only to Non-secure code. - [1:0] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - - - SW_LOCK51 - Software lock register for page 51. - - Locks are initialised from the OTP lock pages at reset. This register can be written to further advance the lock state of each page (until next reset), and read to check the current lock state of a page. - 0xCC - 0x00000000 - - - NSEC - Non-secure lock status. Writes are OR'd with the current value. - [3:2] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - SEC - Secure lock status. Writes are OR'd with the current value. This field is read-only to Non-secure code. - [1:0] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - - - SW_LOCK52 - Software lock register for page 52. - - Locks are initialised from the OTP lock pages at reset. This register can be written to further advance the lock state of each page (until next reset), and read to check the current lock state of a page. - 0xD0 - 0x00000000 - - - NSEC - Non-secure lock status. Writes are OR'd with the current value. - [3:2] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - SEC - Secure lock status. Writes are OR'd with the current value. This field is read-only to Non-secure code. - [1:0] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - - - SW_LOCK53 - Software lock register for page 53. - - Locks are initialised from the OTP lock pages at reset. This register can be written to further advance the lock state of each page (until next reset), and read to check the current lock state of a page. - 0xD4 - 0x00000000 - - - NSEC - Non-secure lock status. Writes are OR'd with the current value. - [3:2] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - SEC - Secure lock status. Writes are OR'd with the current value. This field is read-only to Non-secure code. - [1:0] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - - - SW_LOCK54 - Software lock register for page 54. - - Locks are initialised from the OTP lock pages at reset. This register can be written to further advance the lock state of each page (until next reset), and read to check the current lock state of a page. - 0xD8 - 0x00000000 - - - NSEC - Non-secure lock status. Writes are OR'd with the current value. - [3:2] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - SEC - Secure lock status. Writes are OR'd with the current value. This field is read-only to Non-secure code. - [1:0] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - - - SW_LOCK55 - Software lock register for page 55. - - Locks are initialised from the OTP lock pages at reset. This register can be written to further advance the lock state of each page (until next reset), and read to check the current lock state of a page. - 0xDC - 0x00000000 - - - NSEC - Non-secure lock status. Writes are OR'd with the current value. - [3:2] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - SEC - Secure lock status. Writes are OR'd with the current value. This field is read-only to Non-secure code. - [1:0] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - - - SW_LOCK56 - Software lock register for page 56. - - Locks are initialised from the OTP lock pages at reset. This register can be written to further advance the lock state of each page (until next reset), and read to check the current lock state of a page. - 0xE0 - 0x00000000 - - - NSEC - Non-secure lock status. Writes are OR'd with the current value. - [3:2] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - SEC - Secure lock status. Writes are OR'd with the current value. This field is read-only to Non-secure code. - [1:0] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - - - SW_LOCK57 - Software lock register for page 57. - - Locks are initialised from the OTP lock pages at reset. This register can be written to further advance the lock state of each page (until next reset), and read to check the current lock state of a page. - 0xE4 - 0x00000000 - - - NSEC - Non-secure lock status. Writes are OR'd with the current value. - [3:2] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - SEC - Secure lock status. Writes are OR'd with the current value. This field is read-only to Non-secure code. - [1:0] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - - - SW_LOCK58 - Software lock register for page 58. - - Locks are initialised from the OTP lock pages at reset. This register can be written to further advance the lock state of each page (until next reset), and read to check the current lock state of a page. - 0xE8 - 0x00000000 - - - NSEC - Non-secure lock status. Writes are OR'd with the current value. - [3:2] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - SEC - Secure lock status. Writes are OR'd with the current value. This field is read-only to Non-secure code. - [1:0] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - - - SW_LOCK59 - Software lock register for page 59. - - Locks are initialised from the OTP lock pages at reset. This register can be written to further advance the lock state of each page (until next reset), and read to check the current lock state of a page. - 0xEC - 0x00000000 - - - NSEC - Non-secure lock status. Writes are OR'd with the current value. - [3:2] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - SEC - Secure lock status. Writes are OR'd with the current value. This field is read-only to Non-secure code. - [1:0] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - - - SW_LOCK60 - Software lock register for page 60. - - Locks are initialised from the OTP lock pages at reset. This register can be written to further advance the lock state of each page (until next reset), and read to check the current lock state of a page. - 0xF0 - 0x00000000 - - - NSEC - Non-secure lock status. Writes are OR'd with the current value. - [3:2] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - SEC - Secure lock status. Writes are OR'd with the current value. This field is read-only to Non-secure code. - [1:0] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - - - SW_LOCK61 - Software lock register for page 61. - - Locks are initialised from the OTP lock pages at reset. This register can be written to further advance the lock state of each page (until next reset), and read to check the current lock state of a page. - 0xF4 - 0x00000000 - - - NSEC - Non-secure lock status. Writes are OR'd with the current value. - [3:2] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - SEC - Secure lock status. Writes are OR'd with the current value. This field is read-only to Non-secure code. - [1:0] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - - - SW_LOCK62 - Software lock register for page 62. - - Locks are initialised from the OTP lock pages at reset. This register can be written to further advance the lock state of each page (until next reset), and read to check the current lock state of a page. - 0xF8 - 0x00000000 - - - NSEC - Non-secure lock status. Writes are OR'd with the current value. - [3:2] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - SEC - Secure lock status. Writes are OR'd with the current value. This field is read-only to Non-secure code. - [1:0] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - - - SW_LOCK63 - Software lock register for page 63. - - Locks are initialised from the OTP lock pages at reset. This register can be written to further advance the lock state of each page (until next reset), and read to check the current lock state of a page. - 0xFC - 0x00000000 - - - NSEC - Non-secure lock status. Writes are OR'd with the current value. - [3:2] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - SEC - Secure lock status. Writes are OR'd with the current value. This field is read-only to Non-secure code. - [1:0] - read-write - - - read_write - 0 - - - read_only - 1 - - - inaccessible - 3 - - - - - - - SBPI_INSTR - Dispatch instructions to the SBPI interface, used for programming the OTP fuses. - 0x100 - 0x00000000 - - - EXEC - Execute instruction - [30:30] - write-only - - - IS_WR - Payload type is write - [29:29] - read-write - - - HAS_PAYLOAD - Instruction has payload (data to be written or to be read) - [28:28] - read-write - - - PAYLOAD_SIZE_M1 - Instruction payload size in bytes minus 1 - [27:24] - read-write - - - TARGET - Instruction target, it can be PMC (0x3a) or DAP (0x02) - [23:16] - read-write - - - CMD - [15:8] - read-write - - - SHORT_WDATA - wdata to be used only when payload_size_m1=0 - [7:0] - read-write - - - - - SBPI_WDATA_0 - SBPI write payload bytes 3..0 - 0x104 - 0x00000000 - - - SBPI_WDATA_0 - [31:0] - read-write - - - - - SBPI_WDATA_1 - SBPI write payload bytes 7..4 - 0x108 - 0x00000000 - - - SBPI_WDATA_1 - [31:0] - read-write - - - - - SBPI_WDATA_2 - SBPI write payload bytes 11..8 - 0x10C - 0x00000000 - - - SBPI_WDATA_2 - [31:0] - read-write - - - - - SBPI_WDATA_3 - SBPI write payload bytes 15..12 - 0x110 - 0x00000000 - - - SBPI_WDATA_3 - [31:0] - read-write - - - - - SBPI_RDATA_0 - Read payload bytes 3..0. Once read, the data in the register will automatically clear to 0. - 0x114 - 0x00000000 - - - SBPI_RDATA_0 - [31:0] - read-only - modify - - - - - SBPI_RDATA_1 - Read payload bytes 7..4. Once read, the data in the register will automatically clear to 0. - 0x118 - 0x00000000 - - - SBPI_RDATA_1 - [31:0] - read-only - modify - - - - - SBPI_RDATA_2 - Read payload bytes 11..8. Once read, the data in the register will automatically clear to 0. - 0x11C - 0x00000000 - - - SBPI_RDATA_2 - [31:0] - read-only - modify - - - - - SBPI_RDATA_3 - Read payload bytes 15..12. Once read, the data in the register will automatically clear to 0. - 0x120 - 0x00000000 - - - SBPI_RDATA_3 - [31:0] - read-only - modify - - - - - SBPI_STATUS - 0x124 - 0x00000000 - - - MISO - SBPI MISO (master in - slave out): response from SBPI - [23:16] - read-only - - - FLAG - SBPI flag - [12:12] - read-only - - - INSTR_MISS - Last instruction missed (dropped), as the previous has not finished running - [8:8] - read-write - oneToClear - - - INSTR_DONE - Last instruction done - [4:4] - read-write - oneToClear - - - RDATA_VLD - Read command has returned data - [0:0] - read-write - oneToClear - - - - - USR - Controls for APB data read interface (USER interface) - 0x128 - 0x00000001 - - - PD - Power-down; 1 disables current reference. Must be 0 to read data from the OTP. - [4:4] - read-write - - - DCTRL - 1 enables USER interface; 0 disables USER interface (enables SBPI). - - This bit must be cleared before performing any SBPI access, such as when programming the OTP. The APB data read interface (USER interface) will be inaccessible during this time, and will return a bus error if any read is attempted. - [0:0] - read-write - - - - - DBG - Debug for OTP power-on state machine - 0x12C - 0x00000000 - - - CUSTOMER_RMA_FLAG - The chip is in RMA mode - [12:12] - read-only - - - PSM_STATE - Monitor the PSM FSM's state - [7:4] - read-only - - - ROSC_UP - Ring oscillator is up and running - [3:3] - read-only - - - ROSC_UP_SEEN - Ring oscillator was seen up and running - [2:2] - read-write - oneToClear - - - BOOT_DONE - PSM boot done status flag - [1:1] - read-only - - - PSM_DONE - PSM done status flag - [0:0] - read-only - - - - - BIST - During BIST, count address locations that have at least one leaky bit - 0x134 - 0x0FFF0000 - - - CNT_FAIL - Flag if the count of address locations with at least one leaky bit exceeds cnt_max - [30:30] - read-only - - - CNT_CLR - Clear counter before use - [29:29] - write-only - - - CNT_ENA - Enable the counter before the BIST function is initiated - [28:28] - read-write - - - CNT_MAX - The cnt_fail flag will be set if the number of leaky locations exceeds this number - [27:16] - read-write - - - CNT - Number of locations that have at least one leaky bit. Note: This count is true only if the BIST was initiated without the fix option. - [12:0] - read-only - - - - - CRT_KEY_W0 - Word 0 (bits 31..0) of the key. Write only, read returns 0x0 - 0x138 - 0x00000000 - - - CRT_KEY_W0 - [31:0] - write-only - - - - - CRT_KEY_W1 - Word 1 (bits 63..32) of the key. Write only, read returns 0x0 - 0x13C - 0x00000000 - - - CRT_KEY_W1 - [31:0] - write-only - - - - - CRT_KEY_W2 - Word 2 (bits 95..64) of the key. Write only, read returns 0x0 - 0x140 - 0x00000000 - - - CRT_KEY_W2 - [31:0] - write-only - - - - - CRT_KEY_W3 - Word 3 (bits 127..96) of the key. Write only, read returns 0x0 - 0x144 - 0x00000000 - - - CRT_KEY_W3 - [31:0] - write-only - - - - - CRITICAL - Quickly check values of critical flags read during boot up - 0x148 - 0x00000000 - - - RISCV_DISABLE - [17:17] - read-only - - - ARM_DISABLE - [16:16] - read-only - - - GLITCH_DETECTOR_SENS - [6:5] - read-only - - - GLITCH_DETECTOR_ENABLE - [4:4] - read-only - - - DEFAULT_ARCHSEL - [3:3] - read-only - - - DEBUG_DISABLE - [2:2] - read-only - - - SECURE_DEBUG_DISABLE - [1:1] - read-only - - - SECURE_BOOT_ENABLE - [0:0] - read-only - - - - - KEY_VALID - Which keys were valid (enrolled) at boot time - 0x14C - 0x00000000 - - - KEY_VALID - [7:0] - read-only - - - - - DEBUGEN - Enable a debug feature that has been disabled. Debug features are disabled if one of the relevant critical boot flags is set in OTP (DEBUG_DISABLE or SECURE_DEBUG_DISABLE), OR if a debug key is marked valid in OTP, and the matching key value has not been supplied over SWD. - - Specifically: - - - The DEBUG_DISABLE flag disables all debug features. This can be fully overridden by setting all bits of this register. - - - The SECURE_DEBUG_DISABLE flag disables secure processor debug. This can be fully overridden by setting the PROC0_SECURE and PROC1_SECURE bits of this register. - - - If a single debug key has been registered, and no matching key value has been supplied over SWD, then all debug features are disabled. This can be fully overridden by setting all bits of this register. - - - If both debug keys have been registered, and the Non-secure key's value (key 6) has been supplied over SWD, secure processor debug is disabled. This can be fully overridden by setting the PROC0_SECURE and PROC1_SECURE bits of this register. - - - If both debug keys have been registered, and the Secure key's value (key 5) has been supplied over SWD, then no debug features are disabled by the key mechanism. However, note that in this case debug features may still be disabled by the critical boot flags. - 0x150 - 0x00000000 - - - MISC - Enable other debug components. Specifically, the CTI, and the APB-AP used to access the RISC-V Debug Module. - - These components are disabled by default if either of the debug disable critical flags is set, or if at least one debug key has been enrolled and the least secure of these enrolled key values has not been provided over SWD. - [8:8] - read-write - - - PROC1_SECURE - Permit core 1's Mem-AP to generate Secure accesses, assuming it is enabled at all. Also enable secure debug of core 1 (SPIDEN and SPNIDEN). - - Secure debug of core 1 is disabled by default if the secure debug disable critical flag is set, or if at least one debug key has been enrolled and the most secure of these enrolled key values not yet provided over SWD. - [3:3] - read-write - - - PROC1 - Enable core 1's Mem-AP if it is currently disabled. - - The Mem-AP is disabled by default if either of the debug disable critical flags is set, or if at least one debug key has been enrolled and the least secure of these enrolled key values has not been provided over SWD. - [2:2] - read-write - - - PROC0_SECURE - Permit core 0's Mem-AP to generate Secure accesses, assuming it is enabled at all. Also enable secure debug of core 0 (SPIDEN and SPNIDEN). - - Secure debug of core 0 is disabled by default if the secure debug disable critical flag is set, or if at least one debug key has been enrolled and the most secure of these enrolled key values not yet provided over SWD. - - Note also that core Mem-APs are unconditionally disabled when a core is switched to RISC-V mode (by setting the ARCHSEL bit and performing a warm reset of the core). - [1:1] - read-write - - - PROC0 - Enable core 0's Mem-AP if it is currently disabled. - - The Mem-AP is disabled by default if either of the debug disable critical flags is set, or if at least one debug key has been enrolled and the least secure of these enrolled key values has not been provided over SWD. - - Note also that core Mem-APs are unconditionally disabled when a core is switched to RISC-V mode (by setting the ARCHSEL bit and performing a warm reset of the core). - [0:0] - read-write - - - - - DEBUGEN_LOCK - Write 1s to lock corresponding bits in DEBUGEN. This register is reset by the processor cold reset. - 0x154 - 0x00000000 - - - MISC - Write 1 to lock the MISC bit of DEBUGEN. Can't be cleared once set. - [8:8] - read-write - - - PROC1_SECURE - Write 1 to lock the PROC1_SECURE bit of DEBUGEN. Can't be cleared once set. - [3:3] - read-write - - - PROC1 - Write 1 to lock the PROC1 bit of DEBUGEN. Can't be cleared once set. - [2:2] - read-write - - - PROC0_SECURE - Write 1 to lock the PROC0_SECURE bit of DEBUGEN. Can't be cleared once set. - [1:1] - read-write - - - PROC0 - Write 1 to lock the PROC0 bit of DEBUGEN. Can't be cleared once set. - [0:0] - read-write - - - - - ARCHSEL - Architecture select (Arm/RISC-V). The default and allowable values of this register are constrained by the critical boot flags. - - This register is reset by the earliest reset in the switched core power domain (before a processor cold reset). - - Cores sample their architecture select signal on a warm reset. The source of the warm reset could be the system power-up state machine, the watchdog timer, Arm SYSRESETREQ or from RISC-V hartresetreq. - - Note that when an Arm core is deselected, its cold reset domain is also held in reset, since in particular the SYSRESETREQ bit becomes inaccessible once the core is deselected. Note also the RISC-V cores do not have a cold reset domain, since their corresponding controls are located in the Debug Module. - 0x158 - 0x00000000 - - - CORE1 - Select architecture for core 1. - [1:1] - read-write - - - arm - Switch core 1 to Arm (Cortex-M33) - 0 - - - riscv - Switch core 1 to RISC-V (Hazard3) - 1 - - - - - CORE0 - Select architecture for core 0. - [0:0] - read-write - - - arm - Switch core 0 to Arm (Cortex-M33) - 0 - - - riscv - Switch core 0 to RISC-V (Hazard3) - 1 - - - - - - - ARCHSEL_STATUS - Get the current architecture select state of each core. Cores sample the current value of the ARCHSEL register when their warm reset is released, at which point the corresponding bit in this register will also update. - 0x15C - 0x00000000 - - - CORE1 - Current architecture for core 0. Updated on processor warm reset. - [1:1] - read-only - - - arm - Core 1 is currently Arm (Cortex-M33) - 0 - - - riscv - Core 1 is currently RISC-V (Hazard3) - 1 - - - - - CORE0 - Current architecture for core 0. Updated on processor warm reset. - [0:0] - read-only - - - arm - Core 0 is currently Arm (Cortex-M33) - 0 - - - riscv - Core 0 is currently RISC-V (Hazard3) - 1 - - - - - - - BOOTDIS - Tell the bootrom to ignore scratch register boot vectors (both power manager and watchdog) on the next power up. - - If an early boot stage has soft-locked some OTP pages in order to protect their contents from later stages, there is a risk that Secure code running at a later stage can unlock the pages by performing a watchdog reset that resets the OTP. - - This register can be used to ensure that the bootloader runs as normal on the next power up, preventing Secure code at a later stage from accessing OTP in its unlocked state. - - Should be used in conjunction with the power manager BOOTDIS register. - 0x160 - 0x00000000 - - - NEXT - This flag always ORs writes into its current contents. It can be set but not cleared by software. - - The BOOTDIS_NEXT bit is OR'd into the BOOTDIS_NOW bit when the core is powered down. Simultaneously, the BOOTDIS_NEXT bit is cleared. Setting this bit means that the boot scratch registers will be ignored following the next core power down. - - This flag should be set by an early boot stage that has soft-locked OTP pages, to prevent later stages from unlocking it via watchdog reset. - [1:1] - read-write - - - NOW - When the core is powered down, the current value of BOOTDIS_NEXT is OR'd into BOOTDIS_NOW, and BOOTDIS_NEXT is cleared. - - The bootrom checks this flag before reading the boot scratch registers. If it is set, the bootrom clears it, and ignores the BOOT registers. This prevents Secure software from diverting the boot path before a bootloader has had the chance to soft lock OTP pages containing sensitive data. - [0:0] - read-write - oneToClear - - - - - INTR - Raw Interrupts - 0x164 - 0x00000000 - - - APB_RD_NSEC_FAIL - [4:4] - read-write - oneToClear - - - APB_RD_SEC_FAIL - [3:3] - read-write - oneToClear - - - APB_DCTRL_FAIL - [2:2] - read-write - oneToClear - - - SBPI_WR_FAIL - [1:1] - read-write - oneToClear - - - SBPI_FLAG_N - [0:0] - read-only - - - - - INTE - Interrupt Enable - 0x168 - 0x00000000 - - - APB_RD_NSEC_FAIL - [4:4] - read-write - - - APB_RD_SEC_FAIL - [3:3] - read-write - - - APB_DCTRL_FAIL - [2:2] - read-write - - - SBPI_WR_FAIL - [1:1] - read-write - - - SBPI_FLAG_N - [0:0] - read-write - - - - - INTF - Interrupt Force - 0x16C - 0x00000000 - - - APB_RD_NSEC_FAIL - [4:4] - read-write - - - APB_RD_SEC_FAIL - [3:3] - read-write - - - APB_DCTRL_FAIL - [2:2] - read-write - - - SBPI_WR_FAIL - [1:1] - read-write - - - SBPI_FLAG_N - [0:0] - read-write - - - - - INTS - Interrupt status after masking & forcing - 0x170 - 0x00000000 - - - APB_RD_NSEC_FAIL - [4:4] - read-only - - - APB_RD_SEC_FAIL - [3:3] - read-only - - - APB_DCTRL_FAIL - [2:2] - read-only - - - SBPI_WR_FAIL - [1:1] - read-only - - - SBPI_FLAG_N - [0:0] - read-only - - - - - - - OTP_DATA - Predefined OTP data layout for RP2350 - 0x40130000 - - 0x0 - 0x1EF0 - registers - - - - CHIPID0 - Bits 15:0 of public device ID. (ECC) - - The CHIPID0..3 rows contain a 64-bit random identifier for this chip, which can be read from the USB bootloader PICOBOOT interface or from the get_sys_info ROM API. - - The number of random bits makes the occurrence of twins exceedingly unlikely: for example, a fleet of a hundred million devices has a 99.97% probability of no twinned IDs. This is estimated to be lower than the occurrence of process errors in the assignment of sequential random IDs, and for practical purposes CHIPID may be treated as unique. - 0x0 - 0x10 - 0x00000000 - - - CHIPID0 - [15:0] - read-only - - - - - CHIPID1 - Bits 31:16 of public device ID (ECC) - 0x2 - 0x10 - 0x00000000 - - - CHIPID1 - [15:0] - read-only - - - - - CHIPID2 - Bits 47:32 of public device ID (ECC) - 0x4 - 0x10 - 0x00000000 - - - CHIPID2 - [15:0] - read-only - - - - - CHIPID3 - Bits 63:48 of public device ID (ECC) - 0x6 - 0x10 - 0x00000000 - - - CHIPID3 - [15:0] - read-only - - - - - RANDID0 - Bits 15:0 of private per-device random number (ECC) - - The RANDID0..7 rows form a 128-bit random number generated during device test. - - This ID is not exposed through the USB PICOBOOT GET_INFO command or the ROM `get_sys_info()` API. However note that the USB PICOBOOT OTP access point can read the entirety of page 0, so this value is not meaningfully private unless the USB PICOBOOT interface is disabled via the DISABLE_BOOTSEL_USB_PICOBOOT_IFC flag in BOOT_FLAGS0. - 0x8 - 0x10 - 0x00000000 - - - RANDID0 - [15:0] - read-only - - - - - RANDID1 - Bits 31:16 of private per-device random number (ECC) - 0xA - 0x10 - 0x00000000 - - - RANDID1 - [15:0] - read-only - - - - - RANDID2 - Bits 47:32 of private per-device random number (ECC) - 0xC - 0x10 - 0x00000000 - - - RANDID2 - [15:0] - read-only - - - - - RANDID3 - Bits 63:48 of private per-device random number (ECC) - 0xE - 0x10 - 0x00000000 - - - RANDID3 - [15:0] - read-only - - - - - RANDID4 - Bits 79:64 of private per-device random number (ECC) - 0x10 - 0x10 - 0x00000000 - - - RANDID4 - [15:0] - read-only - - - - - RANDID5 - Bits 95:80 of private per-device random number (ECC) - 0x12 - 0x10 - 0x00000000 - - - RANDID5 - [15:0] - read-only - - - - - RANDID6 - Bits 111:96 of private per-device random number (ECC) - 0x14 - 0x10 - 0x00000000 - - - RANDID6 - [15:0] - read-only - - - - - RANDID7 - Bits 127:112 of private per-device random number (ECC) - 0x16 - 0x10 - 0x00000000 - - - RANDID7 - [15:0] - read-only - - - - - ROSC_CALIB - Ring oscillator frequency in kHz, measured during manufacturing (ECC) - - This is measured at 1.1 V, at room temperature, with the ROSC configuration registers in their reset state. - 0x20 - 0x10 - 0x00000000 - - - ROSC_CALIB - [15:0] - read-only - - - - - LPOSC_CALIB - Low-power oscillator frequency in Hz, measured during manufacturing (ECC) - - This is measured at 1.1V, at room temperature, with the LPOSC trim register in its reset state. - 0x22 - 0x10 - 0x00000000 - - - LPOSC_CALIB - [15:0] - read-only - - - - - NUM_GPIOS - The number of main user GPIOs (bank 0). Should read 48 in the QFN80 package, and 30 in the QFN60 package. (ECC) - 0x30 - 0x10 - 0x00000000 - - - NUM_GPIOS - [7:0] - read-only - - - - - INFO_CRC0 - Lower 16 bits of CRC32 of OTP addresses 0x00 through 0x6b (polynomial 0x4c11db7, input reflected, output reflected, seed all-ones, final XOR all-ones) (ECC) - 0x6C - 0x10 - 0x00000000 - - - INFO_CRC0 - [15:0] - read-only - - - - - INFO_CRC1 - Upper 16 bits of CRC32 of OTP addresses 0x00 through 0x6b (ECC) - 0x6E - 0x10 - 0x00000000 - - - INFO_CRC1 - [15:0] - read-only - - - - - FLASH_DEVINFO - Stores information about external flash device(s). (ECC) - - Assumed to be valid if BOOT_FLAGS0_FLASH_DEVINFO_ENABLE is set. - 0xA8 - 0x10 - 0x00000000 - - - CS1_SIZE - The size of the flash/PSRAM device on chip select 1 (addressable at 0x11000000 through 0x11ffffff). - - A value of zero is decoded as a size of zero (no device). Nonzero values are decoded as 4kiB << CS1_SIZE. For example, four megabytes is encoded with a CS1_SIZE value of 10, and 16 megabytes is encoded with a CS1_SIZE value of 12. - - When BOOT_FLAGS0_FLASH_DEVINFO_ENABLE is not set, a default of zero is used. - [15:12] - read-only - - - NONE - 0 - - - 8K - 1 - - - 16K - 2 - - - 32K - 3 - - - 64k - 4 - - - 128K - 5 - - - 256K - 6 - - - 512K - 7 - - - 1M - 8 - - - 2M - 9 - - - 4M - 10 - - - 8M - 11 - - - 16M - 12 - - - - - CS0_SIZE - The size of the flash/PSRAM device on chip select 0 (addressable at 0x10000000 through 0x10ffffff). - - A value of zero is decoded as a size of zero (no device). Nonzero values are decoded as 4kiB << CS0_SIZE. For example, four megabytes is encoded with a CS0_SIZE value of 10, and 16 megabytes is encoded with a CS0_SIZE value of 12. - - When BOOT_FLAGS0_FLASH_DEVINFO_ENABLE is not set, a default of 12 (16 MiB) is used. - [11:8] - read-only - - - NONE - 0 - - - 8K - 1 - - - 16K - 2 - - - 32K - 3 - - - 64k - 4 - - - 128K - 5 - - - 256K - 6 - - - 512K - 7 - - - 1M - 8 - - - 2M - 9 - - - 4M - 10 - - - 8M - 11 - - - 16M - 12 - - - - - D8H_ERASE_SUPPORTED - If true, all attached devices are assumed to support (or ignore, in the case of PSRAM) a block erase command with a command prefix of D8h, an erase size of 64 kiB, and a 24-bit address. Almost all 25-series flash devices support this command. - - If set, the bootrom will use the D8h erase command where it is able, to accelerate bulk erase operations. This makes flash programming faster. - - When BOOT_FLAGS0_FLASH_DEVINFO_ENABLE is not set, this field defaults to false. - [7:7] - read-only - - - CS1_GPIO - Indicate a GPIO number to be used for the secondary flash chip select (CS1), which selects the external QSPI device mapped at system addresses 0x11000000 through 0x11ffffff. There is no such configuration for CS0, as the primary chip select has a dedicated pin. - - On RP2350 the permissible GPIO numbers are 0, 8, 19 and 47. - - Ignored if CS1_size is zero. If CS1_SIZE is nonzero, the bootrom will automatically configure this GPIO as a second chip select upon entering the flash boot path, or entering any other path that may use the QSPI flash interface, such as BOOTSEL mode (nsboot). - [5:0] - read-only - - - - - FLASH_PARTITION_SLOT_SIZE - Gap between partition table slot 0 and slot 1 at the start of flash (the default size is 4096 bytes) (ECC) Enabled by the OVERRIDE_FLASH_PARTITION_SLOT_SIZE bit in BOOT_FLAGS, the size is 4096 * (value + 1) - 0xAA - 0x10 - 0x00000000 - - - FLASH_PARTITION_SLOT_SIZE - [15:0] - read-only - - - - - BOOTSEL_LED_CFG - Pin configuration for LED status, used by USB bootloader. (ECC) - Must be valid if BOOT_FLAGS0_ENABLE_BOOTSEL_LED is set. - 0xAC - 0x10 - 0x00000000 - - - ACTIVELOW - LED is active-low. (Default: active-high.) - [8:8] - read-only - - - PIN - GPIO index to use for bootloader activity LED. - [5:0] - read-only - - - - - BOOTSEL_PLL_CFG - Optional PLL configuration for BOOTSEL mode. (ECC) - - This should be configured to produce an exact 48 MHz based on the crystal oscillator frequency. User mode software may also use this value to calculate the expected crystal frequency based on an assumed 48 MHz PLL output. - - If no configuration is given, the crystal is assumed to be 12 MHz. - - The PLL frequency can be calculated as: - - PLL out = (XOSC frequency / (REFDIV+1)) x FBDIV / (POSTDIV1 x POSTDIV2) - - Conversely the crystal frequency can be calculated as: - - XOSC frequency = 48 MHz x (REFDIV+1) x (POSTDIV1 x POSTDIV2) / FBDIV - - (Note the +1 on REFDIV is because the value stored in this OTP location is the actual divisor value minus one.) - - Used if and only if ENABLE_BOOTSEL_NON_DEFAULT_PLL_XOSC_CFG is set in BOOT_FLAGS0. That bit should be set only after this row and BOOTSEL_XOSC_CFG are both correctly programmed. - 0xAE - 0x10 - 0x00000000 - - - REFDIV - PLL reference divisor, minus one. - - Programming a value of 0 means a reference divisor of 1. Programming a value of 1 means a reference divisor of 2 (for exceptionally fast XIN inputs) - [15:15] - read-only - - - POSTDIV2 - PLL post-divide 2 divisor, in the range 1..7 inclusive. - [14:12] - read-only - - - POSTDIV1 - PLL post-divide 1 divisor, in the range 1..7 inclusive. - [11:9] - read-only - - - FBDIV - PLL feedback divisor, in the range 16..320 inclusive. - [8:0] - read-only - - - - - BOOTSEL_XOSC_CFG - Non-default crystal oscillator configuration for the USB bootloader. (ECC) - - These values may also be used by user code configuring the crystal oscillator. - - Used if and only if ENABLE_BOOTSEL_NON_DEFAULT_PLL_XOSC_CFG is set in BOOT_FLAGS0. That bit should be set only after this row and BOOTSEL_PLL_CFG are both correctly programmed. - 0xB0 - 0x10 - 0x00000000 - - - RANGE - Value of the XOSC_CTRL_FREQ_RANGE register. - [15:14] - read-only - - - 1_15MHZ - 0 - - - 10_30MHZ - 1 - - - 25_60MHZ - 2 - - - 40_100MHZ - 3 - - - - - STARTUP - Value of the XOSC_STARTUP register - [13:0] - read-only - - - - - USB_WHITE_LABEL_ADDR - Row index of the USB_WHITE_LABEL structure within OTP (ECC) - - The table has 16 rows, each of which are also ECC and marked valid by the corresponding valid bit in USB_BOOT_FLAGS (ECC). - - The entries are either _VALUEs where the 16 bit value is used as is, or _STRDEFs which acts as a pointers to a string value. - - The value stored in a _STRDEF is two separate bytes: The low seven bits of the first (LSB) byte indicates the number of characters in the string, and the top bit of the first (LSB) byte if set to indicate that each character in the string is two bytes (Unicode) versus one byte if unset. The second (MSB) byte represents the location of the string data, and is encoded as the number of rows from this USB_WHITE_LABEL_ADDR; i.e. the row of the start of the string is USB_WHITE_LABEL_ADDR value + msb_byte. - - In each case, the corresponding valid bit enables replacing the default value for the corresponding item provided by the boot rom. - - Note that Unicode _STRDEFs are only supported for USB_DEVICE_PRODUCT_STRDEF, USB_DEVICE_SERIAL_NUMBER_STRDEF and USB_DEVICE_MANUFACTURER_STRDEF. Unicode values will be ignored if specified for other fields, and non-unicode values for these three items will be converted to Unicode characters by setting the upper 8 bits to zero. - - Note that if the USB_WHITE_LABEL structure or the corresponding strings are not readable by BOOTSEL mode based on OTP permissions, or if alignment requirements are not met, then the corresponding default values are used. - - The index values indicate where each field is located (row USB_WHITE_LABEL_ADDR value + index): - 0xB8 - 0x10 - 0x00000000 - - - USB_WHITE_LABEL_ADDR - [15:0] - read-only - - - INDEX_USB_DEVICE_VID_VALUE - 0 - - - INDEX_USB_DEVICE_PID_VALUE - 1 - - - INDEX_USB_DEVICE_BCD_DEVICE_VALUE - 2 - - - INDEX_USB_DEVICE_LANG_ID_VALUE - 3 - - - INDEX_USB_DEVICE_MANUFACTURER_STRDEF - 4 - - - INDEX_USB_DEVICE_PRODUCT_STRDEF - 5 - - - INDEX_USB_DEVICE_SERIAL_NUMBER_STRDEF - 6 - - - INDEX_USB_CONFIG_ATTRIBUTES_MAX_POWER_VALUES - 7 - - - INDEX_VOLUME_LABEL_STRDEF - 8 - - - INDEX_SCSI_INQUIRY_VENDOR_STRDEF - 9 - - - INDEX_SCSI_INQUIRY_PRODUCT_STRDEF - 10 - - - INDEX_SCSI_INQUIRY_VERSION_STRDEF - 11 - - - INDEX_INDEX_HTM_REDIRECT_URL_STRDEF - 12 - - - INDEX_INDEX_HTM_REDIRECT_NAME_STRDEF - 13 - - - INDEX_INFO_UF2_TXT_MODEL_STRDEF - 14 - - - INDEX_INFO_UF2_TXT_BOARD_ID_STRDEF - 15 - - - - - - - OTPBOOT_SRC - OTP start row for the OTP boot image. (ECC) - - If OTP boot is enabled, the bootrom will load from this location into SRAM and then directly enter the loaded image. Note that the image must be signed if SECURE_BOOT_ENABLE is set. The image itself is assumed to be ECC-protected. - - This must be an even number. Equivalently, the OTP boot image must start at a word-aligned location in the ECC read data address window. - 0xBC - 0x10 - 0x00000000 - - - OTPBOOT_SRC - [15:0] - read-only - - - - - OTPBOOT_LEN - Length in rows of the OTP boot image. (ECC) - - OTPBOOT_LEN must be even. The total image size must be a multiple of 4 bytes (32 bits). - 0xBE - 0x10 - 0x00000000 - - - OTPBOOT_LEN - [15:0] - read-only - - - - - OTPBOOT_DST0 - Bits 15:0 of the OTP boot image load destination (and entry point). (ECC) - - This must be a location in main SRAM (main SRAM is addresses 0x20000000 through 0x20082000) and must be word-aligned. - 0xC0 - 0x10 - 0x00000000 - - - OTPBOOT_DST0 - [15:0] - read-only - - - - - OTPBOOT_DST1 - Bits 31:16 of the OTP boot image load destination (and entry point). (ECC) - - This must be a location in main SRAM (main SRAM is addresses 0x20000000 through 0x20082000) and must be word-aligned. - 0xC2 - 0x10 - 0x00000000 - - - OTPBOOT_DST1 - [15:0] - read-only - - - - - BOOTKEY0_0 - Bits 15:0 of SHA-256 hash of boot key 0 (ECC) - 0x100 - 0x10 - 0x00000000 - - - BOOTKEY0_0 - [15:0] - read-only - - - - - BOOTKEY0_1 - Bits 31:16 of SHA-256 hash of boot key 0 (ECC) - 0x102 - 0x10 - 0x00000000 - - - BOOTKEY0_1 - [15:0] - read-only - - - - - BOOTKEY0_2 - Bits 47:32 of SHA-256 hash of boot key 0 (ECC) - 0x104 - 0x10 - 0x00000000 - - - BOOTKEY0_2 - [15:0] - read-only - - - - - BOOTKEY0_3 - Bits 63:48 of SHA-256 hash of boot key 0 (ECC) - 0x106 - 0x10 - 0x00000000 - - - BOOTKEY0_3 - [15:0] - read-only - - - - - BOOTKEY0_4 - Bits 79:64 of SHA-256 hash of boot key 0 (ECC) - 0x108 - 0x10 - 0x00000000 - - - BOOTKEY0_4 - [15:0] - read-only - - - - - BOOTKEY0_5 - Bits 95:80 of SHA-256 hash of boot key 0 (ECC) - 0x10A - 0x10 - 0x00000000 - - - BOOTKEY0_5 - [15:0] - read-only - - - - - BOOTKEY0_6 - Bits 111:96 of SHA-256 hash of boot key 0 (ECC) - 0x10C - 0x10 - 0x00000000 - - - BOOTKEY0_6 - [15:0] - read-only - - - - - BOOTKEY0_7 - Bits 127:112 of SHA-256 hash of boot key 0 (ECC) - 0x10E - 0x10 - 0x00000000 - - - BOOTKEY0_7 - [15:0] - read-only - - - - - BOOTKEY0_8 - Bits 143:128 of SHA-256 hash of boot key 0 (ECC) - 0x110 - 0x10 - 0x00000000 - - - BOOTKEY0_8 - [15:0] - read-only - - - - - BOOTKEY0_9 - Bits 159:144 of SHA-256 hash of boot key 0 (ECC) - 0x112 - 0x10 - 0x00000000 - - - BOOTKEY0_9 - [15:0] - read-only - - - - - BOOTKEY0_10 - Bits 175:160 of SHA-256 hash of boot key 0 (ECC) - 0x114 - 0x10 - 0x00000000 - - - BOOTKEY0_10 - [15:0] - read-only - - - - - BOOTKEY0_11 - Bits 191:176 of SHA-256 hash of boot key 0 (ECC) - 0x116 - 0x10 - 0x00000000 - - - BOOTKEY0_11 - [15:0] - read-only - - - - - BOOTKEY0_12 - Bits 207:192 of SHA-256 hash of boot key 0 (ECC) - 0x118 - 0x10 - 0x00000000 - - - BOOTKEY0_12 - [15:0] - read-only - - - - - BOOTKEY0_13 - Bits 223:208 of SHA-256 hash of boot key 0 (ECC) - 0x11A - 0x10 - 0x00000000 - - - BOOTKEY0_13 - [15:0] - read-only - - - - - BOOTKEY0_14 - Bits 239:224 of SHA-256 hash of boot key 0 (ECC) - 0x11C - 0x10 - 0x00000000 - - - BOOTKEY0_14 - [15:0] - read-only - - - - - BOOTKEY0_15 - Bits 255:240 of SHA-256 hash of boot key 0 (ECC) - 0x11E - 0x10 - 0x00000000 - - - BOOTKEY0_15 - [15:0] - read-only - - - - - BOOTKEY1_0 - Bits 15:0 of SHA-256 hash of boot key 1 (ECC) - 0x120 - 0x10 - 0x00000000 - - - BOOTKEY1_0 - [15:0] - read-only - - - - - BOOTKEY1_1 - Bits 31:16 of SHA-256 hash of boot key 1 (ECC) - 0x122 - 0x10 - 0x00000000 - - - BOOTKEY1_1 - [15:0] - read-only - - - - - BOOTKEY1_2 - Bits 47:32 of SHA-256 hash of boot key 1 (ECC) - 0x124 - 0x10 - 0x00000000 - - - BOOTKEY1_2 - [15:0] - read-only - - - - - BOOTKEY1_3 - Bits 63:48 of SHA-256 hash of boot key 1 (ECC) - 0x126 - 0x10 - 0x00000000 - - - BOOTKEY1_3 - [15:0] - read-only - - - - - BOOTKEY1_4 - Bits 79:64 of SHA-256 hash of boot key 1 (ECC) - 0x128 - 0x10 - 0x00000000 - - - BOOTKEY1_4 - [15:0] - read-only - - - - - BOOTKEY1_5 - Bits 95:80 of SHA-256 hash of boot key 1 (ECC) - 0x12A - 0x10 - 0x00000000 - - - BOOTKEY1_5 - [15:0] - read-only - - - - - BOOTKEY1_6 - Bits 111:96 of SHA-256 hash of boot key 1 (ECC) - 0x12C - 0x10 - 0x00000000 - - - BOOTKEY1_6 - [15:0] - read-only - - - - - BOOTKEY1_7 - Bits 127:112 of SHA-256 hash of boot key 1 (ECC) - 0x12E - 0x10 - 0x00000000 - - - BOOTKEY1_7 - [15:0] - read-only - - - - - BOOTKEY1_8 - Bits 143:128 of SHA-256 hash of boot key 1 (ECC) - 0x130 - 0x10 - 0x00000000 - - - BOOTKEY1_8 - [15:0] - read-only - - - - - BOOTKEY1_9 - Bits 159:144 of SHA-256 hash of boot key 1 (ECC) - 0x132 - 0x10 - 0x00000000 - - - BOOTKEY1_9 - [15:0] - read-only - - - - - BOOTKEY1_10 - Bits 175:160 of SHA-256 hash of boot key 1 (ECC) - 0x134 - 0x10 - 0x00000000 - - - BOOTKEY1_10 - [15:0] - read-only - - - - - BOOTKEY1_11 - Bits 191:176 of SHA-256 hash of boot key 1 (ECC) - 0x136 - 0x10 - 0x00000000 - - - BOOTKEY1_11 - [15:0] - read-only - - - - - BOOTKEY1_12 - Bits 207:192 of SHA-256 hash of boot key 1 (ECC) - 0x138 - 0x10 - 0x00000000 - - - BOOTKEY1_12 - [15:0] - read-only - - - - - BOOTKEY1_13 - Bits 223:208 of SHA-256 hash of boot key 1 (ECC) - 0x13A - 0x10 - 0x00000000 - - - BOOTKEY1_13 - [15:0] - read-only - - - - - BOOTKEY1_14 - Bits 239:224 of SHA-256 hash of boot key 1 (ECC) - 0x13C - 0x10 - 0x00000000 - - - BOOTKEY1_14 - [15:0] - read-only - - - - - BOOTKEY1_15 - Bits 255:240 of SHA-256 hash of boot key 1 (ECC) - 0x13E - 0x10 - 0x00000000 - - - BOOTKEY1_15 - [15:0] - read-only - - - - - BOOTKEY2_0 - Bits 15:0 of SHA-256 hash of boot key 2 (ECC) - 0x140 - 0x10 - 0x00000000 - - - BOOTKEY2_0 - [15:0] - read-only - - - - - BOOTKEY2_1 - Bits 31:16 of SHA-256 hash of boot key 2 (ECC) - 0x142 - 0x10 - 0x00000000 - - - BOOTKEY2_1 - [15:0] - read-only - - - - - BOOTKEY2_2 - Bits 47:32 of SHA-256 hash of boot key 2 (ECC) - 0x144 - 0x10 - 0x00000000 - - - BOOTKEY2_2 - [15:0] - read-only - - - - - BOOTKEY2_3 - Bits 63:48 of SHA-256 hash of boot key 2 (ECC) - 0x146 - 0x10 - 0x00000000 - - - BOOTKEY2_3 - [15:0] - read-only - - - - - BOOTKEY2_4 - Bits 79:64 of SHA-256 hash of boot key 2 (ECC) - 0x148 - 0x10 - 0x00000000 - - - BOOTKEY2_4 - [15:0] - read-only - - - - - BOOTKEY2_5 - Bits 95:80 of SHA-256 hash of boot key 2 (ECC) - 0x14A - 0x10 - 0x00000000 - - - BOOTKEY2_5 - [15:0] - read-only - - - - - BOOTKEY2_6 - Bits 111:96 of SHA-256 hash of boot key 2 (ECC) - 0x14C - 0x10 - 0x00000000 - - - BOOTKEY2_6 - [15:0] - read-only - - - - - BOOTKEY2_7 - Bits 127:112 of SHA-256 hash of boot key 2 (ECC) - 0x14E - 0x10 - 0x00000000 - - - BOOTKEY2_7 - [15:0] - read-only - - - - - BOOTKEY2_8 - Bits 143:128 of SHA-256 hash of boot key 2 (ECC) - 0x150 - 0x10 - 0x00000000 - - - BOOTKEY2_8 - [15:0] - read-only - - - - - BOOTKEY2_9 - Bits 159:144 of SHA-256 hash of boot key 2 (ECC) - 0x152 - 0x10 - 0x00000000 - - - BOOTKEY2_9 - [15:0] - read-only - - - - - BOOTKEY2_10 - Bits 175:160 of SHA-256 hash of boot key 2 (ECC) - 0x154 - 0x10 - 0x00000000 - - - BOOTKEY2_10 - [15:0] - read-only - - - - - BOOTKEY2_11 - Bits 191:176 of SHA-256 hash of boot key 2 (ECC) - 0x156 - 0x10 - 0x00000000 - - - BOOTKEY2_11 - [15:0] - read-only - - - - - BOOTKEY2_12 - Bits 207:192 of SHA-256 hash of boot key 2 (ECC) - 0x158 - 0x10 - 0x00000000 - - - BOOTKEY2_12 - [15:0] - read-only - - - - - BOOTKEY2_13 - Bits 223:208 of SHA-256 hash of boot key 2 (ECC) - 0x15A - 0x10 - 0x00000000 - - - BOOTKEY2_13 - [15:0] - read-only - - - - - BOOTKEY2_14 - Bits 239:224 of SHA-256 hash of boot key 2 (ECC) - 0x15C - 0x10 - 0x00000000 - - - BOOTKEY2_14 - [15:0] - read-only - - - - - BOOTKEY2_15 - Bits 255:240 of SHA-256 hash of boot key 2 (ECC) - 0x15E - 0x10 - 0x00000000 - - - BOOTKEY2_15 - [15:0] - read-only - - - - - BOOTKEY3_0 - Bits 15:0 of SHA-256 hash of boot key 3 (ECC) - 0x160 - 0x10 - 0x00000000 - - - BOOTKEY3_0 - [15:0] - read-only - - - - - BOOTKEY3_1 - Bits 31:16 of SHA-256 hash of boot key 3 (ECC) - 0x162 - 0x10 - 0x00000000 - - - BOOTKEY3_1 - [15:0] - read-only - - - - - BOOTKEY3_2 - Bits 47:32 of SHA-256 hash of boot key 3 (ECC) - 0x164 - 0x10 - 0x00000000 - - - BOOTKEY3_2 - [15:0] - read-only - - - - - BOOTKEY3_3 - Bits 63:48 of SHA-256 hash of boot key 3 (ECC) - 0x166 - 0x10 - 0x00000000 - - - BOOTKEY3_3 - [15:0] - read-only - - - - - BOOTKEY3_4 - Bits 79:64 of SHA-256 hash of boot key 3 (ECC) - 0x168 - 0x10 - 0x00000000 - - - BOOTKEY3_4 - [15:0] - read-only - - - - - BOOTKEY3_5 - Bits 95:80 of SHA-256 hash of boot key 3 (ECC) - 0x16A - 0x10 - 0x00000000 - - - BOOTKEY3_5 - [15:0] - read-only - - - - - BOOTKEY3_6 - Bits 111:96 of SHA-256 hash of boot key 3 (ECC) - 0x16C - 0x10 - 0x00000000 - - - BOOTKEY3_6 - [15:0] - read-only - - - - - BOOTKEY3_7 - Bits 127:112 of SHA-256 hash of boot key 3 (ECC) - 0x16E - 0x10 - 0x00000000 - - - BOOTKEY3_7 - [15:0] - read-only - - - - - BOOTKEY3_8 - Bits 143:128 of SHA-256 hash of boot key 3 (ECC) - 0x170 - 0x10 - 0x00000000 - - - BOOTKEY3_8 - [15:0] - read-only - - - - - BOOTKEY3_9 - Bits 159:144 of SHA-256 hash of boot key 3 (ECC) - 0x172 - 0x10 - 0x00000000 - - - BOOTKEY3_9 - [15:0] - read-only - - - - - BOOTKEY3_10 - Bits 175:160 of SHA-256 hash of boot key 3 (ECC) - 0x174 - 0x10 - 0x00000000 - - - BOOTKEY3_10 - [15:0] - read-only - - - - - BOOTKEY3_11 - Bits 191:176 of SHA-256 hash of boot key 3 (ECC) - 0x176 - 0x10 - 0x00000000 - - - BOOTKEY3_11 - [15:0] - read-only - - - - - BOOTKEY3_12 - Bits 207:192 of SHA-256 hash of boot key 3 (ECC) - 0x178 - 0x10 - 0x00000000 - - - BOOTKEY3_12 - [15:0] - read-only - - - - - BOOTKEY3_13 - Bits 223:208 of SHA-256 hash of boot key 3 (ECC) - 0x17A - 0x10 - 0x00000000 - - - BOOTKEY3_13 - [15:0] - read-only - - - - - BOOTKEY3_14 - Bits 239:224 of SHA-256 hash of boot key 3 (ECC) - 0x17C - 0x10 - 0x00000000 - - - BOOTKEY3_14 - [15:0] - read-only - - - - - BOOTKEY3_15 - Bits 255:240 of SHA-256 hash of boot key 3 (ECC) - 0x17E - 0x10 - 0x00000000 - - - BOOTKEY3_15 - [15:0] - read-only - - - - - KEY1_0 - Bits 15:0 of OTP access key 1 (ECC) - 0x1E90 - 0x10 - 0x00000000 - - - KEY1_0 - [15:0] - read-only - - - - - KEY1_1 - Bits 31:16 of OTP access key 1 (ECC) - 0x1E92 - 0x10 - 0x00000000 - - - KEY1_1 - [15:0] - read-only - - - - - KEY1_2 - Bits 47:32 of OTP access key 1 (ECC) - 0x1E94 - 0x10 - 0x00000000 - - - KEY1_2 - [15:0] - read-only - - - - - KEY1_3 - Bits 63:48 of OTP access key 1 (ECC) - 0x1E96 - 0x10 - 0x00000000 - - - KEY1_3 - [15:0] - read-only - - - - - KEY1_4 - Bits 79:64 of OTP access key 1 (ECC) - 0x1E98 - 0x10 - 0x00000000 - - - KEY1_4 - [15:0] - read-only - - - - - KEY1_5 - Bits 95:80 of OTP access key 1 (ECC) - 0x1E9A - 0x10 - 0x00000000 - - - KEY1_5 - [15:0] - read-only - - - - - KEY1_6 - Bits 111:96 of OTP access key 1 (ECC) - 0x1E9C - 0x10 - 0x00000000 - - - KEY1_6 - [15:0] - read-only - - - - - KEY1_7 - Bits 127:112 of OTP access key 1 (ECC) - 0x1E9E - 0x10 - 0x00000000 - - - KEY1_7 - [15:0] - read-only - - - - - KEY2_0 - Bits 15:0 of OTP access key 2 (ECC) - 0x1EA0 - 0x10 - 0x00000000 - - - KEY2_0 - [15:0] - read-only - - - - - KEY2_1 - Bits 31:16 of OTP access key 2 (ECC) - 0x1EA2 - 0x10 - 0x00000000 - - - KEY2_1 - [15:0] - read-only - - - - - KEY2_2 - Bits 47:32 of OTP access key 2 (ECC) - 0x1EA4 - 0x10 - 0x00000000 - - - KEY2_2 - [15:0] - read-only - - - - - KEY2_3 - Bits 63:48 of OTP access key 2 (ECC) - 0x1EA6 - 0x10 - 0x00000000 - - - KEY2_3 - [15:0] - read-only - - - - - KEY2_4 - Bits 79:64 of OTP access key 2 (ECC) - 0x1EA8 - 0x10 - 0x00000000 - - - KEY2_4 - [15:0] - read-only - - - - - KEY2_5 - Bits 95:80 of OTP access key 2 (ECC) - 0x1EAA - 0x10 - 0x00000000 - - - KEY2_5 - [15:0] - read-only - - - - - KEY2_6 - Bits 111:96 of OTP access key 2 (ECC) - 0x1EAC - 0x10 - 0x00000000 - - - KEY2_6 - [15:0] - read-only - - - - - KEY2_7 - Bits 127:112 of OTP access key 2 (ECC) - 0x1EAE - 0x10 - 0x00000000 - - - KEY2_7 - [15:0] - read-only - - - - - KEY3_0 - Bits 15:0 of OTP access key 3 (ECC) - 0x1EB0 - 0x10 - 0x00000000 - - - KEY3_0 - [15:0] - read-only - - - - - KEY3_1 - Bits 31:16 of OTP access key 3 (ECC) - 0x1EB2 - 0x10 - 0x00000000 - - - KEY3_1 - [15:0] - read-only - - - - - KEY3_2 - Bits 47:32 of OTP access key 3 (ECC) - 0x1EB4 - 0x10 - 0x00000000 - - - KEY3_2 - [15:0] - read-only - - - - - KEY3_3 - Bits 63:48 of OTP access key 3 (ECC) - 0x1EB6 - 0x10 - 0x00000000 - - - KEY3_3 - [15:0] - read-only - - - - - KEY3_4 - Bits 79:64 of OTP access key 3 (ECC) - 0x1EB8 - 0x10 - 0x00000000 - - - KEY3_4 - [15:0] - read-only - - - - - KEY3_5 - Bits 95:80 of OTP access key 3 (ECC) - 0x1EBA - 0x10 - 0x00000000 - - - KEY3_5 - [15:0] - read-only - - - - - KEY3_6 - Bits 111:96 of OTP access key 3 (ECC) - 0x1EBC - 0x10 - 0x00000000 - - - KEY3_6 - [15:0] - read-only - - - - - KEY3_7 - Bits 127:112 of OTP access key 3 (ECC) - 0x1EBE - 0x10 - 0x00000000 - - - KEY3_7 - [15:0] - read-only - - - - - KEY4_0 - Bits 15:0 of OTP access key 4 (ECC) - 0x1EC0 - 0x10 - 0x00000000 - - - KEY4_0 - [15:0] - read-only - - - - - KEY4_1 - Bits 31:16 of OTP access key 4 (ECC) - 0x1EC2 - 0x10 - 0x00000000 - - - KEY4_1 - [15:0] - read-only - - - - - KEY4_2 - Bits 47:32 of OTP access key 4 (ECC) - 0x1EC4 - 0x10 - 0x00000000 - - - KEY4_2 - [15:0] - read-only - - - - - KEY4_3 - Bits 63:48 of OTP access key 4 (ECC) - 0x1EC6 - 0x10 - 0x00000000 - - - KEY4_3 - [15:0] - read-only - - - - - KEY4_4 - Bits 79:64 of OTP access key 4 (ECC) - 0x1EC8 - 0x10 - 0x00000000 - - - KEY4_4 - [15:0] - read-only - - - - - KEY4_5 - Bits 95:80 of OTP access key 4 (ECC) - 0x1ECA - 0x10 - 0x00000000 - - - KEY4_5 - [15:0] - read-only - - - - - KEY4_6 - Bits 111:96 of OTP access key 4 (ECC) - 0x1ECC - 0x10 - 0x00000000 - - - KEY4_6 - [15:0] - read-only - - - - - KEY4_7 - Bits 127:112 of OTP access key 4 (ECC) - 0x1ECE - 0x10 - 0x00000000 - - - KEY4_7 - [15:0] - read-only - - - - - KEY5_0 - Bits 15:0 of OTP access key 5 (ECC) - 0x1ED0 - 0x10 - 0x00000000 - - - KEY5_0 - [15:0] - read-only - - - - - KEY5_1 - Bits 31:16 of OTP access key 5 (ECC) - 0x1ED2 - 0x10 - 0x00000000 - - - KEY5_1 - [15:0] - read-only - - - - - KEY5_2 - Bits 47:32 of OTP access key 5 (ECC) - 0x1ED4 - 0x10 - 0x00000000 - - - KEY5_2 - [15:0] - read-only - - - - - KEY5_3 - Bits 63:48 of OTP access key 5 (ECC) - 0x1ED6 - 0x10 - 0x00000000 - - - KEY5_3 - [15:0] - read-only - - - - - KEY5_4 - Bits 79:64 of OTP access key 5 (ECC) - 0x1ED8 - 0x10 - 0x00000000 - - - KEY5_4 - [15:0] - read-only - - - - - KEY5_5 - Bits 95:80 of OTP access key 5 (ECC) - 0x1EDA - 0x10 - 0x00000000 - - - KEY5_5 - [15:0] - read-only - - - - - KEY5_6 - Bits 111:96 of OTP access key 5 (ECC) - 0x1EDC - 0x10 - 0x00000000 - - - KEY5_6 - [15:0] - read-only - - - - - KEY5_7 - Bits 127:112 of OTP access key 5 (ECC) - 0x1EDE - 0x10 - 0x00000000 - - - KEY5_7 - [15:0] - read-only - - - - - KEY6_0 - Bits 15:0 of OTP access key 6 (ECC) - 0x1EE0 - 0x10 - 0x00000000 - - - KEY6_0 - [15:0] - read-only - - - - - KEY6_1 - Bits 31:16 of OTP access key 6 (ECC) - 0x1EE2 - 0x10 - 0x00000000 - - - KEY6_1 - [15:0] - read-only - - - - - KEY6_2 - Bits 47:32 of OTP access key 6 (ECC) - 0x1EE4 - 0x10 - 0x00000000 - - - KEY6_2 - [15:0] - read-only - - - - - KEY6_3 - Bits 63:48 of OTP access key 6 (ECC) - 0x1EE6 - 0x10 - 0x00000000 - - - KEY6_3 - [15:0] - read-only - - - - - KEY6_4 - Bits 79:64 of OTP access key 6 (ECC) - 0x1EE8 - 0x10 - 0x00000000 - - - KEY6_4 - [15:0] - read-only - - - - - KEY6_5 - Bits 95:80 of OTP access key 6 (ECC) - 0x1EEA - 0x10 - 0x00000000 - - - KEY6_5 - [15:0] - read-only - - - - - KEY6_6 - Bits 111:96 of OTP access key 6 (ECC) - 0x1EEC - 0x10 - 0x00000000 - - - KEY6_6 - [15:0] - read-only - - - - - KEY6_7 - Bits 127:112 of OTP access key 6 (ECC) - 0x1EEE - 0x10 - 0x00000000 - - - KEY6_7 - [15:0] - read-only - - - - - - - OTP_DATA_RAW - Predefined OTP data layout for RP2350 - 0x40134000 - - 0x0 - 0x3FFF - registers - - - - CHIPID0 - Bits 15:0 of public device ID. (ECC) - - The CHIPID0..3 rows contain a 64-bit random identifier for this chip, which can be read from the USB bootloader PICOBOOT interface or from the get_sys_info ROM API. - - The number of random bits makes the occurrence of twins exceedingly unlikely: for example, a fleet of a hundred million devices has a 99.97% probability of no twinned IDs. This is estimated to be lower than the occurrence of process errors in the assignment of sequential random IDs, and for practical purposes CHIPID may be treated as unique. - 0x0 - 0x20 - 0x00000000 - - - CHIPID0 - [23:0] - read-only - - - - - CHIPID1 - Bits 31:16 of public device ID (ECC) - 0x4 - 0x20 - 0x00000000 - - - CHIPID1 - [23:0] - read-only - - - - - CHIPID2 - Bits 47:32 of public device ID (ECC) - 0x8 - 0x20 - 0x00000000 - - - CHIPID2 - [23:0] - read-only - - - - - CHIPID3 - Bits 63:48 of public device ID (ECC) - 0xC - 0x20 - 0x00000000 - - - CHIPID3 - [23:0] - read-only - - - - - RANDID0 - Bits 15:0 of private per-device random number (ECC) - - The RANDID0..7 rows form a 128-bit random number generated during device test. - - This ID is not exposed through the USB PICOBOOT GET_INFO command or the ROM `get_sys_info()` API. However note that the USB PICOBOOT OTP access point can read the entirety of page 0, so this value is not meaningfully private unless the USB PICOBOOT interface is disabled via the DISABLE_BOOTSEL_USB_PICOBOOT_IFC flag in BOOT_FLAGS0. - 0x10 - 0x20 - 0x00000000 - - - RANDID0 - [23:0] - read-only - - - - - RANDID1 - Bits 31:16 of private per-device random number (ECC) - 0x14 - 0x20 - 0x00000000 - - - RANDID1 - [23:0] - read-only - - - - - RANDID2 - Bits 47:32 of private per-device random number (ECC) - 0x18 - 0x20 - 0x00000000 - - - RANDID2 - [23:0] - read-only - - - - - RANDID3 - Bits 63:48 of private per-device random number (ECC) - 0x1C - 0x20 - 0x00000000 - - - RANDID3 - [23:0] - read-only - - - - - RANDID4 - Bits 79:64 of private per-device random number (ECC) - 0x20 - 0x20 - 0x00000000 - - - RANDID4 - [23:0] - read-only - - - - - RANDID5 - Bits 95:80 of private per-device random number (ECC) - 0x24 - 0x20 - 0x00000000 - - - RANDID5 - [23:0] - read-only - - - - - RANDID6 - Bits 111:96 of private per-device random number (ECC) - 0x28 - 0x20 - 0x00000000 - - - RANDID6 - [23:0] - read-only - - - - - RANDID7 - Bits 127:112 of private per-device random number (ECC) - 0x2C - 0x20 - 0x00000000 - - - RANDID7 - [23:0] - read-only - - - - - ROSC_CALIB - Ring oscillator frequency in kHz, measured during manufacturing (ECC) - - This is measured at 1.1 V, at room temperature, with the ROSC configuration registers in their reset state. - 0x40 - 0x20 - 0x00000000 - - - ROSC_CALIB - [23:0] - read-only - - - - - LPOSC_CALIB - Low-power oscillator frequency in Hz, measured during manufacturing (ECC) - - This is measured at 1.1V, at room temperature, with the LPOSC trim register in its reset state. - 0x44 - 0x20 - 0x00000000 - - - LPOSC_CALIB - [23:0] - read-only - - - - - NUM_GPIOS - The number of main user GPIOs (bank 0). Should read 48 in the QFN80 package, and 30 in the QFN60 package. (ECC) - 0x60 - 0x20 - 0x00000000 - - - NUM_GPIOS - [23:0] - read-only - - - - - INFO_CRC0 - Lower 16 bits of CRC32 of OTP addresses 0x00 through 0x6b (polynomial 0x4c11db7, input reflected, output reflected, seed all-ones, final XOR all-ones) (ECC) - 0xD8 - 0x20 - 0x00000000 - - - INFO_CRC0 - [23:0] - read-only - - - - - INFO_CRC1 - Upper 16 bits of CRC32 of OTP addresses 0x00 through 0x6b (ECC) - 0xDC - 0x20 - 0x00000000 - - - INFO_CRC1 - [23:0] - read-only - - - - - CRIT0 - Page 0 critical boot flags (RBIT-8) - 0xE0 - 0x20 - 0x00000000 - - - RISCV_DISABLE - Permanently disable RISC-V processors (Hazard3) - [1:1] - read-only - - - ARM_DISABLE - Permanently disable ARM processors (Cortex-M33) - [0:0] - read-only - - - - - CRIT0_R1 - Redundant copy of CRIT0 - 0xE4 - 0x20 - 0x00000000 - - - CRIT0_R1 - [23:0] - read-only - - - - - CRIT0_R2 - Redundant copy of CRIT0 - 0xE8 - 0x20 - 0x00000000 - - - CRIT0_R2 - [23:0] - read-only - - - - - CRIT0_R3 - Redundant copy of CRIT0 - 0xEC - 0x20 - 0x00000000 - - - CRIT0_R3 - [23:0] - read-only - - - - - CRIT0_R4 - Redundant copy of CRIT0 - 0xF0 - 0x20 - 0x00000000 - - - CRIT0_R4 - [23:0] - read-only - - - - - CRIT0_R5 - Redundant copy of CRIT0 - 0xF4 - 0x20 - 0x00000000 - - - CRIT0_R5 - [23:0] - read-only - - - - - CRIT0_R6 - Redundant copy of CRIT0 - 0xF8 - 0x20 - 0x00000000 - - - CRIT0_R6 - [23:0] - read-only - - - - - CRIT0_R7 - Redundant copy of CRIT0 - 0xFC - 0x20 - 0x00000000 - - - CRIT0_R7 - [23:0] - read-only - - - - - CRIT1 - Page 1 critical boot flags (RBIT-8) - 0x100 - 0x20 - 0x00000000 - - - GLITCH_DETECTOR_SENS - Increase the sensitivity of the glitch detectors from their default. - [6:5] - read-only - - - GLITCH_DETECTOR_ENABLE - Arm the glitch detectors to reset the system if an abnormal clock/power event is observed. - [4:4] - read-only - - - BOOT_ARCH - Set the default boot architecture, 0=ARM 1=RISC-V. Ignored if ARM_DISABLE, RISCV_DISABLE or SECURE_BOOT_ENABLE is set. - [3:3] - read-only - - - DEBUG_DISABLE - Disable all debug access - [2:2] - read-only - - - SECURE_DEBUG_DISABLE - Disable Secure debug access - [1:1] - read-only - - - SECURE_BOOT_ENABLE - Enable boot signature enforcement, and permanently disable the RISC-V cores. - [0:0] - read-only - - - - - CRIT1_R1 - Redundant copy of CRIT1 - 0x104 - 0x20 - 0x00000000 - - - CRIT1_R1 - [23:0] - read-only - - - - - CRIT1_R2 - Redundant copy of CRIT1 - 0x108 - 0x20 - 0x00000000 - - - CRIT1_R2 - [23:0] - read-only - - - - - CRIT1_R3 - Redundant copy of CRIT1 - 0x10C - 0x20 - 0x00000000 - - - CRIT1_R3 - [23:0] - read-only - - - - - CRIT1_R4 - Redundant copy of CRIT1 - 0x110 - 0x20 - 0x00000000 - - - CRIT1_R4 - [23:0] - read-only - - - - - CRIT1_R5 - Redundant copy of CRIT1 - 0x114 - 0x20 - 0x00000000 - - - CRIT1_R5 - [23:0] - read-only - - - - - CRIT1_R6 - Redundant copy of CRIT1 - 0x118 - 0x20 - 0x00000000 - - - CRIT1_R6 - [23:0] - read-only - - - - - CRIT1_R7 - Redundant copy of CRIT1 - 0x11C - 0x20 - 0x00000000 - - - CRIT1_R7 - [23:0] - read-only - - - - - BOOT_FLAGS0 - Disable/Enable boot paths/features in the RP2350 mask ROM. Disables always supersede enables. Enables are provided where there are other configurations in OTP that must be valid. (RBIT-3) - 0x120 - 0x20 - 0x00000000 - - - DISABLE_SRAM_WINDOW_BOOT - [21:21] - read-only - - - DISABLE_XIP_ACCESS_ON_SRAM_ENTRY - Disable all access to XIP after entering an SRAM binary. - - Note that this will cause bootrom APIs that access XIP to fail, including APIs that interact with the partition table. - [20:20] - read-only - - - DISABLE_BOOTSEL_UART_BOOT - [19:19] - read-only - - - DISABLE_BOOTSEL_USB_PICOBOOT_IFC - [18:18] - read-only - - - DISABLE_BOOTSEL_USB_MSD_IFC - [17:17] - read-only - - - DISABLE_WATCHDOG_SCRATCH - [16:16] - read-only - - - DISABLE_POWER_SCRATCH - [15:15] - read-only - - - ENABLE_OTP_BOOT - Enable OTP boot. A number of OTP rows specified by OTPBOOT_LEN will be loaded, starting from OTPBOOT_SRC, into the SRAM location specified by OTPBOOT_DST1 and OTPBOOT_DST0. - - The loaded program image is stored with ECC, 16 bits per row, and must contain a valid IMAGE_DEF. Do not set this bit without first programming an image into OTP and configuring OTPBOOT_LEN, OTPBOOT_SRC, OTPBOOT_DST0 and OTPBOOT_DST1. - - Note that OTPBOOT_LEN and OTPBOOT_SRC must be even numbers of OTP rows. Equivalently, the image must be a multiple of 32 bits in size, and must start at a 32-bit-aligned address in the ECC read data address window. - [14:14] - read-only - - - DISABLE_OTP_BOOT - Takes precedence over ENABLE_OTP_BOOT. - [13:13] - read-only - - - DISABLE_FLASH_BOOT - [12:12] - read-only - - - ROLLBACK_REQUIRED - Require binaries to have a rollback version. Set automatically the first time a binary with a rollback version is booted. - [11:11] - read-only - - - HASHED_PARTITION_TABLE - Require a partition table to be hashed (if not signed) - [10:10] - read-only - - - SECURE_PARTITION_TABLE - Require a partition table to be signed - [9:9] - read-only - - - DISABLE_AUTO_SWITCH_ARCH - Disable auto-switch of CPU architecture on boot when the (only) binary to be booted is for the other Arm/RISC-V architecture and both architectures are enabled - [8:8] - read-only - - - SINGLE_FLASH_BINARY - Restrict flash boot path to use of a single binary at the start of flash - [7:7] - read-only - - - OVERRIDE_FLASH_PARTITION_SLOT_SIZE - Override the limit for default flash metadata scanning. - - The value is specified in FLASH_PARTITION_SLOT_SIZE. Make sure FLASH_PARTITION_SLOT_SIZE is valid before setting this bit - [6:6] - read-only - - - FLASH_DEVINFO_ENABLE - Mark FLASH_DEVINFO as containing valid, ECC'd data which describes external flash devices. - [5:5] - read-only - - - FAST_SIGCHECK_ROSC_DIV - Enable quartering of ROSC divisor during signature check, to reduce secure boot time - [4:4] - read-only - - - FLASH_IO_VOLTAGE_1V8 - If 1, configure the QSPI pads for 1.8 V operation when accessing flash for the first time from the bootrom, using the VOLTAGE_SELECT register for the QSPI pads bank. This slightly improves the input timing of the pads at low voltages, but does not affect their output characteristics. - - If 0, leave VOLTAGE_SELECT in its reset state (suitable for operation at and above 2.5 V) - [3:3] - read-only - - - ENABLE_BOOTSEL_NON_DEFAULT_PLL_XOSC_CFG - Enable loading of the non-default XOSC and PLL configuration before entering BOOTSEL mode. - - Ensure that BOOTSEL_XOSC_CFG and BOOTSEL_PLL_CFG are correctly programmed before setting this bit. - - If this bit is set, user software may use the contents of BOOTSEL_PLL_CFG to calculated the expected XOSC frequency based on the fixed USB boot frequency of 48 MHz. - [2:2] - read-only - - - ENABLE_BOOTSEL_LED - Enable bootloader activity LED. If set, bootsel_led_cfg is assumed to be valid - [1:1] - read-only - - - DISABLE_BOOTSEL_EXEC2 - [0:0] - read-only - - - - - BOOT_FLAGS0_R1 - Redundant copy of BOOT_FLAGS0 - 0x124 - 0x20 - 0x00000000 - - - BOOT_FLAGS0_R1 - [23:0] - read-only - - - - - BOOT_FLAGS0_R2 - Redundant copy of BOOT_FLAGS0 - 0x128 - 0x20 - 0x00000000 - - - BOOT_FLAGS0_R2 - [23:0] - read-only - - - - - BOOT_FLAGS1 - Disable/Enable boot paths/features in the RP2350 mask ROM. Disables always supersede enables. Enables are provided where there are other configurations in OTP that must be valid. (RBIT-3) - 0x12C - 0x20 - 0x00000000 - - - DOUBLE_TAP - Enable entering BOOTSEL mode via double-tap of the RUN/RSTn pin. Adds a significant delay to boot time, as configured by DOUBLE_TAP_DELAY. - - This functions by waiting at startup (i.e. following a reset) to see if a second reset is applied soon afterward. The second reset is detected by the bootrom with help of the POWMAN_CHIP_RESET_DOUBLE_TAP flag, which is not reset by the external reset pin, and the bootrom enters BOOTSEL mode (NSBOOT) to await further instruction over USB or UART. - [19:19] - read-only - - - DOUBLE_TAP_DELAY - Adjust how long to wait for a second reset when double tap BOOTSEL mode is enabled via DOUBLE_TAP. The minimum is 50 milliseconds, and each unit of this field adds an additional 50 milliseconds. - - For example, settings this field to its maximum value of 7 will cause the chip to wait for 400 milliseconds at boot to check for a second reset which requests entry to BOOTSEL mode. - - 200 milliseconds (DOUBLE_TAP_DELAY=3) is a good intermediate value. - [18:16] - read-only - - - KEY_INVALID - Mark a boot key as invalid, or prevent it from ever becoming valid. The bootrom will ignore any boot key marked as invalid during secure boot signature checks. - - Each bit in this field corresponds to one of the four 256-bit boot key hashes that may be stored in page 2 of the OTP. - - When provisioning boot keys, it's recommended to mark any boot key slots you don't intend to use as KEY_INVALID, so that spurious keys can not be installed at a later time. - [11:8] - read-only - - - KEY_VALID - Mark each of the possible boot keys as valid. The bootrom will check signatures against all valid boot keys, and ignore invalid boot keys. - - Each bit in this field corresponds to one of the four 256-bit boot key hashes that may be stored in page 2 of the OTP. - - A KEY_VALID bit is ignored if the corresponding KEY_INVALID bit is set. Boot keys are considered valid only when KEY_VALID is set and KEY_INVALID is clear. - - Do not mark a boot key as KEY_VALID if it does not contain a valid SHA-256 hash of your secp256k1 public key. Verify keys after programming, before setting the KEY_VALID bits -- a boot key with uncorrectable ECC faults will render your device unbootable if secure boot is enabled. - - Do not enable secure boot without first installing a valid key. This will render your device unbootable. - [3:0] - read-only - - - - - BOOT_FLAGS1_R1 - Redundant copy of BOOT_FLAGS1 - 0x130 - 0x20 - 0x00000000 - - - BOOT_FLAGS1_R1 - [23:0] - read-only - - - - - BOOT_FLAGS1_R2 - Redundant copy of BOOT_FLAGS1 - 0x134 - 0x20 - 0x00000000 - - - BOOT_FLAGS1_R2 - [23:0] - read-only - - - - - DEFAULT_BOOT_VERSION0 - Default boot version thermometer counter, bits 23:0 (RBIT-3) - 0x138 - 0x20 - 0x00000000 - - - DEFAULT_BOOT_VERSION0 - [23:0] - read-only - - - - - DEFAULT_BOOT_VERSION0_R1 - Redundant copy of DEFAULT_BOOT_VERSION0 - 0x13C - 0x20 - 0x00000000 - - - DEFAULT_BOOT_VERSION0_R1 - [23:0] - read-only - - - - - DEFAULT_BOOT_VERSION0_R2 - Redundant copy of DEFAULT_BOOT_VERSION0 - 0x140 - 0x20 - 0x00000000 - - - DEFAULT_BOOT_VERSION0_R2 - [23:0] - read-only - - - - - DEFAULT_BOOT_VERSION1 - Default boot version thermometer counter, bits 47:24 (RBIT-3) - 0x144 - 0x20 - 0x00000000 - - - DEFAULT_BOOT_VERSION1 - [23:0] - read-only - - - - - DEFAULT_BOOT_VERSION1_R1 - Redundant copy of DEFAULT_BOOT_VERSION1 - 0x148 - 0x20 - 0x00000000 - - - DEFAULT_BOOT_VERSION1_R1 - [23:0] - read-only - - - - - DEFAULT_BOOT_VERSION1_R2 - Redundant copy of DEFAULT_BOOT_VERSION1 - 0x14C - 0x20 - 0x00000000 - - - DEFAULT_BOOT_VERSION1_R2 - [23:0] - read-only - - - - - FLASH_DEVINFO - Stores information about external flash device(s). (ECC) - - Assumed to be valid if BOOT_FLAGS0_FLASH_DEVINFO_ENABLE is set. - 0x150 - 0x20 - 0x00000000 - - - CS1_SIZE - The size of the flash/PSRAM device on chip select 1 (addressable at 0x11000000 through 0x11ffffff). - - A value of zero is decoded as a size of zero (no device). Nonzero values are decoded as 4kiB << CS1_SIZE. For example, four megabytes is encoded with a CS1_SIZE value of 10, and 16 megabytes is encoded with a CS1_SIZE value of 12. - - When BOOT_FLAGS0_FLASH_DEVINFO_ENABLE is not set, a default of zero is used. - [23:12] - read-only - - - NONE - 0 - - - 8K - 1 - - - 16K - 2 - - - 32K - 3 - - - 64k - 4 - - - 128K - 5 - - - 256K - 6 - - - 512K - 7 - - - 1M - 8 - - - 2M - 9 - - - 4M - 10 - - - 8M - 11 - - - 16M - 12 - - - - - CS0_SIZE - The size of the flash/PSRAM device on chip select 0 (addressable at 0x10000000 through 0x10ffffff). - - A value of zero is decoded as a size of zero (no device). Nonzero values are decoded as 4kiB << CS0_SIZE. For example, four megabytes is encoded with a CS0_SIZE value of 10, and 16 megabytes is encoded with a CS0_SIZE value of 12. - - When BOOT_FLAGS0_FLASH_DEVINFO_ENABLE is not set, a default of 12 (16 MiB) is used. - [11:8] - read-only - - - NONE - 0 - - - 8K - 1 - - - 16K - 2 - - - 32K - 3 - - - 64k - 4 - - - 128K - 5 - - - 256K - 6 - - - 512K - 7 - - - 1M - 8 - - - 2M - 9 - - - 4M - 10 - - - 8M - 11 - - - 16M - 12 - - - - - D8H_ERASE_SUPPORTED - If true, all attached devices are assumed to support (or ignore, in the case of PSRAM) a block erase command with a command prefix of D8h, an erase size of 64 kiB, and a 24-bit address. Almost all 25-series flash devices support this command. - - If set, the bootrom will use the D8h erase command where it is able, to accelerate bulk erase operations. This makes flash programming faster. - - When BOOT_FLAGS0_FLASH_DEVINFO_ENABLE is not set, this field defaults to false. - [7:7] - read-only - - - CS1_GPIO - Indicate a GPIO number to be used for the secondary flash chip select (CS1), which selects the external QSPI device mapped at system addresses 0x11000000 through 0x11ffffff. There is no such configuration for CS0, as the primary chip select has a dedicated pin. - - On RP2350 the permissible GPIO numbers are 0, 8, 19 and 47. - - Ignored if CS1_size is zero. If CS1_SIZE is nonzero, the bootrom will automatically configure this GPIO as a second chip select upon entering the flash boot path, or entering any other path that may use the QSPI flash interface, such as BOOTSEL mode (nsboot). - [5:0] - read-only - - - - - FLASH_PARTITION_SLOT_SIZE - Gap between partition table slot 0 and slot 1 at the start of flash (the default size is 4096 bytes) (ECC) Enabled by the OVERRIDE_FLASH_PARTITION_SLOT_SIZE bit in BOOT_FLAGS, the size is 4096 * (value + 1) - 0x154 - 0x20 - 0x00000000 - - - FLASH_PARTITION_SLOT_SIZE - [23:0] - read-only - - - - - BOOTSEL_LED_CFG - Pin configuration for LED status, used by USB bootloader. (ECC) - Must be valid if BOOT_FLAGS0_ENABLE_BOOTSEL_LED is set. - 0x158 - 0x20 - 0x00000000 - - - ACTIVELOW - LED is active-low. (Default: active-high.) - [23:8] - read-only - - - PIN - GPIO index to use for bootloader activity LED. - [5:0] - read-only - - - - - BOOTSEL_PLL_CFG - Optional PLL configuration for BOOTSEL mode. (ECC) - - This should be configured to produce an exact 48 MHz based on the crystal oscillator frequency. User mode software may also use this value to calculate the expected crystal frequency based on an assumed 48 MHz PLL output. - - If no configuration is given, the crystal is assumed to be 12 MHz. - - The PLL frequency can be calculated as: - - PLL out = (XOSC frequency / (REFDIV+1)) x FBDIV / (POSTDIV1 x POSTDIV2) - - Conversely the crystal frequency can be calculated as: - - XOSC frequency = 48 MHz x (REFDIV+1) x (POSTDIV1 x POSTDIV2) / FBDIV - - (Note the +1 on REFDIV is because the value stored in this OTP location is the actual divisor value minus one.) - - Used if and only if ENABLE_BOOTSEL_NON_DEFAULT_PLL_XOSC_CFG is set in BOOT_FLAGS0. That bit should be set only after this row and BOOTSEL_XOSC_CFG are both correctly programmed. - 0x15C - 0x20 - 0x00000000 - - - REFDIV - PLL reference divisor, minus one. - - Programming a value of 0 means a reference divisor of 1. Programming a value of 1 means a reference divisor of 2 (for exceptionally fast XIN inputs) - [23:15] - read-only - - - POSTDIV2 - PLL post-divide 2 divisor, in the range 1..7 inclusive. - [14:12] - read-only - - - POSTDIV1 - PLL post-divide 1 divisor, in the range 1..7 inclusive. - [11:9] - read-only - - - FBDIV - PLL feedback divisor, in the range 16..320 inclusive. - [8:0] - read-only - - - - - BOOTSEL_XOSC_CFG - Non-default crystal oscillator configuration for the USB bootloader. (ECC) - - These values may also be used by user code configuring the crystal oscillator. - - Used if and only if ENABLE_BOOTSEL_NON_DEFAULT_PLL_XOSC_CFG is set in BOOT_FLAGS0. That bit should be set only after this row and BOOTSEL_PLL_CFG are both correctly programmed. - 0x160 - 0x20 - 0x00000000 - - - RANGE - Value of the XOSC_CTRL_FREQ_RANGE register. - [23:14] - read-only - - - 1_15MHZ - 0 - - - 10_30MHZ - 1 - - - 25_60MHZ - 2 - - - 40_100MHZ - 3 - - - - - STARTUP - Value of the XOSC_STARTUP register - [13:0] - read-only - - - - - USB_BOOT_FLAGS - USB boot specific feature flags (RBIT-3) - 0x164 - 0x20 - 0x00000000 - - - DP_DM_SWAP - Swap DM/DP during USB boot, to support board layouts with mirrored USB routing (deliberate or accidental). - [23:23] - read-only - - - WHITE_LABEL_ADDR_VALID - valid flag for INFO_UF2_TXT_BOARD_ID_STRDEF entry of the USB_WHITE_LABEL struct (index 15) - [22:22] - read-only - - - WL_INFO_UF2_TXT_BOARD_ID_STRDEF_VALID - valid flag for the USB_WHITE_LABEL_ADDR field - [15:15] - read-only - - - WL_INFO_UF2_TXT_MODEL_STRDEF_VALID - valid flag for INFO_UF2_TXT_MODEL_STRDEF entry of the USB_WHITE_LABEL struct (index 14) - [14:14] - read-only - - - WL_INDEX_HTM_REDIRECT_NAME_STRDEF_VALID - valid flag for INDEX_HTM_REDIRECT_NAME_STRDEF entry of the USB_WHITE_LABEL struct (index 13) - [13:13] - read-only - - - WL_INDEX_HTM_REDIRECT_URL_STRDEF_VALID - valid flag for INDEX_HTM_REDIRECT_URL_STRDEF entry of the USB_WHITE_LABEL struct (index 12) - [12:12] - read-only - - - WL_SCSI_INQUIRY_VERSION_STRDEF_VALID - valid flag for SCSI_INQUIRY_VERSION_STRDEF entry of the USB_WHITE_LABEL struct (index 11) - [11:11] - read-only - - - WL_SCSI_INQUIRY_PRODUCT_STRDEF_VALID - valid flag for SCSI_INQUIRY_PRODUCT_STRDEF entry of the USB_WHITE_LABEL struct (index 10) - [10:10] - read-only - - - WL_SCSI_INQUIRY_VENDOR_STRDEF_VALID - valid flag for SCSI_INQUIRY_VENDOR_STRDEF entry of the USB_WHITE_LABEL struct (index 9) - [9:9] - read-only - - - WL_VOLUME_LABEL_STRDEF_VALID - valid flag for VOLUME_LABEL_STRDEF entry of the USB_WHITE_LABEL struct (index 8) - [8:8] - read-only - - - WL_USB_CONFIG_ATTRIBUTES_MAX_POWER_VALUES_VALID - valid flag for USB_CONFIG_ATTRIBUTES_MAX_POWER_VALUES entry of the USB_WHITE_LABEL struct (index 7) - [7:7] - read-only - - - WL_USB_DEVICE_SERIAL_NUMBER_STRDEF_VALID - valid flag for USB_DEVICE_SERIAL_NUMBER_STRDEF entry of the USB_WHITE_LABEL struct (index 6) - [6:6] - read-only - - - WL_USB_DEVICE_PRODUCT_STRDEF_VALID - valid flag for USB_DEVICE_PRODUCT_STRDEF entry of the USB_WHITE_LABEL struct (index 5) - [5:5] - read-only - - - WL_USB_DEVICE_MANUFACTURER_STRDEF_VALID - valid flag for USB_DEVICE_MANUFACTURER_STRDEF entry of the USB_WHITE_LABEL struct (index 4) - [4:4] - read-only - - - WL_USB_DEVICE_LANG_ID_VALUE_VALID - valid flag for USB_DEVICE_LANG_ID_VALUE entry of the USB_WHITE_LABEL struct (index 3) - [3:3] - read-only - - - WL_USB_DEVICE_SERIAL_NUMBER_VALUE_VALID - valid flag for USB_DEVICE_BCD_DEVICEVALUE entry of the USB_WHITE_LABEL struct (index 2) - [2:2] - read-only - - - WL_USB_DEVICE_PID_VALUE_VALID - valid flag for USB_DEVICE_PID_VALUE entry of the USB_WHITE_LABEL struct (index 1) - [1:1] - read-only - - - WL_USB_DEVICE_VID_VALUE_VALID - valid flag for USB_DEVICE_VID_VALUE entry of the USB_WHITE_LABEL struct (index 0) - [0:0] - read-only - - - - - USB_BOOT_FLAGS_R1 - Redundant copy of USB_BOOT_FLAGS - 0x168 - 0x20 - 0x00000000 - - - USB_BOOT_FLAGS_R1 - [23:0] - read-only - - - - - USB_BOOT_FLAGS_R2 - Redundant copy of USB_BOOT_FLAGS - 0x16C - 0x20 - 0x00000000 - - - USB_BOOT_FLAGS_R2 - [23:0] - read-only - - - - - USB_WHITE_LABEL_ADDR - Row index of the USB_WHITE_LABEL structure within OTP (ECC) - - The table has 16 rows, each of which are also ECC and marked valid by the corresponding valid bit in USB_BOOT_FLAGS (ECC). - - The entries are either _VALUEs where the 16 bit value is used as is, or _STRDEFs which acts as a pointers to a string value. - - The value stored in a _STRDEF is two separate bytes: The low seven bits of the first (LSB) byte indicates the number of characters in the string, and the top bit of the first (LSB) byte if set to indicate that each character in the string is two bytes (Unicode) versus one byte if unset. The second (MSB) byte represents the location of the string data, and is encoded as the number of rows from this USB_WHITE_LABEL_ADDR; i.e. the row of the start of the string is USB_WHITE_LABEL_ADDR value + msb_byte. - - In each case, the corresponding valid bit enables replacing the default value for the corresponding item provided by the boot rom. - - Note that Unicode _STRDEFs are only supported for USB_DEVICE_PRODUCT_STRDEF, USB_DEVICE_SERIAL_NUMBER_STRDEF and USB_DEVICE_MANUFACTURER_STRDEF. Unicode values will be ignored if specified for other fields, and non-unicode values for these three items will be converted to Unicode characters by setting the upper 8 bits to zero. - - Note that if the USB_WHITE_LABEL structure or the corresponding strings are not readable by BOOTSEL mode based on OTP permissions, or if alignment requirements are not met, then the corresponding default values are used. - - The index values indicate where each field is located (row USB_WHITE_LABEL_ADDR value + index): - 0x170 - 0x20 - 0x00000000 - - - USB_WHITE_LABEL_ADDR - [23:0] - read-only - - - INDEX_USB_DEVICE_VID_VALUE - 0 - - - INDEX_USB_DEVICE_PID_VALUE - 1 - - - INDEX_USB_DEVICE_BCD_DEVICE_VALUE - 2 - - - INDEX_USB_DEVICE_LANG_ID_VALUE - 3 - - - INDEX_USB_DEVICE_MANUFACTURER_STRDEF - 4 - - - INDEX_USB_DEVICE_PRODUCT_STRDEF - 5 - - - INDEX_USB_DEVICE_SERIAL_NUMBER_STRDEF - 6 - - - INDEX_USB_CONFIG_ATTRIBUTES_MAX_POWER_VALUES - 7 - - - INDEX_VOLUME_LABEL_STRDEF - 8 - - - INDEX_SCSI_INQUIRY_VENDOR_STRDEF - 9 - - - INDEX_SCSI_INQUIRY_PRODUCT_STRDEF - 10 - - - INDEX_SCSI_INQUIRY_VERSION_STRDEF - 11 - - - INDEX_INDEX_HTM_REDIRECT_URL_STRDEF - 12 - - - INDEX_INDEX_HTM_REDIRECT_NAME_STRDEF - 13 - - - INDEX_INFO_UF2_TXT_MODEL_STRDEF - 14 - - - INDEX_INFO_UF2_TXT_BOARD_ID_STRDEF - 15 - - - - - - - OTPBOOT_SRC - OTP start row for the OTP boot image. (ECC) - - If OTP boot is enabled, the bootrom will load from this location into SRAM and then directly enter the loaded image. Note that the image must be signed if SECURE_BOOT_ENABLE is set. The image itself is assumed to be ECC-protected. - - This must be an even number. Equivalently, the OTP boot image must start at a word-aligned location in the ECC read data address window. - 0x178 - 0x20 - 0x00000000 - - - OTPBOOT_SRC - [23:0] - read-only - - - - - OTPBOOT_LEN - Length in rows of the OTP boot image. (ECC) - - OTPBOOT_LEN must be even. The total image size must be a multiple of 4 bytes (32 bits). - 0x17C - 0x20 - 0x00000000 - - - OTPBOOT_LEN - [23:0] - read-only - - - - - OTPBOOT_DST0 - Bits 15:0 of the OTP boot image load destination (and entry point). (ECC) - - This must be a location in main SRAM (main SRAM is addresses 0x20000000 through 0x20082000) and must be word-aligned. - 0x180 - 0x20 - 0x00000000 - - - OTPBOOT_DST0 - [23:0] - read-only - - - - - OTPBOOT_DST1 - Bits 31:16 of the OTP boot image load destination (and entry point). (ECC) - - This must be a location in main SRAM (main SRAM is addresses 0x20000000 through 0x20082000) and must be word-aligned. - 0x184 - 0x20 - 0x00000000 - - - OTPBOOT_DST1 - [23:0] - read-only - - - - - BOOTKEY0_0 - Bits 15:0 of SHA-256 hash of boot key 0 (ECC) - 0x200 - 0x20 - 0x00000000 - - - BOOTKEY0_0 - [23:0] - read-only - - - - - BOOTKEY0_1 - Bits 31:16 of SHA-256 hash of boot key 0 (ECC) - 0x204 - 0x20 - 0x00000000 - - - BOOTKEY0_1 - [23:0] - read-only - - - - - BOOTKEY0_2 - Bits 47:32 of SHA-256 hash of boot key 0 (ECC) - 0x208 - 0x20 - 0x00000000 - - - BOOTKEY0_2 - [23:0] - read-only - - - - - BOOTKEY0_3 - Bits 63:48 of SHA-256 hash of boot key 0 (ECC) - 0x20C - 0x20 - 0x00000000 - - - BOOTKEY0_3 - [23:0] - read-only - - - - - BOOTKEY0_4 - Bits 79:64 of SHA-256 hash of boot key 0 (ECC) - 0x210 - 0x20 - 0x00000000 - - - BOOTKEY0_4 - [23:0] - read-only - - - - - BOOTKEY0_5 - Bits 95:80 of SHA-256 hash of boot key 0 (ECC) - 0x214 - 0x20 - 0x00000000 - - - BOOTKEY0_5 - [23:0] - read-only - - - - - BOOTKEY0_6 - Bits 111:96 of SHA-256 hash of boot key 0 (ECC) - 0x218 - 0x20 - 0x00000000 - - - BOOTKEY0_6 - [23:0] - read-only - - - - - BOOTKEY0_7 - Bits 127:112 of SHA-256 hash of boot key 0 (ECC) - 0x21C - 0x20 - 0x00000000 - - - BOOTKEY0_7 - [23:0] - read-only - - - - - BOOTKEY0_8 - Bits 143:128 of SHA-256 hash of boot key 0 (ECC) - 0x220 - 0x20 - 0x00000000 - - - BOOTKEY0_8 - [23:0] - read-only - - - - - BOOTKEY0_9 - Bits 159:144 of SHA-256 hash of boot key 0 (ECC) - 0x224 - 0x20 - 0x00000000 - - - BOOTKEY0_9 - [23:0] - read-only - - - - - BOOTKEY0_10 - Bits 175:160 of SHA-256 hash of boot key 0 (ECC) - 0x228 - 0x20 - 0x00000000 - - - BOOTKEY0_10 - [23:0] - read-only - - - - - BOOTKEY0_11 - Bits 191:176 of SHA-256 hash of boot key 0 (ECC) - 0x22C - 0x20 - 0x00000000 - - - BOOTKEY0_11 - [23:0] - read-only - - - - - BOOTKEY0_12 - Bits 207:192 of SHA-256 hash of boot key 0 (ECC) - 0x230 - 0x20 - 0x00000000 - - - BOOTKEY0_12 - [23:0] - read-only - - - - - BOOTKEY0_13 - Bits 223:208 of SHA-256 hash of boot key 0 (ECC) - 0x234 - 0x20 - 0x00000000 - - - BOOTKEY0_13 - [23:0] - read-only - - - - - BOOTKEY0_14 - Bits 239:224 of SHA-256 hash of boot key 0 (ECC) - 0x238 - 0x20 - 0x00000000 - - - BOOTKEY0_14 - [23:0] - read-only - - - - - BOOTKEY0_15 - Bits 255:240 of SHA-256 hash of boot key 0 (ECC) - 0x23C - 0x20 - 0x00000000 - - - BOOTKEY0_15 - [23:0] - read-only - - - - - BOOTKEY1_0 - Bits 15:0 of SHA-256 hash of boot key 1 (ECC) - 0x240 - 0x20 - 0x00000000 - - - BOOTKEY1_0 - [23:0] - read-only - - - - - BOOTKEY1_1 - Bits 31:16 of SHA-256 hash of boot key 1 (ECC) - 0x244 - 0x20 - 0x00000000 - - - BOOTKEY1_1 - [23:0] - read-only - - - - - BOOTKEY1_2 - Bits 47:32 of SHA-256 hash of boot key 1 (ECC) - 0x248 - 0x20 - 0x00000000 - - - BOOTKEY1_2 - [23:0] - read-only - - - - - BOOTKEY1_3 - Bits 63:48 of SHA-256 hash of boot key 1 (ECC) - 0x24C - 0x20 - 0x00000000 - - - BOOTKEY1_3 - [23:0] - read-only - - - - - BOOTKEY1_4 - Bits 79:64 of SHA-256 hash of boot key 1 (ECC) - 0x250 - 0x20 - 0x00000000 - - - BOOTKEY1_4 - [23:0] - read-only - - - - - BOOTKEY1_5 - Bits 95:80 of SHA-256 hash of boot key 1 (ECC) - 0x254 - 0x20 - 0x00000000 - - - BOOTKEY1_5 - [23:0] - read-only - - - - - BOOTKEY1_6 - Bits 111:96 of SHA-256 hash of boot key 1 (ECC) - 0x258 - 0x20 - 0x00000000 - - - BOOTKEY1_6 - [23:0] - read-only - - - - - BOOTKEY1_7 - Bits 127:112 of SHA-256 hash of boot key 1 (ECC) - 0x25C - 0x20 - 0x00000000 - - - BOOTKEY1_7 - [23:0] - read-only - - - - - BOOTKEY1_8 - Bits 143:128 of SHA-256 hash of boot key 1 (ECC) - 0x260 - 0x20 - 0x00000000 - - - BOOTKEY1_8 - [23:0] - read-only - - - - - BOOTKEY1_9 - Bits 159:144 of SHA-256 hash of boot key 1 (ECC) - 0x264 - 0x20 - 0x00000000 - - - BOOTKEY1_9 - [23:0] - read-only - - - - - BOOTKEY1_10 - Bits 175:160 of SHA-256 hash of boot key 1 (ECC) - 0x268 - 0x20 - 0x00000000 - - - BOOTKEY1_10 - [23:0] - read-only - - - - - BOOTKEY1_11 - Bits 191:176 of SHA-256 hash of boot key 1 (ECC) - 0x26C - 0x20 - 0x00000000 - - - BOOTKEY1_11 - [23:0] - read-only - - - - - BOOTKEY1_12 - Bits 207:192 of SHA-256 hash of boot key 1 (ECC) - 0x270 - 0x20 - 0x00000000 - - - BOOTKEY1_12 - [23:0] - read-only - - - - - BOOTKEY1_13 - Bits 223:208 of SHA-256 hash of boot key 1 (ECC) - 0x274 - 0x20 - 0x00000000 - - - BOOTKEY1_13 - [23:0] - read-only - - - - - BOOTKEY1_14 - Bits 239:224 of SHA-256 hash of boot key 1 (ECC) - 0x278 - 0x20 - 0x00000000 - - - BOOTKEY1_14 - [23:0] - read-only - - - - - BOOTKEY1_15 - Bits 255:240 of SHA-256 hash of boot key 1 (ECC) - 0x27C - 0x20 - 0x00000000 - - - BOOTKEY1_15 - [23:0] - read-only - - - - - BOOTKEY2_0 - Bits 15:0 of SHA-256 hash of boot key 2 (ECC) - 0x280 - 0x20 - 0x00000000 - - - BOOTKEY2_0 - [23:0] - read-only - - - - - BOOTKEY2_1 - Bits 31:16 of SHA-256 hash of boot key 2 (ECC) - 0x284 - 0x20 - 0x00000000 - - - BOOTKEY2_1 - [23:0] - read-only - - - - - BOOTKEY2_2 - Bits 47:32 of SHA-256 hash of boot key 2 (ECC) - 0x288 - 0x20 - 0x00000000 - - - BOOTKEY2_2 - [23:0] - read-only - - - - - BOOTKEY2_3 - Bits 63:48 of SHA-256 hash of boot key 2 (ECC) - 0x28C - 0x20 - 0x00000000 - - - BOOTKEY2_3 - [23:0] - read-only - - - - - BOOTKEY2_4 - Bits 79:64 of SHA-256 hash of boot key 2 (ECC) - 0x290 - 0x20 - 0x00000000 - - - BOOTKEY2_4 - [23:0] - read-only - - - - - BOOTKEY2_5 - Bits 95:80 of SHA-256 hash of boot key 2 (ECC) - 0x294 - 0x20 - 0x00000000 - - - BOOTKEY2_5 - [23:0] - read-only - - - - - BOOTKEY2_6 - Bits 111:96 of SHA-256 hash of boot key 2 (ECC) - 0x298 - 0x20 - 0x00000000 - - - BOOTKEY2_6 - [23:0] - read-only - - - - - BOOTKEY2_7 - Bits 127:112 of SHA-256 hash of boot key 2 (ECC) - 0x29C - 0x20 - 0x00000000 - - - BOOTKEY2_7 - [23:0] - read-only - - - - - BOOTKEY2_8 - Bits 143:128 of SHA-256 hash of boot key 2 (ECC) - 0x2A0 - 0x20 - 0x00000000 - - - BOOTKEY2_8 - [23:0] - read-only - - - - - BOOTKEY2_9 - Bits 159:144 of SHA-256 hash of boot key 2 (ECC) - 0x2A4 - 0x20 - 0x00000000 - - - BOOTKEY2_9 - [23:0] - read-only - - - - - BOOTKEY2_10 - Bits 175:160 of SHA-256 hash of boot key 2 (ECC) - 0x2A8 - 0x20 - 0x00000000 - - - BOOTKEY2_10 - [23:0] - read-only - - - - - BOOTKEY2_11 - Bits 191:176 of SHA-256 hash of boot key 2 (ECC) - 0x2AC - 0x20 - 0x00000000 - - - BOOTKEY2_11 - [23:0] - read-only - - - - - BOOTKEY2_12 - Bits 207:192 of SHA-256 hash of boot key 2 (ECC) - 0x2B0 - 0x20 - 0x00000000 - - - BOOTKEY2_12 - [23:0] - read-only - - - - - BOOTKEY2_13 - Bits 223:208 of SHA-256 hash of boot key 2 (ECC) - 0x2B4 - 0x20 - 0x00000000 - - - BOOTKEY2_13 - [23:0] - read-only - - - - - BOOTKEY2_14 - Bits 239:224 of SHA-256 hash of boot key 2 (ECC) - 0x2B8 - 0x20 - 0x00000000 - - - BOOTKEY2_14 - [23:0] - read-only - - - - - BOOTKEY2_15 - Bits 255:240 of SHA-256 hash of boot key 2 (ECC) - 0x2BC - 0x20 - 0x00000000 - - - BOOTKEY2_15 - [23:0] - read-only - - - - - BOOTKEY3_0 - Bits 15:0 of SHA-256 hash of boot key 3 (ECC) - 0x2C0 - 0x20 - 0x00000000 - - - BOOTKEY3_0 - [23:0] - read-only - - - - - BOOTKEY3_1 - Bits 31:16 of SHA-256 hash of boot key 3 (ECC) - 0x2C4 - 0x20 - 0x00000000 - - - BOOTKEY3_1 - [23:0] - read-only - - - - - BOOTKEY3_2 - Bits 47:32 of SHA-256 hash of boot key 3 (ECC) - 0x2C8 - 0x20 - 0x00000000 - - - BOOTKEY3_2 - [23:0] - read-only - - - - - BOOTKEY3_3 - Bits 63:48 of SHA-256 hash of boot key 3 (ECC) - 0x2CC - 0x20 - 0x00000000 - - - BOOTKEY3_3 - [23:0] - read-only - - - - - BOOTKEY3_4 - Bits 79:64 of SHA-256 hash of boot key 3 (ECC) - 0x2D0 - 0x20 - 0x00000000 - - - BOOTKEY3_4 - [23:0] - read-only - - - - - BOOTKEY3_5 - Bits 95:80 of SHA-256 hash of boot key 3 (ECC) - 0x2D4 - 0x20 - 0x00000000 - - - BOOTKEY3_5 - [23:0] - read-only - - - - - BOOTKEY3_6 - Bits 111:96 of SHA-256 hash of boot key 3 (ECC) - 0x2D8 - 0x20 - 0x00000000 - - - BOOTKEY3_6 - [23:0] - read-only - - - - - BOOTKEY3_7 - Bits 127:112 of SHA-256 hash of boot key 3 (ECC) - 0x2DC - 0x20 - 0x00000000 - - - BOOTKEY3_7 - [23:0] - read-only - - - - - BOOTKEY3_8 - Bits 143:128 of SHA-256 hash of boot key 3 (ECC) - 0x2E0 - 0x20 - 0x00000000 - - - BOOTKEY3_8 - [23:0] - read-only - - - - - BOOTKEY3_9 - Bits 159:144 of SHA-256 hash of boot key 3 (ECC) - 0x2E4 - 0x20 - 0x00000000 - - - BOOTKEY3_9 - [23:0] - read-only - - - - - BOOTKEY3_10 - Bits 175:160 of SHA-256 hash of boot key 3 (ECC) - 0x2E8 - 0x20 - 0x00000000 - - - BOOTKEY3_10 - [23:0] - read-only - - - - - BOOTKEY3_11 - Bits 191:176 of SHA-256 hash of boot key 3 (ECC) - 0x2EC - 0x20 - 0x00000000 - - - BOOTKEY3_11 - [23:0] - read-only - - - - - BOOTKEY3_12 - Bits 207:192 of SHA-256 hash of boot key 3 (ECC) - 0x2F0 - 0x20 - 0x00000000 - - - BOOTKEY3_12 - [23:0] - read-only - - - - - BOOTKEY3_13 - Bits 223:208 of SHA-256 hash of boot key 3 (ECC) - 0x2F4 - 0x20 - 0x00000000 - - - BOOTKEY3_13 - [23:0] - read-only - - - - - BOOTKEY3_14 - Bits 239:224 of SHA-256 hash of boot key 3 (ECC) - 0x2F8 - 0x20 - 0x00000000 - - - BOOTKEY3_14 - [23:0] - read-only - - - - - BOOTKEY3_15 - Bits 255:240 of SHA-256 hash of boot key 3 (ECC) - 0x2FC - 0x20 - 0x00000000 - - - BOOTKEY3_15 - [23:0] - read-only - - - - - KEY1_0 - Bits 15:0 of OTP access key 1 (ECC) - 0x3D20 - 0x20 - 0x00000000 - - - KEY1_0 - [23:0] - read-only - - - - - KEY1_1 - Bits 31:16 of OTP access key 1 (ECC) - 0x3D24 - 0x20 - 0x00000000 - - - KEY1_1 - [23:0] - read-only - - - - - KEY1_2 - Bits 47:32 of OTP access key 1 (ECC) - 0x3D28 - 0x20 - 0x00000000 - - - KEY1_2 - [23:0] - read-only - - - - - KEY1_3 - Bits 63:48 of OTP access key 1 (ECC) - 0x3D2C - 0x20 - 0x00000000 - - - KEY1_3 - [23:0] - read-only - - - - - KEY1_4 - Bits 79:64 of OTP access key 1 (ECC) - 0x3D30 - 0x20 - 0x00000000 - - - KEY1_4 - [23:0] - read-only - - - - - KEY1_5 - Bits 95:80 of OTP access key 1 (ECC) - 0x3D34 - 0x20 - 0x00000000 - - - KEY1_5 - [23:0] - read-only - - - - - KEY1_6 - Bits 111:96 of OTP access key 1 (ECC) - 0x3D38 - 0x20 - 0x00000000 - - - KEY1_6 - [23:0] - read-only - - - - - KEY1_7 - Bits 127:112 of OTP access key 1 (ECC) - 0x3D3C - 0x20 - 0x00000000 - - - KEY1_7 - [23:0] - read-only - - - - - KEY2_0 - Bits 15:0 of OTP access key 2 (ECC) - 0x3D40 - 0x20 - 0x00000000 - - - KEY2_0 - [23:0] - read-only - - - - - KEY2_1 - Bits 31:16 of OTP access key 2 (ECC) - 0x3D44 - 0x20 - 0x00000000 - - - KEY2_1 - [23:0] - read-only - - - - - KEY2_2 - Bits 47:32 of OTP access key 2 (ECC) - 0x3D48 - 0x20 - 0x00000000 - - - KEY2_2 - [23:0] - read-only - - - - - KEY2_3 - Bits 63:48 of OTP access key 2 (ECC) - 0x3D4C - 0x20 - 0x00000000 - - - KEY2_3 - [23:0] - read-only - - - - - KEY2_4 - Bits 79:64 of OTP access key 2 (ECC) - 0x3D50 - 0x20 - 0x00000000 - - - KEY2_4 - [23:0] - read-only - - - - - KEY2_5 - Bits 95:80 of OTP access key 2 (ECC) - 0x3D54 - 0x20 - 0x00000000 - - - KEY2_5 - [23:0] - read-only - - - - - KEY2_6 - Bits 111:96 of OTP access key 2 (ECC) - 0x3D58 - 0x20 - 0x00000000 - - - KEY2_6 - [23:0] - read-only - - - - - KEY2_7 - Bits 127:112 of OTP access key 2 (ECC) - 0x3D5C - 0x20 - 0x00000000 - - - KEY2_7 - [23:0] - read-only - - - - - KEY3_0 - Bits 15:0 of OTP access key 3 (ECC) - 0x3D60 - 0x20 - 0x00000000 - - - KEY3_0 - [23:0] - read-only - - - - - KEY3_1 - Bits 31:16 of OTP access key 3 (ECC) - 0x3D64 - 0x20 - 0x00000000 - - - KEY3_1 - [23:0] - read-only - - - - - KEY3_2 - Bits 47:32 of OTP access key 3 (ECC) - 0x3D68 - 0x20 - 0x00000000 - - - KEY3_2 - [23:0] - read-only - - - - - KEY3_3 - Bits 63:48 of OTP access key 3 (ECC) - 0x3D6C - 0x20 - 0x00000000 - - - KEY3_3 - [23:0] - read-only - - - - - KEY3_4 - Bits 79:64 of OTP access key 3 (ECC) - 0x3D70 - 0x20 - 0x00000000 - - - KEY3_4 - [23:0] - read-only - - - - - KEY3_5 - Bits 95:80 of OTP access key 3 (ECC) - 0x3D74 - 0x20 - 0x00000000 - - - KEY3_5 - [23:0] - read-only - - - - - KEY3_6 - Bits 111:96 of OTP access key 3 (ECC) - 0x3D78 - 0x20 - 0x00000000 - - - KEY3_6 - [23:0] - read-only - - - - - KEY3_7 - Bits 127:112 of OTP access key 3 (ECC) - 0x3D7C - 0x20 - 0x00000000 - - - KEY3_7 - [23:0] - read-only - - - - - KEY4_0 - Bits 15:0 of OTP access key 4 (ECC) - 0x3D80 - 0x20 - 0x00000000 - - - KEY4_0 - [23:0] - read-only - - - - - KEY4_1 - Bits 31:16 of OTP access key 4 (ECC) - 0x3D84 - 0x20 - 0x00000000 - - - KEY4_1 - [23:0] - read-only - - - - - KEY4_2 - Bits 47:32 of OTP access key 4 (ECC) - 0x3D88 - 0x20 - 0x00000000 - - - KEY4_2 - [23:0] - read-only - - - - - KEY4_3 - Bits 63:48 of OTP access key 4 (ECC) - 0x3D8C - 0x20 - 0x00000000 - - - KEY4_3 - [23:0] - read-only - - - - - KEY4_4 - Bits 79:64 of OTP access key 4 (ECC) - 0x3D90 - 0x20 - 0x00000000 - - - KEY4_4 - [23:0] - read-only - - - - - KEY4_5 - Bits 95:80 of OTP access key 4 (ECC) - 0x3D94 - 0x20 - 0x00000000 - - - KEY4_5 - [23:0] - read-only - - - - - KEY4_6 - Bits 111:96 of OTP access key 4 (ECC) - 0x3D98 - 0x20 - 0x00000000 - - - KEY4_6 - [23:0] - read-only - - - - - KEY4_7 - Bits 127:112 of OTP access key 4 (ECC) - 0x3D9C - 0x20 - 0x00000000 - - - KEY4_7 - [23:0] - read-only - - - - - KEY5_0 - Bits 15:0 of OTP access key 5 (ECC) - 0x3DA0 - 0x20 - 0x00000000 - - - KEY5_0 - [23:0] - read-only - - - - - KEY5_1 - Bits 31:16 of OTP access key 5 (ECC) - 0x3DA4 - 0x20 - 0x00000000 - - - KEY5_1 - [23:0] - read-only - - - - - KEY5_2 - Bits 47:32 of OTP access key 5 (ECC) - 0x3DA8 - 0x20 - 0x00000000 - - - KEY5_2 - [23:0] - read-only - - - - - KEY5_3 - Bits 63:48 of OTP access key 5 (ECC) - 0x3DAC - 0x20 - 0x00000000 - - - KEY5_3 - [23:0] - read-only - - - - - KEY5_4 - Bits 79:64 of OTP access key 5 (ECC) - 0x3DB0 - 0x20 - 0x00000000 - - - KEY5_4 - [23:0] - read-only - - - - - KEY5_5 - Bits 95:80 of OTP access key 5 (ECC) - 0x3DB4 - 0x20 - 0x00000000 - - - KEY5_5 - [23:0] - read-only - - - - - KEY5_6 - Bits 111:96 of OTP access key 5 (ECC) - 0x3DB8 - 0x20 - 0x00000000 - - - KEY5_6 - [23:0] - read-only - - - - - KEY5_7 - Bits 127:112 of OTP access key 5 (ECC) - 0x3DBC - 0x20 - 0x00000000 - - - KEY5_7 - [23:0] - read-only - - - - - KEY6_0 - Bits 15:0 of OTP access key 6 (ECC) - 0x3DC0 - 0x20 - 0x00000000 - - - KEY6_0 - [23:0] - read-only - - - - - KEY6_1 - Bits 31:16 of OTP access key 6 (ECC) - 0x3DC4 - 0x20 - 0x00000000 - - - KEY6_1 - [23:0] - read-only - - - - - KEY6_2 - Bits 47:32 of OTP access key 6 (ECC) - 0x3DC8 - 0x20 - 0x00000000 - - - KEY6_2 - [23:0] - read-only - - - - - KEY6_3 - Bits 63:48 of OTP access key 6 (ECC) - 0x3DCC - 0x20 - 0x00000000 - - - KEY6_3 - [23:0] - read-only - - - - - KEY6_4 - Bits 79:64 of OTP access key 6 (ECC) - 0x3DD0 - 0x20 - 0x00000000 - - - KEY6_4 - [23:0] - read-only - - - - - KEY6_5 - Bits 95:80 of OTP access key 6 (ECC) - 0x3DD4 - 0x20 - 0x00000000 - - - KEY6_5 - [23:0] - read-only - - - - - KEY6_6 - Bits 111:96 of OTP access key 6 (ECC) - 0x3DD8 - 0x20 - 0x00000000 - - - KEY6_6 - [23:0] - read-only - - - - - KEY6_7 - Bits 127:112 of OTP access key 6 (ECC) - 0x3DDC - 0x20 - 0x00000000 - - - KEY6_7 - [23:0] - read-only - - - - - KEY1_VALID - Valid flag for key 1. Once the valid flag is set, the key can no longer be read or written, and becomes a valid fixed key for protecting OTP pages. - 0x3DE4 - 0x20 - 0x00000000 - - - VALID_R2 - Redundant copy of VALID, with 3-way majority vote - [16:16] - read-only - - - VALID_R1 - Redundant copy of VALID, with 3-way majority vote - [8:8] - read-only - - - VALID - [0:0] - read-only - - - - - KEY2_VALID - Valid flag for key 2. Once the valid flag is set, the key can no longer be read or written, and becomes a valid fixed key for protecting OTP pages. - 0x3DE8 - 0x20 - 0x00000000 - - - VALID_R2 - Redundant copy of VALID, with 3-way majority vote - [16:16] - read-only - - - VALID_R1 - Redundant copy of VALID, with 3-way majority vote - [8:8] - read-only - - - VALID - [0:0] - read-only - - - - - KEY3_VALID - Valid flag for key 3. Once the valid flag is set, the key can no longer be read or written, and becomes a valid fixed key for protecting OTP pages. - 0x3DEC - 0x20 - 0x00000000 - - - VALID_R2 - Redundant copy of VALID, with 3-way majority vote - [16:16] - read-only - - - VALID_R1 - Redundant copy of VALID, with 3-way majority vote - [8:8] - read-only - - - VALID - [0:0] - read-only - - - - - KEY4_VALID - Valid flag for key 4. Once the valid flag is set, the key can no longer be read or written, and becomes a valid fixed key for protecting OTP pages. - 0x3DF0 - 0x20 - 0x00000000 - - - VALID_R2 - Redundant copy of VALID, with 3-way majority vote - [16:16] - read-only - - - VALID_R1 - Redundant copy of VALID, with 3-way majority vote - [8:8] - read-only - - - VALID - [0:0] - read-only - - - - - KEY5_VALID - Valid flag for key 5. Once the valid flag is set, the key can no longer be read or written, and becomes a valid fixed key for protecting OTP pages. - 0x3DF4 - 0x20 - 0x00000000 - - - VALID_R2 - Redundant copy of VALID, with 3-way majority vote - [16:16] - read-only - - - VALID_R1 - Redundant copy of VALID, with 3-way majority vote - [8:8] - read-only - - - VALID - [0:0] - read-only - - - - - KEY6_VALID - Valid flag for key 6. Once the valid flag is set, the key can no longer be read or written, and becomes a valid fixed key for protecting OTP pages. - 0x3DF8 - 0x20 - 0x00000000 - - - VALID_R2 - Redundant copy of VALID, with 3-way majority vote - [16:16] - read-only - - - VALID_R1 - Redundant copy of VALID, with 3-way majority vote - [8:8] - read-only - - - VALID - [0:0] - read-only - - - - - PAGE0_LOCK0 - Lock configuration LSBs for page 0 (rows 0x0 through 0x3f). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3E00 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - NO_KEY_STATE - State when at least one key is registered for this page and no matching key has been entered. - [6:6] - read-only - - - read_only - 0 - - - inaccessible - 1 - - - - - KEY_R - Index 1-6 of a hardware key which must be entered to grant read access, or 0 if no such key is required. - [5:3] - read-only - - - KEY_W - Index 1-6 of a hardware key which must be entered to grant write access, or 0 if no such key is required. - [2:0] - read-only - - - - - PAGE0_LOCK1 - Lock configuration MSBs for page 0 (rows 0x0 through 0x3f). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3E04 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - LOCK_BL - Dummy lock bits reserved for bootloaders (including the RP2350 USB bootloader) to store their own OTP access permissions. No hardware effect, and no corresponding SW_LOCKx registers. - [5:4] - read-only - - - read_write - Bootloader permits user reads and writes to this page - 0 - - - read_only - Bootloader permits user reads of this page - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE - 2 - - - inaccessible - Bootloader does not permit user access to this page - 3 - - - - - LOCK_NS - Lock state for Non-secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - - Note that READ_WRITE and READ_ONLY are equivalent in hardware, as the SBPI programming interface is not accessible to Non-secure software. However, Secure software may check these bits to apply write permissions to a Non-secure OTP programming API. - [3:2] - read-only - - - read_write - Page can be read by Non-secure software, and Secure software may permit Non-secure writes. - 0 - - - read_only - Page can be read by Non-secure software - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Non-secure software. - 3 - - - - - LOCK_S - Lock state for Secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - [1:0] - read-only - - - read_write - Page is fully accessible by Secure software. - 0 - - - read_only - Page can be read by Secure software, but can not be written. - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Secure software. - 3 - - - - - - - PAGE1_LOCK0 - Lock configuration LSBs for page 1 (rows 0x40 through 0x7f). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3E08 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - NO_KEY_STATE - State when at least one key is registered for this page and no matching key has been entered. - [6:6] - read-only - - - read_only - 0 - - - inaccessible - 1 - - - - - KEY_R - Index 1-6 of a hardware key which must be entered to grant read access, or 0 if no such key is required. - [5:3] - read-only - - - KEY_W - Index 1-6 of a hardware key which must be entered to grant write access, or 0 if no such key is required. - [2:0] - read-only - - - - - PAGE1_LOCK1 - Lock configuration MSBs for page 1 (rows 0x40 through 0x7f). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3E0C - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - LOCK_BL - Dummy lock bits reserved for bootloaders (including the RP2350 USB bootloader) to store their own OTP access permissions. No hardware effect, and no corresponding SW_LOCKx registers. - [5:4] - read-only - - - read_write - Bootloader permits user reads and writes to this page - 0 - - - read_only - Bootloader permits user reads of this page - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE - 2 - - - inaccessible - Bootloader does not permit user access to this page - 3 - - - - - LOCK_NS - Lock state for Non-secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - - Note that READ_WRITE and READ_ONLY are equivalent in hardware, as the SBPI programming interface is not accessible to Non-secure software. However, Secure software may check these bits to apply write permissions to a Non-secure OTP programming API. - [3:2] - read-only - - - read_write - Page can be read by Non-secure software, and Secure software may permit Non-secure writes. - 0 - - - read_only - Page can be read by Non-secure software - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Non-secure software. - 3 - - - - - LOCK_S - Lock state for Secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - [1:0] - read-only - - - read_write - Page is fully accessible by Secure software. - 0 - - - read_only - Page can be read by Secure software, but can not be written. - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Secure software. - 3 - - - - - - - PAGE2_LOCK0 - Lock configuration LSBs for page 2 (rows 0x80 through 0xbf). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3E10 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - NO_KEY_STATE - State when at least one key is registered for this page and no matching key has been entered. - [6:6] - read-only - - - read_only - 0 - - - inaccessible - 1 - - - - - KEY_R - Index 1-6 of a hardware key which must be entered to grant read access, or 0 if no such key is required. - [5:3] - read-only - - - KEY_W - Index 1-6 of a hardware key which must be entered to grant write access, or 0 if no such key is required. - [2:0] - read-only - - - - - PAGE2_LOCK1 - Lock configuration MSBs for page 2 (rows 0x80 through 0xbf). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3E14 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - LOCK_BL - Dummy lock bits reserved for bootloaders (including the RP2350 USB bootloader) to store their own OTP access permissions. No hardware effect, and no corresponding SW_LOCKx registers. - [5:4] - read-only - - - read_write - Bootloader permits user reads and writes to this page - 0 - - - read_only - Bootloader permits user reads of this page - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE - 2 - - - inaccessible - Bootloader does not permit user access to this page - 3 - - - - - LOCK_NS - Lock state for Non-secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - - Note that READ_WRITE and READ_ONLY are equivalent in hardware, as the SBPI programming interface is not accessible to Non-secure software. However, Secure software may check these bits to apply write permissions to a Non-secure OTP programming API. - [3:2] - read-only - - - read_write - Page can be read by Non-secure software, and Secure software may permit Non-secure writes. - 0 - - - read_only - Page can be read by Non-secure software - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Non-secure software. - 3 - - - - - LOCK_S - Lock state for Secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - [1:0] - read-only - - - read_write - Page is fully accessible by Secure software. - 0 - - - read_only - Page can be read by Secure software, but can not be written. - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Secure software. - 3 - - - - - - - PAGE3_LOCK0 - Lock configuration LSBs for page 3 (rows 0xc0 through 0xff). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3E18 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - NO_KEY_STATE - State when at least one key is registered for this page and no matching key has been entered. - [6:6] - read-only - - - read_only - 0 - - - inaccessible - 1 - - - - - KEY_R - Index 1-6 of a hardware key which must be entered to grant read access, or 0 if no such key is required. - [5:3] - read-only - - - KEY_W - Index 1-6 of a hardware key which must be entered to grant write access, or 0 if no such key is required. - [2:0] - read-only - - - - - PAGE3_LOCK1 - Lock configuration MSBs for page 3 (rows 0xc0 through 0xff). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3E1C - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - LOCK_BL - Dummy lock bits reserved for bootloaders (including the RP2350 USB bootloader) to store their own OTP access permissions. No hardware effect, and no corresponding SW_LOCKx registers. - [5:4] - read-only - - - read_write - Bootloader permits user reads and writes to this page - 0 - - - read_only - Bootloader permits user reads of this page - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE - 2 - - - inaccessible - Bootloader does not permit user access to this page - 3 - - - - - LOCK_NS - Lock state for Non-secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - - Note that READ_WRITE and READ_ONLY are equivalent in hardware, as the SBPI programming interface is not accessible to Non-secure software. However, Secure software may check these bits to apply write permissions to a Non-secure OTP programming API. - [3:2] - read-only - - - read_write - Page can be read by Non-secure software, and Secure software may permit Non-secure writes. - 0 - - - read_only - Page can be read by Non-secure software - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Non-secure software. - 3 - - - - - LOCK_S - Lock state for Secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - [1:0] - read-only - - - read_write - Page is fully accessible by Secure software. - 0 - - - read_only - Page can be read by Secure software, but can not be written. - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Secure software. - 3 - - - - - - - PAGE4_LOCK0 - Lock configuration LSBs for page 4 (rows 0x100 through 0x13f). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3E20 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - NO_KEY_STATE - State when at least one key is registered for this page and no matching key has been entered. - [6:6] - read-only - - - read_only - 0 - - - inaccessible - 1 - - - - - KEY_R - Index 1-6 of a hardware key which must be entered to grant read access, or 0 if no such key is required. - [5:3] - read-only - - - KEY_W - Index 1-6 of a hardware key which must be entered to grant write access, or 0 if no such key is required. - [2:0] - read-only - - - - - PAGE4_LOCK1 - Lock configuration MSBs for page 4 (rows 0x100 through 0x13f). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3E24 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - LOCK_BL - Dummy lock bits reserved for bootloaders (including the RP2350 USB bootloader) to store their own OTP access permissions. No hardware effect, and no corresponding SW_LOCKx registers. - [5:4] - read-only - - - read_write - Bootloader permits user reads and writes to this page - 0 - - - read_only - Bootloader permits user reads of this page - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE - 2 - - - inaccessible - Bootloader does not permit user access to this page - 3 - - - - - LOCK_NS - Lock state for Non-secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - - Note that READ_WRITE and READ_ONLY are equivalent in hardware, as the SBPI programming interface is not accessible to Non-secure software. However, Secure software may check these bits to apply write permissions to a Non-secure OTP programming API. - [3:2] - read-only - - - read_write - Page can be read by Non-secure software, and Secure software may permit Non-secure writes. - 0 - - - read_only - Page can be read by Non-secure software - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Non-secure software. - 3 - - - - - LOCK_S - Lock state for Secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - [1:0] - read-only - - - read_write - Page is fully accessible by Secure software. - 0 - - - read_only - Page can be read by Secure software, but can not be written. - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Secure software. - 3 - - - - - - - PAGE5_LOCK0 - Lock configuration LSBs for page 5 (rows 0x140 through 0x17f). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3E28 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - NO_KEY_STATE - State when at least one key is registered for this page and no matching key has been entered. - [6:6] - read-only - - - read_only - 0 - - - inaccessible - 1 - - - - - KEY_R - Index 1-6 of a hardware key which must be entered to grant read access, or 0 if no such key is required. - [5:3] - read-only - - - KEY_W - Index 1-6 of a hardware key which must be entered to grant write access, or 0 if no such key is required. - [2:0] - read-only - - - - - PAGE5_LOCK1 - Lock configuration MSBs for page 5 (rows 0x140 through 0x17f). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3E2C - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - LOCK_BL - Dummy lock bits reserved for bootloaders (including the RP2350 USB bootloader) to store their own OTP access permissions. No hardware effect, and no corresponding SW_LOCKx registers. - [5:4] - read-only - - - read_write - Bootloader permits user reads and writes to this page - 0 - - - read_only - Bootloader permits user reads of this page - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE - 2 - - - inaccessible - Bootloader does not permit user access to this page - 3 - - - - - LOCK_NS - Lock state for Non-secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - - Note that READ_WRITE and READ_ONLY are equivalent in hardware, as the SBPI programming interface is not accessible to Non-secure software. However, Secure software may check these bits to apply write permissions to a Non-secure OTP programming API. - [3:2] - read-only - - - read_write - Page can be read by Non-secure software, and Secure software may permit Non-secure writes. - 0 - - - read_only - Page can be read by Non-secure software - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Non-secure software. - 3 - - - - - LOCK_S - Lock state for Secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - [1:0] - read-only - - - read_write - Page is fully accessible by Secure software. - 0 - - - read_only - Page can be read by Secure software, but can not be written. - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Secure software. - 3 - - - - - - - PAGE6_LOCK0 - Lock configuration LSBs for page 6 (rows 0x180 through 0x1bf). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3E30 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - NO_KEY_STATE - State when at least one key is registered for this page and no matching key has been entered. - [6:6] - read-only - - - read_only - 0 - - - inaccessible - 1 - - - - - KEY_R - Index 1-6 of a hardware key which must be entered to grant read access, or 0 if no such key is required. - [5:3] - read-only - - - KEY_W - Index 1-6 of a hardware key which must be entered to grant write access, or 0 if no such key is required. - [2:0] - read-only - - - - - PAGE6_LOCK1 - Lock configuration MSBs for page 6 (rows 0x180 through 0x1bf). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3E34 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - LOCK_BL - Dummy lock bits reserved for bootloaders (including the RP2350 USB bootloader) to store their own OTP access permissions. No hardware effect, and no corresponding SW_LOCKx registers. - [5:4] - read-only - - - read_write - Bootloader permits user reads and writes to this page - 0 - - - read_only - Bootloader permits user reads of this page - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE - 2 - - - inaccessible - Bootloader does not permit user access to this page - 3 - - - - - LOCK_NS - Lock state for Non-secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - - Note that READ_WRITE and READ_ONLY are equivalent in hardware, as the SBPI programming interface is not accessible to Non-secure software. However, Secure software may check these bits to apply write permissions to a Non-secure OTP programming API. - [3:2] - read-only - - - read_write - Page can be read by Non-secure software, and Secure software may permit Non-secure writes. - 0 - - - read_only - Page can be read by Non-secure software - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Non-secure software. - 3 - - - - - LOCK_S - Lock state for Secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - [1:0] - read-only - - - read_write - Page is fully accessible by Secure software. - 0 - - - read_only - Page can be read by Secure software, but can not be written. - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Secure software. - 3 - - - - - - - PAGE7_LOCK0 - Lock configuration LSBs for page 7 (rows 0x1c0 through 0x1ff). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3E38 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - NO_KEY_STATE - State when at least one key is registered for this page and no matching key has been entered. - [6:6] - read-only - - - read_only - 0 - - - inaccessible - 1 - - - - - KEY_R - Index 1-6 of a hardware key which must be entered to grant read access, or 0 if no such key is required. - [5:3] - read-only - - - KEY_W - Index 1-6 of a hardware key which must be entered to grant write access, or 0 if no such key is required. - [2:0] - read-only - - - - - PAGE7_LOCK1 - Lock configuration MSBs for page 7 (rows 0x1c0 through 0x1ff). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3E3C - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - LOCK_BL - Dummy lock bits reserved for bootloaders (including the RP2350 USB bootloader) to store their own OTP access permissions. No hardware effect, and no corresponding SW_LOCKx registers. - [5:4] - read-only - - - read_write - Bootloader permits user reads and writes to this page - 0 - - - read_only - Bootloader permits user reads of this page - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE - 2 - - - inaccessible - Bootloader does not permit user access to this page - 3 - - - - - LOCK_NS - Lock state for Non-secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - - Note that READ_WRITE and READ_ONLY are equivalent in hardware, as the SBPI programming interface is not accessible to Non-secure software. However, Secure software may check these bits to apply write permissions to a Non-secure OTP programming API. - [3:2] - read-only - - - read_write - Page can be read by Non-secure software, and Secure software may permit Non-secure writes. - 0 - - - read_only - Page can be read by Non-secure software - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Non-secure software. - 3 - - - - - LOCK_S - Lock state for Secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - [1:0] - read-only - - - read_write - Page is fully accessible by Secure software. - 0 - - - read_only - Page can be read by Secure software, but can not be written. - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Secure software. - 3 - - - - - - - PAGE8_LOCK0 - Lock configuration LSBs for page 8 (rows 0x200 through 0x23f). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3E40 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - NO_KEY_STATE - State when at least one key is registered for this page and no matching key has been entered. - [6:6] - read-only - - - read_only - 0 - - - inaccessible - 1 - - - - - KEY_R - Index 1-6 of a hardware key which must be entered to grant read access, or 0 if no such key is required. - [5:3] - read-only - - - KEY_W - Index 1-6 of a hardware key which must be entered to grant write access, or 0 if no such key is required. - [2:0] - read-only - - - - - PAGE8_LOCK1 - Lock configuration MSBs for page 8 (rows 0x200 through 0x23f). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3E44 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - LOCK_BL - Dummy lock bits reserved for bootloaders (including the RP2350 USB bootloader) to store their own OTP access permissions. No hardware effect, and no corresponding SW_LOCKx registers. - [5:4] - read-only - - - read_write - Bootloader permits user reads and writes to this page - 0 - - - read_only - Bootloader permits user reads of this page - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE - 2 - - - inaccessible - Bootloader does not permit user access to this page - 3 - - - - - LOCK_NS - Lock state for Non-secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - - Note that READ_WRITE and READ_ONLY are equivalent in hardware, as the SBPI programming interface is not accessible to Non-secure software. However, Secure software may check these bits to apply write permissions to a Non-secure OTP programming API. - [3:2] - read-only - - - read_write - Page can be read by Non-secure software, and Secure software may permit Non-secure writes. - 0 - - - read_only - Page can be read by Non-secure software - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Non-secure software. - 3 - - - - - LOCK_S - Lock state for Secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - [1:0] - read-only - - - read_write - Page is fully accessible by Secure software. - 0 - - - read_only - Page can be read by Secure software, but can not be written. - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Secure software. - 3 - - - - - - - PAGE9_LOCK0 - Lock configuration LSBs for page 9 (rows 0x240 through 0x27f). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3E48 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - NO_KEY_STATE - State when at least one key is registered for this page and no matching key has been entered. - [6:6] - read-only - - - read_only - 0 - - - inaccessible - 1 - - - - - KEY_R - Index 1-6 of a hardware key which must be entered to grant read access, or 0 if no such key is required. - [5:3] - read-only - - - KEY_W - Index 1-6 of a hardware key which must be entered to grant write access, or 0 if no such key is required. - [2:0] - read-only - - - - - PAGE9_LOCK1 - Lock configuration MSBs for page 9 (rows 0x240 through 0x27f). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3E4C - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - LOCK_BL - Dummy lock bits reserved for bootloaders (including the RP2350 USB bootloader) to store their own OTP access permissions. No hardware effect, and no corresponding SW_LOCKx registers. - [5:4] - read-only - - - read_write - Bootloader permits user reads and writes to this page - 0 - - - read_only - Bootloader permits user reads of this page - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE - 2 - - - inaccessible - Bootloader does not permit user access to this page - 3 - - - - - LOCK_NS - Lock state for Non-secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - - Note that READ_WRITE and READ_ONLY are equivalent in hardware, as the SBPI programming interface is not accessible to Non-secure software. However, Secure software may check these bits to apply write permissions to a Non-secure OTP programming API. - [3:2] - read-only - - - read_write - Page can be read by Non-secure software, and Secure software may permit Non-secure writes. - 0 - - - read_only - Page can be read by Non-secure software - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Non-secure software. - 3 - - - - - LOCK_S - Lock state for Secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - [1:0] - read-only - - - read_write - Page is fully accessible by Secure software. - 0 - - - read_only - Page can be read by Secure software, but can not be written. - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Secure software. - 3 - - - - - - - PAGE10_LOCK0 - Lock configuration LSBs for page 10 (rows 0x280 through 0x2bf). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3E50 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - NO_KEY_STATE - State when at least one key is registered for this page and no matching key has been entered. - [6:6] - read-only - - - read_only - 0 - - - inaccessible - 1 - - - - - KEY_R - Index 1-6 of a hardware key which must be entered to grant read access, or 0 if no such key is required. - [5:3] - read-only - - - KEY_W - Index 1-6 of a hardware key which must be entered to grant write access, or 0 if no such key is required. - [2:0] - read-only - - - - - PAGE10_LOCK1 - Lock configuration MSBs for page 10 (rows 0x280 through 0x2bf). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3E54 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - LOCK_BL - Dummy lock bits reserved for bootloaders (including the RP2350 USB bootloader) to store their own OTP access permissions. No hardware effect, and no corresponding SW_LOCKx registers. - [5:4] - read-only - - - read_write - Bootloader permits user reads and writes to this page - 0 - - - read_only - Bootloader permits user reads of this page - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE - 2 - - - inaccessible - Bootloader does not permit user access to this page - 3 - - - - - LOCK_NS - Lock state for Non-secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - - Note that READ_WRITE and READ_ONLY are equivalent in hardware, as the SBPI programming interface is not accessible to Non-secure software. However, Secure software may check these bits to apply write permissions to a Non-secure OTP programming API. - [3:2] - read-only - - - read_write - Page can be read by Non-secure software, and Secure software may permit Non-secure writes. - 0 - - - read_only - Page can be read by Non-secure software - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Non-secure software. - 3 - - - - - LOCK_S - Lock state for Secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - [1:0] - read-only - - - read_write - Page is fully accessible by Secure software. - 0 - - - read_only - Page can be read by Secure software, but can not be written. - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Secure software. - 3 - - - - - - - PAGE11_LOCK0 - Lock configuration LSBs for page 11 (rows 0x2c0 through 0x2ff). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3E58 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - NO_KEY_STATE - State when at least one key is registered for this page and no matching key has been entered. - [6:6] - read-only - - - read_only - 0 - - - inaccessible - 1 - - - - - KEY_R - Index 1-6 of a hardware key which must be entered to grant read access, or 0 if no such key is required. - [5:3] - read-only - - - KEY_W - Index 1-6 of a hardware key which must be entered to grant write access, or 0 if no such key is required. - [2:0] - read-only - - - - - PAGE11_LOCK1 - Lock configuration MSBs for page 11 (rows 0x2c0 through 0x2ff). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3E5C - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - LOCK_BL - Dummy lock bits reserved for bootloaders (including the RP2350 USB bootloader) to store their own OTP access permissions. No hardware effect, and no corresponding SW_LOCKx registers. - [5:4] - read-only - - - read_write - Bootloader permits user reads and writes to this page - 0 - - - read_only - Bootloader permits user reads of this page - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE - 2 - - - inaccessible - Bootloader does not permit user access to this page - 3 - - - - - LOCK_NS - Lock state for Non-secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - - Note that READ_WRITE and READ_ONLY are equivalent in hardware, as the SBPI programming interface is not accessible to Non-secure software. However, Secure software may check these bits to apply write permissions to a Non-secure OTP programming API. - [3:2] - read-only - - - read_write - Page can be read by Non-secure software, and Secure software may permit Non-secure writes. - 0 - - - read_only - Page can be read by Non-secure software - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Non-secure software. - 3 - - - - - LOCK_S - Lock state for Secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - [1:0] - read-only - - - read_write - Page is fully accessible by Secure software. - 0 - - - read_only - Page can be read by Secure software, but can not be written. - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Secure software. - 3 - - - - - - - PAGE12_LOCK0 - Lock configuration LSBs for page 12 (rows 0x300 through 0x33f). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3E60 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - NO_KEY_STATE - State when at least one key is registered for this page and no matching key has been entered. - [6:6] - read-only - - - read_only - 0 - - - inaccessible - 1 - - - - - KEY_R - Index 1-6 of a hardware key which must be entered to grant read access, or 0 if no such key is required. - [5:3] - read-only - - - KEY_W - Index 1-6 of a hardware key which must be entered to grant write access, or 0 if no such key is required. - [2:0] - read-only - - - - - PAGE12_LOCK1 - Lock configuration MSBs for page 12 (rows 0x300 through 0x33f). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3E64 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - LOCK_BL - Dummy lock bits reserved for bootloaders (including the RP2350 USB bootloader) to store their own OTP access permissions. No hardware effect, and no corresponding SW_LOCKx registers. - [5:4] - read-only - - - read_write - Bootloader permits user reads and writes to this page - 0 - - - read_only - Bootloader permits user reads of this page - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE - 2 - - - inaccessible - Bootloader does not permit user access to this page - 3 - - - - - LOCK_NS - Lock state for Non-secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - - Note that READ_WRITE and READ_ONLY are equivalent in hardware, as the SBPI programming interface is not accessible to Non-secure software. However, Secure software may check these bits to apply write permissions to a Non-secure OTP programming API. - [3:2] - read-only - - - read_write - Page can be read by Non-secure software, and Secure software may permit Non-secure writes. - 0 - - - read_only - Page can be read by Non-secure software - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Non-secure software. - 3 - - - - - LOCK_S - Lock state for Secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - [1:0] - read-only - - - read_write - Page is fully accessible by Secure software. - 0 - - - read_only - Page can be read by Secure software, but can not be written. - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Secure software. - 3 - - - - - - - PAGE13_LOCK0 - Lock configuration LSBs for page 13 (rows 0x340 through 0x37f). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3E68 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - NO_KEY_STATE - State when at least one key is registered for this page and no matching key has been entered. - [6:6] - read-only - - - read_only - 0 - - - inaccessible - 1 - - - - - KEY_R - Index 1-6 of a hardware key which must be entered to grant read access, or 0 if no such key is required. - [5:3] - read-only - - - KEY_W - Index 1-6 of a hardware key which must be entered to grant write access, or 0 if no such key is required. - [2:0] - read-only - - - - - PAGE13_LOCK1 - Lock configuration MSBs for page 13 (rows 0x340 through 0x37f). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3E6C - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - LOCK_BL - Dummy lock bits reserved for bootloaders (including the RP2350 USB bootloader) to store their own OTP access permissions. No hardware effect, and no corresponding SW_LOCKx registers. - [5:4] - read-only - - - read_write - Bootloader permits user reads and writes to this page - 0 - - - read_only - Bootloader permits user reads of this page - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE - 2 - - - inaccessible - Bootloader does not permit user access to this page - 3 - - - - - LOCK_NS - Lock state for Non-secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - - Note that READ_WRITE and READ_ONLY are equivalent in hardware, as the SBPI programming interface is not accessible to Non-secure software. However, Secure software may check these bits to apply write permissions to a Non-secure OTP programming API. - [3:2] - read-only - - - read_write - Page can be read by Non-secure software, and Secure software may permit Non-secure writes. - 0 - - - read_only - Page can be read by Non-secure software - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Non-secure software. - 3 - - - - - LOCK_S - Lock state for Secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - [1:0] - read-only - - - read_write - Page is fully accessible by Secure software. - 0 - - - read_only - Page can be read by Secure software, but can not be written. - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Secure software. - 3 - - - - - - - PAGE14_LOCK0 - Lock configuration LSBs for page 14 (rows 0x380 through 0x3bf). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3E70 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - NO_KEY_STATE - State when at least one key is registered for this page and no matching key has been entered. - [6:6] - read-only - - - read_only - 0 - - - inaccessible - 1 - - - - - KEY_R - Index 1-6 of a hardware key which must be entered to grant read access, or 0 if no such key is required. - [5:3] - read-only - - - KEY_W - Index 1-6 of a hardware key which must be entered to grant write access, or 0 if no such key is required. - [2:0] - read-only - - - - - PAGE14_LOCK1 - Lock configuration MSBs for page 14 (rows 0x380 through 0x3bf). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3E74 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - LOCK_BL - Dummy lock bits reserved for bootloaders (including the RP2350 USB bootloader) to store their own OTP access permissions. No hardware effect, and no corresponding SW_LOCKx registers. - [5:4] - read-only - - - read_write - Bootloader permits user reads and writes to this page - 0 - - - read_only - Bootloader permits user reads of this page - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE - 2 - - - inaccessible - Bootloader does not permit user access to this page - 3 - - - - - LOCK_NS - Lock state for Non-secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - - Note that READ_WRITE and READ_ONLY are equivalent in hardware, as the SBPI programming interface is not accessible to Non-secure software. However, Secure software may check these bits to apply write permissions to a Non-secure OTP programming API. - [3:2] - read-only - - - read_write - Page can be read by Non-secure software, and Secure software may permit Non-secure writes. - 0 - - - read_only - Page can be read by Non-secure software - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Non-secure software. - 3 - - - - - LOCK_S - Lock state for Secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - [1:0] - read-only - - - read_write - Page is fully accessible by Secure software. - 0 - - - read_only - Page can be read by Secure software, but can not be written. - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Secure software. - 3 - - - - - - - PAGE15_LOCK0 - Lock configuration LSBs for page 15 (rows 0x3c0 through 0x3ff). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3E78 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - NO_KEY_STATE - State when at least one key is registered for this page and no matching key has been entered. - [6:6] - read-only - - - read_only - 0 - - - inaccessible - 1 - - - - - KEY_R - Index 1-6 of a hardware key which must be entered to grant read access, or 0 if no such key is required. - [5:3] - read-only - - - KEY_W - Index 1-6 of a hardware key which must be entered to grant write access, or 0 if no such key is required. - [2:0] - read-only - - - - - PAGE15_LOCK1 - Lock configuration MSBs for page 15 (rows 0x3c0 through 0x3ff). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3E7C - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - LOCK_BL - Dummy lock bits reserved for bootloaders (including the RP2350 USB bootloader) to store their own OTP access permissions. No hardware effect, and no corresponding SW_LOCKx registers. - [5:4] - read-only - - - read_write - Bootloader permits user reads and writes to this page - 0 - - - read_only - Bootloader permits user reads of this page - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE - 2 - - - inaccessible - Bootloader does not permit user access to this page - 3 - - - - - LOCK_NS - Lock state for Non-secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - - Note that READ_WRITE and READ_ONLY are equivalent in hardware, as the SBPI programming interface is not accessible to Non-secure software. However, Secure software may check these bits to apply write permissions to a Non-secure OTP programming API. - [3:2] - read-only - - - read_write - Page can be read by Non-secure software, and Secure software may permit Non-secure writes. - 0 - - - read_only - Page can be read by Non-secure software - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Non-secure software. - 3 - - - - - LOCK_S - Lock state for Secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - [1:0] - read-only - - - read_write - Page is fully accessible by Secure software. - 0 - - - read_only - Page can be read by Secure software, but can not be written. - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Secure software. - 3 - - - - - - - PAGE16_LOCK0 - Lock configuration LSBs for page 16 (rows 0x400 through 0x43f). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3E80 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - NO_KEY_STATE - State when at least one key is registered for this page and no matching key has been entered. - [6:6] - read-only - - - read_only - 0 - - - inaccessible - 1 - - - - - KEY_R - Index 1-6 of a hardware key which must be entered to grant read access, or 0 if no such key is required. - [5:3] - read-only - - - KEY_W - Index 1-6 of a hardware key which must be entered to grant write access, or 0 if no such key is required. - [2:0] - read-only - - - - - PAGE16_LOCK1 - Lock configuration MSBs for page 16 (rows 0x400 through 0x43f). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3E84 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - LOCK_BL - Dummy lock bits reserved for bootloaders (including the RP2350 USB bootloader) to store their own OTP access permissions. No hardware effect, and no corresponding SW_LOCKx registers. - [5:4] - read-only - - - read_write - Bootloader permits user reads and writes to this page - 0 - - - read_only - Bootloader permits user reads of this page - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE - 2 - - - inaccessible - Bootloader does not permit user access to this page - 3 - - - - - LOCK_NS - Lock state for Non-secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - - Note that READ_WRITE and READ_ONLY are equivalent in hardware, as the SBPI programming interface is not accessible to Non-secure software. However, Secure software may check these bits to apply write permissions to a Non-secure OTP programming API. - [3:2] - read-only - - - read_write - Page can be read by Non-secure software, and Secure software may permit Non-secure writes. - 0 - - - read_only - Page can be read by Non-secure software - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Non-secure software. - 3 - - - - - LOCK_S - Lock state for Secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - [1:0] - read-only - - - read_write - Page is fully accessible by Secure software. - 0 - - - read_only - Page can be read by Secure software, but can not be written. - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Secure software. - 3 - - - - - - - PAGE17_LOCK0 - Lock configuration LSBs for page 17 (rows 0x440 through 0x47f). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3E88 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - NO_KEY_STATE - State when at least one key is registered for this page and no matching key has been entered. - [6:6] - read-only - - - read_only - 0 - - - inaccessible - 1 - - - - - KEY_R - Index 1-6 of a hardware key which must be entered to grant read access, or 0 if no such key is required. - [5:3] - read-only - - - KEY_W - Index 1-6 of a hardware key which must be entered to grant write access, or 0 if no such key is required. - [2:0] - read-only - - - - - PAGE17_LOCK1 - Lock configuration MSBs for page 17 (rows 0x440 through 0x47f). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3E8C - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - LOCK_BL - Dummy lock bits reserved for bootloaders (including the RP2350 USB bootloader) to store their own OTP access permissions. No hardware effect, and no corresponding SW_LOCKx registers. - [5:4] - read-only - - - read_write - Bootloader permits user reads and writes to this page - 0 - - - read_only - Bootloader permits user reads of this page - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE - 2 - - - inaccessible - Bootloader does not permit user access to this page - 3 - - - - - LOCK_NS - Lock state for Non-secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - - Note that READ_WRITE and READ_ONLY are equivalent in hardware, as the SBPI programming interface is not accessible to Non-secure software. However, Secure software may check these bits to apply write permissions to a Non-secure OTP programming API. - [3:2] - read-only - - - read_write - Page can be read by Non-secure software, and Secure software may permit Non-secure writes. - 0 - - - read_only - Page can be read by Non-secure software - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Non-secure software. - 3 - - - - - LOCK_S - Lock state for Secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - [1:0] - read-only - - - read_write - Page is fully accessible by Secure software. - 0 - - - read_only - Page can be read by Secure software, but can not be written. - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Secure software. - 3 - - - - - - - PAGE18_LOCK0 - Lock configuration LSBs for page 18 (rows 0x480 through 0x4bf). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3E90 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - NO_KEY_STATE - State when at least one key is registered for this page and no matching key has been entered. - [6:6] - read-only - - - read_only - 0 - - - inaccessible - 1 - - - - - KEY_R - Index 1-6 of a hardware key which must be entered to grant read access, or 0 if no such key is required. - [5:3] - read-only - - - KEY_W - Index 1-6 of a hardware key which must be entered to grant write access, or 0 if no such key is required. - [2:0] - read-only - - - - - PAGE18_LOCK1 - Lock configuration MSBs for page 18 (rows 0x480 through 0x4bf). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3E94 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - LOCK_BL - Dummy lock bits reserved for bootloaders (including the RP2350 USB bootloader) to store their own OTP access permissions. No hardware effect, and no corresponding SW_LOCKx registers. - [5:4] - read-only - - - read_write - Bootloader permits user reads and writes to this page - 0 - - - read_only - Bootloader permits user reads of this page - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE - 2 - - - inaccessible - Bootloader does not permit user access to this page - 3 - - - - - LOCK_NS - Lock state for Non-secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - - Note that READ_WRITE and READ_ONLY are equivalent in hardware, as the SBPI programming interface is not accessible to Non-secure software. However, Secure software may check these bits to apply write permissions to a Non-secure OTP programming API. - [3:2] - read-only - - - read_write - Page can be read by Non-secure software, and Secure software may permit Non-secure writes. - 0 - - - read_only - Page can be read by Non-secure software - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Non-secure software. - 3 - - - - - LOCK_S - Lock state for Secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - [1:0] - read-only - - - read_write - Page is fully accessible by Secure software. - 0 - - - read_only - Page can be read by Secure software, but can not be written. - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Secure software. - 3 - - - - - - - PAGE19_LOCK0 - Lock configuration LSBs for page 19 (rows 0x4c0 through 0x4ff). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3E98 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - NO_KEY_STATE - State when at least one key is registered for this page and no matching key has been entered. - [6:6] - read-only - - - read_only - 0 - - - inaccessible - 1 - - - - - KEY_R - Index 1-6 of a hardware key which must be entered to grant read access, or 0 if no such key is required. - [5:3] - read-only - - - KEY_W - Index 1-6 of a hardware key which must be entered to grant write access, or 0 if no such key is required. - [2:0] - read-only - - - - - PAGE19_LOCK1 - Lock configuration MSBs for page 19 (rows 0x4c0 through 0x4ff). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3E9C - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - LOCK_BL - Dummy lock bits reserved for bootloaders (including the RP2350 USB bootloader) to store their own OTP access permissions. No hardware effect, and no corresponding SW_LOCKx registers. - [5:4] - read-only - - - read_write - Bootloader permits user reads and writes to this page - 0 - - - read_only - Bootloader permits user reads of this page - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE - 2 - - - inaccessible - Bootloader does not permit user access to this page - 3 - - - - - LOCK_NS - Lock state for Non-secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - - Note that READ_WRITE and READ_ONLY are equivalent in hardware, as the SBPI programming interface is not accessible to Non-secure software. However, Secure software may check these bits to apply write permissions to a Non-secure OTP programming API. - [3:2] - read-only - - - read_write - Page can be read by Non-secure software, and Secure software may permit Non-secure writes. - 0 - - - read_only - Page can be read by Non-secure software - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Non-secure software. - 3 - - - - - LOCK_S - Lock state for Secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - [1:0] - read-only - - - read_write - Page is fully accessible by Secure software. - 0 - - - read_only - Page can be read by Secure software, but can not be written. - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Secure software. - 3 - - - - - - - PAGE20_LOCK0 - Lock configuration LSBs for page 20 (rows 0x500 through 0x53f). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3EA0 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - NO_KEY_STATE - State when at least one key is registered for this page and no matching key has been entered. - [6:6] - read-only - - - read_only - 0 - - - inaccessible - 1 - - - - - KEY_R - Index 1-6 of a hardware key which must be entered to grant read access, or 0 if no such key is required. - [5:3] - read-only - - - KEY_W - Index 1-6 of a hardware key which must be entered to grant write access, or 0 if no such key is required. - [2:0] - read-only - - - - - PAGE20_LOCK1 - Lock configuration MSBs for page 20 (rows 0x500 through 0x53f). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3EA4 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - LOCK_BL - Dummy lock bits reserved for bootloaders (including the RP2350 USB bootloader) to store their own OTP access permissions. No hardware effect, and no corresponding SW_LOCKx registers. - [5:4] - read-only - - - read_write - Bootloader permits user reads and writes to this page - 0 - - - read_only - Bootloader permits user reads of this page - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE - 2 - - - inaccessible - Bootloader does not permit user access to this page - 3 - - - - - LOCK_NS - Lock state for Non-secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - - Note that READ_WRITE and READ_ONLY are equivalent in hardware, as the SBPI programming interface is not accessible to Non-secure software. However, Secure software may check these bits to apply write permissions to a Non-secure OTP programming API. - [3:2] - read-only - - - read_write - Page can be read by Non-secure software, and Secure software may permit Non-secure writes. - 0 - - - read_only - Page can be read by Non-secure software - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Non-secure software. - 3 - - - - - LOCK_S - Lock state for Secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - [1:0] - read-only - - - read_write - Page is fully accessible by Secure software. - 0 - - - read_only - Page can be read by Secure software, but can not be written. - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Secure software. - 3 - - - - - - - PAGE21_LOCK0 - Lock configuration LSBs for page 21 (rows 0x540 through 0x57f). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3EA8 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - NO_KEY_STATE - State when at least one key is registered for this page and no matching key has been entered. - [6:6] - read-only - - - read_only - 0 - - - inaccessible - 1 - - - - - KEY_R - Index 1-6 of a hardware key which must be entered to grant read access, or 0 if no such key is required. - [5:3] - read-only - - - KEY_W - Index 1-6 of a hardware key which must be entered to grant write access, or 0 if no such key is required. - [2:0] - read-only - - - - - PAGE21_LOCK1 - Lock configuration MSBs for page 21 (rows 0x540 through 0x57f). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3EAC - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - LOCK_BL - Dummy lock bits reserved for bootloaders (including the RP2350 USB bootloader) to store their own OTP access permissions. No hardware effect, and no corresponding SW_LOCKx registers. - [5:4] - read-only - - - read_write - Bootloader permits user reads and writes to this page - 0 - - - read_only - Bootloader permits user reads of this page - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE - 2 - - - inaccessible - Bootloader does not permit user access to this page - 3 - - - - - LOCK_NS - Lock state for Non-secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - - Note that READ_WRITE and READ_ONLY are equivalent in hardware, as the SBPI programming interface is not accessible to Non-secure software. However, Secure software may check these bits to apply write permissions to a Non-secure OTP programming API. - [3:2] - read-only - - - read_write - Page can be read by Non-secure software, and Secure software may permit Non-secure writes. - 0 - - - read_only - Page can be read by Non-secure software - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Non-secure software. - 3 - - - - - LOCK_S - Lock state for Secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - [1:0] - read-only - - - read_write - Page is fully accessible by Secure software. - 0 - - - read_only - Page can be read by Secure software, but can not be written. - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Secure software. - 3 - - - - - - - PAGE22_LOCK0 - Lock configuration LSBs for page 22 (rows 0x580 through 0x5bf). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3EB0 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - NO_KEY_STATE - State when at least one key is registered for this page and no matching key has been entered. - [6:6] - read-only - - - read_only - 0 - - - inaccessible - 1 - - - - - KEY_R - Index 1-6 of a hardware key which must be entered to grant read access, or 0 if no such key is required. - [5:3] - read-only - - - KEY_W - Index 1-6 of a hardware key which must be entered to grant write access, or 0 if no such key is required. - [2:0] - read-only - - - - - PAGE22_LOCK1 - Lock configuration MSBs for page 22 (rows 0x580 through 0x5bf). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3EB4 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - LOCK_BL - Dummy lock bits reserved for bootloaders (including the RP2350 USB bootloader) to store their own OTP access permissions. No hardware effect, and no corresponding SW_LOCKx registers. - [5:4] - read-only - - - read_write - Bootloader permits user reads and writes to this page - 0 - - - read_only - Bootloader permits user reads of this page - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE - 2 - - - inaccessible - Bootloader does not permit user access to this page - 3 - - - - - LOCK_NS - Lock state for Non-secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - - Note that READ_WRITE and READ_ONLY are equivalent in hardware, as the SBPI programming interface is not accessible to Non-secure software. However, Secure software may check these bits to apply write permissions to a Non-secure OTP programming API. - [3:2] - read-only - - - read_write - Page can be read by Non-secure software, and Secure software may permit Non-secure writes. - 0 - - - read_only - Page can be read by Non-secure software - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Non-secure software. - 3 - - - - - LOCK_S - Lock state for Secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - [1:0] - read-only - - - read_write - Page is fully accessible by Secure software. - 0 - - - read_only - Page can be read by Secure software, but can not be written. - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Secure software. - 3 - - - - - - - PAGE23_LOCK0 - Lock configuration LSBs for page 23 (rows 0x5c0 through 0x5ff). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3EB8 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - NO_KEY_STATE - State when at least one key is registered for this page and no matching key has been entered. - [6:6] - read-only - - - read_only - 0 - - - inaccessible - 1 - - - - - KEY_R - Index 1-6 of a hardware key which must be entered to grant read access, or 0 if no such key is required. - [5:3] - read-only - - - KEY_W - Index 1-6 of a hardware key which must be entered to grant write access, or 0 if no such key is required. - [2:0] - read-only - - - - - PAGE23_LOCK1 - Lock configuration MSBs for page 23 (rows 0x5c0 through 0x5ff). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3EBC - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - LOCK_BL - Dummy lock bits reserved for bootloaders (including the RP2350 USB bootloader) to store their own OTP access permissions. No hardware effect, and no corresponding SW_LOCKx registers. - [5:4] - read-only - - - read_write - Bootloader permits user reads and writes to this page - 0 - - - read_only - Bootloader permits user reads of this page - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE - 2 - - - inaccessible - Bootloader does not permit user access to this page - 3 - - - - - LOCK_NS - Lock state for Non-secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - - Note that READ_WRITE and READ_ONLY are equivalent in hardware, as the SBPI programming interface is not accessible to Non-secure software. However, Secure software may check these bits to apply write permissions to a Non-secure OTP programming API. - [3:2] - read-only - - - read_write - Page can be read by Non-secure software, and Secure software may permit Non-secure writes. - 0 - - - read_only - Page can be read by Non-secure software - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Non-secure software. - 3 - - - - - LOCK_S - Lock state for Secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - [1:0] - read-only - - - read_write - Page is fully accessible by Secure software. - 0 - - - read_only - Page can be read by Secure software, but can not be written. - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Secure software. - 3 - - - - - - - PAGE24_LOCK0 - Lock configuration LSBs for page 24 (rows 0x600 through 0x63f). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3EC0 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - NO_KEY_STATE - State when at least one key is registered for this page and no matching key has been entered. - [6:6] - read-only - - - read_only - 0 - - - inaccessible - 1 - - - - - KEY_R - Index 1-6 of a hardware key which must be entered to grant read access, or 0 if no such key is required. - [5:3] - read-only - - - KEY_W - Index 1-6 of a hardware key which must be entered to grant write access, or 0 if no such key is required. - [2:0] - read-only - - - - - PAGE24_LOCK1 - Lock configuration MSBs for page 24 (rows 0x600 through 0x63f). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3EC4 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - LOCK_BL - Dummy lock bits reserved for bootloaders (including the RP2350 USB bootloader) to store their own OTP access permissions. No hardware effect, and no corresponding SW_LOCKx registers. - [5:4] - read-only - - - read_write - Bootloader permits user reads and writes to this page - 0 - - - read_only - Bootloader permits user reads of this page - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE - 2 - - - inaccessible - Bootloader does not permit user access to this page - 3 - - - - - LOCK_NS - Lock state for Non-secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - - Note that READ_WRITE and READ_ONLY are equivalent in hardware, as the SBPI programming interface is not accessible to Non-secure software. However, Secure software may check these bits to apply write permissions to a Non-secure OTP programming API. - [3:2] - read-only - - - read_write - Page can be read by Non-secure software, and Secure software may permit Non-secure writes. - 0 - - - read_only - Page can be read by Non-secure software - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Non-secure software. - 3 - - - - - LOCK_S - Lock state for Secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - [1:0] - read-only - - - read_write - Page is fully accessible by Secure software. - 0 - - - read_only - Page can be read by Secure software, but can not be written. - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Secure software. - 3 - - - - - - - PAGE25_LOCK0 - Lock configuration LSBs for page 25 (rows 0x640 through 0x67f). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3EC8 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - NO_KEY_STATE - State when at least one key is registered for this page and no matching key has been entered. - [6:6] - read-only - - - read_only - 0 - - - inaccessible - 1 - - - - - KEY_R - Index 1-6 of a hardware key which must be entered to grant read access, or 0 if no such key is required. - [5:3] - read-only - - - KEY_W - Index 1-6 of a hardware key which must be entered to grant write access, or 0 if no such key is required. - [2:0] - read-only - - - - - PAGE25_LOCK1 - Lock configuration MSBs for page 25 (rows 0x640 through 0x67f). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3ECC - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - LOCK_BL - Dummy lock bits reserved for bootloaders (including the RP2350 USB bootloader) to store their own OTP access permissions. No hardware effect, and no corresponding SW_LOCKx registers. - [5:4] - read-only - - - read_write - Bootloader permits user reads and writes to this page - 0 - - - read_only - Bootloader permits user reads of this page - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE - 2 - - - inaccessible - Bootloader does not permit user access to this page - 3 - - - - - LOCK_NS - Lock state for Non-secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - - Note that READ_WRITE and READ_ONLY are equivalent in hardware, as the SBPI programming interface is not accessible to Non-secure software. However, Secure software may check these bits to apply write permissions to a Non-secure OTP programming API. - [3:2] - read-only - - - read_write - Page can be read by Non-secure software, and Secure software may permit Non-secure writes. - 0 - - - read_only - Page can be read by Non-secure software - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Non-secure software. - 3 - - - - - LOCK_S - Lock state for Secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - [1:0] - read-only - - - read_write - Page is fully accessible by Secure software. - 0 - - - read_only - Page can be read by Secure software, but can not be written. - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Secure software. - 3 - - - - - - - PAGE26_LOCK0 - Lock configuration LSBs for page 26 (rows 0x680 through 0x6bf). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3ED0 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - NO_KEY_STATE - State when at least one key is registered for this page and no matching key has been entered. - [6:6] - read-only - - - read_only - 0 - - - inaccessible - 1 - - - - - KEY_R - Index 1-6 of a hardware key which must be entered to grant read access, or 0 if no such key is required. - [5:3] - read-only - - - KEY_W - Index 1-6 of a hardware key which must be entered to grant write access, or 0 if no such key is required. - [2:0] - read-only - - - - - PAGE26_LOCK1 - Lock configuration MSBs for page 26 (rows 0x680 through 0x6bf). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3ED4 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - LOCK_BL - Dummy lock bits reserved for bootloaders (including the RP2350 USB bootloader) to store their own OTP access permissions. No hardware effect, and no corresponding SW_LOCKx registers. - [5:4] - read-only - - - read_write - Bootloader permits user reads and writes to this page - 0 - - - read_only - Bootloader permits user reads of this page - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE - 2 - - - inaccessible - Bootloader does not permit user access to this page - 3 - - - - - LOCK_NS - Lock state for Non-secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - - Note that READ_WRITE and READ_ONLY are equivalent in hardware, as the SBPI programming interface is not accessible to Non-secure software. However, Secure software may check these bits to apply write permissions to a Non-secure OTP programming API. - [3:2] - read-only - - - read_write - Page can be read by Non-secure software, and Secure software may permit Non-secure writes. - 0 - - - read_only - Page can be read by Non-secure software - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Non-secure software. - 3 - - - - - LOCK_S - Lock state for Secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - [1:0] - read-only - - - read_write - Page is fully accessible by Secure software. - 0 - - - read_only - Page can be read by Secure software, but can not be written. - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Secure software. - 3 - - - - - - - PAGE27_LOCK0 - Lock configuration LSBs for page 27 (rows 0x6c0 through 0x6ff). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3ED8 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - NO_KEY_STATE - State when at least one key is registered for this page and no matching key has been entered. - [6:6] - read-only - - - read_only - 0 - - - inaccessible - 1 - - - - - KEY_R - Index 1-6 of a hardware key which must be entered to grant read access, or 0 if no such key is required. - [5:3] - read-only - - - KEY_W - Index 1-6 of a hardware key which must be entered to grant write access, or 0 if no such key is required. - [2:0] - read-only - - - - - PAGE27_LOCK1 - Lock configuration MSBs for page 27 (rows 0x6c0 through 0x6ff). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3EDC - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - LOCK_BL - Dummy lock bits reserved for bootloaders (including the RP2350 USB bootloader) to store their own OTP access permissions. No hardware effect, and no corresponding SW_LOCKx registers. - [5:4] - read-only - - - read_write - Bootloader permits user reads and writes to this page - 0 - - - read_only - Bootloader permits user reads of this page - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE - 2 - - - inaccessible - Bootloader does not permit user access to this page - 3 - - - - - LOCK_NS - Lock state for Non-secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - - Note that READ_WRITE and READ_ONLY are equivalent in hardware, as the SBPI programming interface is not accessible to Non-secure software. However, Secure software may check these bits to apply write permissions to a Non-secure OTP programming API. - [3:2] - read-only - - - read_write - Page can be read by Non-secure software, and Secure software may permit Non-secure writes. - 0 - - - read_only - Page can be read by Non-secure software - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Non-secure software. - 3 - - - - - LOCK_S - Lock state for Secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - [1:0] - read-only - - - read_write - Page is fully accessible by Secure software. - 0 - - - read_only - Page can be read by Secure software, but can not be written. - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Secure software. - 3 - - - - - - - PAGE28_LOCK0 - Lock configuration LSBs for page 28 (rows 0x700 through 0x73f). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3EE0 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - NO_KEY_STATE - State when at least one key is registered for this page and no matching key has been entered. - [6:6] - read-only - - - read_only - 0 - - - inaccessible - 1 - - - - - KEY_R - Index 1-6 of a hardware key which must be entered to grant read access, or 0 if no such key is required. - [5:3] - read-only - - - KEY_W - Index 1-6 of a hardware key which must be entered to grant write access, or 0 if no such key is required. - [2:0] - read-only - - - - - PAGE28_LOCK1 - Lock configuration MSBs for page 28 (rows 0x700 through 0x73f). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3EE4 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - LOCK_BL - Dummy lock bits reserved for bootloaders (including the RP2350 USB bootloader) to store their own OTP access permissions. No hardware effect, and no corresponding SW_LOCKx registers. - [5:4] - read-only - - - read_write - Bootloader permits user reads and writes to this page - 0 - - - read_only - Bootloader permits user reads of this page - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE - 2 - - - inaccessible - Bootloader does not permit user access to this page - 3 - - - - - LOCK_NS - Lock state for Non-secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - - Note that READ_WRITE and READ_ONLY are equivalent in hardware, as the SBPI programming interface is not accessible to Non-secure software. However, Secure software may check these bits to apply write permissions to a Non-secure OTP programming API. - [3:2] - read-only - - - read_write - Page can be read by Non-secure software, and Secure software may permit Non-secure writes. - 0 - - - read_only - Page can be read by Non-secure software - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Non-secure software. - 3 - - - - - LOCK_S - Lock state for Secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - [1:0] - read-only - - - read_write - Page is fully accessible by Secure software. - 0 - - - read_only - Page can be read by Secure software, but can not be written. - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Secure software. - 3 - - - - - - - PAGE29_LOCK0 - Lock configuration LSBs for page 29 (rows 0x740 through 0x77f). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3EE8 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - NO_KEY_STATE - State when at least one key is registered for this page and no matching key has been entered. - [6:6] - read-only - - - read_only - 0 - - - inaccessible - 1 - - - - - KEY_R - Index 1-6 of a hardware key which must be entered to grant read access, or 0 if no such key is required. - [5:3] - read-only - - - KEY_W - Index 1-6 of a hardware key which must be entered to grant write access, or 0 if no such key is required. - [2:0] - read-only - - - - - PAGE29_LOCK1 - Lock configuration MSBs for page 29 (rows 0x740 through 0x77f). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3EEC - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - LOCK_BL - Dummy lock bits reserved for bootloaders (including the RP2350 USB bootloader) to store their own OTP access permissions. No hardware effect, and no corresponding SW_LOCKx registers. - [5:4] - read-only - - - read_write - Bootloader permits user reads and writes to this page - 0 - - - read_only - Bootloader permits user reads of this page - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE - 2 - - - inaccessible - Bootloader does not permit user access to this page - 3 - - - - - LOCK_NS - Lock state for Non-secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - - Note that READ_WRITE and READ_ONLY are equivalent in hardware, as the SBPI programming interface is not accessible to Non-secure software. However, Secure software may check these bits to apply write permissions to a Non-secure OTP programming API. - [3:2] - read-only - - - read_write - Page can be read by Non-secure software, and Secure software may permit Non-secure writes. - 0 - - - read_only - Page can be read by Non-secure software - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Non-secure software. - 3 - - - - - LOCK_S - Lock state for Secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - [1:0] - read-only - - - read_write - Page is fully accessible by Secure software. - 0 - - - read_only - Page can be read by Secure software, but can not be written. - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Secure software. - 3 - - - - - - - PAGE30_LOCK0 - Lock configuration LSBs for page 30 (rows 0x780 through 0x7bf). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3EF0 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - NO_KEY_STATE - State when at least one key is registered for this page and no matching key has been entered. - [6:6] - read-only - - - read_only - 0 - - - inaccessible - 1 - - - - - KEY_R - Index 1-6 of a hardware key which must be entered to grant read access, or 0 if no such key is required. - [5:3] - read-only - - - KEY_W - Index 1-6 of a hardware key which must be entered to grant write access, or 0 if no such key is required. - [2:0] - read-only - - - - - PAGE30_LOCK1 - Lock configuration MSBs for page 30 (rows 0x780 through 0x7bf). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3EF4 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - LOCK_BL - Dummy lock bits reserved for bootloaders (including the RP2350 USB bootloader) to store their own OTP access permissions. No hardware effect, and no corresponding SW_LOCKx registers. - [5:4] - read-only - - - read_write - Bootloader permits user reads and writes to this page - 0 - - - read_only - Bootloader permits user reads of this page - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE - 2 - - - inaccessible - Bootloader does not permit user access to this page - 3 - - - - - LOCK_NS - Lock state for Non-secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - - Note that READ_WRITE and READ_ONLY are equivalent in hardware, as the SBPI programming interface is not accessible to Non-secure software. However, Secure software may check these bits to apply write permissions to a Non-secure OTP programming API. - [3:2] - read-only - - - read_write - Page can be read by Non-secure software, and Secure software may permit Non-secure writes. - 0 - - - read_only - Page can be read by Non-secure software - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Non-secure software. - 3 - - - - - LOCK_S - Lock state for Secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - [1:0] - read-only - - - read_write - Page is fully accessible by Secure software. - 0 - - - read_only - Page can be read by Secure software, but can not be written. - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Secure software. - 3 - - - - - - - PAGE31_LOCK0 - Lock configuration LSBs for page 31 (rows 0x7c0 through 0x7ff). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3EF8 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - NO_KEY_STATE - State when at least one key is registered for this page and no matching key has been entered. - [6:6] - read-only - - - read_only - 0 - - - inaccessible - 1 - - - - - KEY_R - Index 1-6 of a hardware key which must be entered to grant read access, or 0 if no such key is required. - [5:3] - read-only - - - KEY_W - Index 1-6 of a hardware key which must be entered to grant write access, or 0 if no such key is required. - [2:0] - read-only - - - - - PAGE31_LOCK1 - Lock configuration MSBs for page 31 (rows 0x7c0 through 0x7ff). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3EFC - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - LOCK_BL - Dummy lock bits reserved for bootloaders (including the RP2350 USB bootloader) to store their own OTP access permissions. No hardware effect, and no corresponding SW_LOCKx registers. - [5:4] - read-only - - - read_write - Bootloader permits user reads and writes to this page - 0 - - - read_only - Bootloader permits user reads of this page - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE - 2 - - - inaccessible - Bootloader does not permit user access to this page - 3 - - - - - LOCK_NS - Lock state for Non-secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - - Note that READ_WRITE and READ_ONLY are equivalent in hardware, as the SBPI programming interface is not accessible to Non-secure software. However, Secure software may check these bits to apply write permissions to a Non-secure OTP programming API. - [3:2] - read-only - - - read_write - Page can be read by Non-secure software, and Secure software may permit Non-secure writes. - 0 - - - read_only - Page can be read by Non-secure software - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Non-secure software. - 3 - - - - - LOCK_S - Lock state for Secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - [1:0] - read-only - - - read_write - Page is fully accessible by Secure software. - 0 - - - read_only - Page can be read by Secure software, but can not be written. - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Secure software. - 3 - - - - - - - PAGE32_LOCK0 - Lock configuration LSBs for page 32 (rows 0x800 through 0x83f). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3F00 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - NO_KEY_STATE - State when at least one key is registered for this page and no matching key has been entered. - [6:6] - read-only - - - read_only - 0 - - - inaccessible - 1 - - - - - KEY_R - Index 1-6 of a hardware key which must be entered to grant read access, or 0 if no such key is required. - [5:3] - read-only - - - KEY_W - Index 1-6 of a hardware key which must be entered to grant write access, or 0 if no such key is required. - [2:0] - read-only - - - - - PAGE32_LOCK1 - Lock configuration MSBs for page 32 (rows 0x800 through 0x83f). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3F04 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - LOCK_BL - Dummy lock bits reserved for bootloaders (including the RP2350 USB bootloader) to store their own OTP access permissions. No hardware effect, and no corresponding SW_LOCKx registers. - [5:4] - read-only - - - read_write - Bootloader permits user reads and writes to this page - 0 - - - read_only - Bootloader permits user reads of this page - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE - 2 - - - inaccessible - Bootloader does not permit user access to this page - 3 - - - - - LOCK_NS - Lock state for Non-secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - - Note that READ_WRITE and READ_ONLY are equivalent in hardware, as the SBPI programming interface is not accessible to Non-secure software. However, Secure software may check these bits to apply write permissions to a Non-secure OTP programming API. - [3:2] - read-only - - - read_write - Page can be read by Non-secure software, and Secure software may permit Non-secure writes. - 0 - - - read_only - Page can be read by Non-secure software - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Non-secure software. - 3 - - - - - LOCK_S - Lock state for Secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - [1:0] - read-only - - - read_write - Page is fully accessible by Secure software. - 0 - - - read_only - Page can be read by Secure software, but can not be written. - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Secure software. - 3 - - - - - - - PAGE33_LOCK0 - Lock configuration LSBs for page 33 (rows 0x840 through 0x87f). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3F08 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - NO_KEY_STATE - State when at least one key is registered for this page and no matching key has been entered. - [6:6] - read-only - - - read_only - 0 - - - inaccessible - 1 - - - - - KEY_R - Index 1-6 of a hardware key which must be entered to grant read access, or 0 if no such key is required. - [5:3] - read-only - - - KEY_W - Index 1-6 of a hardware key which must be entered to grant write access, or 0 if no such key is required. - [2:0] - read-only - - - - - PAGE33_LOCK1 - Lock configuration MSBs for page 33 (rows 0x840 through 0x87f). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3F0C - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - LOCK_BL - Dummy lock bits reserved for bootloaders (including the RP2350 USB bootloader) to store their own OTP access permissions. No hardware effect, and no corresponding SW_LOCKx registers. - [5:4] - read-only - - - read_write - Bootloader permits user reads and writes to this page - 0 - - - read_only - Bootloader permits user reads of this page - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE - 2 - - - inaccessible - Bootloader does not permit user access to this page - 3 - - - - - LOCK_NS - Lock state for Non-secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - - Note that READ_WRITE and READ_ONLY are equivalent in hardware, as the SBPI programming interface is not accessible to Non-secure software. However, Secure software may check these bits to apply write permissions to a Non-secure OTP programming API. - [3:2] - read-only - - - read_write - Page can be read by Non-secure software, and Secure software may permit Non-secure writes. - 0 - - - read_only - Page can be read by Non-secure software - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Non-secure software. - 3 - - - - - LOCK_S - Lock state for Secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - [1:0] - read-only - - - read_write - Page is fully accessible by Secure software. - 0 - - - read_only - Page can be read by Secure software, but can not be written. - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Secure software. - 3 - - - - - - - PAGE34_LOCK0 - Lock configuration LSBs for page 34 (rows 0x880 through 0x8bf). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3F10 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - NO_KEY_STATE - State when at least one key is registered for this page and no matching key has been entered. - [6:6] - read-only - - - read_only - 0 - - - inaccessible - 1 - - - - - KEY_R - Index 1-6 of a hardware key which must be entered to grant read access, or 0 if no such key is required. - [5:3] - read-only - - - KEY_W - Index 1-6 of a hardware key which must be entered to grant write access, or 0 if no such key is required. - [2:0] - read-only - - - - - PAGE34_LOCK1 - Lock configuration MSBs for page 34 (rows 0x880 through 0x8bf). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3F14 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - LOCK_BL - Dummy lock bits reserved for bootloaders (including the RP2350 USB bootloader) to store their own OTP access permissions. No hardware effect, and no corresponding SW_LOCKx registers. - [5:4] - read-only - - - read_write - Bootloader permits user reads and writes to this page - 0 - - - read_only - Bootloader permits user reads of this page - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE - 2 - - - inaccessible - Bootloader does not permit user access to this page - 3 - - - - - LOCK_NS - Lock state for Non-secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - - Note that READ_WRITE and READ_ONLY are equivalent in hardware, as the SBPI programming interface is not accessible to Non-secure software. However, Secure software may check these bits to apply write permissions to a Non-secure OTP programming API. - [3:2] - read-only - - - read_write - Page can be read by Non-secure software, and Secure software may permit Non-secure writes. - 0 - - - read_only - Page can be read by Non-secure software - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Non-secure software. - 3 - - - - - LOCK_S - Lock state for Secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - [1:0] - read-only - - - read_write - Page is fully accessible by Secure software. - 0 - - - read_only - Page can be read by Secure software, but can not be written. - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Secure software. - 3 - - - - - - - PAGE35_LOCK0 - Lock configuration LSBs for page 35 (rows 0x8c0 through 0x8ff). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3F18 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - NO_KEY_STATE - State when at least one key is registered for this page and no matching key has been entered. - [6:6] - read-only - - - read_only - 0 - - - inaccessible - 1 - - - - - KEY_R - Index 1-6 of a hardware key which must be entered to grant read access, or 0 if no such key is required. - [5:3] - read-only - - - KEY_W - Index 1-6 of a hardware key which must be entered to grant write access, or 0 if no such key is required. - [2:0] - read-only - - - - - PAGE35_LOCK1 - Lock configuration MSBs for page 35 (rows 0x8c0 through 0x8ff). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3F1C - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - LOCK_BL - Dummy lock bits reserved for bootloaders (including the RP2350 USB bootloader) to store their own OTP access permissions. No hardware effect, and no corresponding SW_LOCKx registers. - [5:4] - read-only - - - read_write - Bootloader permits user reads and writes to this page - 0 - - - read_only - Bootloader permits user reads of this page - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE - 2 - - - inaccessible - Bootloader does not permit user access to this page - 3 - - - - - LOCK_NS - Lock state for Non-secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - - Note that READ_WRITE and READ_ONLY are equivalent in hardware, as the SBPI programming interface is not accessible to Non-secure software. However, Secure software may check these bits to apply write permissions to a Non-secure OTP programming API. - [3:2] - read-only - - - read_write - Page can be read by Non-secure software, and Secure software may permit Non-secure writes. - 0 - - - read_only - Page can be read by Non-secure software - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Non-secure software. - 3 - - - - - LOCK_S - Lock state for Secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - [1:0] - read-only - - - read_write - Page is fully accessible by Secure software. - 0 - - - read_only - Page can be read by Secure software, but can not be written. - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Secure software. - 3 - - - - - - - PAGE36_LOCK0 - Lock configuration LSBs for page 36 (rows 0x900 through 0x93f). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3F20 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - NO_KEY_STATE - State when at least one key is registered for this page and no matching key has been entered. - [6:6] - read-only - - - read_only - 0 - - - inaccessible - 1 - - - - - KEY_R - Index 1-6 of a hardware key which must be entered to grant read access, or 0 if no such key is required. - [5:3] - read-only - - - KEY_W - Index 1-6 of a hardware key which must be entered to grant write access, or 0 if no such key is required. - [2:0] - read-only - - - - - PAGE36_LOCK1 - Lock configuration MSBs for page 36 (rows 0x900 through 0x93f). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3F24 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - LOCK_BL - Dummy lock bits reserved for bootloaders (including the RP2350 USB bootloader) to store their own OTP access permissions. No hardware effect, and no corresponding SW_LOCKx registers. - [5:4] - read-only - - - read_write - Bootloader permits user reads and writes to this page - 0 - - - read_only - Bootloader permits user reads of this page - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE - 2 - - - inaccessible - Bootloader does not permit user access to this page - 3 - - - - - LOCK_NS - Lock state for Non-secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - - Note that READ_WRITE and READ_ONLY are equivalent in hardware, as the SBPI programming interface is not accessible to Non-secure software. However, Secure software may check these bits to apply write permissions to a Non-secure OTP programming API. - [3:2] - read-only - - - read_write - Page can be read by Non-secure software, and Secure software may permit Non-secure writes. - 0 - - - read_only - Page can be read by Non-secure software - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Non-secure software. - 3 - - - - - LOCK_S - Lock state for Secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - [1:0] - read-only - - - read_write - Page is fully accessible by Secure software. - 0 - - - read_only - Page can be read by Secure software, but can not be written. - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Secure software. - 3 - - - - - - - PAGE37_LOCK0 - Lock configuration LSBs for page 37 (rows 0x940 through 0x97f). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3F28 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - NO_KEY_STATE - State when at least one key is registered for this page and no matching key has been entered. - [6:6] - read-only - - - read_only - 0 - - - inaccessible - 1 - - - - - KEY_R - Index 1-6 of a hardware key which must be entered to grant read access, or 0 if no such key is required. - [5:3] - read-only - - - KEY_W - Index 1-6 of a hardware key which must be entered to grant write access, or 0 if no such key is required. - [2:0] - read-only - - - - - PAGE37_LOCK1 - Lock configuration MSBs for page 37 (rows 0x940 through 0x97f). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3F2C - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - LOCK_BL - Dummy lock bits reserved for bootloaders (including the RP2350 USB bootloader) to store their own OTP access permissions. No hardware effect, and no corresponding SW_LOCKx registers. - [5:4] - read-only - - - read_write - Bootloader permits user reads and writes to this page - 0 - - - read_only - Bootloader permits user reads of this page - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE - 2 - - - inaccessible - Bootloader does not permit user access to this page - 3 - - - - - LOCK_NS - Lock state for Non-secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - - Note that READ_WRITE and READ_ONLY are equivalent in hardware, as the SBPI programming interface is not accessible to Non-secure software. However, Secure software may check these bits to apply write permissions to a Non-secure OTP programming API. - [3:2] - read-only - - - read_write - Page can be read by Non-secure software, and Secure software may permit Non-secure writes. - 0 - - - read_only - Page can be read by Non-secure software - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Non-secure software. - 3 - - - - - LOCK_S - Lock state for Secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - [1:0] - read-only - - - read_write - Page is fully accessible by Secure software. - 0 - - - read_only - Page can be read by Secure software, but can not be written. - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Secure software. - 3 - - - - - - - PAGE38_LOCK0 - Lock configuration LSBs for page 38 (rows 0x980 through 0x9bf). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3F30 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - NO_KEY_STATE - State when at least one key is registered for this page and no matching key has been entered. - [6:6] - read-only - - - read_only - 0 - - - inaccessible - 1 - - - - - KEY_R - Index 1-6 of a hardware key which must be entered to grant read access, or 0 if no such key is required. - [5:3] - read-only - - - KEY_W - Index 1-6 of a hardware key which must be entered to grant write access, or 0 if no such key is required. - [2:0] - read-only - - - - - PAGE38_LOCK1 - Lock configuration MSBs for page 38 (rows 0x980 through 0x9bf). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3F34 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - LOCK_BL - Dummy lock bits reserved for bootloaders (including the RP2350 USB bootloader) to store their own OTP access permissions. No hardware effect, and no corresponding SW_LOCKx registers. - [5:4] - read-only - - - read_write - Bootloader permits user reads and writes to this page - 0 - - - read_only - Bootloader permits user reads of this page - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE - 2 - - - inaccessible - Bootloader does not permit user access to this page - 3 - - - - - LOCK_NS - Lock state for Non-secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - - Note that READ_WRITE and READ_ONLY are equivalent in hardware, as the SBPI programming interface is not accessible to Non-secure software. However, Secure software may check these bits to apply write permissions to a Non-secure OTP programming API. - [3:2] - read-only - - - read_write - Page can be read by Non-secure software, and Secure software may permit Non-secure writes. - 0 - - - read_only - Page can be read by Non-secure software - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Non-secure software. - 3 - - - - - LOCK_S - Lock state for Secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - [1:0] - read-only - - - read_write - Page is fully accessible by Secure software. - 0 - - - read_only - Page can be read by Secure software, but can not be written. - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Secure software. - 3 - - - - - - - PAGE39_LOCK0 - Lock configuration LSBs for page 39 (rows 0x9c0 through 0x9ff). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3F38 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - NO_KEY_STATE - State when at least one key is registered for this page and no matching key has been entered. - [6:6] - read-only - - - read_only - 0 - - - inaccessible - 1 - - - - - KEY_R - Index 1-6 of a hardware key which must be entered to grant read access, or 0 if no such key is required. - [5:3] - read-only - - - KEY_W - Index 1-6 of a hardware key which must be entered to grant write access, or 0 if no such key is required. - [2:0] - read-only - - - - - PAGE39_LOCK1 - Lock configuration MSBs for page 39 (rows 0x9c0 through 0x9ff). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3F3C - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - LOCK_BL - Dummy lock bits reserved for bootloaders (including the RP2350 USB bootloader) to store their own OTP access permissions. No hardware effect, and no corresponding SW_LOCKx registers. - [5:4] - read-only - - - read_write - Bootloader permits user reads and writes to this page - 0 - - - read_only - Bootloader permits user reads of this page - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE - 2 - - - inaccessible - Bootloader does not permit user access to this page - 3 - - - - - LOCK_NS - Lock state for Non-secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - - Note that READ_WRITE and READ_ONLY are equivalent in hardware, as the SBPI programming interface is not accessible to Non-secure software. However, Secure software may check these bits to apply write permissions to a Non-secure OTP programming API. - [3:2] - read-only - - - read_write - Page can be read by Non-secure software, and Secure software may permit Non-secure writes. - 0 - - - read_only - Page can be read by Non-secure software - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Non-secure software. - 3 - - - - - LOCK_S - Lock state for Secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - [1:0] - read-only - - - read_write - Page is fully accessible by Secure software. - 0 - - - read_only - Page can be read by Secure software, but can not be written. - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Secure software. - 3 - - - - - - - PAGE40_LOCK0 - Lock configuration LSBs for page 40 (rows 0xa00 through 0xa3f). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3F40 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - NO_KEY_STATE - State when at least one key is registered for this page and no matching key has been entered. - [6:6] - read-only - - - read_only - 0 - - - inaccessible - 1 - - - - - KEY_R - Index 1-6 of a hardware key which must be entered to grant read access, or 0 if no such key is required. - [5:3] - read-only - - - KEY_W - Index 1-6 of a hardware key which must be entered to grant write access, or 0 if no such key is required. - [2:0] - read-only - - - - - PAGE40_LOCK1 - Lock configuration MSBs for page 40 (rows 0xa00 through 0xa3f). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3F44 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - LOCK_BL - Dummy lock bits reserved for bootloaders (including the RP2350 USB bootloader) to store their own OTP access permissions. No hardware effect, and no corresponding SW_LOCKx registers. - [5:4] - read-only - - - read_write - Bootloader permits user reads and writes to this page - 0 - - - read_only - Bootloader permits user reads of this page - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE - 2 - - - inaccessible - Bootloader does not permit user access to this page - 3 - - - - - LOCK_NS - Lock state for Non-secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - - Note that READ_WRITE and READ_ONLY are equivalent in hardware, as the SBPI programming interface is not accessible to Non-secure software. However, Secure software may check these bits to apply write permissions to a Non-secure OTP programming API. - [3:2] - read-only - - - read_write - Page can be read by Non-secure software, and Secure software may permit Non-secure writes. - 0 - - - read_only - Page can be read by Non-secure software - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Non-secure software. - 3 - - - - - LOCK_S - Lock state for Secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - [1:0] - read-only - - - read_write - Page is fully accessible by Secure software. - 0 - - - read_only - Page can be read by Secure software, but can not be written. - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Secure software. - 3 - - - - - - - PAGE41_LOCK0 - Lock configuration LSBs for page 41 (rows 0xa40 through 0xa7f). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3F48 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - NO_KEY_STATE - State when at least one key is registered for this page and no matching key has been entered. - [6:6] - read-only - - - read_only - 0 - - - inaccessible - 1 - - - - - KEY_R - Index 1-6 of a hardware key which must be entered to grant read access, or 0 if no such key is required. - [5:3] - read-only - - - KEY_W - Index 1-6 of a hardware key which must be entered to grant write access, or 0 if no such key is required. - [2:0] - read-only - - - - - PAGE41_LOCK1 - Lock configuration MSBs for page 41 (rows 0xa40 through 0xa7f). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3F4C - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - LOCK_BL - Dummy lock bits reserved for bootloaders (including the RP2350 USB bootloader) to store their own OTP access permissions. No hardware effect, and no corresponding SW_LOCKx registers. - [5:4] - read-only - - - read_write - Bootloader permits user reads and writes to this page - 0 - - - read_only - Bootloader permits user reads of this page - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE - 2 - - - inaccessible - Bootloader does not permit user access to this page - 3 - - - - - LOCK_NS - Lock state for Non-secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - - Note that READ_WRITE and READ_ONLY are equivalent in hardware, as the SBPI programming interface is not accessible to Non-secure software. However, Secure software may check these bits to apply write permissions to a Non-secure OTP programming API. - [3:2] - read-only - - - read_write - Page can be read by Non-secure software, and Secure software may permit Non-secure writes. - 0 - - - read_only - Page can be read by Non-secure software - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Non-secure software. - 3 - - - - - LOCK_S - Lock state for Secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - [1:0] - read-only - - - read_write - Page is fully accessible by Secure software. - 0 - - - read_only - Page can be read by Secure software, but can not be written. - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Secure software. - 3 - - - - - - - PAGE42_LOCK0 - Lock configuration LSBs for page 42 (rows 0xa80 through 0xabf). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3F50 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - NO_KEY_STATE - State when at least one key is registered for this page and no matching key has been entered. - [6:6] - read-only - - - read_only - 0 - - - inaccessible - 1 - - - - - KEY_R - Index 1-6 of a hardware key which must be entered to grant read access, or 0 if no such key is required. - [5:3] - read-only - - - KEY_W - Index 1-6 of a hardware key which must be entered to grant write access, or 0 if no such key is required. - [2:0] - read-only - - - - - PAGE42_LOCK1 - Lock configuration MSBs for page 42 (rows 0xa80 through 0xabf). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3F54 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - LOCK_BL - Dummy lock bits reserved for bootloaders (including the RP2350 USB bootloader) to store their own OTP access permissions. No hardware effect, and no corresponding SW_LOCKx registers. - [5:4] - read-only - - - read_write - Bootloader permits user reads and writes to this page - 0 - - - read_only - Bootloader permits user reads of this page - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE - 2 - - - inaccessible - Bootloader does not permit user access to this page - 3 - - - - - LOCK_NS - Lock state for Non-secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - - Note that READ_WRITE and READ_ONLY are equivalent in hardware, as the SBPI programming interface is not accessible to Non-secure software. However, Secure software may check these bits to apply write permissions to a Non-secure OTP programming API. - [3:2] - read-only - - - read_write - Page can be read by Non-secure software, and Secure software may permit Non-secure writes. - 0 - - - read_only - Page can be read by Non-secure software - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Non-secure software. - 3 - - - - - LOCK_S - Lock state for Secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - [1:0] - read-only - - - read_write - Page is fully accessible by Secure software. - 0 - - - read_only - Page can be read by Secure software, but can not be written. - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Secure software. - 3 - - - - - - - PAGE43_LOCK0 - Lock configuration LSBs for page 43 (rows 0xac0 through 0xaff). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3F58 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - NO_KEY_STATE - State when at least one key is registered for this page and no matching key has been entered. - [6:6] - read-only - - - read_only - 0 - - - inaccessible - 1 - - - - - KEY_R - Index 1-6 of a hardware key which must be entered to grant read access, or 0 if no such key is required. - [5:3] - read-only - - - KEY_W - Index 1-6 of a hardware key which must be entered to grant write access, or 0 if no such key is required. - [2:0] - read-only - - - - - PAGE43_LOCK1 - Lock configuration MSBs for page 43 (rows 0xac0 through 0xaff). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3F5C - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - LOCK_BL - Dummy lock bits reserved for bootloaders (including the RP2350 USB bootloader) to store their own OTP access permissions. No hardware effect, and no corresponding SW_LOCKx registers. - [5:4] - read-only - - - read_write - Bootloader permits user reads and writes to this page - 0 - - - read_only - Bootloader permits user reads of this page - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE - 2 - - - inaccessible - Bootloader does not permit user access to this page - 3 - - - - - LOCK_NS - Lock state for Non-secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - - Note that READ_WRITE and READ_ONLY are equivalent in hardware, as the SBPI programming interface is not accessible to Non-secure software. However, Secure software may check these bits to apply write permissions to a Non-secure OTP programming API. - [3:2] - read-only - - - read_write - Page can be read by Non-secure software, and Secure software may permit Non-secure writes. - 0 - - - read_only - Page can be read by Non-secure software - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Non-secure software. - 3 - - - - - LOCK_S - Lock state for Secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - [1:0] - read-only - - - read_write - Page is fully accessible by Secure software. - 0 - - - read_only - Page can be read by Secure software, but can not be written. - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Secure software. - 3 - - - - - - - PAGE44_LOCK0 - Lock configuration LSBs for page 44 (rows 0xb00 through 0xb3f). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3F60 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - NO_KEY_STATE - State when at least one key is registered for this page and no matching key has been entered. - [6:6] - read-only - - - read_only - 0 - - - inaccessible - 1 - - - - - KEY_R - Index 1-6 of a hardware key which must be entered to grant read access, or 0 if no such key is required. - [5:3] - read-only - - - KEY_W - Index 1-6 of a hardware key which must be entered to grant write access, or 0 if no such key is required. - [2:0] - read-only - - - - - PAGE44_LOCK1 - Lock configuration MSBs for page 44 (rows 0xb00 through 0xb3f). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3F64 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - LOCK_BL - Dummy lock bits reserved for bootloaders (including the RP2350 USB bootloader) to store their own OTP access permissions. No hardware effect, and no corresponding SW_LOCKx registers. - [5:4] - read-only - - - read_write - Bootloader permits user reads and writes to this page - 0 - - - read_only - Bootloader permits user reads of this page - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE - 2 - - - inaccessible - Bootloader does not permit user access to this page - 3 - - - - - LOCK_NS - Lock state for Non-secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - - Note that READ_WRITE and READ_ONLY are equivalent in hardware, as the SBPI programming interface is not accessible to Non-secure software. However, Secure software may check these bits to apply write permissions to a Non-secure OTP programming API. - [3:2] - read-only - - - read_write - Page can be read by Non-secure software, and Secure software may permit Non-secure writes. - 0 - - - read_only - Page can be read by Non-secure software - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Non-secure software. - 3 - - - - - LOCK_S - Lock state for Secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - [1:0] - read-only - - - read_write - Page is fully accessible by Secure software. - 0 - - - read_only - Page can be read by Secure software, but can not be written. - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Secure software. - 3 - - - - - - - PAGE45_LOCK0 - Lock configuration LSBs for page 45 (rows 0xb40 through 0xb7f). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3F68 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - NO_KEY_STATE - State when at least one key is registered for this page and no matching key has been entered. - [6:6] - read-only - - - read_only - 0 - - - inaccessible - 1 - - - - - KEY_R - Index 1-6 of a hardware key which must be entered to grant read access, or 0 if no such key is required. - [5:3] - read-only - - - KEY_W - Index 1-6 of a hardware key which must be entered to grant write access, or 0 if no such key is required. - [2:0] - read-only - - - - - PAGE45_LOCK1 - Lock configuration MSBs for page 45 (rows 0xb40 through 0xb7f). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3F6C - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - LOCK_BL - Dummy lock bits reserved for bootloaders (including the RP2350 USB bootloader) to store their own OTP access permissions. No hardware effect, and no corresponding SW_LOCKx registers. - [5:4] - read-only - - - read_write - Bootloader permits user reads and writes to this page - 0 - - - read_only - Bootloader permits user reads of this page - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE - 2 - - - inaccessible - Bootloader does not permit user access to this page - 3 - - - - - LOCK_NS - Lock state for Non-secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - - Note that READ_WRITE and READ_ONLY are equivalent in hardware, as the SBPI programming interface is not accessible to Non-secure software. However, Secure software may check these bits to apply write permissions to a Non-secure OTP programming API. - [3:2] - read-only - - - read_write - Page can be read by Non-secure software, and Secure software may permit Non-secure writes. - 0 - - - read_only - Page can be read by Non-secure software - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Non-secure software. - 3 - - - - - LOCK_S - Lock state for Secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - [1:0] - read-only - - - read_write - Page is fully accessible by Secure software. - 0 - - - read_only - Page can be read by Secure software, but can not be written. - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Secure software. - 3 - - - - - - - PAGE46_LOCK0 - Lock configuration LSBs for page 46 (rows 0xb80 through 0xbbf). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3F70 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - NO_KEY_STATE - State when at least one key is registered for this page and no matching key has been entered. - [6:6] - read-only - - - read_only - 0 - - - inaccessible - 1 - - - - - KEY_R - Index 1-6 of a hardware key which must be entered to grant read access, or 0 if no such key is required. - [5:3] - read-only - - - KEY_W - Index 1-6 of a hardware key which must be entered to grant write access, or 0 if no such key is required. - [2:0] - read-only - - - - - PAGE46_LOCK1 - Lock configuration MSBs for page 46 (rows 0xb80 through 0xbbf). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3F74 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - LOCK_BL - Dummy lock bits reserved for bootloaders (including the RP2350 USB bootloader) to store their own OTP access permissions. No hardware effect, and no corresponding SW_LOCKx registers. - [5:4] - read-only - - - read_write - Bootloader permits user reads and writes to this page - 0 - - - read_only - Bootloader permits user reads of this page - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE - 2 - - - inaccessible - Bootloader does not permit user access to this page - 3 - - - - - LOCK_NS - Lock state for Non-secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - - Note that READ_WRITE and READ_ONLY are equivalent in hardware, as the SBPI programming interface is not accessible to Non-secure software. However, Secure software may check these bits to apply write permissions to a Non-secure OTP programming API. - [3:2] - read-only - - - read_write - Page can be read by Non-secure software, and Secure software may permit Non-secure writes. - 0 - - - read_only - Page can be read by Non-secure software - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Non-secure software. - 3 - - - - - LOCK_S - Lock state for Secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - [1:0] - read-only - - - read_write - Page is fully accessible by Secure software. - 0 - - - read_only - Page can be read by Secure software, but can not be written. - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Secure software. - 3 - - - - - - - PAGE47_LOCK0 - Lock configuration LSBs for page 47 (rows 0xbc0 through 0xbff). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3F78 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - NO_KEY_STATE - State when at least one key is registered for this page and no matching key has been entered. - [6:6] - read-only - - - read_only - 0 - - - inaccessible - 1 - - - - - KEY_R - Index 1-6 of a hardware key which must be entered to grant read access, or 0 if no such key is required. - [5:3] - read-only - - - KEY_W - Index 1-6 of a hardware key which must be entered to grant write access, or 0 if no such key is required. - [2:0] - read-only - - - - - PAGE47_LOCK1 - Lock configuration MSBs for page 47 (rows 0xbc0 through 0xbff). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3F7C - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - LOCK_BL - Dummy lock bits reserved for bootloaders (including the RP2350 USB bootloader) to store their own OTP access permissions. No hardware effect, and no corresponding SW_LOCKx registers. - [5:4] - read-only - - - read_write - Bootloader permits user reads and writes to this page - 0 - - - read_only - Bootloader permits user reads of this page - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE - 2 - - - inaccessible - Bootloader does not permit user access to this page - 3 - - - - - LOCK_NS - Lock state for Non-secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - - Note that READ_WRITE and READ_ONLY are equivalent in hardware, as the SBPI programming interface is not accessible to Non-secure software. However, Secure software may check these bits to apply write permissions to a Non-secure OTP programming API. - [3:2] - read-only - - - read_write - Page can be read by Non-secure software, and Secure software may permit Non-secure writes. - 0 - - - read_only - Page can be read by Non-secure software - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Non-secure software. - 3 - - - - - LOCK_S - Lock state for Secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - [1:0] - read-only - - - read_write - Page is fully accessible by Secure software. - 0 - - - read_only - Page can be read by Secure software, but can not be written. - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Secure software. - 3 - - - - - - - PAGE48_LOCK0 - Lock configuration LSBs for page 48 (rows 0xc00 through 0xc3f). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3F80 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - NO_KEY_STATE - State when at least one key is registered for this page and no matching key has been entered. - [6:6] - read-only - - - read_only - 0 - - - inaccessible - 1 - - - - - KEY_R - Index 1-6 of a hardware key which must be entered to grant read access, or 0 if no such key is required. - [5:3] - read-only - - - KEY_W - Index 1-6 of a hardware key which must be entered to grant write access, or 0 if no such key is required. - [2:0] - read-only - - - - - PAGE48_LOCK1 - Lock configuration MSBs for page 48 (rows 0xc00 through 0xc3f). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3F84 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - LOCK_BL - Dummy lock bits reserved for bootloaders (including the RP2350 USB bootloader) to store their own OTP access permissions. No hardware effect, and no corresponding SW_LOCKx registers. - [5:4] - read-only - - - read_write - Bootloader permits user reads and writes to this page - 0 - - - read_only - Bootloader permits user reads of this page - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE - 2 - - - inaccessible - Bootloader does not permit user access to this page - 3 - - - - - LOCK_NS - Lock state for Non-secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - - Note that READ_WRITE and READ_ONLY are equivalent in hardware, as the SBPI programming interface is not accessible to Non-secure software. However, Secure software may check these bits to apply write permissions to a Non-secure OTP programming API. - [3:2] - read-only - - - read_write - Page can be read by Non-secure software, and Secure software may permit Non-secure writes. - 0 - - - read_only - Page can be read by Non-secure software - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Non-secure software. - 3 - - - - - LOCK_S - Lock state for Secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - [1:0] - read-only - - - read_write - Page is fully accessible by Secure software. - 0 - - - read_only - Page can be read by Secure software, but can not be written. - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Secure software. - 3 - - - - - - - PAGE49_LOCK0 - Lock configuration LSBs for page 49 (rows 0xc40 through 0xc7f). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3F88 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - NO_KEY_STATE - State when at least one key is registered for this page and no matching key has been entered. - [6:6] - read-only - - - read_only - 0 - - - inaccessible - 1 - - - - - KEY_R - Index 1-6 of a hardware key which must be entered to grant read access, or 0 if no such key is required. - [5:3] - read-only - - - KEY_W - Index 1-6 of a hardware key which must be entered to grant write access, or 0 if no such key is required. - [2:0] - read-only - - - - - PAGE49_LOCK1 - Lock configuration MSBs for page 49 (rows 0xc40 through 0xc7f). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3F8C - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - LOCK_BL - Dummy lock bits reserved for bootloaders (including the RP2350 USB bootloader) to store their own OTP access permissions. No hardware effect, and no corresponding SW_LOCKx registers. - [5:4] - read-only - - - read_write - Bootloader permits user reads and writes to this page - 0 - - - read_only - Bootloader permits user reads of this page - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE - 2 - - - inaccessible - Bootloader does not permit user access to this page - 3 - - - - - LOCK_NS - Lock state for Non-secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - - Note that READ_WRITE and READ_ONLY are equivalent in hardware, as the SBPI programming interface is not accessible to Non-secure software. However, Secure software may check these bits to apply write permissions to a Non-secure OTP programming API. - [3:2] - read-only - - - read_write - Page can be read by Non-secure software, and Secure software may permit Non-secure writes. - 0 - - - read_only - Page can be read by Non-secure software - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Non-secure software. - 3 - - - - - LOCK_S - Lock state for Secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - [1:0] - read-only - - - read_write - Page is fully accessible by Secure software. - 0 - - - read_only - Page can be read by Secure software, but can not be written. - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Secure software. - 3 - - - - - - - PAGE50_LOCK0 - Lock configuration LSBs for page 50 (rows 0xc80 through 0xcbf). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3F90 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - NO_KEY_STATE - State when at least one key is registered for this page and no matching key has been entered. - [6:6] - read-only - - - read_only - 0 - - - inaccessible - 1 - - - - - KEY_R - Index 1-6 of a hardware key which must be entered to grant read access, or 0 if no such key is required. - [5:3] - read-only - - - KEY_W - Index 1-6 of a hardware key which must be entered to grant write access, or 0 if no such key is required. - [2:0] - read-only - - - - - PAGE50_LOCK1 - Lock configuration MSBs for page 50 (rows 0xc80 through 0xcbf). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3F94 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - LOCK_BL - Dummy lock bits reserved for bootloaders (including the RP2350 USB bootloader) to store their own OTP access permissions. No hardware effect, and no corresponding SW_LOCKx registers. - [5:4] - read-only - - - read_write - Bootloader permits user reads and writes to this page - 0 - - - read_only - Bootloader permits user reads of this page - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE - 2 - - - inaccessible - Bootloader does not permit user access to this page - 3 - - - - - LOCK_NS - Lock state for Non-secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - - Note that READ_WRITE and READ_ONLY are equivalent in hardware, as the SBPI programming interface is not accessible to Non-secure software. However, Secure software may check these bits to apply write permissions to a Non-secure OTP programming API. - [3:2] - read-only - - - read_write - Page can be read by Non-secure software, and Secure software may permit Non-secure writes. - 0 - - - read_only - Page can be read by Non-secure software - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Non-secure software. - 3 - - - - - LOCK_S - Lock state for Secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - [1:0] - read-only - - - read_write - Page is fully accessible by Secure software. - 0 - - - read_only - Page can be read by Secure software, but can not be written. - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Secure software. - 3 - - - - - - - PAGE51_LOCK0 - Lock configuration LSBs for page 51 (rows 0xcc0 through 0xcff). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3F98 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - NO_KEY_STATE - State when at least one key is registered for this page and no matching key has been entered. - [6:6] - read-only - - - read_only - 0 - - - inaccessible - 1 - - - - - KEY_R - Index 1-6 of a hardware key which must be entered to grant read access, or 0 if no such key is required. - [5:3] - read-only - - - KEY_W - Index 1-6 of a hardware key which must be entered to grant write access, or 0 if no such key is required. - [2:0] - read-only - - - - - PAGE51_LOCK1 - Lock configuration MSBs for page 51 (rows 0xcc0 through 0xcff). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3F9C - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - LOCK_BL - Dummy lock bits reserved for bootloaders (including the RP2350 USB bootloader) to store their own OTP access permissions. No hardware effect, and no corresponding SW_LOCKx registers. - [5:4] - read-only - - - read_write - Bootloader permits user reads and writes to this page - 0 - - - read_only - Bootloader permits user reads of this page - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE - 2 - - - inaccessible - Bootloader does not permit user access to this page - 3 - - - - - LOCK_NS - Lock state for Non-secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - - Note that READ_WRITE and READ_ONLY are equivalent in hardware, as the SBPI programming interface is not accessible to Non-secure software. However, Secure software may check these bits to apply write permissions to a Non-secure OTP programming API. - [3:2] - read-only - - - read_write - Page can be read by Non-secure software, and Secure software may permit Non-secure writes. - 0 - - - read_only - Page can be read by Non-secure software - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Non-secure software. - 3 - - - - - LOCK_S - Lock state for Secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - [1:0] - read-only - - - read_write - Page is fully accessible by Secure software. - 0 - - - read_only - Page can be read by Secure software, but can not be written. - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Secure software. - 3 - - - - - - - PAGE52_LOCK0 - Lock configuration LSBs for page 52 (rows 0xd00 through 0xd3f). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3FA0 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - NO_KEY_STATE - State when at least one key is registered for this page and no matching key has been entered. - [6:6] - read-only - - - read_only - 0 - - - inaccessible - 1 - - - - - KEY_R - Index 1-6 of a hardware key which must be entered to grant read access, or 0 if no such key is required. - [5:3] - read-only - - - KEY_W - Index 1-6 of a hardware key which must be entered to grant write access, or 0 if no such key is required. - [2:0] - read-only - - - - - PAGE52_LOCK1 - Lock configuration MSBs for page 52 (rows 0xd00 through 0xd3f). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3FA4 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - LOCK_BL - Dummy lock bits reserved for bootloaders (including the RP2350 USB bootloader) to store their own OTP access permissions. No hardware effect, and no corresponding SW_LOCKx registers. - [5:4] - read-only - - - read_write - Bootloader permits user reads and writes to this page - 0 - - - read_only - Bootloader permits user reads of this page - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE - 2 - - - inaccessible - Bootloader does not permit user access to this page - 3 - - - - - LOCK_NS - Lock state for Non-secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - - Note that READ_WRITE and READ_ONLY are equivalent in hardware, as the SBPI programming interface is not accessible to Non-secure software. However, Secure software may check these bits to apply write permissions to a Non-secure OTP programming API. - [3:2] - read-only - - - read_write - Page can be read by Non-secure software, and Secure software may permit Non-secure writes. - 0 - - - read_only - Page can be read by Non-secure software - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Non-secure software. - 3 - - - - - LOCK_S - Lock state for Secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - [1:0] - read-only - - - read_write - Page is fully accessible by Secure software. - 0 - - - read_only - Page can be read by Secure software, but can not be written. - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Secure software. - 3 - - - - - - - PAGE53_LOCK0 - Lock configuration LSBs for page 53 (rows 0xd40 through 0xd7f). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3FA8 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - NO_KEY_STATE - State when at least one key is registered for this page and no matching key has been entered. - [6:6] - read-only - - - read_only - 0 - - - inaccessible - 1 - - - - - KEY_R - Index 1-6 of a hardware key which must be entered to grant read access, or 0 if no such key is required. - [5:3] - read-only - - - KEY_W - Index 1-6 of a hardware key which must be entered to grant write access, or 0 if no such key is required. - [2:0] - read-only - - - - - PAGE53_LOCK1 - Lock configuration MSBs for page 53 (rows 0xd40 through 0xd7f). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3FAC - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - LOCK_BL - Dummy lock bits reserved for bootloaders (including the RP2350 USB bootloader) to store their own OTP access permissions. No hardware effect, and no corresponding SW_LOCKx registers. - [5:4] - read-only - - - read_write - Bootloader permits user reads and writes to this page - 0 - - - read_only - Bootloader permits user reads of this page - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE - 2 - - - inaccessible - Bootloader does not permit user access to this page - 3 - - - - - LOCK_NS - Lock state for Non-secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - - Note that READ_WRITE and READ_ONLY are equivalent in hardware, as the SBPI programming interface is not accessible to Non-secure software. However, Secure software may check these bits to apply write permissions to a Non-secure OTP programming API. - [3:2] - read-only - - - read_write - Page can be read by Non-secure software, and Secure software may permit Non-secure writes. - 0 - - - read_only - Page can be read by Non-secure software - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Non-secure software. - 3 - - - - - LOCK_S - Lock state for Secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - [1:0] - read-only - - - read_write - Page is fully accessible by Secure software. - 0 - - - read_only - Page can be read by Secure software, but can not be written. - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Secure software. - 3 - - - - - - - PAGE54_LOCK0 - Lock configuration LSBs for page 54 (rows 0xd80 through 0xdbf). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3FB0 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - NO_KEY_STATE - State when at least one key is registered for this page and no matching key has been entered. - [6:6] - read-only - - - read_only - 0 - - - inaccessible - 1 - - - - - KEY_R - Index 1-6 of a hardware key which must be entered to grant read access, or 0 if no such key is required. - [5:3] - read-only - - - KEY_W - Index 1-6 of a hardware key which must be entered to grant write access, or 0 if no such key is required. - [2:0] - read-only - - - - - PAGE54_LOCK1 - Lock configuration MSBs for page 54 (rows 0xd80 through 0xdbf). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3FB4 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - LOCK_BL - Dummy lock bits reserved for bootloaders (including the RP2350 USB bootloader) to store their own OTP access permissions. No hardware effect, and no corresponding SW_LOCKx registers. - [5:4] - read-only - - - read_write - Bootloader permits user reads and writes to this page - 0 - - - read_only - Bootloader permits user reads of this page - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE - 2 - - - inaccessible - Bootloader does not permit user access to this page - 3 - - - - - LOCK_NS - Lock state for Non-secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - - Note that READ_WRITE and READ_ONLY are equivalent in hardware, as the SBPI programming interface is not accessible to Non-secure software. However, Secure software may check these bits to apply write permissions to a Non-secure OTP programming API. - [3:2] - read-only - - - read_write - Page can be read by Non-secure software, and Secure software may permit Non-secure writes. - 0 - - - read_only - Page can be read by Non-secure software - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Non-secure software. - 3 - - - - - LOCK_S - Lock state for Secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - [1:0] - read-only - - - read_write - Page is fully accessible by Secure software. - 0 - - - read_only - Page can be read by Secure software, but can not be written. - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Secure software. - 3 - - - - - - - PAGE55_LOCK0 - Lock configuration LSBs for page 55 (rows 0xdc0 through 0xdff). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3FB8 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - NO_KEY_STATE - State when at least one key is registered for this page and no matching key has been entered. - [6:6] - read-only - - - read_only - 0 - - - inaccessible - 1 - - - - - KEY_R - Index 1-6 of a hardware key which must be entered to grant read access, or 0 if no such key is required. - [5:3] - read-only - - - KEY_W - Index 1-6 of a hardware key which must be entered to grant write access, or 0 if no such key is required. - [2:0] - read-only - - - - - PAGE55_LOCK1 - Lock configuration MSBs for page 55 (rows 0xdc0 through 0xdff). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3FBC - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - LOCK_BL - Dummy lock bits reserved for bootloaders (including the RP2350 USB bootloader) to store their own OTP access permissions. No hardware effect, and no corresponding SW_LOCKx registers. - [5:4] - read-only - - - read_write - Bootloader permits user reads and writes to this page - 0 - - - read_only - Bootloader permits user reads of this page - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE - 2 - - - inaccessible - Bootloader does not permit user access to this page - 3 - - - - - LOCK_NS - Lock state for Non-secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - - Note that READ_WRITE and READ_ONLY are equivalent in hardware, as the SBPI programming interface is not accessible to Non-secure software. However, Secure software may check these bits to apply write permissions to a Non-secure OTP programming API. - [3:2] - read-only - - - read_write - Page can be read by Non-secure software, and Secure software may permit Non-secure writes. - 0 - - - read_only - Page can be read by Non-secure software - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Non-secure software. - 3 - - - - - LOCK_S - Lock state for Secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - [1:0] - read-only - - - read_write - Page is fully accessible by Secure software. - 0 - - - read_only - Page can be read by Secure software, but can not be written. - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Secure software. - 3 - - - - - - - PAGE56_LOCK0 - Lock configuration LSBs for page 56 (rows 0xe00 through 0xe3f). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3FC0 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - NO_KEY_STATE - State when at least one key is registered for this page and no matching key has been entered. - [6:6] - read-only - - - read_only - 0 - - - inaccessible - 1 - - - - - KEY_R - Index 1-6 of a hardware key which must be entered to grant read access, or 0 if no such key is required. - [5:3] - read-only - - - KEY_W - Index 1-6 of a hardware key which must be entered to grant write access, or 0 if no such key is required. - [2:0] - read-only - - - - - PAGE56_LOCK1 - Lock configuration MSBs for page 56 (rows 0xe00 through 0xe3f). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3FC4 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - LOCK_BL - Dummy lock bits reserved for bootloaders (including the RP2350 USB bootloader) to store their own OTP access permissions. No hardware effect, and no corresponding SW_LOCKx registers. - [5:4] - read-only - - - read_write - Bootloader permits user reads and writes to this page - 0 - - - read_only - Bootloader permits user reads of this page - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE - 2 - - - inaccessible - Bootloader does not permit user access to this page - 3 - - - - - LOCK_NS - Lock state for Non-secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - - Note that READ_WRITE and READ_ONLY are equivalent in hardware, as the SBPI programming interface is not accessible to Non-secure software. However, Secure software may check these bits to apply write permissions to a Non-secure OTP programming API. - [3:2] - read-only - - - read_write - Page can be read by Non-secure software, and Secure software may permit Non-secure writes. - 0 - - - read_only - Page can be read by Non-secure software - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Non-secure software. - 3 - - - - - LOCK_S - Lock state for Secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - [1:0] - read-only - - - read_write - Page is fully accessible by Secure software. - 0 - - - read_only - Page can be read by Secure software, but can not be written. - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Secure software. - 3 - - - - - - - PAGE57_LOCK0 - Lock configuration LSBs for page 57 (rows 0xe40 through 0xe7f). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3FC8 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - NO_KEY_STATE - State when at least one key is registered for this page and no matching key has been entered. - [6:6] - read-only - - - read_only - 0 - - - inaccessible - 1 - - - - - KEY_R - Index 1-6 of a hardware key which must be entered to grant read access, or 0 if no such key is required. - [5:3] - read-only - - - KEY_W - Index 1-6 of a hardware key which must be entered to grant write access, or 0 if no such key is required. - [2:0] - read-only - - - - - PAGE57_LOCK1 - Lock configuration MSBs for page 57 (rows 0xe40 through 0xe7f). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3FCC - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - LOCK_BL - Dummy lock bits reserved for bootloaders (including the RP2350 USB bootloader) to store their own OTP access permissions. No hardware effect, and no corresponding SW_LOCKx registers. - [5:4] - read-only - - - read_write - Bootloader permits user reads and writes to this page - 0 - - - read_only - Bootloader permits user reads of this page - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE - 2 - - - inaccessible - Bootloader does not permit user access to this page - 3 - - - - - LOCK_NS - Lock state for Non-secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - - Note that READ_WRITE and READ_ONLY are equivalent in hardware, as the SBPI programming interface is not accessible to Non-secure software. However, Secure software may check these bits to apply write permissions to a Non-secure OTP programming API. - [3:2] - read-only - - - read_write - Page can be read by Non-secure software, and Secure software may permit Non-secure writes. - 0 - - - read_only - Page can be read by Non-secure software - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Non-secure software. - 3 - - - - - LOCK_S - Lock state for Secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - [1:0] - read-only - - - read_write - Page is fully accessible by Secure software. - 0 - - - read_only - Page can be read by Secure software, but can not be written. - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Secure software. - 3 - - - - - - - PAGE58_LOCK0 - Lock configuration LSBs for page 58 (rows 0xe80 through 0xebf). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3FD0 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - NO_KEY_STATE - State when at least one key is registered for this page and no matching key has been entered. - [6:6] - read-only - - - read_only - 0 - - - inaccessible - 1 - - - - - KEY_R - Index 1-6 of a hardware key which must be entered to grant read access, or 0 if no such key is required. - [5:3] - read-only - - - KEY_W - Index 1-6 of a hardware key which must be entered to grant write access, or 0 if no such key is required. - [2:0] - read-only - - - - - PAGE58_LOCK1 - Lock configuration MSBs for page 58 (rows 0xe80 through 0xebf). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3FD4 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - LOCK_BL - Dummy lock bits reserved for bootloaders (including the RP2350 USB bootloader) to store their own OTP access permissions. No hardware effect, and no corresponding SW_LOCKx registers. - [5:4] - read-only - - - read_write - Bootloader permits user reads and writes to this page - 0 - - - read_only - Bootloader permits user reads of this page - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE - 2 - - - inaccessible - Bootloader does not permit user access to this page - 3 - - - - - LOCK_NS - Lock state for Non-secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - - Note that READ_WRITE and READ_ONLY are equivalent in hardware, as the SBPI programming interface is not accessible to Non-secure software. However, Secure software may check these bits to apply write permissions to a Non-secure OTP programming API. - [3:2] - read-only - - - read_write - Page can be read by Non-secure software, and Secure software may permit Non-secure writes. - 0 - - - read_only - Page can be read by Non-secure software - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Non-secure software. - 3 - - - - - LOCK_S - Lock state for Secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - [1:0] - read-only - - - read_write - Page is fully accessible by Secure software. - 0 - - - read_only - Page can be read by Secure software, but can not be written. - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Secure software. - 3 - - - - - - - PAGE59_LOCK0 - Lock configuration LSBs for page 59 (rows 0xec0 through 0xeff). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3FD8 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - NO_KEY_STATE - State when at least one key is registered for this page and no matching key has been entered. - [6:6] - read-only - - - read_only - 0 - - - inaccessible - 1 - - - - - KEY_R - Index 1-6 of a hardware key which must be entered to grant read access, or 0 if no such key is required. - [5:3] - read-only - - - KEY_W - Index 1-6 of a hardware key which must be entered to grant write access, or 0 if no such key is required. - [2:0] - read-only - - - - - PAGE59_LOCK1 - Lock configuration MSBs for page 59 (rows 0xec0 through 0xeff). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3FDC - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - LOCK_BL - Dummy lock bits reserved for bootloaders (including the RP2350 USB bootloader) to store their own OTP access permissions. No hardware effect, and no corresponding SW_LOCKx registers. - [5:4] - read-only - - - read_write - Bootloader permits user reads and writes to this page - 0 - - - read_only - Bootloader permits user reads of this page - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE - 2 - - - inaccessible - Bootloader does not permit user access to this page - 3 - - - - - LOCK_NS - Lock state for Non-secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - - Note that READ_WRITE and READ_ONLY are equivalent in hardware, as the SBPI programming interface is not accessible to Non-secure software. However, Secure software may check these bits to apply write permissions to a Non-secure OTP programming API. - [3:2] - read-only - - - read_write - Page can be read by Non-secure software, and Secure software may permit Non-secure writes. - 0 - - - read_only - Page can be read by Non-secure software - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Non-secure software. - 3 - - - - - LOCK_S - Lock state for Secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - [1:0] - read-only - - - read_write - Page is fully accessible by Secure software. - 0 - - - read_only - Page can be read by Secure software, but can not be written. - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Secure software. - 3 - - - - - - - PAGE60_LOCK0 - Lock configuration LSBs for page 60 (rows 0xf00 through 0xf3f). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3FE0 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - NO_KEY_STATE - State when at least one key is registered for this page and no matching key has been entered. - [6:6] - read-only - - - read_only - 0 - - - inaccessible - 1 - - - - - KEY_R - Index 1-6 of a hardware key which must be entered to grant read access, or 0 if no such key is required. - [5:3] - read-only - - - KEY_W - Index 1-6 of a hardware key which must be entered to grant write access, or 0 if no such key is required. - [2:0] - read-only - - - - - PAGE60_LOCK1 - Lock configuration MSBs for page 60 (rows 0xf00 through 0xf3f). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3FE4 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - LOCK_BL - Dummy lock bits reserved for bootloaders (including the RP2350 USB bootloader) to store their own OTP access permissions. No hardware effect, and no corresponding SW_LOCKx registers. - [5:4] - read-only - - - read_write - Bootloader permits user reads and writes to this page - 0 - - - read_only - Bootloader permits user reads of this page - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE - 2 - - - inaccessible - Bootloader does not permit user access to this page - 3 - - - - - LOCK_NS - Lock state for Non-secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - - Note that READ_WRITE and READ_ONLY are equivalent in hardware, as the SBPI programming interface is not accessible to Non-secure software. However, Secure software may check these bits to apply write permissions to a Non-secure OTP programming API. - [3:2] - read-only - - - read_write - Page can be read by Non-secure software, and Secure software may permit Non-secure writes. - 0 - - - read_only - Page can be read by Non-secure software - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Non-secure software. - 3 - - - - - LOCK_S - Lock state for Secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - [1:0] - read-only - - - read_write - Page is fully accessible by Secure software. - 0 - - - read_only - Page can be read by Secure software, but can not be written. - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Secure software. - 3 - - - - - - - PAGE61_LOCK0 - Lock configuration LSBs for page 61 (rows 0xf40 through 0xf7f). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3FE8 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - NO_KEY_STATE - State when at least one key is registered for this page and no matching key has been entered. - [6:6] - read-only - - - read_only - 0 - - - inaccessible - 1 - - - - - KEY_R - Index 1-6 of a hardware key which must be entered to grant read access, or 0 if no such key is required. - [5:3] - read-only - - - KEY_W - Index 1-6 of a hardware key which must be entered to grant write access, or 0 if no such key is required. - [2:0] - read-only - - - - - PAGE61_LOCK1 - Lock configuration MSBs for page 61 (rows 0xf40 through 0xf7f). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3FEC - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - LOCK_BL - Dummy lock bits reserved for bootloaders (including the RP2350 USB bootloader) to store their own OTP access permissions. No hardware effect, and no corresponding SW_LOCKx registers. - [5:4] - read-only - - - read_write - Bootloader permits user reads and writes to this page - 0 - - - read_only - Bootloader permits user reads of this page - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE - 2 - - - inaccessible - Bootloader does not permit user access to this page - 3 - - - - - LOCK_NS - Lock state for Non-secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - - Note that READ_WRITE and READ_ONLY are equivalent in hardware, as the SBPI programming interface is not accessible to Non-secure software. However, Secure software may check these bits to apply write permissions to a Non-secure OTP programming API. - [3:2] - read-only - - - read_write - Page can be read by Non-secure software, and Secure software may permit Non-secure writes. - 0 - - - read_only - Page can be read by Non-secure software - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Non-secure software. - 3 - - - - - LOCK_S - Lock state for Secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - [1:0] - read-only - - - read_write - Page is fully accessible by Secure software. - 0 - - - read_only - Page can be read by Secure software, but can not be written. - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Secure software. - 3 - - - - - - - PAGE62_LOCK0 - Lock configuration LSBs for page 62 (rows 0xf80 through 0xfbf). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3FF0 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - NO_KEY_STATE - State when at least one key is registered for this page and no matching key has been entered. - [6:6] - read-only - - - read_only - 0 - - - inaccessible - 1 - - - - - KEY_R - Index 1-6 of a hardware key which must be entered to grant read access, or 0 if no such key is required. - [5:3] - read-only - - - KEY_W - Index 1-6 of a hardware key which must be entered to grant write access, or 0 if no such key is required. - [2:0] - read-only - - - - - PAGE62_LOCK1 - Lock configuration MSBs for page 62 (rows 0xf80 through 0xfbf). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3FF4 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - LOCK_BL - Dummy lock bits reserved for bootloaders (including the RP2350 USB bootloader) to store their own OTP access permissions. No hardware effect, and no corresponding SW_LOCKx registers. - [5:4] - read-only - - - read_write - Bootloader permits user reads and writes to this page - 0 - - - read_only - Bootloader permits user reads of this page - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE - 2 - - - inaccessible - Bootloader does not permit user access to this page - 3 - - - - - LOCK_NS - Lock state for Non-secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - - Note that READ_WRITE and READ_ONLY are equivalent in hardware, as the SBPI programming interface is not accessible to Non-secure software. However, Secure software may check these bits to apply write permissions to a Non-secure OTP programming API. - [3:2] - read-only - - - read_write - Page can be read by Non-secure software, and Secure software may permit Non-secure writes. - 0 - - - read_only - Page can be read by Non-secure software - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Non-secure software. - 3 - - - - - LOCK_S - Lock state for Secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - [1:0] - read-only - - - read_write - Page is fully accessible by Secure software. - 0 - - - read_only - Page can be read by Secure software, but can not be written. - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Secure software. - 3 - - - - - - - PAGE63_LOCK0 - Lock configuration LSBs for page 63 (rows 0xfc0 through 0xfff). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3FF8 - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - RMA - Decommission for RMA of a suspected faulty device. This re-enables the factory test JTAG interface, and makes pages 3 through 61 of the OTP permanently inaccessible. - [7:7] - read-only - - - NO_KEY_STATE - State when at least one key is registered for this page and no matching key has been entered. - [6:6] - read-only - - - read_only - 0 - - - inaccessible - 1 - - - - - KEY_R - Index 1-6 of a hardware key which must be entered to grant read access, or 0 if no such key is required. - [5:3] - read-only - - - KEY_W - Index 1-6 of a hardware key which must be entered to grant write access, or 0 if no such key is required. - [2:0] - read-only - - - - - PAGE63_LOCK1 - Lock configuration MSBs for page 63 (rows 0xfc0 through 0xfff). Locks are stored with 3-way majority vote encoding, so that bits can be set independently. - - This OTP location is always readable, and is write-protected by its own permissions. - 0x3FFC - 0x20 - 0x00000000 - - - R2 - Redundant copy of bits 7:0 - [23:16] - read-only - - - R1 - Redundant copy of bits 7:0 - [15:8] - read-only - - - LOCK_BL - Dummy lock bits reserved for bootloaders (including the RP2350 USB bootloader) to store their own OTP access permissions. No hardware effect, and no corresponding SW_LOCKx registers. - [5:4] - read-only - - - read_write - Bootloader permits user reads and writes to this page - 0 - - - read_only - Bootloader permits user reads of this page - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE - 2 - - - inaccessible - Bootloader does not permit user access to this page - 3 - - - - - LOCK_NS - Lock state for Non-secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - - Note that READ_WRITE and READ_ONLY are equivalent in hardware, as the SBPI programming interface is not accessible to Non-secure software. However, Secure software may check these bits to apply write permissions to a Non-secure OTP programming API. - [3:2] - read-only - - - read_write - Page can be read by Non-secure software, and Secure software may permit Non-secure writes. - 0 - - - read_only - Page can be read by Non-secure software - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Non-secure software. - 3 - - - - - LOCK_S - Lock state for Secure accesses to this page. Thermometer-coded, so lock state can be advanced permanently from any state to any less-permissive state by programming OTP. Software can also advance the lock state temporarily (until next OTP reset) using the SW_LOCKx registers. - [1:0] - read-only - - - read_write - Page is fully accessible by Secure software. - 0 - - - read_only - Page can be read by Secure software, but can not be written. - 1 - - - reserved - Do not use. Behaves the same as INACCESSIBLE. - 2 - - - inaccessible - Page can not be accessed by Secure software. - 3 - - - - - - - - - TBMAN - For managing simulation testbenches - 0x40160000 - - 0x0 - 0x4 - registers - - - - PLATFORM - Indicates the type of platform in use - 0x0 - 0x00000001 - - - HDLSIM - Indicates the platform is a simulation - [2:2] - read-only - - - FPGA - Indicates the platform is an FPGA - [1:1] - read-only - - - ASIC - Indicates the platform is an ASIC - [0:0] - read-only - - - - - - - USB_DPRAM - DPRAM layout for USB device. - 0x50100000 - - 0x0 - 0x100 - registers - - - - SETUP_PACKET_LOW - Bytes 0-3 of the SETUP packet from the host. - 0x0 - 0x00000000 - - - WVALUE - [31:16] - read-write - - - BREQUEST - [15:8] - read-write - - - BMREQUESTTYPE - [7:0] - read-write - - - - - SETUP_PACKET_HIGH - Bytes 4-7 of the setup packet from the host. - 0x4 - 0x00000000 - - - WLENGTH - [31:16] - read-write - - - WINDEX - [15:0] - read-write - - - - - 30 - 0x4 - 0-29 - EP_CONTROL%s - TODO - 0x8 - 0x00000000 - - - ENABLE - Enable this endpoint. The device will not reply to any packets for this endpoint if this bit is not set. - [31:31] - read-write - - - DOUBLE_BUFFERED - This endpoint is double buffered. - [30:30] - read-write - - - INTERRUPT_PER_BUFF - Trigger an interrupt each time a buffer is done. - [29:29] - read-write - - - INTERRUPT_PER_DOUBLE_BUFF - Trigger an interrupt each time both buffers are done. Only valid in double buffered mode. - [28:28] - read-write - - - ENDPOINT_TYPE - [27:26] - read-write - - - Control - 0 - - - Isochronous - 1 - - - Bulk - 2 - - - Interrupt - 3 - - - - - INTERRUPT_ON_STALL - Trigger an interrupt if a STALL is sent. Intended for debug only. - [17:17] - read-write - - - INTERRUPT_ON_NAK - Trigger an interrupt if a NAK is sent. Intended for debug only. - [16:16] - read-write - - - BUFFER_ADDRESS - 64 byte aligned buffer address for this EP (bits 0-5 are ignored). Relative to the start of the DPRAM. - [15:0] - read-write - - - - - 32 - 0x4 - 0-31 - EP_BUFFER_CONTROL%s - TODO - 0x80 - 0x00000000 - - - FULL_1 - Buffer 1 is full. For an IN transfer (TX to the host) the bit is set to indicate the data is valid. For an OUT transfer (RX from the host) this bit should be left as a 0. The host will set it when it has filled the buffer with data. - [31:31] - read-write - - - LAST_1 - Buffer 1 is the last buffer of the transfer. - [30:30] - read-write - - - PID_1 - The data pid of buffer 1. - [29:29] - read-write - - - DOUBLE_BUFFER_ISO_OFFSET - The number of bytes buffer 1 is offset from buffer 0 in Isochronous mode. Only valid in double buffered mode for an Isochronous endpoint. - For a non Isochronous endpoint the offset is always 64 bytes. - [28:27] - read-write - - - 128 - 0 - - - 256 - 1 - - - 512 - 2 - - - 1024 - 3 - - - - - AVAILABLE_1 - Buffer 1 is available. This bit is set to indicate the buffer can be used by the controller. The controller clears the available bit when writing the status back. - [26:26] - read-write - - - LENGTH_1 - The length of the data in buffer 1. - [25:16] - read-write - - - FULL_0 - Buffer 0 is full. For an IN transfer (TX to the host) the bit is set to indicate the data is valid. For an OUT transfer (RX from the host) this bit should be left as a 0. The host will set it when it has filled the buffer with data. - [15:15] - read-write - - - LAST_0 - Buffer 0 is the last buffer of the transfer. - [14:14] - read-write - - - PID_0 - The data pid of buffer 0. - [13:13] - read-write - - - RESET - Reset the buffer selector to buffer 0. - [12:12] - read-write - - - STALL - Reply with a stall (valid for both buffers). - [11:11] - read-write - - - AVAILABLE_0 - Buffer 0 is available. This bit is set to indicate the buffer can be used by the controller. The controller clears the available bit when writing the status back. - [10:10] - read-write - - - LENGTH_0 - The length of the data in buffer 1. - [9:0] - read-write - - - - - - - diff --git a/Tools/SVDs/stm32f7x6.patched.svd b/Tools/SVDs/stm32f7x6.patched.svd deleted file mode 100644 index db7cd9aa..00000000 --- a/Tools/SVDs/stm32f7x6.patched.svd +++ /dev/null @@ -1,54193 +0,0 @@ - - - STM32F7x6 - 1.6 - STM32F7x6 - - CM7 - r0p1 - little - true - true - 4 - false - - 8 - 32 - 0x20 - 0x00000000 - 0xFFFFFFFF - - - RNG - Random number generator - RNG - 0x50060800 - - 0x0 - 0x400 - registers - - - HASH_RNG - Hash and Rng global interrupt - 80 - - - - CR - CR - control register - 0x0 - 0x20 - read-write - 0x00000000 - - - IE - Interrupt enable - 3 - 1 - - - RNGEN - Random number generator enable - 2 - 1 - - - - - SR - SR - status register - 0x4 - 0x20 - 0x00000000 - - - SEIS - Seed error interrupt status - 6 - 1 - read-write - - - CEIS - Clock error interrupt status - 5 - 1 - read-write - - - SECS - Seed error current status - 2 - 1 - read-only - - - CECS - Clock error current status - 1 - 1 - read-only - - - DRDY - Data ready - 0 - 1 - read-only - - - - - DR - DR - data register - 0x8 - 0x20 - read-only - 0x00000000 - - - RNDATA - Random data - 0 - 32 - - - - - - - HASH - Hash processor - HASH - 0x50060400 - - 0x0 - 0x400 - registers - - - - CR - CR - control register - 0x0 - 0x20 - 0x00000000 - - - INIT - Initialize message digest calculation - 2 - 1 - write-only - - - DMAE - DMA enable - 3 - 1 - read-write - - - DATATYPE - Data type selection - 4 - 2 - read-write - - - MODE - Mode selection - 6 - 1 - read-write - - - ALGO0 - Algorithm selection - 7 - 1 - read-write - - - NBW - Number of words already pushed - 8 - 4 - read-only - - - DINNE - DIN not empty - 12 - 1 - read-only - - - MDMAT - Multiple DMA Transfers - 13 - 1 - read-write - - - LKEY - Long key selection - 16 - 1 - read-write - - - ALGO1 - ALGO - 18 - 1 - read-write - - - - - DIN - DIN - data input register - 0x4 - 0x20 - read-write - 0x00000000 - - - DATAIN - Data input - 0 - 32 - - - - - STR - STR - start register - 0x8 - 0x20 - 0x00000000 - - - DCAL - Digest calculation - 8 - 1 - write-only - - - NBLW - Number of valid bits in the last word of the message - 0 - 5 - read-write - - - - - 5 - 0x4 - 0-4 - HR%s - HR0 - digest registers - 0xC - 0x20 - read-only - 0x00000000 - - - H - H0 - 0 - 32 - - - - - IMR - IMR - interrupt enable register - 0x20 - 0x20 - read-write - 0x00000000 - - - DCIE - Digest calculation completion interrupt enable - 1 - 1 - - - DINIE - Data input interrupt enable - 0 - 1 - - - - - SR - SR - status register - 0x24 - 0x20 - 0x00000001 - - - BUSY - Busy bit - 3 - 1 - read-only - - - DMAS - DMA Status - 2 - 1 - read-only - - - DCIS - Digest calculation completion interrupt status - 1 - 1 - read-write - - - DINIS - Data input interrupt status - 0 - 1 - read-write - - - - - 54 - 0x4 - 0-53 - CSR%s - CSR0 - context swap registers - 0xF8 - 0x20 - read-write - 0x00000000 - - - CSR - CSR0 - 0 - 32 - - - - - 8 - 0x4 - 0-7 - HASH_HR%s - HASH_HR0 - HASH digest register - 0x310 - 0x20 - read-only - 0x00000000 - - - H - H0 - 0 - 32 - - - - - - - CRYP - Cryptographic processor - CRYP - 0x50060000 - - 0x0 - 0x400 - registers - - - CRYP - CRYP crypto global interrupt - 79 - - - - CR - CR - control register - 0x0 - 0x20 - 0x00000000 - - - ALGODIR - Algorithm direction - 2 - 1 - read-write - - - ALGOMODE0 - Algorithm mode - 3 - 3 - read-write - - - DATATYPE - Data type selection - 6 - 2 - read-write - - - KEYSIZE - Key size selection (AES mode only) - 8 - 2 - read-write - - - FFLUSH - FIFO flush - 14 - 1 - write-only - - - CRYPEN - Cryptographic processor enable - 15 - 1 - read-write - - - GCM_CCMPH - GCM_CCMPH - 16 - 2 - read-write - - - ALGOMODE3 - ALGOMODE - 19 - 1 - read-write - - - - - SR - SR - status register - 0x4 - 0x20 - read-only - 0x00000003 - - - BUSY - Busy bit - 4 - 1 - - - OFFU - Output FIFO full - 3 - 1 - - - OFNE - Output FIFO not empty - 2 - 1 - - - IFNF - Input FIFO not full - 1 - 1 - - - IFEM - Input FIFO empty - 0 - 1 - - - - - DIN - DIN - data input register - 0x8 - 0x20 - read-write - 0x00000000 - - - DATAIN - Data input - 0 - 32 - - - - - DOUT - DOUT - data output register - 0xC - 0x20 - read-only - 0x00000000 - - - DATAOUT - Data output - 0 - 32 - - - - - DMACR - DMACR - DMA control register - 0x10 - 0x20 - read-write - 0x00000000 - - - DOEN - DMA output enable - 1 - 1 - - - DIEN - DMA input enable - 0 - 1 - - - - - IMSCR - IMSCR - interrupt mask set/clear register - 0x14 - 0x20 - read-write - 0x00000000 - - - OUTIM - Output FIFO service interrupt mask - 1 - 1 - - - INIM - Input FIFO service interrupt mask - 0 - 1 - - - - - RISR - RISR - raw interrupt status register - 0x18 - 0x20 - read-only - 0x00000001 - - - OUTRIS - Output FIFO service raw interrupt status - 1 - 1 - - - INRIS - Input FIFO service raw interrupt status - 0 - 1 - - - - - MISR - MISR - masked interrupt status register - 0x1C - 0x20 - read-only - 0x00000000 - - - OUTMIS - Output FIFO service masked interrupt status - 1 - 1 - - - INMIS - Input FIFO service masked interrupt status - 0 - 1 - - - - - 4 - 0x8 - 0-3 - KEY%s - Cluster KEY%s, containing K?LR, K?RR - 0x20 - - KLR - K0LR - key registers - 0x0 - 0x20 - write-only - 0x00000000 - - - b2 - b224 - 0 - 32 - - - - - KRR - K0RR - key registers - 0x4 - 0x20 - write-only - 0x00000000 - - - b - b192 - 0 - 32 - - - - - - 2 - 0x8 - 0-1 - INIT%s - Cluster INIT%s, containing IV?LR, IV?RR - 0x40 - - IVLR - IV0LR - initialization vector registers - 0x0 - 0x20 - read-write - 0x00000000 - - - IV - IV31 - 0 - 32 - - - - - IVRR - IV0RR - initialization vector registers - 0x4 - 0x20 - read-write - 0x00000000 - - - IV - IV63 - 0 - 32 - - - - - - 8 - 0x4 - 0-7 - CSGCMCCM%sR - CSGCMCCM0R - context swap register - 0x50 - 0x20 - read-write - 0x00000000 - - - CSGCMCCM0R - CSGCMCCM0R - 0 - 32 - - - - - 8 - 0x4 - 0-7 - CSGCM%sR - CSGCM0R - context swap register - 0x70 - 0x20 - read-write - 0x00000000 - - - CSGCMR - CSGCM0R - 0 - 32 - - - - - - - DCMI - Digital camera interface - DCMI - 0x50050000 - - 0x0 - 0x400 - registers - - - DCMI - DCMI global interrupt - 78 - - - - CR - CR - control register 1 - 0x0 - 0x20 - read-write - 0x00000000 - - - ENABLE - DCMI enable - 14 - 1 - - - EDM - Extended data mode - 10 - 2 - - - FCRC - Frame capture rate control - 8 - 2 - - - VSPOL - Vertical synchronization polarity - 7 - 1 - - - HSPOL - Horizontal synchronization polarity - 6 - 1 - - - PCKPOL - Pixel clock polarity - 5 - 1 - - - ESS - Embedded synchronization select - 4 - 1 - - - JPEG - JPEG format - 3 - 1 - - - CROP - Crop feature - 2 - 1 - - - CM - Capture mode - 1 - 1 - - - CAPTURE - Capture enable - 0 - 1 - - - - - SR - SR - status register - 0x4 - 0x20 - read-only - 0x00000000 - - - FNE - FIFO not empty - 2 - 1 - - - VSYNC - VSYNC - 1 - 1 - - - HSYNC - HSYNC - 0 - 1 - - - - - RIS - RIS - raw interrupt status register - 0x8 - 0x20 - read-only - 0x00000000 - - - LINE_RIS - Line raw interrupt status - 4 - 1 - - - VSYNC_RIS - VSYNC raw interrupt status - 3 - 1 - - - ERR_RIS - Synchronization error raw interrupt status - 2 - 1 - - - OVR_RIS - Overrun raw interrupt status - 1 - 1 - - - FRAME_RIS - Capture complete raw interrupt status - 0 - 1 - - - - - IER - IER - interrupt enable register - 0xC - 0x20 - read-write - 0x00000000 - - - LINE_IE - Line interrupt enable - 4 - 1 - - - VSYNC_IE - VSYNC interrupt enable - 3 - 1 - - - ERR_IE - Synchronization error interrupt enable - 2 - 1 - - - OVR_IE - Overrun interrupt enable - 1 - 1 - - - FRAME_IE - Capture complete interrupt enable - 0 - 1 - - - - - MIS - MIS - masked interrupt status register - 0x10 - 0x20 - read-only - 0x00000000 - - - LINE_MIS - Line masked interrupt status - 4 - 1 - - - VSYNC_MIS - VSYNC masked interrupt status - 3 - 1 - - - ERR_MIS - Synchronization error masked interrupt status - 2 - 1 - - - OVR_MIS - Overrun masked interrupt status - 1 - 1 - - - FRAME_MIS - Capture complete masked interrupt status - 0 - 1 - - - - - ICR - ICR - interrupt clear register - 0x14 - 0x20 - write-only - 0x00000000 - - - LINE_ISC - line interrupt status clear - 4 - 1 - - - VSYNC_ISC - Vertical synch interrupt status clear - 3 - 1 - - - ERR_ISC - Synchronization error interrupt status clear - 2 - 1 - - - OVR_ISC - Overrun interrupt status clear - 1 - 1 - - - FRAME_ISC - Capture complete interrupt status clear - 0 - 1 - - - - - ESCR - ESCR - embedded synchronization code register - 0x18 - 0x20 - read-write - 0x00000000 - - - FEC - Frame end delimiter code - 24 - 8 - - - LEC - Line end delimiter code - 16 - 8 - - - LSC - Line start delimiter code - 8 - 8 - - - FSC - Frame start delimiter code - 0 - 8 - - - - - ESUR - ESUR - embedded synchronization unmask register - 0x1C - 0x20 - read-write - 0x00000000 - - - FEU - Frame end delimiter unmask - 24 - 8 - - - LEU - Line end delimiter unmask - 16 - 8 - - - LSU - Line start delimiter unmask - 8 - 8 - - - FSU - Frame start delimiter unmask - 0 - 8 - - - - - CWSTRT - CWSTRT - crop window start - 0x20 - 0x20 - read-write - 0x00000000 - - - VST - Vertical start line count - 16 - 13 - - - HOFFCNT - Horizontal offset count - 0 - 14 - - - - - CWSIZE - CWSIZE - crop window size - 0x24 - 0x20 - read-write - 0x00000000 - - - VLINE - Vertical line count - 16 - 14 - - - CAPCNT - Capture count - 0 - 14 - - - - - DR - DR - data register - 0x28 - 0x20 - read-only - 0x00000000 - - - Byte3 - Data byte 3 - 24 - 8 - - - Byte2 - Data byte 2 - 16 - 8 - - - Byte1 - Data byte 1 - 8 - 8 - - - Byte0 - Data byte 0 - 0 - 8 - - - - - - - FMC - Flexible memory controller - FSMC - 0xA0000000 - - 0x0 - 0x1000 - registers - - - FMC - FMC global interrupt - 48 - - - - BCR1 - BCR1 - SRAM/NOR-Flash chip-select control register 1 - 0x0 - 0x20 - read-write - 0x000030D0 - - - CCLKEN - CCLKEN - 20 - 1 - - CCLKEN - read-write - - Disabled - The FMC_CLK is generated continuously during asynchronous and synchronous access. The FMC_CLK clock is activated when the CCLKEN is set - 0 - - - Enabled - The FMC_CLK is only generated during the synchronous memory access (read/write transaction) - 1 - - - - - CBURSTRW - CBURSTRW - 19 - 1 - - CBURSTRW - read-write - - Disabled - Write operations are always performed in asynchronous mode - 0 - - - Enabled - Write operations are performed in synchronous mode - 1 - - - - - ASYNCWAIT - ASYNCWAIT - 15 - 1 - - ASYNCWAIT - read-write - - Disabled - Wait signal not used in asynchronous mode - 0 - - - Enabled - Wait signal used even in asynchronous mode - 1 - - - - - EXTMOD - EXTMOD - 14 - 1 - - EXTMOD - read-write - - Disabled - Values inside the FMC_BWTR are not taken into account - 0 - - - Enabled - Values inside the FMC_BWTR are taken into account - 1 - - - - - WAITEN - WAITEN - 13 - 1 - - WAITEN - read-write - - Disabled - Values inside the FMC_BWTR are taken into account - 0 - - - Enabled - NWAIT signal enabled - 1 - - - - - WREN - WREN - 12 - 1 - - WREN - read-write - - Disabled - Write operations disabled for the bank by the FMC - 0 - - - Enabled - Write operations enabled for the bank by the FMC - 1 - - - - - WAITCFG - WAITCFG - 11 - 1 - - WAITCFG - read-write - - BeforeWaitState - NWAIT signal is active one data cycle before wait state - 0 - - - DuringWaitState - NWAIT signal is active during wait state - 1 - - - - - WAITPOL - WAITPOL - 9 - 1 - - WAITPOL - read-write - - ActiveLow - NWAIT active low - 0 - - - ActiveHigh - NWAIT active high - 1 - - - - - BURSTEN - BURSTEN - 8 - 1 - - BURSTEN - read-write - - Disabled - Burst mode disabled - 0 - - - Enabled - Burst mode enabled - 1 - - - - - FACCEN - FACCEN - 6 - 1 - - FACCEN - read-write - - Disabled - Corresponding NOR Flash memory access is disabled - 0 - - - Enabled - Corresponding NOR Flash memory access is enabled - 1 - - - - - MWID - MWID - 4 - 2 - - MWID - read-write - - Bits8 - Memory data bus width 8 bits - 0 - - - Bits16 - Memory data bus width 16 bits - 1 - - - Bits32 - Memory data bus width 32 bits - 2 - - - - - MTYP - MTYP - 2 - 2 - - MTYP - read-write - - SRAM - SRAM memory type - 0 - - - PSRAM - PSRAM (CRAM) memory type - 1 - - - Flash - NOR Flash/OneNAND Flash - 2 - - - - - MUXEN - MUXEN - 1 - 1 - - MUXEN - read-write - - Disabled - Address/Data non-multiplexed - 0 - - - Enabled - Address/Data multiplexed on databus - 1 - - - - - MBKEN - MBKEN - 0 - 1 - - MBKEN - read-write - - Disabled - Corresponding memory bank is disabled - 0 - - - Enabled - Corresponding memory bank is enabled - 1 - - - - - WRAPMOD - WRAPMOD - 10 - 1 - - - WFDIS - Write FIFO disable - 21 - 1 - read-write - - WFDIS - read-write - - Enabled - Write FIFO enabled - 0 - - - Disabled - Write FIFO disabled - 1 - - - - - CPSIZE - CRAM page size - 16 - 3 - read-write - - CPSIZE - read-write - - NoBurstSplit - No burst split when crossing page boundary - 0 - - - Bytes128 - 128 bytes CRAM page size - 1 - - - Bytes256 - 256 bytes CRAM page size - 2 - - - Bytes512 - 512 bytes CRAM page size - 3 - - - Bytes1024 - 1024 bytes CRAM page size - 4 - - - - - - - 4 - 0x8 - 1-4 - BTR%s - BTR1 - SRAM/NOR-Flash chip-select timing register 1 - 0x4 - 0x20 - read-write - 0xFFFFFFFF - - - ACCMOD - ACCMOD - 28 - 2 - - ACCMOD - read-write - - A - Access mode A - 0 - - - B - Access mode B - 1 - - - C - Access mode C - 2 - - - D - Access mode D - 3 - - - - - DATLAT - DATLAT - 24 - 4 - - - 0 - 15 - - - - - CLKDIV - CLKDIV - 20 - 4 - - - 1 - 15 - - - - - BUSTURN - BUSTURN - 16 - 4 - - - 0 - 15 - - - - - DATAST - DATAST - 8 - 8 - - - 1 - 255 - - - - - ADDHLD - ADDHLD - 4 - 4 - - - 1 - 15 - - - - - ADDSET - ADDSET - 0 - 4 - - - 0 - 15 - - - - - - - 3 - 0x8 - 2-4 - BCR%s - BCR2 - SRAM/NOR-Flash chip-select control register 2 - 0x8 - 0x20 - read-write - 0x000030D0 - - - CBURSTRW - CBURSTRW - 19 - 1 - - CBURSTRW - read-write - - Disabled - Write operations are always performed in asynchronous mode - 0 - - - Enabled - Write operations are performed in synchronous mode - 1 - - - - - ASYNCWAIT - ASYNCWAIT - 15 - 1 - - ASYNCWAIT - read-write - - Disabled - Wait signal not used in asynchronous mode - 0 - - - Enabled - Wait signal used even in asynchronous mode - 1 - - - - - EXTMOD - EXTMOD - 14 - 1 - - EXTMOD - read-write - - Disabled - Values inside the FMC_BWTR are not taken into account - 0 - - - Enabled - Values inside the FMC_BWTR are taken into account - 1 - - - - - WAITEN - WAITEN - 13 - 1 - - WAITEN - read-write - - Disabled - Values inside the FMC_BWTR are taken into account - 0 - - - Enabled - NWAIT signal enabled - 1 - - - - - WREN - WREN - 12 - 1 - - WREN - read-write - - Disabled - Write operations disabled for the bank by the FMC - 0 - - - Enabled - Write operations enabled for the bank by the FMC - 1 - - - - - WAITCFG - WAITCFG - 11 - 1 - - WAITCFG - read-write - - BeforeWaitState - NWAIT signal is active one data cycle before wait state - 0 - - - DuringWaitState - NWAIT signal is active during wait state - 1 - - - - - WRAPMOD - WRAPMOD - 10 - 1 - - - WAITPOL - WAITPOL - 9 - 1 - - WAITPOL - read-write - - ActiveLow - NWAIT active low - 0 - - - ActiveHigh - NWAIT active high - 1 - - - - - BURSTEN - BURSTEN - 8 - 1 - - BURSTEN - read-write - - Disabled - Burst mode disabled - 0 - - - Enabled - Burst mode enabled - 1 - - - - - FACCEN - FACCEN - 6 - 1 - - FACCEN - read-write - - Disabled - Corresponding NOR Flash memory access is disabled - 0 - - - Enabled - Corresponding NOR Flash memory access is enabled - 1 - - - - - MWID - MWID - 4 - 2 - - MWID - read-write - - Bits8 - Memory data bus width 8 bits - 0 - - - Bits16 - Memory data bus width 16 bits - 1 - - - Bits32 - Memory data bus width 32 bits - 2 - - - - - MTYP - MTYP - 2 - 2 - - MTYP - read-write - - SRAM - SRAM memory type - 0 - - - PSRAM - PSRAM (CRAM) memory type - 1 - - - Flash - NOR Flash/OneNAND Flash - 2 - - - - - MUXEN - MUXEN - 1 - 1 - - MUXEN - read-write - - Disabled - Address/Data non-multiplexed - 0 - - - Enabled - Address/Data multiplexed on databus - 1 - - - - - MBKEN - MBKEN - 0 - 1 - - MBKEN - read-write - - Disabled - Corresponding memory bank is disabled - 0 - - - Enabled - Corresponding memory bank is enabled - 1 - - - - - CPSIZE - CRAM page size - 16 - 3 - read-write - - CPSIZE - read-write - - NoBurstSplit - No burst split when crossing page boundary - 0 - - - Bytes128 - 128 bytes CRAM page size - 1 - - - Bytes256 - 256 bytes CRAM page size - 2 - - - Bytes512 - 512 bytes CRAM page size - 3 - - - Bytes1024 - 1024 bytes CRAM page size - 4 - - - - - - - PCR - PCR - PC Card/NAND Flash control register - 0x80 - 0x20 - read-write - 0x00000018 - - - ECCPS - ECCPS - 17 - 3 - - ECCPS - read-write - - Bytes256 - ECC page size 256 bytes - 0 - - - Bytes512 - ECC page size 512 bytes - 1 - - - Bytes1024 - ECC page size 1024 bytes - 2 - - - Bytes2048 - ECC page size 2048 bytes - 3 - - - Bytes4096 - ECC page size 4096 bytes - 4 - - - Bytes8192 - ECC page size 8192 bytes - 5 - - - - - TAR - TAR - 13 - 4 - - - 0 - 15 - - - - - TCLR - TCLR - 9 - 4 - - - 0 - 15 - - - - - ECCEN - ECCEN - 6 - 1 - - ECCEN - read-write - - Disabled - ECC logic is disabled and reset - 0 - - - Enabled - ECC logic is enabled - 1 - - - - - PWID - PWID - 4 - 2 - - PWID - read-write - - Bits8 - External memory device width 8 bits - 0 - - - Bits16 - External memory device width 16 bits - 1 - - - - - PTYP - PTYP - 3 - 1 - - PTYP - read-write - - NANDFlash - NAND Flash - 1 - - - - - PBKEN - PBKEN - 2 - 1 - - PBKEN - read-write - - Disabled - Corresponding memory bank is disabled - 0 - - - Enabled - Corresponding memory bank is enabled - 1 - - - - - PWAITEN - PWAITEN - 1 - 1 - - PWAITEN - read-write - - Disabled - Wait feature disabled - 0 - - - Enabled - Wait feature enabled - 1 - - - - - - - SR - SR - FIFO status and interrupt register - 0x84 - 0x20 - 0x00000040 - - - FEMPT - FEMPT - 6 - 1 - read-only - - FEMPT - read - - NotEmpty - FIFO not empty - 0 - - - Empty - FIFO empty - 1 - - - - - IFEN - IFEN - 5 - 1 - read-write - - IFEN - read-write - - Disabled - Interrupt falling edge detection request disabled - 0 - - - Enabled - Interrupt falling edge detection request enabled - 1 - - - - - ILEN - ILEN - 4 - 1 - read-write - - ILEN - read-write - - Disabled - Interrupt high-level detection request disabled - 0 - - - Enabled - Interrupt high-level detection request enabled - 1 - - - - - IREN - IREN - 3 - 1 - read-write - - IREN - read-write - - Disabled - Interrupt rising edge detection request disabled - 0 - - - Enabled - Interrupt rising edge detection request enabled - 1 - - - - - IFS - IFS - 2 - 1 - read-write - - IFS - read-write - - DidNotOccur - Interrupt falling edge did not occur - 0 - - - Occurred - Interrupt falling edge occurred - 1 - - - - - ILS - ILS - 1 - 1 - read-write - - ILS - read-write - - DidNotOccur - Interrupt high-level did not occur - 0 - - - Occurred - Interrupt high-level occurred - 1 - - - - - IRS - IRS - 0 - 1 - read-write - - IRS - read-write - - DidNotOccur - Interrupt rising edge did not occur - 0 - - - Occurred - Interrupt rising edge occurred - 1 - - - - - - - PMEM - PMEM - Common memory space timing register - 0x88 - 0x20 - read-write - 0xFCFCFCFC - - - MEMHIZ - MEMHIZx - 24 - 8 - - - 0 - 254 - - - - - MEMHOLD - MEMHOLDx - 16 - 8 - - - 1 - 254 - - - - - MEMWAIT - MEMWAITx - 8 - 8 - - - 1 - 254 - - - - - MEMSET - MEMSETx - 0 - 8 - - - 0 - 254 - - - - - - - PATT - PATT - Attribute memory space timing register - 0x8C - 0x20 - read-write - 0xFCFCFCFC - - - ATTHIZ - ATTHIZx - 24 - 8 - - - 0 - 254 - - - - - ATTHOLD - ATTHOLDx - 16 - 8 - - - 1 - 254 - - - - - ATTWAIT - ATTWAITx - 8 - 8 - - - 1 - 254 - - - - - ATTSET - ATTSETx - 0 - 8 - - - 0 - 254 - - - - - - - ECCR - ECCR - ECC result register - 0x94 - 0x20 - read-only - 0x00000000 - - - ECC - ECCx - 0 - 32 - - - 0 - 4294967295 - - - - - - - 4 - 0x8 - 1-4 - BWTR%s - BWTR1 - SRAM/NOR-Flash write timing registers 1 - 0x104 - 0x20 - read-write - 0x0FFFFFFF - - - ACCMOD - ACCMOD - 28 - 2 - - ACCMOD - read-write - - A - Access mode A - 0 - - - B - Access mode B - 1 - - - C - Access mode C - 2 - - - D - Access mode D - 3 - - - - - DATLAT - DATLAT - 24 - 4 - - - CLKDIV - CLKDIV - 20 - 4 - - - DATAST - DATAST - 8 - 8 - - - 1 - 255 - - - - - ADDHLD - ADDHLD - 4 - 4 - - - 1 - 15 - - - - - ADDSET - ADDSET - 0 - 4 - - - 0 - 15 - - - - - BUSTURN - Bus turnaround phase duration - 16 - 4 - read-write - - - 0 - 15 - - - - - - - 2 - 0x4 - 1-2 - SDCR%s - SDCR1 - SDRAM Control Register 1 - 0x140 - 0x20 - read-write - 0x000002D0 - - - NC - Number of column address bits - 0 - 2 - - NC - read-write - - Bits8 - 8 bits - 0 - - - Bits9 - 9 bits - 1 - - - Bits10 - 10 bits - 2 - - - Bits11 - 11 bits - 3 - - - - - NR - Number of row address bits - 2 - 2 - - NR - read-write - - Bits11 - 11 bits - 0 - - - Bits12 - 12 bits - 1 - - - Bits13 - 13 bits - 2 - - - - - MWID - Memory data bus width - 4 - 2 - - MWID - read-write - - Bits8 - Memory data bus width 8 bits - 0 - - - Bits16 - Memory data bus width 16 bits - 1 - - - Bits32 - Memory data bus width 32 bits - 2 - - - - - NB - Number of internal banks - 6 - 1 - - NB - read-write - - NB2 - Two internal Banks - 0 - - - NB4 - Four internal Banks - 1 - - - - - CAS - CAS latency - 7 - 2 - - CAS - read-write - - Clocks1 - 1 cycle - 1 - - - Clocks2 - 2 cycles - 2 - - - Clocks3 - 3 cycles - 3 - - - - - WP - Write protection - 9 - 1 - - WP - read-write - - Disabled - Write accesses allowed - 0 - - - Enabled - Write accesses ignored - 1 - - - - - SDCLK - SDRAM clock configuration - 10 - 2 - - SDCLK - read-write - - Disabled - SDCLK clock disabled - 0 - - - Div2 - SDCLK period = 2 x HCLK period - 2 - - - Div3 - SDCLK period = 3 x HCLK period - 3 - - - - - RBURST - Burst read - 12 - 1 - - RBURST - read-write - - Disabled - Single read requests are not managed as bursts - 0 - - - Enabled - Single read requests are always managed as bursts - 1 - - - - - RPIPE - Read pipe - 13 - 2 - - RPIPE - read-write - - NoDelay - No clock cycle delay - 0 - - - Clocks1 - One clock cycle delay - 1 - - - Clocks2 - Two clock cycles delay - 2 - - - - - - - 2 - 0x4 - 1-2 - SDTR%s - SDTR1 - SDRAM Timing register 1 - 0x148 - 0x20 - read-write - 0x0FFFFFFF - - - TMRD - Load Mode Register to Active - 0 - 4 - - - 0 - 15 - - - - - TXSR - Exit self-refresh delay - 4 - 4 - - - 0 - 15 - - - - - TRAS - Self refresh time - 8 - 4 - - - 0 - 15 - - - - - TRC - Row cycle delay - 12 - 4 - - - 0 - 15 - - - - - TWR - Recovery delay - 16 - 4 - - - 0 - 15 - - - - - TRP - Row precharge delay - 20 - 4 - - - 0 - 15 - - - - - TRCD - Row to column delay - 24 - 4 - - - 0 - 15 - - - - - - - SDCMR - SDCMR - SDRAM Command Mode register - 0x150 - 0x20 - 0x00000000 - - - MODE - Command mode - 0 - 3 - write-only - - MODE - write - - Normal - Normal Mode - 0 - - - ClockConfigurationEnable - Clock Configuration Enable - 1 - - - PALL - PALL (All Bank Precharge) command - 2 - - - AutoRefreshCommand - Auto-refresh command - 3 - - - LoadModeRegister - Load Mode Resgier - 4 - - - SelfRefreshCommand - Self-refresh command - 5 - - - PowerDownCommand - Power-down command - 6 - - - - - CTB2 - Command target bank 2 - 3 - 1 - write-only - - CTB2 - write - - NotIssued - Command not issued to SDRAM Bank 1 - 0 - - - Issued - Command issued to SDRAM Bank 1 - 1 - - - - - CTB1 - Command target bank 1 - 4 - 1 - write-only - - - - NRFS - Number of Auto-refresh - 5 - 4 - read-write - - - 0 - 15 - - - - - MRD - Mode Register definition - 9 - 13 - read-write - - - 0 - 8191 - - - - - - - SDRTR - SDRTR - SDRAM Refresh Timer register - 0x154 - 0x20 - 0x00000000 - - - CRE - Clear Refresh error flag - 0 - 1 - write-only - - CRE - write - - Clear - Refresh Error Flag is cleared - 1 - - - - - COUNT - Refresh Timer Count - 1 - 13 - read-write - - - 0 - 8191 - - - - - REIE - RES Interrupt Enable - 14 - 1 - read-write - - REIE - read-write - - Disabled - Interrupt is disabled - 0 - - - Enabled - Interrupt is generated if RE = 1 - 1 - - - - - - - SDSR - SDSR - SDRAM Status register - 0x158 - 0x20 - read-only - 0x00000000 - - - RE - Refresh error flag - 0 - 1 - - RE - read - - NoError - No refresh error has been detected - 0 - - - Error - A refresh error has been detected - 1 - - - - - MODES1 - Status Mode for Bank 1 - 1 - 2 - - MODES1 - read - - Normal - Normal Mode - 0 - - - SelfRefresh - Self-refresh mode - 1 - - - PowerDown - Power-down mode - 2 - - - - - MODES2 - Status Mode for Bank 2 - 3 - 2 - - - - BUSY - Busy status - 5 - 1 - - BUSY - read - - NotBusy - SDRAM Controller is ready to accept a new request - 0 - - - Busy - SDRAM Controller is not ready to accept a new request - 1 - - - - - - - - - DBGMCU - Debug support - DBG - 0xE0042000 - - 0x0 - 0x400 - registers - - - - IDCODE - IDCODE - IDCODE - 0x0 - 0x20 - read-only - 0x10006411 - - - DEV_ID - DEV_ID - 0 - 12 - - - REV_ID - REV_ID - 16 - 16 - - - - - CR - CR - Control Register - 0x4 - 0x20 - read-write - 0x00000000 - - - DBG_SLEEP - DBG_SLEEP - 0 - 1 - - - DBG_STOP - DBG_STOP - 1 - 1 - - - DBG_STANDBY - DBG_STANDBY - 2 - 1 - - - TRACE_IOEN - TRACE_IOEN - 5 - 1 - - - TRACE_MODE - TRACE_MODE - 6 - 2 - - - - - APB1_FZ - APB1_FZ - Debug MCU APB1 Freeze registe - 0x8 - 0x20 - read-write - 0x00000000 - - - DBG_TIM2_STOP - DBG_TIM2_STOP - 0 - 1 - - - DBG_TIM3_STOP - DBG_TIM3 _STOP - 1 - 1 - - - DBG_TIM4_STOP - DBG_TIM4_STOP - 2 - 1 - - - DBG_TIM5_STOP - DBG_TIM5_STOP - 3 - 1 - - - DBG_TIM6_STOP - DBG_TIM6_STOP - 4 - 1 - - - DBG_TIM7_STOP - DBG_TIM7_STOP - 5 - 1 - - - DBG_TIM12_STOP - DBG_TIM12_STOP - 6 - 1 - - - DBG_TIM13_STOP - DBG_TIM13_STOP - 7 - 1 - - - DBG_TIM14_STOP - DBG_TIM14_STOP - 8 - 1 - - - DBG_WWDG_STOP - DBG_WWDG_STOP - 11 - 1 - - - DBG_IWDG_STOP - DBG_IWDEG_STOP - 12 - 1 - - - DBG_J2C1_SMBUS_TIMEOUT - DBG_J2C1_SMBUS_TIMEOUT - 21 - 1 - - - DBG_J2C2_SMBUS_TIMEOUT - DBG_J2C2_SMBUS_TIMEOUT - 22 - 1 - - - DBG_J2C3SMBUS_TIMEOUT - DBG_J2C3SMBUS_TIMEOUT - 23 - 1 - - - DBG_CAN1_STOP - DBG_CAN1_STOP - 25 - 1 - - - DBG_CAN2_STOP - DBG_CAN2_STOP - 26 - 1 - - - - - APB2_FZ - APB2_FZ - Debug MCU APB2 Freeze registe - 0xC - 0x20 - read-write - 0x00000000 - - - DBG_TIM1_STOP - TIM1 counter stopped when core is halted - 0 - 1 - - - DBG_TIM8_STOP - TIM8 counter stopped when core is halted - 1 - 1 - - - DBG_TIM9_STOP - TIM9 counter stopped when core is halted - 16 - 1 - - - DBG_TIM10_STOP - TIM10 counter stopped when core is halted - 17 - 1 - - - DBG_TIM11_STOP - TIM11 counter stopped when core is halted - 18 - 1 - - - - - - - DMA2 - DMA controller - DMA - 0x40026400 - - 0x0 - 0x400 - registers - - - DMA2_Stream0 - DMA2 Stream0 global interrupt - 56 - - - DMA2_Stream1 - DMA2 Stream1 global interrupt - 57 - - - DMA2_Stream2 - DMA2 Stream2 global interrupt - 58 - - - DMA2_Stream3 - DMA2 Stream3 global interrupt - 59 - - - DMA2_Stream4 - DMA2 Stream4 global interrupt - 60 - - - DMA2_Stream5 - DMA2 Stream5 global interrupt - 68 - - - DMA2_Stream6 - DMA2 Stream6 global interrupt - 69 - - - DMA2_Stream7 - DMA2 Stream7 global interrupt - 70 - - - - LISR - LISR - low interrupt status register - 0x0 - 0x20 - read-only - 0x00000000 - - - TCIF3 - Stream x transfer complete interrupt flag (x = 3..0) - 27 - 1 - - - - HTIF3 - Stream x half transfer interrupt flag (x=3..0) - 26 - 1 - - - - TEIF3 - Stream x transfer error interrupt flag (x=3..0) - 25 - 1 - - - - DMEIF3 - Stream x direct mode error interrupt flag (x=3..0) - 24 - 1 - - - - FEIF3 - Stream x FIFO error interrupt flag (x=3..0) - 22 - 1 - - - - TCIF2 - Stream x transfer complete interrupt flag (x = 3..0) - 21 - 1 - - - - HTIF2 - Stream x half transfer interrupt flag (x=3..0) - 20 - 1 - - - - TEIF2 - Stream x transfer error interrupt flag (x=3..0) - 19 - 1 - - - - DMEIF2 - Stream x direct mode error interrupt flag (x=3..0) - 18 - 1 - - - - FEIF2 - Stream x FIFO error interrupt flag (x=3..0) - 16 - 1 - - - - TCIF1 - Stream x transfer complete interrupt flag (x = 3..0) - 11 - 1 - - - - HTIF1 - Stream x half transfer interrupt flag (x=3..0) - 10 - 1 - - - - TEIF1 - Stream x transfer error interrupt flag (x=3..0) - 9 - 1 - - - - DMEIF1 - Stream x direct mode error interrupt flag (x=3..0) - 8 - 1 - - - - FEIF1 - Stream x FIFO error interrupt flag (x=3..0) - 6 - 1 - - - - TCIF0 - Stream x transfer complete interrupt flag (x = 3..0) - 5 - 1 - - TCIF0 - read - - NotComplete - No transfer complete event on stream x - 0 - - - Complete - A transfer complete event occurred on stream x - 1 - - - - - HTIF0 - Stream x half transfer interrupt flag (x=3..0) - 4 - 1 - - HTIF0 - read - - NotHalf - No half transfer event on stream x - 0 - - - Half - A half transfer event occurred on stream x - 1 - - - - - TEIF0 - Stream x transfer error interrupt flag (x=3..0) - 3 - 1 - - TEIF0 - read - - NoError - No transfer error on stream x - 0 - - - Error - A transfer error occurred on stream x - 1 - - - - - DMEIF0 - Stream x direct mode error interrupt flag (x=3..0) - 2 - 1 - - DMEIF0 - read - - NoError - No Direct Mode error on stream x - 0 - - - Error - A Direct Mode error occurred on stream x - 1 - - - - - FEIF0 - Stream x FIFO error interrupt flag (x=3..0) - 0 - 1 - - FEIF0 - read - - NoError - No FIFO error event on stream x - 0 - - - Error - A FIFO error event occurred on stream x - 1 - - - - - - - HISR - HISR - high interrupt status register - 0x4 - 0x20 - read-only - 0x00000000 - - - TCIF7 - Stream x transfer complete interrupt flag (x=7..4) - 27 - 1 - - - - HTIF7 - Stream x half transfer interrupt flag (x=7..4) - 26 - 1 - - - - TEIF7 - Stream x transfer error interrupt flag (x=7..4) - 25 - 1 - - - - DMEIF7 - Stream x direct mode error interrupt flag (x=7..4) - 24 - 1 - - - - FEIF7 - Stream x FIFO error interrupt flag (x=7..4) - 22 - 1 - - - - TCIF6 - Stream x transfer complete interrupt flag (x=7..4) - 21 - 1 - - - - HTIF6 - Stream x half transfer interrupt flag (x=7..4) - 20 - 1 - - - - TEIF6 - Stream x transfer error interrupt flag (x=7..4) - 19 - 1 - - - - DMEIF6 - Stream x direct mode error interrupt flag (x=7..4) - 18 - 1 - - - - FEIF6 - Stream x FIFO error interrupt flag (x=7..4) - 16 - 1 - - - - TCIF5 - Stream x transfer complete interrupt flag (x=7..4) - 11 - 1 - - - - HTIF5 - Stream x half transfer interrupt flag (x=7..4) - 10 - 1 - - - - TEIF5 - Stream x transfer error interrupt flag (x=7..4) - 9 - 1 - - - - DMEIF5 - Stream x direct mode error interrupt flag (x=7..4) - 8 - 1 - - - - FEIF5 - Stream x FIFO error interrupt flag (x=7..4) - 6 - 1 - - - - TCIF4 - Stream x transfer complete interrupt flag (x=7..4) - 5 - 1 - - TCIF4 - read - - NotComplete - No transfer complete event on stream x - 0 - - - Complete - A transfer complete event occurred on stream x - 1 - - - - - HTIF4 - Stream x half transfer interrupt flag (x=7..4) - 4 - 1 - - HTIF4 - read - - NotHalf - No half transfer event on stream x - 0 - - - Half - A half transfer event occurred on stream x - 1 - - - - - TEIF4 - Stream x transfer error interrupt flag (x=7..4) - 3 - 1 - - TEIF4 - read - - NoError - No transfer error on stream x - 0 - - - Error - A transfer error occurred on stream x - 1 - - - - - DMEIF4 - Stream x direct mode error interrupt flag (x=7..4) - 2 - 1 - - DMEIF4 - read - - NoError - No Direct Mode error on stream x - 0 - - - Error - A Direct Mode error occurred on stream x - 1 - - - - - FEIF4 - Stream x FIFO error interrupt flag (x=7..4) - 0 - 1 - - FEIF4 - read - - NoError - No FIFO error event on stream x - 0 - - - Error - A FIFO error event occurred on stream x - 1 - - - - - - - LIFCR - LIFCR - low interrupt flag clear register - 0x8 - 0x20 - write-only - 0x00000000 - - - CTCIF3 - Stream x clear transfer complete interrupt flag (x = 3..0) - 27 - 1 - - - - CHTIF3 - Stream x clear half transfer interrupt flag (x = 3..0) - 26 - 1 - - - - CTEIF3 - Stream x clear transfer error interrupt flag (x = 3..0) - 25 - 1 - - - - CDMEIF3 - Stream x clear direct mode error interrupt flag (x = 3..0) - 24 - 1 - - - - CFEIF3 - Stream x clear FIFO error interrupt flag (x = 3..0) - 22 - 1 - - - - CTCIF2 - Stream x clear transfer complete interrupt flag (x = 3..0) - 21 - 1 - - - - CHTIF2 - Stream x clear half transfer interrupt flag (x = 3..0) - 20 - 1 - - - - CTEIF2 - Stream x clear transfer error interrupt flag (x = 3..0) - 19 - 1 - - - - CDMEIF2 - Stream x clear direct mode error interrupt flag (x = 3..0) - 18 - 1 - - - - CFEIF2 - Stream x clear FIFO error interrupt flag (x = 3..0) - 16 - 1 - - - - CTCIF1 - Stream x clear transfer complete interrupt flag (x = 3..0) - 11 - 1 - - - - CHTIF1 - Stream x clear half transfer interrupt flag (x = 3..0) - 10 - 1 - - - - CTEIF1 - Stream x clear transfer error interrupt flag (x = 3..0) - 9 - 1 - - - - CDMEIF1 - Stream x clear direct mode error interrupt flag (x = 3..0) - 8 - 1 - - - - CFEIF1 - Stream x clear FIFO error interrupt flag (x = 3..0) - 6 - 1 - - - - CTCIF0 - Stream x clear transfer complete interrupt flag (x = 3..0) - 5 - 1 - - CTCIF0 - write - - Clear - Clear the corresponding TCIFx flag - 1 - - - - - CHTIF0 - Stream x clear half transfer interrupt flag (x = 3..0) - 4 - 1 - - CHTIF0 - write - - Clear - Clear the corresponding HTIFx flag - 1 - - - - - CTEIF0 - Stream x clear transfer error interrupt flag (x = 3..0) - 3 - 1 - - CTEIF0 - write - - Clear - Clear the corresponding TEIFx flag - 1 - - - - - CDMEIF0 - Stream x clear direct mode error interrupt flag (x = 3..0) - 2 - 1 - - CDMEIF0 - write - - Clear - Clear the corresponding DMEIFx flag - 1 - - - - - CFEIF0 - Stream x clear FIFO error interrupt flag (x = 3..0) - 0 - 1 - - CFEIF0 - write - - Clear - Clear the corresponding CFEIFx flag - 1 - - - - - - - HIFCR - HIFCR - high interrupt flag clear register - 0xC - 0x20 - write-only - 0x00000000 - - - CTCIF7 - Stream x clear transfer complete interrupt flag (x = 7..4) - 27 - 1 - - - - CHTIF7 - Stream x clear half transfer interrupt flag (x = 7..4) - 26 - 1 - - - - CTEIF7 - Stream x clear transfer error interrupt flag (x = 7..4) - 25 - 1 - - - - CDMEIF7 - Stream x clear direct mode error interrupt flag (x = 7..4) - 24 - 1 - - - - CFEIF7 - Stream x clear FIFO error interrupt flag (x = 7..4) - 22 - 1 - - - - CTCIF6 - Stream x clear transfer complete interrupt flag (x = 7..4) - 21 - 1 - - - - CHTIF6 - Stream x clear half transfer interrupt flag (x = 7..4) - 20 - 1 - - - - CTEIF6 - Stream x clear transfer error interrupt flag (x = 7..4) - 19 - 1 - - - - CDMEIF6 - Stream x clear direct mode error interrupt flag (x = 7..4) - 18 - 1 - - - - CFEIF6 - Stream x clear FIFO error interrupt flag (x = 7..4) - 16 - 1 - - - - CTCIF5 - Stream x clear transfer complete interrupt flag (x = 7..4) - 11 - 1 - - - - CHTIF5 - Stream x clear half transfer interrupt flag (x = 7..4) - 10 - 1 - - - - CTEIF5 - Stream x clear transfer error interrupt flag (x = 7..4) - 9 - 1 - - - - CDMEIF5 - Stream x clear direct mode error interrupt flag (x = 7..4) - 8 - 1 - - - - CFEIF5 - Stream x clear FIFO error interrupt flag (x = 7..4) - 6 - 1 - - - - CTCIF4 - Stream x clear transfer complete interrupt flag (x = 7..4) - 5 - 1 - - CTCIF4 - write - - Clear - Clear the corresponding TCIFx flag - 1 - - - - - CHTIF4 - Stream x clear half transfer interrupt flag (x = 7..4) - 4 - 1 - - CHTIF4 - write - - Clear - Clear the corresponding HTIFx flag - 1 - - - - - CTEIF4 - Stream x clear transfer error interrupt flag (x = 7..4) - 3 - 1 - - CTEIF4 - write - - Clear - Clear the corresponding TEIFx flag - 1 - - - - - CDMEIF4 - Stream x clear direct mode error interrupt flag (x = 7..4) - 2 - 1 - - CDMEIF4 - write - - Clear - Clear the corresponding DMEIFx flag - 1 - - - - - CFEIF4 - Stream x clear FIFO error interrupt flag (x = 7..4) - 0 - 1 - - CFEIF4 - write - - Clear - Clear the corresponding CFEIFx flag - 1 - - - - - - - 8 - 0x18 - 0-7 - ST%s - Stream cluster: S?CR, S?NDTR, S?M0AR, S?M1AR and S?FCR registers - 0x10 - - CR - S0CR - stream x configuration register - 0x0 - 0x20 - read-write - 0x00000000 - - - CHSEL - Channel selection - 25 - 3 - - - 0 - 7 - - - - - MBURST - Memory burst transfer configuration - 23 - 2 - - - - PBURST - Peripheral burst transfer configuration - 21 - 2 - - PBURST - read-write - - Single - Single transfer - 0 - - - INCR4 - Incremental burst of 4 beats - 1 - - - INCR8 - Incremental burst of 8 beats - 2 - - - INCR16 - Incremental burst of 16 beats - 3 - - - - - CT - Current target (only in double buffer mode) - 19 - 1 - - CT - read-write - - Memory0 - The current target memory is Memory 0 - 0 - - - Memory1 - The current target memory is Memory 1 - 1 - - - - - DBM - Double buffer mode - 18 - 1 - - DBM - read-write - - Disabled - No buffer switching at the end of transfer - 0 - - - Enabled - Memory target switched at the end of the DMA transfer - 1 - - - - - PL - Priority level - 16 - 2 - - PL - read-write - - Low - Low - 0 - - - Medium - Medium - 1 - - - High - High - 2 - - - VeryHigh - Very high - 3 - - - - - PINCOS - Peripheral increment offset size - 15 - 1 - - PINCOS - read-write - - PSIZE - The offset size for the peripheral address calculation is linked to the PSIZE - 0 - - - Fixed4 - The offset size for the peripheral address calculation is fixed to 4 (32-bit alignment) - 1 - - - - - MSIZE - Memory data size - 13 - 2 - - - - PSIZE - Peripheral data size - 11 - 2 - - PSIZE - read-write - - Bits8 - Byte (8-bit) - 0 - - - Bits16 - Half-word (16-bit) - 1 - - - Bits32 - Word (32-bit) - 2 - - - - - MINC - Memory increment mode - 10 - 1 - - - - PINC - Peripheral increment mode - 9 - 1 - - PINC - read-write - - Fixed - Address pointer is fixed - 0 - - - Incremented - Address pointer is incremented after each data transfer - 1 - - - - - CIRC - Circular mode - 8 - 1 - - CIRC - read-write - - Disabled - Circular mode disabled - 0 - - - Enabled - Circular mode enabled - 1 - - - - - DIR - Data transfer direction - 6 - 2 - - DIR - read-write - - PeripheralToMemory - Peripheral-to-memory - 0 - - - MemoryToPeripheral - Memory-to-peripheral - 1 - - - MemoryToMemory - Memory-to-memory - 2 - - - - - PFCTRL - Peripheral flow controller - 5 - 1 - - PFCTRL - read-write - - DMA - The DMA is the flow controller - 0 - - - Peripheral - The peripheral is the flow controller - 1 - - - - - TCIE - Transfer complete interrupt enable - 4 - 1 - - TCIE - read-write - - Disabled - TC interrupt disabled - 0 - - - Enabled - TC interrupt enabled - 1 - - - - - HTIE - Half transfer interrupt enable - 3 - 1 - - HTIE - read-write - - Disabled - HT interrupt disabled - 0 - - - Enabled - HT interrupt enabled - 1 - - - - - TEIE - Transfer error interrupt enable - 2 - 1 - - TEIE - read-write - - Disabled - TE interrupt disabled - 0 - - - Enabled - TE interrupt enabled - 1 - - - - - DMEIE - Direct mode error interrupt enable - 1 - 1 - - DMEIE - read-write - - Disabled - DME interrupt disabled - 0 - - - Enabled - DME interrupt enabled - 1 - - - - - EN - Stream enable / flag stream ready when read low - 0 - 1 - - EN - read-write - - Disabled - Stream disabled - 0 - - - Enabled - Stream enabled - 1 - - - - - - - NDTR - S0NDTR - stream x number of data register - 0x4 - 0x20 - read-write - 0x00000000 - - - NDT - Number of data items to transfer - 0 - 16 - - - 0 - 65535 - - - - - - - PAR - S0PAR - stream x peripheral address register - 0x8 - 0x20 - read-write - 0x00000000 - - - PA - Peripheral address - 0 - 32 - - - - - M0AR - S0M0AR - stream x memory 0 address register - 0xC - 0x20 - read-write - 0x00000000 - - - M0A - Memory 0 address - 0 - 32 - - - - - M1AR - S0M1AR - stream x memory 1 address register - 0x10 - 0x20 - read-write - 0x00000000 - - - M1A - Memory 1 address (used in case of Double buffer mode) - 0 - 32 - - - - - FCR - S0FCR - stream x FIFO control register - 0x14 - 0x20 - 0x00000021 - - - FEIE - FIFO error interrupt enable - 7 - 1 - read-write - - FEIE - read-write - - Disabled - FE interrupt disabled - 0 - - - Enabled - FE interrupt enabled - 1 - - - - - FS - FIFO status - 3 - 3 - read-only - - FS - read - - Quarter1 - 0 < fifo_level < 1/4 - 0 - - - Quarter2 - 1/4 <= fifo_level < 1/2 - 1 - - - Quarter3 - 1/2 <= fifo_level < 3/4 - 2 - - - Quarter4 - 3/4 <= fifo_level < full - 3 - - - Empty - FIFO is empty - 4 - - - Full - FIFO is full - 5 - - - - - DMDIS - Direct mode disable - 2 - 1 - read-write - - DMDIS - read-write - - Enabled - Direct mode is enabled - 0 - - - Disabled - Direct mode is disabled - 1 - - - - - FTH - FIFO threshold selection - 0 - 2 - read-write - - FTH - read-write - - Quarter - 1/4 full FIFO - 0 - - - Half - 1/2 full FIFO - 1 - - - ThreeQuarters - 3/4 full FIFO - 2 - - - Full - Full FIFO - 3 - - - - - - - - - - DMA1 - 0x40026000 - - DMA1_Stream0 - DMA1 Stream0 global interrupt - 11 - - - DMA1_Stream1 - DMA1 Stream1 global interrupt - 12 - - - DMA1_Stream2 - DMA1 Stream2 global interrupt - 13 - - - DMA1_Stream3 - DMA1 Stream3 global interrupt - 14 - - - DMA1_Stream4 - DMA1 Stream4 global interrupt - 15 - - - DMA1_Stream5 - DMA1 Stream5 global interrupt - 16 - - - DMA1_Stream6 - DMA1 Stream6 global interrupt - 17 - - - DMA1_Stream7 - DMA1 Stream7 global interrupt - 47 - - - - RCC - Reset and clock control - RCC - 0x40023800 - - 0x0 - 0x400 - registers - - - RCC - RCC global interrupt - 5 - - - - CR - CR - clock control register - 0x0 - 0x20 - 0x00000083 - - - PLLI2SRDY - PLLI2S clock ready flag - 27 - 1 - read-only - - - - PLLI2SON - PLLI2S enable - 26 - 1 - read-write - - - - PLLRDY - Main PLL (PLL) clock ready flag - 25 - 1 - read-only - - - - PLLON - Main PLL (PLL) enable - 24 - 1 - read-write - - - - CSSON - Clock security system enable - 19 - 1 - read-write - - CSSON - read-write - - Off - Clock security system disabled (clock detector OFF) - 0 - - - On - Clock security system enable (clock detector ON if the HSE is ready, OFF if not) - 1 - - - - - HSEBYP - HSE clock bypass - 18 - 1 - read-write - - HSEBYP - read-write - - NotBypassed - HSE crystal oscillator not bypassed - 0 - - - Bypassed - HSE crystal oscillator bypassed with external clock - 1 - - - - - HSERDY - HSE clock ready flag - 17 - 1 - read-only - - - - HSEON - HSE clock enable - 16 - 1 - read-write - - - - HSICAL - Internal high-speed clock calibration - 8 - 8 - read-only - - - 0 - 255 - - - - - HSITRIM - Internal high-speed clock trimming - 3 - 5 - read-write - - - 0 - 31 - - - - - HSIRDY - Internal high-speed clock ready flag - 1 - 1 - read-only - - HSIRDYR - read - - NotReady - Clock not ready - 0 - - - Ready - Clock ready - 1 - - - - - HSION - Internal high-speed clock enable - 0 - 1 - read-write - - HSION - read-write - - Off - Clock Off - 0 - - - On - Clock On - 1 - - - - - PLLSAIRDY - PLLSAI clock ready flag - 29 - 1 - read-only - - - - PLLSAION - PLLSAI enable - 28 - 1 - read-write - - - - - - PLLCFGR - PLLCFGR - PLL configuration register - 0x4 - 0x20 - read-write - 0x24003010 - - - PLLSRC - Main PLL(PLL) and audio PLL (PLLI2S) entry clock source - 22 - 1 - - PLLSRC - read-write - - HSI - HSI clock selected as PLL and PLLI2S clock entry - 0 - - - HSE - HSE oscillator clock selected as PLL and PLLI2S clock entry - 1 - - - - - PLLM - Division factor for the main PLL (PLL) and audio PLL (PLLI2S) input clock - 0 - 6 - - - 2 - 63 - - - - - PLLN - Main PLL (PLL) multiplication factor for VCO - 6 - 9 - - - 50 - 432 - - - - - PLLP - Main PLL (PLL) division factor for main system clock - 16 - 2 - - PLLP - read-write - - Div2 - PLLP=2 - 0 - - - Div4 - PLLP=4 - 1 - - - Div6 - PLLP=6 - 2 - - - Div8 - PLLP=8 - 3 - - - - - PLLQ - Main PLL (PLL) division factor for USB OTG FS, SDIO and random number generator clocks - 24 - 4 - - - 2 - 15 - - - - - - - CFGR - CFGR - clock configuration register - 0x8 - 0x20 - 0x00000000 - - - MCO2 - Microcontroller clock output 2 - 30 - 2 - read-write - - MCO2 - read-write - - SYSCLK - System clock (SYSCLK) selected - 0 - - - PLLI2S - PLLI2S clock selected - 1 - - - HSE - HSE oscillator clock selected - 2 - - - PLL - PLL clock selected - 3 - - - - - MCO2PRE - MCO2 prescaler - 27 - 3 - read-write - - - - MCO1PRE - MCO1 prescaler - 24 - 3 - read-write - - MCO1PRE - read-write - - Div1 - No division - 0 - - - Div2 - Division by 2 - 4 - - - Div3 - Division by 3 - 5 - - - Div4 - Division by 4 - 6 - - - Div5 - Division by 5 - 7 - - - - - I2SSRC - I2S clock selection - 23 - 1 - read-write - - I2SSRC - read-write - - PLLI2S - PLLI2S clock used as I2S clock source - 0 - - - CKIN - External clock mapped on the I2S_CKIN pin used as I2S clock source - 1 - - - - - MCO1 - Microcontroller clock output 1 - 21 - 2 - read-write - - MCO1 - read-write - - HSI - HSI clock selected - 0 - - - LSE - LSE oscillator selected - 1 - - - HSE - HSE oscillator clock selected - 2 - - - PLL - PLL clock selected - 3 - - - - - RTCPRE - HSE division factor for RTC clock - 16 - 5 - read-write - - - 0 - 31 - - - - - PPRE2 - APB high-speed prescaler (APB2) - 13 - 3 - read-write - - - - PPRE1 - APB Low speed prescaler (APB1) - 10 - 3 - read-write - - PPRE1 - read-write - - Div1 - HCLK not divided - 0 - - - Div2 - HCLK divided by 2 - 4 - - - Div4 - HCLK divided by 4 - 5 - - - Div8 - HCLK divided by 8 - 6 - - - Div16 - HCLK divided by 16 - 7 - - - - - HPRE - AHB prescaler - 4 - 4 - read-write - - HPRE - read-write - - Div1 - SYSCLK not divided - 0 - - - Div2 - SYSCLK divided by 2 - 8 - - - Div4 - SYSCLK divided by 4 - 9 - - - Div8 - SYSCLK divided by 8 - 10 - - - Div16 - SYSCLK divided by 16 - 11 - - - Div64 - SYSCLK divided by 64 - 12 - - - Div128 - SYSCLK divided by 128 - 13 - - - Div256 - SYSCLK divided by 256 - 14 - - - Div512 - SYSCLK divided by 512 - 15 - - - - - SW - System clock switch - 0 - 2 - - SW - read-write - - HSI - HSI selected as system clock - 0 - - - HSE - HSE selected as system clock - 1 - - - PLL - PLL selected as system clock - 2 - - - - - SWS - System clock switch status - 2 - 2 - - SWSR - read - - HSI - HSI oscillator used as system clock - 0 - - - HSE - HSE oscillator used as system clock - 1 - - - PLL - PLL used as system clock - 2 - - - - - - - CIR - CIR - clock interrupt register - 0xC - 0x20 - 0x00000000 - - - CSSC - Clock security system interrupt clear - 23 - 1 - write-only - - CSSCW - write - - Clear - Clear CSSF flag - 1 - - - - - PLLSAIRDYC - PLLSAI Ready Interrupt Clear - 22 - 1 - write-only - - - - PLLI2SRDYC - PLLI2S ready interrupt clear - 21 - 1 - write-only - - - - PLLRDYC - Main PLL(PLL) ready interrupt clear - 20 - 1 - write-only - - - - HSERDYC - HSE ready interrupt clear - 19 - 1 - write-only - - - - HSIRDYC - HSI ready interrupt clear - 18 - 1 - write-only - - - - LSERDYC - LSE ready interrupt clear - 17 - 1 - write-only - - - - LSIRDYC - LSI ready interrupt clear - 16 - 1 - write-only - - LSIRDYCW - write - - Clear - Clear interrupt flag - 1 - - - - - PLLSAIRDYIE - PLLSAI Ready Interrupt Enable - 14 - 1 - read-write - - - - PLLI2SRDYIE - PLLI2S ready interrupt enable - 13 - 1 - read-write - - - - PLLRDYIE - Main PLL (PLL) ready interrupt enable - 12 - 1 - read-write - - - - HSERDYIE - HSE ready interrupt enable - 11 - 1 - read-write - - - - HSIRDYIE - HSI ready interrupt enable - 10 - 1 - read-write - - - - LSERDYIE - LSE ready interrupt enable - 9 - 1 - read-write - - - - LSIRDYIE - LSI ready interrupt enable - 8 - 1 - read-write - - LSIRDYIE - read-write - - Disabled - Interrupt disabled - 0 - - - Enabled - Interrupt enabled - 1 - - - - - CSSF - Clock security system interrupt flag - 7 - 1 - read-only - - CSSFR - read - - NotInterrupted - No clock security interrupt caused by HSE clock failure - 0 - - - Interrupted - Clock security interrupt caused by HSE clock failure - 1 - - - - - PLLSAIRDYF - PLLSAI ready interrupt flag - 6 - 1 - read-only - - - - PLLI2SRDYF - PLLI2S ready interrupt flag - 5 - 1 - read-only - - - - PLLRDYF - Main PLL (PLL) ready interrupt flag - 4 - 1 - read-only - - - - HSERDYF - HSE ready interrupt flag - 3 - 1 - read-only - - - - HSIRDYF - HSI ready interrupt flag - 2 - 1 - read-only - - - - LSERDYF - LSE ready interrupt flag - 1 - 1 - read-only - - - - LSIRDYF - LSI ready interrupt flag - 0 - 1 - read-only - - LSIRDYFR - read - - NotInterrupted - No clock ready interrupt - 0 - - - Interrupted - Clock ready interrupt - 1 - - - - - - - AHB1RSTR - AHB1RSTR - AHB1 peripheral reset register - 0x10 - 0x20 - read-write - 0x00000000 - - - OTGHSRST - USB OTG HS module reset - 29 - 1 - - - - ETHMACRST - Ethernet MAC reset - 25 - 1 - - - - DMA2DRST - DMA2D reset - 23 - 1 - - - - DMA2RST - DMA2 reset - 22 - 1 - - - - DMA1RST - DMA2 reset - 21 - 1 - - - - CRCRST - CRC reset - 12 - 1 - - - - GPIOKRST - IO port K reset - 10 - 1 - - - - GPIOJRST - IO port J reset - 9 - 1 - - - - GPIOIRST - IO port I reset - 8 - 1 - - - - GPIOHRST - IO port H reset - 7 - 1 - - - - GPIOGRST - IO port G reset - 6 - 1 - - - - GPIOFRST - IO port F reset - 5 - 1 - - - - GPIOERST - IO port E reset - 4 - 1 - - - - GPIODRST - IO port D reset - 3 - 1 - - - - GPIOCRST - IO port C reset - 2 - 1 - - - - GPIOBRST - IO port B reset - 1 - 1 - - - - GPIOARST - IO port A reset - 0 - 1 - - GPIOARST - read-write - - Reset - Reset the selected module - 1 - - - - - - - AHB2RSTR - AHB2RSTR - AHB2 peripheral reset register - 0x14 - 0x20 - read-write - 0x00000000 - - - OTGFSRST - USB OTG FS module reset - 7 - 1 - - - - RNGRST - Random number generator module reset - 6 - 1 - - - - HSAHRST - Hash module reset - 5 - 1 - - - - CRYPRST - Cryptographic module reset - 4 - 1 - - - - DCMIRST - Camera interface reset - 0 - 1 - - DCMIRST - read-write - - Reset - Reset the selected module - 1 - - - - - - - AHB3RSTR - AHB3RSTR - AHB3 peripheral reset register - 0x18 - 0x20 - read-write - 0x00000000 - - - FMCRST - Flexible memory controller module reset - 0 - 1 - - FMCRST - read-write - - Reset - Reset the selected module - 1 - - - - - QSPIRST - Quad SPI memory controller reset - 1 - 1 - - - - - - APB1RSTR - APB1RSTR - APB1 peripheral reset register - 0x20 - 0x20 - read-write - 0x00000000 - - - TIM2RST - TIM2 reset - 0 - 1 - - TIM2RST - read-write - - Reset - Reset the selected module - 1 - - - - - TIM3RST - TIM3 reset - 1 - 1 - - - - TIM4RST - TIM4 reset - 2 - 1 - - - - TIM5RST - TIM5 reset - 3 - 1 - - - - TIM6RST - TIM6 reset - 4 - 1 - - - - TIM7RST - TIM7 reset - 5 - 1 - - - - TIM12RST - TIM12 reset - 6 - 1 - - - - TIM13RST - TIM13 reset - 7 - 1 - - - - TIM14RST - TIM14 reset - 8 - 1 - - - - WWDGRST - Window watchdog reset - 11 - 1 - - - - SPI2RST - SPI 2 reset - 14 - 1 - - - - SPI3RST - SPI 3 reset - 15 - 1 - - - - USART2RST - USART 2 reset - 17 - 1 - - - - USART3RST - USART 3 reset - 18 - 1 - - - - UART4RST - USART 4 reset - 19 - 1 - - - - UART5RST - USART 5 reset - 20 - 1 - - - - I2C1RST - I2C 1 reset - 21 - 1 - - - - I2C2RST - I2C 2 reset - 22 - 1 - - - - I2C3RST - I2C3 reset - 23 - 1 - - - - CAN1RST - CAN1 reset - 25 - 1 - - - - CAN2RST - CAN2 reset - 26 - 1 - - - - PWRRST - Power interface reset - 28 - 1 - - - - DACRST - DAC reset - 29 - 1 - - - - UART7RST - UART7 reset - 30 - 1 - - - - UART8RST - UART8 reset - 31 - 1 - - - - SPDIFRXRST - SPDIF-RX reset - 16 - 1 - - - - CECRST - HDMI-CEC reset - 27 - 1 - - - - LPTIM1RST - Low power timer 1 reset - 9 - 1 - - - - I2C4RST - I2C 4 reset - 24 - 1 - - - - - - APB2RSTR - APB2RSTR - APB2 peripheral reset register - 0x24 - 0x20 - read-write - 0x00000000 - - - TIM1RST - TIM1 reset - 0 - 1 - - TIM1RST - read-write - - Reset - Reset the selected module - 1 - - - - - TIM8RST - TIM8 reset - 1 - 1 - - - - USART1RST - USART1 reset - 4 - 1 - - - - USART6RST - USART6 reset - 5 - 1 - - - - ADCRST - ADC interface reset (common to all ADCs) - 8 - 1 - - - - SPI1RST - SPI 1 reset - 12 - 1 - - - - SPI4RST - SPI4 reset - 13 - 1 - - - - SYSCFGRST - System configuration controller reset - 14 - 1 - - - - TIM9RST - TIM9 reset - 16 - 1 - - - - TIM10RST - TIM10 reset - 17 - 1 - - - - TIM11RST - TIM11 reset - 18 - 1 - - - - SPI5RST - SPI5 reset - 20 - 1 - - - - SPI6RST - SPI6 reset - 21 - 1 - - - - SAI1RST - SAI1 reset - 22 - 1 - - - - LTDCRST - LTDC reset - 26 - 1 - - - - SAI2RST - SAI2 reset - 23 - 1 - - - - SDMMC1RST - SDMMC1 reset - 11 - 1 - - - - - - AHB1ENR - AHB1ENR - AHB1 peripheral clock register - 0x30 - 0x20 - read-write - 0x00100000 - - - OTGHSULPIEN - USB OTG HSULPI clock enable - 30 - 1 - - - - OTGHSEN - USB OTG HS clock enable - 29 - 1 - - - - ETHMACPTPEN - Ethernet PTP clock enable - 28 - 1 - - - - ETHMACRXEN - Ethernet Reception clock enable - 27 - 1 - - - - ETHMACTXEN - Ethernet Transmission clock enable - 26 - 1 - - - - ETHMACEN - Ethernet MAC clock enable - 25 - 1 - - - - DMA2DEN - DMA2D clock enable - 23 - 1 - - - - DMA2EN - DMA2 clock enable - 22 - 1 - - - - DMA1EN - DMA1 clock enable - 21 - 1 - - - - DTCMRAMEN - CCM data RAM clock enable - 20 - 1 - - - - BKPSRAMEN - Backup SRAM interface clock enable - 18 - 1 - - - - CRCEN - CRC clock enable - 12 - 1 - - - - GPIOKEN - IO port K clock enable - 10 - 1 - - - - GPIOJEN - IO port J clock enable - 9 - 1 - - - - GPIOIEN - IO port I clock enable - 8 - 1 - - - - GPIOHEN - IO port H clock enable - 7 - 1 - - - - GPIOGEN - IO port G clock enable - 6 - 1 - - - - GPIOFEN - IO port F clock enable - 5 - 1 - - - - GPIOEEN - IO port E clock enable - 4 - 1 - - - - GPIODEN - IO port D clock enable - 3 - 1 - - - - GPIOCEN - IO port C clock enable - 2 - 1 - - - - GPIOBEN - IO port B clock enable - 1 - 1 - - - - GPIOAEN - IO port A clock enable - 0 - 1 - - GPIOAEN - read-write - - Disabled - The selected clock is disabled - 0 - - - Enabled - The selected clock is enabled - 1 - - - - - - - AHB2ENR - AHB2ENR - AHB2 peripheral clock enable register - 0x34 - 0x20 - read-write - 0x00000000 - - - OTGFSEN - USB OTG FS clock enable - 7 - 1 - - - - RNGEN - Random number generator clock enable - 6 - 1 - - - - HASHEN - Hash modules clock enable - 5 - 1 - - - - CRYPEN - Cryptographic modules clock enable - 4 - 1 - - - - DCMIEN - Camera interface enable - 0 - 1 - - DCMIEN - read-write - - Disabled - The selected clock is disabled - 0 - - - Enabled - The selected clock is enabled - 1 - - - - - - - AHB3ENR - AHB3ENR - AHB3 peripheral clock enable register - 0x38 - 0x20 - read-write - 0x00000000 - - - FMCEN - Flexible memory controller module clock enable - 0 - 1 - - FMCEN - read-write - - Disabled - The selected clock is disabled - 0 - - - Enabled - The selected clock is enabled - 1 - - - - - QSPIEN - Quad SPI memory controller clock enable - 1 - 1 - - - - - - APB1ENR - APB1ENR - APB1 peripheral clock enable register - 0x40 - 0x20 - read-write - 0x00000000 - - - TIM2EN - TIM2 clock enable - 0 - 1 - - TIM2EN - read-write - - Disabled - The selected clock is disabled - 0 - - - Enabled - The selected clock is enabled - 1 - - - - - TIM3EN - TIM3 clock enable - 1 - 1 - - - - TIM4EN - TIM4 clock enable - 2 - 1 - - - - TIM5EN - TIM5 clock enable - 3 - 1 - - - - TIM6EN - TIM6 clock enable - 4 - 1 - - - - TIM7EN - TIM7 clock enable - 5 - 1 - - - - TIM12EN - TIM12 clock enable - 6 - 1 - - - - TIM13EN - TIM13 clock enable - 7 - 1 - - - - TIM14EN - TIM14 clock enable - 8 - 1 - - - - WWDGEN - Window watchdog clock enable - 11 - 1 - - - - SPI2EN - SPI2 clock enable - 14 - 1 - - - - SPI3EN - SPI3 clock enable - 15 - 1 - - - - USART2EN - USART 2 clock enable - 17 - 1 - - - - USART3EN - USART3 clock enable - 18 - 1 - - - - UART4EN - UART4 clock enable - 19 - 1 - - - - UART5EN - UART5 clock enable - 20 - 1 - - - - I2C1EN - I2C1 clock enable - 21 - 1 - - - - I2C2EN - I2C2 clock enable - 22 - 1 - - - - I2C3EN - I2C3 clock enable - 23 - 1 - - - - CAN1EN - CAN 1 clock enable - 25 - 1 - - - - CAN2EN - CAN 2 clock enable - 26 - 1 - - - - PWREN - Power interface clock enable - 28 - 1 - - - - DACEN - DAC interface clock enable - 29 - 1 - - - - UART7EN - UART7 clock enable - 30 - 1 - - - - UART8EN - UART8 clock enable - 31 - 1 - - - - SPDIFRXEN - SPDIF-RX clock enable - 16 - 1 - - - - CECEN - HDMI-CEN clock enable - 27 - 1 - - - - LPTIM1EN - Low power timer 1 clock enable - 9 - 1 - - - - I2C4EN - I2C4 clock enable - 24 - 1 - - - - - - APB2ENR - APB2ENR - APB2 peripheral clock enable register - 0x44 - 0x20 - read-write - 0x00000000 - - - TIM1EN - TIM1 clock enable - 0 - 1 - - TIM1EN - read-write - - Disabled - The selected clock is disabled - 0 - - - Enabled - The selected clock is enabled - 1 - - - - - TIM8EN - TIM8 clock enable - 1 - 1 - - - - USART1EN - USART1 clock enable - 4 - 1 - - - - USART6EN - USART6 clock enable - 5 - 1 - - - - ADC1EN - ADC1 clock enable - 8 - 1 - - - - ADC2EN - ADC2 clock enable - 9 - 1 - - - - ADC3EN - ADC3 clock enable - 10 - 1 - - - - SPI1EN - SPI1 clock enable - 12 - 1 - - - - SPI4EN - SPI4 clock enable - 13 - 1 - - - - SYSCFGEN - System configuration controller clock enable - 14 - 1 - - - - TIM9EN - TIM9 clock enable - 16 - 1 - - - - TIM10EN - TIM10 clock enable - 17 - 1 - - - - TIM11EN - TIM11 clock enable - 18 - 1 - - - - SPI5EN - SPI5 clock enable - 20 - 1 - - - - SPI6EN - SPI6 clock enable - 21 - 1 - - - - SAI1EN - SAI1 clock enable - 22 - 1 - - - - LTDCEN - LTDC clock enable - 26 - 1 - - - - SAI2EN - SAI2 clock enable - 23 - 1 - - - - SDMMC1EN - SDMMC1 clock enable - 11 - 1 - - - - - - AHB1LPENR - AHB1LPENR - AHB1 peripheral clock enable in low power mode register - 0x50 - 0x20 - read-write - 0x7E6791FF - - - GPIOALPEN - IO port A clock enable during sleep mode - 0 - 1 - - GPIOALPEN - read-write - - DisabledInSleep - Selected module is disabled during Sleep mode - 0 - - - EnabledInSleep - Selected module is enabled during Sleep mode - 1 - - - - - GPIOBLPEN - IO port B clock enable during Sleep mode - 1 - 1 - - - - GPIOCLPEN - IO port C clock enable during Sleep mode - 2 - 1 - - - - GPIODLPEN - IO port D clock enable during Sleep mode - 3 - 1 - - - - GPIOELPEN - IO port E clock enable during Sleep mode - 4 - 1 - - - - GPIOFLPEN - IO port F clock enable during Sleep mode - 5 - 1 - - - - GPIOGLPEN - IO port G clock enable during Sleep mode - 6 - 1 - - - - GPIOHLPEN - IO port H clock enable during Sleep mode - 7 - 1 - - - - GPIOILPEN - IO port I clock enable during Sleep mode - 8 - 1 - - - - GPIOJLPEN - IO port J clock enable during Sleep mode - 9 - 1 - - - - GPIOKLPEN - IO port K clock enable during Sleep mode - 10 - 1 - - - - CRCLPEN - CRC clock enable during Sleep mode - 12 - 1 - - - - FLITFLPEN - Flash interface clock enable during Sleep mode - 15 - 1 - - - - SRAM1LPEN - SRAM 1interface clock enable during Sleep mode - 16 - 1 - - - - SRAM2LPEN - SRAM 2 interface clock enable during Sleep mode - 17 - 1 - - - - BKPSRAMLPEN - Backup SRAM interface clock enable during Sleep mode - 18 - 1 - - - - SRAM3LPEN - SRAM 3 interface clock enable during Sleep mode - 19 - 1 - - - - DMA1LPEN - DMA1 clock enable during Sleep mode - 21 - 1 - - - - DMA2LPEN - DMA2 clock enable during Sleep mode - 22 - 1 - - - - DMA2DLPEN - DMA2D clock enable during Sleep mode - 23 - 1 - - - - ETHMACLPEN - Ethernet MAC clock enable during Sleep mode - 25 - 1 - - - - ETHMACTXLPEN - Ethernet transmission clock enable during Sleep mode - 26 - 1 - - - - ETHMACRXLPEN - Ethernet reception clock enable during Sleep mode - 27 - 1 - - - - ETHMACPTPLPEN - Ethernet PTP clock enable during Sleep mode - 28 - 1 - - - - OTGHSLPEN - USB OTG HS clock enable during Sleep mode - 29 - 1 - - - - OTGHSULPILPEN - USB OTG HS ULPI clock enable during Sleep mode - 30 - 1 - - - - AXILPEN - AXI to AHB bridge clock enable during Sleep mode - 13 - 1 - - - DTCMLPEN - DTCM RAM interface clock enable during Sleep mode - 20 - 1 - - - - - AHB2LPENR - AHB2LPENR - AHB2 peripheral clock enable in low power mode register - 0x54 - 0x20 - read-write - 0x000000F1 - - - OTGFSLPEN - USB OTG FS clock enable during Sleep mode - 7 - 1 - - - - RNGLPEN - Random number generator clock enable during Sleep mode - 6 - 1 - - - - HASHLPEN - Hash modules clock enable during Sleep mode - 5 - 1 - - - - CRYPLPEN - Cryptography modules clock enable during Sleep mode - 4 - 1 - - - - DCMILPEN - Camera interface enable during Sleep mode - 0 - 1 - - DCMILPEN - read-write - - DisabledInSleep - Selected module is disabled during Sleep mode - 0 - - - EnabledInSleep - Selected module is enabled during Sleep mode - 1 - - - - - - - AHB3LPENR - AHB3LPENR - AHB3 peripheral clock enable in low power mode register - 0x58 - 0x20 - read-write - 0x00000001 - - - FMCLPEN - Flexible memory controller module clock enable during Sleep mode - 0 - 1 - - FMCLPEN - read-write - - DisabledInSleep - Selected module is disabled during Sleep mode - 0 - - - EnabledInSleep - Selected module is enabled during Sleep mode - 1 - - - - - QSPILPEN - Quand SPI memory controller clock enable during Sleep mode - 1 - 1 - - - - - - APB1LPENR - APB1LPENR - APB1 peripheral clock enable in low power mode register - 0x60 - 0x20 - read-write - 0x36FEC9FF - - - TIM2LPEN - TIM2 clock enable during Sleep mode - 0 - 1 - - TIM2LPEN - read-write - - DisabledInSleep - Selected module is disabled during Sleep mode - 0 - - - EnabledInSleep - Selected module is enabled during Sleep mode - 1 - - - - - TIM3LPEN - TIM3 clock enable during Sleep mode - 1 - 1 - - - - TIM4LPEN - TIM4 clock enable during Sleep mode - 2 - 1 - - - - TIM5LPEN - TIM5 clock enable during Sleep mode - 3 - 1 - - - - TIM6LPEN - TIM6 clock enable during Sleep mode - 4 - 1 - - - - TIM7LPEN - TIM7 clock enable during Sleep mode - 5 - 1 - - - - TIM12LPEN - TIM12 clock enable during Sleep mode - 6 - 1 - - - - TIM13LPEN - TIM13 clock enable during Sleep mode - 7 - 1 - - - - TIM14LPEN - TIM14 clock enable during Sleep mode - 8 - 1 - - - - WWDGLPEN - Window watchdog clock enable during Sleep mode - 11 - 1 - - - - SPI2LPEN - SPI2 clock enable during Sleep mode - 14 - 1 - - - - SPI3LPEN - SPI3 clock enable during Sleep mode - 15 - 1 - - - - USART2LPEN - USART2 clock enable during Sleep mode - 17 - 1 - - - - USART3LPEN - USART3 clock enable during Sleep mode - 18 - 1 - - - - UART4LPEN - UART4 clock enable during Sleep mode - 19 - 1 - - - - UART5LPEN - UART5 clock enable during Sleep mode - 20 - 1 - - - - I2C1LPEN - I2C1 clock enable during Sleep mode - 21 - 1 - - - - I2C2LPEN - I2C2 clock enable during Sleep mode - 22 - 1 - - - - I2C3LPEN - I2C3 clock enable during Sleep mode - 23 - 1 - - - - CAN1LPEN - CAN 1 clock enable during Sleep mode - 25 - 1 - - - - CAN2LPEN - CAN 2 clock enable during Sleep mode - 26 - 1 - - - - PWRLPEN - Power interface clock enable during Sleep mode - 28 - 1 - - - - DACLPEN - DAC interface clock enable during Sleep mode - 29 - 1 - - - - UART7LPEN - UART7 clock enable during Sleep mode - 30 - 1 - - - - UART8LPEN - UART8 clock enable during Sleep mode - 31 - 1 - - - - SPDIFRXLPEN - SPDIF-RX clock enable during sleep mode - 16 - 1 - - - - CECLPEN - HDMI-CEN clock enable during Sleep mode - 27 - 1 - - - - LPTIM1LPEN - low power timer 1 clock enable during Sleep mode - 9 - 1 - - - - I2C4LPEN - I2C4 clock enable during Sleep mode - 24 - 1 - - - - - - APB2LPENR - APB2LPENR - APB2 peripheral clock enabled in low power mode register - 0x64 - 0x20 - read-write - 0x00075F33 - - - TIM1LPEN - TIM1 clock enable during Sleep mode - 0 - 1 - - TIM1LPEN - read-write - - DisabledInSleep - Selected module is disabled during Sleep mode - 0 - - - EnabledInSleep - Selected module is enabled during Sleep mode - 1 - - - - - TIM8LPEN - TIM8 clock enable during Sleep mode - 1 - 1 - - - - USART1LPEN - USART1 clock enable during Sleep mode - 4 - 1 - - - - USART6LPEN - USART6 clock enable during Sleep mode - 5 - 1 - - - - ADC1LPEN - ADC1 clock enable during Sleep mode - 8 - 1 - - - - ADC2LPEN - ADC2 clock enable during Sleep mode - 9 - 1 - - - - ADC3LPEN - ADC 3 clock enable during Sleep mode - 10 - 1 - - - - SPI1LPEN - SPI 1 clock enable during Sleep mode - 12 - 1 - - - - SPI4LPEN - SPI 4 clock enable during Sleep mode - 13 - 1 - - - - SYSCFGLPEN - System configuration controller clock enable during Sleep mode - 14 - 1 - - - - TIM9LPEN - TIM9 clock enable during sleep mode - 16 - 1 - - - - TIM10LPEN - TIM10 clock enable during Sleep mode - 17 - 1 - - - - TIM11LPEN - TIM11 clock enable during Sleep mode - 18 - 1 - - - - SPI5LPEN - SPI 5 clock enable during Sleep mode - 20 - 1 - - - - SPI6LPEN - SPI 6 clock enable during Sleep mode - 21 - 1 - - - - SAI1LPEN - SAI1 clock enable during sleep mode - 22 - 1 - - - - LTDCLPEN - LTDC clock enable during sleep mode - 26 - 1 - - - - SAI2LPEN - SAI2 clock enable during sleep mode - 23 - 1 - - - - SDMMC1LPEN - SDMMC1 clock enable during Sleep mode - 11 - 1 - - - - - - BDCR - BDCR - Backup domain control register - 0x70 - 0x20 - 0x00000000 - - - BDRST - Backup domain software reset - 16 - 1 - read-write - - BDRST - read-write - - Disabled - Reset not activated - 0 - - - Enabled - Reset the entire RTC domain - 1 - - - - - RTCEN - RTC clock enable - 15 - 1 - read-write - - RTCEN - read-write - - Disabled - RTC clock disabled - 0 - - - Enabled - RTC clock enabled - 1 - - - - - LSEBYP - External low-speed oscillator bypass - 2 - 1 - read-write - - LSEBYP - read-write - - NotBypassed - LSE crystal oscillator not bypassed - 0 - - - Bypassed - LSE crystal oscillator bypassed with external clock - 1 - - - - - LSERDY - External low-speed oscillator ready - 1 - 1 - read-only - - LSERDYR - read - - NotReady - LSE oscillator not ready - 0 - - - Ready - LSE oscillator ready - 1 - - - - - LSEON - External low-speed oscillator enable - 0 - 1 - read-write - - LSEON - read-write - - Off - LSE oscillator Off - 0 - - - On - LSE oscillator On - 1 - - - - - LSEDRV - LSE oscillator drive capability - 3 - 2 - read-write - - LSEDRV - read-write - - Low - Low drive capacity - 0 - - - MediumHigh - Medium-high drive capacity - 1 - - - MediumLow - Medium-low drive capacity - 2 - - - High - High drive capacity - 3 - - - - - RTCSEL - RTC clock source selection - 8 - 2 - - RTCSEL - read-write - - NoClock - No clock - 0 - - - LSE - LSE oscillator clock used as RTC clock - 1 - - - LSI - LSI oscillator clock used as RTC clock - 2 - - - HSE - HSE oscillator clock divided by a prescaler used as RTC clock - 3 - - - - - - - CSR - CSR - clock control & status register - 0x74 - 0x20 - 0x0E000000 - - - LPWRRSTF - Low-power reset flag - 31 - 1 - read-write - - - - WWDGRSTF - Window watchdog reset flag - 30 - 1 - read-write - - - - WDGRSTF - Independent watchdog reset flag - 29 - 1 - read-write - - - - SFTRSTF - Software reset flag - 28 - 1 - read-write - - - - PORRSTF - POR/PDR reset flag - 27 - 1 - read-write - - - - PADRSTF - PIN reset flag - 26 - 1 - read-write - - - - BORRSTF - BOR reset flag - 25 - 1 - read-write - - BORRSTFR - read - - NoReset - No reset has occured - 0 - - - Reset - A reset has occured - 1 - - - - - RMVF - Remove reset flag - 24 - 1 - read-write - - RMVFW - write - - Clear - Clears the reset flag - 1 - - - - - LSIRDY - Internal low-speed oscillator ready - 1 - 1 - read-only - - LSIRDYR - read - - NotReady - LSI oscillator not ready - 0 - - - Ready - LSI oscillator ready - 1 - - - - - LSION - Internal low-speed oscillator enable - 0 - 1 - read-write - - LSION - read-write - - Off - LSI oscillator Off - 0 - - - On - LSI oscillator On - 1 - - - - - - - SSCGR - SSCGR - spread spectrum clock generation register - 0x80 - 0x20 - read-write - 0x00000000 - - - SSCGEN - Spread spectrum modulation enable - 31 - 1 - - SSCGEN - read-write - - Disabled - Spread spectrum modulation disabled - 0 - - - Enabled - Spread spectrum modulation enabled - 1 - - - - - SPREADSEL - Spread Select - 30 - 1 - - SPREADSEL - read-write - - Center - Center spread - 0 - - - Down - Down spread - 1 - - - - - INCSTEP - Incrementation step - 13 - 15 - - - 0 - 32767 - - - - - MODPER - Modulation period - 0 - 13 - - - 0 - 8191 - - - - - - - PLLI2SCFGR - PLLI2SCFGR - PLLI2S configuration register - 0x84 - 0x20 - read-write - 0x20003000 - - - PLLI2SR - PLLI2S division factor for I2S clocks - 28 - 3 - - - 2 - 7 - - - - - PLLI2SQ - PLLI2S division factor for SAI1 clock - 24 - 4 - - - 2 - 15 - - - - - PLLI2SN - PLLI2S multiplication factor for VCO - 6 - 9 - - - 50 - 432 - - - - - PLLI2SP - PLLI2S division factor for SPDIFRX clock - 16 - 2 - - PLLI2SP - read-write - - Div2 - PLL*P=2 - 0 - - - Div4 - PLL*P=4 - 1 - - - Div6 - PLL*P=6 - 2 - - - Div8 - PLL*P=8 - 3 - - - - - - - PLLSAICFGR - PLLSAICFGR - PLL configuration register - 0x88 - 0x20 - read-write - 0x20003000 - - - PLLSAIN - PLLSAI division factor for VCO - 6 - 9 - - - 50 - 432 - - - - - PLLSAIP - PLLSAI division factor for 48MHz clock - 16 - 2 - - PLLSAIP - read-write - - Div2 - PLL*P=2 - 0 - - - Div4 - PLL*P=4 - 1 - - - Div6 - PLL*P=6 - 2 - - - Div8 - PLL*P=8 - 3 - - - - - PLLSAIQ - PLLSAI division factor for SAI clock - 24 - 4 - - - 2 - 15 - - - - - PLLSAIR - PLLSAI division factor for LCD clock - 28 - 3 - - - 2 - 7 - - - - - - - DCKCFGR1 - DKCFGR1 - dedicated clocks configuration register - 0x8C - 0x20 - read-write - 0x00000000 - - - PLLI2SDIVQ - PLLI2S division factor for SAI1 clock - 0 - 5 - - PLLI2SDIVQ - read-write - - Div1 - PLLI2SDIVQ = /1 - 0 - - - Div2 - PLLI2SDIVQ = /2 - 1 - - - Div3 - PLLI2SDIVQ = /3 - 2 - - - Div4 - PLLI2SDIVQ = /4 - 3 - - - Div5 - PLLI2SDIVQ = /5 - 4 - - - Div6 - PLLI2SDIVQ = /6 - 5 - - - Div7 - PLLI2SDIVQ = /7 - 6 - - - Div8 - PLLI2SDIVQ = /8 - 7 - - - Div9 - PLLI2SDIVQ = /9 - 8 - - - Div10 - PLLI2SDIVQ = /10 - 9 - - - Div11 - PLLI2SDIVQ = /11 - 10 - - - Div12 - PLLI2SDIVQ = /12 - 11 - - - Div13 - PLLI2SDIVQ = /13 - 12 - - - Div14 - PLLI2SDIVQ = /14 - 13 - - - Div15 - PLLI2SDIVQ = /15 - 14 - - - Div16 - PLLI2SDIVQ = /16 - 15 - - - Div17 - PLLI2SDIVQ = /17 - 16 - - - Div18 - PLLI2SDIVQ = /18 - 17 - - - Div19 - PLLI2SDIVQ = /19 - 18 - - - Div20 - PLLI2SDIVQ = /20 - 19 - - - Div21 - PLLI2SDIVQ = /21 - 20 - - - Div22 - PLLI2SDIVQ = /22 - 21 - - - Div23 - PLLI2SDIVQ = /23 - 22 - - - Div24 - PLLI2SDIVQ = /24 - 23 - - - Div25 - PLLI2SDIVQ = /25 - 24 - - - Div26 - PLLI2SDIVQ = /26 - 25 - - - Div27 - PLLI2SDIVQ = /27 - 26 - - - Div28 - PLLI2SDIVQ = /28 - 27 - - - Div29 - PLLI2SDIVQ = /29 - 28 - - - Div30 - PLLI2SDIVQ = /30 - 29 - - - Div31 - PLLI2SDIVQ = /31 - 30 - - - Div32 - PLLI2SDIVQ = /32 - 31 - - - - - PLLSAIDIVQ - PLLSAI division factor for SAI1 clock - 8 - 5 - - PLLSAIDIVQ - read-write - - Div1 - PLLSAIDIVQ = /1 - 0 - - - Div2 - PLLSAIDIVQ = /2 - 1 - - - Div3 - PLLSAIDIVQ = /3 - 2 - - - Div4 - PLLSAIDIVQ = /4 - 3 - - - Div5 - PLLSAIDIVQ = /5 - 4 - - - Div6 - PLLSAIDIVQ = /6 - 5 - - - Div7 - PLLSAIDIVQ = /7 - 6 - - - Div8 - PLLSAIDIVQ = /8 - 7 - - - Div9 - PLLSAIDIVQ = /9 - 8 - - - Div10 - PLLSAIDIVQ = /10 - 9 - - - Div11 - PLLSAIDIVQ = /11 - 10 - - - Div12 - PLLSAIDIVQ = /12 - 11 - - - Div13 - PLLSAIDIVQ = /13 - 12 - - - Div14 - PLLSAIDIVQ = /14 - 13 - - - Div15 - PLLSAIDIVQ = /15 - 14 - - - Div16 - PLLSAIDIVQ = /16 - 15 - - - Div17 - PLLSAIDIVQ = /17 - 16 - - - Div18 - PLLSAIDIVQ = /18 - 17 - - - Div19 - PLLSAIDIVQ = /19 - 18 - - - Div20 - PLLSAIDIVQ = /20 - 19 - - - Div21 - PLLSAIDIVQ = /21 - 20 - - - Div22 - PLLSAIDIVQ = /22 - 21 - - - Div23 - PLLSAIDIVQ = /23 - 22 - - - Div24 - PLLSAIDIVQ = /24 - 23 - - - Div25 - PLLSAIDIVQ = /25 - 24 - - - Div26 - PLLSAIDIVQ = /26 - 25 - - - Div27 - PLLSAIDIVQ = /27 - 26 - - - Div28 - PLLSAIDIVQ = /28 - 27 - - - Div29 - PLLSAIDIVQ = /29 - 28 - - - Div30 - PLLSAIDIVQ = /30 - 29 - - - Div31 - PLLSAIDIVQ = /31 - 30 - - - Div32 - PLLSAIDIVQ = /32 - 31 - - - - - PLLSAIDIVR - division factor for LCD_CLK - 16 - 2 - - PLLSAIDIVR - read-write - - Div2 - PLLSAIDIVR = /2 - 0 - - - Div4 - PLLSAIDIVR = /4 - 1 - - - Div8 - PLLSAIDIVR = /8 - 2 - - - Div16 - PLLSAIDIVR = /16 - 3 - - - - - SAI1SEL - SAI1 clock source selection - 20 - 2 - - SAI1SEL - read-write - - PLLSAI - SAI1 clock frequency = f(PLLSAI_Q) / PLLSAIDIVQ - 0 - - - PLLI2S - SAI1 clock frequency = f(PLLI2S_Q) / PLLI2SDIVQ - 1 - - - AFIF - SAI1 clock frequency = Alternate function input frequency - 2 - - - HSI_HSE - SAI1 clock frequency = HSI or HSE - 3 - - - - - SAI2SEL - SAI2 clock source selection - 22 - 2 - - SAI2SEL - read-write - - PLLSAI - SAI2 clock frequency = f(PLLSAI_Q) / PLLSAIDIVQ - 0 - - - PLLI2S - SAI2 clock frequency = f(PLLI2S_Q) / PLLI2SDIVQ - 1 - - - AFIF - SAI2 clock frequency = Alternate function input frequency - 2 - - - HSI_HSE - SAI2 clock frequency = HSI or HSE - 3 - - - - - TIMPRE - Timers clocks prescalers selection - 24 - 1 - - TIMPRE - read-write - - Mul1Or2 - If the APB prescaler is configured 1, TIMxCLK = PCLKx. Otherwise, TIMxCLK = 2xPCLKx - 0 - - - Mul1Or4 - If the APB prescaler is configured 1, 2 or 4, TIMxCLK = HCLK. Otherwise, TIMxCLK = 4xPCLKx - 1 - - - - - - - DCKCFGR2 - DKCFGR2 - dedicated clocks configuration register - 0x90 - 0x20 - read-write - 0x00000000 - - - USART1SEL - USART 1 clock source selection - 0 - 2 - - USART1SEL - read-write - - APB2 - APB2 clock (PCLK2) is selected as USART clock - 0 - - - SYSCLK - System clock is selected as USART clock - 1 - - - HSI - HSI clock is selected as USART clock - 2 - - - LSE - LSE clock is selected as USART clock - 3 - - - - - USART2SEL - USART 2 clock source selection - 2 - 2 - - USART2SEL - read-write - - APB1 - APB1 clock (PCLK1) is selected as USART clock - 0 - - - SYSCLK - System clock is selected as USART clock - 1 - - - HSI - HSI clock is selected as USART clock - 2 - - - LSE - LSE clock is selected as USART clock - 3 - - - - - USART3SEL - USART 3 clock source selection - 4 - 2 - - - - UART4SEL - UART 4 clock source selection - 6 - 2 - - - - UART5SEL - UART 5 clock source selection - 8 - 2 - - - - USART6SEL - USART 6 clock source selection - 10 - 2 - - - - UART7SEL - UART 7 clock source selection - 12 - 2 - - - - UART8SEL - UART 8 clock source selection - 14 - 2 - - - - I2C1SEL - I2C1 clock source selection - 16 - 2 - - I2C1SEL - read-write - - APB - APB clock selected as I2C clock - 0 - - - SYSCLK - System clock selected as I2C clock - 1 - - - HSI - HSI clock selected as I2C clock - 2 - - - - - I2C2SEL - I2C2 clock source selection - 18 - 2 - - - - I2C3SEL - I2C3 clock source selection - 20 - 2 - - - - I2C4SEL - I2C4 clock source selection - 22 - 2 - - - - LPTIM1SEL - Low power timer 1 clock source selection - 24 - 2 - - LPTIM1SEL - read-write - - APB1 - APB1 clock (PCLK1) selected as LPTILM1 clock - 0 - - - LSI - LSI clock is selected as LPTILM1 clock - 1 - - - HSI - HSI clock is selected as LPTILM1 clock - 2 - - - LSE - LSE clock is selected as LPTILM1 clock - 3 - - - - - CECSEL - HDMI-CEC clock source selection - 26 - 1 - - CECSEL - read-write - - LSE - LSE clock is selected as HDMI-CEC clock - 0 - - - HSI_Div488 - HSI divided by 488 clock is selected as HDMI-CEC clock - 1 - - - - - CK48MSEL - 48MHz clock source selection - 27 - 1 - - CK48MSEL - read-write - - PLL - 48MHz clock from PLL is selected - 0 - - - PLLSAI - 48MHz clock from PLLSAI is selected - 1 - - - - - SDMMC1SEL - SDMMC clock source selection - 28 - 1 - - SDMMC1SEL - read-write - - CK48M - 48 MHz clock is selected as SD clock - 0 - - - SYSCLK - System clock is selected as SD clock - 1 - - - - - - - - - GPIOD - 0x40020C00 - - - GPIOC - 0x40020800 - - - GPIOK - 0x40022800 - - - GPIOJ - 0x40022400 - - - GPIOI - 0x40022000 - - - GPIOH - 0x40021C00 - - - GPIOG - 0x40021800 - - - GPIOF - 0x40021400 - - - GPIOE - 0x40021000 - - - GPIOB - 0x40020400 - - - GPIOA - General-purpose I/Os - GPIO - 0x40020000 - - 0x0 - 0x400 - registers - - - - MODER - MODER - GPIO port mode register - 0x0 - 0x20 - read-write - 0xA8000000 - - - MODER15 - Port x configuration bits (y = 0..15) - 30 - 2 - - - - MODER14 - Port x configuration bits (y = 0..15) - 28 - 2 - - - - MODER13 - Port x configuration bits (y = 0..15) - 26 - 2 - - - - MODER12 - Port x configuration bits (y = 0..15) - 24 - 2 - - - - MODER11 - Port x configuration bits (y = 0..15) - 22 - 2 - - - - MODER10 - Port x configuration bits (y = 0..15) - 20 - 2 - - - - MODER9 - Port x configuration bits (y = 0..15) - 18 - 2 - - - - MODER8 - Port x configuration bits (y = 0..15) - 16 - 2 - - - - MODER7 - Port x configuration bits (y = 0..15) - 14 - 2 - - - - MODER6 - Port x configuration bits (y = 0..15) - 12 - 2 - - - - MODER5 - Port x configuration bits (y = 0..15) - 10 - 2 - - - - MODER4 - Port x configuration bits (y = 0..15) - 8 - 2 - - - - MODER3 - Port x configuration bits (y = 0..15) - 6 - 2 - - - - MODER2 - Port x configuration bits (y = 0..15) - 4 - 2 - - - - MODER1 - Port x configuration bits (y = 0..15) - 2 - 2 - - - - MODER0 - Port x configuration bits (y = 0..15) - 0 - 2 - - MODER0 - read-write - - Input - Input mode (reset state) - 0 - - - Output - General purpose output mode - 1 - - - Alternate - Alternate function mode - 2 - - - Analog - Analog mode - 3 - - - - - - - OTYPER - OTYPER - GPIO port output type register - 0x4 - 0x20 - read-write - 0x00000000 - - - OT15 - Port x configuration bits (y = 0..15) - 15 - 1 - - - - OT14 - Port x configuration bits (y = 0..15) - 14 - 1 - - - - OT13 - Port x configuration bits (y = 0..15) - 13 - 1 - - - - OT12 - Port x configuration bits (y = 0..15) - 12 - 1 - - - - OT11 - Port x configuration bits (y = 0..15) - 11 - 1 - - - - OT10 - Port x configuration bits (y = 0..15) - 10 - 1 - - - - OT9 - Port x configuration bits (y = 0..15) - 9 - 1 - - - - OT8 - Port x configuration bits (y = 0..15) - 8 - 1 - - - - OT7 - Port x configuration bits (y = 0..15) - 7 - 1 - - - - OT6 - Port x configuration bits (y = 0..15) - 6 - 1 - - - - OT5 - Port x configuration bits (y = 0..15) - 5 - 1 - - - - OT4 - Port x configuration bits (y = 0..15) - 4 - 1 - - - - OT3 - Port x configuration bits (y = 0..15) - 3 - 1 - - - - OT2 - Port x configuration bits (y = 0..15) - 2 - 1 - - - - OT1 - Port x configuration bits (y = 0..15) - 1 - 1 - - - - OT0 - Port x configuration bits (y = 0..15) - 0 - 1 - - OT0 - read-write - - PushPull - Output push-pull (reset state) - 0 - - - OpenDrain - Output open-drain - 1 - - - - - - - OSPEEDR - GPIOB_OSPEEDR - GPIO port output speed register - 0x8 - 0x20 - read-write - 0x00000000 - - - OSPEEDR15 - Port x configuration bits (y = 0..15) - 30 - 2 - - - - OSPEEDR14 - Port x configuration bits (y = 0..15) - 28 - 2 - - - - OSPEEDR13 - Port x configuration bits (y = 0..15) - 26 - 2 - - - - OSPEEDR12 - Port x configuration bits (y = 0..15) - 24 - 2 - - - - OSPEEDR11 - Port x configuration bits (y = 0..15) - 22 - 2 - - - - OSPEEDR10 - Port x configuration bits (y = 0..15) - 20 - 2 - - - - OSPEEDR9 - Port x configuration bits (y = 0..15) - 18 - 2 - - - - OSPEEDR8 - Port x configuration bits (y = 0..15) - 16 - 2 - - - - OSPEEDR7 - Port x configuration bits (y = 0..15) - 14 - 2 - - - - OSPEEDR6 - Port x configuration bits (y = 0..15) - 12 - 2 - - - - OSPEEDR5 - Port x configuration bits (y = 0..15) - 10 - 2 - - - - OSPEEDR4 - Port x configuration bits (y = 0..15) - 8 - 2 - - - - OSPEEDR3 - Port x configuration bits (y = 0..15) - 6 - 2 - - - - OSPEEDR2 - Port x configuration bits (y = 0..15) - 4 - 2 - - - - OSPEEDR1 - Port x configuration bits (y = 0..15) - 2 - 2 - - - - OSPEEDR0 - Port x configuration bits (y = 0..15) - 0 - 2 - - OSPEEDR0 - read-write - - LowSpeed - Low speed - 0 - - - MediumSpeed - Medium speed - 1 - - - HighSpeed - High speed - 2 - - - VeryHighSpeed - Very high speed - 3 - - - - - - - PUPDR - PUPDR - GPIO port pull-up/pull-down register - 0xC - 0x20 - read-write - 0x64000000 - - - PUPDR15 - Port x configuration bits (y = 0..15) - 30 - 2 - - - - PUPDR14 - Port x configuration bits (y = 0..15) - 28 - 2 - - - - PUPDR13 - Port x configuration bits (y = 0..15) - 26 - 2 - - - - PUPDR12 - Port x configuration bits (y = 0..15) - 24 - 2 - - - - PUPDR11 - Port x configuration bits (y = 0..15) - 22 - 2 - - - - PUPDR10 - Port x configuration bits (y = 0..15) - 20 - 2 - - - - PUPDR9 - Port x configuration bits (y = 0..15) - 18 - 2 - - - - PUPDR8 - Port x configuration bits (y = 0..15) - 16 - 2 - - - - PUPDR7 - Port x configuration bits (y = 0..15) - 14 - 2 - - - - PUPDR6 - Port x configuration bits (y = 0..15) - 12 - 2 - - - - PUPDR5 - Port x configuration bits (y = 0..15) - 10 - 2 - - - - PUPDR4 - Port x configuration bits (y = 0..15) - 8 - 2 - - - - PUPDR3 - Port x configuration bits (y = 0..15) - 6 - 2 - - - - PUPDR2 - Port x configuration bits (y = 0..15) - 4 - 2 - - - - PUPDR1 - Port x configuration bits (y = 0..15) - 2 - 2 - - - - PUPDR0 - Port x configuration bits (y = 0..15) - 0 - 2 - - PUPDR0 - read-write - - Floating - No pull-up, pull-down - 0 - - - PullUp - Pull-up - 1 - - - PullDown - Pull-down - 2 - - - - - - - IDR - IDR - GPIO port input data register - 0x10 - 0x20 - read-only - 0x00000000 - - - IDR15 - Port input data (y = 0..15) - 15 - 1 - - - - IDR14 - Port input data (y = 0..15) - 14 - 1 - - - - IDR13 - Port input data (y = 0..15) - 13 - 1 - - - - IDR12 - Port input data (y = 0..15) - 12 - 1 - - - - IDR11 - Port input data (y = 0..15) - 11 - 1 - - - - IDR10 - Port input data (y = 0..15) - 10 - 1 - - - - IDR9 - Port input data (y = 0..15) - 9 - 1 - - - - IDR8 - Port input data (y = 0..15) - 8 - 1 - - - - IDR7 - Port input data (y = 0..15) - 7 - 1 - - - - IDR6 - Port input data (y = 0..15) - 6 - 1 - - - - IDR5 - Port input data (y = 0..15) - 5 - 1 - - - - IDR4 - Port input data (y = 0..15) - 4 - 1 - - - - IDR3 - Port input data (y = 0..15) - 3 - 1 - - - - IDR2 - Port input data (y = 0..15) - 2 - 1 - - - - IDR1 - Port input data (y = 0..15) - 1 - 1 - - - - IDR0 - Port input data (y = 0..15) - 0 - 1 - - IDR0 - read - - Low - Input is logic low - 0 - - - High - Input is logic high - 1 - - - - - - - ODR - ODR - GPIO port output data register - 0x14 - 0x20 - read-write - 0x00000000 - - - ODR15 - Port output data (y = 0..15) - 15 - 1 - - - - ODR14 - Port output data (y = 0..15) - 14 - 1 - - - - ODR13 - Port output data (y = 0..15) - 13 - 1 - - - - ODR12 - Port output data (y = 0..15) - 12 - 1 - - - - ODR11 - Port output data (y = 0..15) - 11 - 1 - - - - ODR10 - Port output data (y = 0..15) - 10 - 1 - - - - ODR9 - Port output data (y = 0..15) - 9 - 1 - - - - ODR8 - Port output data (y = 0..15) - 8 - 1 - - - - ODR7 - Port output data (y = 0..15) - 7 - 1 - - - - ODR6 - Port output data (y = 0..15) - 6 - 1 - - - - ODR5 - Port output data (y = 0..15) - 5 - 1 - - - - ODR4 - Port output data (y = 0..15) - 4 - 1 - - - - ODR3 - Port output data (y = 0..15) - 3 - 1 - - - - ODR2 - Port output data (y = 0..15) - 2 - 1 - - - - ODR1 - Port output data (y = 0..15) - 1 - 1 - - - - ODR0 - Port output data (y = 0..15) - 0 - 1 - - ODR0 - read-write - - Low - Set output to logic low - 0 - - - High - Set output to logic high - 1 - - - - - - - BSRR - BSRR - GPIO port bit set/reset register - 0x18 - 0x20 - write-only - 0x00000000 - - - BR15 - Port x reset bit y (y = 0..15) - 31 - 1 - - - - BR14 - Port x reset bit y (y = 0..15) - 30 - 1 - - - - BR13 - Port x reset bit y (y = 0..15) - 29 - 1 - - - - BR12 - Port x reset bit y (y = 0..15) - 28 - 1 - - - - BR11 - Port x reset bit y (y = 0..15) - 27 - 1 - - - - BR10 - Port x reset bit y (y = 0..15) - 26 - 1 - - - - BR9 - Port x reset bit y (y = 0..15) - 25 - 1 - - - - BR8 - Port x reset bit y (y = 0..15) - 24 - 1 - - - - BR7 - Port x reset bit y (y = 0..15) - 23 - 1 - - - - BR6 - Port x reset bit y (y = 0..15) - 22 - 1 - - - - BR5 - Port x reset bit y (y = 0..15) - 21 - 1 - - - - BR4 - Port x reset bit y (y = 0..15) - 20 - 1 - - - - BR3 - Port x reset bit y (y = 0..15) - 19 - 1 - - - - BR2 - Port x reset bit y (y = 0..15) - 18 - 1 - - - - BR1 - Port x reset bit y (y = 0..15) - 17 - 1 - - - - BR0 - Port x set bit y (y= 0..15) - 16 - 1 - - BR0W - write - - Reset - Resets the corresponding ODRx bit - 1 - - - - - BS15 - Port x set bit y (y= 0..15) - 15 - 1 - - - - BS14 - Port x set bit y (y= 0..15) - 14 - 1 - - - - BS13 - Port x set bit y (y= 0..15) - 13 - 1 - - - - BS12 - Port x set bit y (y= 0..15) - 12 - 1 - - - - BS11 - Port x set bit y (y= 0..15) - 11 - 1 - - - - BS10 - Port x set bit y (y= 0..15) - 10 - 1 - - - - BS9 - Port x set bit y (y= 0..15) - 9 - 1 - - - - BS8 - Port x set bit y (y= 0..15) - 8 - 1 - - - - BS7 - Port x set bit y (y= 0..15) - 7 - 1 - - - - BS6 - Port x set bit y (y= 0..15) - 6 - 1 - - - - BS5 - Port x set bit y (y= 0..15) - 5 - 1 - - - - BS4 - Port x set bit y (y= 0..15) - 4 - 1 - - - - BS3 - Port x set bit y (y= 0..15) - 3 - 1 - - - - BS2 - Port x set bit y (y= 0..15) - 2 - 1 - - - - BS1 - Port x set bit y (y= 0..15) - 1 - 1 - - - - BS0 - Port x set bit y (y= 0..15) - 0 - 1 - - BS0W - write - - Set - Sets the corresponding ODRx bit - 1 - - - - - - - LCKR - LCKR - GPIO port configuration lock register - 0x1C - 0x20 - read-write - 0x00000000 - - - LCKK - Port x lock bit y (y= 0..15) - 16 - 1 - - LCKK - read-write - - NotActive - Port configuration lock key not active - 0 - - - Active - Port configuration lock key active - 1 - - - - - LCK15 - Port x lock bit y (y= 0..15) - 15 - 1 - - - - LCK14 - Port x lock bit y (y= 0..15) - 14 - 1 - - - - LCK13 - Port x lock bit y (y= 0..15) - 13 - 1 - - - - LCK12 - Port x lock bit y (y= 0..15) - 12 - 1 - - - - LCK11 - Port x lock bit y (y= 0..15) - 11 - 1 - - - - LCK10 - Port x lock bit y (y= 0..15) - 10 - 1 - - - - LCK9 - Port x lock bit y (y= 0..15) - 9 - 1 - - - - LCK8 - Port x lock bit y (y= 0..15) - 8 - 1 - - - - LCK7 - Port x lock bit y (y= 0..15) - 7 - 1 - - - - LCK6 - Port x lock bit y (y= 0..15) - 6 - 1 - - - - LCK5 - Port x lock bit y (y= 0..15) - 5 - 1 - - - - LCK4 - Port x lock bit y (y= 0..15) - 4 - 1 - - - - LCK3 - Port x lock bit y (y= 0..15) - 3 - 1 - - - - LCK2 - Port x lock bit y (y= 0..15) - 2 - 1 - - - - LCK1 - Port x lock bit y (y= 0..15) - 1 - 1 - - - - LCK0 - Port x lock bit y (y= 0..15) - 0 - 1 - - LCK0 - read-write - - Unlocked - Port configuration not locked - 0 - - - Locked - Port configuration locked - 1 - - - - - - - AFRL - AFRL - GPIO alternate function low register - 0x20 - 0x20 - read-write - 0x00000000 - - - AFRL7 - Alternate function selection for port x bit y (y = 0..7) - 28 - 4 - - - - AFRL6 - Alternate function selection for port x bit y (y = 0..7) - 24 - 4 - - - - AFRL5 - Alternate function selection for port x bit y (y = 0..7) - 20 - 4 - - - - AFRL4 - Alternate function selection for port x bit y (y = 0..7) - 16 - 4 - - - - AFRL3 - Alternate function selection for port x bit y (y = 0..7) - 12 - 4 - - - - AFRL2 - Alternate function selection for port x bit y (y = 0..7) - 8 - 4 - - - - AFRL1 - Alternate function selection for port x bit y (y = 0..7) - 4 - 4 - - - - AFRL0 - Alternate function selection for port x bit y (y = 0..7) - 0 - 4 - - AFRL0 - read-write - - AF0 - AF0 - 0 - - - AF1 - AF1 - 1 - - - AF2 - AF2 - 2 - - - AF3 - AF3 - 3 - - - AF4 - AF4 - 4 - - - AF5 - AF5 - 5 - - - AF6 - AF6 - 6 - - - AF7 - AF7 - 7 - - - AF8 - AF8 - 8 - - - AF9 - AF9 - 9 - - - AF10 - AF10 - 10 - - - AF11 - AF11 - 11 - - - AF12 - AF12 - 12 - - - AF13 - AF13 - 13 - - - AF14 - AF14 - 14 - - - AF15 - AF15 - 15 - - - - - - - AFRH - AFRH - GPIO alternate function high register - 0x24 - 0x20 - read-write - 0x00000000 - - - AFRH15 - Alternate function selection for port x bit y (y = 8..15) - 28 - 4 - - - - AFRH14 - Alternate function selection for port x bit y (y = 8..15) - 24 - 4 - - - - AFRH13 - Alternate function selection for port x bit y (y = 8..15) - 20 - 4 - - - - AFRH12 - Alternate function selection for port x bit y (y = 8..15) - 16 - 4 - - - - AFRH11 - Alternate function selection for port x bit y (y = 8..15) - 12 - 4 - - - - AFRH10 - Alternate function selection for port x bit y (y = 8..15) - 8 - 4 - - - - AFRH9 - Alternate function selection for port x bit y (y = 8..15) - 4 - 4 - - - - AFRH8 - Alternate function selection for port x bit y (y = 8..15) - 0 - 4 - - AFRH8 - read-write - - AF0 - AF0 - 0 - - - AF1 - AF1 - 1 - - - AF2 - AF2 - 2 - - - AF3 - AF3 - 3 - - - AF4 - AF4 - 4 - - - AF5 - AF5 - 5 - - - AF6 - AF6 - 6 - - - AF7 - AF7 - 7 - - - AF8 - AF8 - 8 - - - AF9 - AF9 - 9 - - - AF10 - AF10 - 10 - - - AF11 - AF11 - 11 - - - AF12 - AF12 - 12 - - - AF13 - AF13 - 13 - - - AF14 - AF14 - 14 - - - AF15 - AF15 - 15 - - - - - - - BRR - BRR - GPIO port bit reset register - 0x28 - 0x20 - read-write - 0x00000000 - - - BR0 - Port A Reset bit 0 - 0 - 1 - - - BR1 - Port A Reset bit 1 - 1 - 1 - - - BR2 - Port A Reset bit 2 - 2 - 1 - - - BR3 - Port A Reset bit 3 - 3 - 1 - - - BR4 - Port A Reset bit 4 - 4 - 1 - - - BR5 - Port A Reset bit 5 - 5 - 1 - - - BR6 - Port A Reset bit 6 - 6 - 1 - - - BR7 - Port A Reset bit 7 - 7 - 1 - - - BR8 - Port A Reset bit 8 - 8 - 1 - - - BR9 - Port A Reset bit 9 - 9 - 1 - - - BR10 - Port A Reset bit 10 - 10 - 1 - - - BR11 - Port A Reset bit 11 - 11 - 1 - - - BR12 - Port A Reset bit 12 - 12 - 1 - - - BR13 - Port A Reset bit 13 - 13 - 1 - - - BR14 - Port A Reset bit 14 - 14 - 1 - - - BR15 - Port A Reset bit 15 - 15 - 1 - - - - - - - SYSCFG - System configuration controller - SYSCFG - 0x40013800 - - 0x0 - 0x400 - registers - - - - MEMRMP - MEMRM - memory remap register - 0x0 - 0x20 - read-write - 0x00000000 - - - MEM_BOOT - Memory mapping selection - 0 - 1 - - - SWP_FMC - FMC memory mapping swap - 10 - 2 - - - - - PMC - PMC - peripheral mode configuration register - 0x4 - 0x20 - read-write - 0x00000000 - - - MII_RMII_SEL - Ethernet PHY interface selection - 23 - 1 - - - ADC1DC2 - ADC1DC2 - 16 - 1 - - - ADC2DC2 - ADC2DC2 - 17 - 1 - - - ADC3DC2 - ADC3DC2 - 18 - 1 - - - - - EXTICR1 - EXTICR1 - external interrupt configuration register 1 - 0x8 - 0x20 - read-write - 0x00000000 - - - EXTI3 - EXTI x configuration (x = 0 to 3) - 12 - 4 - - - EXTI2 - EXTI x configuration (x = 0 to 3) - 8 - 4 - - - EXTI1 - EXTI x configuration (x = 0 to 3) - 4 - 4 - - - EXTI0 - EXTI x configuration (x = 0 to 3) - 0 - 4 - - - - - EXTICR2 - EXTICR2 - external interrupt configuration register 2 - 0xC - 0x20 - read-write - 0x00000000 - - - EXTI7 - EXTI x configuration (x = 4 to 7) - 12 - 4 - - - EXTI6 - EXTI x configuration (x = 4 to 7) - 8 - 4 - - - EXTI5 - EXTI x configuration (x = 4 to 7) - 4 - 4 - - - EXTI4 - EXTI x configuration (x = 4 to 7) - 0 - 4 - - - - - EXTICR3 - EXTICR3 - external interrupt configuration register 3 - 0x10 - 0x20 - read-write - 0x00000000 - - - EXTI11 - EXTI x configuration (x = 8 to 11) - 12 - 4 - - - EXTI10 - EXTI10 - 8 - 4 - - - EXTI9 - EXTI x configuration (x = 8 to 11) - 4 - 4 - - - EXTI8 - EXTI x configuration (x = 8 to 11) - 0 - 4 - - - - - EXTICR4 - EXTICR4 - external interrupt configuration register 4 - 0x14 - 0x20 - read-write - 0x00000000 - - - EXTI15 - EXTI x configuration (x = 12 to 15) - 12 - 4 - - - EXTI14 - EXTI x configuration (x = 12 to 15) - 8 - 4 - - - EXTI13 - EXTI x configuration (x = 12 to 15) - 4 - 4 - - - EXTI12 - EXTI x configuration (x = 12 to 15) - 0 - 4 - - - - - CMPCR - CMPCR - Compensation cell control register - 0x20 - 0x20 - read-only - 0x00000000 - - - READY - READY - 8 - 1 - - - CMP_PD - Compensation cell power-down - 0 - 1 - - - - - - - SPI1 - Serial peripheral interface - SPI - 0x40013000 - - 0x0 - 0x400 - registers - - - SPI1 - SPI1 global interrupt - 35 - - - - CR1 - CR1 - control register 1 - 0x0 - 0x20 - read-write - 0x00000000 - - - BIDIMODE - Bidirectional data mode enable - 15 - 1 - - BIDIMODE - read-write - - Unidirectional - 2-line unidirectional data mode selected - 0 - - - Bidirectional - 1-line bidirectional data mode selected - 1 - - - - - BIDIOE - Output enable in bidirectional mode - 14 - 1 - - BIDIOE - read-write - - OutputDisabled - Output disabled (receive-only mode) - 0 - - - OutputEnabled - Output enabled (transmit-only mode) - 1 - - - - - CRCEN - Hardware CRC calculation enable - 13 - 1 - - CRCEN - read-write - - Disabled - CRC calculation disabled - 0 - - - Enabled - CRC calculation enabled - 1 - - - - - CRCNEXT - CRC transfer next - 12 - 1 - - CRCNEXT - read-write - - TxBuffer - Next transmit value is from Tx buffer - 0 - - - CRC - Next transmit value is from Tx CRC register - 1 - - - - - CRCL - CRC length - 11 - 1 - - CRCL - read-write - - EightBit - 8-bit CRC length - 0 - - - SixteenBit - 16-bit CRC length - 1 - - - - - RXONLY - Receive only - 10 - 1 - - RXONLY - read-write - - FullDuplex - Full duplex (Transmit and receive) - 0 - - - OutputDisabled - Output disabled (Receive-only mode) - 1 - - - - - SSM - Software slave management - 9 - 1 - - SSM - read-write - - Disabled - Software slave management disabled - 0 - - - Enabled - Software slave management enabled - 1 - - - - - SSI - Internal slave select - 8 - 1 - - SSI - read-write - - SlaveSelected - 0 is forced onto the NSS pin and the I/O value of the NSS pin is ignored - 0 - - - SlaveNotSelected - 1 is forced onto the NSS pin and the I/O value of the NSS pin is ignored - 1 - - - - - LSBFIRST - Frame format - 7 - 1 - - LSBFIRST - read-write - - MSBFirst - Data is transmitted/received with the MSB first - 0 - - - LSBFirst - Data is transmitted/received with the LSB first - 1 - - - - - SPE - SPI enable - 6 - 1 - - SPE - read-write - - Disabled - Peripheral disabled - 0 - - - Enabled - Peripheral enabled - 1 - - - - - BR - Baud rate control - 3 - 3 - - BR - read-write - - Div2 - f_PCLK / 2 - 0 - - - Div4 - f_PCLK / 4 - 1 - - - Div8 - f_PCLK / 8 - 2 - - - Div16 - f_PCLK / 16 - 3 - - - Div32 - f_PCLK / 32 - 4 - - - Div64 - f_PCLK / 64 - 5 - - - Div128 - f_PCLK / 128 - 6 - - - Div256 - f_PCLK / 256 - 7 - - - - - MSTR - Master selection - 2 - 1 - - MSTR - read-write - - Slave - Slave configuration - 0 - - - Master - Master configuration - 1 - - - - - CPOL - Clock polarity - 1 - 1 - - CPOL - read-write - - IdleLow - CK to 0 when idle - 0 - - - IdleHigh - CK to 1 when idle - 1 - - - - - CPHA - Clock phase - 0 - 1 - - CPHA - read-write - - FirstEdge - The first clock transition is the first data capture edge - 0 - - - SecondEdge - The second clock transition is the first data capture edge - 1 - - - - - - - CR2 - CR2 - control register 2 - 0x4 - 0x20 - read-write - 0x00000700 - - - RXDMAEN - Rx buffer DMA enable - 0 - 1 - - RXDMAEN - read-write - - Disabled - Rx buffer DMA disabled - 0 - - - Enabled - Rx buffer DMA enabled - 1 - - - - - TXDMAEN - Tx buffer DMA enable - 1 - 1 - - TXDMAEN - read-write - - Disabled - Tx buffer DMA disabled - 0 - - - Enabled - Tx buffer DMA enabled - 1 - - - - - SSOE - SS output enable - 2 - 1 - - SSOE - read-write - - Disabled - SS output is disabled in master mode - 0 - - - Enabled - SS output is enabled in master mode - 1 - - - - - NSSP - NSS pulse management - 3 - 1 - - NSSP - read-write - - NoPulse - No NSS pulse - 0 - - - PulseGenerated - NSS pulse generated - 1 - - - - - FRF - Frame format - 4 - 1 - - FRF - read-write - - Motorola - SPI Motorola mode - 0 - - - TI - SPI TI mode - 1 - - - - - ERRIE - Error interrupt enable - 5 - 1 - - ERRIE - read-write - - Masked - Error interrupt masked - 0 - - - NotMasked - Error interrupt not masked - 1 - - - - - RXNEIE - RX buffer not empty interrupt enable - 6 - 1 - - RXNEIE - read-write - - Masked - RXE interrupt masked - 0 - - - NotMasked - RXE interrupt not masked - 1 - - - - - TXEIE - Tx buffer empty interrupt enable - 7 - 1 - - TXEIE - read-write - - Masked - TXE interrupt masked - 0 - - - NotMasked - TXE interrupt not masked - 1 - - - - - DS - Data size - 8 - 4 - - DS - read-write - - FourBit - 4-bit - 3 - - - FiveBit - 5-bit - 4 - - - SixBit - 6-bit - 5 - - - SevenBit - 7-bit - 6 - - - EightBit - 8-bit - 7 - - - NineBit - 9-bit - 8 - - - TenBit - 10-bit - 9 - - - ElevenBit - 11-bit - 10 - - - TwelveBit - 12-bit - 11 - - - ThirteenBit - 13-bit - 12 - - - FourteenBit - 14-bit - 13 - - - FifteenBit - 15-bit - 14 - - - SixteenBit - 16-bit - 15 - - - - - FRXTH - FIFO reception threshold - 12 - 1 - - FRXTH - read-write - - Half - RXNE event is generated if the FIFO level is greater than or equal to 1/2 (16-bit) - 0 - - - Quarter - RXNE event is generated if the FIFO level is greater than or equal to 1/4 (8-bit) - 1 - - - - - LDMA_RX - Last DMA transfer for reception - 13 - 1 - - LDMA_RX - read-write - - Even - Number of data to transfer for receive is even - 0 - - - Odd - Number of data to transfer for receive is odd - 1 - - - - - LDMA_TX - Last DMA transfer for transmission - 14 - 1 - - LDMA_TX - read-write - - Even - Number of data to transfer for transmit is even - 0 - - - Odd - Number of data to transfer for transmit is odd - 1 - - - - - - - SR - SR - status register - 0x8 - 0x20 - 0x00000002 - - - FRE - Frame format error - 8 - 1 - read-only - - FRER - read - - NoError - No frame format error - 0 - - - Error - A frame format error occurred - 1 - - - - - BSY - Busy flag - 7 - 1 - read-only - - BSYR - read - - NotBusy - SPI not busy - 0 - - - Busy - SPI busy - 1 - - - - - OVR - Overrun flag - 6 - 1 - read-only - - OVRR - read - - NoOverrun - No overrun occurred - 0 - - - Overrun - Overrun occurred - 1 - - - - - MODF - Mode fault - 5 - 1 - read-only - - MODFR - read - - NoFault - No mode fault occurred - 0 - - - Fault - Mode fault occurred - 1 - - - - - CRCERR - CRC error flag - 4 - 1 - read-write - zeroToClear - - CRCERRR - read - - Match - CRC value received matches the SPIx_RXCRCR value - 0 - - - NoMatch - CRC value received does not match the SPIx_RXCRCR value - 1 - - - - CRCERRW - write - - Clear - Clear flag - 0 - - - - - UDR - Underrun flag - 3 - 1 - read-only - - UDRR - read - - NoUnderrun - No underrun occurred - 0 - - - Underrun - Underrun occurred - 1 - - - - - CHSIDE - Channel side - 2 - 1 - read-only - - CHSIDE - read - - Left - Channel left has to be transmitted or has been received - 0 - - - Right - Channel right has to be transmitted or has been received - 1 - - - - - TXE - Transmit buffer empty - 1 - 1 - read-only - - TXE - read - - NotEmpty - Tx buffer not empty - 0 - - - Empty - Tx buffer empty - 1 - - - - - RXNE - Receive buffer not empty - 0 - 1 - read-only - - RXNE - read - - Empty - Rx buffer empty - 0 - - - NotEmpty - Rx buffer not empty - 1 - - - - - FRLVL - FIFO reception level - 9 - 2 - read-only - - FRLVLR - read - - Empty - Rx FIFO Empty - 0 - - - Quarter - Rx 1/4 FIFO - 1 - - - Half - Rx 1/2 FIFO - 2 - - - Full - Rx FIFO full - 3 - - - - - FTLVL - FIFO Transmission Level - 11 - 2 - read-only - - FTLVLR - read - - Empty - Tx FIFO Empty - 0 - - - Quarter - Tx 1/4 FIFO - 1 - - - Half - Tx 1/2 FIFO - 2 - - - Full - Tx FIFO full - 3 - - - - - - - DR - DR - data register - 0xC - 0x20 - read-write - 0x00000000 - - - DR - Data register - 0 - 16 - - - 0 - 65535 - - - - - - - CRCPR - CRCPR - CRC polynomial register - 0x10 - 0x20 - read-write - 0x00000007 - - - CRCPOLY - CRC polynomial register - 0 - 16 - - - 0 - 65535 - - - - - - - RXCRCR - RXCRCR - RX CRC register - 0x14 - 0x20 - read-only - 0x00000000 - - - RxCRC - Rx CRC register - 0 - 16 - - - 0 - 65535 - - - - - - - TXCRCR - TXCRCR - TX CRC register - 0x18 - 0x20 - read-only - 0x00000000 - - - TxCRC - Tx CRC register - 0 - 16 - - - 0 - 65535 - - - - - - - I2SCFGR - I2SCFGR - I2S configuration register - 0x1C - 0x20 - read-write - 0x00000000 - - - I2SMOD - I2S mode selection - 11 - 1 - - I2SMOD - read-write - - SPIMode - SPI mode is selected - 0 - - - I2SMode - I2S mode is selected - 1 - - - - - I2SE - I2S Enable - 10 - 1 - - I2SE - read-write - - Disabled - I2S peripheral is disabled - 0 - - - Enabled - I2S peripheral is enabled - 1 - - - - - I2SCFG - I2S configuration mode - 8 - 2 - - I2SCFG - read-write - - SlaveTx - Slave - transmit - 0 - - - SlaveRx - Slave - receive - 1 - - - MasterTx - Master - transmit - 2 - - - MasterRx - Master - receive - 3 - - - - - PCMSYNC - PCM frame synchronization - 7 - 1 - - PCMSYNC - read-write - - Short - Short frame synchronisation - 0 - - - Long - Long frame synchronisation - 1 - - - - - I2SSTD - I2S standard selection - 4 - 2 - - I2SSTD - read-write - - Philips - I2S Philips standard - 0 - - - MSB - MSB justified standard - 1 - - - LSB - LSB justified standard - 2 - - - PCM - PCM standard - 3 - - - - - CKPOL - Steady state clock polarity - 3 - 1 - - CKPOL - read-write - - IdleLow - I2S clock inactive state is low level - 0 - - - IdleHigh - I2S clock inactive state is high level - 1 - - - - - DATLEN - Data length to be transferred - 1 - 2 - - DATLEN - read-write - - SixteenBit - 16-bit data length - 0 - - - TwentyFourBit - 24-bit data length - 1 - - - ThirtyTwoBit - 32-bit data length - 2 - - - - - CHLEN - Channel length (number of bits per audio channel) - 0 - 1 - - CHLEN - read-write - - SixteenBit - 16-bit wide - 0 - - - ThirtyTwoBit - 32-bit wide - 1 - - - - - ASTRTEN - Asynchronous start enable - 12 - 1 - - - - - I2SPR - I2SPR - I2S prescaler register - 0x20 - 0x20 - read-write - 0x0000000A - - - MCKOE - Master clock output enable - 9 - 1 - - MCKOE - read-write - - Disabled - Master clock output is disabled - 0 - - - Enabled - Master clock output is enabled - 1 - - - - - ODD - Odd factor for the prescaler - 8 - 1 - - ODD - read-write - - Even - Real divider value is I2SDIV * 2 - 0 - - - Odd - Real divider value is (I2SDIV * 2) + 1 - 1 - - - - - I2SDIV - I2S Linear prescaler - 0 - 8 - - - 2 - 255 - - - - - - - - - SPI3 - 0x40003C00 - - SPI3 - SPI3 global interrupt - 51 - - - - SPI4 - 0x40013400 - - SPI4 - SPI 4 global interrupt - 84 - - - - SPI5 - 0x40015000 - - SPI5 - SPI 5 global interrupt - 85 - - - - SPI6 - 0x40015400 - - SPI6 - SPI 6 global interrupt - 86 - - - - SPI2 - Serial peripheral interface - SPI - 0x40003800 - - SPI2 - SPI2 global interrupt - 36 - - - - ADC1 - Analog-to-digital converter - ADC - 0x40012000 - - 0x0 - 0x100 - registers - - - ADC - ADC1 global interrupt - 18 - - - - SR - SR - status register - 0x0 - 0x20 - read-write - 0x00000000 - - - OVR - Overrun - 5 - 1 - - - STRT - Regular channel start flag - 4 - 1 - zeroToClear - - STRTR - read - - NotStarted - No regular channel conversion started - 0 - - - Started - Regular channel conversion has started - 1 - - - - STRTW - write - - Clear - Clear flag - 0 - - - - - JSTRT - Injected channel start flag - 3 - 1 - zeroToClear - - JSTRTR - read - - NotStarted - No injected channel conversion started - 0 - - - Started - Injected channel conversion has started - 1 - - - - JSTRTW - write - - Clear - Clear flag - 0 - - - - - JEOC - Injected channel end of conversion - 2 - 1 - zeroToClear - - JEOCR - read - - NotComplete - Conversion is not complete - 0 - - - Complete - Conversion complete - 1 - - - - JEOCW - write - - Clear - Clear flag - 0 - - - - - EOC - Regular channel end of conversion - 1 - 1 - zeroToClear - - EOCR - read - - NotComplete - Conversion is not complete - 0 - - - Complete - Conversion complete - 1 - - - - EOCW - write - - Clear - Clear flag - 0 - - - - - AWD - Analog watchdog flag - 0 - 1 - zeroToClear - - AWDR - read - - NoEvent - No analog watchdog event occurred - 0 - - - Event - Analog watchdog event occurred - 1 - - - - AWDW - write - - Clear - Clear flag - 0 - - - - - - - CR1 - CR1 - control register 1 - 0x4 - 0x20 - read-write - 0x00000000 - - - OVRIE - Overrun interrupt enable - 26 - 1 - - OVRIE - read-write - - Disabled - Overrun interrupt disabled - 0 - - - Enabled - Overrun interrupt enabled - 1 - - - - - RES - Resolution - 24 - 2 - - RES - read-write - - TwelveBit - 12-bit (15 ADCCLK cycles) - 0 - - - TenBit - 10-bit (13 ADCCLK cycles) - 1 - - - EightBit - 8-bit (11 ADCCLK cycles) - 2 - - - SixBit - 6-bit (9 ADCCLK cycles) - 3 - - - - - AWDEN - Analog watchdog enable on regular channels - 23 - 1 - - AWDEN - read-write - - Disabled - Analog watchdog disabled on regular channels - 0 - - - Enabled - Analog watchdog enabled on regular channels - 1 - - - - - JAWDEN - Analog watchdog enable on injected channels - 22 - 1 - - JAWDEN - read-write - - Disabled - Analog watchdog disabled on injected channels - 0 - - - Enabled - Analog watchdog enabled on injected channels - 1 - - - - - DISCNUM - Discontinuous mode channel count - 13 - 3 - - - 0 - 7 - - - - - JDISCEN - Discontinuous mode on injected channels - 12 - 1 - - JDISCEN - read-write - - Disabled - Discontinuous mode on injected channels disabled - 0 - - - Enabled - Discontinuous mode on injected channels enabled - 1 - - - - - DISCEN - Discontinuous mode on regular channels - 11 - 1 - - DISCEN - read-write - - Disabled - Discontinuous mode on regular channels disabled - 0 - - - Enabled - Discontinuous mode on regular channels enabled - 1 - - - - - JAUTO - Automatic injected group conversion - 10 - 1 - - JAUTO - read-write - - Disabled - Automatic injected group conversion disabled - 0 - - - Enabled - Automatic injected group conversion enabled - 1 - - - - - AWDSGL - Enable the watchdog on a single channel in scan mode - 9 - 1 - - AWDSGL - read-write - - AllChannels - Analog watchdog enabled on all channels - 0 - - - SingleChannel - Analog watchdog enabled on a single channel - 1 - - - - - SCAN - Scan mode - 8 - 1 - - SCAN - read-write - - Disabled - Scan mode disabled - 0 - - - Enabled - Scan mode enabled - 1 - - - - - JEOCIE - Interrupt enable for injected channels - 7 - 1 - - JEOCIE - read-write - - Disabled - JEOC interrupt disabled - 0 - - - Enabled - JEOC interrupt enabled - 1 - - - - - AWDIE - Analog watchdog interrupt enable - 6 - 1 - - AWDIE - read-write - - Disabled - Analogue watchdog interrupt disabled - 0 - - - Enabled - Analogue watchdog interrupt enabled - 1 - - - - - EOCIE - Interrupt enable for EOC - 5 - 1 - - EOCIE - read-write - - Disabled - EOC interrupt disabled - 0 - - - Enabled - EOC interrupt enabled - 1 - - - - - AWDCH - Analog watchdog channel select bits - 0 - 5 - - - 0 - 18 - - - - - - - CR2 - CR2 - control register 2 - 0x8 - 0x20 - read-write - 0x00000000 - - - SWSTART - Start conversion of regular channels - 30 - 1 - - SWSTARTW - write - - Start - Starts conversion of regular channels - 1 - - - - - EXTEN - External trigger enable for regular channels - 28 - 2 - - EXTEN - read-write - - Disabled - Trigger detection disabled - 0 - - - RisingEdge - Trigger detection on the rising edge - 1 - - - FallingEdge - Trigger detection on the falling edge - 2 - - - BothEdges - Trigger detection on both the rising and falling edges - 3 - - - - - EXTSEL - External event select for regular group - 24 - 4 - - EXTSEL - read-write - - TIM1CH1 - Timer 1 CH1 - 0 - - - TIM1CH2 - Timer 1 CH2 - 1 - - - TIM1CH3 - Timer 1 CH3 - 2 - - - TIM2CH2 - Timer 2 CH2 - 3 - - - TIM5TRGO - Timer 5 TRGO - 4 - - - TIM4CH4 - Timer 4 CH4 - 5 - - - TIM3CH4 - Timer 3 CH4 - 6 - - - TIM8TRGO - Timer 8 TRGO - 7 - - - TIM8TRGO2 - Timer 8 TRGO(2) - 8 - - - TIM1TRGO - Timer 1 TRGO - 9 - - - TIM1TRGO2 - Timer 1 TRGO(2) - 10 - - - TIM2TRGO - Timer 2 TRGO - 11 - - - TIM4TRGO - Timer 4 TRGO - 12 - - - TIM6TRGO - Timer 6 TRGO - 13 - - - EXTI11 - EXTI line 11 - 15 - - - - - JSWSTART - Start conversion of injected channels - 22 - 1 - - JSWSTARTW - write - - Start - Starts conversion of injected channels - 1 - - - - - JEXTEN - External trigger enable for injected channels - 20 - 2 - - JEXTEN - read-write - - Disabled - Trigger detection disabled - 0 - - - RisingEdge - Trigger detection on the rising edge - 1 - - - FallingEdge - Trigger detection on the falling edge - 2 - - - BothEdges - Trigger detection on both the rising and falling edges - 3 - - - - - JEXTSEL - External event select for injected group - 16 - 4 - - JEXTSEL - read-write - - TIM1TRGO - Timer 1 TRGO - 0 - - - TIM1CH4 - Timer 1 CH4 - 1 - - - TIM2TRGO - Timer 2 TRGO - 2 - - - TIM2CH1 - Timer 2 CH1 - 3 - - - TIM3CH4 - Timer 3 CH4 - 4 - - - TIM4TRGO - Timer 4 TRGO - 5 - - - TIM8CH4 - Timer 8 CH4 - 7 - - - TIM1TRGO2 - Timer 1 TRGO(2) - 8 - - - TIM8TRGO - Timer 8 TRGO - 9 - - - TIM8TRGO2 - Timer 8 TRGO(2) - 10 - - - TIM3CH3 - Timer 3 CH3 - 11 - - - TIM5TRGO - Timer 5 TRGO - 12 - - - TIM3CH1 - Timer 3 CH1 - 13 - - - TIM6TRGO - Timer 6 TRGO - 14 - - - - - ALIGN - Data alignment - 11 - 1 - - ALIGN - read-write - - Right - Right alignment - 0 - - - Left - Left alignment - 1 - - - - - EOCS - End of conversion selection - 10 - 1 - - EOCS - read-write - - EachSequence - The EOC bit is set at the end of each sequence of regular conversions - 0 - - - EachConversion - The EOC bit is set at the end of each regular conversion - 1 - - - - - DDS - DMA disable selection (for single ADC mode) - 9 - 1 - - DDS - read-write - - Single - No new DMA request is issued after the last transfer - 0 - - - Continuous - DMA requests are issued as long as data are converted and DMA=1 - 1 - - - - - DMA - Direct memory access mode (for single ADC mode) - 8 - 1 - - DMA - read-write - - Disabled - DMA mode disabled - 0 - - - Enabled - DMA mode enabled - 1 - - - - - CONT - Continuous conversion - 1 - 1 - - CONT - read-write - - Single - Single conversion mode - 0 - - - Continuous - Continuous conversion mode - 1 - - - - - ADON - A/D Converter ON / OFF - 0 - 1 - - ADON - read-write - - Disabled - Disable ADC conversion and go to power down mode - 0 - - - Enabled - Enable ADC - 1 - - - - - - - SMPR1 - SMPR1 - sample time register 1 - 0xC - 0x20 - read-write - 0x00000000 - - - SMPx_x - Sample time bits - 0 - 32 - - SMPx_x - read-write - - Cycles3 - 3 cycles - 0 - - - Cycles15 - 15 cycles - 1 - - - Cycles28 - 28 cycles - 2 - - - Cycles56 - 56 cycles - 3 - - - Cycles84 - 84 cycles - 4 - - - Cycles112 - 112 cycles - 5 - - - Cycles144 - 144 cycles - 6 - - - Cycles480 - 480 cycles - 7 - - - - - - - SMPR2 - SMPR2 - sample time register 2 - 0x10 - 0x20 - read-write - 0x00000000 - - - SMPx_x - Sample time bits - 0 - 32 - - SMPx_x - read-write - - Cycles3 - 3 cycles - 0 - - - Cycles15 - 15 cycles - 1 - - - Cycles28 - 28 cycles - 2 - - - Cycles56 - 56 cycles - 3 - - - Cycles84 - 84 cycles - 4 - - - Cycles112 - 112 cycles - 5 - - - Cycles144 - 144 cycles - 6 - - - Cycles480 - 480 cycles - 7 - - - - - - - 4 - 0x4 - 1-4 - JOFR%s - JOFR1 - injected channel data offset register x - 0x14 - 0x20 - read-write - 0x00000000 - - - JOFFSET - Data offset for injected channel x - 0 - 12 - - - 0 - 4095 - - - - - - - HTR - HTR - watchdog higher threshold register - 0x24 - 0x20 - read-write - 0x00000FFF - - - HT - Analog watchdog higher threshold - 0 - 12 - - - 0 - 4095 - - - - - - - LTR - LTR - watchdog lower threshold register - 0x28 - 0x20 - read-write - 0x00000000 - - - LT - Analog watchdog lower threshold - 0 - 12 - - - 0 - 4095 - - - - - - - SQR1 - SQR1 - regular sequence register 1 - 0x2C - 0x20 - read-write - 0x00000000 - - - L - Regular channel sequence length - 20 - 4 - - - 0 - 15 - - - - - SQ16 - 16th conversion in regular sequence - 15 - 5 - - - 0 - 18 - - - - - SQ15 - 15th conversion in regular sequence - 10 - 5 - - - 0 - 18 - - - - - SQ14 - 14th conversion in regular sequence - 5 - 5 - - - 0 - 18 - - - - - SQ13 - 13th conversion in regular sequence - 0 - 5 - - - 0 - 18 - - - - - - - SQR2 - SQR2 - regular sequence register 2 - 0x30 - 0x20 - read-write - 0x00000000 - - - SQ12 - 12th conversion in regular sequence - 25 - 5 - - - 0 - 18 - - - - - SQ11 - 11th conversion in regular sequence - 20 - 5 - - - 0 - 18 - - - - - SQ10 - 10th conversion in regular sequence - 15 - 5 - - - 0 - 18 - - - - - SQ9 - 9th conversion in regular sequence - 10 - 5 - - - 0 - 18 - - - - - SQ8 - 8th conversion in regular sequence - 5 - 5 - - - 0 - 18 - - - - - SQ7 - 7th conversion in regular sequence - 0 - 5 - - - 0 - 18 - - - - - - - SQR3 - SQR3 - regular sequence register 3 - 0x34 - 0x20 - read-write - 0x00000000 - - - SQ6 - 6th conversion in regular sequence - 25 - 5 - - - 0 - 18 - - - - - SQ5 - 5th conversion in regular sequence - 20 - 5 - - - 0 - 18 - - - - - SQ4 - 4th conversion in regular sequence - 15 - 5 - - - 0 - 18 - - - - - SQ3 - 3rd conversion in regular sequence - 10 - 5 - - - 0 - 18 - - - - - SQ2 - 2nd conversion in regular sequence - 5 - 5 - - - 0 - 18 - - - - - SQ1 - 1st conversion in regular sequence - 0 - 5 - - - 0 - 18 - - - - - - - JSQR - JSQR - injected sequence register - 0x38 - 0x20 - read-write - 0x00000000 - - - JL - Injected sequence length - 20 - 2 - - - 0 - 3 - - - - - JSQ4 - 4th conversion in injected sequence - 15 - 5 - - - 0 - 18 - - - - - JSQ3 - 3rd conversion in injected sequence - 10 - 5 - - - 0 - 18 - - - - - JSQ2 - 2nd conversion in injected sequence - 5 - 5 - - - 0 - 18 - - - - - JSQ1 - 1st conversion in injected sequence - 0 - 5 - - - 0 - 18 - - - - - - - 4 - 0x4 - 1-4 - JDR%s - JDR1 - injected data register x - 0x3C - 0x20 - read-only - 0x00000000 - - - JDATA - Injected data - 0 - 16 - - - - - DR - DR - regular data register - 0x4C - 0x20 - read-only - 0x00000000 - - - DATA - Regular data - 0 - 16 - - - - - - - ADC2 - 0x40012100 - - - ADC3 - 0x40012200 - - - DAC - Digital-to-analog converter - DAC - 0x40007400 - - 0x0 - 0x400 - registers - - - - CR - CR - control register - 0x0 - 0x20 - read-write - 0x00000000 - - - DMAUDRIE2 - DAC channel2 DMA underrun interrupt enable - 29 - 1 - - - - DMAEN2 - DAC channel2 DMA enable - 28 - 1 - - - - MAMP2 - DAC channel2 mask/amplitude selector - 24 - 4 - - - 0 - 15 - - - - - WAVE2 - DAC channel2 noise/triangle wave generation enable - 22 - 2 - - WAVE2 - read-write - - Disabled - Wave generation disabled - 0 - - - Noise - Noise wave generation enabled - 1 - - - Triangle - Triangle wave generation enabled - 2 - - - - - TSEL2 - DAC channel2 trigger selection - 19 - 3 - - TSEL2 - read-write - - TIM6_TRGO - Timer 6 TRGO event - 0 - - - TIM8_TRGO - Timer 8 TRGO event - 1 - - - TIM7_TRGO - Timer 7 TRGO event - 2 - - - TIM5_TRGO - Timer 5 TRGO event - 3 - - - TIM2_TRGO - Timer 2 TRGO event - 4 - - - TIM4_TRGO - Timer 4 TRGO event - 5 - - - EXTI9 - EXTI line9 - 6 - - - SOFTWARE - Software trigger - 7 - - - - - TEN2 - DAC channel2 trigger enable - 18 - 1 - - - - BOFF2 - DAC channel2 output buffer disable - 17 - 1 - - - - EN2 - DAC channel2 enable - 16 - 1 - - - - DMAUDRIE1 - DAC channel1 DMA Underrun Interrupt enable - 13 - 1 - - DMAUDRIE1 - read-write - - Disabled - DAC channel X DMA Underrun Interrupt disabled - 0 - - - Enabled - DAC channel X DMA Underrun Interrupt enabled - 1 - - - - - DMAEN1 - DAC channel1 DMA enable - 12 - 1 - - DMAEN1 - read-write - - Disabled - DAC channel X DMA mode disabled - 0 - - - Enabled - DAC channel X DMA mode enabled - 1 - - - - - MAMP1 - DAC channel1 mask/amplitude selector - 8 - 4 - - - 0 - 15 - - - - - WAVE1 - DAC channel1 noise/triangle wave generation enable - 6 - 2 - - WAVE1 - read-write - - Disabled - Wave generation disabled - 0 - - - Noise - Noise wave generation enabled - 1 - - - Triangle - Triangle wave generation enabled - 2 - - - - - TSEL1 - DAC channel1 trigger selection - 3 - 3 - - TSEL1 - read-write - - TIM6_TRGO - Timer 6 TRGO event - 0 - - - TIM3_TRGO - Timer 3 TRGO event - 1 - - - TIM7_TRGO - Timer 7 TRGO event - 2 - - - TIM15_TRGO - Timer 15 TRGO event - 3 - - - TIM2_TRGO - Timer 2 TRGO event - 4 - - - EXTI9 - EXTI line9 - 6 - - - SOFTWARE - Software trigger - 7 - - - - - TEN1 - DAC channel1 trigger enable - 2 - 1 - - TEN1 - read-write - - Disabled - DAC channel X trigger disabled - 0 - - - Enabled - DAC channel X trigger enabled - 1 - - - - - BOFF1 - DAC channel1 output buffer disable - 1 - 1 - - BOFF1 - read-write - - Enabled - DAC channel X output buffer enabled - 0 - - - Disabled - DAC channel X output buffer disabled - 1 - - - - - EN1 - DAC channel1 enable - 0 - 1 - - EN1 - read-write - - Disabled - DAC channel X disabled - 0 - - - Enabled - DAC channel X enabled - 1 - - - - - - - SWTRIGR - SWTRIGR - software trigger register - 0x4 - 0x20 - write-only - 0x00000000 - - - SWTRIG2 - DAC channel2 software trigger - 1 - 1 - - - - SWTRIG1 - DAC channel1 software trigger - 0 - 1 - - SWTRIG1 - write - - Disabled - DAC channel X software trigger disabled - 0 - - - Enabled - DAC channel X software trigger enabled - 1 - - - - - - - DHR12R1 - DHR12R1 - channel1 12-bit right-aligned data holding register - 0x8 - 0x20 - read-write - 0x00000000 - - - DACC1DHR - DAC channel1 12-bit right-aligned data - 0 - 12 - - - 0 - 4095 - - - - - - - DHR12L1 - DHR12L1 - channel1 12-bit left aligned data holding register - 0xC - 0x20 - read-write - 0x00000000 - - - DACC1DHR - DAC channel1 12-bit left-aligned data - 4 - 12 - - - 0 - 4095 - - - - - - - DHR8R1 - DHR8R1 - channel1 8-bit right aligned data holding register - 0x10 - 0x20 - read-write - 0x00000000 - - - DACC1DHR - DAC channel1 8-bit right-aligned data - 0 - 8 - - - 0 - 255 - - - - - - - DHR12R2 - DHR12R2 - channel2 12-bit right aligned data holding register - 0x14 - 0x20 - read-write - 0x00000000 - - - DACC2DHR - DAC channel2 12-bit right-aligned data - 0 - 12 - - - 0 - 4095 - - - - - - - DHR12L2 - DHR12L2 - channel2 12-bit left aligned data holding register - 0x18 - 0x20 - read-write - 0x00000000 - - - DACC2DHR - DAC channel2 12-bit left-aligned data - 4 - 12 - - - 0 - 4095 - - - - - - - DHR8R2 - DHR8R2 - channel2 8-bit right-aligned data holding register - 0x1C - 0x20 - read-write - 0x00000000 - - - DACC2DHR - DAC channel2 8-bit right-aligned data - 0 - 8 - - - 0 - 255 - - - - - - - DHR12RD - DHR12RD - Dual DAC 12-bit right-aligned data holding register - 0x20 - 0x20 - read-write - 0x00000000 - - - DACC2DHR - DAC channel2 12-bit right-aligned data - 16 - 12 - - - 0 - 4095 - - - - - DACC1DHR - DAC channel1 12-bit right-aligned data - 0 - 12 - - - 0 - 4095 - - - - - - - DHR12LD - DHR12LD - DUAL DAC 12-bit left aligned data holding register - 0x24 - 0x20 - read-write - 0x00000000 - - - DACC2DHR - DAC channel2 12-bit left-aligned data - 20 - 12 - - - 0 - 4095 - - - - - DACC1DHR - DAC channel1 12-bit left-aligned data - 4 - 12 - - - 0 - 4095 - - - - - - - DHR8RD - DHR8RD - DUAL DAC 8-bit right aligned data holding register - 0x28 - 0x20 - read-write - 0x00000000 - - - DACC2DHR - DAC channel2 8-bit right-aligned data - 8 - 8 - - - 0 - 255 - - - - - DACC1DHR - DAC channel1 8-bit right-aligned data - 0 - 8 - - - 0 - 255 - - - - - - - DOR1 - DOR1 - channel1 data output register - 0x2C - 0x20 - read-only - 0x00000000 - - - DACC1DOR - DAC channel1 data output - 0 - 12 - - - - - DOR2 - DOR2 - channel2 data output register - 0x30 - 0x20 - read-only - 0x00000000 - - - DACC2DOR - DAC channel2 data output - 0 - 12 - - - - - SR - SR - status register - 0x34 - 0x20 - read-write - 0x00000000 - - - DMAUDR2 - DAC channel2 DMA underrun flag - 29 - 1 - - - - DMAUDR1 - DAC channel1 DMA underrun flag - 13 - 1 - - DMAUDR1 - read-write - - NoUnderrun - No DMA underrun error condition occurred for DAC channel X - 0 - - - Underrun - DMA underrun error condition occurred for DAC channel X - 1 - - - - - - - - - PWR - Power control - PWR - 0x40007000 - - 0x0 - 0x400 - registers - - - PVD - PVD through EXTI line detection interrupt - 1 - - - - CR1 - CR1 - power control register - 0x0 - 0x20 - read-write - 0x0000C000 - - - LPDS - Low-power deep sleep - 0 - 1 - - - PDDS - Power down deepsleep - 1 - 1 - - PDDS - read-write - - STOP_MODE - Enter Stop mode when the CPU enters deepsleep - 0 - - - STANDBY_MODE - Enter Standby mode when the CPU enters deepsleep - 1 - - - - - CSBF - Clear standby flag - 3 - 1 - - - PVDE - Power voltage detector enable - 4 - 1 - - - PLS - PVD level selection - 5 - 3 - - - DBP - Disable backup domain write protection - 8 - 1 - - - FPDS - Flash power down in Stop mode - 9 - 1 - - - LPUDS - Low-power regulator in deepsleep under-drive mode - 10 - 1 - - - MRUDS - Main regulator in deepsleep under-drive mode - 11 - 1 - - - ADCDC1 - ADCDC1 - 13 - 1 - - - VOS - Regulator voltage scaling output selection - 14 - 2 - - VOS - read-write - - SCALE3 - Scale 3 mode - 1 - - - SCALE2 - Scale 2 mode - 2 - - - SCALE1 - Scale 1 mode (reset value) - 3 - - - - - ODEN - Over-drive enable - 16 - 1 - - - ODSWEN - Over-drive switching enabled - 17 - 1 - - - UDEN - Under-drive enable in stop mode - 18 - 2 - - - - - CSR1 - CSR1 - power control/status register - 0x4 - 0x20 - 0x00000000 - - - WUIF - Wakeup internal flag - 0 - 1 - read-only - - - SBF - Standby flag - 1 - 1 - read-only - - - PVDO - PVD output - 2 - 1 - read-only - - - BRR - Backup regulator ready - 3 - 1 - read-only - - - BRE - Backup regulator enable - 9 - 1 - read-write - - - VOSRDY - Regulator voltage scaling output selection ready bit - 14 - 1 - read-write - - - ODRDY - Over-drive mode ready - 16 - 1 - read-write - - - ODSWRDY - Over-drive mode switching ready - 17 - 1 - read-write - - - UDRDY - Under-drive ready flag - 18 - 2 - read-write - - - - - CR2 - CR2 - power control register - 0x8 - 0x20 - 0x00000000 - - - CWUPF1 - Clear Wakeup Pin flag for PA0 - 0 - 1 - read-only - - - CWUPF2 - Clear Wakeup Pin flag for PA2 - 1 - 1 - read-only - - - CWUPF3 - Clear Wakeup Pin flag for PC1 - 2 - 1 - read-only - - - CWUPF4 - Clear Wakeup Pin flag for PC13 - 3 - 1 - read-only - - - CWUPF5 - Clear Wakeup Pin flag for PI8 - 4 - 1 - read-only - - - CWUPF6 - Clear Wakeup Pin flag for PI11 - 5 - 1 - read-only - - - WUPP1 - Wakeup pin polarity bit for PA0 - 8 - 1 - read-write - - - WUPP2 - Wakeup pin polarity bit for PA2 - 9 - 1 - read-write - - - WUPP3 - Wakeup pin polarity bit for PC1 - 10 - 1 - read-write - - - WUPP4 - Wakeup pin polarity bit for PC13 - 11 - 1 - read-write - - - WUPP5 - Wakeup pin polarity bit for PI8 - 12 - 1 - read-write - - - WUPP6 - Wakeup pin polarity bit for PI11 - 13 - 1 - read-write - - - - - CSR2 - CSR2 - power control/status register - 0xC - 0x20 - 0x00000000 - - - WUPF1 - Wakeup Pin flag for PA0 - 0 - 1 - read-only - - - WUPF2 - Wakeup Pin flag for PA2 - 1 - 1 - read-only - - - WUPF3 - Wakeup Pin flag for PC1 - 2 - 1 - read-only - - - WUPF4 - Wakeup Pin flag for PC13 - 3 - 1 - read-only - - - WUPF5 - Wakeup Pin flag for PI8 - 4 - 1 - read-only - - - WUPF6 - Wakeup Pin flag for PI11 - 5 - 1 - read-only - - - EWUP1 - Enable Wakeup pin for PA0 - 8 - 1 - read-write - - - EWUP2 - Enable Wakeup pin for PA2 - 9 - 1 - read-write - - - EWUP3 - Enable Wakeup pin for PC1 - 10 - 1 - read-write - - - EWUP4 - Enable Wakeup pin for PC13 - 11 - 1 - read-write - - - EWUP5 - Enable Wakeup pin for PI8 - 12 - 1 - read-write - - - EWUP6 - Enable Wakeup pin for PI11 - 13 - 1 - read-write - - - - - - - IWDG - Independent watchdog - IWDG - 0x40003000 - - 0x0 - 0x400 - registers - - - - KR - KR - Key register - 0x0 - 0x20 - write-only - 0x00000000 - - - KEY - Key value (write only, read 0000h) - 0 - 16 - - KEY - write - - Enable - Enable access to PR, RLR and WINR registers (0x5555) - 21845 - - - Reset - Reset the watchdog value (0xAAAA) - 43690 - - - Start - Start the watchdog (0xCCCC) - 52428 - - - - - - - PR - PR - Prescaler register - 0x4 - 0x20 - read-write - 0x00000000 - - - PR - Prescaler divider - 0 - 3 - - PR - read-write - - DivideBy4 - Divider /4 - 0 - - - DivideBy8 - Divider /8 - 1 - - - DivideBy16 - Divider /16 - 2 - - - DivideBy32 - Divider /32 - 3 - - - DivideBy64 - Divider /64 - 4 - - - DivideBy128 - Divider /128 - 5 - - - DivideBy256 - Divider /256 - 6 - - - DivideBy256bis - Divider /256 - 7 - - - - - - - RLR - RLR - Reload register - 0x8 - 0x20 - read-write - 0x00000FFF - - - RL - Watchdog counter reload value - 0 - 12 - - - 0 - 4095 - - - - - - - SR - SR - Status register - 0xC - 0x20 - read-only - 0x00000000 - - - RVU - Watchdog counter reload value update - 1 - 1 - - - PVU - Watchdog prescaler value update - 0 - 1 - - - - - WINR - WINR - Window register - 0x10 - 0x20 - read-write - 0x00000000 - - - WIN - Watchdog counter window value - 0 - 12 - - - 0 - 4095 - - - - - - - - - WWDG - Window watchdog - WWDG - 0x40002C00 - - 0x0 - 0x400 - registers - - - WWDG - Window Watchdog interrupt - 0 - - - - CR - CR - Control register - 0x0 - 0x20 - read-write - 0x0000007F - - - WDGA - Activation bit - 7 - 1 - - WDGA - read-write - - Disabled - Watchdog disabled - 0 - - - Enabled - Watchdog enabled - 1 - - - - - T - 7-bit counter (MSB to LSB) - 0 - 7 - - - 0 - 127 - - - - - - - CFR - CFR - Configuration register - 0x4 - 0x20 - read-write - 0x0000007F - - - EWI - Early wakeup interrupt - 9 - 1 - - EWIW - write - - Enable - interrupt occurs whenever the counter reaches the value 0x40 - 1 - - - - - W - 7-bit window value - 0 - 7 - - - 0 - 127 - - - - - WDGTB - Timer base - 7 - 2 - - WDGTB - read-write - - Div1 - Counter clock (PCLK1 div 4096) div 1 - 0 - - - Div2 - Counter clock (PCLK1 div 4096) div 2 - 1 - - - Div4 - Counter clock (PCLK1 div 4096) div 4 - 2 - - - Div8 - Counter clock (PCLK1 div 4096) div 8 - 3 - - - - - - - SR - SR - Status register - 0x8 - 0x20 - read-write - 0x00000000 - - - EWIF - Early wakeup interrupt flag - 0 - 1 - zeroToClear - - EWIFR - read - - Finished - The EWI Interrupt Service Routine has been serviced - 0 - - - Pending - The EWI Interrupt Service Routine has been triggered - 1 - - - - EWIFW - write - - Finished - The EWI Interrupt Service Routine has been serviced - 0 - - - - - - - - - ADC_Common - Common ADC registers - ADC_Common - 0x40012300 - - 0x0 - 0x400 - registers - - - - CSR - CSR - ADC Common status register - 0x0 - 0x20 - read-only - 0x00000000 - - - OVR3 - Overrun flag of ADC3 - 21 - 1 - - - - STRT3 - Regular channel Start flag of ADC 3 - 20 - 1 - - - - JSTRT3 - Injected channel Start flag of ADC 3 - 19 - 1 - - - - JEOC3 - Injected channel end of conversion of ADC 3 - 18 - 1 - - - - EOC3 - End of conversion of ADC 3 - 17 - 1 - - - - AWD3 - Analog watchdog flag of ADC 3 - 16 - 1 - - - - OVR2 - Overrun flag of ADC 2 - 13 - 1 - - - - STRT2 - Regular channel Start flag of ADC 2 - 12 - 1 - - - - JSTRT2 - Injected channel Start flag of ADC 2 - 11 - 1 - - - - JEOC2 - Injected channel end of conversion of ADC 2 - 10 - 1 - - - - EOC2 - End of conversion of ADC 2 - 9 - 1 - - - - AWD2 - Analog watchdog flag of ADC 2 - 8 - 1 - - - - OVR1 - Overrun flag of ADC 1 - 5 - 1 - - OVR1 - read - - NoOverrun - No overrun occurred - 0 - - - Overrun - Overrun occurred - 1 - - - - - STRT1 - Regular channel Start flag of ADC 1 - 4 - 1 - - STRT1 - read - - NotStarted - No regular channel conversion started - 0 - - - Started - Regular channel conversion has started - 1 - - - - - JSTRT1 - Injected channel Start flag of ADC 1 - 3 - 1 - - JSTRT1 - read - - NotStarted - No injected channel conversion started - 0 - - - Started - Injected channel conversion has started - 1 - - - - - JEOC1 - Injected channel end of conversion of ADC 1 - 2 - 1 - - JEOC1 - read - - NotComplete - Conversion is not complete - 0 - - - Complete - Conversion complete - 1 - - - - - EOC1 - End of conversion of ADC 1 - 1 - 1 - - EOC1 - read - - NotComplete - Conversion is not complete - 0 - - - Complete - Conversion complete - 1 - - - - - AWD1 - Analog watchdog flag of ADC 1 - 0 - 1 - - AWD1 - read - - NoEvent - No analog watchdog event occurred - 0 - - - Event - Analog watchdog event occurred - 1 - - - - - - - CCR - CCR - ADC common control register - 0x4 - 0x20 - read-write - 0x00000000 - - - TSVREFE - Temperature sensor and VREFINT enable - 23 - 1 - - TSVREFE - read-write - - Disabled - Temperature sensor and V_REFINT channel disabled - 0 - - - Enabled - Temperature sensor and V_REFINT channel enabled - 1 - - - - - VBATE - VBAT enable - 22 - 1 - - VBATE - read-write - - Disabled - V_BAT channel disabled - 0 - - - Enabled - V_BAT channel enabled - 1 - - - - - ADCPRE - ADC prescaler - 16 - 2 - - ADCPRE - read-write - - Div2 - PCLK2 divided by 2 - 0 - - - Div4 - PCLK2 divided by 4 - 1 - - - Div6 - PCLK2 divided by 6 - 2 - - - Div8 - PCLK2 divided by 8 - 3 - - - - - DMA - Direct memory access mode for multi ADC mode - 14 - 2 - - DMA - read-write - - Disabled - DMA mode disabled - 0 - - - Mode1 - DMA mode 1 enabled (2 / 3 half-words one by one - 1 then 2 then 3) - 1 - - - Mode2 - DMA mode 2 enabled (2 / 3 half-words by pairs - 2&1 then 1&3 then 3&2) - 2 - - - Mode3 - DMA mode 3 enabled (2 / 3 half-words by pairs - 2&1 then 1&3 then 3&2) - 3 - - - - - DDS - DMA disable selection for multi-ADC mode - 13 - 1 - - DDS - read-write - - Single - No new DMA request is issued after the last transfer - 0 - - - Continuous - DMA requests are issued as long as data are converted and DMA=01, 10 or 11 - 1 - - - - - DELAY - Delay between 2 sampling phases - 8 - 4 - - - 0 - 15 - - - - - MULTI - Multi ADC mode selection - 0 - 5 - - MULTI - read-write - - Independent - All the ADCs independent: independent mode - 0 - - - DualRJ - Dual ADC1 and ADC2, combined regular and injected simultaneous mode - 1 - - - DualRA - Dual ADC1 and ADC2, combined regular and alternate trigger mode - 2 - - - DualJ - Dual ADC1 and ADC2, injected simultaneous mode only - 5 - - - DualR - Dual ADC1 and ADC2, regular simultaneous mode only - 6 - - - DualI - Dual ADC1 and ADC2, interleaved mode only - 7 - - - DualA - Dual ADC1 and ADC2, alternate trigger mode only - 9 - - - TripleRJ - Triple ADC, regular and injected simultaneous mode - 17 - - - TripleRA - Triple ADC, regular and alternate trigger mode - 18 - - - TripleJ - Triple ADC, injected simultaneous mode only - 21 - - - TripleR - Triple ADC, regular simultaneous mode only - 22 - - - TripleI - Triple ADC, interleaved mode only - 23 - - - TripleA - Triple ADC, alternate trigger mode only - 24 - - - - - - - CDR - CDR - ADC common regular data register for dual and triple modes - 0x8 - 0x20 - read-only - 0x00000000 - - - DATA2 - 2nd data item of a pair of regular conversions - 16 - 16 - - - DATA1 - 1st data item of a pair of regular conversions - 0 - 16 - - - - - - - TIM1 - Advanced-timers - TIM - 0x40010000 - - 0x0 - 0x400 - registers - - - TIM1_BRK_TIM9 - TIM1 Break interrupt and TIM9 global - interrupt - 24 - - - TIM1_UP_TIM10 - TIM1 Update interrupt and TIM10 - 25 - - - TIM1_TRG_COM_TIM11 - TIM1 Trigger and Commutation interrupts and - TIM11 global interrupt - 26 - - - TIM1_CC - TIM1 Capture Compare interrupt - 27 - - - - CR1 - CR1 - control register 1 - 0x0 - 0x20 - read-write - 0x00000000 - - - CKD - Clock division - 8 - 2 - - CKD - read-write - - Div1 - t_DTS = t_CK_INT - 0 - - - Div2 - t_DTS = 2 × t_CK_INT - 1 - - - Div4 - t_DTS = 4 × t_CK_INT - 2 - - - - - ARPE - Auto-reload preload enable - 7 - 1 - - ARPE - read-write - - Disabled - TIMx_APRR register is not buffered - 0 - - - Enabled - TIMx_APRR register is buffered - 1 - - - - - CMS - Center-aligned mode selection - 5 - 2 - - CMS - read-write - - EdgeAligned - The counter counts up or down depending on the direction bit - 0 - - - CenterAligned1 - The counter counts up and down alternatively. Output compare interrupt flags are set only when the counter is counting down. - 1 - - - CenterAligned2 - The counter counts up and down alternatively. Output compare interrupt flags are set only when the counter is counting up. - 2 - - - CenterAligned3 - The counter counts up and down alternatively. Output compare interrupt flags are set both when the counter is counting up or down. - 3 - - - - - DIR - Direction - 4 - 1 - - DIR - read-write - - Up - Counter used as upcounter - 0 - - - Down - Counter used as downcounter - 1 - - - - - OPM - One-pulse mode - 3 - 1 - - OPM - read-write - - Disabled - Counter is not stopped at update event - 0 - - - Enabled - Counter stops counting at the next update event (clearing the CEN bit) - 1 - - - - - URS - Update request source - 2 - 1 - - URS - read-write - - AnyEvent - Any of counter overflow/underflow, setting UG, or update through slave mode, generates an update interrupt or DMA request - 0 - - - CounterOnly - Only counter overflow/underflow generates an update interrupt or DMA request - 1 - - - - - UDIS - Update disable - 1 - 1 - - UDIS - read-write - - Enabled - Update event enabled - 0 - - - Disabled - Update event disabled - 1 - - - - - CEN - Counter enable - 0 - 1 - - CEN - read-write - - Disabled - Counter disabled - 0 - - - Enabled - Counter enabled - 1 - - - - - UIFREMAP - UIF status bit remapping - 11 - 1 - - - - - CR2 - CR2 - control register 2 - 0x4 - 0x20 - read-write - 0x00000000 - - - OIS4 - Output Idle state 4 - 14 - 1 - - - - OIS3N - Output Idle state 3 - 13 - 1 - - - - OIS3 - Output Idle state 3 - 12 - 1 - - - - OIS2N - Output Idle state 2 - 11 - 1 - - - - OIS2 - Output Idle state 2 - 10 - 1 - - - - OIS1N - Output Idle state 1 - 9 - 1 - - OIS1N - read-write - - Reset - OCxN=0 after a dead-time when MOE=0 - 0 - - - Set - OCxN=1 after a dead-time when MOE=0 - 1 - - - - - OIS1 - Output Idle state 1 - 8 - 1 - - OIS1 - read-write - - Reset - OCx=0 (after a dead-time if OCx(N) is implemented) when MOE=0 - 0 - - - Set - OCx=1 (after a dead-time if OCx(N) is implemented) when MOE=0 - 1 - - - - - TI1S - TI1 selection - 7 - 1 - - TI1S - read-write - - Normal - The TIMx_CH1 pin is connected to TI1 input - 0 - - - XOR - The TIMx_CH1, CH2, CH3 pins are connected to TI1 input - 1 - - - - - MMS - Master mode selection - 4 - 3 - - MMS - read-write - - Reset - The UG bit from the TIMx_EGR register is used as trigger output - 0 - - - Enable - The counter enable signal, CNT_EN, is used as trigger output - 1 - - - Update - The update event is selected as trigger output - 2 - - - ComparePulse - The trigger output send a positive pulse when the CC1IF flag it to be set, as soon as a capture or a compare match occurred - 3 - - - CompareOC1 - OC1REF signal is used as trigger output - 4 - - - CompareOC2 - OC2REF signal is used as trigger output - 5 - - - CompareOC3 - OC3REF signal is used as trigger output - 6 - - - CompareOC4 - OC4REF signal is used as trigger output - 7 - - - - - CCDS - Capture/compare DMA selection - 3 - 1 - - CCDS - read-write - - OnCompare - CCx DMA request sent when CCx event occurs - 0 - - - OnUpdate - CCx DMA request sent when update event occurs - 1 - - - - - CCUS - Capture/compare control update selection - 2 - 1 - - - CCPC - Capture/compare preloaded control - 0 - 1 - - - OIS5 - Output Idle state 5 (OC5 output) - 16 - 1 - - - - OIS6 - Output Idle state 6 (OC6 output) - 18 - 1 - - - - MMS2 - Master mode selection 2 - 20 - 4 - - - - - SMCR - SMCR - slave mode control register - 0x8 - 0x20 - read-write - 0x00000000 - - - SMS_3 - Slave model selection - bit[3] - 16 - 1 - - - ETP - External trigger polarity - 15 - 1 - - ETP - read-write - - NotInverted - ETR is noninverted, active at high level or rising edge - 0 - - - Inverted - ETR is inverted, active at low level or falling edge - 1 - - - - - ECE - External clock enable - 14 - 1 - - ECE - read-write - - Disabled - External clock mode 2 disabled - 0 - - - Enabled - External clock mode 2 enabled. The counter is clocked by any active edge on the ETRF signal. - 1 - - - - - ETPS - External trigger prescaler - 12 - 2 - - ETPS - read-write - - Div1 - Prescaler OFF - 0 - - - Div2 - ETRP frequency divided by 2 - 1 - - - Div4 - ETRP frequency divided by 4 - 2 - - - Div8 - ETRP frequency divided by 8 - 3 - - - - - ETF - External trigger filter - 8 - 4 - - ETF - read-write - - NoFilter - No filter, sampling is done at fDTS - 0 - - - FCK_INT_N2 - fSAMPLING=fCK_INT, N=2 - 1 - - - FCK_INT_N4 - fSAMPLING=fCK_INT, N=4 - 2 - - - FCK_INT_N8 - fSAMPLING=fCK_INT, N=8 - 3 - - - FDTS_Div2_N6 - fSAMPLING=fDTS/2, N=6 - 4 - - - FDTS_Div2_N8 - fSAMPLING=fDTS/2, N=8 - 5 - - - FDTS_Div4_N6 - fSAMPLING=fDTS/4, N=6 - 6 - - - FDTS_Div4_N8 - fSAMPLING=fDTS/4, N=8 - 7 - - - FDTS_Div8_N6 - fSAMPLING=fDTS/8, N=6 - 8 - - - FDTS_Div8_N8 - fSAMPLING=fDTS/8, N=8 - 9 - - - FDTS_Div16_N5 - fSAMPLING=fDTS/16, N=5 - 10 - - - FDTS_Div16_N6 - fSAMPLING=fDTS/16, N=6 - 11 - - - FDTS_Div16_N8 - fSAMPLING=fDTS/16, N=8 - 12 - - - FDTS_Div32_N5 - fSAMPLING=fDTS/32, N=5 - 13 - - - FDTS_Div32_N6 - fSAMPLING=fDTS/32, N=6 - 14 - - - FDTS_Div32_N8 - fSAMPLING=fDTS/32, N=8 - 15 - - - - - MSM - Master/Slave mode - 7 - 1 - - MSM - read-write - - NoSync - No action - 0 - - - Sync - The effect of an event on the trigger input (TRGI) is delayed to allow a perfect synchronization between the current timer and its slaves (through TRGO). It is useful if we want to synchronize several timers on a single external event. - 1 - - - - - TS - Trigger selection - 4 - 3 - - TS - read-write - - ITR0 - Internal Trigger 0 (ITR0) - 0 - - - ITR1 - Internal Trigger 1 (ITR1) - 1 - - - ITR2 - Internal Trigger 2 (ITR2) - 2 - - - TI1F_ED - TI1 Edge Detector (TI1F_ED) - 4 - - - TI1FP1 - Filtered Timer Input 1 (TI1FP1) - 5 - - - TI2FP2 - Filtered Timer Input 2 (TI2FP2) - 6 - - - ETRF - External Trigger input (ETRF) - 7 - - - - - SMS - Slave mode selection - bit[2:0] - 0 - 3 - - SMS - read-write - - Disabled - Slave mode disabled - if CEN = ‘1 then the prescaler is clocked directly by the internal clock. - 0 - - - Encoder_Mode_1 - Encoder mode 1 - Counter counts up/down on TI2FP1 edge depending on TI1FP2 level. - 1 - - - Encoder_Mode_2 - Encoder mode 2 - Counter counts up/down on TI1FP2 edge depending on TI2FP1 level. - 2 - - - Encoder_Mode_3 - Encoder mode 3 - Counter counts up/down on both TI1FP1 and TI2FP2 edges depending on the level of the other input. - 3 - - - Reset_Mode - Reset Mode - Rising edge of the selected trigger input (TRGI) reinitializes the counter and generates an update of the registers. - 4 - - - Gated_Mode - Gated Mode - The counter clock is enabled when the trigger input (TRGI) is high. The counter stops (but is not reset) as soon as the trigger becomes low. Both start and stop of the counter are controlled. - 5 - - - Trigger_Mode - Trigger Mode - The counter starts at a rising edge of the trigger TRGI (but it is not reset). Only the start of the counter is controlled. - 6 - - - Ext_Clock_Mode - External Clock Mode 1 - Rising edges of the selected trigger (TRGI) clock the counter. - 7 - - - - - - - DIER - DIER - DMA/Interrupt enable register - 0xC - 0x20 - read-write - 0x00000000 - - - TDE - Trigger DMA request enable - 14 - 1 - - TDE - read-write - - Disabled - Trigger DMA request disabled - 0 - - - Enabled - Trigger DMA request enabled - 1 - - - - - COMDE - COM DMA request enable - 13 - 1 - - - CC4DE - Capture/Compare 4 DMA request enable - 12 - 1 - - - - CC3DE - Capture/Compare 3 DMA request enable - 11 - 1 - - - - CC2DE - Capture/Compare 2 DMA request enable - 10 - 1 - - - - CC1DE - Capture/Compare 1 DMA request enable - 9 - 1 - - CC1DE - read-write - - Disabled - CCx DMA request disabled - 0 - - - Enabled - CCx DMA request enabled - 1 - - - - - UDE - Update DMA request enable - 8 - 1 - - UDE - read-write - - Disabled - Update DMA request disabled - 0 - - - Enabled - Update DMA request enabled - 1 - - - - - TIE - Trigger interrupt enable - 6 - 1 - - TIE - read-write - - Disabled - Trigger interrupt disabled - 0 - - - Enabled - Trigger interrupt enabled - 1 - - - - - CC4IE - Capture/Compare 4 interrupt enable - 4 - 1 - - - - CC3IE - Capture/Compare 3 interrupt enable - 3 - 1 - - - - CC2IE - Capture/Compare 2 interrupt enable - 2 - 1 - - - - CC1IE - Capture/Compare 1 interrupt enable - 1 - 1 - - CC1IE - read-write - - Disabled - CCx interrupt disabled - 0 - - - Enabled - CCx interrupt enabled - 1 - - - - - UIE - Update interrupt enable - 0 - 1 - - UIE - read-write - - Disabled - Update interrupt disabled - 0 - - - Enabled - Update interrupt enabled - 1 - - - - - BIE - Break interrupt enable - 7 - 1 - - - COMIE - COM interrupt enable - 5 - 1 - - - - - SR - SR - status register - 0x10 - 0x20 - read-write - 0x00000000 - - - CC4OF - Capture/Compare 4 overcapture flag - 12 - 1 - zeroToClear - - read - - - write - - - - CC3OF - Capture/Compare 3 overcapture flag - 11 - 1 - zeroToClear - - read - - - write - - - - CC2OF - Capture/compare 2 overcapture flag - 10 - 1 - zeroToClear - - read - - - write - - - - CC1OF - Capture/Compare 1 overcapture flag - 9 - 1 - zeroToClear - - CC1OFR - read - - Overcapture - The counter value has been captured in TIMx_CCRx register while CCxIF flag was already set - 1 - - - - CC1OFW - write - - Clear - Clear flag - 0 - - - - - BIF - Break interrupt flag - 7 - 1 - - - TIF - Trigger interrupt flag - 6 - 1 - zeroToClear - - TIFR - read - - NoTrigger - No trigger event occurred - 0 - - - Trigger - Trigger interrupt pending - 1 - - - - TIFW - write - - Clear - Clear flag - 0 - - - - - COMIF - COM interrupt flag - 5 - 1 - - - CC4IF - Capture/Compare 4 interrupt flag - 4 - 1 - zeroToClear - - read - - - write - - - - CC3IF - Capture/Compare 3 interrupt flag - 3 - 1 - zeroToClear - - read - - - write - - - - CC2IF - Capture/Compare 2 interrupt flag - 2 - 1 - zeroToClear - - read - - - write - - - - CC1IF - Capture/compare 1 interrupt flag - 1 - 1 - zeroToClear - - CC1IFR - read - - Match - If CC1 is an output: The content of the counter TIMx_CNT matches the content of the TIMx_CCR1 register. If CC1 is an input: The counter value has been captured in TIMx_CCR1 register. - 1 - - - - CC1IFW - write - - Clear - Clear flag - 0 - - - - - UIF - Update interrupt flag - 0 - 1 - zeroToClear - - UIFR - read - - NoUpdateOccurred - No update occurred - 0 - - - UpdatePending - Update interrupt pending - 1 - - - - UIFW - write - - Clear - Clear flag - 0 - - - - - B2IF - Break 2 interrupt flag - 8 - 1 - - - CC5IF - Compare 5 interrupt flag - 16 - 1 - - - CC6IF - Compare 6 interrupt flag - 17 - 1 - - - - - EGR - EGR - event generation register - 0x14 - 0x20 - write-only - 0x00000000 - - - BG - Break generation - 7 - 1 - - - TG - Trigger generation - 6 - 1 - - TGW - write - - Trigger - The TIF flag is set in TIMx_SR register. Related interrupt or DMA transfer can occur if enabled. - 1 - - - - - COMG - Capture/Compare control update generation - 5 - 1 - - - CC4G - Capture/compare 4 generation - 4 - 1 - - - - CC3G - Capture/compare 3 generation - 3 - 1 - - - - CC2G - Capture/compare 2 generation - 2 - 1 - - - - CC1G - Capture/compare 1 generation - 1 - 1 - - CC1GW - write - - Trigger - If CC1 is an output: CC1IF flag is set, Corresponding interrupt or DMA request is sent if enabled. If CC1 is an input: The current value of the counter is captured in TIMx_CCR1 register. - 1 - - - - - UG - Update generation - 0 - 1 - - UG - write - - Update - Re-initializes the timer counter and generates an update of the registers. - 1 - - - - - B2G - Break 2 generation - 8 - 1 - - - - - CCMR1_Output - CCMR1_Output - capture/compare mode register 1 (output mode) - 0x18 - 0x20 - read-write - 0x00000000 - - - OC2CE - Output Compare 2 clear enable - 15 - 1 - - - OC2M - Output Compare 2 mode - 12 - 3 - - - - OC2PE - Output Compare 2 preload enable - 11 - 1 - - OC2PE - read-write - - Disabled - Preload register on CCR2 disabled. New values written to CCR2 are taken into account immediately - 0 - - - Enabled - Preload register on CCR2 enabled. Preload value is loaded into active register on each update event - 1 - - - - - OC2FE - Output Compare 2 fast enable - 10 - 1 - - - CC2S - Capture/Compare 2 selection - 8 - 2 - - CC2S - read-write - - Output - CC2 channel is configured as output - 0 - - - - - OC1CE - Output Compare 1 clear enable - 7 - 1 - - - OC1M - Output Compare 1 mode - 4 - 3 - - OC1M - read-write - - Frozen - The comparison between the output compare register TIMx_CCRy and the counter TIMx_CNT has no effect on the outputs / OpmMode1: Retriggerable OPM mode 1 - In up-counting mode, the channel is active until a trigger event is detected (on TRGI signal). In down-counting mode, the channel is inactive - 0 - - - ActiveOnMatch - Set channel to active level on match. OCyREF signal is forced high when the counter matches the capture/compare register / OpmMode2: Inversely to OpmMode1 - 1 - - - InactiveOnMatch - Set channel to inactive level on match. OCyREF signal is forced low when the counter matches the capture/compare register / Reserved - 2 - - - Toggle - OCyREF toggles when TIMx_CNT=TIMx_CCRy / Reserved - 3 - - - ForceInactive - OCyREF is forced low / CombinedPwmMode1: OCyREF has the same behavior as in PWM mode 1. OCyREFC is the logical OR between OC1REF and OC2REF - 4 - - - ForceActive - OCyREF is forced high / CombinedPwmMode2: OCyREF has the same behavior as in PWM mode 2. OCyREFC is the logical AND between OC1REF and OC2REF - 5 - - - PwmMode1 - In upcounting, channel is active as long as TIMx_CNT<TIMx_CCRy else inactive. In downcounting, channel is inactive as long as TIMx_CNT>TIMx_CCRy else active / AsymmetricPwmMode1: OCyREF has the same behavior as in PWM mode 1. OCyREFC outputs OC1REF when the counter is counting up, OC2REF when it is counting down - 6 - - - PwmMode2 - Inversely to PwmMode1 / AsymmetricPwmMode2: Inversely to AsymmetricPwmMode1 - 7 - - - - - OC1PE - Output Compare 1 preload enable - 3 - 1 - - OC1PE - read-write - - Disabled - Preload register on CCR1 disabled. New values written to CCR1 are taken into account immediately - 0 - - - Enabled - Preload register on CCR1 enabled. Preload value is loaded into active register on each update event - 1 - - - - - OC1FE - Output Compare 1 fast enable - 2 - 1 - - - CC1S - Capture/Compare 1 selection - 0 - 2 - - CC1S - read-write - - Output - CC1 channel is configured as output - 0 - - - - - OC2M_3 - Output Compare 2 mode, bit 3 - 24 - 1 - - - - OC1M_3 - Output Compare 1 mode, bit 3 - 16 - 1 - - OC1M_3 - read-write - - Normal - Normal output compare mode (modes 0-7) - 0 - - - Extended - Extended output compare mode (modes 7-15) - 1 - - - - - - - CCMR1_Input - CCMR1_Input - capture/compare mode register 1 (input mode) - CCMR1_Output - 0x18 - 0x20 - read-write - 0x00000000 - - - IC2F - Input capture 2 filter - 12 - 4 - - - 0 - 15 - - - - - IC2PSC - Input capture 2 prescaler - 10 - 2 - - - CC2S - Capture/Compare 2 selection - 8 - 2 - - CC2S - read-write - - TI2 - CC2 channel is configured as input, IC2 is mapped on TI2 - 1 - - - TI1 - CC2 channel is configured as input, IC2 is mapped on TI1 - 2 - - - TRC - CC2 channel is configured as input, IC2 is mapped on TRC - 3 - - - - - IC1F - Input capture 1 filter - 4 - 4 - - IC1F - read-write - - NoFilter - No filter, sampling is done at fDTS - 0 - - - FCK_INT_N2 - fSAMPLING=fCK_INT, N=2 - 1 - - - FCK_INT_N4 - fSAMPLING=fCK_INT, N=4 - 2 - - - FCK_INT_N8 - fSAMPLING=fCK_INT, N=8 - 3 - - - FDTS_Div2_N6 - fSAMPLING=fDTS/2, N=6 - 4 - - - FDTS_Div2_N8 - fSAMPLING=fDTS/2, N=8 - 5 - - - FDTS_Div4_N6 - fSAMPLING=fDTS/4, N=6 - 6 - - - FDTS_Div4_N8 - fSAMPLING=fDTS/4, N=8 - 7 - - - FDTS_Div8_N6 - fSAMPLING=fDTS/8, N=6 - 8 - - - FDTS_Div8_N8 - fSAMPLING=fDTS/8, N=8 - 9 - - - FDTS_Div16_N5 - fSAMPLING=fDTS/16, N=5 - 10 - - - FDTS_Div16_N6 - fSAMPLING=fDTS/16, N=6 - 11 - - - FDTS_Div16_N8 - fSAMPLING=fDTS/16, N=8 - 12 - - - FDTS_Div32_N5 - fSAMPLING=fDTS/32, N=5 - 13 - - - FDTS_Div32_N6 - fSAMPLING=fDTS/32, N=6 - 14 - - - FDTS_Div32_N8 - fSAMPLING=fDTS/32, N=8 - 15 - - - - - IC1PSC - Input capture 1 prescaler - 2 - 2 - - - CC1S - Capture/Compare 1 selection - 0 - 2 - - CC1S - read-write - - TI1 - CC1 channel is configured as input, IC1 is mapped on TI1 - 1 - - - TI2 - CC1 channel is configured as input, IC1 is mapped on TI2 - 2 - - - TRC - CC1 channel is configured as input, IC1 is mapped on TRC - 3 - - - - - - - CCMR2_Output - CCMR2_Output - capture/compare mode register 2 (output mode) - 0x1C - 0x20 - read-write - 0x00000000 - - - OC4CE - Output compare 4 clear enable - 15 - 1 - - - OC4M - Output compare 4 mode - 12 - 3 - - - - OC4PE - Output compare 4 preload enable - 11 - 1 - - OC4PE - read-write - - Disabled - Preload register on CCR4 disabled. New values written to CCR4 are taken into account immediately - 0 - - - Enabled - Preload register on CCR4 enabled. Preload value is loaded into active register on each update event - 1 - - - - - OC4FE - Output compare 4 fast enable - 10 - 1 - - - CC4S - Capture/Compare 4 selection - 8 - 2 - - CC4S - read-write - - Output - CC4 channel is configured as output - 0 - - - - - OC3CE - Output compare 3 clear enable - 7 - 1 - - - OC3M - Output compare 3 mode - 4 - 3 - - OC3M - read-write - - Frozen - The comparison between the output compare register TIMx_CCRy and the counter TIMx_CNT has no effect on the outputs / OpmMode1: Retriggerable OPM mode 1 - In up-counting mode, the channel is active until a trigger event is detected (on TRGI signal). In down-counting mode, the channel is inactive - 0 - - - ActiveOnMatch - Set channel to active level on match. OCyREF signal is forced high when the counter matches the capture/compare register / OpmMode2: Inversely to OpmMode1 - 1 - - - InactiveOnMatch - Set channel to inactive level on match. OCyREF signal is forced low when the counter matches the capture/compare register / Reserved - 2 - - - Toggle - OCyREF toggles when TIMx_CNT=TIMx_CCRy / Reserved - 3 - - - ForceInactive - OCyREF is forced low / CombinedPwmMode1: OCyREF has the same behavior as in PWM mode 1. OCyREFC is the logical OR between OC1REF and OC2REF - 4 - - - ForceActive - OCyREF is forced high / CombinedPwmMode2: OCyREF has the same behavior as in PWM mode 2. OCyREFC is the logical AND between OC1REF and OC2REF - 5 - - - PwmMode1 - In upcounting, channel is active as long as TIMx_CNT<TIMx_CCRy else inactive. In downcounting, channel is inactive as long as TIMx_CNT>TIMx_CCRy else active / AsymmetricPwmMode1: OCyREF has the same behavior as in PWM mode 1. OCyREFC outputs OC1REF when the counter is counting up, OC2REF when it is counting down - 6 - - - PwmMode2 - Inversely to PwmMode1 / AsymmetricPwmMode2: Inversely to AsymmetricPwmMode1 - 7 - - - - - OC3PE - Output compare 3 preload enable - 3 - 1 - - OC3PE - read-write - - Disabled - Preload register on CCR3 disabled. New values written to CCR3 are taken into account immediately - 0 - - - Enabled - Preload register on CCR3 enabled. Preload value is loaded into active register on each update event - 1 - - - - - OC3FE - Output compare 3 fast enable - 2 - 1 - - - CC3S - Capture/Compare 3 selection - 0 - 2 - - CC3S - read-write - - Output - CC3 channel is configured as output - 0 - - - - - OC3M_3 - Output Compare 3 mode, bit 3 - 16 - 1 - - OC3M_3 - read-write - - Normal - Normal output compare mode (modes 0-7) - 0 - - - Extended - Extended output compare mode (modes 7-15) - 1 - - - - - OC4M_3 - Output Compare 4 mode, bit 3 - 24 - 1 - - - - - - CCMR2_Input - CCMR2_Input - capture/compare mode register 2 (input mode) - CCMR2_Output - 0x1C - 0x20 - read-write - 0x00000000 - - - IC4F - Input capture 4 filter - 12 - 4 - - - 0 - 15 - - - - - IC4PSC - Input capture 4 prescaler - 10 - 2 - - - 0 - 3 - - - - - CC4S - Capture/Compare 4 selection - 8 - 2 - - CC4S - read-write - - TI4 - CC4 channel is configured as input, IC4 is mapped on TI4 - 1 - - - TI3 - CC4 channel is configured as input, IC4 is mapped on TI3 - 2 - - - TRC - CC4 channel is configured as input, IC4 is mapped on TRC - 3 - - - - - IC3F - Input capture 3 filter - 4 - 4 - - - 0 - 15 - - - - - IC3PSC - Input capture 3 prescaler - 2 - 2 - - - 0 - 3 - - - - - CC3S - Capture/compare 3 selection - 0 - 2 - - CC3S - read-write - - TI3 - CC3 channel is configured as input, IC3 is mapped on TI3 - 1 - - - TI4 - CC3 channel is configured as input, IC3 is mapped on TI4 - 2 - - - TRC - CC3 channel is configured as input, IC3 is mapped on TRC - 3 - - - - - - - CCER - CCER - capture/compare enable register - 0x20 - 0x20 - read-write - 0x00000000 - - - CC4P - Capture/Compare 3 output Polarity - 13 - 1 - - - CC4E - Capture/Compare 4 output enable - 12 - 1 - - - CC3NP - Capture/Compare 3 output Polarity - 11 - 1 - - - CC3NE - Capture/Compare 3 complementary output enable - 10 - 1 - - - CC3P - Capture/Compare 3 output Polarity - 9 - 1 - - - CC3E - Capture/Compare 3 output enable - 8 - 1 - - - CC2NP - Capture/Compare 2 output Polarity - 7 - 1 - - - CC2NE - Capture/Compare 2 complementary output enable - 6 - 1 - - - CC2P - Capture/Compare 2 output Polarity - 5 - 1 - - - CC2E - Capture/Compare 2 output enable - 4 - 1 - - - CC1NP - Capture/Compare 1 output Polarity - 3 - 1 - - - CC1NE - Capture/Compare 1 complementary output enable - 2 - 1 - - - CC1P - Capture/Compare 1 output Polarity - 1 - 1 - - - CC1E - Capture/Compare 1 output enable - 0 - 1 - - - CC5E - Capture/Compare 5 output enable - 16 - 1 - - - CC5P - Capture/Compare 5 output polarity - 17 - 1 - - - CC6E - Capture/Compare 6 output enable - 20 - 1 - - - CC6P - Capture/Compare 6 output polarity - 21 - 1 - - - CC4NP - Capture/Compare 4 complementary output polarity - 15 - 1 - - - - - CNT - CNT - counter - 0x24 - 0x20 - read-write - 0x00000000 - - - CNT - counter value - 0 - 16 - - - 0 - 65535 - - - - - UIFCPY - UIF copy This bit is a read-only copy of the UIF bit of the TIMx_ISR register. If the UIFREMAP bit in the TIMxCR1 is reset, bit 31 is reserved and read at 0 - - 31 - 1 - read-only - - - - - PSC - PSC - prescaler - 0x28 - 0x20 - read-write - 0x00000000 - - - PSC - Prescaler value - 0 - 16 - - - 0 - 65535 - - - - - - - ARR - ARR - auto-reload register - 0x2C - 0x20 - read-write - 0x00000000 - - - ARR - Auto-reload value - 0 - 16 - - - 0 - 65535 - - - - - - - 4 - 0x4 - 1-4 - CCR%s - CCR1 - capture/compare register - 0x34 - 0x20 - read-write - 0x00000000 - - - CCR - Capture/Compare value - 0 - 16 - - - 0 - 65535 - - - - - - - DCR - DCR - DMA control register - 0x48 - 0x20 - read-write - 0x00000000 - - - DBL - DMA burst length - 8 - 5 - - - 0 - 18 - - - - - DBA - DMA base address - 0 - 5 - - - 0 - 31 - - - - - - - DMAR - DMAR - DMA address for full transfer - 0x4C - 0x20 - read-write - 0x00000000 - - - DMAB - DMA register for burst accesses - 0 - 32 - - - - - RCR - RCR - repetition counter register - 0x30 - 0x20 - read-write - 0x00000000 - - - REP - Repetition counter value - 0 - 8 - - - - - BDTR - BDTR - break and dead-time register - 0x44 - 0x20 - read-write - 0x00000000 - - - MOE - Main output enable - 15 - 1 - - MOE - read-write - - DisabledIdle - OC/OCN are disabled or forced idle depending on OSSI - 0 - - - Enabled - OC/OCN are enabled if CCxE/CCxNE are set - 1 - - - - - AOE - Automatic output enable - 14 - 1 - - AOE - read-write - - Manual - MOE can be set only by software - 0 - - - Automatic - MOE can be set by software or automatically at the next update event (if none of the break inputs BRK and BRK2 is active) - 1 - - - - - BKP - Break polarity - 13 - 1 - - BKP - read-write - - ActiveLow - Break input BRKx is active low - 0 - - - ActiveHigh - Break input BRKx is active high - 1 - - - - - BKE - Break enable - 12 - 1 - - BKE - read-write - - Disabled - Break function x disabled - 0 - - - Enabled - Break function x disabled - 1 - - - - - OSSR - Off-state selection for Run mode - 11 - 1 - - OSSR - read-write - - Disabled - When inactive, OC/OCN outputs are disabled - 0 - - - IdleLevel - When inactive, OC/OCN outputs are enabled with their inactive level - 1 - - - - - OSSI - Off-state selection for Idle mode - 10 - 1 - - OSSI - read-write - - Disabled - When inactive, OC/OCN outputs are disabled - 0 - - - IdleLevel - When inactive, OC/OCN outputs are forced to idle level - 1 - - - - - LOCK - Lock configuration - 8 - 2 - - LOCK - read-write - - Off - No bit is write protected - 0 - - - Level1 - Any bits except MOE, OSSR, OSSI and LOCK in TIMx_BDTR register, OISx and OISxN bits in TIMx_CR2 register can no longer be written - 1 - - - Level2 - LOCK Level 1 + CC Polarity bits (CCxP/CCxNP bits in TIMx_CCER register, as long as the related channel is configured in output through the CCxS bits) as well as OSSR and OSSI bits can no longer be written - 2 - - - Level3 - LOCK Level 2 + CC Control bits (OCxM and OCxPE bits in TIMx_CCMRx registers, as long as the related channel is configured in output through the CCxS bits) can no longer be written - 3 - - - - - DTG - Dead-time generator setup - 0 - 8 - - - 0 - 255 - - - - - BKF - Break filter - 16 - 4 - - - BK2F - Break 2 filter - 20 - 4 - - - BK2E - Break 2 enable - 24 - 1 - - - - BK2P - Break 2 polarity - 25 - 1 - - - - - - CCMR3_Output - CCMR3_Output - capture/compare mode register 3 (output mode) - 0x54 - 0x20 - read-write - 0x00000000 - - - OC5FE - Output compare 5 fast enable - 2 - 1 - - - OC5PE - Output compare 5 preload enable - 3 - 1 - - - OC5M - Output compare 5 mode - 4 - 3 - - OC5M - read-write - - Frozen - The comparison between the output compare register TIMx_CCRy and the counter TIMx_CNT has no effect on the outputs / OpmMode1: Retriggerable OPM mode 1 - In up-counting mode, the channel is active until a trigger event is detected (on TRGI signal). In down-counting mode, the channel is inactive - 0 - - - ActiveOnMatch - Set channel to active level on match. OCyREF signal is forced high when the counter matches the capture/compare register / OpmMode2: Inversely to OpmMode1 - 1 - - - InactiveOnMatch - Set channel to inactive level on match. OCyREF signal is forced low when the counter matches the capture/compare register / Reserved - 2 - - - Toggle - OCyREF toggles when TIMx_CNT=TIMx_CCRy / Reserved - 3 - - - ForceInactive - OCyREF is forced low / CombinedPwmMode1: OCyREF has the same behavior as in PWM mode 1. OCyREFC is the logical OR between OC1REF and OC2REF - 4 - - - ForceActive - OCyREF is forced high / CombinedPwmMode2: OCyREF has the same behavior as in PWM mode 2. OCyREFC is the logical AND between OC1REF and OC2REF - 5 - - - PwmMode1 - In upcounting, channel is active as long as TIMx_CNT<TIMx_CCRy else inactive. In downcounting, channel is inactive as long as TIMx_CNT>TIMx_CCRy else active / AsymmetricPwmMode1: OCyREF has the same behavior as in PWM mode 1. OCyREFC outputs OC1REF when the counter is counting up, OC2REF when it is counting down - 6 - - - PwmMode2 - Inversely to PwmMode1 / AsymmetricPwmMode2: Inversely to AsymmetricPwmMode1 - 7 - - - - - OC5CE - Output compare 5 clear enable - 7 - 1 - - - OC6FE - Output compare 6 fast enable - 10 - 1 - - - OC6PE - Output compare 6 preload enable - 11 - 1 - - - OC6M - Output compare 6 mode - 12 - 3 - - - - OC6CE - Output compare 6 clear enable - 15 - 1 - - - OC5M_3 - Output Compare 5 mode - 16 - 1 - - OC5M_3 - read-write - - Normal - Normal output compare mode (modes 0-7) - 0 - - - Extended - Extended output compare mode (modes 7-15) - 1 - - - - - OC6M_3 - Output Compare 6 mode - 24 - 1 - - - - - - CCR5 - CCR5 - capture/compare register - 0x58 - 0x20 - read-write - 0x00000000 - - - CCR - Capture/Compare value - 0 - 16 - - - GC5C1 - Group Channel 5 and Channel 1 - 29 - 1 - - - GC5C2 - Group Channel 5 and Channel 2 - 30 - 1 - - - GC5C3 - Group Channel 5 and Channel 3 - 31 - 1 - - - - - CCR6 - CRR6 - capture/compare register - 0x5C - 0x20 - read-write - 0x00000000 - - - CCR - Capture/Compare value - 0 - 16 - - - - - AF1 - alternate function option register 1 - 0x60 - 0x20 - read-write - 0x00000001 - - - BKINE - BRK BKIN input enable - 0 - 1 - - - BKDFBKE - BRK DFSDM_BREAK[0] enable - 8 - 1 - - - BKINP - BRK BKIN input polarity - 9 - 1 - - - - - AF2 - alternate function option register 2 - 0x64 - 0x20 - read-write - 0x00000001 - - - BK2INE - BRK2 BKIN input enable - 0 - 1 - - - BK2DFBKE - BRK2 DFSDM_BREAK[0] enable - 8 - 1 - - - BK2INP - BRK2 BKIN input polarity - 9 - 1 - - - - - - - TIM8 - TIM - 0x40010400 - - TIM8_BRK_TIM12 - TIM8 Break interrupt and TIM12 global - interrupt - 43 - - - TIM8_UP_TIM13 - TIM8 Update interrupt and TIM13 global - interrupt - 44 - - - TIM8_TRG_COM_TIM14 - TIM8 Trigger and Commutation interrupts and - TIM14 global interrupt - 45 - - - TIM8_CC - TIM8 Capture Compare interrupt - 46 - - - - TIM2 - General purpose timers - TIM - 0x40000000 - - 0x0 - 0x400 - registers - - - TIM2 - TIM2 global interrupt - 28 - - - - CR1 - CR1 - control register 1 - 0x0 - 0x20 - read-write - 0x00000000 - - - CKD - Clock division - 8 - 2 - - CKD - read-write - - Div1 - t_DTS = t_CK_INT - 0 - - - Div2 - t_DTS = 2 × t_CK_INT - 1 - - - Div4 - t_DTS = 4 × t_CK_INT - 2 - - - - - ARPE - Auto-reload preload enable - 7 - 1 - - ARPE - read-write - - Disabled - TIMx_APRR register is not buffered - 0 - - - Enabled - TIMx_APRR register is buffered - 1 - - - - - CMS - Center-aligned mode selection - 5 - 2 - - CMS - read-write - - EdgeAligned - The counter counts up or down depending on the direction bit - 0 - - - CenterAligned1 - The counter counts up and down alternatively. Output compare interrupt flags are set only when the counter is counting down. - 1 - - - CenterAligned2 - The counter counts up and down alternatively. Output compare interrupt flags are set only when the counter is counting up. - 2 - - - CenterAligned3 - The counter counts up and down alternatively. Output compare interrupt flags are set both when the counter is counting up or down. - 3 - - - - - DIR - Direction - 4 - 1 - - DIR - read-write - - Up - Counter used as upcounter - 0 - - - Down - Counter used as downcounter - 1 - - - - - OPM - One-pulse mode - 3 - 1 - - OPM - read-write - - Disabled - Counter is not stopped at update event - 0 - - - Enabled - Counter stops counting at the next update event (clearing the CEN bit) - 1 - - - - - URS - Update request source - 2 - 1 - - URS - read-write - - AnyEvent - Any of counter overflow/underflow, setting UG, or update through slave mode, generates an update interrupt or DMA request - 0 - - - CounterOnly - Only counter overflow/underflow generates an update interrupt or DMA request - 1 - - - - - UDIS - Update disable - 1 - 1 - - UDIS - read-write - - Enabled - Update event enabled - 0 - - - Disabled - Update event disabled - 1 - - - - - CEN - Counter enable - 0 - 1 - - CEN - read-write - - Disabled - Counter disabled - 0 - - - Enabled - Counter enabled - 1 - - - - - UIFREMAP - UIF status bit remapping - 11 - 1 - - - - - CR2 - CR2 - control register 2 - 0x4 - 0x20 - read-write - 0x00000000 - - - TI1S - TI1 selection - 7 - 1 - - TI1S - read-write - - Normal - The TIMx_CH1 pin is connected to TI1 input - 0 - - - XOR - The TIMx_CH1, CH2, CH3 pins are connected to TI1 input - 1 - - - - - MMS - Master mode selection - 4 - 3 - - MMS - read-write - - Reset - The UG bit from the TIMx_EGR register is used as trigger output - 0 - - - Enable - The counter enable signal, CNT_EN, is used as trigger output - 1 - - - Update - The update event is selected as trigger output - 2 - - - ComparePulse - The trigger output send a positive pulse when the CC1IF flag it to be set, as soon as a capture or a compare match occurred - 3 - - - CompareOC1 - OC1REF signal is used as trigger output - 4 - - - CompareOC2 - OC2REF signal is used as trigger output - 5 - - - CompareOC3 - OC3REF signal is used as trigger output - 6 - - - CompareOC4 - OC4REF signal is used as trigger output - 7 - - - - - CCDS - Capture/compare DMA selection - 3 - 1 - - CCDS - read-write - - OnCompare - CCx DMA request sent when CCx event occurs - 0 - - - OnUpdate - CCx DMA request sent when update event occurs - 1 - - - - - - - SMCR - SMCR - slave mode control register - 0x8 - 0x20 - read-write - 0x00000000 - - - SMS - Slave mode selection - 0 - 3 - - SMS - read-write - - Disabled - Slave mode disabled - if CEN = ‘1 then the prescaler is clocked directly by the internal clock. - 0 - - - Encoder_Mode_1 - Encoder mode 1 - Counter counts up/down on TI2FP1 edge depending on TI1FP2 level. - 1 - - - Encoder_Mode_2 - Encoder mode 2 - Counter counts up/down on TI1FP2 edge depending on TI2FP1 level. - 2 - - - Encoder_Mode_3 - Encoder mode 3 - Counter counts up/down on both TI1FP1 and TI2FP2 edges depending on the level of the other input. - 3 - - - Reset_Mode - Reset Mode - Rising edge of the selected trigger input (TRGI) reinitializes the counter and generates an update of the registers. - 4 - - - Gated_Mode - Gated Mode - The counter clock is enabled when the trigger input (TRGI) is high. The counter stops (but is not reset) as soon as the trigger becomes low. Both start and stop of the counter are controlled. - 5 - - - Trigger_Mode - Trigger Mode - The counter starts at a rising edge of the trigger TRGI (but it is not reset). Only the start of the counter is controlled. - 6 - - - Ext_Clock_Mode - External Clock Mode 1 - Rising edges of the selected trigger (TRGI) clock the counter. - 7 - - - - - TS - Trigger selection - 4 - 3 - - TS - read-write - - ITR0 - Internal Trigger 0 (ITR0) - 0 - - - ITR1 - Internal Trigger 1 (ITR1) - 1 - - - ITR2 - Internal Trigger 2 (ITR2) - 2 - - - TI1F_ED - TI1 Edge Detector (TI1F_ED) - 4 - - - TI1FP1 - Filtered Timer Input 1 (TI1FP1) - 5 - - - TI2FP2 - Filtered Timer Input 2 (TI2FP2) - 6 - - - ETRF - External Trigger input (ETRF) - 7 - - - - - MSM - Master/Slave mode - 7 - 1 - - MSM - read-write - - NoSync - No action - 0 - - - Sync - The effect of an event on the trigger input (TRGI) is delayed to allow a perfect synchronization between the current timer and its slaves (through TRGO). It is useful if we want to synchronize several timers on a single external event. - 1 - - - - - ETF - External trigger filter - 8 - 4 - - ETF - read-write - - NoFilter - No filter, sampling is done at fDTS - 0 - - - FCK_INT_N2 - fSAMPLING=fCK_INT, N=2 - 1 - - - FCK_INT_N4 - fSAMPLING=fCK_INT, N=4 - 2 - - - FCK_INT_N8 - fSAMPLING=fCK_INT, N=8 - 3 - - - FDTS_Div2_N6 - fSAMPLING=fDTS/2, N=6 - 4 - - - FDTS_Div2_N8 - fSAMPLING=fDTS/2, N=8 - 5 - - - FDTS_Div4_N6 - fSAMPLING=fDTS/4, N=6 - 6 - - - FDTS_Div4_N8 - fSAMPLING=fDTS/4, N=8 - 7 - - - FDTS_Div8_N6 - fSAMPLING=fDTS/8, N=6 - 8 - - - FDTS_Div8_N8 - fSAMPLING=fDTS/8, N=8 - 9 - - - FDTS_Div16_N5 - fSAMPLING=fDTS/16, N=5 - 10 - - - FDTS_Div16_N6 - fSAMPLING=fDTS/16, N=6 - 11 - - - FDTS_Div16_N8 - fSAMPLING=fDTS/16, N=8 - 12 - - - FDTS_Div32_N5 - fSAMPLING=fDTS/32, N=5 - 13 - - - FDTS_Div32_N6 - fSAMPLING=fDTS/32, N=6 - 14 - - - FDTS_Div32_N8 - fSAMPLING=fDTS/32, N=8 - 15 - - - - - ETPS - External trigger prescaler - 12 - 2 - - ETPS - read-write - - Div1 - Prescaler OFF - 0 - - - Div2 - ETRP frequency divided by 2 - 1 - - - Div4 - ETRP frequency divided by 4 - 2 - - - Div8 - ETRP frequency divided by 8 - 3 - - - - - ECE - External clock enable - 14 - 1 - - ECE - read-write - - Disabled - External clock mode 2 disabled - 0 - - - Enabled - External clock mode 2 enabled. The counter is clocked by any active edge on the ETRF signal. - 1 - - - - - ETP - External trigger polarity - 15 - 1 - - ETP - read-write - - NotInverted - ETR is noninverted, active at high level or rising edge - 0 - - - Inverted - ETR is inverted, active at low level or falling edge - 1 - - - - - SMS_3 - Slave model selection - bit[3] - 16 - 1 - - - - - DIER - DIER - DMA/Interrupt enable register - 0xC - 0x20 - read-write - 0x00000000 - - - TDE - Trigger DMA request enable - 14 - 1 - - TDE - read-write - - Disabled - Trigger DMA request disabled - 0 - - - Enabled - Trigger DMA request enabled - 1 - - - - - CC4DE - Capture/Compare 4 DMA request enable - 12 - 1 - - - - CC3DE - Capture/Compare 3 DMA request enable - 11 - 1 - - - - CC2DE - Capture/Compare 2 DMA request enable - 10 - 1 - - - - CC1DE - Capture/Compare 1 DMA request enable - 9 - 1 - - CC1DE - read-write - - Disabled - CCx DMA request disabled - 0 - - - Enabled - CCx DMA request enabled - 1 - - - - - UDE - Update DMA request enable - 8 - 1 - - UDE - read-write - - Disabled - Update DMA request disabled - 0 - - - Enabled - Update DMA request enabled - 1 - - - - - TIE - Trigger interrupt enable - 6 - 1 - - TIE - read-write - - Disabled - Trigger interrupt disabled - 0 - - - Enabled - Trigger interrupt enabled - 1 - - - - - CC4IE - Capture/Compare 4 interrupt enable - 4 - 1 - - - - CC3IE - Capture/Compare 3 interrupt enable - 3 - 1 - - - - CC2IE - Capture/Compare 2 interrupt enable - 2 - 1 - - - - CC1IE - Capture/Compare 1 interrupt enable - 1 - 1 - - CC1IE - read-write - - Disabled - CCx interrupt disabled - 0 - - - Enabled - CCx interrupt enabled - 1 - - - - - UIE - Update interrupt enable - 0 - 1 - - UIE - read-write - - Disabled - Update interrupt disabled - 0 - - - Enabled - Update interrupt enabled - 1 - - - - - - - SR - SR - status register - 0x10 - 0x20 - read-write - 0x00000000 - - - CC4OF - Capture/Compare 4 overcapture flag - 12 - 1 - zeroToClear - - read - - - write - - - - CC3OF - Capture/Compare 3 overcapture flag - 11 - 1 - zeroToClear - - read - - - write - - - - CC2OF - Capture/compare 2 overcapture flag - 10 - 1 - zeroToClear - - read - - - write - - - - CC1OF - Capture/Compare 1 overcapture flag - 9 - 1 - zeroToClear - - CC1OFR - read - - Overcapture - The counter value has been captured in TIMx_CCRx register while CCxIF flag was already set - 1 - - - - CC1OFW - write - - Clear - Clear flag - 0 - - - - - TIF - Trigger interrupt flag - 6 - 1 - zeroToClear - - TIFR - read - - NoTrigger - No trigger event occurred - 0 - - - Trigger - Trigger interrupt pending - 1 - - - - TIFW - write - - Clear - Clear flag - 0 - - - - - CC4IF - Capture/Compare 4 interrupt flag - 4 - 1 - zeroToClear - - read - - - write - - - - CC3IF - Capture/Compare 3 interrupt flag - 3 - 1 - zeroToClear - - read - - - write - - - - CC2IF - Capture/Compare 2 interrupt flag - 2 - 1 - zeroToClear - - read - - - write - - - - CC1IF - Capture/compare 1 interrupt flag - 1 - 1 - zeroToClear - - CC1IFR - read - - Match - If CC1 is an output: The content of the counter TIMx_CNT matches the content of the TIMx_CCR1 register. If CC1 is an input: The counter value has been captured in TIMx_CCR1 register. - 1 - - - - CC1IFW - write - - Clear - Clear flag - 0 - - - - - UIF - Update interrupt flag - 0 - 1 - zeroToClear - - UIFR - read - - NoUpdateOccurred - No update occurred - 0 - - - UpdatePending - Update interrupt pending - 1 - - - - UIFW - write - - Clear - Clear flag - 0 - - - - - - - EGR - EGR - event generation register - 0x14 - 0x20 - write-only - 0x00000000 - - - TG - Trigger generation - 6 - 1 - - TGW - write - - Trigger - The TIF flag is set in TIMx_SR register. Related interrupt or DMA transfer can occur if enabled. - 1 - - - - - CC4G - Capture/compare 4 generation - 4 - 1 - - - - CC3G - Capture/compare 3 generation - 3 - 1 - - - - CC2G - Capture/compare 2 generation - 2 - 1 - - - - CC1G - Capture/compare 1 generation - 1 - 1 - - CC1GW - write - - Trigger - If CC1 is an output: CC1IF flag is set, Corresponding interrupt or DMA request is sent if enabled. If CC1 is an input: The current value of the counter is captured in TIMx_CCR1 register. - 1 - - - - - UG - Update generation - 0 - 1 - - UG - write - - Update - Re-initializes the timer counter and generates an update of the registers. - 1 - - - - - - - CCMR1_Output - CCMR1_Output - capture/compare mode register 1 (output mode) - 0x18 - 0x20 - read-write - 0x00000000 - - - OC2CE - OC2CE - 15 - 1 - - - OC2M - OC2M - 12 - 3 - - - - OC2PE - OC2PE - 11 - 1 - - OC2PE - read-write - - Disabled - Preload register on CCR2 disabled. New values written to CCR2 are taken into account immediately - 0 - - - Enabled - Preload register on CCR2 enabled. Preload value is loaded into active register on each update event - 1 - - - - - OC2FE - OC2FE - 10 - 1 - - - CC2S - CC2S - 8 - 2 - - CC2S - read-write - - Output - CC2 channel is configured as output - 0 - - - - - OC1CE - OC1CE - 7 - 1 - - - OC1M - OC1M - 4 - 3 - - OC1M - read-write - - Frozen - The comparison between the output compare register TIMx_CCRy and the counter TIMx_CNT has no effect on the outputs / OpmMode1: Retriggerable OPM mode 1 - In up-counting mode, the channel is active until a trigger event is detected (on TRGI signal). In down-counting mode, the channel is inactive - 0 - - - ActiveOnMatch - Set channel to active level on match. OCyREF signal is forced high when the counter matches the capture/compare register / OpmMode2: Inversely to OpmMode1 - 1 - - - InactiveOnMatch - Set channel to inactive level on match. OCyREF signal is forced low when the counter matches the capture/compare register / Reserved - 2 - - - Toggle - OCyREF toggles when TIMx_CNT=TIMx_CCRy / Reserved - 3 - - - ForceInactive - OCyREF is forced low / CombinedPwmMode1: OCyREF has the same behavior as in PWM mode 1. OCyREFC is the logical OR between OC1REF and OC2REF - 4 - - - ForceActive - OCyREF is forced high / CombinedPwmMode2: OCyREF has the same behavior as in PWM mode 2. OCyREFC is the logical AND between OC1REF and OC2REF - 5 - - - PwmMode1 - In upcounting, channel is active as long as TIMx_CNT<TIMx_CCRy else inactive. In downcounting, channel is inactive as long as TIMx_CNT>TIMx_CCRy else active / AsymmetricPwmMode1: OCyREF has the same behavior as in PWM mode 1. OCyREFC outputs OC1REF when the counter is counting up, OC2REF when it is counting down - 6 - - - PwmMode2 - Inversely to PwmMode1 / AsymmetricPwmMode2: Inversely to AsymmetricPwmMode1 - 7 - - - - - OC1PE - OC1PE - 3 - 1 - - OC1PE - read-write - - Disabled - Preload register on CCR1 disabled. New values written to CCR1 are taken into account immediately - 0 - - - Enabled - Preload register on CCR1 enabled. Preload value is loaded into active register on each update event - 1 - - - - - OC1FE - OC1FE - 2 - 1 - - - CC1S - CC1S - 0 - 2 - - CC1S - read-write - - Output - CC1 channel is configured as output - 0 - - - - - OC2M_3 - Output Compare 2 mode, bit 3 - 24 - 1 - - - - OC1M_3 - Output Compare 1 mode, bit 3 - 16 - 1 - - OC1M_3 - read-write - - Normal - Normal output compare mode (modes 0-7) - 0 - - - Extended - Extended output compare mode (modes 7-15) - 1 - - - - - - - CCMR1_Input - CCMR1_Input - capture/compare mode register 1 (input mode) - CCMR1_Output - 0x18 - 0x20 - read-write - 0x00000000 - - - IC2F - Input capture 2 filter - 12 - 4 - - - 0 - 15 - - - - - IC2PSC - Input capture 2 prescaler - 10 - 2 - - - CC2S - Capture/Compare 2 selection - 8 - 2 - - CC2S - read-write - - TI2 - CC2 channel is configured as input, IC2 is mapped on TI2 - 1 - - - TI1 - CC2 channel is configured as input, IC2 is mapped on TI1 - 2 - - - TRC - CC2 channel is configured as input, IC2 is mapped on TRC - 3 - - - - - IC1F - Input capture 1 filter - 4 - 4 - - IC1F - read-write - - NoFilter - No filter, sampling is done at fDTS - 0 - - - FCK_INT_N2 - fSAMPLING=fCK_INT, N=2 - 1 - - - FCK_INT_N4 - fSAMPLING=fCK_INT, N=4 - 2 - - - FCK_INT_N8 - fSAMPLING=fCK_INT, N=8 - 3 - - - FDTS_Div2_N6 - fSAMPLING=fDTS/2, N=6 - 4 - - - FDTS_Div2_N8 - fSAMPLING=fDTS/2, N=8 - 5 - - - FDTS_Div4_N6 - fSAMPLING=fDTS/4, N=6 - 6 - - - FDTS_Div4_N8 - fSAMPLING=fDTS/4, N=8 - 7 - - - FDTS_Div8_N6 - fSAMPLING=fDTS/8, N=6 - 8 - - - FDTS_Div8_N8 - fSAMPLING=fDTS/8, N=8 - 9 - - - FDTS_Div16_N5 - fSAMPLING=fDTS/16, N=5 - 10 - - - FDTS_Div16_N6 - fSAMPLING=fDTS/16, N=6 - 11 - - - FDTS_Div16_N8 - fSAMPLING=fDTS/16, N=8 - 12 - - - FDTS_Div32_N5 - fSAMPLING=fDTS/32, N=5 - 13 - - - FDTS_Div32_N6 - fSAMPLING=fDTS/32, N=6 - 14 - - - FDTS_Div32_N8 - fSAMPLING=fDTS/32, N=8 - 15 - - - - - IC1PSC - Input capture 1 prescaler - 2 - 2 - - - CC1S - Capture/Compare 1 selection - 0 - 2 - - CC1S - read-write - - TI1 - CC1 channel is configured as input, IC1 is mapped on TI1 - 1 - - - TI2 - CC1 channel is configured as input, IC1 is mapped on TI2 - 2 - - - TRC - CC1 channel is configured as input, IC1 is mapped on TRC - 3 - - - - - - - CCMR2_Output - CCMR2_Output - capture/compare mode register 2 (output mode) - 0x1C - 0x20 - read-write - 0x00000000 - - - OC4CE - O24CE - 15 - 1 - - - OC4M - OC4M - 12 - 3 - - - - OC4PE - OC4PE - 11 - 1 - - OC4PE - read-write - - Disabled - Preload register on CCR4 disabled. New values written to CCR4 are taken into account immediately - 0 - - - Enabled - Preload register on CCR4 enabled. Preload value is loaded into active register on each update event - 1 - - - - - OC4FE - OC4FE - 10 - 1 - - - CC4S - CC4S - 8 - 2 - - CC4S - read-write - - Output - CC4 channel is configured as output - 0 - - - - - OC3CE - OC3CE - 7 - 1 - - - OC3M - OC3M - 4 - 3 - - OC3M - read-write - - Frozen - The comparison between the output compare register TIMx_CCRy and the counter TIMx_CNT has no effect on the outputs / OpmMode1: Retriggerable OPM mode 1 - In up-counting mode, the channel is active until a trigger event is detected (on TRGI signal). In down-counting mode, the channel is inactive - 0 - - - ActiveOnMatch - Set channel to active level on match. OCyREF signal is forced high when the counter matches the capture/compare register / OpmMode2: Inversely to OpmMode1 - 1 - - - InactiveOnMatch - Set channel to inactive level on match. OCyREF signal is forced low when the counter matches the capture/compare register / Reserved - 2 - - - Toggle - OCyREF toggles when TIMx_CNT=TIMx_CCRy / Reserved - 3 - - - ForceInactive - OCyREF is forced low / CombinedPwmMode1: OCyREF has the same behavior as in PWM mode 1. OCyREFC is the logical OR between OC1REF and OC2REF - 4 - - - ForceActive - OCyREF is forced high / CombinedPwmMode2: OCyREF has the same behavior as in PWM mode 2. OCyREFC is the logical AND between OC1REF and OC2REF - 5 - - - PwmMode1 - In upcounting, channel is active as long as TIMx_CNT<TIMx_CCRy else inactive. In downcounting, channel is inactive as long as TIMx_CNT>TIMx_CCRy else active / AsymmetricPwmMode1: OCyREF has the same behavior as in PWM mode 1. OCyREFC outputs OC1REF when the counter is counting up, OC2REF when it is counting down - 6 - - - PwmMode2 - Inversely to PwmMode1 / AsymmetricPwmMode2: Inversely to AsymmetricPwmMode1 - 7 - - - - - OC3PE - OC3PE - 3 - 1 - - OC3PE - read-write - - Disabled - Preload register on CCR3 disabled. New values written to CCR3 are taken into account immediately - 0 - - - Enabled - Preload register on CCR3 enabled. Preload value is loaded into active register on each update event - 1 - - - - - OC3FE - OC3FE - 2 - 1 - - - CC3S - CC3S - 0 - 2 - - CC3S - read-write - - Output - CC3 channel is configured as output - 0 - - - - - OC3M_3 - Output Compare 3 mode, bit 3 - 16 - 1 - - OC3M_3 - read-write - - Normal - Normal output compare mode (modes 0-7) - 0 - - - Extended - Extended output compare mode (modes 7-15) - 1 - - - - - OC4M_3 - Output Compare 4 mode, bit 3 - 24 - 1 - - - - - - CCMR2_Input - CCMR2_Input - capture/compare mode register 2 (input mode) - CCMR2_Output - 0x1C - 0x20 - read-write - 0x00000000 - - - IC4F - Input capture 4 filter - 12 - 4 - - - 0 - 15 - - - - - IC4PSC - Input capture 4 prescaler - 10 - 2 - - - 0 - 3 - - - - - CC4S - Capture/Compare 4 selection - 8 - 2 - - CC4S - read-write - - TI4 - CC4 channel is configured as input, IC4 is mapped on TI4 - 1 - - - TI3 - CC4 channel is configured as input, IC4 is mapped on TI3 - 2 - - - TRC - CC4 channel is configured as input, IC4 is mapped on TRC - 3 - - - - - IC3F - Input capture 3 filter - 4 - 4 - - - 0 - 15 - - - - - IC3PSC - Input capture 3 prescaler - 2 - 2 - - - 0 - 3 - - - - - CC3S - Capture/compare 3 selection - 0 - 2 - - CC3S - read-write - - TI3 - CC3 channel is configured as input, IC3 is mapped on TI3 - 1 - - - TI4 - CC3 channel is configured as input, IC3 is mapped on TI4 - 2 - - - TRC - CC3 channel is configured as input, IC3 is mapped on TRC - 3 - - - - - - - CCER - CCER - capture/compare enable register - 0x20 - 0x20 - read-write - 0x00000000 - - - CC4NP - Capture/Compare 4 output Polarity - 15 - 1 - - - CC4P - Capture/Compare 3 output Polarity - 13 - 1 - - - CC4E - Capture/Compare 4 output enable - 12 - 1 - - - CC3NP - Capture/Compare 3 output Polarity - 11 - 1 - - - CC3P - Capture/Compare 3 output Polarity - 9 - 1 - - - CC3E - Capture/Compare 3 output enable - 8 - 1 - - - CC2NP - Capture/Compare 2 output Polarity - 7 - 1 - - - CC2P - Capture/Compare 2 output Polarity - 5 - 1 - - - CC2E - Capture/Compare 2 output enable - 4 - 1 - - - CC1NP - Capture/Compare 1 output Polarity - 3 - 1 - - - CC1P - Capture/Compare 1 output Polarity - 1 - 1 - - - CC1E - Capture/Compare 1 output enable - 0 - 1 - - - - - CNT - CNT - counter - 0x24 - 0x20 - read-write - 0x00000000 - - - CNT - Counter value - 0 - 32 - - - 0 - 4294967295 - - - - - UIFCPY - UIF copy This bit is a read-only copy of the UIF bit of the TIMx_ISR register. If the UIFREMAP bit in the TIMxCR1 is reset, bit 31 is reserved and read at 0 - - 31 - 1 - read-only - - - - - PSC - PSC - prescaler - 0x28 - 0x20 - read-write - 0x00000000 - - - PSC - Prescaler value - 0 - 16 - - - 0 - 65535 - - - - - - - ARR - ARR - auto-reload register - 0x2C - 0x20 - read-write - 0x00000000 - - - ARR - Auto-reload value - 0 - 32 - - - 0 - 4294967295 - - - - - - - 4 - 0x4 - 1-4 - CCR%s - CCR1 - capture/compare register - 0x34 - 0x20 - read-write - 0x00000000 - - - CCR - Capture/Compare value - 0 - 32 - - - 0 - 4294967295 - - - - - - - DCR - DCR - DMA control register - 0x48 - 0x20 - read-write - 0x00000000 - - - DBL - DMA burst length - 8 - 5 - - - 0 - 18 - - - - - DBA - DMA base address - 0 - 5 - - - 0 - 31 - - - - - - - DMAR - DMAR - DMA address for full transfer - 0x4C - 0x20 - read-write - 0x00000000 - - - DMAB - DMA register for burst accesses - 0 - 32 - - - - - OR - OR1 - TIM2 option register 1 - 0x50 - 0x20 - read-write - 0x00000000 - - - ITR1_RMP - Internal trigger 1 remap - 10 - 2 - - - - - - - TIM3 - General purpose timers - TIM - 0x40000400 - - 0x0 - 0x400 - registers - - - TIM3 - TIM3 global interrupt - 29 - - - - CR1 - CR1 - control register 1 - 0x0 - 0x20 - read-write - 0x00000000 - - - CKD - Clock division - 8 - 2 - - CKD - read-write - - Div1 - t_DTS = t_CK_INT - 0 - - - Div2 - t_DTS = 2 × t_CK_INT - 1 - - - Div4 - t_DTS = 4 × t_CK_INT - 2 - - - - - ARPE - Auto-reload preload enable - 7 - 1 - - ARPE - read-write - - Disabled - TIMx_APRR register is not buffered - 0 - - - Enabled - TIMx_APRR register is buffered - 1 - - - - - CMS - Center-aligned mode selection - 5 - 2 - - CMS - read-write - - EdgeAligned - The counter counts up or down depending on the direction bit - 0 - - - CenterAligned1 - The counter counts up and down alternatively. Output compare interrupt flags are set only when the counter is counting down. - 1 - - - CenterAligned2 - The counter counts up and down alternatively. Output compare interrupt flags are set only when the counter is counting up. - 2 - - - CenterAligned3 - The counter counts up and down alternatively. Output compare interrupt flags are set both when the counter is counting up or down. - 3 - - - - - DIR - Direction - 4 - 1 - - DIR - read-write - - Up - Counter used as upcounter - 0 - - - Down - Counter used as downcounter - 1 - - - - - OPM - One-pulse mode - 3 - 1 - - OPM - read-write - - Disabled - Counter is not stopped at update event - 0 - - - Enabled - Counter stops counting at the next update event (clearing the CEN bit) - 1 - - - - - URS - Update request source - 2 - 1 - - URS - read-write - - AnyEvent - Any of counter overflow/underflow, setting UG, or update through slave mode, generates an update interrupt or DMA request - 0 - - - CounterOnly - Only counter overflow/underflow generates an update interrupt or DMA request - 1 - - - - - UDIS - Update disable - 1 - 1 - - UDIS - read-write - - Enabled - Update event enabled - 0 - - - Disabled - Update event disabled - 1 - - - - - CEN - Counter enable - 0 - 1 - - CEN - read-write - - Disabled - Counter disabled - 0 - - - Enabled - Counter enabled - 1 - - - - - UIFREMAP - UIF status bit remapping - 11 - 1 - - - - - CR2 - CR2 - control register 2 - 0x4 - 0x20 - read-write - 0x00000000 - - - TI1S - TI1 selection - 7 - 1 - - TI1S - read-write - - Normal - The TIMx_CH1 pin is connected to TI1 input - 0 - - - XOR - The TIMx_CH1, CH2, CH3 pins are connected to TI1 input - 1 - - - - - MMS - Master mode selection - 4 - 3 - - MMS - read-write - - Reset - The UG bit from the TIMx_EGR register is used as trigger output - 0 - - - Enable - The counter enable signal, CNT_EN, is used as trigger output - 1 - - - Update - The update event is selected as trigger output - 2 - - - ComparePulse - The trigger output send a positive pulse when the CC1IF flag it to be set, as soon as a capture or a compare match occurred - 3 - - - CompareOC1 - OC1REF signal is used as trigger output - 4 - - - CompareOC2 - OC2REF signal is used as trigger output - 5 - - - CompareOC3 - OC3REF signal is used as trigger output - 6 - - - CompareOC4 - OC4REF signal is used as trigger output - 7 - - - - - CCDS - Capture/compare DMA selection - 3 - 1 - - CCDS - read-write - - OnCompare - CCx DMA request sent when CCx event occurs - 0 - - - OnUpdate - CCx DMA request sent when update event occurs - 1 - - - - - - - SMCR - SMCR - slave mode control register - 0x8 - 0x20 - read-write - 0x00000000 - - - SMS - Slave mode selection - 0 - 3 - - SMS - read-write - - Disabled - Slave mode disabled - if CEN = ‘1 then the prescaler is clocked directly by the internal clock. - 0 - - - Encoder_Mode_1 - Encoder mode 1 - Counter counts up/down on TI2FP1 edge depending on TI1FP2 level. - 1 - - - Encoder_Mode_2 - Encoder mode 2 - Counter counts up/down on TI1FP2 edge depending on TI2FP1 level. - 2 - - - Encoder_Mode_3 - Encoder mode 3 - Counter counts up/down on both TI1FP1 and TI2FP2 edges depending on the level of the other input. - 3 - - - Reset_Mode - Reset Mode - Rising edge of the selected trigger input (TRGI) reinitializes the counter and generates an update of the registers. - 4 - - - Gated_Mode - Gated Mode - The counter clock is enabled when the trigger input (TRGI) is high. The counter stops (but is not reset) as soon as the trigger becomes low. Both start and stop of the counter are controlled. - 5 - - - Trigger_Mode - Trigger Mode - The counter starts at a rising edge of the trigger TRGI (but it is not reset). Only the start of the counter is controlled. - 6 - - - Ext_Clock_Mode - External Clock Mode 1 - Rising edges of the selected trigger (TRGI) clock the counter. - 7 - - - - - TS - Trigger selection - 4 - 3 - - TS - read-write - - ITR0 - Internal Trigger 0 (ITR0) - 0 - - - ITR1 - Internal Trigger 1 (ITR1) - 1 - - - ITR2 - Internal Trigger 2 (ITR2) - 2 - - - TI1F_ED - TI1 Edge Detector (TI1F_ED) - 4 - - - TI1FP1 - Filtered Timer Input 1 (TI1FP1) - 5 - - - TI2FP2 - Filtered Timer Input 2 (TI2FP2) - 6 - - - ETRF - External Trigger input (ETRF) - 7 - - - - - MSM - Master/Slave mode - 7 - 1 - - MSM - read-write - - NoSync - No action - 0 - - - Sync - The effect of an event on the trigger input (TRGI) is delayed to allow a perfect synchronization between the current timer and its slaves (through TRGO). It is useful if we want to synchronize several timers on a single external event. - 1 - - - - - ETF - External trigger filter - 8 - 4 - - ETF - read-write - - NoFilter - No filter, sampling is done at fDTS - 0 - - - FCK_INT_N2 - fSAMPLING=fCK_INT, N=2 - 1 - - - FCK_INT_N4 - fSAMPLING=fCK_INT, N=4 - 2 - - - FCK_INT_N8 - fSAMPLING=fCK_INT, N=8 - 3 - - - FDTS_Div2_N6 - fSAMPLING=fDTS/2, N=6 - 4 - - - FDTS_Div2_N8 - fSAMPLING=fDTS/2, N=8 - 5 - - - FDTS_Div4_N6 - fSAMPLING=fDTS/4, N=6 - 6 - - - FDTS_Div4_N8 - fSAMPLING=fDTS/4, N=8 - 7 - - - FDTS_Div8_N6 - fSAMPLING=fDTS/8, N=6 - 8 - - - FDTS_Div8_N8 - fSAMPLING=fDTS/8, N=8 - 9 - - - FDTS_Div16_N5 - fSAMPLING=fDTS/16, N=5 - 10 - - - FDTS_Div16_N6 - fSAMPLING=fDTS/16, N=6 - 11 - - - FDTS_Div16_N8 - fSAMPLING=fDTS/16, N=8 - 12 - - - FDTS_Div32_N5 - fSAMPLING=fDTS/32, N=5 - 13 - - - FDTS_Div32_N6 - fSAMPLING=fDTS/32, N=6 - 14 - - - FDTS_Div32_N8 - fSAMPLING=fDTS/32, N=8 - 15 - - - - - ETPS - External trigger prescaler - 12 - 2 - - ETPS - read-write - - Div1 - Prescaler OFF - 0 - - - Div2 - ETRP frequency divided by 2 - 1 - - - Div4 - ETRP frequency divided by 4 - 2 - - - Div8 - ETRP frequency divided by 8 - 3 - - - - - ECE - External clock enable - 14 - 1 - - ECE - read-write - - Disabled - External clock mode 2 disabled - 0 - - - Enabled - External clock mode 2 enabled. The counter is clocked by any active edge on the ETRF signal. - 1 - - - - - ETP - External trigger polarity - 15 - 1 - - ETP - read-write - - NotInverted - ETR is noninverted, active at high level or rising edge - 0 - - - Inverted - ETR is inverted, active at low level or falling edge - 1 - - - - - SMS_3 - Slave model selection - bit[3] - 16 - 1 - - - - - DIER - DIER - DMA/Interrupt enable register - 0xC - 0x20 - read-write - 0x00000000 - - - TDE - Trigger DMA request enable - 14 - 1 - - TDE - read-write - - Disabled - Trigger DMA request disabled - 0 - - - Enabled - Trigger DMA request enabled - 1 - - - - - CC4DE - Capture/Compare 4 DMA request enable - 12 - 1 - - - - CC3DE - Capture/Compare 3 DMA request enable - 11 - 1 - - - - CC2DE - Capture/Compare 2 DMA request enable - 10 - 1 - - - - CC1DE - Capture/Compare 1 DMA request enable - 9 - 1 - - CC1DE - read-write - - Disabled - CCx DMA request disabled - 0 - - - Enabled - CCx DMA request enabled - 1 - - - - - UDE - Update DMA request enable - 8 - 1 - - UDE - read-write - - Disabled - Update DMA request disabled - 0 - - - Enabled - Update DMA request enabled - 1 - - - - - TIE - Trigger interrupt enable - 6 - 1 - - TIE - read-write - - Disabled - Trigger interrupt disabled - 0 - - - Enabled - Trigger interrupt enabled - 1 - - - - - CC4IE - Capture/Compare 4 interrupt enable - 4 - 1 - - - - CC3IE - Capture/Compare 3 interrupt enable - 3 - 1 - - - - CC2IE - Capture/Compare 2 interrupt enable - 2 - 1 - - - - CC1IE - Capture/Compare 1 interrupt enable - 1 - 1 - - CC1IE - read-write - - Disabled - CCx interrupt disabled - 0 - - - Enabled - CCx interrupt enabled - 1 - - - - - UIE - Update interrupt enable - 0 - 1 - - UIE - read-write - - Disabled - Update interrupt disabled - 0 - - - Enabled - Update interrupt enabled - 1 - - - - - - - SR - SR - status register - 0x10 - 0x20 - read-write - 0x00000000 - - - CC4OF - Capture/Compare 4 overcapture flag - 12 - 1 - zeroToClear - - read - - - write - - - - CC3OF - Capture/Compare 3 overcapture flag - 11 - 1 - zeroToClear - - read - - - write - - - - CC2OF - Capture/compare 2 overcapture flag - 10 - 1 - zeroToClear - - read - - - write - - - - CC1OF - Capture/Compare 1 overcapture flag - 9 - 1 - zeroToClear - - CC1OFR - read - - Overcapture - The counter value has been captured in TIMx_CCRx register while CCxIF flag was already set - 1 - - - - CC1OFW - write - - Clear - Clear flag - 0 - - - - - TIF - Trigger interrupt flag - 6 - 1 - zeroToClear - - TIFR - read - - NoTrigger - No trigger event occurred - 0 - - - Trigger - Trigger interrupt pending - 1 - - - - TIFW - write - - Clear - Clear flag - 0 - - - - - CC4IF - Capture/Compare 4 interrupt flag - 4 - 1 - zeroToClear - - read - - - write - - - - CC3IF - Capture/Compare 3 interrupt flag - 3 - 1 - zeroToClear - - read - - - write - - - - CC2IF - Capture/Compare 2 interrupt flag - 2 - 1 - zeroToClear - - read - - - write - - - - CC1IF - Capture/compare 1 interrupt flag - 1 - 1 - zeroToClear - - CC1IFR - read - - Match - If CC1 is an output: The content of the counter TIMx_CNT matches the content of the TIMx_CCR1 register. If CC1 is an input: The counter value has been captured in TIMx_CCR1 register. - 1 - - - - CC1IFW - write - - Clear - Clear flag - 0 - - - - - UIF - Update interrupt flag - 0 - 1 - zeroToClear - - UIFR - read - - NoUpdateOccurred - No update occurred - 0 - - - UpdatePending - Update interrupt pending - 1 - - - - UIFW - write - - Clear - Clear flag - 0 - - - - - - - EGR - EGR - event generation register - 0x14 - 0x20 - write-only - 0x00000000 - - - TG - Trigger generation - 6 - 1 - - TGW - write - - Trigger - The TIF flag is set in TIMx_SR register. Related interrupt or DMA transfer can occur if enabled. - 1 - - - - - CC4G - Capture/compare 4 generation - 4 - 1 - - - - CC3G - Capture/compare 3 generation - 3 - 1 - - - - CC2G - Capture/compare 2 generation - 2 - 1 - - - - CC1G - Capture/compare 1 generation - 1 - 1 - - CC1GW - write - - Trigger - If CC1 is an output: CC1IF flag is set, Corresponding interrupt or DMA request is sent if enabled. If CC1 is an input: The current value of the counter is captured in TIMx_CCR1 register. - 1 - - - - - UG - Update generation - 0 - 1 - - UG - write - - Update - Re-initializes the timer counter and generates an update of the registers. - 1 - - - - - - - CCMR1_Output - CCMR1_Output - capture/compare mode register 1 (output mode) - 0x18 - 0x20 - read-write - 0x00000000 - - - OC2CE - OC2CE - 15 - 1 - - - OC2M - OC2M - 12 - 3 - - - - OC2PE - OC2PE - 11 - 1 - - OC2PE - read-write - - Disabled - Preload register on CCR2 disabled. New values written to CCR2 are taken into account immediately - 0 - - - Enabled - Preload register on CCR2 enabled. Preload value is loaded into active register on each update event - 1 - - - - - OC2FE - OC2FE - 10 - 1 - - - CC2S - CC2S - 8 - 2 - - CC2S - read-write - - Output - CC2 channel is configured as output - 0 - - - - - OC1CE - OC1CE - 7 - 1 - - - OC1M - OC1M - 4 - 3 - - OC1M - read-write - - Frozen - The comparison between the output compare register TIMx_CCRy and the counter TIMx_CNT has no effect on the outputs / OpmMode1: Retriggerable OPM mode 1 - In up-counting mode, the channel is active until a trigger event is detected (on TRGI signal). In down-counting mode, the channel is inactive - 0 - - - ActiveOnMatch - Set channel to active level on match. OCyREF signal is forced high when the counter matches the capture/compare register / OpmMode2: Inversely to OpmMode1 - 1 - - - InactiveOnMatch - Set channel to inactive level on match. OCyREF signal is forced low when the counter matches the capture/compare register / Reserved - 2 - - - Toggle - OCyREF toggles when TIMx_CNT=TIMx_CCRy / Reserved - 3 - - - ForceInactive - OCyREF is forced low / CombinedPwmMode1: OCyREF has the same behavior as in PWM mode 1. OCyREFC is the logical OR between OC1REF and OC2REF - 4 - - - ForceActive - OCyREF is forced high / CombinedPwmMode2: OCyREF has the same behavior as in PWM mode 2. OCyREFC is the logical AND between OC1REF and OC2REF - 5 - - - PwmMode1 - In upcounting, channel is active as long as TIMx_CNT<TIMx_CCRy else inactive. In downcounting, channel is inactive as long as TIMx_CNT>TIMx_CCRy else active / AsymmetricPwmMode1: OCyREF has the same behavior as in PWM mode 1. OCyREFC outputs OC1REF when the counter is counting up, OC2REF when it is counting down - 6 - - - PwmMode2 - Inversely to PwmMode1 / AsymmetricPwmMode2: Inversely to AsymmetricPwmMode1 - 7 - - - - - OC1PE - OC1PE - 3 - 1 - - OC1PE - read-write - - Disabled - Preload register on CCR1 disabled. New values written to CCR1 are taken into account immediately - 0 - - - Enabled - Preload register on CCR1 enabled. Preload value is loaded into active register on each update event - 1 - - - - - OC1FE - OC1FE - 2 - 1 - - - CC1S - CC1S - 0 - 2 - - CC1S - read-write - - Output - CC1 channel is configured as output - 0 - - - - - OC2M_3 - Output Compare 2 mode, bit 3 - 24 - 1 - - - - OC1M_3 - Output Compare 1 mode, bit 3 - 16 - 1 - - OC1M_3 - read-write - - Normal - Normal output compare mode (modes 0-7) - 0 - - - Extended - Extended output compare mode (modes 7-15) - 1 - - - - - - - CCMR1_Input - CCMR1_Input - capture/compare mode register 1 (input mode) - CCMR1_Output - 0x18 - 0x20 - read-write - 0x00000000 - - - IC2F - Input capture 2 filter - 12 - 4 - - - 0 - 15 - - - - - IC2PSC - Input capture 2 prescaler - 10 - 2 - - - CC2S - Capture/Compare 2 selection - 8 - 2 - - CC2S - read-write - - TI2 - CC2 channel is configured as input, IC2 is mapped on TI2 - 1 - - - TI1 - CC2 channel is configured as input, IC2 is mapped on TI1 - 2 - - - TRC - CC2 channel is configured as input, IC2 is mapped on TRC - 3 - - - - - IC1F - Input capture 1 filter - 4 - 4 - - IC1F - read-write - - NoFilter - No filter, sampling is done at fDTS - 0 - - - FCK_INT_N2 - fSAMPLING=fCK_INT, N=2 - 1 - - - FCK_INT_N4 - fSAMPLING=fCK_INT, N=4 - 2 - - - FCK_INT_N8 - fSAMPLING=fCK_INT, N=8 - 3 - - - FDTS_Div2_N6 - fSAMPLING=fDTS/2, N=6 - 4 - - - FDTS_Div2_N8 - fSAMPLING=fDTS/2, N=8 - 5 - - - FDTS_Div4_N6 - fSAMPLING=fDTS/4, N=6 - 6 - - - FDTS_Div4_N8 - fSAMPLING=fDTS/4, N=8 - 7 - - - FDTS_Div8_N6 - fSAMPLING=fDTS/8, N=6 - 8 - - - FDTS_Div8_N8 - fSAMPLING=fDTS/8, N=8 - 9 - - - FDTS_Div16_N5 - fSAMPLING=fDTS/16, N=5 - 10 - - - FDTS_Div16_N6 - fSAMPLING=fDTS/16, N=6 - 11 - - - FDTS_Div16_N8 - fSAMPLING=fDTS/16, N=8 - 12 - - - FDTS_Div32_N5 - fSAMPLING=fDTS/32, N=5 - 13 - - - FDTS_Div32_N6 - fSAMPLING=fDTS/32, N=6 - 14 - - - FDTS_Div32_N8 - fSAMPLING=fDTS/32, N=8 - 15 - - - - - IC1PSC - Input capture 1 prescaler - 2 - 2 - - - CC1S - Capture/Compare 1 selection - 0 - 2 - - CC1S - read-write - - TI1 - CC1 channel is configured as input, IC1 is mapped on TI1 - 1 - - - TI2 - CC1 channel is configured as input, IC1 is mapped on TI2 - 2 - - - TRC - CC1 channel is configured as input, IC1 is mapped on TRC - 3 - - - - - - - CCMR2_Output - CCMR2_Output - capture/compare mode register 2 (output mode) - 0x1C - 0x20 - read-write - 0x00000000 - - - OC4CE - O24CE - 15 - 1 - - - OC4M - OC4M - 12 - 3 - - - - OC4PE - OC4PE - 11 - 1 - - OC4PE - read-write - - Disabled - Preload register on CCR4 disabled. New values written to CCR4 are taken into account immediately - 0 - - - Enabled - Preload register on CCR4 enabled. Preload value is loaded into active register on each update event - 1 - - - - - OC4FE - OC4FE - 10 - 1 - - - CC4S - CC4S - 8 - 2 - - CC4S - read-write - - Output - CC4 channel is configured as output - 0 - - - - - OC3CE - OC3CE - 7 - 1 - - - OC3M - OC3M - 4 - 3 - - OC3M - read-write - - Frozen - The comparison between the output compare register TIMx_CCRy and the counter TIMx_CNT has no effect on the outputs / OpmMode1: Retriggerable OPM mode 1 - In up-counting mode, the channel is active until a trigger event is detected (on TRGI signal). In down-counting mode, the channel is inactive - 0 - - - ActiveOnMatch - Set channel to active level on match. OCyREF signal is forced high when the counter matches the capture/compare register / OpmMode2: Inversely to OpmMode1 - 1 - - - InactiveOnMatch - Set channel to inactive level on match. OCyREF signal is forced low when the counter matches the capture/compare register / Reserved - 2 - - - Toggle - OCyREF toggles when TIMx_CNT=TIMx_CCRy / Reserved - 3 - - - ForceInactive - OCyREF is forced low / CombinedPwmMode1: OCyREF has the same behavior as in PWM mode 1. OCyREFC is the logical OR between OC1REF and OC2REF - 4 - - - ForceActive - OCyREF is forced high / CombinedPwmMode2: OCyREF has the same behavior as in PWM mode 2. OCyREFC is the logical AND between OC1REF and OC2REF - 5 - - - PwmMode1 - In upcounting, channel is active as long as TIMx_CNT<TIMx_CCRy else inactive. In downcounting, channel is inactive as long as TIMx_CNT>TIMx_CCRy else active / AsymmetricPwmMode1: OCyREF has the same behavior as in PWM mode 1. OCyREFC outputs OC1REF when the counter is counting up, OC2REF when it is counting down - 6 - - - PwmMode2 - Inversely to PwmMode1 / AsymmetricPwmMode2: Inversely to AsymmetricPwmMode1 - 7 - - - - - OC3PE - OC3PE - 3 - 1 - - OC3PE - read-write - - Disabled - Preload register on CCR3 disabled. New values written to CCR3 are taken into account immediately - 0 - - - Enabled - Preload register on CCR3 enabled. Preload value is loaded into active register on each update event - 1 - - - - - OC3FE - OC3FE - 2 - 1 - - - CC3S - CC3S - 0 - 2 - - CC3S - read-write - - Output - CC3 channel is configured as output - 0 - - - - - OC3M_3 - Output Compare 3 mode, bit 3 - 16 - 1 - - OC3M_3 - read-write - - Normal - Normal output compare mode (modes 0-7) - 0 - - - Extended - Extended output compare mode (modes 7-15) - 1 - - - - - OC4M_3 - Output Compare 4 mode, bit 3 - 24 - 1 - - - - - - CCMR2_Input - CCMR2_Input - capture/compare mode register 2 (input mode) - CCMR2_Output - 0x1C - 0x20 - read-write - 0x00000000 - - - IC4F - Input capture 4 filter - 12 - 4 - - - 0 - 15 - - - - - IC4PSC - Input capture 4 prescaler - 10 - 2 - - - 0 - 3 - - - - - CC4S - Capture/Compare 4 selection - 8 - 2 - - CC4S - read-write - - TI4 - CC4 channel is configured as input, IC4 is mapped on TI4 - 1 - - - TI3 - CC4 channel is configured as input, IC4 is mapped on TI3 - 2 - - - TRC - CC4 channel is configured as input, IC4 is mapped on TRC - 3 - - - - - IC3F - Input capture 3 filter - 4 - 4 - - - 0 - 15 - - - - - IC3PSC - Input capture 3 prescaler - 2 - 2 - - - 0 - 3 - - - - - CC3S - Capture/compare 3 selection - 0 - 2 - - CC3S - read-write - - TI3 - CC3 channel is configured as input, IC3 is mapped on TI3 - 1 - - - TI4 - CC3 channel is configured as input, IC3 is mapped on TI4 - 2 - - - TRC - CC3 channel is configured as input, IC3 is mapped on TRC - 3 - - - - - - - CCER - CCER - capture/compare enable register - 0x20 - 0x20 - read-write - 0x00000000 - - - CC4NP - Capture/Compare 4 output Polarity - 15 - 1 - - - CC4P - Capture/Compare 3 output Polarity - 13 - 1 - - - CC4E - Capture/Compare 4 output enable - 12 - 1 - - - CC3NP - Capture/Compare 3 output Polarity - 11 - 1 - - - CC3P - Capture/Compare 3 output Polarity - 9 - 1 - - - CC3E - Capture/Compare 3 output enable - 8 - 1 - - - CC2NP - Capture/Compare 2 output Polarity - 7 - 1 - - - CC2P - Capture/Compare 2 output Polarity - 5 - 1 - - - CC2E - Capture/Compare 2 output enable - 4 - 1 - - - CC1NP - Capture/Compare 1 output Polarity - 3 - 1 - - - CC1P - Capture/Compare 1 output Polarity - 1 - 1 - - - CC1E - Capture/Compare 1 output enable - 0 - 1 - - - - - CNT - CNT - counter - 0x24 - 0x20 - read-write - 0x00000000 - - - CNT - Counter value - 0 - 16 - - - 0 - 65535 - - - - - UIFCPY - UIF copy This bit is a read-only copy of the UIF bit of the TIMx_ISR register. If the UIFREMAP bit in the TIMxCR1 is reset, bit 31 is reserved and read at 0 - - 31 - 1 - read-only - - - - - PSC - PSC - prescaler - 0x28 - 0x20 - read-write - 0x00000000 - - - PSC - Prescaler value - 0 - 16 - - - 0 - 65535 - - - - - - - ARR - ARR - auto-reload register - 0x2C - 0x20 - read-write - 0x00000000 - - - ARR - Auto-reload value - 0 - 16 - - - 0 - 65535 - - - - - - - 4 - 0x4 - 1-4 - CCR%s - CCR1 - capture/compare register - 0x34 - 0x20 - read-write - 0x00000000 - - - CCR - Capture/Compare value - 0 - 16 - - - 0 - 65535 - - - - - - - DCR - DCR - DMA control register - 0x48 - 0x20 - read-write - 0x00000000 - - - DBL - DMA burst length - 8 - 5 - - - 0 - 18 - - - - - DBA - DMA base address - 0 - 5 - - - 0 - 31 - - - - - - - DMAR - DMAR - DMA address for full transfer - 0x4C - 0x20 - read-write - 0x00000000 - - - DMAB - DMA register for burst accesses - 0 - 32 - - - - - - - TIM4 - General purpose timers - TIM - 0x40000800 - - TIM4 - TIM4 global interrupt - 30 - - - - TIM5 - General purpose timers - TIM - 0x40000C00 - - 0x0 - 0x400 - registers - - - TIM5 - TIM5 global interrupt - 50 - - - - CR1 - CR1 - control register 1 - 0x0 - 0x20 - read-write - 0x00000000 - - - CKD - Clock division - 8 - 2 - - CKD - read-write - - Div1 - t_DTS = t_CK_INT - 0 - - - Div2 - t_DTS = 2 × t_CK_INT - 1 - - - Div4 - t_DTS = 4 × t_CK_INT - 2 - - - - - ARPE - Auto-reload preload enable - 7 - 1 - - ARPE - read-write - - Disabled - TIMx_APRR register is not buffered - 0 - - - Enabled - TIMx_APRR register is buffered - 1 - - - - - CMS - Center-aligned mode selection - 5 - 2 - - CMS - read-write - - EdgeAligned - The counter counts up or down depending on the direction bit - 0 - - - CenterAligned1 - The counter counts up and down alternatively. Output compare interrupt flags are set only when the counter is counting down. - 1 - - - CenterAligned2 - The counter counts up and down alternatively. Output compare interrupt flags are set only when the counter is counting up. - 2 - - - CenterAligned3 - The counter counts up and down alternatively. Output compare interrupt flags are set both when the counter is counting up or down. - 3 - - - - - DIR - Direction - 4 - 1 - - DIR - read-write - - Up - Counter used as upcounter - 0 - - - Down - Counter used as downcounter - 1 - - - - - OPM - One-pulse mode - 3 - 1 - - OPM - read-write - - Disabled - Counter is not stopped at update event - 0 - - - Enabled - Counter stops counting at the next update event (clearing the CEN bit) - 1 - - - - - URS - Update request source - 2 - 1 - - URS - read-write - - AnyEvent - Any of counter overflow/underflow, setting UG, or update through slave mode, generates an update interrupt or DMA request - 0 - - - CounterOnly - Only counter overflow/underflow generates an update interrupt or DMA request - 1 - - - - - UDIS - Update disable - 1 - 1 - - UDIS - read-write - - Enabled - Update event enabled - 0 - - - Disabled - Update event disabled - 1 - - - - - CEN - Counter enable - 0 - 1 - - CEN - read-write - - Disabled - Counter disabled - 0 - - - Enabled - Counter enabled - 1 - - - - - UIFREMAP - UIF status bit remapping - 11 - 1 - - - - - CR2 - CR2 - control register 2 - 0x4 - 0x20 - read-write - 0x00000000 - - - TI1S - TI1 selection - 7 - 1 - - TI1S - read-write - - Normal - The TIMx_CH1 pin is connected to TI1 input - 0 - - - XOR - The TIMx_CH1, CH2, CH3 pins are connected to TI1 input - 1 - - - - - MMS - Master mode selection - 4 - 3 - - MMS - read-write - - Reset - The UG bit from the TIMx_EGR register is used as trigger output - 0 - - - Enable - The counter enable signal, CNT_EN, is used as trigger output - 1 - - - Update - The update event is selected as trigger output - 2 - - - ComparePulse - The trigger output send a positive pulse when the CC1IF flag it to be set, as soon as a capture or a compare match occurred - 3 - - - CompareOC1 - OC1REF signal is used as trigger output - 4 - - - CompareOC2 - OC2REF signal is used as trigger output - 5 - - - CompareOC3 - OC3REF signal is used as trigger output - 6 - - - CompareOC4 - OC4REF signal is used as trigger output - 7 - - - - - CCDS - Capture/compare DMA selection - 3 - 1 - - CCDS - read-write - - OnCompare - CCx DMA request sent when CCx event occurs - 0 - - - OnUpdate - CCx DMA request sent when update event occurs - 1 - - - - - - - SMCR - SMCR - slave mode control register - 0x8 - 0x20 - read-write - 0x00000000 - - - SMS - Slave mode selection - 0 - 3 - - SMS - read-write - - Disabled - Slave mode disabled - if CEN = ‘1 then the prescaler is clocked directly by the internal clock. - 0 - - - Encoder_Mode_1 - Encoder mode 1 - Counter counts up/down on TI2FP1 edge depending on TI1FP2 level. - 1 - - - Encoder_Mode_2 - Encoder mode 2 - Counter counts up/down on TI1FP2 edge depending on TI2FP1 level. - 2 - - - Encoder_Mode_3 - Encoder mode 3 - Counter counts up/down on both TI1FP1 and TI2FP2 edges depending on the level of the other input. - 3 - - - Reset_Mode - Reset Mode - Rising edge of the selected trigger input (TRGI) reinitializes the counter and generates an update of the registers. - 4 - - - Gated_Mode - Gated Mode - The counter clock is enabled when the trigger input (TRGI) is high. The counter stops (but is not reset) as soon as the trigger becomes low. Both start and stop of the counter are controlled. - 5 - - - Trigger_Mode - Trigger Mode - The counter starts at a rising edge of the trigger TRGI (but it is not reset). Only the start of the counter is controlled. - 6 - - - Ext_Clock_Mode - External Clock Mode 1 - Rising edges of the selected trigger (TRGI) clock the counter. - 7 - - - - - TS - Trigger selection - 4 - 3 - - TS - read-write - - ITR0 - Internal Trigger 0 (ITR0) - 0 - - - ITR1 - Internal Trigger 1 (ITR1) - 1 - - - ITR2 - Internal Trigger 2 (ITR2) - 2 - - - TI1F_ED - TI1 Edge Detector (TI1F_ED) - 4 - - - TI1FP1 - Filtered Timer Input 1 (TI1FP1) - 5 - - - TI2FP2 - Filtered Timer Input 2 (TI2FP2) - 6 - - - ETRF - External Trigger input (ETRF) - 7 - - - - - MSM - Master/Slave mode - 7 - 1 - - MSM - read-write - - NoSync - No action - 0 - - - Sync - The effect of an event on the trigger input (TRGI) is delayed to allow a perfect synchronization between the current timer and its slaves (through TRGO). It is useful if we want to synchronize several timers on a single external event. - 1 - - - - - ETF - External trigger filter - 8 - 4 - - ETF - read-write - - NoFilter - No filter, sampling is done at fDTS - 0 - - - FCK_INT_N2 - fSAMPLING=fCK_INT, N=2 - 1 - - - FCK_INT_N4 - fSAMPLING=fCK_INT, N=4 - 2 - - - FCK_INT_N8 - fSAMPLING=fCK_INT, N=8 - 3 - - - FDTS_Div2_N6 - fSAMPLING=fDTS/2, N=6 - 4 - - - FDTS_Div2_N8 - fSAMPLING=fDTS/2, N=8 - 5 - - - FDTS_Div4_N6 - fSAMPLING=fDTS/4, N=6 - 6 - - - FDTS_Div4_N8 - fSAMPLING=fDTS/4, N=8 - 7 - - - FDTS_Div8_N6 - fSAMPLING=fDTS/8, N=6 - 8 - - - FDTS_Div8_N8 - fSAMPLING=fDTS/8, N=8 - 9 - - - FDTS_Div16_N5 - fSAMPLING=fDTS/16, N=5 - 10 - - - FDTS_Div16_N6 - fSAMPLING=fDTS/16, N=6 - 11 - - - FDTS_Div16_N8 - fSAMPLING=fDTS/16, N=8 - 12 - - - FDTS_Div32_N5 - fSAMPLING=fDTS/32, N=5 - 13 - - - FDTS_Div32_N6 - fSAMPLING=fDTS/32, N=6 - 14 - - - FDTS_Div32_N8 - fSAMPLING=fDTS/32, N=8 - 15 - - - - - ETPS - External trigger prescaler - 12 - 2 - - ETPS - read-write - - Div1 - Prescaler OFF - 0 - - - Div2 - ETRP frequency divided by 2 - 1 - - - Div4 - ETRP frequency divided by 4 - 2 - - - Div8 - ETRP frequency divided by 8 - 3 - - - - - ECE - External clock enable - 14 - 1 - - ECE - read-write - - Disabled - External clock mode 2 disabled - 0 - - - Enabled - External clock mode 2 enabled. The counter is clocked by any active edge on the ETRF signal. - 1 - - - - - ETP - External trigger polarity - 15 - 1 - - ETP - read-write - - NotInverted - ETR is noninverted, active at high level or rising edge - 0 - - - Inverted - ETR is inverted, active at low level or falling edge - 1 - - - - - SMS_3 - Slave model selection - bit[3] - 16 - 1 - - - - - DIER - DIER - DMA/Interrupt enable register - 0xC - 0x20 - read-write - 0x00000000 - - - TDE - Trigger DMA request enable - 14 - 1 - - TDE - read-write - - Disabled - Trigger DMA request disabled - 0 - - - Enabled - Trigger DMA request enabled - 1 - - - - - CC4DE - Capture/Compare 4 DMA request enable - 12 - 1 - - - - CC3DE - Capture/Compare 3 DMA request enable - 11 - 1 - - - - CC2DE - Capture/Compare 2 DMA request enable - 10 - 1 - - - - CC1DE - Capture/Compare 1 DMA request enable - 9 - 1 - - CC1DE - read-write - - Disabled - CCx DMA request disabled - 0 - - - Enabled - CCx DMA request enabled - 1 - - - - - UDE - Update DMA request enable - 8 - 1 - - UDE - read-write - - Disabled - Update DMA request disabled - 0 - - - Enabled - Update DMA request enabled - 1 - - - - - TIE - Trigger interrupt enable - 6 - 1 - - TIE - read-write - - Disabled - Trigger interrupt disabled - 0 - - - Enabled - Trigger interrupt enabled - 1 - - - - - CC4IE - Capture/Compare 4 interrupt enable - 4 - 1 - - - - CC3IE - Capture/Compare 3 interrupt enable - 3 - 1 - - - - CC2IE - Capture/Compare 2 interrupt enable - 2 - 1 - - - - CC1IE - Capture/Compare 1 interrupt enable - 1 - 1 - - CC1IE - read-write - - Disabled - CCx interrupt disabled - 0 - - - Enabled - CCx interrupt enabled - 1 - - - - - UIE - Update interrupt enable - 0 - 1 - - UIE - read-write - - Disabled - Update interrupt disabled - 0 - - - Enabled - Update interrupt enabled - 1 - - - - - - - SR - SR - status register - 0x10 - 0x20 - read-write - 0x00000000 - - - CC4OF - Capture/Compare 4 overcapture flag - 12 - 1 - zeroToClear - - read - - - write - - - - CC3OF - Capture/Compare 3 overcapture flag - 11 - 1 - zeroToClear - - read - - - write - - - - CC2OF - Capture/compare 2 overcapture flag - 10 - 1 - zeroToClear - - read - - - write - - - - CC1OF - Capture/Compare 1 overcapture flag - 9 - 1 - zeroToClear - - CC1OFR - read - - Overcapture - The counter value has been captured in TIMx_CCRx register while CCxIF flag was already set - 1 - - - - CC1OFW - write - - Clear - Clear flag - 0 - - - - - TIF - Trigger interrupt flag - 6 - 1 - zeroToClear - - TIFR - read - - NoTrigger - No trigger event occurred - 0 - - - Trigger - Trigger interrupt pending - 1 - - - - TIFW - write - - Clear - Clear flag - 0 - - - - - CC4IF - Capture/Compare 4 interrupt flag - 4 - 1 - zeroToClear - - read - - - write - - - - CC3IF - Capture/Compare 3 interrupt flag - 3 - 1 - zeroToClear - - read - - - write - - - - CC2IF - Capture/Compare 2 interrupt flag - 2 - 1 - zeroToClear - - read - - - write - - - - CC1IF - Capture/compare 1 interrupt flag - 1 - 1 - zeroToClear - - CC1IFR - read - - Match - If CC1 is an output: The content of the counter TIMx_CNT matches the content of the TIMx_CCR1 register. If CC1 is an input: The counter value has been captured in TIMx_CCR1 register. - 1 - - - - CC1IFW - write - - Clear - Clear flag - 0 - - - - - UIF - Update interrupt flag - 0 - 1 - zeroToClear - - UIFR - read - - NoUpdateOccurred - No update occurred - 0 - - - UpdatePending - Update interrupt pending - 1 - - - - UIFW - write - - Clear - Clear flag - 0 - - - - - - - EGR - EGR - event generation register - 0x14 - 0x20 - write-only - 0x00000000 - - - TG - Trigger generation - 6 - 1 - - TGW - write - - Trigger - The TIF flag is set in TIMx_SR register. Related interrupt or DMA transfer can occur if enabled. - 1 - - - - - CC4G - Capture/compare 4 generation - 4 - 1 - - - - CC3G - Capture/compare 3 generation - 3 - 1 - - - - CC2G - Capture/compare 2 generation - 2 - 1 - - - - CC1G - Capture/compare 1 generation - 1 - 1 - - CC1GW - write - - Trigger - If CC1 is an output: CC1IF flag is set, Corresponding interrupt or DMA request is sent if enabled. If CC1 is an input: The current value of the counter is captured in TIMx_CCR1 register. - 1 - - - - - UG - Update generation - 0 - 1 - - UG - write - - Update - Re-initializes the timer counter and generates an update of the registers. - 1 - - - - - - - CCMR1_Output - CCMR1_Output - capture/compare mode register 1 (output mode) - 0x18 - 0x20 - read-write - 0x00000000 - - - OC2CE - OC2CE - 15 - 1 - - - OC2M - OC2M - 12 - 3 - - - - OC2PE - OC2PE - 11 - 1 - - OC2PE - read-write - - Disabled - Preload register on CCR2 disabled. New values written to CCR2 are taken into account immediately - 0 - - - Enabled - Preload register on CCR2 enabled. Preload value is loaded into active register on each update event - 1 - - - - - OC2FE - OC2FE - 10 - 1 - - - CC2S - CC2S - 8 - 2 - - CC2S - read-write - - Output - CC2 channel is configured as output - 0 - - - - - OC1CE - OC1CE - 7 - 1 - - - OC1M - OC1M - 4 - 3 - - OC1M - read-write - - Frozen - The comparison between the output compare register TIMx_CCRy and the counter TIMx_CNT has no effect on the outputs / OpmMode1: Retriggerable OPM mode 1 - In up-counting mode, the channel is active until a trigger event is detected (on TRGI signal). In down-counting mode, the channel is inactive - 0 - - - ActiveOnMatch - Set channel to active level on match. OCyREF signal is forced high when the counter matches the capture/compare register / OpmMode2: Inversely to OpmMode1 - 1 - - - InactiveOnMatch - Set channel to inactive level on match. OCyREF signal is forced low when the counter matches the capture/compare register / Reserved - 2 - - - Toggle - OCyREF toggles when TIMx_CNT=TIMx_CCRy / Reserved - 3 - - - ForceInactive - OCyREF is forced low / CombinedPwmMode1: OCyREF has the same behavior as in PWM mode 1. OCyREFC is the logical OR between OC1REF and OC2REF - 4 - - - ForceActive - OCyREF is forced high / CombinedPwmMode2: OCyREF has the same behavior as in PWM mode 2. OCyREFC is the logical AND between OC1REF and OC2REF - 5 - - - PwmMode1 - In upcounting, channel is active as long as TIMx_CNT<TIMx_CCRy else inactive. In downcounting, channel is inactive as long as TIMx_CNT>TIMx_CCRy else active / AsymmetricPwmMode1: OCyREF has the same behavior as in PWM mode 1. OCyREFC outputs OC1REF when the counter is counting up, OC2REF when it is counting down - 6 - - - PwmMode2 - Inversely to PwmMode1 / AsymmetricPwmMode2: Inversely to AsymmetricPwmMode1 - 7 - - - - - OC1PE - OC1PE - 3 - 1 - - OC1PE - read-write - - Disabled - Preload register on CCR1 disabled. New values written to CCR1 are taken into account immediately - 0 - - - Enabled - Preload register on CCR1 enabled. Preload value is loaded into active register on each update event - 1 - - - - - OC1FE - OC1FE - 2 - 1 - - - CC1S - CC1S - 0 - 2 - - CC1S - read-write - - Output - CC1 channel is configured as output - 0 - - - - - OC2M_3 - Output Compare 2 mode, bit 3 - 24 - 1 - - - - OC1M_3 - Output Compare 1 mode, bit 3 - 16 - 1 - - OC1M_3 - read-write - - Normal - Normal output compare mode (modes 0-7) - 0 - - - Extended - Extended output compare mode (modes 7-15) - 1 - - - - - - - CCMR1_Input - CCMR1_Input - capture/compare mode register 1 (input mode) - CCMR1_Output - 0x18 - 0x20 - read-write - 0x00000000 - - - IC2F - Input capture 2 filter - 12 - 4 - - - 0 - 15 - - - - - IC2PSC - Input capture 2 prescaler - 10 - 2 - - - CC2S - Capture/Compare 2 selection - 8 - 2 - - CC2S - read-write - - TI2 - CC2 channel is configured as input, IC2 is mapped on TI2 - 1 - - - TI1 - CC2 channel is configured as input, IC2 is mapped on TI1 - 2 - - - TRC - CC2 channel is configured as input, IC2 is mapped on TRC - 3 - - - - - IC1F - Input capture 1 filter - 4 - 4 - - IC1F - read-write - - NoFilter - No filter, sampling is done at fDTS - 0 - - - FCK_INT_N2 - fSAMPLING=fCK_INT, N=2 - 1 - - - FCK_INT_N4 - fSAMPLING=fCK_INT, N=4 - 2 - - - FCK_INT_N8 - fSAMPLING=fCK_INT, N=8 - 3 - - - FDTS_Div2_N6 - fSAMPLING=fDTS/2, N=6 - 4 - - - FDTS_Div2_N8 - fSAMPLING=fDTS/2, N=8 - 5 - - - FDTS_Div4_N6 - fSAMPLING=fDTS/4, N=6 - 6 - - - FDTS_Div4_N8 - fSAMPLING=fDTS/4, N=8 - 7 - - - FDTS_Div8_N6 - fSAMPLING=fDTS/8, N=6 - 8 - - - FDTS_Div8_N8 - fSAMPLING=fDTS/8, N=8 - 9 - - - FDTS_Div16_N5 - fSAMPLING=fDTS/16, N=5 - 10 - - - FDTS_Div16_N6 - fSAMPLING=fDTS/16, N=6 - 11 - - - FDTS_Div16_N8 - fSAMPLING=fDTS/16, N=8 - 12 - - - FDTS_Div32_N5 - fSAMPLING=fDTS/32, N=5 - 13 - - - FDTS_Div32_N6 - fSAMPLING=fDTS/32, N=6 - 14 - - - FDTS_Div32_N8 - fSAMPLING=fDTS/32, N=8 - 15 - - - - - IC1PSC - Input capture 1 prescaler - 2 - 2 - - - CC1S - Capture/Compare 1 selection - 0 - 2 - - CC1S - read-write - - TI1 - CC1 channel is configured as input, IC1 is mapped on TI1 - 1 - - - TI2 - CC1 channel is configured as input, IC1 is mapped on TI2 - 2 - - - TRC - CC1 channel is configured as input, IC1 is mapped on TRC - 3 - - - - - - - CCMR2_Output - CCMR2_Output - capture/compare mode register 2 (output mode) - 0x1C - 0x20 - read-write - 0x00000000 - - - OC4CE - O24CE - 15 - 1 - - - OC4M - OC4M - 12 - 3 - - - - OC4PE - OC4PE - 11 - 1 - - OC4PE - read-write - - Disabled - Preload register on CCR4 disabled. New values written to CCR4 are taken into account immediately - 0 - - - Enabled - Preload register on CCR4 enabled. Preload value is loaded into active register on each update event - 1 - - - - - OC4FE - OC4FE - 10 - 1 - - - CC4S - CC4S - 8 - 2 - - CC4S - read-write - - Output - CC4 channel is configured as output - 0 - - - - - OC3CE - OC3CE - 7 - 1 - - - OC3M - OC3M - 4 - 3 - - OC3M - read-write - - Frozen - The comparison between the output compare register TIMx_CCRy and the counter TIMx_CNT has no effect on the outputs / OpmMode1: Retriggerable OPM mode 1 - In up-counting mode, the channel is active until a trigger event is detected (on TRGI signal). In down-counting mode, the channel is inactive - 0 - - - ActiveOnMatch - Set channel to active level on match. OCyREF signal is forced high when the counter matches the capture/compare register / OpmMode2: Inversely to OpmMode1 - 1 - - - InactiveOnMatch - Set channel to inactive level on match. OCyREF signal is forced low when the counter matches the capture/compare register / Reserved - 2 - - - Toggle - OCyREF toggles when TIMx_CNT=TIMx_CCRy / Reserved - 3 - - - ForceInactive - OCyREF is forced low / CombinedPwmMode1: OCyREF has the same behavior as in PWM mode 1. OCyREFC is the logical OR between OC1REF and OC2REF - 4 - - - ForceActive - OCyREF is forced high / CombinedPwmMode2: OCyREF has the same behavior as in PWM mode 2. OCyREFC is the logical AND between OC1REF and OC2REF - 5 - - - PwmMode1 - In upcounting, channel is active as long as TIMx_CNT<TIMx_CCRy else inactive. In downcounting, channel is inactive as long as TIMx_CNT>TIMx_CCRy else active / AsymmetricPwmMode1: OCyREF has the same behavior as in PWM mode 1. OCyREFC outputs OC1REF when the counter is counting up, OC2REF when it is counting down - 6 - - - PwmMode2 - Inversely to PwmMode1 / AsymmetricPwmMode2: Inversely to AsymmetricPwmMode1 - 7 - - - - - OC3PE - OC3PE - 3 - 1 - - OC3PE - read-write - - Disabled - Preload register on CCR3 disabled. New values written to CCR3 are taken into account immediately - 0 - - - Enabled - Preload register on CCR3 enabled. Preload value is loaded into active register on each update event - 1 - - - - - OC3FE - OC3FE - 2 - 1 - - - CC3S - CC3S - 0 - 2 - - CC3S - read-write - - Output - CC3 channel is configured as output - 0 - - - - - OC3M_3 - Output Compare 3 mode, bit 3 - 16 - 1 - - OC3M_3 - read-write - - Normal - Normal output compare mode (modes 0-7) - 0 - - - Extended - Extended output compare mode (modes 7-15) - 1 - - - - - OC4M_3 - Output Compare 4 mode, bit 3 - 24 - 1 - - - - - - CCMR2_Input - CCMR2_Input - capture/compare mode register 2 (input mode) - CCMR2_Output - 0x1C - 0x20 - read-write - 0x00000000 - - - IC4F - Input capture 4 filter - 12 - 4 - - - 0 - 15 - - - - - IC4PSC - Input capture 4 prescaler - 10 - 2 - - - 0 - 3 - - - - - CC4S - Capture/Compare 4 selection - 8 - 2 - - CC4S - read-write - - TI4 - CC4 channel is configured as input, IC4 is mapped on TI4 - 1 - - - TI3 - CC4 channel is configured as input, IC4 is mapped on TI3 - 2 - - - TRC - CC4 channel is configured as input, IC4 is mapped on TRC - 3 - - - - - IC3F - Input capture 3 filter - 4 - 4 - - - 0 - 15 - - - - - IC3PSC - Input capture 3 prescaler - 2 - 2 - - - 0 - 3 - - - - - CC3S - Capture/compare 3 selection - 0 - 2 - - CC3S - read-write - - TI3 - CC3 channel is configured as input, IC3 is mapped on TI3 - 1 - - - TI4 - CC3 channel is configured as input, IC3 is mapped on TI4 - 2 - - - TRC - CC3 channel is configured as input, IC3 is mapped on TRC - 3 - - - - - - - CCER - CCER - capture/compare enable register - 0x20 - 0x20 - read-write - 0x00000000 - - - CC4NP - Capture/Compare 4 output Polarity - 15 - 1 - - - CC4P - Capture/Compare 3 output Polarity - 13 - 1 - - - CC4E - Capture/Compare 4 output enable - 12 - 1 - - - CC3NP - Capture/Compare 3 output Polarity - 11 - 1 - - - CC3P - Capture/Compare 3 output Polarity - 9 - 1 - - - CC3E - Capture/Compare 3 output enable - 8 - 1 - - - CC2NP - Capture/Compare 2 output Polarity - 7 - 1 - - - CC2P - Capture/Compare 2 output Polarity - 5 - 1 - - - CC2E - Capture/Compare 2 output enable - 4 - 1 - - - CC1NP - Capture/Compare 1 output Polarity - 3 - 1 - - - CC1P - Capture/Compare 1 output Polarity - 1 - 1 - - - CC1E - Capture/Compare 1 output enable - 0 - 1 - - - - - CNT - CNT - counter - 0x24 - 0x20 - read-write - 0x00000000 - - - CNT - Counter value - 0 - 32 - - - 0 - 4294967295 - - - - - UIFCPY - UIF copy This bit is a read-only copy of the UIF bit of the TIMx_ISR register. If the UIFREMAP bit in the TIMxCR1 is reset, bit 31 is reserved and read at 0 - - 31 - 1 - read-only - - - - - PSC - PSC - prescaler - 0x28 - 0x20 - read-write - 0x00000000 - - - PSC - Prescaler value - 0 - 16 - - - 0 - 65535 - - - - - - - ARR - ARR - auto-reload register - 0x2C - 0x20 - read-write - 0x00000000 - - - ARR - Auto-reload value - 0 - 32 - - - 0 - 4294967295 - - - - - - - 4 - 0x4 - 1-4 - CCR%s - CCR1 - capture/compare register - 0x34 - 0x20 - read-write - 0x00000000 - - - CCR - Capture/Compare value - 0 - 32 - - - 0 - 4294967295 - - - - - - - DCR - DCR - DMA control register - 0x48 - 0x20 - read-write - 0x00000000 - - - DBL - DMA burst length - 8 - 5 - - - 0 - 18 - - - - - DBA - DMA base address - 0 - 5 - - - 0 - 31 - - - - - - - DMAR - DMAR - DMA address for full transfer - 0x4C - 0x20 - read-write - 0x00000000 - - - DMAB - DMA register for burst accesses - 0 - 32 - - - - - OR - OR1 - TIM2 option register 1 - 0x50 - 0x20 - read-write - 0x00000000 - - - TI4_RMP - Input Capture 4 remap - 6 - 2 - - - - - - - TIM9 - General purpose timers - TIM - 0x40014000 - - 0x0 - 0x400 - registers - - - - CR1 - CR1 - control register 1 - 0x0 - 0x20 - read-write - 0x00000000 - - - CKD - Clock division - 8 - 2 - - CKD - read-write - - Div1 - t_DTS = t_CK_INT - 0 - - - Div2 - t_DTS = 2 × t_CK_INT - 1 - - - Div4 - t_DTS = 4 × t_CK_INT - 2 - - - - - ARPE - Auto-reload preload enable - 7 - 1 - - ARPE - read-write - - Disabled - TIMx_APRR register is not buffered - 0 - - - Enabled - TIMx_APRR register is buffered - 1 - - - - - OPM - One-pulse mode - 3 - 1 - - OPM - read-write - - Disabled - Counter is not stopped at update event - 0 - - - Enabled - Counter stops counting at the next update event (clearing the CEN bit) - 1 - - - - - URS - Update request source - 2 - 1 - - URS - read-write - - AnyEvent - Any of counter overflow/underflow, setting UG, or update through slave mode, generates an update interrupt or DMA request - 0 - - - CounterOnly - Only counter overflow/underflow generates an update interrupt or DMA request - 1 - - - - - UDIS - Update disable - 1 - 1 - - UDIS - read-write - - Enabled - Update event enabled - 0 - - - Disabled - Update event disabled - 1 - - - - - CEN - Counter enable - 0 - 1 - - CEN - read-write - - Disabled - Counter disabled - 0 - - - Enabled - Counter enabled - 1 - - - - - UIFREMAP - UIF status bit remapping - 11 - 1 - - - - - SMCR - SMCR - slave mode control register - 0x8 - 0x20 - read-write - 0x00000000 - - - MSM - Master/Slave mode - 7 - 1 - - - TS - Trigger selection - 4 - 3 - - - SMS - Slave mode selection - 0 - 3 - - - SMS_3 - Slave mode selection - bit 3 - 16 - 1 - - - - - DIER - DIER - DMA/Interrupt enable register - 0xC - 0x20 - read-write - 0x00000000 - - - TIE - Trigger interrupt enable - 6 - 1 - - - CC2IE - Capture/Compare 2 interrupt enable - 2 - 1 - - - CC1IE - Capture/Compare 1 interrupt enable - 1 - 1 - - - UIE - Update interrupt enable - 0 - 1 - - UIE - read-write - - Disabled - Update interrupt disabled - 0 - - - Enabled - Update interrupt enabled - 1 - - - - - - - SR - SR - status register - 0x10 - 0x20 - read-write - 0x00000000 - - - CC2OF - Capture/compare 2 overcapture flag - 10 - 1 - - - CC1OF - Capture/Compare 1 overcapture flag - 9 - 1 - - - TIF - Trigger interrupt flag - 6 - 1 - - - CC2IF - Capture/Compare 2 interrupt flag - 2 - 1 - - - CC1IF - Capture/compare 1 interrupt flag - 1 - 1 - - - UIF - Update interrupt flag - 0 - 1 - zeroToClear - - UIFR - read - - NoUpdateOccurred - No update occurred - 0 - - - UpdatePending - Update interrupt pending - 1 - - - - UIFW - write - - Clear - Clear flag - 0 - - - - - - - EGR - EGR - event generation register - 0x14 - 0x20 - write-only - 0x00000000 - - - TG - Trigger generation - 6 - 1 - - - CC2G - Capture/compare 2 generation - 2 - 1 - - - CC1G - Capture/compare 1 generation - 1 - 1 - - - UG - Update generation - 0 - 1 - - UG - write - - Update - Re-initializes the timer counter and generates an update of the registers. - 1 - - - - - - - CCMR1_Output - CCMR1_Output - capture/compare mode register 1 (output mode) - 0x18 - 0x20 - read-write - 0x00000000 - - - OC2M - Output Compare 2 mode - 12 - 3 - - - - OC2PE - Output Compare 2 preload enable - 11 - 1 - - - OC2FE - Output Compare 2 fast enable - 10 - 1 - - - CC2S - Capture/Compare 2 selection - 8 - 2 - - - OC1M - Output Compare 1 mode - 4 - 3 - - OC1M - read-write - - Frozen - The comparison between the output compare register TIMx_CCRy and the counter TIMx_CNT has no effect on the outputs / OpmMode1: Retriggerable OPM mode 1 - In up-counting mode, the channel is active until a trigger event is detected (on TRGI signal). In down-counting mode, the channel is inactive - 0 - - - ActiveOnMatch - Set channel to active level on match. OCyREF signal is forced high when the counter matches the capture/compare register / OpmMode2: Inversely to OpmMode1 - 1 - - - InactiveOnMatch - Set channel to inactive level on match. OCyREF signal is forced low when the counter matches the capture/compare register / Reserved - 2 - - - Toggle - OCyREF toggles when TIMx_CNT=TIMx_CCRy / Reserved - 3 - - - ForceInactive - OCyREF is forced low / CombinedPwmMode1: OCyREF has the same behavior as in PWM mode 1. OCyREFC is the logical OR between OC1REF and OC2REF - 4 - - - ForceActive - OCyREF is forced high / CombinedPwmMode2: OCyREF has the same behavior as in PWM mode 2. OCyREFC is the logical AND between OC1REF and OC2REF - 5 - - - PwmMode1 - In upcounting, channel is active as long as TIMx_CNT<TIMx_CCRy else inactive. In downcounting, channel is inactive as long as TIMx_CNT>TIMx_CCRy else active / Reserved - 6 - - - PwmMode2 - Inversely to PwmMode1 / Reserved - 7 - - - - - OC1PE - Output Compare 1 preload enable - 3 - 1 - - - OC1FE - Output Compare 1 fast enable - 2 - 1 - - - CC1S - Capture/Compare 1 selection - 0 - 2 - - - OC2M_3 - Output Compare 2 mode, bit 3 - 24 - 1 - - - - OC1M_3 - Output Compare 1 mode, bit 3 - 16 - 1 - - OC1M_3 - read-write - - Normal - Normal output compare mode (modes 0-7) - 0 - - - Extended - Extended output compare mode (modes 7-15) - 1 - - - - - - - CCMR1_Input - CCMR1_Input - capture/compare mode register 1 (input mode) - CCMR1_Output - 0x18 - 0x20 - read-write - 0x00000000 - - - IC2F - Input capture 2 filter - 12 - 3 - - - IC2PSC - Input capture 2 prescaler - 10 - 2 - - - CC2S - Capture/Compare 2 selection - 8 - 2 - - - IC1F - Input capture 1 filter - 4 - 3 - - - IC1PSC - Input capture 1 prescaler - 2 - 2 - - - CC1S - Capture/Compare 1 selection - 0 - 2 - - - - - CCER - CCER - capture/compare enable register - 0x20 - 0x20 - read-write - 0x00000000 - - - CC2NP - Capture/Compare 2 output Polarity - 7 - 1 - - - CC2P - Capture/Compare 2 output Polarity - 5 - 1 - - - CC2E - Capture/Compare 2 output enable - 4 - 1 - - - CC1NP - Capture/Compare 1 output Polarity - 3 - 1 - - - CC1P - Capture/Compare 1 output Polarity - 1 - 1 - - - CC1E - Capture/Compare 1 output enable - 0 - 1 - - - - - CNT - CNT - counter - 0x24 - 0x20 - read-write - 0x00000000 - - - CNT - counter value - 0 - 16 - - - 0 - 65535 - - - - - UIFCPY - UIF copy This bit is a read-only copy of the UIF bit of the TIMx_ISR register. If the UIFREMAP bit in the TIMxCR1 is reset, bit 31 is reserved and read at 0 - - 31 - 1 - read-only - - - - - PSC - PSC - prescaler - 0x28 - 0x20 - read-write - 0x00000000 - - - PSC - Prescaler value - 0 - 16 - - - 0 - 65535 - - - - - - - ARR - ARR - auto-reload register - 0x2C - 0x20 - read-write - 0x00000000 - - - ARR - Auto-reload value - 0 - 16 - - - 0 - 65535 - - - - - - - 2 - 0x4 - 1-2 - CCR%s - CCR1 - capture/compare register - 0x34 - 0x20 - read-write - 0x00000000 - - - CCR - Capture/Compare value - 0 - 16 - - - 0 - 65535 - - - - - - - - - TIM12 - TIM - 0x40001800 - - - TIM10 - General-purpose-timers - TIM - 0x40014400 - - 0x0 - 0x400 - registers - - - - CR1 - CR1 - control register 1 - 0x0 - 0x20 - read-write - 0x00000000 - - - CKD - Clock division - 8 - 2 - - CKD - read-write - - Div1 - t_DTS = t_CK_INT - 0 - - - Div2 - t_DTS = 2 × t_CK_INT - 1 - - - Div4 - t_DTS = 4 × t_CK_INT - 2 - - - - - ARPE - Auto-reload preload enable - 7 - 1 - - ARPE - read-write - - Disabled - TIMx_APRR register is not buffered - 0 - - - Enabled - TIMx_APRR register is buffered - 1 - - - - - URS - Update request source - 2 - 1 - - URS - read-write - - AnyEvent - Any of counter overflow/underflow, setting UG, or update through slave mode, generates an update interrupt or DMA request - 0 - - - CounterOnly - Only counter overflow/underflow generates an update interrupt or DMA request - 1 - - - - - UDIS - Update disable - 1 - 1 - - UDIS - read-write - - Enabled - Update event enabled - 0 - - - Disabled - Update event disabled - 1 - - - - - CEN - Counter enable - 0 - 1 - - CEN - read-write - - Disabled - Counter disabled - 0 - - - Enabled - Counter enabled - 1 - - - - - OPM - One-pulse mode - 3 - 1 - - OPM - read-write - - Disabled - Counter is not stopped at update event - 0 - - - Enabled - Counter stops counting at the next update event (clearing the CEN bit) - 1 - - - - - UIFREMAP - UIF status bit remapping - 11 - 1 - - - - - DIER - DIER - DMA/Interrupt enable register - 0xC - 0x20 - read-write - 0x00000000 - - - CC1IE - Capture/Compare 1 interrupt enable - 1 - 1 - - - UIE - Update interrupt enable - 0 - 1 - - UIE - read-write - - Disabled - Update interrupt disabled - 0 - - - Enabled - Update interrupt enabled - 1 - - - - - - - SR - SR - status register - 0x10 - 0x20 - read-write - 0x00000000 - - - CC1OF - Capture/Compare 1 overcapture flag - 9 - 1 - - - CC1IF - Capture/compare 1 interrupt flag - 1 - 1 - - - UIF - Update interrupt flag - 0 - 1 - zeroToClear - - UIFR - read - - NoUpdateOccurred - No update occurred - 0 - - - UpdatePending - Update interrupt pending - 1 - - - - UIFW - write - - Clear - Clear flag - 0 - - - - - - - EGR - EGR - event generation register - 0x14 - 0x20 - write-only - 0x00000000 - - - CC1G - Capture/compare 1 generation - 1 - 1 - - - UG - Update generation - 0 - 1 - - UG - write - - Update - Re-initializes the timer counter and generates an update of the registers. - 1 - - - - - - - CCMR1_Output - CCMR1_Output - capture/compare mode register 1 (output mode) - 0x18 - 0x20 - read-write - 0x00000000 - - - OC1M - Output Compare 1 mode - 4 - 3 - - OC1M - read-write - - Frozen - The comparison between the output compare register TIMx_CCRy and the counter TIMx_CNT has no effect on the outputs - 0 - - - ActiveOnMatch - Set channel to active level on match. OCyREF signal is forced high when the counter matches the capture/compare register - 1 - - - InactiveOnMatch - Set channel to inactive level on match. OCyREF signal is forced low when the counter matches the capture/compare register - 2 - - - Toggle - OCyREF toggles when TIMx_CNT=TIMx_CCRy - 3 - - - ForceInactive - OCyREF is forced low - 4 - - - ForceActive - OCyREF is forced high - 5 - - - PwmMode1 - In upcounting, channel is active as long as TIMx_CNT<TIMx_CCRy else inactive. In downcounting, channel is inactive as long as TIMx_CNT>TIMx_CCRy else active - 6 - - - PwmMode2 - Inversely to PwmMode1 - 7 - - - - - OC1PE - Output Compare 1 preload enable - 3 - 1 - - - OC1FE - Output Compare 1 fast enable - 2 - 1 - - - CC1S - Capture/Compare 1 selection - 0 - 2 - - - OC1M_3 - Output Compare 1 mode, bit 3 - 16 - 1 - - - - - CCMR1_Input - CCMR1_Input - capture/compare mode register 1 (input mode) - CCMR1_Output - 0x18 - 0x20 - read-write - 0x00000000 - - - IC1F - Input capture 1 filter - 4 - 4 - - - IC1PSC - Input capture 1 prescaler - 2 - 2 - - - CC1S - Capture/Compare 1 selection - 0 - 2 - - - - - CCER - CCER - capture/compare enable register - 0x20 - 0x20 - read-write - 0x00000000 - - - CC1NP - Capture/Compare 1 output Polarity - 3 - 1 - - - CC1P - Capture/Compare 1 output Polarity - 1 - 1 - - - CC1E - Capture/Compare 1 output enable - 0 - 1 - - - - - CNT - CNT - counter - 0x24 - 0x20 - read-write - 0x00000000 - - - CNT - counter value - 0 - 16 - - - 0 - 65535 - - - - - UIFCPY - UIF copy This bit is a read-only copy of the UIF bit of the TIMx_ISR register. If the UIFREMAP bit in the TIMxCR1 is reset, bit 31 is reserved and read at 0 - - 31 - 1 - read-only - - - - - PSC - PSC - prescaler - 0x28 - 0x20 - read-write - 0x00000000 - - - PSC - Prescaler value - 0 - 16 - - - 0 - 65535 - - - - - - - ARR - ARR - auto-reload register - 0x2C - 0x20 - read-write - 0x00000000 - - - ARR - Auto-reload value - 0 - 16 - - - 0 - 65535 - - - - - - - 1 - 0x0 - 1-1 - CCR%s - CCR1 - capture/compare register - 0x34 - 0x20 - read-write - 0x00000000 - - - CCR - Capture/Compare value - 0 - 16 - - - 0 - 65535 - - - - - - - OR - OR - option register - 0x50 - 0x20 - read-write - 0x00000000 - - - TI1_RMP - TIM11 Input 1 remapping capability - 0 - 2 - - - - - - - TIM11 - TIM - 0x40014800 - - - TIM13 - TIM - 0x40001C00 - - - TIM14 - TIM - 0x40002000 - - - TIM6 - Basic timers - TIM - 0x40001000 - - 0x0 - 0x400 - registers - - - TIM6_DAC - TIM6 global interrupt, DAC1 and DAC2 underrun - error interrupt - 54 - - - - CR1 - CR1 - control register 1 - 0x0 - 0x20 - read-write - 0x00000000 - - - ARPE - Auto-reload preload enable - 7 - 1 - - ARPE - read-write - - Disabled - TIMx_APRR register is not buffered - 0 - - - Enabled - TIMx_APRR register is buffered - 1 - - - - - OPM - One-pulse mode - 3 - 1 - - OPM - read-write - - Disabled - Counter is not stopped at update event - 0 - - - Enabled - Counter stops counting at the next update event (clearing the CEN bit) - 1 - - - - - URS - Update request source - 2 - 1 - - URS - read-write - - AnyEvent - Any of counter overflow/underflow, setting UG, or update through slave mode, generates an update interrupt or DMA request - 0 - - - CounterOnly - Only counter overflow/underflow generates an update interrupt or DMA request - 1 - - - - - UDIS - Update disable - 1 - 1 - - UDIS - read-write - - Enabled - Update event enabled - 0 - - - Disabled - Update event disabled - 1 - - - - - CEN - Counter enable - 0 - 1 - - CEN - read-write - - Disabled - Counter disabled - 0 - - - Enabled - Counter enabled - 1 - - - - - UIFREMAP - UIF status bit remapping - 11 - 1 - - - - - CR2 - CR2 - control register 2 - 0x4 - 0x20 - read-write - 0x00000000 - - - MMS - Master mode selection - 4 - 3 - - MMS - read-write - - Reset - Use UG bit from TIMx_EGR register - 0 - - - Enable - Use CNT bit from TIMx_CEN register - 1 - - - Update - Use the update event - 2 - - - - - - - DIER - DIER - DMA/Interrupt enable register - 0xC - 0x20 - read-write - 0x00000000 - - - UDE - Update DMA request enable - 8 - 1 - - UDE - read-write - - Disabled - Update DMA request disabled - 0 - - - Enabled - Update DMA request enabled - 1 - - - - - UIE - Update interrupt enable - 0 - 1 - - UIE - read-write - - Disabled - Update interrupt disabled - 0 - - - Enabled - Update interrupt enabled - 1 - - - - - - - SR - SR - status register - 0x10 - 0x20 - read-write - 0x00000000 - - - UIF - Update interrupt flag - 0 - 1 - zeroToClear - - UIFR - read - - NoUpdateOccurred - No update occurred - 0 - - - UpdatePending - Update interrupt pending - 1 - - - - UIFW - write - - Clear - Clear flag - 0 - - - - - - - EGR - EGR - event generation register - 0x14 - 0x20 - write-only - 0x00000000 - - - UG - Update generation - 0 - 1 - - UG - write - - Update - Re-initializes the timer counter and generates an update of the registers. - 1 - - - - - - - CNT - CNT - counter - 0x24 - 0x20 - read-write - 0x00000000 - - - CNT - Low counter value - 0 - 16 - - - 0 - 65535 - - - - - UIFCPY - UIF copy This bit is a read-only copy of the UIF bit of the TIMx_ISR register. If the UIFREMAP bit in the TIMxCR1 is reset, bit 31 is reserved and read at 0 - - 31 - 1 - read-only - - - - - PSC - PSC - prescaler - 0x28 - 0x20 - read-write - 0x00000000 - - - PSC - Prescaler value - 0 - 16 - - - 0 - 65535 - - - - - - - ARR - ARR - auto-reload register - 0x2C - 0x20 - read-write - 0x00000000 - - - ARR - Low Auto-reload value - 0 - 16 - - - 0 - 65535 - - - - - - - - - TIM7 - TIM - 0x40001400 - - TIM7 - TIM7 global interrupt - 55 - - - - Ethernet_MAC - Ethernet: media access control (MAC) - Ethernet - 0x40028000 - - 0x0 - 0x100 - registers - - - - MACCR - MACCR - Ethernet MAC configuration register - 0x0 - 0x20 - read-write - 0x00008000 - - - RE - Receiver enable - 2 - 1 - - RE - read-write - - Disabled - MAC receive state machine is disabled after the completion of the reception of the current frame - 0 - - - Enabled - MAC receive state machine is enabled - 1 - - - - - TE - Transmitter enable - 3 - 1 - - TE - read-write - - Disabled - MAC transmit state machine is disabled after completion of the transmission of the current frame - 0 - - - Enabled - MAC transmit state machine is enabled - 1 - - - - - DC - Deferral check - 4 - 1 - - DC - read-write - - Disabled - MAC defers until CRS signal goes inactive - 0 - - - Enabled - Deferral check function enabled - 1 - - - - - BL - Back-off limit - 5 - 2 - - BL - read-write - - BL10 - For retransmission n, wait up to 2^min(n, 10) time slots - 0 - - - BL8 - For retransmission n, wait up to 2^min(n, 8) time slots - 1 - - - BL4 - For retransmission n, wait up to 2^min(n, 4) time slots - 2 - - - BL1 - For retransmission n, wait up to 2^min(n, 1) time slots - 3 - - - - - APCS - Automatic pad/CRC stripping - 7 - 1 - - APCS - read-write - - Disabled - MAC passes all incoming frames unmodified - 0 - - - Strip - MAC strips the Pad/FCS field on incoming frames only for lengths less than or equal to 1500 bytes - 1 - - - - - RD - Retry disable - 9 - 1 - - RD - read-write - - Enabled - MAC attempts retries based on the settings of BL - 0 - - - Disabled - MAC attempts only 1 transmission - 1 - - - - - IPCO - IPv4 checksum offload - 10 - 1 - - IPCO - read-write - - Disabled - IPv4 checksum offload disabled - 0 - - - Offload - IPv4 checksums are checked in received frames - 1 - - - - - DM - Duplex mode - 11 - 1 - - DM - read-write - - HalfDuplex - MAC operates in half-duplex mode - 0 - - - FullDuplex - MAC operates in full-duplex mode - 1 - - - - - LM - Loopback mode - 12 - 1 - - LM - read-write - - Normal - Normal mode - 0 - - - Loopback - MAC operates in loopback mode at the MII - 1 - - - - - ROD - Receive own disable - 13 - 1 - - ROD - read-write - - Enabled - MAC receives all packets from PHY while transmitting - 0 - - - Disabled - MAC disables reception of frames in half-duplex mode - 1 - - - - - FES - Fast Ethernet speed - 14 - 1 - - FES - read-write - - FES10 - 10 Mbit/s - 0 - - - FES100 - 100 Mbit/s - 1 - - - - - CSD - Carrier sense disable - 16 - 1 - - CSD - read-write - - Enabled - Errors generated due to loss of carrier - 0 - - - Disabled - No error generated due to loss of carrier - 1 - - - - - IFG - Interframe gap - 17 - 3 - - IFG - read-write - - IFG96 - 96 bit times - 0 - - - IFG88 - 88 bit times - 1 - - - IFG80 - 80 bit times - 2 - - - IFG72 - 72 bit times - 3 - - - IFG64 - 64 bit times - 4 - - - IFG56 - 56 bit times - 5 - - - IFG48 - 48 bit times - 6 - - - IFG40 - 40 bit times - 7 - - - - - JD - Jabber disable - 22 - 1 - - JD - read-write - - Enabled - Jabber enabled, transmit frames up to 2048 bytes - 0 - - - Disabled - Jabber disabled, transmit frames up to 16384 bytes - 1 - - - - - WD - Watchdog disable - 23 - 1 - - WD - read-write - - Enabled - Watchdog enabled, receive frames limited to 2048 bytes - 0 - - - Disabled - Watchdog disabled, receive frames may be up to to 16384 bytes - 1 - - - - - CSTF - CRC stripping for type frames - 25 - 1 - - CSTF - read-write - - Disabled - CRC not stripped - 0 - - - Enabled - CRC stripped - 1 - - - - - - - MACFFR - MACFFR - Ethernet MAC frame filter register - 0x4 - 0x20 - read-write - 0x00000000 - - - PM - Promiscuous mode - 0 - 1 - - PM - read-write - - Disabled - Normal address filtering - 0 - - - Enabled - Address filters pass all incoming frames regardless of their destination or source address - 1 - - - - - HU - Hash unicast - 1 - 1 - - HU - read-write - - Perfect - MAC performs a perfect destination address filtering for unicast frames - 0 - - - Hash - MAC performs destination address filtering of received unicast frames according to the hash table - 1 - - - - - HM - Hash multicast - 2 - 1 - - HM - read-write - - Perfect - MAC performs a perfect destination address filtering for multicast frames - 0 - - - Hash - MAC performs destination address filtering of received multicast frames according to the hash table - 1 - - - - - DAIF - Destination address unique filtering - 3 - 1 - - DAIF - read-write - - Normal - Normal filtering of frames - 0 - - - Invert - Address check block operates in inverse filtering mode for the DA address comparison - 1 - - - - - PAM - Pass all multicast - 4 - 1 - - PAM - read-write - - Disabled - Filtering of multicast frames depends on HM - 0 - - - Enabled - All received frames with a multicast destination address are passed - 1 - - - - - BFD - Broadcast frames disable - 5 - 1 - - BFD - read-write - - Enabled - Address filters pass all received broadcast frames - 0 - - - Disabled - Address filters filter all incoming broadcast frames - 1 - - - - - PCF - Pass control frames - 6 - 2 - - PCF - read-write - - PreventAll - MAC prevents all control frames from reaching the application - 0 - - - ForwardAllExceptPause - MAC forwards all control frames to application except Pause - 1 - - - ForwardAll - MAC forwards all control frames to application even if they fail the address filter - 2 - - - ForwardAllFiltered - MAC forwards control frames that pass the address filter - 3 - - - - - SAIF - Source address inverse filtering - 7 - 1 - - SAIF - read-write - - Normal - Source address filter operates normally - 0 - - - Invert - Source address filter operation inverted - 1 - - - - - SAF - Source address filter - 8 - 1 - - SAF - read-write - - Disabled - Source address ignored - 0 - - - Enabled - MAC drops frames that fail the source address filter - 1 - - - - - HPF - Hash or perfect filter - 9 - 1 - - HPF - read-write - - HashOnly - If HM or HU is set, only frames that match the Hash filter are passed - 0 - - - HashOrPerfect - If HM or HU is set, frames that match either the perfect filter or the hash filter are passed - 1 - - - - - RA - Receive all - 31 - 1 - - RA - read-write - - Disabled - MAC receiver passes on to the application only those frames that have passed the SA/DA address file - 0 - - - Enabled - MAC receiver passes oll received frames on to the application - 1 - - - - - - - MACHTHR - MACHTHR - Ethernet MAC hash table high register - 0x8 - 0x20 - read-write - 0x00000000 - - - HTH - Upper 32 bits of hash table - 0 - 32 - - - 0 - 4294967295 - - - - - - - MACHTLR - MACHTLR - Ethernet MAC hash table low register - 0xC - 0x20 - read-write - 0x00000000 - - - HTL - Lower 32 bits of hash table - 0 - 32 - - - 0 - 4294967295 - - - - - - - MACMIIAR - MACMIIAR - Ethernet MAC MII address register - 0x10 - 0x20 - read-write - 0x00000000 - - - MB - MII busy - 0 - 1 - - MB - read-write - - Busy - This bit is set to 1 by the application to indicate that a read or write access is in progress - 1 - - - - - MW - MII write - 1 - 1 - - MW - read-write - - Read - Read operation - 0 - - - Write - Write operation - 1 - - - - - CR - Clock range - 2 - 3 - - CR - read-write - - CR_60_100 - 60-100MHz HCLK/42 - 0 - - - CR_100_150 - 100-150 MHz HCLK/62 - 1 - - - CR_20_35 - 20-35MHz HCLK/16 - 2 - - - CR_35_60 - 35-60MHz HCLK/16 - 3 - - - CR_150_168 - 150-168MHz HCLK/102 - 4 - - - - - MR - MII register - select the desired MII register in the PHY device - 6 - 5 - - - 0 - 31 - - - - - PA - PHY address - select which of possible 32 PHYs is being accessed - 11 - 5 - - - 0 - 31 - - - - - - - MACMIIDR - MACMIIDR - Ethernet MAC MII data register - 0x14 - 0x20 - read-write - 0x00000000 - - - MD - MII data read from/written to the PHY - 0 - 16 - - - 0 - 65535 - - - - - - - MACFCR - MACFCR - Ethernet MAC flow control register - 0x18 - 0x20 - read-write - 0x00000000 - - - FCB - Flow control busy/back pressure activate - 0 - 1 - - FCB - read-write - - DisableBackPressure - In half duplex only, deasserts back pressure - 0 - - - PauseOrBackPressure - In full duplex, initiate a Pause control frame. In half duplex, assert back pressure - 1 - - - - - TFCE - Transmit flow control enable - 1 - 1 - - TFCE - read-write - - Disabled - In full duplex, flow control is disabled. In half duplex, back pressure is disabled - 0 - - - Enabled - In full duplex, flow control is enabled. In half duplex, back pressure is enabled - 1 - - - - - RFCE - Receive flow control enable - 2 - 1 - - RFCE - read-write - - Disabled - Pause frames are not decoded - 0 - - - Enabled - MAC decodes received Pause frames and disables its transmitted for a specified time - 1 - - - - - UPFD - Unicast pause frame detect - 3 - 1 - - UPFD - read-write - - Disabled - MAC detects only a Pause frame with the multicast address specified in the 802.3x standard - 0 - - - Enabled - MAC additionally detects Pause frames with the station's unicast address - 1 - - - - - PLT - Pause low threshold - 4 - 2 - - PLT - read-write - - PLT4 - Pause time minus 4 slot times - 0 - - - PLT28 - Pause time minus 28 slot times - 1 - - - PLT144 - Pause time minus 144 slot times - 2 - - - PLT256 - Pause time minus 256 slot times - 3 - - - - - ZQPD - Zero-quanta pause disable - 7 - 1 - - ZQPD - read-write - - Enabled - Normal operation with automatic zero-quanta pause control frame generation - 0 - - - Disabled - Automatic generation of zero-quanta pause control frames is disabled - 1 - - - - - PT - Pause time - 16 - 16 - - - 0 - 65535 - - - - - - - MACVLANTR - MACVLANTR - Ethernet MAC VLAN tag register - 0x1C - 0x20 - read-write - 0x00000000 - - - VLANTI - VLAN tag identifier (for receive frames) - 0 - 16 - - - 0 - 65535 - - - - - VLANTC - 12-bit VLAN tag comparison - 16 - 1 - - VLANTC - read-write - - VLANTC16 - Full 16 bit VLAN identifiers are used for comparison and filtering - 0 - - - VLANTC12 - 12 bit VLAN identifies are used for comparison and filtering - 1 - - - - - - - MACPMTCSR - MACPMTCSR - Ethernet MAC PMT control and status register - 0x2C - 0x20 - read-write - 0x00000000 - - - PD - Power down - 0 - 1 - - PD - read-write - - Enabled - All received frames will be dropped. Cleared automatically when a magic packet or wakeup frame is received - 1 - - - - - MPE - Magic packet enable - 1 - 1 - - MPE - read-write - - Disabled - No power management event generated due to Magic Packet reception - 0 - - - Enabled - Enable generation of a power management event due to Magic Packet reception - 1 - - - - - WFE - Wakeup frame enable - 2 - 1 - - WFE - read-write - - Disabled - No power management event generated due to wakeup frame reception - 0 - - - Enabled - Enable generation of a power management event due to wakeup frame reception - 1 - - - - - MPR - Magic packet received - 5 - 1 - - - WFR - Wakeup frame received - 6 - 1 - - - GU - Global unicast - 9 - 1 - - GU - read-write - - Disabled - Normal operation - 0 - - - Enabled - Any unicast packet filtered by the MAC address recognition may be a wakeup frame - 1 - - - - - WFFRPR - Wakeup frame filter register pointer reset - 31 - 1 - - WFFRPR - read-write - - Reset - Reset wakeup frame filter register point to 0b000. Automatically cleared - 1 - - - - - - - MACDBGR - MACDBGR - Ethernet MAC debug register - 0x34 - 0x20 - read-only - 0x00000000 - - - TFF - Tx FIFO full - 25 - 1 - - - TFNE - Tx FIFO not empty - 24 - 1 - - - TFWA - Tx FIFO write active - 22 - 1 - - - TFRS - Tx FIFO read status - 20 - 2 - - - MTP - MAC transmitter in pause - 19 - 1 - - - MTFCS - MAC transmit frame controller status - 17 - 2 - - - MMTEA - MAC MII transmit engine active - 16 - 1 - - - RFFL - Rx FIFO fill level - 8 - 2 - - - RFRCS - Rx FIFO read controller status - 5 - 2 - - - RFWRA - Rx FIFO write controller active - 4 - 1 - - - MSFRWCS - MAC small FIFO read/write controllers status - 1 - 2 - - - MMRPEA - MAC MII receive protocol engine active - 0 - 1 - - - - - MACSR - MACSR - Ethernet MAC interrupt status register - 0x38 - 0x20 - 0x00000000 - - - PMTS - PMT status - 3 - 1 - read-only - - - MMCS - MMC status - 4 - 1 - read-only - - - MMCRS - MMC receive status - 5 - 1 - read-only - - - MMCTS - MMC transmit status - 6 - 1 - read-only - - - TSTS - Time stamp trigger status - 9 - 1 - read-write - - - - - MACIMR - MACIMR - Ethernet MAC interrupt mask register - 0x3C - 0x20 - read-write - 0x00000000 - - - PMTIM - PMT interrupt mask - 3 - 1 - - PMTIM - read-write - - Unmasked - PMT Status interrupt generation enabled - 0 - - - Masked - PMT Status interrupt generation disabled - 1 - - - - - TSTIM - Time stamp trigger interrupt mask - 9 - 1 - - TSTIM - read-write - - Unmasked - Time stamp interrupt generation enabled - 0 - - - Masked - Time stamp interrupt generation disabled - 1 - - - - - - - MACA0HR - MACA0HR - Ethernet MAC address 0 high register - 0x40 - 0x20 - 0x0010FFFF - - - MACA0H - MAC address0 high - 0 - 16 - read-write - - - 0 - 65535 - - - - - MO - Always 1 - 31 - 1 - read-only - - - - - MACA0LR - MACA0LR - Ethernet MAC address 0 low register - 0x44 - 0x20 - read-write - 0xFFFFFFFF - - - MACA0L - 0 - 0 - 32 - - - 0 - 4294967295 - - - - - - - MACA1HR - MACA1HR - Ethernet MAC address 1 high register - 0x48 - 0x20 - read-write - 0x0000FFFF - - - MACA1H - MACA1H - 0 - 16 - - - 0 - 65535 - - - - - MBC - MBC - 24 - 6 - - - 0 - 63 - - - - - SA - SA - 30 - 1 - - SA - read-write - - Destination - This address is used for comparison with DA fields of the received frame - 0 - - - Source - This address is used for comparison with SA fields of received frames - 1 - - - - - AE - AE - 31 - 1 - - AE - read-write - - Disabled - Address filters ignore this address - 0 - - - Enabled - Address filters use this address - 1 - - - - - - - MACA1LR - MACA1LR - Ethernet MAC address1 low register - 0x4C - 0x20 - read-write - 0xFFFFFFFF - - - MACA1L - MACA1LR - 0 - 32 - - - 0 - 4294967295 - - - - - - - MACA2HR - MACA2HR - Ethernet MAC address 2 high register - 0x50 - 0x20 - read-write - 0x0000FFFF - - - MACA2H - MAC2AH - 0 - 16 - - - 0 - 65535 - - - - - MBC - MBC - 24 - 6 - - - 0 - 63 - - - - - SA - SA - 30 - 1 - - SA - read-write - - Destination - This address is used for comparison with DA fields of the received frame - 0 - - - Source - This address is used for comparison with SA fields of received frames - 1 - - - - - AE - AE - 31 - 1 - - AE - read-write - - Disabled - Address filters ignore this address - 0 - - - Enabled - Address filters use this address - 1 - - - - - - - MACA2LR - MACA2LR - Ethernet MAC address 2 low register - 0x54 - 0x20 - read-write - 0xFFFFFFFF - - - MACA2L - MACA2L - 0 - 32 - - - 0 - 4294967295 - - - - - - - MACA3HR - MACA3HR - Ethernet MAC address 3 high register - 0x58 - 0x20 - read-write - 0x0000FFFF - - - MACA3H - MACA3H - 0 - 16 - - - 0 - 65535 - - - - - MBC - MBC - 24 - 6 - - - 0 - 63 - - - - - SA - SA - 30 - 1 - - SA - read-write - - Destination - This address is used for comparison with DA fields of the received frame - 0 - - - Source - This address is used for comparison with SA fields of received frames - 1 - - - - - AE - AE - 31 - 1 - - AE - read-write - - Disabled - Address filters ignore this address - 0 - - - Enabled - Address filters use this address - 1 - - - - - - - MACA3LR - MACA3LR - Ethernet MAC address 3 low register - 0x5C - 0x20 - read-write - 0xFFFFFFFF - - - MACA3L - MBCA3L - 0 - 32 - - - 0 - 4294967295 - - - - - - - MACRWUFFER - MACRWUFFER - Ethernet MAC remote wakeup frame filter register - 0x60 - 0x20 - read-write - 0xFFFFFFFF - - - - - Ethernet_MMC - Ethernet: MAC management counters - Ethernet - 0x40028100 - - 0x0 - 0x400 - registers - - - - MMCCR - MMCCR - Ethernet MMC control register - 0x0 - 0x20 - read-write - 0x00000000 - - - CR - Counter reset - 0 - 1 - - CR - read-write - - Reset - Reset all counters. Cleared automatically - 1 - - - - - CSR - Counter stop rollover - 1 - 1 - - CSR - read-write - - Disabled - Counters roll over to zero after reaching the maximum value - 0 - - - Enabled - Counters do not roll over to zero after reaching the maximum value - 1 - - - - - ROR - Reset on read - 2 - 1 - - ROR - read-write - - Disabled - MMC counters do not reset on read - 0 - - - Enabled - MMC counters reset to zero after read - 1 - - - - - MCF - MMC counter freeze - 3 - 1 - - MCF - read-write - - Unfrozen - All MMC counters update normally - 0 - - - Frozen - All MMC counters frozen to their current value - 1 - - - - - MCP - MMC counter preset - 4 - 1 - - MCP - read-write - - Preset - MMC counters will be preset to almost full or almost half. Cleared automatically - 1 - - - - - MCFHP - MMC counter Full-Half preset - 5 - 1 - - MCFHP - read-write - - AlmostHalf - When MCP is set, MMC counters are preset to almost-half value 0x7FFF_FFF0 - 0 - - - AlmostFull - When MCP is set, MMC counters are preset to almost-full value 0xFFFF_FFF0 - 1 - - - - - - - MMCRIR - MMCRIR - Ethernet MMC receive interrupt register - 0x4 - 0x20 - read-write - 0x00000000 - - - RFCES - Received frames CRC error status - 5 - 1 - - - RFAES - Received frames alignment error status - 6 - 1 - - - RGUFS - Received good Unicast frames status - 17 - 1 - - - - - MMCTIR - MMCTIR - Ethernet MMC transmit interrupt register - 0x8 - 0x20 - read-only - 0x00000000 - - - TGFSCS - Transmitted good frames single collision status - 14 - 1 - - - TGFMSCS - Transmitted good frames more than single collision status - 15 - 1 - - - TGFS - Transmitted good frames status - 21 - 1 - - - - - MMCRIMR - MMCRIMR - Ethernet MMC receive interrupt mask register - 0xC - 0x20 - read-write - 0x00000000 - - - RFCEM - Received frame CRC error mask - 5 - 1 - - RFCEM - read-write - - Unmasked - Received-crc-error counter half-full interrupt enabled - 0 - - - Masked - Received-crc-error counter half-full interrupt disabled - 1 - - - - - RFAEM - Received frames alignment error mask - 6 - 1 - - RFAEM - read-write - - Unmasked - Received-alignment-error counter half-full interrupt enabled - 0 - - - Masked - Received-alignment-error counter half-full interrupt disabled - 1 - - - - - RGUFM - Received good Unicast frames mask - 17 - 1 - - RGUFM - read-write - - Unmasked - Received-good-unicast counter half-full interrupt enabled - 0 - - - Masked - Received-good-unicast counter half-full interrupt disabled - 1 - - - - - - - MMCTIMR - MMCTIMR - Ethernet MMC transmit interrupt mask register - 0x10 - 0x20 - read-write - 0x00000000 - - - TGFSCM - Transmitted good frames single collision mask - 14 - 1 - - TGFSCM - read-write - - Unmasked - Transmitted-good-single-collision half-full interrupt enabled - 0 - - - Masked - Transmitted-good-single-collision half-full interrupt disabled - 1 - - - - - TGFMSCM - Transmitted good frames more than single collision mask - 15 - 1 - - TGFMSCM - read-write - - Unmasked - Transmitted-good-multiple-collision half-full interrupt enabled - 0 - - - Masked - Transmitted-good-multiple-collision half-full interrupt disabled - 1 - - - - - TGFM - Transmitted good frames mask - 21 - 1 - - TGFM - read-write - - Unmasked - Transmitted-good counter half-full interrupt enabled - 0 - - - Masked - Transmitted-good counter half-full interrupt disabled - 1 - - - - - - - MMCTGFSCCR - MMCTGFSCCR - Ethernet MMC transmitted good frames after a single collision counter - 0x4C - 0x20 - read-only - 0x00000000 - - - TGFSCC - Transmitted good frames single collision counter - 0 - 32 - - - - - MMCTGFMSCCR - MMCTGFMSCCR - Ethernet MMC transmitted good frames after more than a single collision - 0x50 - 0x20 - read-only - 0x00000000 - - - TGFMSCC - TGFMSCC - 0 - 32 - - - - - MMCTGFCR - MMCTGFCR - Ethernet MMC transmitted good frames counter register - 0x68 - 0x20 - read-only - 0x00000000 - - - TGFC - HTL - 0 - 32 - - - - - MMCRFCECR - MMCRFCECR - Ethernet MMC received frames with CRC error counter register - 0x94 - 0x20 - read-only - 0x00000000 - - - RFCFC - RFCFC - 0 - 32 - - - - - MMCRFAECR - MMCRFAECR - Ethernet MMC received frames with alignment error counter register - 0x98 - 0x20 - read-only - 0x00000000 - - - RFAEC - RFAEC - 0 - 32 - - - - - MMCRGUFCR - MMCRGUFCR - MMC received good unicast frames counter register - 0xC4 - 0x20 - read-only - 0x00000000 - - - RGUFC - RGUFC - 0 - 32 - - - - - - - Ethernet_PTP - Ethernet: Precision time protocol - Ethernet - 0x40028700 - - 0x0 - 0x400 - registers - - - - PTPTSCR - PTPTSCR - Ethernet PTP time stamp control register - 0x0 - 0x20 - read-write - 0x00002000 - - - TSE - TSE - 0 - 1 - - - TSFCU - TSFCU - 1 - 1 - - - TSPTPPSV2E - TSPTPPSV2E - 10 - 1 - - - TSSPTPOEFE - TSSPTPOEFE - 11 - 1 - - - TSSIPV6FE - TSSIPV6FE - 12 - 1 - - - TSSIPV4FE - TSSIPV4FE - 13 - 1 - - - TSSEME - TSSEME - 14 - 1 - - - TSSMRME - TSSMRME - 15 - 1 - - - TSCNT - TSCNT - 16 - 2 - - - TSPFFMAE - TSPFFMAE - 18 - 1 - - - TSSTI - TSSTI - 2 - 1 - - - TSSTU - TSSTU - 3 - 1 - - - TSITE - TSITE - 4 - 1 - - - TTSARU - TTSARU - 5 - 1 - - - TSSARFE - TSSARFE - 8 - 1 - - - TSSSR - TSSSR - 9 - 1 - - - - - PTPSSIR - PTPSSIR - Ethernet PTP subsecond increment register - 0x4 - 0x20 - read-write - 0x00000000 - - - STSSI - STSSI - 0 - 8 - - - - - PTPTSHR - PTPTSHR - Ethernet PTP time stamp high register - 0x8 - 0x20 - read-only - 0x00000000 - - - STS - STS - 0 - 32 - - - - - PTPTSLR - PTPTSLR - Ethernet PTP time stamp low register - 0xC - 0x20 - read-only - 0x00000000 - - - STSS - STSS - 0 - 31 - - - STPNS - STPNS - 31 - 1 - - - - - PTPTSHUR - PTPTSHUR - Ethernet PTP time stamp high update register - 0x10 - 0x20 - read-write - 0x00000000 - - - TSUS - TSUS - 0 - 32 - - - - - PTPTSLUR - PTPTSLUR - Ethernet PTP time stamp low update register - 0x14 - 0x20 - read-write - 0x00000000 - - - TSUSS - TSUSS - 0 - 31 - - - TSUPNS - TSUPNS - 31 - 1 - - - - - PTPTSAR - PTPTSAR - Ethernet PTP time stamp addend register - 0x18 - 0x20 - read-write - 0x00000000 - - - TSA - TSA - 0 - 32 - - - - - PTPTTHR - PTPTTHR - Ethernet PTP target time high register - 0x1C - 0x20 - read-write - 0x00000000 - - - TTSH - 0 - 0 - 32 - - - - - PTPTTLR - PTPTTLR - Ethernet PTP target time low register - 0x20 - 0x20 - read-write - 0x00000000 - - - TTSL - TTSL - 0 - 32 - - - - - PTPTSSR - PTPTSSR - Ethernet PTP time stamp status register - 0x28 - 0x20 - read-only - 0x00000000 - - - TSSO - TSSO - 0 - 1 - - - TSTTR - TSTTR - 1 - 1 - - - - - PTPPPSCR - PTPPPSCR - Ethernet PTP PPS control register - 0x2C - 0x20 - read-only - 0x00000000 - - - TSSO - TSSO - 0 - 1 - - - TSTTR - TSTTR - 1 - 1 - - - - - - - Ethernet_DMA - Ethernet: DMA controller operation - Ethernet - 0x40029000 - - 0x0 - 0x400 - registers - - - ETH - Ethernet global interrupt - 61 - - - ETH_WKUP - Ethernet Wakeup through EXTI line - interrupt - 62 - - - - DMABMR - DMABMR - Ethernet DMA bus mode register - 0x0 - 0x20 - read-write - 0x00002101 - - - SR - Software reset - 0 - 1 - - SR - read-write - - Reset - Reset all MAC subsystem internal registers and logic. Cleared automatically - 1 - - - - - DA - DMA arbitration - 1 - 1 - - DA - read-write - - RoundRobin - Round-robin with Rx:Tx priority given by PM - 0 - - - RxPriority - Rx has priority over Tx - 1 - - - - - DSL - Descriptor skip length - 2 - 5 - - - 0 - 31 - - - - - EDFE - Enhanced descriptor format enable - 7 - 1 - - EDFE - read-write - - Disabled - Normal descriptor format - 0 - - - Enabled - Enhanced 32-byte descriptor format, required for timestamping and IPv4 checksum offload - 1 - - - - - PBL - Programmable burst length - 8 - 6 - - PBL - read-write - - PBL1 - Maximum of 1 beat per DMA transaction - 1 - - - PBL2 - Maximum of 2 beats per DMA transaction - 2 - - - PBL4 - Maximum of 4 beats per DMA transaction - 4 - - - PBL8 - Maximum of 8 beats per DMA transaction - 8 - - - PBL16 - Maximum of 16 beats per DMA transaction - 16 - - - PBL32 - Maximum of 32 beats per DMA transaction - 32 - - - - - PM - Rx-Tx priority ratio - 14 - 2 - - PM - read-write - - OneToOne - RxDMA priority over TxDMA is 1:1 - 0 - - - TwoToOne - RxDMA priority over TxDMA is 2:1 - 1 - - - ThreeToOne - RxDMA priority over TxDMA is 3:1 - 2 - - - FourToOne - RxDMA priority over TxDMA is 4:1 - 3 - - - - - FB - Fixed burst - 16 - 1 - - FB - read-write - - Variable - AHB uses SINGLE and INCR burst transfers - 0 - - - Fixed - AHB uses only fixed burst transfers - 1 - - - - - RDP - Rx DMA PBL - 17 - 6 - - RDP - read-write - - RDP1 - 1 beat per RxDMA transaction - 1 - - - RDP2 - 2 beats per RxDMA transaction - 2 - - - RDP4 - 4 beats per RxDMA transaction - 4 - - - RDP8 - 8 beats per RxDMA transaction - 8 - - - RDP16 - 16 beats per RxDMA transaction - 16 - - - RDP32 - 32 beats per RxDMA transaction - 32 - - - - - USP - Use separate PBL - 23 - 1 - - USP - read-write - - Combined - PBL value used for both Rx and Tx DMA - 0 - - - Separate - RxDMA uses RDP value, TxDMA uses PBL value - 1 - - - - - FPM - 4xPBL mode - 24 - 1 - - FPM - read-write - - x1 - PBL values used as-is - 0 - - - x4 - PBL values multiplied by 4 - 1 - - - - - AAB - Address-aligned beats - 25 - 1 - - AAB - read-write - - Unaligned - Bursts are not aligned - 0 - - - Aligned - Align bursts to start address LS bits. First burst alignment depends on FB bit - 1 - - - - - MB - Mixed burst - 26 - 1 - - MB - read-write - - Normal - Fixed burst transfers (INCRx and SINGLE) for burst lengths of 16 and below - 0 - - - Mixed - If FB is low, start all bursts greater than 16 with INCR (undefined burst) - 1 - - - - - - - DMATPDR - DMATPDR - Ethernet DMA transmit poll demand register - 0x4 - 0x20 - read-write - 0x00000000 - - - TPD - Transmit poll demand - 0 - 32 - - TPD - read-write - - Poll - Poll the transmit descriptor list - 0 - - - - - - - DMARPDR - DMARPDR - EHERNET DMA receive poll demand register - 0x8 - 0x20 - read-write - 0x00000000 - - - RPD - Receive poll demand - 0 - 32 - - RPD - read-write - - Poll - Poll the receive descriptor list - 0 - - - - - - - DMARDLAR - DMARDLAR - Ethernet DMA receive descriptor list address register - 0xC - 0x20 - read-write - 0x00000000 - - - SRL - Start of receive list - 0 - 32 - - - - - DMATDLAR - DMATDLAR - Ethernet DMA transmit descriptor list address register - 0x10 - 0x20 - read-write - 0x00000000 - - - STL - Start of transmit list - 0 - 32 - - - - - DMASR - DMASR - Ethernet DMA status register - 0x14 - 0x20 - 0x00000000 - - - TS - Transmit status - 0 - 1 - read-write - - - TPSS - Transmit process stopped status - 1 - 1 - read-write - - - TBUS - Transmit buffer unavailable status - 2 - 1 - read-write - - - TJTS - Transmit jabber timeout status - 3 - 1 - read-write - - - ROS - Receive overflow status - 4 - 1 - read-write - - - TUS - Transmit underflow status - 5 - 1 - read-write - - - RS - Receive status - 6 - 1 - read-write - - - RBUS - Receive buffer unavailable status - 7 - 1 - read-write - - - RPSS - Receive process stopped status - 8 - 1 - read-write - - - PWTS - PWTS - 9 - 1 - read-write - - - ETS - Early transmit status - 10 - 1 - read-write - - - FBES - Fatal bus error status - 13 - 1 - read-write - - - ERS - Early receive status - 14 - 1 - read-write - - - AIS - Abnormal interrupt summary - 15 - 1 - read-write - - - NIS - Normal interrupt summary - 16 - 1 - read-write - - - RPS - Receive process state - 17 - 3 - read-only - - RPS - read - - Stopped - Stopped, reset or Stop Receive command issued - 0 - - - RunningFetching - Running, fetching receive transfer descriptor - 1 - - - RunningWaiting - Running, waiting for receive packet - 3 - - - Suspended - Suspended, receive descriptor unavailable - 4 - - - RunningWriting - Running, writing data to host memory buffer - 7 - - - - - TPS - Transmit process state - 20 - 3 - read-only - - TPS - read - - Stopped - Stopped, Reset or Stop Transmit command issued - 0 - - - RunningFetching - Running, fetching transmit transfer descriptor - 1 - - - RunningWaiting - Running, waiting for status - 2 - - - RunningReading - Running, reading data from host memory buffer - 3 - - - Suspended - Suspended, transmit descriptor unavailable or transmit buffer underflow - 6 - - - Running - Running, closing transmit descriptor - 7 - - - - - EBS - Error bits status - 23 - 3 - read-only - - - MMCS - MMC status - 27 - 1 - read-only - - - PMTS - PMT status - 28 - 1 - read-only - - - TSTS - Time stamp trigger status - 29 - 1 - read-only - - - - - DMAOMR - DMAOMR - Ethernet DMA operation mode register - 0x18 - 0x20 - read-write - 0x00000000 - - - SR - Start/stop receive - 1 - 1 - - SR - read-write - - Stopped - Reception is stopped after transfer of the current frame - 0 - - - Started - Reception is placed in the Running state - 1 - - - - - OSF - Operate on second frame - 2 - 1 - - - RTC - Receive threshold control - 3 - 2 - - RTC - read-write - - RTC64 - 64 bytes - 0 - - - RTC32 - 32 bytes - 1 - - - RTC96 - 96 bytes - 2 - - - RTC128 - 128 bytes - 3 - - - - - FUGF - Forward undersized good frames - 6 - 1 - - FUGF - read-write - - Drop - Rx FIFO drops all frames of less than 64 bytes - 0 - - - Forward - Rx FIFO forwards undersized frames - 1 - - - - - FEF - Forward error frames - 7 - 1 - - FEF - read-write - - Drop - Rx FIFO drops frames with error status - 0 - - - Forward - All frames except runt error frames are forwarded to the DMA - 1 - - - - - ST - Start/stop transmission - 13 - 1 - - ST - read-write - - Stopped - Transmission is placed in the Stopped state - 0 - - - Started - Transmission is placed in Running state - 1 - - - - - TTC - Transmit threshold control - 14 - 3 - - TTC - read-write - - TTC64 - 64 bytes - 0 - - - TTC128 - 128 bytes - 1 - - - TTC192 - 192 bytes - 2 - - - TTC256 - 256 bytes - 3 - - - TTC40 - 40 bytes - 4 - - - TTC32 - 32 bytes - 5 - - - TTC24 - 24 bytes - 6 - - - TTC16 - 16 bytes - 7 - - - - - FTF - Flush transmit FIFO - 20 - 1 - - FTF - read-write - - Flush - Transmit FIFO controller logic is reset to its default values. Cleared automatically - 1 - - - - - TSF - Transmit store and forward - 21 - 1 - - TSF - read-write - - CutThrough - Transmission starts when the frame size in the Tx FIFO exceeds TTC threshold - 0 - - - StoreForward - Transmission starts when a full frame is in the Tx FIFO - 1 - - - - - DFRF - Disable flushing of received frames - 24 - 1 - - - RSF - Receive store and forward - 25 - 1 - - RSF - read-write - - CutThrough - Rx FIFO operates in cut-through mode, subject to RTC bits - 0 - - - StoreForward - Frames are read from Rx FIFO after complete frame has been written - 1 - - - - - DTCEFD - Dropping of TCP/IP checksum error frames disable - 26 - 1 - - DTCEFD - read-write - - Enabled - Drop frames with errors only in the receive checksum offload engine - 0 - - - Disabled - Do not drop frames that only have errors in the receive checksum offload engine - 1 - - - - - - - DMAIER - DMAIER - Ethernet DMA interrupt enable register - 0x1C - 0x20 - read-write - 0x00000000 - - - TIE - Transmit interrupt enable - 0 - 1 - - - TPSIE - Transmit process stopped interrupt enable - 1 - 1 - - - TBUIE - Transmit buffer unavailable interrupt enable - 2 - 1 - - - TJTIE - Transmit jabber timeout interrupt enable - 3 - 1 - - - ROIE - Receive overflow interrupt enable - 4 - 1 - - - TUIE - Transmit underflow interrupt enable - 5 - 1 - - - RIE - Receive interrupt enable - 6 - 1 - - - RBUIE - Receive buffer unavailable interrupt enable - 7 - 1 - - - RPSIE - Receive process stopped interrupt enable - 8 - 1 - - - RWTIE - Receive watchdog timeout interrupt enable - 9 - 1 - - - ETIE - Early transmit interrupt enable - 10 - 1 - - - FBEIE - Fatal bus error interrupt enable - 13 - 1 - - - ERIE - Early receive interrupt enable - 14 - 1 - - - AISE - Abnormal interrupt summary enable - 15 - 1 - - - NISE - Normal interrupt summary enable - 16 - 1 - - - - - DMAMFBOCR - DMAMFBOCR - Ethernet DMA missed frame and buffer overflow counter register - 0x20 - 0x20 - read-write - 0x00000000 - - - MFC - Missed frames by the controller - 0 - 16 - - - OMFC - Overflow bit for missed frame counter - 16 - 1 - - - MFA - Missed frames by the application - 17 - 11 - - - OFOC - Overflow bit for FIFO overflow counter - 28 - 1 - - - - - DMARSWTR - DMARSWTR - Ethernet DMA receive status watchdog timer register - 0x24 - 0x20 - read-write - 0x00000000 - - - RSWTC - Receive status watchdog timer count - 0 - 8 - - - 0 - 255 - - - - - - - DMACHTDR - DMACHTDR - Ethernet DMA current host transmit descriptor register - 0x48 - 0x20 - read-only - 0x00000000 - - - HTDAP - Host transmit descriptor address pointer - 0 - 32 - - - - - DMACHRDR - DMACHRDR - Ethernet DMA current host receive descriptor register - 0x4C - 0x20 - read-only - 0x00000000 - - - HRDAP - Host receive descriptor address pointer - 0 - 32 - - - - - DMACHTBAR - DMACHTBAR - Ethernet DMA current host transmit buffer address register - 0x50 - 0x20 - read-only - 0x00000000 - - - HTBAP - Host transmit buffer address pointer - 0 - 32 - - - - - DMACHRBAR - DMACHRBAR - Ethernet DMA current host receive buffer address register - 0x54 - 0x20 - read-only - 0x00000000 - - - HRBAP - Host receive buffer address pointer - 0 - 32 - - - - - - - CRC - Cryptographic processor - CRC - 0x40023000 - - 0x0 - 0x400 - registers - - - HDMI_CEC - HDMI-CEC global interrupt - 94 - - - - DR - DR - Data register - 0x0 - 0x20 - read-write - 0xFFFFFFFF - - - DR - Data Register - 0 - 32 - - - 0 - 4294967295 - - - - - - - IDR - IDR - Independent Data register - 0x4 - 0x20 - read-write - 0x00000000 - - - IDR - Independent Data register - 0 - 8 - - - 0 - 255 - - - - - - - CR - CR - Control register - 0x8 - 0x20 - write-only - 0x00000000 - - - RESET - RESET bit - 0 - 1 - - RESETW - write - - Reset - Resets the CRC calculation unit and sets the data register to 0xFFFF FFFF - 1 - - - - - REV_OUT - Reverse output data - 7 - 1 - read-write - - REV_OUT - read-write - - Normal - Bit order not affected - 0 - - - Reversed - Bit reversed output - 1 - - - - - REV_IN - Reverse input data - 5 - 2 - read-write - - REV_IN - read-write - - Normal - Bit order not affected - 0 - - - Byte - Bit reversal done by byte - 1 - - - HalfWord - Bit reversal done by half-word - 2 - - - Word - Bit reversal done by word - 3 - - - - - POLYSIZE - Polynomial size - 3 - 2 - read-write - - POLYSIZE - read-write - - Polysize32 - 32-bit polynomial - 0 - - - Polysize16 - 16-bit polynomial - 1 - - - Polysize8 - 8-bit polynomial - 2 - - - Polysize7 - 7-bit polynomial - 3 - - - - - - - INIT - INIT - Initial CRC value - 0x10 - 0x20 - read-write - 0x00000000 - - - INIT - Programmable initial CRC value - 0 - 32 - - - 0 - 4294967295 - - - - - - - POL - POL - CRC polynomial - 0x14 - 0x20 - read-write - 0x00000000 - - - POL - Programmable polynomial - 0 - 32 - - - 0 - 4294967295 - - - - - - - DR8 - Data register - byte sized - DR - 0x0 - 0x8 - read-write - 0x000000FF - - - DR8 - Data register bits - 0 - 8 - - - 0 - 255 - - - - - - - DR16 - Data register - half-word sized - DR - 0x0 - 0x10 - read-write - 0x0000FFFF - - - DR16 - Data register bits - 0 - 16 - - - 0 - 65535 - - - - - - - - - CAN1 - Controller area network - CAN - 0x40006400 - - 0x0 - 0x400 - registers - - - CAN1_TX - CAN1 TX interrupts - 19 - - - CAN1_RX0 - CAN1 RX0 interrupts - 20 - - - CAN1_RX1 - CAN1 RX1 interrupts - 21 - - - CAN1_SCE - CAN1 SCE interrupt - 22 - - - - MCR - MCR - master control register - 0x0 - 0x20 - read-write - 0x00010002 - - - DBF - DBF - 16 - 1 - - - RESET - RESET - 15 - 1 - - - TTCM - TTCM - 7 - 1 - - - ABOM - ABOM - 6 - 1 - - - AWUM - AWUM - 5 - 1 - - - NART - NART - 4 - 1 - - - RFLM - RFLM - 3 - 1 - - - TXFP - TXFP - 2 - 1 - - - SLEEP - SLEEP - 1 - 1 - - - INRQ - INRQ - 0 - 1 - - - - - MSR - MSR - master status register - 0x4 - 0x20 - 0x00000C02 - - - RX - RX - 11 - 1 - read-only - - - SAMP - SAMP - 10 - 1 - read-only - - - RXM - RXM - 9 - 1 - read-only - - - TXM - TXM - 8 - 1 - read-only - - - SLAKI - SLAKI - 4 - 1 - read-write - - - WKUI - WKUI - 3 - 1 - read-write - - - ERRI - ERRI - 2 - 1 - read-write - - - SLAK - SLAK - 1 - 1 - read-only - - - INAK - INAK - 0 - 1 - read-only - - - - - TSR - TSR - transmit status register - 0x8 - 0x20 - 0x1C000000 - - - LOW2 - Lowest priority flag for mailbox 2 - 31 - 1 - read-only - - - LOW1 - Lowest priority flag for mailbox 1 - 30 - 1 - read-only - - - LOW0 - Lowest priority flag for mailbox 0 - 29 - 1 - read-only - - - TME2 - Lowest priority flag for mailbox 2 - 28 - 1 - read-only - - - TME1 - Lowest priority flag for mailbox 1 - 27 - 1 - read-only - - - TME0 - Lowest priority flag for mailbox 0 - 26 - 1 - read-only - - - CODE - CODE - 24 - 2 - read-only - - - ABRQ2 - ABRQ2 - 23 - 1 - read-write - - - TERR2 - TERR2 - 19 - 1 - read-write - - - ALST2 - ALST2 - 18 - 1 - read-write - - - TXOK2 - TXOK2 - 17 - 1 - read-write - - - RQCP2 - RQCP2 - 16 - 1 - read-write - - - ABRQ1 - ABRQ1 - 15 - 1 - read-write - - - TERR1 - TERR1 - 11 - 1 - read-write - - - ALST1 - ALST1 - 10 - 1 - read-write - - - TXOK1 - TXOK1 - 9 - 1 - read-write - - - RQCP1 - RQCP1 - 8 - 1 - read-write - - - ABRQ0 - ABRQ0 - 7 - 1 - read-write - - - TERR0 - TERR0 - 3 - 1 - read-write - - - ALST0 - ALST0 - 2 - 1 - read-write - - - TXOK0 - TXOK0 - 1 - 1 - read-write - - - RQCP0 - RQCP0 - 0 - 1 - read-write - - - - - 2 - 0x4 - 0-1 - RF%sR - RF0R - receive FIFO %s register - 0xC - 0x20 - 0x00000000 - - - RFOM - RFOM0 - 5 - 1 - read-write - - RFOM0W - write - - Release - Set by software to release the output mailbox of the FIFO - 1 - - - - - FOVR - FOVR0 - 4 - 1 - read-write - - FOVR0R - read - - NoOverrun - No FIFO x overrun - 0 - - - Overrun - FIFO x overrun - 1 - - - - FOVR0W - write - - Clear - Clear flag - 1 - - - - - FULL - FULL0 - 3 - 1 - read-write - - FULL0R - read - - NotFull - FIFO x is not full - 0 - - - Full - FIFO x is full - 1 - - - - FULL0W - write - - Clear - Clear flag - 1 - - - - - FMP - FMP0 - 0 - 2 - read-only - - - - - IER - IER - interrupt enable register - 0x14 - 0x20 - read-write - 0x00000000 - - - SLKIE - SLKIE - 17 - 1 - - SLKIE - read-write - - Disabled - No interrupt when SLAKI bit is set - 0 - - - Enabled - Interrupt generated when SLAKI bit is set - 1 - - - - - WKUIE - WKUIE - 16 - 1 - - WKUIE - read-write - - Disabled - No interrupt when WKUI is set - 0 - - - Enabled - Interrupt generated when WKUI bit is set - 1 - - - - - ERRIE - ERRIE - 15 - 1 - - ERRIE - read-write - - Disabled - No interrupt will be generated when an error condition is pending in the CAN_ESR - 0 - - - Enabled - An interrupt will be generation when an error condition is pending in the CAN_ESR - 1 - - - - - LECIE - LECIE - 11 - 1 - - LECIE - read-write - - Disabled - ERRI bit will not be set when the error code in LEC[2:0] is set by hardware on error detection - 0 - - - Enabled - ERRI bit will be set when the error code in LEC[2:0] is set by hardware on error detection - 1 - - - - - BOFIE - BOFIE - 10 - 1 - - BOFIE - read-write - - Disabled - ERRI bit will not be set when BOFF is set - 0 - - - Enabled - ERRI bit will be set when BOFF is set - 1 - - - - - EPVIE - EPVIE - 9 - 1 - - EPVIE - read-write - - Disabled - ERRI bit will not be set when EPVF is set - 0 - - - Enabled - ERRI bit will be set when EPVF is set - 1 - - - - - EWGIE - EWGIE - 8 - 1 - - EWGIE - read-write - - Disabled - ERRI bit will not be set when EWGF is set - 0 - - - Enabled - ERRI bit will be set when EWGF is set - 1 - - - - - FOVIE1 - FOVIE1 - 6 - 1 - - FOVIE1 - read-write - - Disabled - No interrupt when FOVR is set - 0 - - - Enabled - Interrupt generation when FOVR is set - 1 - - - - - FFIE1 - FFIE1 - 5 - 1 - - FFIE1 - read-write - - Disabled - No interrupt when FULL bit is set - 0 - - - Enabled - Interrupt generated when FULL bit is set - 1 - - - - - FMPIE1 - FMPIE1 - 4 - 1 - - FMPIE1 - read-write - - Disabled - No interrupt generated when state of FMP[1:0] bits are not 00b - 0 - - - Enabled - Interrupt generated when state of FMP[1:0] bits are not 00b - 1 - - - - - FOVIE0 - FOVIE0 - 3 - 1 - - FOVIE0 - read-write - - Disabled - No interrupt when FOVR bit is set - 0 - - - Enabled - Interrupt generated when FOVR bit is set - 1 - - - - - FFIE0 - FFIE0 - 2 - 1 - - FFIE0 - read-write - - Disabled - No interrupt when FULL bit is set - 0 - - - Enabled - Interrupt generated when FULL bit is set - 1 - - - - - FMPIE0 - FMPIE0 - 1 - 1 - - FMPIE0 - read-write - - Disabled - No interrupt generated when state of FMP[1:0] bits are not 00 - 0 - - - Enabled - Interrupt generated when state of FMP[1:0] bits are not 00b - 1 - - - - - TMEIE - TMEIE - 0 - 1 - - TMEIE - read-write - - Disabled - No interrupt when RQCPx bit is set - 0 - - - Enabled - Interrupt generated when RQCPx bit is set - 1 - - - - - - - ESR - ESR - interrupt enable register - 0x18 - 0x20 - 0x00000000 - - - REC - REC - 24 - 8 - read-only - - - TEC - TEC - 16 - 8 - read-only - - - LEC - LEC - 4 - 3 - read-write - - LEC - read-write - - NoError - No Error - 0 - - - Stuff - Stuff Error - 1 - - - Form - Form Error - 2 - - - Ack - Acknowledgment Error - 3 - - - BitRecessive - Bit recessive Error - 4 - - - BitDominant - Bit dominant Error - 5 - - - Crc - CRC Error - 6 - - - Custom - Set by software - 7 - - - - - BOFF - BOFF - 2 - 1 - read-only - - - EPVF - EPVF - 1 - 1 - read-only - - - EWGF - EWGF - 0 - 1 - read-only - - - - - BTR - BTR - bit timing register - 0x1C - 0x20 - read-write - 0x00000000 - - - SILM - SILM - 31 - 1 - - SILM - read-write - - Normal - Normal operation - 0 - - - Silent - Silent Mode - 1 - - - - - LBKM - LBKM - 30 - 1 - - LBKM - read-write - - Disabled - Loop Back Mode disabled - 0 - - - Enabled - Loop Back Mode enabled - 1 - - - - - SJW - SJW - 24 - 2 - - - TS2 - TS2 - 20 - 3 - - - TS1 - TS1 - 16 - 4 - - - BRP - BRP - 0 - 10 - - - - - 3 - 0x10 - 0-2 - TX%s - CAN Transmit cluster - 0x180 - - TIR - TI0R - TX mailbox identifier register - 0x0 - 0x20 - read-write - 0x00000000 - - - STID - STID - 21 - 11 - - - EXID - EXID - 3 - 18 - - - IDE - IDE - 2 - 1 - - IDE - read-write - - Standard - Standard identifier - 0 - - - Extended - Extended identifier - 1 - - - - - RTR - RTR - 1 - 1 - - RTR - read-write - - Data - Data frame - 0 - - - Remote - Remote frame - 1 - - - - - TXRQ - TXRQ - 0 - 1 - - - - - TDTR - TDT0R - mailbox data length control and time stamp register - 0x4 - 0x20 - read-write - 0x00000000 - - - TIME - TIME - 16 - 16 - - - TGT - TGT - 8 - 1 - - - DLC - DLC - 0 - 4 - - - 0 - 8 - - - - - - - TDLR - TDL0R - mailbox data low register - 0x8 - 0x20 - read-write - 0x00000000 - - - DATA3 - DATA3 - 24 - 8 - - - DATA2 - DATA2 - 16 - 8 - - - DATA1 - DATA1 - 8 - 8 - - - DATA0 - DATA0 - 0 - 8 - - - - - TDHR - TDH0R - mailbox data high register - 0xC - 0x20 - read-write - 0x00000000 - - - DATA7 - DATA7 - 24 - 8 - - - DATA6 - DATA6 - 16 - 8 - - - DATA5 - DATA5 - 8 - 8 - - - DATA4 - DATA4 - 0 - 8 - - - - - - 2 - 0x10 - 0-1 - RX%s - CAN Receive cluster - 0x1B0 - - RIR - RI0R - receive FIFO mailbox identifier register - 0x0 - 0x20 - read-only - 0x00000000 - - - STID - STID - 21 - 11 - - - EXID - EXID - 3 - 18 - - - IDE - IDE - 2 - 1 - - IDE - read - - Standard - Standard identifier - 0 - - - Extended - Extended identifier - 1 - - - - - RTR - RTR - 1 - 1 - - RTR - read - - Data - Data frame - 0 - - - Remote - Remote frame - 1 - - - - - - - RDTR - RDT0R - mailbox data high register - 0x4 - 0x20 - read-only - 0x00000000 - - - TIME - TIME - 16 - 16 - - - FMI - FMI - 8 - 8 - - - DLC - DLC - 0 - 4 - - - 0 - 8 - - - - - - - RDLR - RDL0R - mailbox data high register - 0x8 - 0x20 - read-only - 0x00000000 - - - DATA3 - DATA3 - 24 - 8 - - - DATA2 - DATA2 - 16 - 8 - - - DATA1 - DATA1 - 8 - 8 - - - DATA0 - DATA0 - 0 - 8 - - - - - RDHR - RDH0R - receive FIFO mailbox data high register - 0xC - 0x20 - read-only - 0x00000000 - - - DATA7 - DATA7 - 24 - 8 - - - DATA6 - DATA6 - 16 - 8 - - - DATA5 - DATA5 - 8 - 8 - - - DATA4 - DATA4 - 0 - 8 - - - - - - FMR - FMR - filter master register - 0x200 - 0x20 - read-write - 0x2A1C0E01 - - - CAN2SB - CAN2SB - 8 - 6 - - - FINIT - FINIT - 0 - 1 - - - - - FM1R - FM1R - filter mode register - 0x204 - 0x20 - read-write - 0x00000000 - - - FBM0 - Filter mode - 0 - 1 - - - FBM1 - Filter mode - 1 - 1 - - - FBM2 - Filter mode - 2 - 1 - - - FBM3 - Filter mode - 3 - 1 - - - FBM4 - Filter mode - 4 - 1 - - - FBM5 - Filter mode - 5 - 1 - - - FBM6 - Filter mode - 6 - 1 - - - FBM7 - Filter mode - 7 - 1 - - - FBM8 - Filter mode - 8 - 1 - - - FBM9 - Filter mode - 9 - 1 - - - FBM10 - Filter mode - 10 - 1 - - - FBM11 - Filter mode - 11 - 1 - - - FBM12 - Filter mode - 12 - 1 - - - FBM13 - Filter mode - 13 - 1 - - - FBM14 - Filter mode - 14 - 1 - - - FBM15 - Filter mode - 15 - 1 - - - FBM16 - Filter mode - 16 - 1 - - - FBM17 - Filter mode - 17 - 1 - - - FBM18 - Filter mode - 18 - 1 - - - FBM19 - Filter mode - 19 - 1 - - - FBM20 - Filter mode - 20 - 1 - - - FBM21 - Filter mode - 21 - 1 - - - FBM22 - Filter mode - 22 - 1 - - - FBM23 - Filter mode - 23 - 1 - - - FBM24 - Filter mode - 24 - 1 - - - FBM25 - Filter mode - 25 - 1 - - - FBM26 - Filter mode - 26 - 1 - - - FBM27 - Filter mode - 27 - 1 - - - - - FS1R - FS1R - filter scale register - 0x20C - 0x20 - read-write - 0x00000000 - - - FSC0 - Filter scale configuration - 0 - 1 - - - FSC1 - Filter scale configuration - 1 - 1 - - - FSC2 - Filter scale configuration - 2 - 1 - - - FSC3 - Filter scale configuration - 3 - 1 - - - FSC4 - Filter scale configuration - 4 - 1 - - - FSC5 - Filter scale configuration - 5 - 1 - - - FSC6 - Filter scale configuration - 6 - 1 - - - FSC7 - Filter scale configuration - 7 - 1 - - - FSC8 - Filter scale configuration - 8 - 1 - - - FSC9 - Filter scale configuration - 9 - 1 - - - FSC10 - Filter scale configuration - 10 - 1 - - - FSC11 - Filter scale configuration - 11 - 1 - - - FSC12 - Filter scale configuration - 12 - 1 - - - FSC13 - Filter scale configuration - 13 - 1 - - - FSC14 - Filter scale configuration - 14 - 1 - - - FSC15 - Filter scale configuration - 15 - 1 - - - FSC16 - Filter scale configuration - 16 - 1 - - - FSC17 - Filter scale configuration - 17 - 1 - - - FSC18 - Filter scale configuration - 18 - 1 - - - FSC19 - Filter scale configuration - 19 - 1 - - - FSC20 - Filter scale configuration - 20 - 1 - - - FSC21 - Filter scale configuration - 21 - 1 - - - FSC22 - Filter scale configuration - 22 - 1 - - - FSC23 - Filter scale configuration - 23 - 1 - - - FSC24 - Filter scale configuration - 24 - 1 - - - FSC25 - Filter scale configuration - 25 - 1 - - - FSC26 - Filter scale configuration - 26 - 1 - - - FSC27 - Filter scale configuration - 27 - 1 - - - - - FFA1R - FFA1R - filter FIFO assignment register - 0x214 - 0x20 - read-write - 0x00000000 - - - FFA0 - Filter FIFO assignment for filter 0 - 0 - 1 - - - FFA1 - Filter FIFO assignment for filter 1 - 1 - 1 - - - FFA2 - Filter FIFO assignment for filter 2 - 2 - 1 - - - FFA3 - Filter FIFO assignment for filter 3 - 3 - 1 - - - FFA4 - Filter FIFO assignment for filter 4 - 4 - 1 - - - FFA5 - Filter FIFO assignment for filter 5 - 5 - 1 - - - FFA6 - Filter FIFO assignment for filter 6 - 6 - 1 - - - FFA7 - Filter FIFO assignment for filter 7 - 7 - 1 - - - FFA8 - Filter FIFO assignment for filter 8 - 8 - 1 - - - FFA9 - Filter FIFO assignment for filter 9 - 9 - 1 - - - FFA10 - Filter FIFO assignment for filter 10 - 10 - 1 - - - FFA11 - Filter FIFO assignment for filter 11 - 11 - 1 - - - FFA12 - Filter FIFO assignment for filter 12 - 12 - 1 - - - FFA13 - Filter FIFO assignment for filter 13 - 13 - 1 - - - FFA14 - Filter FIFO assignment for filter 14 - 14 - 1 - - - FFA15 - Filter FIFO assignment for filter 15 - 15 - 1 - - - FFA16 - Filter FIFO assignment for filter 16 - 16 - 1 - - - FFA17 - Filter FIFO assignment for filter 17 - 17 - 1 - - - FFA18 - Filter FIFO assignment for filter 18 - 18 - 1 - - - FFA19 - Filter FIFO assignment for filter 19 - 19 - 1 - - - FFA20 - Filter FIFO assignment for filter 20 - 20 - 1 - - - FFA21 - Filter FIFO assignment for filter 21 - 21 - 1 - - - FFA22 - Filter FIFO assignment for filter 22 - 22 - 1 - - - FFA23 - Filter FIFO assignment for filter 23 - 23 - 1 - - - FFA24 - Filter FIFO assignment for filter 24 - 24 - 1 - - - FFA25 - Filter FIFO assignment for filter 25 - 25 - 1 - - - FFA26 - Filter FIFO assignment for filter 26 - 26 - 1 - - - FFA27 - Filter FIFO assignment for filter 27 - 27 - 1 - - - - - FA1R - FA1R - filter activation register - 0x21C - 0x20 - read-write - 0x00000000 - - - FACT0 - Filter active - 0 - 1 - - - FACT1 - Filter active - 1 - 1 - - - FACT2 - Filter active - 2 - 1 - - - FACT3 - Filter active - 3 - 1 - - - FACT4 - Filter active - 4 - 1 - - - FACT5 - Filter active - 5 - 1 - - - FACT6 - Filter active - 6 - 1 - - - FACT7 - Filter active - 7 - 1 - - - FACT8 - Filter active - 8 - 1 - - - FACT9 - Filter active - 9 - 1 - - - FACT10 - Filter active - 10 - 1 - - - FACT11 - Filter active - 11 - 1 - - - FACT12 - Filter active - 12 - 1 - - - FACT13 - Filter active - 13 - 1 - - - FACT14 - Filter active - 14 - 1 - - - FACT15 - Filter active - 15 - 1 - - - FACT16 - Filter active - 16 - 1 - - - FACT17 - Filter active - 17 - 1 - - - FACT18 - Filter active - 18 - 1 - - - FACT19 - Filter active - 19 - 1 - - - FACT20 - Filter active - 20 - 1 - - - FACT21 - Filter active - 21 - 1 - - - FACT22 - Filter active - 22 - 1 - - - FACT23 - Filter active - 23 - 1 - - - FACT24 - Filter active - 24 - 1 - - - FACT25 - Filter active - 25 - 1 - - - FACT26 - Filter active - 26 - 1 - - - FACT27 - Filter active - 27 - 1 - - - - - 28 - 0x8 - 0-27 - FB%s - CAN Filter Bank cluster - 0x240 - - FR1 - F0R1 - Filter bank 0 register 1 - 0x0 - 0x20 - read-write - 0x00000000 - - - FB - Filter bits - 0 - 32 - - - - - FR2 - F0R2 - Filter bank 0 register 2 - 0x4 - 0x20 - read-write - 0x00000000 - - - FB - Filter bits - 0 - 32 - - - - - - - - CAN2 - 0x40006800 - - CAN2_TX - CAN2 TX interrupts - 63 - - - CAN2_RX0 - CAN2 RX0 interrupts - 64 - - - CAN2_RX1 - CAN2 RX1 interrupts - 65 - - - CAN2_SCE - CAN2 SCE interrupt - 66 - - - - FLASH - FLASH - FLASH - 0x40023C00 - - 0x0 - 0x400 - registers - - - FLASH - Flash global interrupt - 4 - - - - ACR - ACR - Flash access control register - 0x0 - 0x20 - read-write - 0x00000000 - - - LATENCY - Latency - 0 - 4 - - LATENCY - read-write - - WS0 - 0 wait states - 0 - - - WS1 - 1 wait states - 1 - - - WS2 - 2 wait states - 2 - - - WS3 - 3 wait states - 3 - - - WS4 - 4 wait states - 4 - - - WS5 - 5 wait states - 5 - - - WS6 - 6 wait states - 6 - - - WS7 - 7 wait states - 7 - - - WS8 - 8 wait states - 8 - - - WS9 - 9 wait states - 9 - - - WS10 - 10 wait states - 10 - - - WS11 - 11 wait states - 11 - - - WS12 - 12 wait states - 12 - - - WS13 - 13 wait states - 13 - - - WS14 - 14 wait states - 14 - - - WS15 - 15 wait states - 15 - - - - - PRFTEN - Prefetch enable - 8 - 1 - - PRFTEN - read-write - - Disabled - Prefetch is disabled - 0 - - - Enabled - Prefetch is enabled - 1 - - - - - ARTEN - ART Accelerator Enable - 9 - 1 - - ARTEN - read-write - - Disabled - ART Accelerator is disabled - 0 - - - Enabled - ART Accelerator is enabled - 1 - - - - - ARTRST - ART Accelerator reset - 11 - 1 - - ARTRST - read-write - - NotReset - Accelerator is not reset - 0 - - - Reset - Accelerator is reset - 1 - - - - - - - KEYR - KEYR - Flash key register - 0x4 - 0x20 - write-only - 0x00000000 - - - KEY - FPEC key - 0 - 32 - - - 0 - 4294967295 - - - - - - - OPTKEYR - OPTKEYR - Flash option key register - 0x8 - 0x20 - write-only - 0x00000000 - - - OPTKEYR - Option byte key - 0 - 32 - - - 0 - 4294967295 - - - - - - - SR - SR - Status register - 0xC - 0x20 - 0x00000000 - - - EOP - End of operation - 0 - 1 - read-write - oneToClear - - EOPW - write - - Clear - Clear error flag - 1 - - - - - OPERR - Operation error - 1 - 1 - read-write - oneToClear - - OPERRW - write - - Clear - Clear error flag - 1 - - - - - WRPERR - Write protection error - 4 - 1 - read-write - oneToClear - - WRPERRW - write - - Clear - Clear error flag - 1 - - - - - PGAERR - Programming alignment error - 5 - 1 - read-write - oneToClear - - PGAERRW - write - - Clear - Clear error flag - 1 - - - - - PGPERR - Programming parallelism error - 6 - 1 - read-write - oneToClear - - PGPERRW - write - - Clear - Clear error flag - 1 - - - - - ERSERR - Programming sequence error - 7 - 1 - read-write - oneToClear - - ERSERRW - write - - Clear - Clear error flag - 1 - - - - - BSY - Busy - 16 - 1 - read-only - - BSYR - read - - NotBusy - no Flash memory operation ongoing - 0 - - - Busy - Flash memory operation ongoing - 1 - - - - - - - CR - CR - Control register - 0x10 - 0x20 - read-write - 0x80000000 - - - PG - Programming - 0 - 1 - - PG - read-write - - Program - Flash programming activated - 1 - - - - - SER - Sector Erase - 1 - 1 - - SER - read-write - - SectorErase - Erase activated for selected sector - 1 - - - - - MER - Mass Erase of sectors 0 to 11 - 2 - 1 - - MER - read-write - - MassErase - Erase activated for all user sectors - 1 - - - - - SNB - Sector number - 3 - 4 - - - 0 - 11 - - - - - PSIZE - Program size - 8 - 2 - - PSIZE - read-write - - PSIZE8 - Program x8 - 0 - - - PSIZE16 - Program x16 - 1 - - - PSIZE32 - Program x32 - 2 - - - PSIZE64 - Program x64 - 3 - - - - - STRT - Start - 16 - 1 - - STRT - read-write - - Start - Trigger an erase operation - 1 - - - - - EOPIE - End of operation interrupt enable - 24 - 1 - - EOPIE - read-write - - Disabled - End of operation interrupt disabled - 0 - - - Enabled - End of operation interrupt enabled - 1 - - - - - ERRIE - Error interrupt enable - 25 - 1 - - ERRIE - read-write - - Disabled - Error interrupt generation disabled - 0 - - - Enabled - Error interrupt generation enabled - 1 - - - - - LOCK - Lock - 31 - 1 - - LOCK - read-write - - Unlocked - FLASH_CR register is unlocked - 0 - - - Locked - FLASH_CR register is locked - 1 - - - - - - - OPTCR - OPTCR - Flash option control register - 0x14 - 0x20 - read-write - 0x0FFFAAED - - - OPTLOCK - Option lock - 0 - 1 - - - OPTSTRT - Option start - 1 - 1 - - - BOR_LEV - BOR reset Level - 2 - 2 - - - WWDG_SW - User option bytes - 4 - 1 - - - IWDG_SW - User option bytes - 5 - 1 - - - nRST_STOP - User option bytes - 6 - 1 - - - nRST_STDBY - User option bytes - 7 - 1 - - - RDP - Read protect - 8 - 8 - - - nWRP - Not write protect - 16 - 8 - - - IWDG_STDBY - Independent watchdog counter freeze in standby mode - 30 - 1 - - - IWDG_STOP - Independent watchdog counter freeze in Stop mode - 31 - 1 - - - - - OPTCR1 - OPTCR1 - Flash option control register 1 - 0x18 - 0x20 - read-write - 0x0FFF0000 - - - BOOT_ADD0 - Boot base address when Boot pin =0 - 0 - 16 - - - BOOT_ADD1 - Boot base address when Boot pin =1 - 16 - 16 - - - - - - - EXTI - External interrupt/event controller - EXTI - 0x40013C00 - - 0x0 - 0x400 - registers - - - PVD - PVD through EXTI line detection INTERRUPT - 1 - - - TAMP_STAMP - Tamper and TimeStamp interrupts through the - EXTI line - 2 - - - EXTI0 - EXTI Line0 interrupt - 6 - - - EXTI1 - EXTI Line1 interrupt - 7 - - - EXTI2 - EXTI Line2 interrupt - 8 - - - EXTI3 - EXTI Line3 interrupt - 9 - - - EXTI4 - EXTI Line4 interrupt - 10 - - - EXTI9_5 - EXTI Line[9:5] interrupts - 23 - - - EXTI15_10 - EXTI Line[15:10] interrupts - 40 - - - - IMR - IMR - Interrupt mask register (EXTI_IMR) - 0x0 - 0x20 - read-write - 0x00000000 - - - MR0 - Interrupt Mask on line 0 - 0 - 1 - - MR0 - read-write - - Masked - Interrupt request line is masked - 0 - - - Unmasked - Interrupt request line is unmasked - 1 - - - - - MR1 - Interrupt Mask on line 1 - 1 - 1 - - - - MR2 - Interrupt Mask on line 2 - 2 - 1 - - - - MR3 - Interrupt Mask on line 3 - 3 - 1 - - - - MR4 - Interrupt Mask on line 4 - 4 - 1 - - - - MR5 - Interrupt Mask on line 5 - 5 - 1 - - - - MR6 - Interrupt Mask on line 6 - 6 - 1 - - - - MR7 - Interrupt Mask on line 7 - 7 - 1 - - - - MR8 - Interrupt Mask on line 8 - 8 - 1 - - - - MR9 - Interrupt Mask on line 9 - 9 - 1 - - - - MR10 - Interrupt Mask on line 10 - 10 - 1 - - - - MR11 - Interrupt Mask on line 11 - 11 - 1 - - - - MR12 - Interrupt Mask on line 12 - 12 - 1 - - - - MR13 - Interrupt Mask on line 13 - 13 - 1 - - - - MR14 - Interrupt Mask on line 14 - 14 - 1 - - - - MR15 - Interrupt Mask on line 15 - 15 - 1 - - - - MR16 - Interrupt Mask on line 16 - 16 - 1 - - - - MR17 - Interrupt Mask on line 17 - 17 - 1 - - - - MR18 - Interrupt Mask on line 18 - 18 - 1 - - - - MR19 - Interrupt Mask on line 19 - 19 - 1 - - - - MR20 - Interrupt Mask on line 20 - 20 - 1 - - - - MR21 - Interrupt Mask on line 21 - 21 - 1 - - - - MR22 - Interrupt Mask on line 22 - 22 - 1 - - - - - - EMR - EMR - Event mask register (EXTI_EMR) - 0x4 - 0x20 - read-write - 0x00000000 - - - MR0 - Event Mask on line 0 - 0 - 1 - - MR0 - read-write - - Masked - Interrupt request line is masked - 0 - - - Unmasked - Interrupt request line is unmasked - 1 - - - - - MR1 - Event Mask on line 1 - 1 - 1 - - - - MR2 - Event Mask on line 2 - 2 - 1 - - - - MR3 - Event Mask on line 3 - 3 - 1 - - - - MR4 - Event Mask on line 4 - 4 - 1 - - - - MR5 - Event Mask on line 5 - 5 - 1 - - - - MR6 - Event Mask on line 6 - 6 - 1 - - - - MR7 - Event Mask on line 7 - 7 - 1 - - - - MR8 - Event Mask on line 8 - 8 - 1 - - - - MR9 - Event Mask on line 9 - 9 - 1 - - - - MR10 - Event Mask on line 10 - 10 - 1 - - - - MR11 - Event Mask on line 11 - 11 - 1 - - - - MR12 - Event Mask on line 12 - 12 - 1 - - - - MR13 - Event Mask on line 13 - 13 - 1 - - - - MR14 - Event Mask on line 14 - 14 - 1 - - - - MR15 - Event Mask on line 15 - 15 - 1 - - - - MR16 - Event Mask on line 16 - 16 - 1 - - - - MR17 - Event Mask on line 17 - 17 - 1 - - - - MR18 - Event Mask on line 18 - 18 - 1 - - - - MR19 - Event Mask on line 19 - 19 - 1 - - - - MR20 - Event Mask on line 20 - 20 - 1 - - - - MR21 - Event Mask on line 21 - 21 - 1 - - - - MR22 - Event Mask on line 22 - 22 - 1 - - - - - - RTSR - RTSR - Rising Trigger selection register (EXTI_RTSR) - 0x8 - 0x20 - read-write - 0x00000000 - - - TR0 - Rising trigger event configuration of line 0 - 0 - 1 - - TR0 - read-write - - Disabled - Rising edge trigger is disabled - 0 - - - Enabled - Rising edge trigger is enabled - 1 - - - - - TR1 - Rising trigger event configuration of line 1 - 1 - 1 - - - - TR2 - Rising trigger event configuration of line 2 - 2 - 1 - - - - TR3 - Rising trigger event configuration of line 3 - 3 - 1 - - - - TR4 - Rising trigger event configuration of line 4 - 4 - 1 - - - - TR5 - Rising trigger event configuration of line 5 - 5 - 1 - - - - TR6 - Rising trigger event configuration of line 6 - 6 - 1 - - - - TR7 - Rising trigger event configuration of line 7 - 7 - 1 - - - - TR8 - Rising trigger event configuration of line 8 - 8 - 1 - - - - TR9 - Rising trigger event configuration of line 9 - 9 - 1 - - - - TR10 - Rising trigger event configuration of line 10 - 10 - 1 - - - - TR11 - Rising trigger event configuration of line 11 - 11 - 1 - - - - TR12 - Rising trigger event configuration of line 12 - 12 - 1 - - - - TR13 - Rising trigger event configuration of line 13 - 13 - 1 - - - - TR14 - Rising trigger event configuration of line 14 - 14 - 1 - - - - TR15 - Rising trigger event configuration of line 15 - 15 - 1 - - - - TR16 - Rising trigger event configuration of line 16 - 16 - 1 - - - - TR17 - Rising trigger event configuration of line 17 - 17 - 1 - - - - TR18 - Rising trigger event configuration of line 18 - 18 - 1 - - - - TR19 - Rising trigger event configuration of line 19 - 19 - 1 - - - - TR20 - Rising trigger event configuration of line 20 - 20 - 1 - - - - TR21 - Rising trigger event configuration of line 21 - 21 - 1 - - - - TR22 - Rising trigger event configuration of line 22 - 22 - 1 - - - - - - FTSR - FTSR - Falling Trigger selection register (EXTI_FTSR) - 0xC - 0x20 - read-write - 0x00000000 - - - TR0 - Falling trigger event configuration of line 0 - 0 - 1 - - TR0 - read-write - - Disabled - Falling edge trigger is disabled - 0 - - - Enabled - Falling edge trigger is enabled - 1 - - - - - TR1 - Falling trigger event configuration of line 1 - 1 - 1 - - - - TR2 - Falling trigger event configuration of line 2 - 2 - 1 - - - - TR3 - Falling trigger event configuration of line 3 - 3 - 1 - - - - TR4 - Falling trigger event configuration of line 4 - 4 - 1 - - - - TR5 - Falling trigger event configuration of line 5 - 5 - 1 - - - - TR6 - Falling trigger event configuration of line 6 - 6 - 1 - - - - TR7 - Falling trigger event configuration of line 7 - 7 - 1 - - - - TR8 - Falling trigger event configuration of line 8 - 8 - 1 - - - - TR9 - Falling trigger event configuration of line 9 - 9 - 1 - - - - TR10 - Falling trigger event configuration of line 10 - 10 - 1 - - - - TR11 - Falling trigger event configuration of line 11 - 11 - 1 - - - - TR12 - Falling trigger event configuration of line 12 - 12 - 1 - - - - TR13 - Falling trigger event configuration of line 13 - 13 - 1 - - - - TR14 - Falling trigger event configuration of line 14 - 14 - 1 - - - - TR15 - Falling trigger event configuration of line 15 - 15 - 1 - - - - TR16 - Falling trigger event configuration of line 16 - 16 - 1 - - - - TR17 - Falling trigger event configuration of line 17 - 17 - 1 - - - - TR18 - Falling trigger event configuration of line 18 - 18 - 1 - - - - TR19 - Falling trigger event configuration of line 19 - 19 - 1 - - - - TR20 - Falling trigger event configuration of line 20 - 20 - 1 - - - - TR21 - Falling trigger event configuration of line 21 - 21 - 1 - - - - TR22 - Falling trigger event configuration of line 22 - 22 - 1 - - - - - - SWIER - SWIER - Software interrupt event register (EXTI_SWIER) - 0x10 - 0x20 - read-write - 0x00000000 - - - SWIER0 - Software Interrupt on line 0 - 0 - 1 - - SWIER0W - write - - Pend - Generates an interrupt request - 1 - - - - - SWIER1 - Software Interrupt on line 1 - 1 - 1 - - - - SWIER2 - Software Interrupt on line 2 - 2 - 1 - - - - SWIER3 - Software Interrupt on line 3 - 3 - 1 - - - - SWIER4 - Software Interrupt on line 4 - 4 - 1 - - - - SWIER5 - Software Interrupt on line 5 - 5 - 1 - - - - SWIER6 - Software Interrupt on line 6 - 6 - 1 - - - - SWIER7 - Software Interrupt on line 7 - 7 - 1 - - - - SWIER8 - Software Interrupt on line 8 - 8 - 1 - - - - SWIER9 - Software Interrupt on line 9 - 9 - 1 - - - - SWIER10 - Software Interrupt on line 10 - 10 - 1 - - - - SWIER11 - Software Interrupt on line 11 - 11 - 1 - - - - SWIER12 - Software Interrupt on line 12 - 12 - 1 - - - - SWIER13 - Software Interrupt on line 13 - 13 - 1 - - - - SWIER14 - Software Interrupt on line 14 - 14 - 1 - - - - SWIER15 - Software Interrupt on line 15 - 15 - 1 - - - - SWIER16 - Software Interrupt on line 16 - 16 - 1 - - - - SWIER17 - Software Interrupt on line 17 - 17 - 1 - - - - SWIER18 - Software Interrupt on line 18 - 18 - 1 - - - - SWIER19 - Software Interrupt on line 19 - 19 - 1 - - - - SWIER20 - Software Interrupt on line 20 - 20 - 1 - - - - SWIER21 - Software Interrupt on line 21 - 21 - 1 - - - - SWIER22 - Software Interrupt on line 22 - 22 - 1 - - - - - - PR - PR - Pending register (EXTI_PR) - 0x14 - 0x20 - read-write - 0x00000000 - - - PR0 - Pending bit 0 - 0 - 1 - oneToClear - - PR0R - read - - NotPending - No trigger request occurred - 0 - - - Pending - Selected trigger request occurred - 1 - - - - PR0W - write - - Clear - Clears pending bit - 1 - - - - - PR1 - Pending bit 1 - 1 - 1 - oneToClear - - read - - - write - - - - PR2 - Pending bit 2 - 2 - 1 - oneToClear - - read - - - write - - - - PR3 - Pending bit 3 - 3 - 1 - oneToClear - - read - - - write - - - - PR4 - Pending bit 4 - 4 - 1 - oneToClear - - read - - - write - - - - PR5 - Pending bit 5 - 5 - 1 - oneToClear - - read - - - write - - - - PR6 - Pending bit 6 - 6 - 1 - oneToClear - - read - - - write - - - - PR7 - Pending bit 7 - 7 - 1 - oneToClear - - read - - - write - - - - PR8 - Pending bit 8 - 8 - 1 - oneToClear - - read - - - write - - - - PR9 - Pending bit 9 - 9 - 1 - oneToClear - - read - - - write - - - - PR10 - Pending bit 10 - 10 - 1 - oneToClear - - read - - - write - - - - PR11 - Pending bit 11 - 11 - 1 - oneToClear - - read - - - write - - - - PR12 - Pending bit 12 - 12 - 1 - oneToClear - - read - - - write - - - - PR13 - Pending bit 13 - 13 - 1 - oneToClear - - read - - - write - - - - PR14 - Pending bit 14 - 14 - 1 - oneToClear - - read - - - write - - - - PR15 - Pending bit 15 - 15 - 1 - oneToClear - - read - - - write - - - - PR16 - Pending bit 16 - 16 - 1 - oneToClear - - read - - - write - - - - PR17 - Pending bit 17 - 17 - 1 - oneToClear - - read - - - write - - - - PR18 - Pending bit 18 - 18 - 1 - oneToClear - - read - - - write - - - - PR19 - Pending bit 19 - 19 - 1 - oneToClear - - read - - - write - - - - PR20 - Pending bit 20 - 20 - 1 - oneToClear - - read - - - write - - - - PR21 - Pending bit 21 - 21 - 1 - oneToClear - - read - - - write - - - - PR22 - Pending bit 22 - 22 - 1 - oneToClear - - read - - - write - - - - - - - - LTDC - LCD-TFT Controller - LTDC - 0x40016800 - - 0x0 - 0x400 - registers - - - LTDC - LTDC global interrupt - 88 - - - LTDC_ER - LTDC global error interrupt - 89 - - - - SSCR - SSCR - Synchronization Size Configuration Register - 0x8 - 0x20 - read-write - 0x00000000 - - - HSW - Horizontal Synchronization Width (in units of pixel clock period) - 16 - 12 - - - 0 - 4095 - - - - - VSH - Vertical Synchronization Height (in units of horizontal scan line) - 0 - 11 - - - 0 - 2047 - - - - - - - BPCR - BPCR - Back Porch Configuration Register - 0xC - 0x20 - read-write - 0x00000000 - - - AHBP - Accumulated Horizontal back porch (in units of pixel clock period) - 16 - 12 - - - 0 - 4095 - - - - - AVBP - Accumulated Vertical back porch (in units of horizontal scan line) - 0 - 11 - - - 0 - 2047 - - - - - - - AWCR - AWCR - Active Width Configuration Register - 0x10 - 0x20 - read-write - 0x00000000 - - - AAW - Accumulated Active Width (in units of pixel clock period) - 16 - 12 - - - 0 - 4095 - - - - - AAH - Accumulated Active Height (in units of horizontal scan line) - 0 - 11 - - - 0 - 2047 - - - - - - - TWCR - TWCR - Total Width Configuration Register - 0x14 - 0x20 - read-write - 0x00000000 - - - TOTALW - Total Width (in units of pixel clock period) - 16 - 12 - - - 0 - 4095 - - - - - TOTALH - Total Height (in units of horizontal scan line) - 0 - 11 - - - 0 - 2047 - - - - - - - GCR - GCR - Global Control Register - 0x18 - 0x20 - 0x00002220 - - - HSPOL - Horizontal Synchronization Polarity - 31 - 1 - read-write - - HSPOL - read-write - - ActiveLow - Horizontal synchronization polarity is active low - 0 - - - ActiveHigh - Horizontal synchronization polarity is active high - 1 - - - - - VSPOL - Vertical Synchronization Polarity - 30 - 1 - read-write - - VSPOL - read-write - - ActiveLow - Vertical synchronization polarity is active low - 0 - - - ActiveHigh - Vertical synchronization polarity is active high - 1 - - - - - DEPOL - Data Enable Polarity - 29 - 1 - read-write - - DEPOL - read-write - - ActiveLow - Data enable polarity is active low - 0 - - - ActiveHigh - Data enable polarity is active high - 1 - - - - - PCPOL - Pixel Clock Polarity - 28 - 1 - read-write - - PCPOL - read-write - - RisingEdge - Pixel clock on rising edge - 0 - - - FallingEdge - Pixel clock on falling edge - 1 - - - - - DEN - Dither Enable - 16 - 1 - read-write - - DEN - read-write - - Disabled - Dither disabled - 0 - - - Enabled - Dither enabled - 1 - - - - - DRW - Dither Red Width - 12 - 3 - read-only - - - DGW - Dither Green Width - 8 - 3 - read-only - - - DBW - Dither Blue Width - 4 - 3 - read-only - - - LTDCEN - LCD-TFT controller enable bit - 0 - 1 - read-write - - LTDCEN - read-write - - Disabled - LCD-TFT controller disabled - 0 - - - Enabled - LCD-TFT controller enabled - 1 - - - - - - - SRCR - SRCR - Shadow Reload Configuration Register - 0x24 - 0x20 - read-write - 0x00000000 - - - VBR - Vertical Blanking Reload - 1 - 1 - - VBR - read-write - - NoEffect - This bit is set by software and cleared only by hardware after reload (it cannot be cleared through register write once it is set) - 0 - - - Reload - The shadow registers are reloaded during the vertical blanking period (at the beginning of the first line after the active display area). - 1 - - - - - IMR - Immediate Reload - 0 - 1 - - IMR - read-write - - NoEffect - This bit is set by software and cleared only by hardware after reload (it cannot be cleared through register write once it is set) - 0 - - - Reload - The shadow registers are reloaded immediately. This bit is set by software and cleared only by hardware after reload - 1 - - - - - - - BCCR - BCCR - Background Color Configuration Register - 0x2C - 0x20 - read-write - 0x00000000 - - - BCBLUE - Background color blue value - 0 - 8 - - - 0 - 255 - - - - - BCGREEN - Background color green value - 8 - 8 - - - 0 - 255 - - - - - BCRED - Background color red value - 16 - 8 - - - 0 - 255 - - - - - - - IER - IER - Interrupt Enable Register - 0x34 - 0x20 - read-write - 0x00000000 - - - RRIE - Register Reload interrupt enable - 3 - 1 - - RRIE - read-write - - Disabled - Register reload interrupt disabled - 0 - - - Enabled - Register reload interrupt enabled - 1 - - - - - TERRIE - Transfer Error Interrupt Enable - 2 - 1 - - TERRIE - read-write - - Disabled - Transfer error interrupt disabled - 0 - - - Enabled - Transfer error interrupt enabled - 1 - - - - - FUIE - FIFO Underrun Interrupt Enable - 1 - 1 - - FUIE - read-write - - Disabled - FIFO underrun interrupt disabled - 0 - - - Enabled - FIFO underrun interrupt enabled - 1 - - - - - LIE - Line Interrupt Enable - 0 - 1 - - LIE - read-write - - Disabled - Line interrupt disabled - 0 - - - Enabled - Line interrupt enabled - 1 - - - - - - - ISR - ISR - Interrupt Status Register - 0x38 - 0x20 - read-only - 0x00000000 - - - RRIF - Register Reload Interrupt Flag - 3 - 1 - - RRIF - read - - NoReload - No register reload - 0 - - - Reload - Register reload interrupt generated when a vertical blanking reload occurs (and the first line after the active area is reached) - 1 - - - - - TERRIF - Transfer Error interrupt flag - 2 - 1 - - TERRIF - read - - NoError - No transfer error - 0 - - - Error - Transfer error interrupt generated when a bus error occurs - 1 - - - - - FUIF - FIFO Underrun Interrupt flag - 1 - 1 - - FUIF - read - - NoUnderrun - No FIFO underrun - 0 - - - Underrun - FIFO underrun interrupt generated, if one of the layer FIFOs is empty and pixel data is read from the FIFO - 1 - - - - - LIF - Line Interrupt flag - 0 - 1 - - LIF - read - - NotReached - Programmed line not reached - 0 - - - Reached - Line interrupt generated when a programmed line is reached - 1 - - - - - - - ICR - ICR - Interrupt Clear Register - 0x3C - 0x20 - write-only - 0x00000000 - - - CRRIF - Clears Register Reload Interrupt Flag - 3 - 1 - oneToClear - - CRRIFW - write - - Clear - Clears the RRIF flag in the ISR register - 1 - - - - - CTERRIF - Clears the Transfer Error Interrupt Flag - 2 - 1 - oneToClear - - CTERRIFW - write - - Clear - Clears the TERRIF flag in the ISR register - 1 - - - - - CFUIF - Clears the FIFO Underrun Interrupt flag - 1 - 1 - oneToClear - - CFUIFW - write - - Clear - Clears the FUIF flag in the ISR register - 1 - - - - - CLIF - Clears the Line Interrupt Flag - 0 - 1 - oneToClear - - CLIFW - write - - Clear - Clears the LIF flag in the ISR register - 1 - - - - - - - LIPCR - LIPCR - Line Interrupt Position Configuration Register - 0x40 - 0x20 - read-write - 0x00000000 - - - LIPOS - Line Interrupt Position - 0 - 11 - - - 0 - 2047 - - - - - - - CPSR - CPSR - Current Position Status Register - 0x44 - 0x20 - read-only - 0x00000000 - - - CXPOS - Current X Position - 16 - 16 - - - CYPOS - Current Y Position - 0 - 16 - - - - - CDSR - CDSR - Current Display Status Register - 0x48 - 0x20 - read-only - 0x0000000F - - - HSYNCS - Horizontal Synchronization display Status - 3 - 1 - - HSYNCS - read - - NotActive - Currently not in HSYNC phase - 0 - - - Active - Currently in HSYNC phase - 1 - - - - - VSYNCS - Vertical Synchronization display Status - 2 - 1 - - VSYNCS - read - - NotActive - Currently not in VSYNC phase - 0 - - - Active - Currently in VSYNC phase - 1 - - - - - HDES - Horizontal Data Enable display Status - 1 - 1 - - HDES - read - - NotActive - Currently not in horizontal Data Enable phase - 0 - - - Active - Currently in horizontal Data Enable phase - 1 - - - - - VDES - Vertical Data Enable display Status - 0 - 1 - - VDES - read - - NotActive - Currently not in vertical Data Enable phase - 0 - - - Active - Currently in vertical Data Enable phase - 1 - - - - - - - 2 - 0x80 - 1-2 - LAYER%s - Cluster LAYER%s, containing L?CR, L?WHPCR, L?WVPCR, L?CKCR, L?PFCR, L?CACR, L?DCCR, L?BFCR, L?CFBAR, L?CFBLR, L?CFBLNR, L?CLUTWR - 0x84 - - CR - L1CR - Layerx Control Register - 0x0 - 0x20 - read-write - 0x00000000 - - - CLUTEN - Color Look-Up Table Enable - 4 - 1 - - CLUTEN - read-write - - Disabled - Color look-up table disabled - 0 - - - Enabled - Color look-up table enabled - 1 - - - - - COLKEN - Color Keying Enable - 1 - 1 - - COLKEN - read-write - - Disabled - Color keying disabled - 0 - - - Enabled - Color keying enabled - 1 - - - - - LEN - Layer Enable - 0 - 1 - - LEN - read-write - - Disabled - Layer disabled - 0 - - - Enabled - Layer enabled - 1 - - - - - - - WHPCR - L1WHPCR - Layerx Window Horizontal Position Configuration Register - 0x4 - 0x20 - read-write - 0x00000000 - - - WHSPPOS - Window Horizontal Stop Position - 16 - 12 - - - 0 - 4095 - - - - - WHSTPOS - Window Horizontal Start Position - 0 - 12 - - - 0 - 4095 - - - - - - - WVPCR - L1WVPCR - Layerx Window Vertical Position Configuration Register - 0x8 - 0x20 - read-write - 0x00000000 - - - WVSPPOS - Window Vertical Stop Position - 16 - 11 - - - 0 - 2047 - - - - - WVSTPOS - Window Vertical Start Position - 0 - 11 - - - 0 - 2047 - - - - - - - CKCR - L1CKCR - Layerx Color Keying Configuration Register - 0xC - 0x20 - read-write - 0x00000000 - - - CKRED - Color Key Red value - 16 - 8 - - - 0 - 255 - - - - - CKGREEN - Color Key Green value - 8 - 8 - - - 0 - 255 - - - - - CKBLUE - Color Key Blue value - 0 - 8 - - - 0 - 255 - - - - - - - PFCR - L1PFCR - Layerx Pixel Format Configuration Register - 0x10 - 0x20 - read-write - 0x00000000 - - - PF - Pixel Format - 0 - 3 - - PF - read-write - - ARGB8888 - ARGB8888 - 0 - - - RGB888 - RGB888 - 1 - - - RGB565 - RGB565 - 2 - - - ARGB1555 - ARGB1555 - 3 - - - ARGB4444 - ARGB4444 - 4 - - - L8 - L8 (8-bit luminance) - 5 - - - AL44 - AL44 (4-bit alpha, 4-bit luminance) - 6 - - - AL88 - AL88 (8-bit alpha, 8-bit luminance) - 7 - - - - - - - CACR - L1CACR - Layerx Constant Alpha Configuration Register - 0x14 - 0x20 - read-write - 0x00000000 - - - CONSTA - Constant Alpha - 0 - 8 - - - 0 - 255 - - - - - - - DCCR - L1DCCR - Layerx Default Color Configuration Register - 0x18 - 0x20 - read-write - 0x00000000 - - - DCALPHA - Default Color Alpha - 24 - 8 - - - 0 - 255 - - - - - DCRED - Default Color Red - 16 - 8 - - - 0 - 255 - - - - - DCGREEN - Default Color Green - 8 - 8 - - - 0 - 255 - - - - - DCBLUE - Default Color Blue - 0 - 8 - - - 0 - 255 - - - - - - - BFCR - L1BFCR - Layerx Blending Factors Configuration Register - 0x1C - 0x20 - read-write - 0x00000607 - - - BF1 - Blending Factor 1 - 8 - 3 - - BF1 - read-write - - Constant - BF1 = constant alpha - 4 - - - Pixel - BF1 = pixel alpha * constant alpha - 6 - - - - - BF2 - Blending Factor 2 - 0 - 3 - - BF2 - read-write - - Constant - BF2 = 1 - constant alpha - 5 - - - Pixel - BF2 = 1 - pixel alpha * constant alpha - 7 - - - - - - - CFBAR - L1CFBAR - Layerx Color Frame Buffer Address Register - 0x28 - 0x20 - read-write - 0x00000000 - - - CFBADD - Color Frame Buffer Start Address - 0 - 32 - - - 0 - 4294967295 - - - - - - - CFBLR - L1CFBLR - Layerx Color Frame Buffer Length Register - 0x2C - 0x20 - read-write - 0x00000000 - - - CFBP - Color Frame Buffer Pitch in bytes - 16 - 13 - - - 0 - 8191 - - - - - CFBLL - Color Frame Buffer Line Length - 0 - 13 - - - 0 - 8191 - - - - - - - CFBLNR - L1CFBLNR - Layerx ColorFrame Buffer Line Number Register - 0x30 - 0x20 - read-write - 0x00000000 - - - CFBLNBR - Frame Buffer Line Number - 0 - 11 - - - 0 - 2047 - - - - - - - CLUTWR - L1CLUTWR - Layerx CLUT Write Register - 0x40 - 0x20 - write-only - 0x00000000 - - - CLUTADD - CLUT Address - 24 - 8 - - - 0 - 255 - - - - - RED - Red value - 16 - 8 - - - 0 - 255 - - - - - GREEN - Green value - 8 - 8 - - - 0 - 255 - - - - - BLUE - Blue value - 0 - 8 - - - 0 - 255 - - - - - - - - - - SAI1 - Serial audio interface - SAI - 0x40015800 - - 0x0 - 0x400 - registers - - - SAI1 - SAI1 global interrupt - 87 - - - SAI2 - SAI2 global interrupt - 91 - - - - 2 - 0x20 - A,B - CH%s - Cluster CH%s, containing ?CR1, ?CR2, ?FRCR, ?SLOTR, ?IM, ?SR, ?CLRFR, ?DR - 0x4 - - CR1 - ACR1 - AConfiguration register 1 - 0x0 - 0x20 - read-write - 0x00000040 - - - MCKDIV - Master clock divider - 20 - 4 - - - NODIV - No divider - 19 - 1 - - NODIV - read-write - - MasterClock - MCLK output is enabled. Forces the ratio between FS and MCLK to 256 or 512 according to the OSR value - 0 - - - NoDiv - MCLK output enable set by the MCKEN bit (where present, else 0). Ratio between FS and MCLK depends on FRL. - 1 - - - - - DMAEN - DMA enable - 17 - 1 - - DMAEN - read-write - - Disabled - DMA disabled - 0 - - - Enabled - DMA enabled - 1 - - - - - SAIEN - Audio block A enable - 16 - 1 - - SAIEN - read-write - - Disabled - SAI audio block disabled - 0 - - - Enabled - SAI audio block enabled - 1 - - - - - OUTDRIV - Output drive - 13 - 1 - - OUTDRIV - read-write - - OnStart - Audio block output driven when SAIEN is set - 0 - - - Immediately - Audio block output driven immediately after the setting of this bit - 1 - - - - - MONO - Mono mode - 12 - 1 - - MONO - read-write - - Stereo - Stereo mode - 0 - - - Mono - Mono mode - 1 - - - - - SYNCEN - Synchronization enable - 10 - 2 - - SYNCEN - read-write - - Asynchronous - audio sub-block in asynchronous mode - 0 - - - Internal - audio sub-block is synchronous with the other internal audio sub-block. In this case, the audio sub-block must be configured in slave mode - 1 - - - External - audio sub-block is synchronous with an external SAI embedded peripheral. In this case the audio sub-block should be configured in Slave mode - 2 - - - - - CKSTR - Clock strobing edge - 9 - 1 - - CKSTR - read-write - - FallingEdge - Data strobing edge is falling edge of SCK - 0 - - - RisingEdge - Data strobing edge is rising edge of SCK - 1 - - - - - LSBFIRST - Least significant bit first - 8 - 1 - - LSBFIRST - read-write - - MsbFirst - Data are transferred with MSB first - 0 - - - LsbFirst - Data are transferred with LSB first - 1 - - - - - DS - Data size - 5 - 3 - - DS - read-write - - Bit8 - 8 bits - 2 - - - Bit10 - 10 bits - 3 - - - Bit16 - 16 bits - 4 - - - Bit20 - 20 bits - 5 - - - Bit24 - 24 bits - 6 - - - Bit32 - 32 bits - 7 - - - - - PRTCFG - Protocol configuration - 2 - 2 - - PRTCFG - read-write - - Free - Free protocol. Free protocol allows to use the powerful configuration of the audio block to address a specific audio protocol - 0 - - - Spdif - SPDIF protocol - 1 - - - Ac97 - AC’97 protocol - 2 - - - - - MODE - Audio block mode - 0 - 2 - - MODE - read-write - - MasterTx - Master transmitter - 0 - - - MasterRx - Master receiver - 1 - - - SlaveTx - Slave transmitter - 2 - - - SlaveRx - Slave receiver - 3 - - - - - - - CR2 - ACR2 - AConfiguration register 2 - 0x4 - 0x20 - read-write - 0x00000000 - - - COMP - Companding mode - 14 - 2 - read-write - - COMP - read-write - - NoCompanding - No companding algorithm - 0 - - - MuLaw - μ-Law algorithm - 2 - - - ALaw - A-Law algorithm - 3 - - - - - CPL - Complement bit - 13 - 1 - read-write - - CPL - read-write - - OnesComplement - 1’s complement representation - 0 - - - TwosComplement - 2’s complement representation - 1 - - - - - MUTECNT - Mute counter - 7 - 6 - read-write - - - MUTEVAL - Mute value - 6 - 1 - read-write - - MUTEVAL - read-write - - SendZero - Bit value 0 is sent during the mute mode - 0 - - - SendLast - Last values are sent during the mute mode - 1 - - - - - MUTE - Mute - 5 - 1 - read-write - - MUTE - read-write - - Disabled - No mute mode - 0 - - - Enabled - Mute mode enabled - 1 - - - - - TRIS - Tristate management on data line - 4 - 1 - read-write - - - FFLUSH - FIFO flush - 3 - 1 - - FFLUSH - read-write - - NoFlush - No FIFO flush - 0 - - - Flush - FIFO flush. Programming this bit to 1 triggers the FIFO Flush. All the internal FIFO pointers (read and write) are cleared - 1 - - - - - FTH - FIFO threshold - 0 - 3 - read-write - - FTH - read-write - - Empty - FIFO empty - 0 - - - Quarter1 - 1⁄4 FIFO - 1 - - - Quarter2 - 1⁄2 FIFO - 2 - - - Quarter3 - 3⁄4 FIFO - 3 - - - Full - FIFO full - 4 - - - - - - - FRCR - AFRCR - AFRCR - 0x8 - 0x20 - read-write - 0x00000007 - - - FSOFF - Frame synchronization offset - 18 - 1 - read-write - - FSOFF - read-write - - OnFirst - FS is asserted on the first bit of the slot 0 - 0 - - - BeforeFirst - FS is asserted one bit before the first bit of the slot 0 - 1 - - - - - FSPOL - Frame synchronization polarity - 17 - 1 - read-write - - FSPOL - read-write - - FallingEdge - FS is active low (falling edge) - 0 - - - RisingEdge - FS is active high (rising edge) - 1 - - - - - FSDEF - Frame synchronization definition - 16 - 1 - read-write - - - FSALL - Frame synchronization active level length - 8 - 7 - read-write - - - FRL - Frame length - 0 - 8 - read-write - - - - - SLOTR - ASLOTR - ASlot register - 0xC - 0x20 - read-write - 0x00000000 - - - SLOTEN - Slot enable - 16 - 16 - - SLOTEN - read-write - - Inactive - Inactive slot - 0 - - - Active - Active slot - 1 - - - - - NBSLOT - Number of slots in an audio frame - 8 - 4 - - - SLOTSZ - Slot size - 6 - 2 - - SLOTSZ - read-write - - DataSize - The slot size is equivalent to the data size (specified in DS[3:0] in the SAI_xCR1 register) - 0 - - - Bit16 - 16-bit - 1 - - - Bit32 - 32-bit - 2 - - - - - FBOFF - First bit offset - 0 - 5 - - - - - IM - AIM - AInterrupt mask register2 - 0x10 - 0x20 - read-write - 0x00000000 - - - LFSDETIE - Late frame synchronization detection interrupt enable - 6 - 1 - - LFSDETIE - read-write - - Disabled - Interrupt is disabled - 0 - - - Enabled - Interrupt is enabled - 1 - - - - - AFSDETIE - Anticipated frame synchronization detection interrupt enable - 5 - 1 - - AFSDETIE - read-write - - Disabled - Interrupt is disabled - 0 - - - Enabled - Interrupt is enabled - 1 - - - - - CNRDYIE - Codec not ready interrupt enable - 4 - 1 - - CNRDYIE - read-write - - Disabled - Interrupt is disabled - 0 - - - Enabled - Interrupt is enabled - 1 - - - - - FREQIE - FIFO request interrupt enable - 3 - 1 - - FREQIE - read-write - - Disabled - Interrupt is disabled - 0 - - - Enabled - Interrupt is enabled - 1 - - - - - WCKCFGIE - Wrong clock configuration interrupt enable - 2 - 1 - - WCKCFGIE - read-write - - Disabled - Interrupt is disabled - 0 - - - Enabled - Interrupt is enabled - 1 - - - - - MUTEDETIE - Mute detection interrupt enable - 1 - 1 - - MUTEDETIE - read-write - - Disabled - Interrupt is disabled - 0 - - - Enabled - Interrupt is enabled - 1 - - - - - OVRUDRIE - Overrun/underrun interrupt enable - 0 - 1 - - OVRUDRIE - read-write - - Disabled - Interrupt is disabled - 0 - - - Enabled - Interrupt is enabled - 1 - - - - - - - SR - ASR - AStatus register - 0x14 - 0x20 - read-only - 0x00000008 - - - FLVL - FIFO level threshold - 16 - 3 - - FLVLR - read - - Empty - FIFO empty - 0 - - - Quarter1 - FIFO <= 1⁄4 but not empty - 1 - - - Quarter2 - 1⁄4 < FIFO <= 1⁄2 - 2 - - - Quarter3 - 1⁄2 < FIFO <= 3⁄4 - 3 - - - Quarter4 - 3⁄4 < FIFO but not full - 4 - - - Full - FIFO full - 5 - - - - - LFSDET - Late frame synchronization detection - 6 - 1 - - LFSDETR - read - - NoError - No error - 0 - - - NoSync - Frame synchronization signal is not present at the right time - 1 - - - - - AFSDET - Anticipated frame synchronization detection - 5 - 1 - - AFSDETR - read - - NoError - No error - 0 - - - EarlySync - Frame synchronization signal is detected earlier than expected - 1 - - - - - CNRDY - Codec not ready - 4 - 1 - - CNRDYR - read - - Ready - External AC’97 Codec is ready - 0 - - - NotReady - External AC’97 Codec is not ready - 1 - - - - - FREQ - FIFO request - 3 - 1 - - FREQR - read - - NoRequest - No FIFO request - 0 - - - Request - FIFO request to read or to write the SAI_xDR - 1 - - - - - WCKCFG - Wrong clock configuration flag. This bit is read only. - 2 - 1 - - WCKCFGR - read - - Correct - Clock configuration is correct - 0 - - - Wrong - Clock configuration does not respect the rule concerning the frame length specification - 1 - - - - - MUTEDET - Mute detection - 1 - 1 - - MUTEDETR - read - - NoMute - No MUTE detection on the SD input line - 0 - - - Mute - MUTE value detected on the SD input line (0 value) for a specified number of consecutive audio frame - 1 - - - - - OVRUDR - Overrun / underrun - 0 - 1 - - OVRUDRR - read - - NoError - No overrun/underrun error - 0 - - - Overrun - Overrun/underrun error detection - 1 - - - - - - - CLRFR - ACLRFR - AClear flag register - 0x18 - 0x20 - write-only - 0x00000000 - - - CLFSDET - Clear late frame synchronization detection flag - 6 - 1 - - CLFSDETW - write - - Clear - Clears the LFSDET flag - 1 - - - - - CAFSDET - Clear anticipated frame synchronization detection flag. - 5 - 1 - - CAFSDETW - write - - Clear - Clears the AFSDET flag - 1 - - - - - CCNRDY - Clear codec not ready flag - 4 - 1 - - CCNRDYW - write - - Clear - Clears the CNRDY flag - 1 - - - - - CWCKCFG - Clear wrong clock configuration flag - 2 - 1 - - CWCKCFGW - write - - Clear - Clears the WCKCFG flag - 1 - - - - - CMUTEDET - Mute detection flag - 1 - 1 - - CMUTEDETW - write - - Clear - Clears the MUTEDET flag - 1 - - - - - COVRUDR - Clear overrun / underrun - 0 - 1 - - COVRUDRW - write - - Clear - Clears the OVRUDR flag - 1 - - - - - - - DR - ADR - AData register - 0x1C - 0x20 - read-write - 0x00000000 - - - DATA - Data - 0 - 32 - - - - - - GCR - GCR - Global configuration register - 0x0 - 0x20 - read-write - 0x00000000 - - - SYNCIN - Synchronization inputs - 0 - 2 - - - SYNCOUT - Synchronization outputs - 4 - 2 - - - - - - - SAI2 - 0x40015C00 - - SAI2 - SAI2 global interrupt - 91 - - - - DMA2D - DMA2D controller - DMA2D - 0x4002B000 - - 0x0 - 0xC00 - registers - - - DMA2D - DMA2D global interrupt - 90 - - - - CR - CR - control register - 0x0 - 0x20 - read-write - 0x00000000 - - - MODE - DMA2D mode - 16 - 2 - - MODE - read-write - - MemoryToMemory - Memory-to-memory (FG fetch only) - 0 - - - MemoryToMemoryPFC - Memory-to-memory with PFC (FG fetch only with FG PFC active) - 1 - - - MemoryToMemoryPFCBlending - Memory-to-memory with blending (FG and BG fetch with PFC and blending) - 2 - - - RegisterToMemory - Register-to-memory - 3 - - - - - CEIE - Configuration Error Interrupt Enable - 13 - 1 - - CEIE - read-write - - Disabled - CE interrupt disabled - 0 - - - Enabled - CE interrupt enabled - 1 - - - - - CTCIE - CLUT transfer complete interrupt enable - 12 - 1 - - CTCIE - read-write - - Disabled - CTC interrupt disabled - 0 - - - Enabled - CTC interrupt enabled - 1 - - - - - CAEIE - CLUT access error interrupt enable - 11 - 1 - - CAEIE - read-write - - Disabled - CAE interrupt disabled - 0 - - - Enabled - CAE interrupt enabled - 1 - - - - - TWIE - Transfer watermark interrupt enable - 10 - 1 - - TWIE - read-write - - Disabled - TW interrupt disabled - 0 - - - Enabled - TW interrupt enabled - 1 - - - - - TCIE - Transfer complete interrupt enable - 9 - 1 - - TCIE - read-write - - Disabled - TC interrupt disabled - 0 - - - Enabled - TC interrupt enabled - 1 - - - - - TEIE - Transfer error interrupt enable - 8 - 1 - - TEIE - read-write - - Disabled - TE interrupt disabled - 0 - - - Enabled - TE interrupt enabled - 1 - - - - - ABORT - Abort - 2 - 1 - - ABORT - read-write - - AbortRequest - Transfer abort requested - 1 - - - - - SUSP - Suspend - 1 - 1 - - SUSP - read-write - - NotSuspended - Transfer not suspended - 0 - - - Suspended - Transfer suspended - 1 - - - - - START - Start - 0 - 1 - - START - read-write - - Start - Launch the DMA2D - 1 - - - - - - - ISR - ISR - Interrupt Status Register - 0x4 - 0x20 - read-only - 0x00000000 - - - CEIF - Configuration error interrupt flag - 5 - 1 - - - CTCIF - CLUT transfer complete interrupt flag - 4 - 1 - - - CAEIF - CLUT access error interrupt flag - 3 - 1 - - - TWIF - Transfer watermark interrupt flag - 2 - 1 - - - TCIF - Transfer complete interrupt flag - 1 - 1 - - - TEIF - Transfer error interrupt flag - 0 - 1 - - - - - IFCR - IFCR - interrupt flag clear register - 0x8 - 0x20 - read-write - 0x00000000 - - - CCEIF - Clear configuration error interrupt flag - 5 - 1 - - CCEIF - read-write - - Clear - Clear the CEIF flag in the ISR register - 1 - - - - - CCTCIF - Clear CLUT transfer complete interrupt flag - 4 - 1 - - CCTCIF - read-write - - Clear - Clear the CTCIF flag in the ISR register - 1 - - - - - CAECIF - Clear CLUT access error interrupt flag - 3 - 1 - - CAECIF - read-write - - Clear - Clear the CAEIF flag in the ISR register - 1 - - - - - CTWIF - Clear transfer watermark interrupt flag - 2 - 1 - - CTWIF - read-write - - Clear - Clear the TWIF flag in the ISR register - 1 - - - - - CTCIF - Clear transfer complete interrupt flag - 1 - 1 - - CTCIF - read-write - - Clear - Clear the TCIF flag in the ISR register - 1 - - - - - CTEIF - Clear Transfer error interrupt flag - 0 - 1 - - CTEIF - read-write - - Clear - Clear the TEIF flag in the ISR register - 1 - - - - - - - FGMAR - FGMAR - foreground memory address register - 0xC - 0x20 - read-write - 0x00000000 - - - MA - Memory address - 0 - 32 - - - - - FGOR - FGOR - foreground offset register - 0x10 - 0x20 - read-write - 0x00000000 - - - LO - Line offset - 0 - 14 - - - 0 - 16383 - - - - - - - BGMAR - BGMAR - background memory address register - 0x14 - 0x20 - read-write - 0x00000000 - - - MA - Memory address - 0 - 32 - - - - - BGOR - BGOR - background offset register - 0x18 - 0x20 - read-write - 0x00000000 - - - LO - Line offset - 0 - 14 - - - 0 - 16383 - - - - - - - FGPFCCR - FGPFCCR - foreground PFC control register - 0x1C - 0x20 - read-write - 0x00000000 - - - ALPHA - Alpha value - 24 - 8 - - - 0 - 255 - - - - - AM - Alpha mode - 16 - 2 - - AM - read-write - - NoModify - No modification of alpha channel - 0 - - - Replace - Replace with value in ALPHA[7:0] - 1 - - - Multiply - Multiply with value in ALPHA[7:0] - 2 - - - - - CS - CLUT size - 8 - 8 - - - 0 - 255 - - - - - START - Start - 5 - 1 - - START - read-write - - Start - Start the automatic loading of the CLUT - 1 - - - - - CCM - CLUT color mode - 4 - 1 - - CCM - read-write - - ARGB8888 - CLUT color format ARGB8888 - 0 - - - RGB888 - CLUT color format RGB888 - 1 - - - - - CM - Color mode - 0 - 4 - - CM - read-write - - ARGB8888 - Color mode ARGB8888 - 0 - - - RGB888 - Color mode RGB888 - 1 - - - RGB565 - Color mode RGB565 - 2 - - - ARGB1555 - Color mode ARGB1555 - 3 - - - ARGB4444 - Color mode ARGB4444 - 4 - - - L8 - Color mode L8 - 5 - - - AL44 - Color mode AL44 - 6 - - - AL88 - Color mode AL88 - 7 - - - L4 - Color mode L4 - 8 - - - A8 - Color mode A8 - 9 - - - A4 - Color mode A4 - 10 - - - - - - - FGCOLR - FGCOLR - foreground color register - 0x20 - 0x20 - read-write - 0x00000000 - - - RED - Red Value - 16 - 8 - - - 0 - 255 - - - - - GREEN - Green Value - 8 - 8 - - - 0 - 255 - - - - - BLUE - Blue Value - 0 - 8 - - - 0 - 255 - - - - - - - BGPFCCR - BGPFCCR - background PFC control register - 0x24 - 0x20 - read-write - 0x00000000 - - - ALPHA - Alpha value - 24 - 8 - - - 0 - 255 - - - - - AM - Alpha mode - 16 - 2 - - AM - read-write - - NoModify - No modification of alpha channel - 0 - - - Replace - Replace with value in ALPHA[7:0] - 1 - - - Multiply - Multiply with value in ALPHA[7:0] - 2 - - - - - CS - CLUT size - 8 - 8 - - - 0 - 255 - - - - - START - Start - 5 - 1 - - START - read-write - - Start - Start the automatic loading of the CLUT - 1 - - - - - CCM - CLUT Color mode - 4 - 1 - - CCM - read-write - - ARGB8888 - CLUT color format ARGB8888 - 0 - - - RGB888 - CLUT color format RGB888 - 1 - - - - - CM - Color mode - 0 - 4 - - CM - read-write - - ARGB8888 - Color mode ARGB8888 - 0 - - - RGB888 - Color mode RGB888 - 1 - - - RGB565 - Color mode RGB565 - 2 - - - ARGB1555 - Color mode ARGB1555 - 3 - - - ARGB4444 - Color mode ARGB4444 - 4 - - - L8 - Color mode L8 - 5 - - - AL44 - Color mode AL44 - 6 - - - AL88 - Color mode AL88 - 7 - - - L4 - Color mode L4 - 8 - - - A8 - Color mode A8 - 9 - - - A4 - Color mode A4 - 10 - - - - - - - BGCOLR - BGCOLR - background color register - 0x28 - 0x20 - read-write - 0x00000000 - - - RED - Red Value - 16 - 8 - - - 0 - 255 - - - - - GREEN - Green Value - 8 - 8 - - - 0 - 255 - - - - - BLUE - Blue Value - 0 - 8 - - - 0 - 255 - - - - - - - FGCMAR - FGCMAR - foreground CLUT memory address register - 0x2C - 0x20 - read-write - 0x00000000 - - - MA - Memory Address - 0 - 32 - - - - - BGCMAR - BGCMAR - background CLUT memory address register - 0x30 - 0x20 - read-write - 0x00000000 - - - MA - Memory address - 0 - 32 - - - - - OPFCCR - OPFCCR - output PFC control register - 0x34 - 0x20 - read-write - 0x00000000 - - - CM - Color mode - 0 - 3 - - CM - read-write - - ARGB8888 - ARGB8888 - 0 - - - RGB888 - RGB888 - 1 - - - RGB565 - RGB565 - 2 - - - ARGB1555 - ARGB1555 - 3 - - - ARGB4444 - ARGB4444 - 4 - - - - - - - OCOLR - OCOLR - output color register - 0x38 - 0x20 - read-write - 0x00000000 - - - APLHA - Alpha Channel Value - 24 - 8 - - - RED - Red Value - 16 - 8 - - - GREEN - Green Value - 8 - 8 - - - BLUE - Blue Value - 0 - 8 - - - - - OMAR - OMAR - output memory address register - 0x3C - 0x20 - read-write - 0x00000000 - - - MA - Memory Address - 0 - 32 - - - - - OOR - OOR - output offset register - 0x40 - 0x20 - read-write - 0x00000000 - - - LO - Line Offset - 0 - 14 - - - 0 - 16383 - - - - - - - NLR - NLR - number of line register - 0x44 - 0x20 - read-write - 0x00000000 - - - PL - Pixel per lines - 16 - 14 - - - 0 - 16383 - - - - - NL - Number of lines - 0 - 16 - - - 0 - 65535 - - - - - - - LWR - LWR - line watermark register - 0x48 - 0x20 - read-write - 0x00000000 - - - LW - Line watermark - 0 - 16 - - - - - AMTCR - AMTCR - AHB master timer configuration register - 0x4C - 0x20 - read-write - 0x00000000 - - - DT - Dead Time - 8 - 8 - - - 0 - 255 - - - - - EN - Enable - 0 - 1 - - EN - read-write - - Disabled - Disabled AHB/AXI dead-time functionality - 0 - - - Enabled - Enabled AHB/AXI dead-time functionality - 1 - - - - - - - FGCLUT - FGCLUT - FGCLUT - 0x400 - 0x20 - read-write - 0x00000000 - - - APLHA - APLHA - 24 - 8 - - - RED - RED - 16 - 8 - - - GREEN - GREEN - 8 - 8 - - - BLUE - BLUE - 0 - 8 - - - - - BGCLUT - BGCLUT - BGCLUT - 0x800 - 0x20 - read-write - 0x00000000 - - - APLHA - APLHA - 24 - 8 - - - RED - RED - 16 - 8 - - - GREEN - GREEN - 8 - 8 - - - BLUE - BLUE - 0 - 8 - - - - - - - QUADSPI - QuadSPI interface - QUADSPI - 0xA0001000 - - 0x0 - 0x1000 - registers - - - QuadSPI - QuadSPI global interrupt - 92 - - - - CR - CR - control register - 0x0 - 0x20 - read-write - 0x00000000 - - - PRESCALER - Clock prescaler - 24 - 8 - - - PMM - Polling match mode - 23 - 1 - - - APMS - Automatic poll mode stop - 22 - 1 - - - TOIE - TimeOut interrupt enable - 20 - 1 - - - SMIE - Status match interrupt enable - 19 - 1 - - - FTIE - FIFO threshold interrupt enable - 18 - 1 - - - TCIE - Transfer complete interrupt enable - 17 - 1 - - - TEIE - Transfer error interrupt enable - 16 - 1 - - - FTHRES - IFO threshold level - 8 - 5 - - - FSEL - FLASH memory selection - 7 - 1 - - - DFM - Dual-flash mode - 6 - 1 - - - SSHIFT - Sample shift - 4 - 1 - - - TCEN - Timeout counter enable - 3 - 1 - - - DMAEN - DMA enable - 2 - 1 - - - ABORT - Abort request - 1 - 1 - - - EN - Enable - 0 - 1 - - - - - DCR - DCR - device configuration register - 0x4 - 0x20 - read-write - 0x00000000 - - - FSIZE - FLASH memory size - 16 - 5 - - - CSHT - Chip select high time - 8 - 3 - - - CKMODE - Mode 0 / mode 3 - 0 - 1 - - - - - SR - SR - status register - 0x8 - 0x20 - read-only - 0x00000000 - - - FLEVEL - FIFO level - 8 - 7 - - - BUSY - Busy - 5 - 1 - - - TOF - Timeout flag - 4 - 1 - - - SMF - Status match flag - 3 - 1 - - - FTF - FIFO threshold flag - 2 - 1 - - - TCF - Transfer complete flag - 1 - 1 - - - TEF - Transfer error flag - 0 - 1 - - - - - FCR - FCR - flag clear register - 0xC - 0x20 - read-write - 0x00000000 - - - CTOF - Clear timeout flag - 4 - 1 - - - CSMF - Clear status match flag - 3 - 1 - - - CTCF - Clear transfer complete flag - 1 - 1 - - - CTEF - Clear transfer error flag - 0 - 1 - - - - - DLR - DLR - data length register - 0x10 - 0x20 - read-write - 0x00000000 - - - DL - Data length - 0 - 32 - - - - - CCR - CCR - communication configuration register - 0x14 - 0x20 - read-write - 0x00000000 - - - DDRM - Double data rate mode - 31 - 1 - - - DHHC - DDR hold half cycle - 30 - 1 - - - SIOO - Send instruction only once mode - 28 - 1 - - - FMODE - Functional mode - 26 - 2 - - - DMODE - Data mode - 24 - 2 - - - DCYC - Number of dummy cycles - 18 - 5 - - - ABSIZE - Alternate bytes size - 16 - 2 - - - ABMODE - Alternate bytes mode - 14 - 2 - - - ADSIZE - Address size - 12 - 2 - - - ADMODE - Address mode - 10 - 2 - - - IMODE - Instruction mode - 8 - 2 - - - INSTRUCTION - Instruction - 0 - 8 - - - - - AR - AR - address register - 0x18 - 0x20 - read-write - 0x00000000 - - - ADDRESS - Address - 0 - 32 - - - - - ABR - ABR - ABR - 0x1C - 0x20 - read-write - 0x00000000 - - - ALTERNATE - ALTERNATE - 0 - 32 - - - - - DR - DR - data register - 0x20 - 0x20 - read-write - 0x00000000 - - - DATA - Data - 0 - 32 - - - - - PSMKR - PSMKR - polling status mask register - 0x24 - 0x20 - read-write - 0x00000000 - - - MASK - Status mask - 0 - 32 - - - - - PSMAR - PSMAR - polling status match register - 0x28 - 0x20 - read-write - 0x00000000 - - - MATCH - Status match - 0 - 32 - - - - - PIR - PIR - polling interval register - 0x2C - 0x20 - read-write - 0x00000000 - - - INTERVAL - Polling interval - 0 - 16 - - - - - LPTR - LPTR - low-power timeout register - 0x30 - 0x20 - read-write - 0x00000000 - - - TIMEOUT - Timeout period - 0 - 16 - - - - - - - CEC - HDMI-CEC controller - CEC - 0x40006C00 - - 0x0 - 0x400 - registers - - - HDMI_CEC - HDMI-CEC global interrupt - 94 - - - - CR - CR - control register - 0x0 - 0x20 - read-write - 0x00000000 - - - TXEOM - Tx End Of Message - 2 - 1 - - - TXSOM - Tx start of message - 1 - 1 - - - CECEN - CEC Enable - 0 - 1 - - - - - CFGR - CFGR - configuration register - 0x4 - 0x20 - read-write - 0x00000000 - - - SFT - Signal Free Time - 0 - 3 - - - RXTOL - Rx-Tolerance - 3 - 1 - - - BRESTP - Rx-stop on bit rising error - 4 - 1 - - - BREGEN - Generate error-bit on bit rising error - 5 - 1 - - - LBPEGEN - Generate Error-Bit on Long Bit Period Error - 6 - 1 - - - BRDNOGEN - Avoid Error-Bit Generation in Broadcast - 7 - 1 - - - SFTOP - SFT Option Bit - 8 - 1 - - - OAR - Own addresses configuration - 16 - 15 - - - LSTN - Listen mode - 31 - 1 - - - - - TXDR - TXDR - Tx data register - 0x8 - 0x20 - write-only - 0x00000000 - - - TXD - Tx Data register - 0 - 8 - - - - - RXDR - RXDR - Rx Data Register - 0xC - 0x20 - read-only - 0x00000000 - - - RXDR - CEC Rx Data Register - 0 - 8 - - - - - ISR - ISR - Interrupt and Status Register - 0x10 - 0x20 - read-write - 0x00000000 - - - TXACKE - Tx-Missing acknowledge error - 12 - 1 - - - TXERR - Tx-Error - 11 - 1 - - - TXUDR - Tx-Buffer Underrun - 10 - 1 - - - TXEND - End of Transmission - 9 - 1 - - - TXBR - Tx-Byte Request - 8 - 1 - - - ARBLST - Arbitration Lost - 7 - 1 - - - RXACKE - Rx-Missing Acknowledge - 6 - 1 - - - LBPE - Rx-Long Bit Period Error - 5 - 1 - - - SBPE - Rx-Short Bit period error - 4 - 1 - - - BRE - Rx-Bit rising error - 3 - 1 - - - RXOVR - Rx-Overrun - 2 - 1 - - - RXEND - End Of Reception - 1 - 1 - - - RXBR - Rx-Byte Received - 0 - 1 - - - - - IER - IER - interrupt enable register - 0x14 - 0x20 - read-write - 0x00000000 - - - TXACKIE - Tx-Missing Acknowledge Error Interrupt Enable - 12 - 1 - - - TXERRIE - Tx-Error Interrupt Enable - 11 - 1 - - - TXUDRIE - Tx-Underrun interrupt enable - 10 - 1 - - - TXENDIE - Tx-End of message interrupt enable - 9 - 1 - - - TXBRIE - Tx-Byte Request Interrupt Enable - 8 - 1 - - - ARBLSTIE - Arbitration Lost Interrupt Enable - 7 - 1 - - - RXACKIE - Rx-Missing Acknowledge Error Interrupt Enable - 6 - 1 - - - LBPEIE - Long Bit Period Error Interrupt Enable - 5 - 1 - - - SBPEIE - Short Bit Period Error Interrupt Enable - 4 - 1 - - - BREIE - Bit Rising Error Interrupt Enable - 3 - 1 - - - RXOVRIE - Rx-Buffer Overrun Interrupt Enable - 2 - 1 - - - RXENDIE - End Of Reception Interrupt Enable - 1 - 1 - - - RXBRIE - Rx-Byte Received Interrupt Enable - 0 - 1 - - - - - - - SPDIFRX - Receiver Interface - SPDIF_RX - 0x40004000 - - 0x0 - 0x400 - registers - - - SPDIFRX - SPDIFRX global interrupt - 97 - - - - CR - CR - Control register - 0x0 - 0x20 - read-write - 0x00000000 - - - SPDIFEN - Peripheral Block Enable - 0 - 2 - - - RXDMAEN - Receiver DMA ENable for data flow - 2 - 1 - - - RXSTEO - STerEO Mode - 3 - 1 - - - DRFMT - RX Data format - 4 - 2 - - - PMSK - Mask Parity error bit - 6 - 1 - - - VMSK - Mask of Validity bit - 7 - 1 - - - CUMSK - Mask of channel status and user bits - 8 - 1 - - - PTMSK - Mask of Preamble Type bits - 9 - 1 - - - CBDMAEN - Control Buffer DMA ENable for control flow - 10 - 1 - - - CHSEL - Channel Selection - 11 - 1 - - - NBTR - Maximum allowed re-tries during synchronization phase - 12 - 2 - - - WFA - Wait For Activity - 14 - 1 - - - INSEL - input selection - 16 - 3 - - - - - IMR - IMR - Interrupt mask register - 0x4 - 0x20 - read-write - 0x00000000 - - - RXNEIE - RXNE interrupt enable - 0 - 1 - - - CSRNEIE - Control Buffer Ready Interrupt Enable - 1 - 1 - - - PERRIE - Parity error interrupt enable - 2 - 1 - - - OVRIE - Overrun error Interrupt Enable - 3 - 1 - - - SBLKIE - Synchronization Block Detected Interrupt Enable - 4 - 1 - - - SYNCDIE - Synchronization Done - 5 - 1 - - - IFEIE - Serial Interface Error Interrupt Enable - 6 - 1 - - - - - SR - SR - Status register - 0x8 - 0x20 - read-only - 0x00000000 - - - RXNE - Read data register not empty - 0 - 1 - - - CSRNE - Control Buffer register is not empty - 1 - 1 - - - PERR - Parity error - 2 - 1 - - - OVR - Overrun error - 3 - 1 - - - SBD - Synchronization Block Detected - 4 - 1 - - - SYNCD - Synchronization Done - 5 - 1 - - - FERR - Framing error - 6 - 1 - - - SERR - Synchronization error - 7 - 1 - - - TERR - Time-out error - 8 - 1 - - - WIDTH5 - Duration of 5 symbols counted with SPDIF_CLK - 16 - 15 - - - - - IFCR - IFCR - Interrupt Flag Clear register - 0xC - 0x20 - write-only - 0x00000000 - - - PERRCF - Clears the Parity error flag - 2 - 1 - - - OVRCF - Clears the Overrun error flag - 3 - 1 - - - SBDCF - Clears the Synchronization Block Detected flag - 4 - 1 - - - SYNCDCF - Clears the Synchronization Done flag - 5 - 1 - - - - - DR - DR - Data input register - 0x10 - 0x20 - read-only - 0x00000000 - - - DR - Parity Error bit - 0 - 24 - - - PE - Parity Error bit - 24 - 1 - - - V - Validity bit - 25 - 1 - - - U - User bit - 26 - 1 - - - C - Channel Status bit - 27 - 1 - - - PT - Preamble Type - 28 - 2 - - - - - CSR - CSR - Channel Status register - 0x14 - 0x20 - read-only - 0x00000000 - - - USR - User data information - 0 - 16 - - - CS - Channel A status information - 16 - 8 - - - SOB - Start Of Block - 24 - 1 - - - - - DIR - DIR - Debug Information register - 0x18 - 0x20 - read-only - 0x00000000 - - - THI - Threshold HIGH - 0 - 13 - - - TLO - Threshold LOW - 16 - 13 - - - - - - - SDMMC1 - Secure digital input/output interface - SDMMC - 0x40012C00 - - 0x0 - 0x400 - registers - - - SDMMC1 - SDMMC1 global interrupt - 49 - - - - POWER - POWER - power control register - 0x0 - 0x20 - read-write - 0x00000000 - - - PWRCTRL - PWRCTRL - 0 - 2 - - - - - CLKCR - CLKCR - SDI clock control register - 0x4 - 0x20 - read-write - 0x00000000 - - - HWFC_EN - HW Flow Control enable - 14 - 1 - - - NEGEDGE - SDIO_CK dephasing selection bit - 13 - 1 - - - WIDBUS - Wide bus mode enable bit - 11 - 2 - - - BYPASS - Clock divider bypass enable bit - 10 - 1 - - - PWRSAV - Power saving configuration bit - 9 - 1 - - - CLKEN - Clock enable bit - 8 - 1 - - - CLKDIV - Clock divide factor - 0 - 8 - - - - - ARG - ARG - argument register - 0x8 - 0x20 - read-write - 0x00000000 - - - CMDARG - Command argument - 0 - 32 - - - - - CMD - CMD - command register - 0xC - 0x20 - read-write - 0x00000000 - - - SDIOSuspend - SD I/O suspend command - 11 - 1 - - - CPSMEN - Command path state machine (CPSM) Enable bit - 10 - 1 - - - WAITPEND - CPSM Waits for ends of data transfer (CmdPend internal signal) - 9 - 1 - - - WAITINT - CPSM waits for interrupt request - 8 - 1 - - - WAITRESP - Wait for response bits - 6 - 2 - - - CMDINDEX - Command index - 0 - 6 - - - - - RESPCMD - RESPCMD - command response register - 0x10 - 0x20 - read-only - 0x00000000 - - - RESPCMD - Response command index - 0 - 6 - - - - - RESP1 - RESP1 - response 1..4 register - 0x14 - 0x20 - read-only - 0x00000000 - - - CARDSTATUS1 - see Table 132 - 0 - 32 - - - - - RESP2 - RESP2 - response 1..4 register - 0x18 - 0x20 - read-only - 0x00000000 - - - CARDSTATUS2 - see Table 132 - 0 - 32 - - - - - RESP3 - RESP3 - response 1..4 register - 0x1C - 0x20 - read-only - 0x00000000 - - - CARDSTATUS3 - see Table 132 - 0 - 32 - - - - - RESP4 - RESP4 - response 1..4 register - 0x20 - 0x20 - read-only - 0x00000000 - - - CARDSTATUS4 - see Table 132 - 0 - 32 - - - - - DTIMER - DTIMER - data timer register - 0x24 - 0x20 - read-write - 0x00000000 - - - DATATIME - Data timeout period - 0 - 32 - - - - - DLEN - DLEN - data length register - 0x28 - 0x20 - read-write - 0x00000000 - - - DATALENGTH - Data length value - 0 - 25 - - - - - DCTRL - DCTRL - data control register - 0x2C - 0x20 - read-write - 0x00000000 - - - SDIOEN - SD I/O enable functions - 11 - 1 - - - RWMOD - Read wait mode - 10 - 1 - - - RWSTOP - Read wait stop - 9 - 1 - - - RWSTART - Read wait start - 8 - 1 - - - DBLOCKSIZE - Data block size - 4 - 4 - - - DMAEN - DMA enable bit - 3 - 1 - - - DTMODE - Data transfer mode selection 1: Stream or SDIO multibyte data transfer - 2 - 1 - - - DTDIR - Data transfer direction selection - 1 - 1 - - - DTEN - DTEN - 0 - 1 - - - - - DCOUNT - DCOUNT - data counter register - 0x30 - 0x20 - read-only - 0x00000000 - - - DATACOUNT - Data count value - 0 - 25 - - - - - STA - STA - status register - 0x34 - 0x20 - read-only - 0x00000000 - - - SDIOIT - SDIO interrupt received - 22 - 1 - - - RXDAVL - Data available in receive FIFO - 21 - 1 - - - TXDAVL - Data available in transmit FIFO - 20 - 1 - - - RXFIFOE - Receive FIFO empty - 19 - 1 - - - TXFIFOE - Transmit FIFO empty - 18 - 1 - - - RXFIFOF - Receive FIFO full - 17 - 1 - - - TXFIFOF - Transmit FIFO full - 16 - 1 - - - RXFIFOHF - Receive FIFO half full: there are at least 8 words in the FIFO - 15 - 1 - - - TXFIFOHE - Transmit FIFO half empty: at least 8 words can be written into the FIFO - 14 - 1 - - - RXACT - Data receive in progress - 13 - 1 - - - TXACT - Data transmit in progress - 12 - 1 - - - CMDACT - Command transfer in progress - 11 - 1 - - - DBCKEND - Data block sent/received (CRC check passed) - 10 - 1 - - - DATAEND - Data end (data counter, SDIDCOUNT, is zero) - 8 - 1 - - - CMDSENT - Command sent (no response required) - 7 - 1 - - - CMDREND - Command response received (CRC check passed) - 6 - 1 - - - RXOVERR - Received FIFO overrun error - 5 - 1 - - - TXUNDERR - Transmit FIFO underrun error - 4 - 1 - - - DTIMEOUT - Data timeout - 3 - 1 - - - CTIMEOUT - Command response timeout - 2 - 1 - - - DCRCFAIL - Data block sent/received (CRC check failed) - 1 - 1 - - - CCRCFAIL - Command response received (CRC check failed) - 0 - 1 - - - - - ICR - ICR - interrupt clear register - 0x38 - 0x20 - read-write - 0x00000000 - - - SDIOITC - SDIOIT flag clear bit - 22 - 1 - - - DBCKENDC - DBCKEND flag clear bit - 10 - 1 - - - DATAENDC - DATAEND flag clear bit - 8 - 1 - - - CMDSENTC - CMDSENT flag clear bit - 7 - 1 - - - CMDRENDC - CMDREND flag clear bit - 6 - 1 - - - RXOVERRC - RXOVERR flag clear bit - 5 - 1 - - - TXUNDERRC - TXUNDERR flag clear bit - 4 - 1 - - - DTIMEOUTC - DTIMEOUT flag clear bit - 3 - 1 - - - CTIMEOUTC - CTIMEOUT flag clear bit - 2 - 1 - - - DCRCFAILC - DCRCFAIL flag clear bit - 1 - 1 - - - CCRCFAILC - CCRCFAIL flag clear bit - 0 - 1 - - - - - MASK - MASK - mask register - 0x3C - 0x20 - read-write - 0x00000000 - - - SDIOITIE - SDIO mode interrupt received interrupt enable - 22 - 1 - - - RXDAVLIE - Data available in Rx FIFO interrupt enable - 21 - 1 - - - TXDAVLIE - Data available in Tx FIFO interrupt enable - 20 - 1 - - - RXFIFOEIE - Rx FIFO empty interrupt enable - 19 - 1 - - - TXFIFOEIE - Tx FIFO empty interrupt enable - 18 - 1 - - - RXFIFOFIE - Rx FIFO full interrupt enable - 17 - 1 - - - TXFIFOFIE - Tx FIFO full interrupt enable - 16 - 1 - - - RXFIFOHFIE - Rx FIFO half full interrupt enable - 15 - 1 - - - TXFIFOHEIE - Tx FIFO half empty interrupt enable - 14 - 1 - - - RXACTIE - Data receive acting interrupt enable - 13 - 1 - - - TXACTIE - Data transmit acting interrupt enable - 12 - 1 - - - CMDACTIE - Command acting interrupt enable - 11 - 1 - - - DBCKENDIE - Data block end interrupt enable - 10 - 1 - - - DATAENDIE - Data end interrupt enable - 8 - 1 - - - CMDSENTIE - Command sent interrupt enable - 7 - 1 - - - CMDRENDIE - Command response received interrupt enable - 6 - 1 - - - RXOVERRIE - Rx FIFO overrun error interrupt enable - 5 - 1 - - - TXUNDERRIE - Tx FIFO underrun error interrupt enable - 4 - 1 - - - DTIMEOUTIE - Data timeout interrupt enable - 3 - 1 - - - CTIMEOUTIE - Command timeout interrupt enable - 2 - 1 - - - DCRCFAILIE - Data CRC fail interrupt enable - 1 - 1 - - - CCRCFAILIE - Command CRC fail interrupt enable - 0 - 1 - - - - - FIFOCNT - FIFOCNT - FIFO counter register - 0x48 - 0x20 - read-only - 0x00000000 - - - FIFOCOUNT - Remaining number of words to be written to or read from the FIFO - 0 - 24 - - - - - FIFO - FIFO - data FIFO register - 0x80 - 0x20 - read-write - 0x00000000 - - - FIFOData - Receive and transmit FIFO data - 0 - 32 - - - - - - - LPTIM1 - Low power timer - LPTIM - 0x40002400 - - 0x0 - 0x400 - registers - - - LPTimer1 - LP Timer1 global interrupt - 93 - - - LP_Timer1 - LP Timer1 global interrupt - 93 - - - - ISR - ISR - Interrupt and Status Register - 0x0 - 0x20 - read-only - 0x00000000 - - - DOWN - Counter direction change up to down - 6 - 1 - - - UP - Counter direction change down to up - 5 - 1 - - - ARROK - Autoreload register update OK - 4 - 1 - - - CMPOK - Compare register update OK - 3 - 1 - - - EXTTRIG - External trigger edge event - 2 - 1 - - - ARRM - Autoreload match - 1 - 1 - - - CMPM - Compare match - 0 - 1 - - - - - ICR - ICR - Interrupt Clear Register - 0x4 - 0x20 - write-only - 0x00000000 - - - DOWNCF - Direction change to down Clear Flag - 6 - 1 - - - UPCF - Direction change to UP Clear Flag - 5 - 1 - - - ARROKCF - Autoreload register update OK Clear Flag - 4 - 1 - - - CMPOKCF - Compare register update OK Clear Flag - 3 - 1 - - - EXTTRIGCF - External trigger valid edge Clear Flag - 2 - 1 - - - ARRMCF - Autoreload match Clear Flag - 1 - 1 - - - CMPMCF - compare match Clear Flag - 0 - 1 - - - - - IER - IER - Interrupt Enable Register - 0x8 - 0x20 - read-write - 0x00000000 - - - DOWNIE - Direction change to down Interrupt Enable - 6 - 1 - - - UPIE - Direction change to UP Interrupt Enable - 5 - 1 - - - ARROKIE - Autoreload register update OK Interrupt Enable - 4 - 1 - - - CMPOKIE - Compare register update OK Interrupt Enable - 3 - 1 - - - EXTTRIGIE - External trigger valid edge Interrupt Enable - 2 - 1 - - - ARRMIE - Autoreload match Interrupt Enable - 1 - 1 - - - CMPMIE - Compare match Interrupt Enable - 0 - 1 - - - - - CFGR - CFGR - Configuration Register - 0xC - 0x20 - read-write - 0x00000000 - - - ENC - Encoder mode enable - 24 - 1 - - - COUNTMODE - counter mode enabled - 23 - 1 - - - PRELOAD - Registers update mode - 22 - 1 - - - WAVPOL - Waveform shape polarity - 21 - 1 - - - WAVE - Waveform shape - 20 - 1 - - - TIMOUT - Timeout enable - 19 - 1 - - - TRIGEN - Trigger enable and polarity - 17 - 2 - - - TRIGSEL - Trigger selector - 13 - 3 - - - PRESC - Clock prescaler - 9 - 3 - - - TRGFLT - Configurable digital filter for trigger - 6 - 2 - - - CKFLT - Configurable digital filter for external clock - 3 - 2 - - - CKPOL - Clock Polarity - 1 - 2 - - - CKSEL - Clock selector - 0 - 1 - - - - - CR - CR - Control Register - 0x10 - 0x20 - read-write - 0x00000000 - - - CNTSTRT - Timer start in continuous mode - 2 - 1 - - - SNGSTRT - LPTIM start in single mode - 1 - 1 - - - ENABLE - LPTIM Enable - 0 - 1 - - - - - CMP - CMP - Compare Register - 0x14 - 0x20 - read-write - 0x00000000 - - - CMP - Compare value - 0 - 16 - - - - - ARR - ARR - Autoreload Register - 0x18 - 0x20 - read-write - 0x00000001 - - - ARR - Auto reload value - 0 - 16 - - - - - CNT - CNT - Counter Register - 0x1C - 0x20 - read-only - 0x00000000 - - - CNT - Counter value - 0 - 16 - - - - - - - I2C1 - Inter-integrated circuit - I2C - 0x40005400 - - 0x0 - 0x400 - registers - - - I2C1_EV - I2C1 event interrupt - 31 - - - I2C1_ER - I2C1 error interrupt - 32 - - - I2C2_EV - I2C2 event interrupt - 33 - - - I2C2_ER - I2C2 error interrupt - 34 - - - I2C3_EV - I2C3 event interrupt - 72 - - - I2C3_ER - I2C3 error interrupt - 73 - - - I2C4_EV - I2C4 event interrupt - 95 - - - I2C4_ER - I2C4 error interrupt - 96 - - - - CR1 - CR1 - Control register 1 - 0x0 - 0x20 - read-write - 0x00000000 - - - PE - Peripheral enable - 0 - 1 - - PE - read-write - - Disabled - Peripheral disabled - 0 - - - Enabled - Peripheral enabled - 1 - - - - - TXIE - TX Interrupt enable - 1 - 1 - - TXIE - read-write - - Disabled - Transmit (TXIS) interrupt disabled - 0 - - - Enabled - Transmit (TXIS) interrupt enabled - 1 - - - - - RXIE - RX Interrupt enable - 2 - 1 - - RXIE - read-write - - Disabled - Receive (RXNE) interrupt disabled - 0 - - - Enabled - Receive (RXNE) interrupt enabled - 1 - - - - - ADDRIE - Address match interrupt enable (slave only) - 3 - 1 - - ADDRIE - read-write - - Disabled - Address match (ADDR) interrupts disabled - 0 - - - Enabled - Address match (ADDR) interrupts enabled - 1 - - - - - NACKIE - Not acknowledge received interrupt enable - 4 - 1 - - NACKIE - read-write - - Disabled - Not acknowledge (NACKF) received interrupts disabled - 0 - - - Enabled - Not acknowledge (NACKF) received interrupts enabled - 1 - - - - - STOPIE - STOP detection Interrupt enable - 5 - 1 - - STOPIE - read-write - - Disabled - Stop detection (STOPF) interrupt disabled - 0 - - - Enabled - Stop detection (STOPF) interrupt enabled - 1 - - - - - TCIE - Transfer Complete interrupt enable - 6 - 1 - - TCIE - read-write - - Disabled - Transfer Complete interrupt disabled - 0 - - - Enabled - Transfer Complete interrupt enabled - 1 - - - - - ERRIE - Error interrupts enable - 7 - 1 - - ERRIE - read-write - - Disabled - Error detection interrupts disabled - 0 - - - Enabled - Error detection interrupts enabled - 1 - - - - - DNF - Digital noise filter - 8 - 4 - - DNF - read-write - - NoFilter - Digital filter disabled - 0 - - - Filter1 - Digital filter enabled and filtering capability up to 1 tI2CCLK - 1 - - - Filter2 - Digital filter enabled and filtering capability up to 2 tI2CCLK - 2 - - - Filter3 - Digital filter enabled and filtering capability up to 3 tI2CCLK - 3 - - - Filter4 - Digital filter enabled and filtering capability up to 4 tI2CCLK - 4 - - - Filter5 - Digital filter enabled and filtering capability up to 5 tI2CCLK - 5 - - - Filter6 - Digital filter enabled and filtering capability up to 6 tI2CCLK - 6 - - - Filter7 - Digital filter enabled and filtering capability up to 7 tI2CCLK - 7 - - - Filter8 - Digital filter enabled and filtering capability up to 8 tI2CCLK - 8 - - - Filter9 - Digital filter enabled and filtering capability up to 9 tI2CCLK - 9 - - - Filter10 - Digital filter enabled and filtering capability up to 10 tI2CCLK - 10 - - - Filter11 - Digital filter enabled and filtering capability up to 11 tI2CCLK - 11 - - - Filter12 - Digital filter enabled and filtering capability up to 12 tI2CCLK - 12 - - - Filter13 - Digital filter enabled and filtering capability up to 13 tI2CCLK - 13 - - - Filter14 - Digital filter enabled and filtering capability up to 14 tI2CCLK - 14 - - - Filter15 - Digital filter enabled and filtering capability up to 15 tI2CCLK - 15 - - - - - ANFOFF - Analog noise filter OFF - 12 - 1 - - ANFOFF - read-write - - Enabled - Analog noise filter enabled - 0 - - - Disabled - Analog noise filter disabled - 1 - - - - - TXDMAEN - DMA transmission requests enable - 14 - 1 - - TXDMAEN - read-write - - Disabled - DMA mode disabled for transmission - 0 - - - Enabled - DMA mode enabled for transmission - 1 - - - - - RXDMAEN - DMA reception requests enable - 15 - 1 - - RXDMAEN - read-write - - Disabled - DMA mode disabled for reception - 0 - - - Enabled - DMA mode enabled for reception - 1 - - - - - SBC - Slave byte control - 16 - 1 - - SBC - read-write - - Disabled - Slave byte control disabled - 0 - - - Enabled - Slave byte control enabled - 1 - - - - - NOSTRETCH - Clock stretching disable - 17 - 1 - - NOSTRETCH - read-write - - Enabled - Clock stretching enabled - 0 - - - Disabled - Clock stretching disabled - 1 - - - - - WUPEN - Wakeup from STOP enable - 18 - 1 - - WUPEN - read-write - - Disabled - Wakeup from Stop mode disabled - 0 - - - Enabled - Wakeup from Stop mode enabled - 1 - - - - - GCEN - General call enable - 19 - 1 - - GCEN - read-write - - Disabled - General call disabled. Address 0b00000000 is NACKed - 0 - - - Enabled - General call enabled. Address 0b00000000 is ACKed - 1 - - - - - SMBHEN - SMBus Host address enable - 20 - 1 - - SMBHEN - read-write - - Disabled - Host address disabled. Address 0b0001000x is NACKed - 0 - - - Enabled - Host address enabled. Address 0b0001000x is ACKed - 1 - - - - - SMBDEN - SMBus Device Default address enable - 21 - 1 - - SMBDEN - read-write - - Disabled - Device default address disabled. Address 0b1100001x is NACKed - 0 - - - Enabled - Device default address enabled. Address 0b1100001x is ACKed - 1 - - - - - ALERTEN - SMBUS alert enable - 22 - 1 - - ALERTEN - read-write - - Disabled - In device mode (SMBHEN=Disabled) Releases SMBA pin high and Alert Response Address Header disabled (0001100x) followed by NACK. In host mode (SMBHEN=Enabled) SMBus Alert pin (SMBA) not supported - 0 - - - Enabled - In device mode (SMBHEN=Disabled) Drives SMBA pin low and Alert Response Address Header enabled (0001100x) followed by ACK.In host mode (SMBHEN=Enabled) SMBus Alert pin (SMBA) supported - 1 - - - - - PECEN - PEC enable - 23 - 1 - - PECEN - read-write - - Disabled - PEC calculation disabled - 0 - - - Enabled - PEC calculation enabled - 1 - - - - - - - CR2 - CR2 - Control register 2 - 0x4 - 0x20 - read-write - 0x00000000 - - - PECBYTE - Packet error checking byte - 26 - 1 - oneToSet - - PECBYTER - read - - NoPec - No PEC transfer - 0 - - - Pec - PEC transmission/reception is requested - 1 - - - - PECBYTEW - write - - Pec - PEC transmission/reception is requested - 1 - - - - - AUTOEND - Automatic end mode (master mode) - 25 - 1 - - AUTOEND - read-write - - Software - Software end mode: TC flag is set when NBYTES data are transferred, stretching SCL low - 0 - - - Automatic - Automatic end mode: a STOP condition is automatically sent when NBYTES data are transferred - 1 - - - - - RELOAD - NBYTES reload mode - 24 - 1 - - RELOAD - read-write - - Completed - The transfer is completed after the NBYTES data transfer (STOP or RESTART will follow) - 0 - - - NotCompleted - The transfer is not completed after the NBYTES data transfer (NBYTES will be reloaded) - 1 - - - - - NBYTES - Number of bytes - 16 - 8 - - - 0 - 255 - - - - - NACK - NACK generation (slave mode) - 15 - 1 - oneToSet - - NACKR - read - - Ack - an ACK is sent after current received byte - 0 - - - Nack - a NACK is sent after current received byte - 1 - - - - NACKW - write - - Nack - a NACK is sent after current received byte - 1 - - - - - STOP - Stop generation (master mode) - 14 - 1 - oneToSet - - STOPR - read - - NoStop - No Stop generation - 0 - - - Stop - Stop generation after current byte transfer - 1 - - - - STOPW - write - - Stop - Stop generation after current byte transfer - 1 - - - - - START - Start generation - 13 - 1 - oneToSet - - STARTR - read - - NoStart - No Start generation - 0 - - - Start - Restart/Start generation - 1 - - - - STARTW - write - - Start - Restart/Start generation - 1 - - - - - HEAD10R - 10-bit address header only read direction (master receiver mode) - 12 - 1 - - HEAD10R - read-write - - Complete - The master sends the complete 10 bit slave address read sequence - 0 - - - Partial - The master only sends the 1st 7 bits of the 10 bit address, followed by Read direction - 1 - - - - - ADD10 - 10-bit addressing mode (master mode) - 11 - 1 - - ADD10 - read-write - - Bit7 - The master operates in 7-bit addressing mode - 0 - - - Bit10 - The master operates in 10-bit addressing mode - 1 - - - - - RD_WRN - Transfer direction (master mode) - 10 - 1 - - RD_WRN - read-write - - Write - Master requests a write transfer - 0 - - - Read - Master requests a read transfer - 1 - - - - - SADD - Slave address bit (master mode) - 0 - 10 - - - 0 - 1023 - - - - - - - OAR1 - OAR1 - Own address register 1 - 0x8 - 0x20 - read-write - 0x00000000 - - - OA1 - Interface address - 0 - 10 - - - 0 - 1023 - - - - - OA1MODE - Own Address 1 10-bit mode - 10 - 1 - - OA1MODE - read-write - - Bit7 - Own address 1 is a 7-bit address - 0 - - - Bit10 - Own address 1 is a 10-bit address - 1 - - - - - OA1EN - Own Address 1 enable - 15 - 1 - - OA1EN - read-write - - Disabled - Own address 1 disabled. The received slave address OA1 is NACKed - 0 - - - Enabled - Own address 1 enabled. The received slave address OA1 is ACKed - 1 - - - - - - - OAR2 - OAR2 - Own address register 2 - 0xC - 0x20 - read-write - 0x00000000 - - - OA2 - Interface address - 1 - 7 - - - 0 - 127 - - - - - OA2MSK - Own Address 2 masks - 8 - 3 - - OA2MSK - read-write - - NoMask - No mask - 0 - - - Mask1 - OA2[1] is masked and don’t care. Only OA2[7:2] are compared - 1 - - - Mask2 - OA2[2:1] are masked and don’t care. Only OA2[7:3] are compared - 2 - - - Mask3 - OA2[3:1] are masked and don’t care. Only OA2[7:4] are compared - 3 - - - Mask4 - OA2[4:1] are masked and don’t care. Only OA2[7:5] are compared - 4 - - - Mask5 - OA2[5:1] are masked and don’t care. Only OA2[7:6] are compared - 5 - - - Mask6 - OA2[6:1] are masked and don’t care. Only OA2[7] is compared. - 6 - - - Mask7 - OA2[7:1] are masked and don’t care. No comparison is done, and all (except reserved) 7-bit received addresses are acknowledged - 7 - - - - - OA2EN - Own Address 2 enable - 15 - 1 - - OA2EN - read-write - - Disabled - Own address 2 disabled. The received slave address OA2 is NACKed - 0 - - - Enabled - Own address 2 enabled. The received slave address OA2 is ACKed - 1 - - - - - - - TIMINGR - TIMINGR - Timing register - 0x10 - 0x20 - read-write - 0x00000000 - - - SCLL - SCL low period (master mode) - 0 - 8 - - - 0 - 255 - - - - - SCLH - SCL high period (master mode) - 8 - 8 - - - 0 - 255 - - - - - SDADEL - Data hold time - 16 - 4 - - - 0 - 15 - - - - - SCLDEL - Data setup time - 20 - 4 - - - 0 - 15 - - - - - PRESC - Timing prescaler - 28 - 4 - - - 0 - 15 - - - - - - - TIMEOUTR - TIMEOUTR - Status register 1 - 0x14 - 0x20 - read-write - 0x00000000 - - - TIMEOUTA - Bus timeout A - 0 - 12 - - - 0 - 4095 - - - - - TIDLE - Idle clock timeout detection - 12 - 1 - - TIDLE - read-write - - Disabled - TIMEOUTA is used to detect SCL low timeout - 0 - - - Enabled - TIMEOUTA is used to detect both SCL and SDA high timeout (bus idle condition) - 1 - - - - - TIMOUTEN - Clock timeout enable - 15 - 1 - - TIMOUTEN - read-write - - Disabled - SCL timeout detection is disabled - 0 - - - Enabled - SCL timeout detection is enabled - 1 - - - - - TIMEOUTB - Bus timeout B - 16 - 12 - - - 0 - 4095 - - - - - TEXTEN - Extended clock timeout enable - 31 - 1 - - TEXTEN - read-write - - Disabled - Extended clock timeout detection is disabled - 0 - - - Enabled - Extended clock timeout detection is enabled - 1 - - - - - - - ISR - ISR - Interrupt and Status register - 0x18 - 0x20 - 0x00000001 - - - ADDCODE - Address match code (Slave mode) - 17 - 7 - read-only - - - 0 - 127 - - - - - DIR - Transfer direction (Slave mode) - 16 - 1 - read-only - - DIR - read - - Write - Write transfer, slave enters receiver mode - 0 - - - Read - Read transfer, slave enters transmitter mode - 1 - - - - - BUSY - Bus busy - 15 - 1 - read-only - - BUSY - read - - NotBusy - No communication is in progress on the bus - 0 - - - Busy - A communication is in progress on the bus - 1 - - - - - ALERT - SMBus alert - 13 - 1 - read-only - - ALERT - read - - NoAlert - SMBA alert is not detected - 0 - - - Alert - SMBA alert event is detected on SMBA pin - 1 - - - - - TIMEOUT - Timeout or t_low detection flag - 12 - 1 - read-only - - TIMEOUT - read - - NoTimeout - No timeout occured - 0 - - - Timeout - Timeout occured - 1 - - - - - PECERR - PEC Error in reception - 11 - 1 - read-only - - PECERR - read - - Match - Received PEC does match with PEC register - 0 - - - NoMatch - Received PEC does not match with PEC register - 1 - - - - - OVR - Overrun/Underrun (slave mode) - 10 - 1 - read-only - - OVR - read - - NoOverrun - No overrun/underrun error occurs - 0 - - - Overrun - slave mode with NOSTRETCH=1, when an overrun/underrun error occurs - 1 - - - - - ARLO - Arbitration lost - 9 - 1 - read-only - - ARLO - read - - NotLost - No arbitration lost - 0 - - - Lost - Arbitration lost - 1 - - - - - BERR - Bus error - 8 - 1 - read-only - - BERR - read - - NoError - No bus error - 0 - - - Error - Misplaced Start and Stop condition is detected - 1 - - - - - TCR - Transfer Complete Reload - 7 - 1 - read-only - - TCR - read - - NotComplete - Transfer is not complete - 0 - - - Complete - NBYTES has been transfered - 1 - - - - - TC - Transfer Complete (master mode) - 6 - 1 - read-only - - TC - read - - NotComplete - Transfer is not complete - 0 - - - Complete - NBYTES has been transfered - 1 - - - - - STOPF - Stop detection flag - 5 - 1 - read-only - - STOPF - read - - NoStop - No Stop condition detected - 0 - - - Stop - Stop condition detected - 1 - - - - - NACKF - Not acknowledge received flag - 4 - 1 - read-only - - NACKF - read - - NoNack - No NACK has been received - 0 - - - Nack - NACK has been received - 1 - - - - - ADDR - Address matched (slave mode) - 3 - 1 - read-only - - ADDR - read - - NotMatch - Adress mismatched or not received - 0 - - - Match - Received slave address matched with one of the enabled slave addresses - 1 - - - - - RXNE - Receive data register not empty (receivers) - 2 - 1 - read-only - - RXNE - read - - Empty - The RXDR register is empty - 0 - - - NotEmpty - Received data is copied into the RXDR register, and is ready to be read - 1 - - - - - TXIS - Transmit interrupt status (transmitters) - 1 - 1 - read-write - oneToSet - - TXISR - read - - NotEmpty - The TXDR register is not empty - 0 - - - Empty - The TXDR register is empty and the data to be transmitted must be written in the TXDR register - 1 - - - - TXISW - write - - Trigger - Generate a TXIS event - 1 - - - - - TXE - Transmit data register empty (transmitters) - 0 - 1 - read-write - oneToSet - - TXER - read - - NotEmpty - TXDR register not empty - 0 - - - Empty - TXDR register empty - 1 - - - - TXEW - write - - Flush - Flush the transmit data register - 1 - - - - - - - ICR - ICR - Interrupt clear register - 0x1C - 0x20 - write-only - 0x00000000 - - - ALERTCF - Alert flag clear - 13 - 1 - - ALERTCF - write - - Clear - Clears the ALERT flag in ISR register - 1 - - - - - TIMOUTCF - Timeout detection flag clear - 12 - 1 - - TIMOUTCF - write - - Clear - Clears the TIMOUT flag in ISR register - 1 - - - - - PECCF - PEC Error flag clear - 11 - 1 - - PECCF - write - - Clear - Clears the PEC flag in ISR register - 1 - - - - - OVRCF - Overrun/Underrun flag clear - 10 - 1 - - OVRCF - write - - Clear - Clears the OVR flag in ISR register - 1 - - - - - ARLOCF - Arbitration lost flag clear - 9 - 1 - - ARLOCF - write - - Clear - Clears the ARLO flag in ISR register - 1 - - - - - BERRCF - Bus error flag clear - 8 - 1 - - BERRCF - write - - Clear - Clears the BERR flag in ISR register - 1 - - - - - STOPCF - Stop detection flag clear - 5 - 1 - - STOPCF - write - - Clear - Clears the STOP flag in ISR register - 1 - - - - - NACKCF - Not Acknowledge flag clear - 4 - 1 - - NACKCF - write - - Clear - Clears the NACK flag in ISR register - 1 - - - - - ADDRCF - Address Matched flag clear - 3 - 1 - - ADDRCF - write - - Clear - Clears the ADDR flag in ISR register - 1 - - - - - - - PECR - PECR - PEC register - 0x20 - 0x20 - read-only - 0x00000000 - - - PEC - Packet error checking register - 0 - 8 - - - 0 - 255 - - - - - - - RXDR - RXDR - Receive data register - 0x24 - 0x20 - read-only - 0x00000000 - - - RXDATA - 8-bit receive data - 0 - 8 - - - 0 - 255 - - - - - - - TXDR - TXDR - Transmit data register - 0x28 - 0x20 - read-write - 0x00000000 - - - TXDATA - 8-bit transmit data - 0 - 8 - - - 0 - 255 - - - - - - - - - I2C2 - 0x40005800 - - I2C2_EV - I2C2 event interrupt - 33 - - - I2C2_ER - I2C2 error interrupt - 34 - - - - I2C3 - 0x40005C00 - - I2C3_EV - I2C3 event interrupt - 72 - - - I2C3_ER - I2C3 error interrupt - 73 - - - - I2C4 - 0x40006000 - - I2C4_EV - I2C4 event interrupt - 95 - - - I2C4_ER - I2C4 Error interrupt - 96 - - - - RTC - Real-time clock - RTC - 0x40002800 - - 0x0 - 0x400 - registers - - - RTC_WKUP - RTC Tamper or TimeStamp /CSS on LSE through - EXTI line 19 interrupts - 3 - - - RTC_ALARM - RTC alarms through EXTI line 18 - interrupts - 41 - - - - TR - TR - time register - 0x0 - 0x20 - read-write - 0x00000000 - - - PM - AM/PM notation - 22 - 1 - - PM - read-write - - AM - AM or 24-hour format - 0 - - - PM - PM - 1 - - - - - HT - Hour tens in BCD format - 20 - 2 - - - 0 - 3 - - - - - HU - Hour units in BCD format - 16 - 4 - - - 0 - 15 - - - - - MNT - Minute tens in BCD format - 12 - 3 - - - 0 - 7 - - - - - MNU - Minute units in BCD format - 8 - 4 - - - 0 - 15 - - - - - ST - Second tens in BCD format - 4 - 3 - - - 0 - 7 - - - - - SU - Second units in BCD format - 0 - 4 - - - 0 - 15 - - - - - - - DR - DR - date register - 0x4 - 0x20 - read-write - 0x00002101 - - - YT - Year tens in BCD format - 20 - 4 - - - 0 - 15 - - - - - YU - Year units in BCD format - 16 - 4 - - - 0 - 15 - - - - - WDU - Week day units - 13 - 3 - - - 1 - 7 - - - - - MT - Month tens in BCD format - 12 - 1 - - MT - read-write - - Zero - Month tens is 0 - 0 - - - One - Month tens is 1 - 1 - - - - - MU - Month units in BCD format - 8 - 4 - - - 0 - 15 - - - - - DT - Date tens in BCD format - 4 - 2 - - - 0 - 3 - - - - - DU - Date units in BCD format - 0 - 4 - - - 0 - 15 - - - - - - - CR - CR - control register - 0x8 - 0x20 - read-write - 0x00000000 - - - WUCKSEL - Wakeup clock selection - 0 - 3 - - WUCKSEL - read-write - - Div16 - RTC/16 clock is selected - 0 - - - Div8 - RTC/8 clock is selected - 1 - - - Div4 - RTC/4 clock is selected - 2 - - - Div2 - RTC/2 clock is selected - 3 - - - ClockSpare - ck_spre (usually 1 Hz) clock is selected - 4 - - - ClockSpareWithOffset - ck_spre (usually 1 Hz) clock is selected and 2^16 is added to the WUT counter value - 6 - - - - - TSEDGE - Time-stamp event active edge - 3 - 1 - - TSEDGE - read-write - - RisingEdge - RTC_TS input rising edge generates a time-stamp event - 0 - - - FallingEdge - RTC_TS input falling edge generates a time-stamp event - 1 - - - - - REFCKON - Reference clock detection enable (50 or 60 Hz) - 4 - 1 - - REFCKON - read-write - - Disabled - RTC_REFIN detection disabled - 0 - - - Enabled - RTC_REFIN detection enabled - 1 - - - - - BYPSHAD - Bypass the shadow registers - 5 - 1 - - BYPSHAD - read-write - - ShadowReg - Calendar values (when reading from RTC_SSR, RTC_TR, and RTC_DR) are taken from the shadow registers, which are updated once every two RTCCLK cycles - 0 - - - BypassShadowReg - Calendar values (when reading from RTC_SSR, RTC_TR, and RTC_DR) are taken directly from the calendar counters - 1 - - - - - FMT - Hour format - 6 - 1 - - FMT - read-write - - Twenty_Four_Hour - 24 hour/day format - 0 - - - AM_PM - AM/PM hour format - 1 - - - - - ALRAE - Alarm A enable - 8 - 1 - - ALRAE - read-write - - Disabled - Alarm A disabled - 0 - - - Enabled - Alarm A enabled - 1 - - - - - ALRBE - Alarm B enable - 9 - 1 - - ALRBE - read-write - - Disabled - Alarm B disabled - 0 - - - Enabled - Alarm B enabled - 1 - - - - - WUTE - Wakeup timer enable - 10 - 1 - - WUTE - read-write - - Disabled - Wakeup timer disabled - 0 - - - Enabled - Wakeup timer enabled - 1 - - - - - TSE - Time stamp enable - 11 - 1 - - TSE - read-write - - Disabled - Timestamp disabled - 0 - - - Enabled - Timestamp enabled - 1 - - - - - ALRAIE - Alarm A interrupt enable - 12 - 1 - - ALRAIE - read-write - - Disabled - Alarm A interrupt disabled - 0 - - - Enabled - Alarm A interrupt enabled - 1 - - - - - ALRBIE - Alarm B interrupt enable - 13 - 1 - - ALRBIE - read-write - - Disabled - Alarm B Interrupt disabled - 0 - - - Enabled - Alarm B Interrupt enabled - 1 - - - - - WUTIE - Wakeup timer interrupt enable - 14 - 1 - - WUTIE - read-write - - Disabled - Wakeup timer interrupt disabled - 0 - - - Enabled - Wakeup timer interrupt enabled - 1 - - - - - TSIE - Time-stamp interrupt enable - 15 - 1 - - TSIE - read-write - - Disabled - Time-stamp Interrupt disabled - 0 - - - Enabled - Time-stamp Interrupt enabled - 1 - - - - - ADD1H - Add 1 hour (summer time change) - 16 - 1 - - ADD1HW - write - - Add1 - Adds 1 hour to the current time. This can be used for summer time change outside initialization mode - 1 - - - - - SUB1H - Subtract 1 hour (winter time change) - 17 - 1 - - SUB1HW - write - - Sub1 - Subtracts 1 hour to the current time. This can be used for winter time change outside initialization mode - 1 - - - - - BKP - Backup - 18 - 1 - - BKP - read-write - - DST_Not_Changed - Daylight Saving Time change has not been performed - 0 - - - DST_Changed - Daylight Saving Time change has been performed - 1 - - - - - COSEL - Calibration output selection - 19 - 1 - - COSEL - read-write - - CalFreq_512Hz - Calibration output is 512 Hz (with default prescaler setting) - 0 - - - CalFreq_1Hz - Calibration output is 1 Hz (with default prescaler setting) - 1 - - - - - POL - Output polarity - 20 - 1 - - POL - read-write - - High - The pin is high when ALRAF/ALRBF/WUTF is asserted (depending on OSEL[1:0]) - 0 - - - Low - The pin is low when ALRAF/ALRBF/WUTF is asserted (depending on OSEL[1:0]) - 1 - - - - - OSEL - Output selection - 21 - 2 - - OSEL - read-write - - Disabled - Output disabled - 0 - - - AlarmA - Alarm A output enabled - 1 - - - AlarmB - Alarm B output enabled - 2 - - - Wakeup - Wakeup output enabled - 3 - - - - - COE - Calibration output enable - 23 - 1 - - COE - read-write - - Disabled - Calibration output disabled - 0 - - - Enabled - Calibration output enabled - 1 - - - - - ITSE - timestamp on internal event enable - 24 - 1 - - - - - ISR - ISR - initialization and status register - 0xC - 0x20 - 0x00000007 - - - ALRAWF - Alarm A write flag - 0 - 1 - read-only - - ALRAWFR - read - - UpdateNotAllowed - Alarm update not allowed - 0 - - - UpdateAllowed - Alarm update allowed - 1 - - - - - ALRBWF - Alarm B write flag - 1 - 1 - read-only - - - - WUTWF - Wakeup timer write flag - 2 - 1 - read-only - - WUTWFR - read - - UpdateNotAllowed - Wakeup timer configuration update not allowed - 0 - - - UpdateAllowed - Wakeup timer configuration update allowed - 1 - - - - - SHPF - Shift operation pending - 3 - 1 - read-write - - SHPFR - read - - NoShiftPending - No shift operation is pending - 0 - - - ShiftPending - A shift operation is pending - 1 - - - - - INITS - Initialization status flag - 4 - 1 - read-only - - INITSR - read - - NotInitalized - Calendar has not been initialized - 0 - - - Initalized - Calendar has been initialized - 1 - - - - - RSF - Registers synchronization flag - 5 - 1 - read-write - zeroToClear - - RSFR - read - - NotSynced - Calendar shadow registers not yet synchronized - 0 - - - Synced - Calendar shadow registers synchronized - 1 - - - - RSFW - write - - Clear - This flag is cleared by software by writing 0 - 0 - - - - - INITF - Initialization flag - 6 - 1 - read-only - - INITFR - read - - NotAllowed - Calendar registers update is not allowed - 0 - - - Allowed - Calendar registers update is allowed - 1 - - - - - INIT - Initialization mode - 7 - 1 - read-write - - INIT - read-write - - FreeRunningMode - Free running mode - 0 - - - InitMode - Initialization mode used to program time and date register (RTC_TR and RTC_DR), and prescaler register (RTC_PRER). Counters are stopped and start counting from the new value when INIT is reset. - 1 - - - - - ALRAF - Alarm A flag - 8 - 1 - read-write - zeroToClear - - ALRAFR - read - - Match - This flag is set by hardware when the time/date registers (RTC_TR and RTC_DR) match the Alarm A register (RTC_ALRMAR) - 1 - - - - ALRAFW - write - - Clear - This flag is cleared by software by writing 0 - 0 - - - - - ALRBF - Alarm B flag - 9 - 1 - read-write - zeroToClear - - ALRBFR - read - - Match - This flag is set by hardware when the time/date registers (RTC_TR and RTC_DR) match the Alarm B register (RTC_ALRMBR) - 1 - - - - ALRBFW - write - - Clear - This flag is cleared by software by writing 0 - 0 - - - - - WUTF - Wakeup timer flag - 10 - 1 - read-write - zeroToClear - - WUTFR - read - - Zero - This flag is set by hardware when the wakeup auto-reload counter reaches 0 - 1 - - - - WUTFW - write - - Clear - This flag is cleared by software by writing 0 - 0 - - - - - TSF - Time-stamp flag - 11 - 1 - read-write - zeroToClear - - TSFR - read - - TimestampEvent - This flag is set by hardware when a time-stamp event occurs - 1 - - - - TSFW - write - - Clear - This flag is cleared by software by writing 0 - 0 - - - - - TSOVF - Time-stamp overflow flag - 12 - 1 - read-write - zeroToClear - - TSOVFR - read - - Overflow - This flag is set by hardware when a time-stamp event occurs while TSF is already set - 1 - - - - TSOVFW - write - - Clear - This flag is cleared by software by writing 0 - 0 - - - - - TAMP1F - Tamper detection flag - 13 - 1 - read-write - zeroToClear - - TAMP1FR - read - - Tampered - This flag is set by hardware when a tamper detection event is detected on the RTC_TAMPx input - 1 - - - - TAMP1FW - write - - Clear - Flag cleared by software writing 0 - 0 - - - - - TAMP2F - RTC_TAMP2 detection flag - 14 - 1 - read-write - zeroToClear - - read - - - write - - - - TAMP3F - RTC_TAMP3 detection flag - 15 - 1 - read-write - zeroToClear - - read - - - write - - - - RECALPF - Recalibration pending Flag - 16 - 1 - read-only - - RECALPFR - read - - Pending - The RECALPF status flag is automatically set to 1 when software writes to the RTC_CALR register, indicating that the RTC_CALR register is blocked. When the new calibration settings are taken into account, this bit returns to 0 - 1 - - - - - - - PRER - PRER - prescaler register - 0x10 - 0x20 - read-write - 0x007F00FF - - - PREDIV_A - Asynchronous prescaler factor - 16 - 7 - - - 0 - 127 - - - - - PREDIV_S - Synchronous prescaler factor - 0 - 15 - - - 0 - 32767 - - - - - - - WUTR - WUTR - wakeup timer register - 0x14 - 0x20 - read-write - 0x0000FFFF - - - WUT - Wakeup auto-reload value bits - 0 - 16 - - - 0 - 65535 - - - - - - - 2 - 0x4 - A,B - ALRM%sR - ALRMAR - Alarm register - 0x1C - 0x20 - read-write - 0x00000000 - - - MSK4 - Alarm date mask - 31 - 1 - - - - WDSEL - Week day selection - 30 - 1 - - WDSEL - read-write - - DateUnits - DU[3:0] represents the date units - 0 - - - WeekDay - DU[3:0] represents the week day. DT[1:0] is don’t care. - 1 - - - - - DT - Date tens in BCD format - 28 - 2 - - - 0 - 3 - - - - - DU - Date units or day in BCD format - 24 - 4 - - - 0 - 15 - - - - - MSK3 - Alarm hours mask - 23 - 1 - - - - PM - AM/PM notation - 22 - 1 - - PM - read-write - - AM - AM or 24-hour format - 0 - - - PM - PM - 1 - - - - - HT - Hour tens in BCD format - 20 - 2 - - - 0 - 3 - - - - - HU - Hour units in BCD format - 16 - 4 - - - 0 - 15 - - - - - MSK2 - Alarm minutes mask - 15 - 1 - - - - MNT - Minute tens in BCD format - 12 - 3 - - - 0 - 7 - - - - - MNU - Minute units in BCD format - 8 - 4 - - - 0 - 15 - - - - - MSK1 - Alarm seconds mask - 7 - 1 - - MSK1 - read-write - - Mask - Alarm set if the date/day match - 0 - - - NotMask - Date/day don’t care in Alarm comparison - 1 - - - - - ST - Second tens in BCD format - 4 - 3 - - - 0 - 7 - - - - - SU - Second units in BCD format - 0 - 4 - - - 0 - 15 - - - - - - - WPR - WPR - write protection register - 0x24 - 0x20 - write-only - 0x00000000 - - - KEY - Write protection key - 0 - 8 - - - 0 - 255 - - - - - - - SSR - SSR - sub second register - 0x28 - 0x20 - read-only - 0x00000000 - - - SS - Sub second value - 0 - 16 - - - 0 - 65535 - - - - - - - SHIFTR - SHIFTR - shift control register - 0x2C - 0x20 - write-only - 0x00000000 - - - ADD1S - Add one second - 31 - 1 - - ADD1SW - write - - Add1 - Add one second to the clock/calendar - 1 - - - - - SUBFS - Subtract a fraction of a second - 0 - 15 - - - 0 - 32767 - - - - - - - TSTR - TSTR - time stamp time register - 0x30 - - - TSDR - TSDR - time stamp date register - 0x34 - - - TSSSR - TSSSR - timestamp sub second register - 0x38 - - - CALR - CALR - calibration register - 0x3C - 0x20 - read-write - 0x00000000 - - - CALP - Increase frequency of RTC by 488.5 ppm - 15 - 1 - - CALP - read-write - - NoChange - No RTCCLK pulses are added - 0 - - - IncreaseFreq - One RTCCLK pulse is effectively inserted every 2^11 pulses (frequency increased by 488.5 ppm) - 1 - - - - - CALW8 - Use an 8-second calibration cycle period - 14 - 1 - - CALW8 - read-write - - Eight_Second - When CALW8 is set to ‘1’, the 8-second calibration cycle period is selected - 1 - - - - - CALW16 - Use a 16-second calibration cycle period - 13 - 1 - - CALW16 - read-write - - Sixteen_Second - When CALW16 is set to ‘1’, the 16-second calibration cycle period is selected.This bit must not be set to ‘1’ if CALW8=1 - 1 - - - - - CALM - Calibration minus - 0 - 9 - - - 0 - 511 - - - - - - - TAMPCR - TAMPCR - tamper configuration register - 0x40 - 0x20 - read-write - 0x00000000 - - - TAMP1E - Tamper 1 detection enable - 0 - 1 - - - TAMP1TRG - Active level for tamper 1 - 1 - 1 - - - TAMPIE - Tamper interrupt enable - 2 - 1 - - - TAMP2E - Tamper 2 detection enable - 3 - 1 - - - TAMP2TRG - Active level for tamper 2 - 4 - 1 - - - TAMP3E - Tamper 3 detection enable - 5 - 1 - - - TAMP3TRG - Active level for tamper 3 - 6 - 1 - - - TAMPTS - Activate timestamp on tamper detection event - 7 - 1 - - - TAMPFREQ - Tamper sampling frequency - 8 - 3 - - - TAMPFLT - Tamper filter count - 11 - 2 - - - TAMPPRCH - Tamper precharge duration - 13 - 2 - - - TAMPPUDIS - TAMPER pull-up disable - 15 - 1 - - - TAMP1IE - Tamper 1 interrupt enable - 16 - 1 - - - TAMP1NOERASE - Tamper 1 no erase - 17 - 1 - - - TAMP1MF - Tamper 1 mask flag - 18 - 1 - - - TAMP2IE - Tamper 2 interrupt enable - 19 - 1 - - - TAMP2NOERASE - Tamper 2 no erase - 20 - 1 - - - TAMP2MF - Tamper 2 mask flag - 21 - 1 - - - TAMP3IE - Tamper 3 interrupt enable - 22 - 1 - - - TAMP3NOERASE - Tamper 3 no erase - 23 - 1 - - - TAMP3MF - Tamper 3 mask flag - 24 - 1 - - - - - 2 - 0x4 - A,B - ALRM%sSSR - ALRMASSR - Alarm sub-second register - 0x44 - 0x20 - read-write - 0x00000000 - - - MASKSS - Mask the most-significant bits starting at this bit - 24 - 4 - - - 0 - 15 - - - - - SS - Sub seconds value - 0 - 15 - - - 0 - 32767 - - - - - - - OR - OR - option register - 0x4C - 0x20 - read-write - 0x00000000 - - - RTC_ALARM_TYPE - RTC_ALARM on PC13 output type - 0 - 1 - - - RTC_OUT_RMP - RTC_OUT remap - 1 - 1 - - - - - 32 - 0x4 - 0-31 - BKP%sR - BKP0R - backup register - 0x50 - 0x20 - read-write - 0x00000000 - - - BKP - BKP - 0 - 32 - - - 0 - 4294967295 - - - - - - - - - USART6 - 0x40011400 - - USART6 - USART6 global interrupt - 71 - - - - USART1 - Universal synchronous asynchronous receiver transmitter - USART - 0x40011000 - - 0x0 - 0x400 - registers - - - USART1 - USART1 global interrupt - 37 - - - USART6 - USART6 global interrupt - 71 - - - UART4 - UART4 global interrupt - 52 - - - UART7 - UART7 global interrupt - 82 - - - - CR1 - CR1 - Control register 1 - 0x0 - 0x20 - read-write - 0x00000000 - - - M1 - Word length - 28 - 1 - - M1 - read-write - - M0 - Use M0 to set the data bits - 0 - - - Bit7 - 1 start bit, 7 data bits, n stop bits - 1 - - - - - EOBIE - End of Block interrupt enable - 27 - 1 - - EOBIE - read-write - - Disabled - Interrupt is inhibited - 0 - - - Enabled - A USART interrupt is generated when the EOBF flag is set in the ISR register - 1 - - - - - RTOIE - Receiver timeout interrupt enable - 26 - 1 - - RTOIE - read-write - - Disabled - Interrupt is inhibited - 0 - - - Enabled - An USART interrupt is generated when the RTOF bit is set in the ISR register - 1 - - - - - OVER8 - Oversampling mode - 15 - 1 - - OVER8 - read-write - - Oversampling16 - Oversampling by 16 - 0 - - - Oversampling8 - Oversampling by 8 - 1 - - - - - CMIE - Character match interrupt enable - 14 - 1 - - CMIE - read-write - - Disabled - Interrupt is disabled - 0 - - - Enabled - Interrupt is generated when the CMF bit is set in the ISR register - 1 - - - - - MME - Mute mode enable - 13 - 1 - - MME - read-write - - Disabled - Receiver in active mode permanently - 0 - - - Enabled - Receiver can switch between mute mode and active mode - 1 - - - - - M0 - Word length - 12 - 1 - - M0 - read-write - - Bit8 - 1 start bit, 8 data bits, n stop bits - 0 - - - Bit9 - 1 start bit, 9 data bits, n stop bits - 1 - - - - - WAKE - Receiver wakeup method - 11 - 1 - - WAKE - read-write - - Idle - Idle line - 0 - - - Address - Address mask - 1 - - - - - PCE - Parity control enable - 10 - 1 - - PCE - read-write - - Disabled - Parity control disabled - 0 - - - Enabled - Parity control enabled - 1 - - - - - PS - Parity selection - 9 - 1 - - PS - read-write - - Even - Even parity - 0 - - - Odd - Odd parity - 1 - - - - - PEIE - PE interrupt enable - 8 - 1 - - PEIE - read-write - - Disabled - Interrupt is disabled - 0 - - - Enabled - Interrupt is generated whenever PE=1 in the ISR register - 1 - - - - - TXEIE - interrupt enable - 7 - 1 - - TXEIE - read-write - - Disabled - Interrupt is disabled - 0 - - - Enabled - Interrupt is generated whenever TXE=1 in the ISR register - 1 - - - - - TCIE - Transmission complete interrupt enable - 6 - 1 - - TCIE - read-write - - Disabled - Interrupt is disabled - 0 - - - Enabled - Interrupt is generated whenever TC=1 in the ISR register - 1 - - - - - RXNEIE - RXNE interrupt enable - 5 - 1 - - RXNEIE - read-write - - Disabled - Interrupt is disabled - 0 - - - Enabled - Interrupt is generated whenever ORE=1 or RXNE=1 in the ISR register - 1 - - - - - IDLEIE - IDLE interrupt enable - 4 - 1 - - IDLEIE - read-write - - Disabled - Interrupt is disabled - 0 - - - Enabled - Interrupt is generated whenever IDLE=1 in the ISR register - 1 - - - - - TE - Transmitter enable - 3 - 1 - - TE - read-write - - Disabled - Transmitter is disabled - 0 - - - Enabled - Transmitter is enabled - 1 - - - - - RE - Receiver enable - 2 - 1 - - RE - read-write - - Disabled - Receiver is disabled - 0 - - - Enabled - Receiver is enabled - 1 - - - - - UESM - USART enable in Stop mode - 1 - 1 - - UESM - read-write - - Disabled - USART not able to wake up the MCU from Stop mode - 0 - - - Enabled - USART able to wake up the MCU from Stop mode - 1 - - - - - UE - USART enable - 0 - 1 - - UE - read-write - - Disabled - UART is disabled - 0 - - - Enabled - UART is enabled - 1 - - - - - DEAT - Driver Enable assertion time - 21 - 5 - - - 0 - 31 - - - - - DEDT - Driver Enable de-assertion time - 16 - 5 - - - 0 - 31 - - - - - - - CR2 - CR2 - Control register 2 - 0x4 - 0x20 - read-write - 0x00000000 - - - RTOEN - Receiver timeout enable - 23 - 1 - - RTOEN - read-write - - Disabled - Receiver timeout feature disabled - 0 - - - Enabled - Receiver timeout feature enabled - 1 - - - - - ABREN - Auto baud rate enable - 20 - 1 - - ABREN - read-write - - Disabled - Auto baud rate detection is disabled - 0 - - - Enabled - Auto baud rate detection is enabled - 1 - - - - - MSBFIRST - Most significant bit first - 19 - 1 - - MSBFIRST - read-write - - LSB - data is transmitted/received with data bit 0 first, following the start bit - 0 - - - MSB - data is transmitted/received with MSB (bit 7/8/9) first, following the start bit - 1 - - - - - DATAINV - Binary data inversion - 18 - 1 - - DATAINV - read-write - - Positive - Logical data from the data register are send/received in positive/direct logic - 0 - - - Negative - Logical data from the data register are send/received in negative/inverse logic - 1 - - - - - TXINV - TX pin active level inversion - 17 - 1 - - TXINV - read-write - - Standard - TX pin signal works using the standard logic levels - 0 - - - Inverted - TX pin signal values are inverted - 1 - - - - - RXINV - RX pin active level inversion - 16 - 1 - - RXINV - read-write - - Standard - RX pin signal works using the standard logic levels - 0 - - - Inverted - RX pin signal values are inverted - 1 - - - - - SWAP - Swap TX/RX pins - 15 - 1 - - SWAP - read-write - - Standard - TX/RX pins are used as defined in standard pinout - 0 - - - Swapped - The TX and RX pins functions are swapped - 1 - - - - - LINEN - LIN mode enable - 14 - 1 - - LINEN - read-write - - Disabled - LIN mode disabled - 0 - - - Enabled - LIN mode enabled - 1 - - - - - STOP - STOP bits - 12 - 2 - - STOP - read-write - - Stop1 - 1 stop bit - 0 - - - Stop0p5 - 0.5 stop bit - 1 - - - Stop2 - 2 stop bit - 2 - - - Stop1p5 - 1.5 stop bit - 3 - - - - - CLKEN - Clock enable - 11 - 1 - - CLKEN - read-write - - Disabled - CK pin disabled - 0 - - - Enabled - CK pin enabled - 1 - - - - - CPOL - Clock polarity - 10 - 1 - - CPOL - read-write - - Low - Steady low value on CK pin outside transmission window - 0 - - - High - Steady high value on CK pin outside transmission window - 1 - - - - - CPHA - Clock phase - 9 - 1 - - CPHA - read-write - - First - The first clock transition is the first data capture edge - 0 - - - Second - The second clock transition is the first data capture edge - 1 - - - - - LBCL - Last bit clock pulse - 8 - 1 - - LBCL - read-write - - NotOutput - The clock pulse of the last data bit is not output to the CK pin - 0 - - - Output - The clock pulse of the last data bit is output to the CK pin - 1 - - - - - LBDIE - LIN break detection interrupt enable - 6 - 1 - - LBDIE - read-write - - Disabled - Interrupt is inhibited - 0 - - - Enabled - An interrupt is generated whenever LBDF=1 in the ISR register - 1 - - - - - LBDL - LIN break detection length - 5 - 1 - - LBDL - read-write - - Bit10 - 10-bit break detection - 0 - - - Bit11 - 11-bit break detection - 1 - - - - - ADDM7 - 7-bit Address Detection/4-bit Address Detection - 4 - 1 - - ADDM7 - read-write - - Bit4 - 4-bit address detection - 0 - - - Bit7 - 7-bit address detection - 1 - - - - - ABRMOD - Auto baud rate mode - 21 - 2 - - ABRMOD - read-write - - Start - Measurement of the start bit is used to detect the baud rate - 0 - - - Edge - Falling edge to falling edge measurement - 1 - - - Frame7F - 0x7F frame detection - 2 - - - Frame55 - 0x55 frame detection - 3 - - - - - ADD - Address of the USART node - 24 - 8 - - - 0 - 255 - - - - - - - CR3 - CR3 - Control register 3 - 0x8 - 0x20 - read-write - 0x00000000 - - - WUFIE - Wakeup from Stop mode interrupt enable - 22 - 1 - - WUFIE - read-write - - Disabled - Interrupt is inhibited - 0 - - - Enabled - An USART interrupt is generated whenever WUF=1 in the ISR register - 1 - - - - - WUS - Wakeup from Stop mode interrupt flag selection - 20 - 2 - - WUS - read-write - - Address - WUF active on address match - 0 - - - Start - WuF active on Start bit detection - 2 - - - RXNE - WUF active on RXNE - 3 - - - - - SCARCNT - Smartcard auto-retry count - 17 - 3 - - - 0 - 7 - - - - - DEP - Driver enable polarity selection - 15 - 1 - - DEP - read-write - - High - DE signal is active high - 0 - - - Low - DE signal is active low - 1 - - - - - DEM - Driver enable mode - 14 - 1 - - DEM - read-write - - Disabled - DE function is disabled - 0 - - - Enabled - The DE signal is output on the RTS pin - 1 - - - - - DDRE - DMA Disable on Reception Error - 13 - 1 - - DDRE - read-write - - NotDisabled - DMA is not disabled in case of reception error - 0 - - - Disabled - DMA is disabled following a reception error - 1 - - - - - OVRDIS - Overrun Disable - 12 - 1 - - OVRDIS - read-write - - Enabled - Overrun Error Flag, ORE, is set when received data is not read before receiving new data - 0 - - - Disabled - Overrun functionality is disabled. If new data is received while the RXNE flag is still set the ORE flag is not set and the new received data overwrites the previous content of the RDR register - 1 - - - - - ONEBIT - One sample bit method enable - 11 - 1 - - ONEBIT - read-write - - Sample3 - Three sample bit method - 0 - - - Sample1 - One sample bit method - 1 - - - - - CTSIE - CTS interrupt enable - 10 - 1 - - CTSIE - read-write - - Disabled - Interrupt is inhibited - 0 - - - Enabled - An interrupt is generated whenever CTSIF=1 in the ISR register - 1 - - - - - CTSE - CTS enable - 9 - 1 - - CTSE - read-write - - Disabled - CTS hardware flow control disabled - 0 - - - Enabled - CTS mode enabled, data is only transmitted when the CTS input is asserted - 1 - - - - - RTSE - RTS enable - 8 - 1 - - RTSE - read-write - - Disabled - RTS hardware flow control disabled - 0 - - - Enabled - RTS output enabled, data is only requested when there is space in the receive buffer - 1 - - - - - DMAT - DMA enable transmitter - 7 - 1 - - DMAT - read-write - - Disabled - DMA mode is disabled for transmission - 0 - - - Enabled - DMA mode is enabled for transmission - 1 - - - - - DMAR - DMA enable receiver - 6 - 1 - - DMAR - read-write - - Disabled - DMA mode is disabled for reception - 0 - - - Enabled - DMA mode is enabled for reception - 1 - - - - - SCEN - Smartcard mode enable - 5 - 1 - - SCEN - read-write - - Disabled - Smartcard Mode disabled - 0 - - - Enabled - Smartcard Mode enabled - 1 - - - - - NACK - Smartcard NACK enable - 4 - 1 - - NACK - read-write - - Disabled - NACK transmission in case of parity error is disabled - 0 - - - Enabled - NACK transmission during parity error is enabled - 1 - - - - - HDSEL - Half-duplex selection - 3 - 1 - - HDSEL - read-write - - NotSelected - Half duplex mode is not selected - 0 - - - Selected - Half duplex mode is selected - 1 - - - - - IRLP - Ir low-power - 2 - 1 - - IRLP - read-write - - Normal - Normal mode - 0 - - - LowPower - Low-power mode - 1 - - - - - IREN - Ir mode enable - 1 - 1 - - IREN - read-write - - Disabled - IrDA disabled - 0 - - - Enabled - IrDA enabled - 1 - - - - - EIE - Error interrupt enable - 0 - 1 - - EIE - read-write - - Disabled - Interrupt is inhibited - 0 - - - Enabled - An interrupt is generated when FE=1 or ORE=1 or NF=1 in the ISR register - 1 - - - - - - - BRR - BRR - Baud rate register - 0xC - 0x20 - read-write - 0x00000000 - - - BRR - DIV_Mantissa - 0 - 16 - - - 0 - 65535 - - - - - - - GTPR - GTPR - Guard time and prescaler register - 0x10 - 0x20 - read-write - 0x00000000 - - - GT - Guard time value - 8 - 8 - - - 0 - 255 - - - - - PSC - Prescaler value - 0 - 8 - - - 0 - 255 - - - - - - - RTOR - RTOR - Receiver timeout register - 0x14 - 0x20 - read-write - 0x00000000 - - - BLEN - Block Length - 24 - 8 - - - 0 - 255 - - - - - RTO - Receiver timeout value - 0 - 24 - - - 0 - 16777215 - - - - - - - RQR - RQR - Request register - 0x18 - 0x20 - write-only - 0x00000000 - - - TXFRQ - Transmit data flush request - 4 - 1 - - TXFRQ - write - - Discard - Set the TXE flags. This allows to discard the transmit data - 1 - - - - - RXFRQ - Receive data flush request - 3 - 1 - - RXFRQ - write - - Discard - clears the RXNE flag. This allows to discard the received data without reading it, and avoid an overrun condition - 1 - - - - - MMRQ - Mute mode request - 2 - 1 - - MMRQ - write - - Mute - Puts the USART in mute mode and sets the RWU flag - 1 - - - - - SBKRQ - Send break request - 1 - 1 - - SBKRQ - write - - Break - sets the SBKF flag and request to send a BREAK on the line, as soon as the transmit machine is available - 1 - - - - - ABRRQ - Auto baud rate request - 0 - 1 - - ABRRQ - write - - Request - resets the ABRF flag in the USART_ISR and request an automatic baud rate measurement on the next received data frame - 1 - - - - - - - ISR - ISR - Interrupt & status register - 0x1C - 0x20 - read-only - 0x000000C0 - - - REACK - REACK - 22 - 1 - - - TEACK - TEACK - 21 - 1 - - - WUF - WUF - 20 - 1 - - - RWU - RWU - 19 - 1 - - - SBKF - SBKF - 18 - 1 - - - CMF - CMF - 17 - 1 - - - BUSY - BUSY - 16 - 1 - - - ABRF - ABRF - 15 - 1 - - - ABRE - ABRE - 14 - 1 - - - EOBF - EOBF - 12 - 1 - - - RTOF - RTOF - 11 - 1 - - - CTS - CTS - 10 - 1 - - - CTSIF - CTSIF - 9 - 1 - - - LBDF - LBDF - 8 - 1 - - - TXE - TXE - 7 - 1 - - - TC - TC - 6 - 1 - - - RXNE - RXNE - 5 - 1 - - - IDLE - IDLE - 4 - 1 - - - ORE - ORE - 3 - 1 - - - NF - NF - 2 - 1 - - - FE - FE - 1 - 1 - - - PE - PE - 0 - 1 - - - - - ICR - ICR - Interrupt flag clear register - 0x20 - 0x20 - write-only - 0x00000000 - - - WUCF - Wakeup from Stop mode clear flag - 20 - 1 - - WUCF - write - - Clear - Clears the WUF flag in the ISR register - 1 - - - - - CMCF - Character match clear flag - 17 - 1 - - CMCF - write - - Clear - Clears the CMF flag in the ISR register - 1 - - - - - EOBCF - End of block clear flag - 12 - 1 - - EOBCF - write - - Clear - Clears the EOBF flag in the ISR register - 1 - - - - - RTOCF - Receiver timeout clear flag - 11 - 1 - - RTOCF - write - - Clear - Clears the RTOF flag in the ISR register - 1 - - - - - CTSCF - CTS clear flag - 9 - 1 - - CTSCF - write - - Clear - Clears the CTSIF flag in the ISR register - 1 - - - - - LBDCF - LIN break detection clear flag - 8 - 1 - - LBDCF - write - - Clear - Clears the LBDF flag in the ISR register - 1 - - - - - TCCF - Transmission complete clear flag - 6 - 1 - - TCCF - write - - Clear - Clears the TC flag in the ISR register - 1 - - - - - IDLECF - Idle line detected clear flag - 4 - 1 - - IDLECF - write - - Clear - Clears the IDLE flag in the ISR register - 1 - - - - - ORECF - Overrun error clear flag - 3 - 1 - - ORECF - write - - Clear - Clears the ORE flag in the ISR register - 1 - - - - - NCF - Noise detected clear flag - 2 - 1 - - NCF - write - - Clear - Clears the NF flag in the ISR register - 1 - - - - - FECF - Framing error clear flag - 1 - 1 - - FECF - write - - Clear - Clears the FE flag in the ISR register - 1 - - - - - PECF - Parity error clear flag - 0 - 1 - - PECF - write - - Clear - Clears the PE flag in the ISR register - 1 - - - - - - - RDR - RDR - Receive data register - 0x24 - 0x20 - read-only - 0x00000000 - - - RDR - Receive data value - 0 - 9 - - - 0 - 511 - - - - - - - TDR - TDR - Transmit data register - 0x28 - 0x20 - read-write - 0x00000000 - - - TDR - Transmit data value - 0 - 9 - - - 0 - 511 - - - - - - - - - USART3 - 0x40004800 - - USART3 - USART3 global interrupt - 39 - - - - USART2 - 0x40004400 - - USART2 - USART2 global interrupt - 38 - - - - UART5 - 0x40005000 - - UART5 - UART5 global interrupt - 53 - - - - UART4 - 0x40004C00 - - UART4 - UART4 global interrupt - 52 - - - - UART8 - 0x40007C00 - - UART8 - UART 8 global interrupt - 83 - - - - UART7 - 0x40007800 - - UART7 - UART7 global interrupt - 82 - - - - OTG_FS_GLOBAL - USB on the go full speed - USB_OTG_FS - 0x50000000 - - 0x0 - 0x400 - registers - - - - GOTGCTL - GOTGCTL - OTG_FS control and status register (OTG_FS_GOTGCTL) - 0x0 - 0x20 - 0x00000800 - - - SRQSCS - Session request success - 0 - 1 - read-only - - - SRQ - Session request - 1 - 1 - read-write - - - HNGSCS - Host negotiation success - 8 - 1 - read-only - - - HNPRQ - HNP request - 9 - 1 - read-write - - - HSHNPEN - Host set HNP enable - 10 - 1 - read-write - - - DHNPEN - Device HNP enabled - 11 - 1 - read-write - - - CIDSTS - Connector ID status - 16 - 1 - read-only - - - DBCT - Long/short debounce time - 17 - 1 - read-only - - - ASVLD - A-session valid - 18 - 1 - read-only - - - BSVLD - B-session valid - 19 - 1 - read-only - - - VBVALOEN - VBUS valid override enable - 2 - 1 - read-write - - - VBVALOVAL - VBUS valid override value - 3 - 1 - read-write - - - AVALOEN - A-peripheral session valid override enable - 4 - 1 - read-write - - - AVALOVAL - A-peripheral session valid override value - 5 - 1 - read-write - - - BVALOEN - B-peripheral session valid override enable - 6 - 1 - read-write - - - BVALOVAL - B-peripheral session valid override value - 7 - 1 - read-write - - - EHEN - Embedded host enable - 12 - 1 - read-write - - - OTGVER - OTG version - 20 - 1 - read-write - - - CURMOD - Current mode of operation - 21 - 1 - read-only - - - - - GOTGINT - GOTGINT - OTG_FS interrupt register (OTG_FS_GOTGINT) - 0x4 - 0x20 - read-write - 0x00000000 - - - SEDET - Session end detected - 2 - 1 - - - SRSSCHG - Session request success status change - 8 - 1 - - - HNSSCHG - Host negotiation success status change - 9 - 1 - - - HNGDET - Host negotiation detected - 17 - 1 - - - ADTOCHG - A-device timeout change - 18 - 1 - - - DBCDNE - Debounce done - 19 - 1 - - - IDCHNG - ID input pin changed - 20 - 1 - - - - - GAHBCFG - GAHBCFG - OTG_FS AHB configuration register (OTG_FS_GAHBCFG) - 0x8 - 0x20 - read-write - 0x00000000 - - - GINT - Global interrupt mask - 0 - 1 - - - TXFELVL - TxFIFO empty level - 7 - 1 - - - PTXFELVL - Periodic TxFIFO empty level - 8 - 1 - - - - - GUSBCFG - GUSBCFG - OTG_FS USB configuration register (OTG_FS_GUSBCFG) - 0xC - 0x20 - 0x00000A00 - - - TOCAL - FS timeout calibration - 0 - 3 - read-write - - - PHYSEL - Full Speed serial transceiver select - 6 - 1 - write-only - - - SRPCAP - SRP-capable - 8 - 1 - read-write - - - HNPCAP - HNP-capable - 9 - 1 - read-write - - - TRDT - USB turnaround time - 10 - 4 - read-write - - - FHMOD - Force host mode - 29 - 1 - read-write - - - FDMOD - Force device mode - 30 - 1 - read-write - - - - - GRSTCTL - GRSTCTL - OTG_FS reset register (OTG_FS_GRSTCTL) - 0x10 - 0x20 - 0x20000000 - - - CSRST - Core soft reset - 0 - 1 - read-write - - - HSRST - HCLK soft reset - 1 - 1 - read-write - - - FCRST - Host frame counter reset - 2 - 1 - read-write - - - RXFFLSH - RxFIFO flush - 4 - 1 - read-write - - - TXFFLSH - TxFIFO flush - 5 - 1 - read-write - - - TXFNUM - TxFIFO number - 6 - 5 - read-write - - - AHBIDL - AHB master idle - 31 - 1 - read-only - - - - - GINTSTS - GINTSTS - OTG_FS core interrupt register (OTG_FS_GINTSTS) - 0x14 - 0x20 - 0x04000020 - - - CMOD - Current mode of operation - 0 - 1 - read-only - - - MMIS - Mode mismatch interrupt - 1 - 1 - read-write - - - OTGINT - OTG interrupt - 2 - 1 - read-only - - - SOF - Start of frame - 3 - 1 - read-write - - - RXFLVL - RxFIFO non-empty - 4 - 1 - read-only - - - NPTXFE - Non-periodic TxFIFO empty - 5 - 1 - read-only - - - GINAKEFF - Global IN non-periodic NAK effective - 6 - 1 - read-only - - - GOUTNAKEFF - Global OUT NAK effective - 7 - 1 - read-only - - - ESUSP - Early suspend - 10 - 1 - read-write - - - USBSUSP - USB suspend - 11 - 1 - read-write - - - USBRST - USB reset - 12 - 1 - read-write - - - ENUMDNE - Enumeration done - 13 - 1 - read-write - - - ISOODRP - Isochronous OUT packet dropped interrupt - 14 - 1 - read-write - - - EOPF - End of periodic frame interrupt - 15 - 1 - read-write - - - IEPINT - IN endpoint interrupt - 18 - 1 - read-only - - - OEPINT - OUT endpoint interrupt - 19 - 1 - read-only - - - IISOIXFR - Incomplete isochronous IN transfer - 20 - 1 - read-write - - - IPXFR_INCOMPISOOUT - Incomplete periodic transfer(Host mode)/Incomplete isochronous OUT transfer(Device mode) - 21 - 1 - read-write - - - HPRTINT - Host port interrupt - 24 - 1 - read-only - - - HCINT - Host channels interrupt - 25 - 1 - read-only - - - PTXFE - Periodic TxFIFO empty - 26 - 1 - read-only - - - CIDSCHG - Connector ID status change - 28 - 1 - read-write - - - DISCINT - Disconnect detected interrupt - 29 - 1 - read-write - - - SRQINT - Session request/new session detected interrupt - 30 - 1 - read-write - - - WKUPINT - Resume/remote wakeup detected interrupt - 31 - 1 - read-write - - - RSTDET - Reset detected interrupt - 23 - 1 - read-write - - - - - GINTMSK - GINTMSK - OTG_FS interrupt mask register (OTG_FS_GINTMSK) - 0x18 - 0x20 - 0x00000000 - - - MMISM - Mode mismatch interrupt mask - 1 - 1 - read-write - - - OTGINT - OTG interrupt mask - 2 - 1 - read-write - - - SOFM - Start of frame mask - 3 - 1 - read-write - - - RXFLVLM - Receive FIFO non-empty mask - 4 - 1 - read-write - - - NPTXFEM - Non-periodic TxFIFO empty mask - 5 - 1 - read-write - - - GINAKEFFM - Global non-periodic IN NAK effective mask - 6 - 1 - read-write - - - GONAKEFFM - Global OUT NAK effective mask - 7 - 1 - read-write - - - ESUSPM - Early suspend mask - 10 - 1 - read-write - - - USBSUSPM - USB suspend mask - 11 - 1 - read-write - - - USBRST - USB reset mask - 12 - 1 - read-write - - - ENUMDNEM - Enumeration done mask - 13 - 1 - read-write - - - ISOODRPM - Isochronous OUT packet dropped interrupt mask - 14 - 1 - read-write - - - EOPFM - End of periodic frame interrupt mask - 15 - 1 - read-write - - - IEPINT - IN endpoints interrupt mask - 18 - 1 - read-write - - - OEPINT - OUT endpoints interrupt mask - 19 - 1 - read-write - - - IISOIXFRM - Incomplete isochronous IN transfer mask - 20 - 1 - read-write - - - IPXFRM_IISOOXFRM - Incomplete periodic transfer mask(Host mode)/Incomplete isochronous OUT transfer mask(Device mode) - 21 - 1 - read-write - - - PRTIM - Host port interrupt mask - 24 - 1 - read-write - - - HCIM - Host channels interrupt mask - 25 - 1 - read-write - - - PTXFEM - Periodic TxFIFO empty mask - 26 - 1 - read-write - - - CIDSCHGM - Connector ID status change mask - 28 - 1 - read-write - - - DISCINT - Disconnect detected interrupt mask - 29 - 1 - read-write - - - SRQIM - Session request/new session detected interrupt mask - 30 - 1 - read-write - - - WUIM - Resume/remote wakeup detected interrupt mask - 31 - 1 - read-write - - - RSTDETM - Reset detected interrupt mask - 23 - 1 - read-write - - - LPMIN - LPM interrupt mask - 27 - 1 - read-write - - - - - GRXSTSR_Device - GRXSTSR_Device - OTG_FS Receive status debug read(Device mode) - 0x1C - 0x20 - read-only - 0x00000000 - - - EPNUM - Endpoint number - 0 - 4 - - - BCNT - Byte count - 4 - 11 - - - DPID - Data PID - 15 - 2 - - - PKTSTS - Packet status - 17 - 4 - - - FRMNUM - Frame number - 21 - 4 - - - - - GRXSTSR_Host - GRXSTSR_Host - OTG_FS Receive status debug read(Host mode) - GRXSTSR_Device - 0x1C - 0x20 - read-only - 0x00000000 - - - CHNUM - Endpoint number - 0 - 4 - - - BCNT - Byte count - 4 - 11 - - - DPID - Data PID - 15 - 2 - - - PKTSTS - Packet status - 17 - 4 - - - STSPHST - Status phase start - 27 - 1 - - - - - GRXFSIZ - GRXFSIZ - OTG_FS Receive FIFO size register (OTG_FS_GRXFSIZ) - 0x24 - 0x20 - read-write - 0x00000200 - - - RXFD - RxFIFO depth - 0 - 16 - - - - - DIEPTXF0 - DIEPTXF0_Device - OTG_FS Endpoint 0 Transmit FIFO size - 0x28 - 0x20 - read-write - 0x00000200 - - - TX0FSA - Endpoint 0 transmit RAM start address - 0 - 16 - - - TX0FD - Endpoint 0 TxFIFO depth - 16 - 16 - - - - - HNPTXFSIZ_Host - HNPTXFSIZ_Host - OTG_FS Host non-periodic transmit FIFO size register - DIEPTXF0 - 0x28 - 0x20 - read-write - 0x00000200 - - - NPTXFSA - Non-periodic transmit RAM start address - 0 - 16 - - - NPTXFD - Non-periodic TxFIFO depth - 16 - 16 - - - - - HNPTXSTS - HNPTXSTS - OTG_FS non-periodic transmit FIFO/queue status register (OTG_FS_GNPTXSTS) - 0x2C - 0x20 - read-only - 0x00080200 - - - NPTXFSAV - Non-periodic TxFIFO space available - 0 - 16 - - - NPTQXSAV - Non-periodic transmit request queue space available - 16 - 8 - - - NPTXQTOP - Top of the non-periodic transmit request queue - 24 - 7 - - - - - GCCFG - GCCFG - OTG_FS general core configuration register (OTG_FS_GCCFG) - 0x38 - 0x20 - read-write - 0x00000000 - - - PWRDWN - Power down - 16 - 1 - - - BCDEN - Battery charging detector (BCD) enable - 17 - 1 - - - DCDEN - Data contact detection (DCD) mode enable - 18 - 1 - - - PDEN - Primary detection (PD) mode enable - 19 - 1 - - - SDEN - Secondary detection (SD) mode enable - 20 - 1 - - - VBDEN - USB VBUS detection enable - 21 - 1 - - - DCDET - Data contact detection (DCD) status - 0 - 1 - - - PDET - Primary detection (PD) status - 1 - 1 - - - SDET - Secondary detection (SD) status - 2 - 1 - - - PS2DET - DM pull-up detection status - 3 - 1 - - - - - CID - CID - core ID register - 0x3C - 0x20 - read-write - 0x00001000 - - - PRODUCT_ID - Product ID field - 0 - 32 - - - - - HPTXFSIZ - HPTXFSIZ - OTG_FS Host periodic transmit FIFO size register (OTG_FS_HPTXFSIZ) - 0x100 - 0x20 - read-write - 0x02000600 - - - PTXSA - Host periodic TxFIFO start address - 0 - 16 - - - PTXFSIZ - Host periodic TxFIFO depth - 16 - 16 - - - - - DIEPTXF1 - DIEPTXF1 - OTG_FS device IN endpoint transmit FIFO size register (OTG_FS_DIEPTXF1) - 0x104 - 0x20 - read-write - 0x02000400 - - - INEPTXSA - IN endpoint FIFO2 transmit RAM start address - 0 - 16 - - - INEPTXFD - IN endpoint TxFIFO depth - 16 - 16 - - - - - DIEPTXF2 - DIEPTXF2 - OTG_FS device IN endpoint transmit FIFO size register (OTG_FS_DIEPTXF2) - 0x108 - 0x20 - read-write - 0x02000400 - - - INEPTXSA - IN endpoint FIFO3 transmit RAM start address - 0 - 16 - - - INEPTXFD - IN endpoint TxFIFO depth - 16 - 16 - - - - - DIEPTXF3 - DIEPTXF3 - OTG_FS device IN endpoint transmit FIFO size register (OTG_FS_DIEPTXF3) - 0x10C - 0x20 - read-write - 0x02000400 - - - INEPTXSA - IN endpoint FIFO4 transmit RAM start address - 0 - 16 - - - INEPTXFD - IN endpoint TxFIFO depth - 16 - 16 - - - - - GRXSTSP_Device - GRXSTSP_Device - OTG status read and pop register (Device mode) - 0x20 - 0x20 - read-only - 0x02000400 - - - EPNUM - Endpoint number - 0 - 4 - - - BCNT - Byte count - 4 - 11 - - - DPID - Data PID - 15 - 2 - - - PKTSTS - Packet status - 17 - 4 - - - FRMNUM - Frame number - 21 - 4 - - - - - GRXSTSP_Host - GRXSTSP_Host - OTG status read and pop register (Host mode) - GRXSTSP_Device - 0x20 - 0x20 - read-only - 0x02000400 - - - CHNUM - Channel number - 0 - 4 - - - BCNT - Byte count - 4 - 11 - - - DPID - Data PID - 15 - 2 - - - PKTSTS - Packet status - 17 - 4 - - - STSPHST - Status phase start - 27 - 1 - - - - - GI2CCTL - GI2CCTL - OTG I2C access register - 0x30 - 0x20 - read-write - 0x02000400 - - - RWDATA - I2C Read/Write Data - 0 - 8 - - - REGADDR - I2C Register Address - 8 - 8 - - - ADDR - I2C Address - 16 - 7 - - - I2CEN - I2C Enable - 23 - 1 - - - ACK - I2C ACK - 24 - 1 - - - I2CDEVADR - I2C Device Address - 26 - 2 - - - I2CDATSE0 - I2C DatSe0 USB mode - 28 - 1 - - - RW - Read/Write Indicator - 30 - 1 - - - BSYDNE - I2C Busy/Done - 31 - 1 - - - - - GPWRDN - GPWRDN - OTG power down register - 0x58 - 0x20 - read-write - 0x02000400 - - - ADPMEN - ADP module enable - 0 - 1 - - - ADPIF - ADP interrupt flag - 23 - 1 - - - - - GADPCTL - GADPCTL - OTG ADP timer, control and status register - 0x60 - 0x20 - 0x02000400 - - - PRBDSCHG - Probe discharge - 0 - 2 - read-write - - - PRBDELTA - Probe delta - 2 - 2 - read-write - - - PRBPER - Probe period - 4 - 2 - read-write - - - RTIM - Ramp time - 6 - 11 - read-only - - - ENAPRB - Enable probe - 17 - 1 - read-write - - - ENASNS - Enable sense - 18 - 1 - read-write - - - ADPRST - ADP reset - 19 - 1 - read-only - - - ADPEN - ADP enable - 20 - 1 - read-write - - - ADPPRBIF - ADP probe interrupt flag - 21 - 1 - read-write - - - ADPSNSIF - ADP sense interrupt flag - 22 - 1 - read-write - - - ADPTOIF - ADP timeout interrupt flag - 23 - 1 - read-write - - - ADPPRBIM - ADP probe interrupt mask - 24 - 1 - read-write - - - ADPSNSIM - ADP sense interrupt mask - 25 - 1 - read-write - - - ADPTOIM - ADP timeout interrupt mask - 26 - 1 - read-write - - - AR - Access request - 27 - 2 - read-write - - - - - DIEPTXF4 - DIEPTXF4 - OTG_FS device IN endpoint transmit FIFO size register (OTG_FS_DIEPTXF4) - 0x110 - 0x20 - read-write - 0x02000400 - - - INEPTXSA - IN endpoint FIFOx transmit RAM start address - 0 - 16 - - - INEPTXFD - IN endpoint Tx FIFO depth - 16 - 16 - - - - - DIEPTXF5 - DIEPTXF5 - OTG_FS device IN endpoint transmit FIFO size register (OTG_FS_DIEPTXF5) - 0x114 - 0x20 - read-write - 0x02000400 - - - INEPTXSA - IN endpoint FIFOx transmit RAM start address - 0 - 16 - - - INEPTXFD - IN endpoint Tx FIFO depth - 16 - 16 - - - - - GLPMCFG - GLPMCFG - OTG core LPM configuration register - 0x54 - 0x20 - 0x00000000 - - - LPMEN - LPM support enable - 0 - 1 - read-write - - - LPMACK - LPM token acknowledge enable - 1 - 1 - read-write - - - BESL - Best effort service latency - 2 - 4 - read-write - - - REMWAKE - bRemoteWake value - 6 - 1 - read-write - - - L1SSEN - L1 Shallow Sleep enable - 7 - 1 - read-write - - - BESLTHRS - BESL threshold - 8 - 4 - read-write - - - L1DSEN - L1 deep sleep enable - 12 - 1 - read-write - - - LPMRST - LPM response - 13 - 2 - read-only - - - SLPSTS - Port sleep status - 15 - 1 - read-only - - - L1RSMOK - Sleep State Resume OK - 16 - 1 - read-only - - - LPMCHIDX - LPM Channel Index - 17 - 4 - read-write - - - LPMRCNT - LPM retry count - 21 - 3 - read-write - - - SNDLPM - Send LPM transaction - 24 - 1 - read-write - - - LPMRCNTSTS - LPM retry count status - 25 - 3 - read-only - - - ENBESL - Enable best effort service latency - 28 - 1 - read-write - - - - - - - OTG_FS_HOST - USB on the go full speed - USB_OTG_FS - 0x50000400 - - 0x0 - 0x400 - registers - - - - HCFG - HCFG - OTG_FS host configuration register (OTG_FS_HCFG) - 0x0 - 0x20 - 0x00000000 - - - FSLSPCS - FS/LS PHY clock select - 0 - 2 - read-write - - - FSLSS - FS- and LS-only support - 2 - 1 - read-write - - - - - HFIR - HFIR - OTG_FS Host frame interval register - 0x4 - 0x20 - read-write - 0x0000EA60 - - - FRIVL - Frame interval - 0 - 16 - - - - - HFNUM - HFNUM - OTG_FS host frame number/frame time remaining register (OTG_FS_HFNUM) - 0x8 - 0x20 - read-only - 0x00003FFF - - - FRNUM - Frame number - 0 - 16 - - - FTREM - Frame time remaining - 16 - 16 - - - - - HPTXSTS - HPTXSTS - OTG_FS_Host periodic transmit FIFO/queue status register (OTG_FS_HPTXSTS) - 0x10 - 0x20 - 0x00080100 - - - PTXFSAVL - Periodic transmit data FIFO space available - 0 - 16 - read-write - - - PTXQSAV - Periodic transmit request queue space available - 16 - 8 - read-only - - - PTXQTOP - Top of the periodic transmit request queue - 24 - 8 - read-only - - - - - HAINT - HAINT - OTG_FS Host all channels interrupt register - 0x14 - 0x20 - read-only - 0x00000000 - - - HAINT - Channel interrupts - 0 - 16 - - - - - HAINTMSK - HAINTMSK - OTG_FS host all channels interrupt mask register - 0x18 - 0x20 - read-write - 0x00000000 - - - HAINTM - Channel interrupt mask - 0 - 16 - - - - - HPRT - HPRT - OTG_FS host port control and status register (OTG_FS_HPRT) - 0x40 - 0x20 - 0x00000000 - - - PCSTS - Port connect status - 0 - 1 - read-only - - - PCDET - Port connect detected - 1 - 1 - read-write - - - PENA - Port enable - 2 - 1 - read-write - - - PENCHNG - Port enable/disable change - 3 - 1 - read-write - - - POCA - Port overcurrent active - 4 - 1 - read-only - - - POCCHNG - Port overcurrent change - 5 - 1 - read-write - - - PRES - Port resume - 6 - 1 - read-write - - - PSUSP - Port suspend - 7 - 1 - read-write - - - PRST - Port reset - 8 - 1 - read-write - - - PLSTS - Port line status - 10 - 2 - read-only - - - PPWR - Port power - 12 - 1 - read-write - - - PTCTL - Port test control - 13 - 4 - read-write - - - PSPD - Port speed - 17 - 2 - read-only - - - - - 12 - 0x20 - 0-11 - HC%s - Host channel - 0x100 - - CHAR - HCCHAR0 - OTG_FS host channel-0 characteristics register (OTG_FS_HCCHAR0) - 0x0 - 0x20 - read-write - 0x00000000 - - - MPSIZ - Maximum packet size - 0 - 11 - - - EPNUM - Endpoint number - 11 - 4 - - - EPDIR - Endpoint direction - 15 - 1 - - - LSDEV - Low-speed device - 17 - 1 - - - EPTYP - Endpoint type - 18 - 2 - - - MCNT - Multicount - 20 - 2 - - - DAD - Device address - 22 - 7 - - - ODDFRM - Odd frame - 29 - 1 - - - CHDIS - Channel disable - 30 - 1 - - - CHENA - Channel enable - 31 - 1 - - - - - INT - HCINT0 - OTG_FS host channel-0 interrupt register (OTG_FS_HCINT0) - 0x8 - 0x20 - read-write - 0x00000000 - - - XFRC - Transfer completed - 0 - 1 - - - CHH - Channel halted - 1 - 1 - - - STALL - STALL response received interrupt - 3 - 1 - - - NAK - NAK response received interrupt - 4 - 1 - - - ACK - ACK response received/transmitted interrupt - 5 - 1 - - - TXERR - Transaction error - 7 - 1 - - - BBERR - Babble error - 8 - 1 - - - FRMOR - Frame overrun - 9 - 1 - - - DTERR - Data toggle error - 10 - 1 - - - - - INTMSK - HCINTMSK0 - OTG_FS host channel-0 mask register (OTG_FS_HCINTMSK0) - 0xC - 0x20 - read-write - 0x00000000 - - - XFRCM - Transfer completed mask - 0 - 1 - - - CHHM - Channel halted mask - 1 - 1 - - - STALLM - STALL response received interrupt mask - 3 - 1 - - - NAKM - NAK response received interrupt mask - 4 - 1 - - - ACKM - ACK response received/transmitted interrupt mask - 5 - 1 - - - NYET - response received interrupt mask - 6 - 1 - - - TXERRM - Transaction error mask - 7 - 1 - - - BBERRM - Babble error mask - 8 - 1 - - - FRMORM - Frame overrun mask - 9 - 1 - - - DTERRM - Data toggle error mask - 10 - 1 - - - - - TSIZ - HCTSIZ0 - OTG_FS host channel-0 transfer size register - 0x10 - 0x20 - read-write - 0x00000000 - - - XFRSIZ - Transfer size - 0 - 19 - - - PKTCNT - Packet count - 19 - 10 - - - DPID - Data PID - 29 - 2 - - - - - - - - OTG_FS_DEVICE - USB on the go full speed - USB_OTG_FS - 0x50000800 - - 0x0 - 0x400 - registers - - - - DCFG - DCFG - OTG_FS device configuration register (OTG_FS_DCFG) - 0x0 - 0x20 - read-write - 0x02200000 - - - DSPD - Device speed - 0 - 2 - - - NZLSOHSK - Non-zero-length status OUT handshake - 2 - 1 - - - DAD - Device address - 4 - 7 - - - PFIVL - Periodic frame interval - 11 - 2 - - - - - DCTL - DCTL - OTG_FS device control register (OTG_FS_DCTL) - 0x4 - 0x20 - 0x00000000 - - - RWUSIG - Remote wakeup signaling - 0 - 1 - read-write - - - SDIS - Soft disconnect - 1 - 1 - read-write - - - GINSTS - Global IN NAK status - 2 - 1 - read-only - - - GONSTS - Global OUT NAK status - 3 - 1 - read-only - - - TCTL - Test control - 4 - 3 - read-write - - - SGINAK - Set global IN NAK - 7 - 1 - read-write - - - CGINAK - Clear global IN NAK - 8 - 1 - read-write - - - SGONAK - Set global OUT NAK - 9 - 1 - read-write - - - CGONAK - Clear global OUT NAK - 10 - 1 - read-write - - - POPRGDNE - Power-on programming done - 11 - 1 - read-write - - - - - DSTS - DSTS - OTG_FS device status register (OTG_FS_DSTS) - 0x8 - 0x20 - read-only - 0x00000010 - - - SUSPSTS - Suspend status - 0 - 1 - - - ENUMSPD - Enumerated speed - 1 - 2 - - - EERR - Erratic error - 3 - 1 - - - FNSOF - Frame number of the received SOF - 8 - 14 - - - - - DIEPMSK - DIEPMSK - OTG_FS device IN endpoint common interrupt mask register (OTG_FS_DIEPMSK) - 0x10 - 0x20 - read-write - 0x00000000 - - - XFRCM - Transfer completed interrupt mask - 0 - 1 - - - EPDM - Endpoint disabled interrupt mask - 1 - 1 - - - TOM - Timeout condition mask (Non-isochronous endpoints) - 3 - 1 - - - ITTXFEMSK - IN token received when TxFIFO empty mask - 4 - 1 - - - INEPNMM - IN token received with EP mismatch mask - 5 - 1 - - - INEPNEM - IN endpoint NAK effective mask - 6 - 1 - - - - - DOEPMSK - DOEPMSK - OTG_FS device OUT endpoint common interrupt mask register (OTG_FS_DOEPMSK) - 0x14 - 0x20 - read-write - 0x00000000 - - - XFRCM - Transfer completed interrupt mask - 0 - 1 - - - EPDM - Endpoint disabled interrupt mask - 1 - 1 - - - STUPM - SETUP phase done mask - 3 - 1 - - - OTEPDM - OUT token received when endpoint disabled mask - 4 - 1 - - - - - DAINT - DAINT - OTG_FS device all endpoints interrupt register (OTG_FS_DAINT) - 0x18 - 0x20 - read-only - 0x00000000 - - - IEPINT - IN endpoint interrupt bits - 0 - 16 - - - OEPINT - OUT endpoint interrupt bits - 16 - 16 - - - - - DAINTMSK - DAINTMSK - OTG_FS all endpoints interrupt mask register (OTG_FS_DAINTMSK) - 0x1C - 0x20 - read-write - 0x00000000 - - - IEPM - IN EP interrupt mask bits - 0 - 16 - - - OEPM - OUT EP interrupt mask bits - 16 - 16 - - - - - DVBUSDIS - DVBUSDIS - OTG_FS device VBUS discharge time register - 0x28 - 0x20 - read-write - 0x000017D7 - - - VBUSDT - Device VBUS discharge time - 0 - 16 - - - - - DVBUSPULSE - DVBUSPULSE - OTG_FS device VBUS pulsing time register - 0x2C - 0x20 - read-write - 0x000005B8 - - - DVBUSP - Device VBUS pulsing time - 0 - 12 - - - - - DIEPEMPMSK - DIEPEMPMSK - OTG_FS device IN endpoint FIFO empty interrupt mask register - 0x34 - 0x20 - read-write - 0x00000000 - - - INEPTXFEM - IN EP Tx FIFO empty interrupt mask bits - 0 - 16 - - - - - DIEP0 - Device IN endpoint 0 - 0x100 - - CTL - DIEPCTL0 - OTG_FS device control IN endpoint 0 control register (OTG_FS_DIEPCTL0) - 0x0 - 0x20 - 0x00000000 - - - MPSIZ - Maximum packet size - 0 - 2 - read-write - - - USBAEP - USB active endpoint - 15 - 1 - read-only - - - NAKSTS - NAK status - 17 - 1 - read-only - - - EPTYP - Endpoint type - 18 - 2 - read-only - - - STALL - STALL handshake - 21 - 1 - read-write - - - TXFNUM - TxFIFO number - 22 - 4 - read-write - - - CNAK - Clear NAK - 26 - 1 - write-only - - - SNAK - Set NAK - 27 - 1 - write-only - - - EPDIS - Endpoint disable - 30 - 1 - read-only - - - EPENA - Endpoint enable - 31 - 1 - read-write - - - - - INT - DIEPINT0 - device endpoint-x interrupt register - 0x8 - 0x20 - 0x00000080 - - - TXFE - TXFE - 7 - 1 - read-only - - - INEPNE - INEPNE - 6 - 1 - read-write - - - ITTXFE - ITTXFE - 4 - 1 - read-write - - - TOC - TOC - 3 - 1 - read-write - - - EPDISD - EPDISD - 1 - 1 - read-write - - - XFRC - XFRC - 0 - 1 - read-write - - - - - TSIZ - DIEPTSIZ0 - device endpoint-0 transfer size register - 0x10 - 0x20 - read-write - 0x00000000 - - - PKTCNT - Packet count - 19 - 2 - - - XFRSIZ - Transfer size - 0 - 7 - - - - - TXFSTS - DTXFSTS0 - OTG_FS device IN endpoint transmit FIFO status register - 0x18 - 0x20 - read-only - 0x00000000 - - - INEPTFSAV - IN endpoint TxFIFO space available - 0 - 16 - - - - - - 5 - 0x20 - 1-5 - DIEP%s - Device IN endpoint X - 0x120 - - CTL - DIEPCTL1 - OTG device endpoint-1 control register - 0x0 - 0x20 - 0x00000000 - - - EPENA - EPENA - 31 - 1 - read-write - - - EPDIS - EPDIS - 30 - 1 - read-write - - - SODDFRM_SD1PID - SODDFRM/SD1PID - 29 - 1 - write-only - - - SD0PID_SEVNFRM - SD0PID/SEVNFRM - 28 - 1 - write-only - - - SNAK - SNAK - 27 - 1 - write-only - - - CNAK - CNAK - 26 - 1 - write-only - - - TXFNUM - TXFNUM - 22 - 4 - read-write - - - STALL - STALL handshake - 21 - 1 - read-write - - - EPTYP - EPTYP - 18 - 2 - read-write - - - NAKSTS - NAKSTS - 17 - 1 - read-only - - - EONUM_DPID - EONUM/DPID - 16 - 1 - read-only - - - USBAEP - USBAEP - 15 - 1 - read-write - - - MPSIZ - MPSIZ - 0 - 11 - read-write - - - - - INT - DIEPINT1 - device endpoint-1 interrupt register - 0x8 - 0x20 - 0x00000080 - - - TXFE - TXFE - 7 - 1 - read-only - - - INEPNE - INEPNE - 6 - 1 - read-write - - - ITTXFE - ITTXFE - 4 - 1 - read-write - - - TOC - TOC - 3 - 1 - read-write - - - EPDISD - EPDISD - 1 - 1 - read-write - - - XFRC - XFRC - 0 - 1 - read-write - - - - - TSIZ - DIEPTSIZ1 - device endpoint-1 transfer size register - 0x10 - 0x20 - read-write - 0x00000000 - - - MCNT - Multi count - 29 - 2 - - - PKTCNT - Packet count - 19 - 10 - - - XFRSIZ - Transfer size - 0 - 19 - - - - - TXFSTS - DTXFSTS1 - OTG_FS device IN endpoint transmit FIFO status register - 0x18 - 0x20 - read-only - 0x00000000 - - - INEPTFSAV - IN endpoint TxFIFO space available - 0 - 16 - - - - - - DOEP0 - Device OUT endpoint 0 - 0x300 - - CTL - DOEPCTL0 - device endpoint-0 control register - 0x0 - 0x20 - 0x00008000 - - - EPENA - EPENA - 31 - 1 - read-write - - - EPDIS - EPDIS - 30 - 1 - read-only - - - SNAK - SNAK - 27 - 1 - write-only - - - CNAK - CNAK - 26 - 1 - write-only - - - STALL - STALL handshake - 21 - 1 - read-write - - - SNPM - SNPM - 20 - 1 - read-write - - - EPTYP - EPTYP - 18 - 2 - read-only - - - NAKSTS - NAKSTS - 17 - 1 - read-only - - - USBAEP - USBAEP - 15 - 1 - read-only - - - MPSIZ - MPSIZ - 0 - 2 - read-only - - - - - INT - DOEPINT0 - device endpoint-0 interrupt register - 0x8 - 0x20 - read-write - 0x00000080 - - - B2BSTUP - B2BSTUP - 6 - 1 - - - OTEPDIS - OTEPDIS - 4 - 1 - - - STUP - STUP - 3 - 1 - - - EPDISD - EPDISD - 1 - 1 - - - XFRC - XFRC - 0 - 1 - - - - - TSIZ - DOEPTSIZ0 - device OUT endpoint-0 transfer size register - 0x10 - 0x20 - read-write - 0x00000000 - - - STUPCNT - SETUP packet count - 29 - 2 - - - PKTCNT - Packet count - 19 - 1 - - - XFRSIZ - Transfer size - 0 - 7 - - - - - - 5 - 0x20 - 1-5 - DOEP%s - Device IN endpoint X - 0x320 - - CTL - DOEPCTL1 - device endpoint-1 control register - 0x0 - 0x20 - 0x00000000 - - - EPENA - EPENA - 31 - 1 - read-write - - - EPDIS - EPDIS - 30 - 1 - read-write - - - SODDFRM - SODDFRM - 29 - 1 - write-only - - - SD0PID_SEVNFRM - SD0PID/SEVNFRM - 28 - 1 - write-only - - - SNAK - SNAK - 27 - 1 - write-only - - - CNAK - CNAK - 26 - 1 - write-only - - - STALL - STALL handshake - 21 - 1 - read-write - - - SNPM - SNPM - 20 - 1 - read-write - - - EPTYP - EPTYP - 18 - 2 - read-write - - - NAKSTS - NAKSTS - 17 - 1 - read-only - - - EONUM_DPID - EONUM/DPID - 16 - 1 - read-only - - - USBAEP - USBAEP - 15 - 1 - read-write - - - MPSIZ - MPSIZ - 0 - 11 - read-write - - - - - INT - DOEPINT1 - device endpoint-1 interrupt register - 0x8 - 0x20 - read-write - 0x00000080 - - - B2BSTUP - B2BSTUP - 6 - 1 - - - OTEPDIS - OTEPDIS - 4 - 1 - - - STUP - STUP - 3 - 1 - - - EPDISD - EPDISD - 1 - 1 - - - XFRC - XFRC - 0 - 1 - - - - - TSIZ - DOEPTSIZ1 - device OUT endpoint-1 transfer size register - 0x10 - 0x20 - read-write - 0x00000000 - - - RXDPID_STUPCNT - Received data PID/SETUP packet count - 29 - 2 - - - PKTCNT - Packet count - 19 - 10 - - - XFRSIZ - Transfer size - 0 - 19 - - - - - - - - OTG_FS_PWRCLK - USB on the go full speed - USB_OTG_FS - 0x50000E00 - - 0x0 - 0x400 - registers - - - OTG_FS_WKUP - USB On-The-Go FS Wakeup through EXTI line - interrupt - 42 - - - OTG_FS - USB On The Go FS global - interrupt - 67 - - - - PCGCCTL - PCGCCTL - OTG_FS power and clock gating control register (OTG_FS_PCGCCTL) - 0x0 - 0x20 - read-write - 0x00000000 - - - STPPCLK - Stop PHY clock - 0 - 1 - - - GATEHCLK - Gate HCLK - 1 - 1 - - - PHYSUSP - PHY Suspended - 4 - 1 - - - - - - - OTG_HS_GLOBAL - USB on the go high speed - USB_OTG_HS - 0x40040000 - - 0x0 - 0x400 - registers - - - - GOTGCTL - GOTGCTL - OTG_HS control and status register - 0x0 - 0x20 - 0x00000800 - - - SRQSCS - Session request success - 0 - 1 - read-only - - - SRQ - Session request - 1 - 1 - read-write - - - HNGSCS - Host negotiation success - 8 - 1 - read-only - - - HNPRQ - HNP request - 9 - 1 - read-write - - - HSHNPEN - Host set HNP enable - 10 - 1 - read-write - - - DHNPEN - Device HNP enabled - 11 - 1 - read-write - - - CIDSTS - Connector ID status - 16 - 1 - read-only - - - DBCT - Long/short debounce time - 17 - 1 - read-only - - - ASVLD - A-session valid - 18 - 1 - read-only - - - BSVLD - B-session valid - 19 - 1 - read-only - - - EHEN - Embedded host enable - 12 - 1 - read-write - - - VBVALOEN - V_BUS valid override enable - 2 - 1 - read-write - - - VBVALOVAL - V_BUS valid override value - 3 - 1 - read-write - - - AVALOEN - A-peripheral session valid override enable - 4 - 1 - read-write - - - AVALOVAL - A-peripheral session valid override value - 5 - 1 - read-write - - - BVALOEN - B-peripheral session valid override enable - 6 - 1 - read-write - - - BVALOVAL - B-peripheral session valid override value - 7 - 1 - read-write - - - OTGVER - OTG version - 20 - 1 - read-write - - - CURMOD - Current mode of operation - 21 - 1 - read-only - - - - - GOTGINT - GOTGINT - OTG_HS interrupt register - 0x4 - 0x20 - read-write - 0x00000000 - - - SEDET - Session end detected - 2 - 1 - - - SRSSCHG - Session request success status change - 8 - 1 - - - HNSSCHG - Host negotiation success status change - 9 - 1 - - - HNGDET - Host negotiation detected - 17 - 1 - - - ADTOCHG - A-device timeout change - 18 - 1 - - - DBCDNE - Debounce done - 19 - 1 - - - IDCHNG - ID input pin changed - 20 - 1 - - - - - GAHBCFG - GAHBCFG - OTG_HS AHB configuration register - 0x8 - 0x20 - read-write - 0x00000000 - - - GINT - Global interrupt mask - 0 - 1 - - - HBSTLEN - Burst length/type - 1 - 4 - - - DMAEN - DMA enable - 5 - 1 - - - TXFELVL - TxFIFO empty level - 7 - 1 - - - PTXFELVL - Periodic TxFIFO empty level - 8 - 1 - - - - - GUSBCFG - GUSBCFG - OTG_HS USB configuration register - 0xC - 0x20 - 0x00000A00 - - - TOCAL - FS timeout calibration - 0 - 3 - read-write - - - PHYSEL - USB 2.0 high-speed ULPI PHY or USB 1.1 full-speed serial transceiver select - 6 - 1 - write-only - - - SRPCAP - SRP-capable - 8 - 1 - read-write - - - HNPCAP - HNP-capable - 9 - 1 - read-write - - - TRDT - USB turnaround time - 10 - 4 - read-write - - - PHYLPCS - PHY Low-power clock select - 15 - 1 - read-write - - - ULPIFSLS - ULPI FS/LS select - 17 - 1 - read-write - - - ULPIAR - ULPI Auto-resume - 18 - 1 - read-write - - - ULPICSM - ULPI Clock SuspendM - 19 - 1 - read-write - - - ULPIEVBUSD - ULPI External VBUS Drive - 20 - 1 - read-write - - - ULPIEVBUSI - ULPI external VBUS indicator - 21 - 1 - read-write - - - TSDPS - TermSel DLine pulsing selection - 22 - 1 - read-write - - - PCCI - Indicator complement - 23 - 1 - read-write - - - PTCI - Indicator pass through - 24 - 1 - read-write - - - ULPIIPD - ULPI interface protect disable - 25 - 1 - read-write - - - FHMOD - Forced host mode - 29 - 1 - read-write - - - FDMOD - Forced peripheral mode - 30 - 1 - read-write - - - - - GRSTCTL - GRSTCTL - OTG_HS reset register - 0x10 - 0x20 - 0x20000000 - - - CSRST - Core soft reset - 0 - 1 - read-write - - - HSRST - HCLK soft reset - 1 - 1 - read-write - - - FCRST - Host frame counter reset - 2 - 1 - read-write - - - RXFFLSH - RxFIFO flush - 4 - 1 - read-write - - - TXFFLSH - TxFIFO flush - 5 - 1 - read-write - - - TXFNUM - TxFIFO number - 6 - 5 - read-write - - - AHBIDL - AHB master idle - 31 - 1 - read-only - - - DMAREQ - DMA request signal enabled for USB OTG HS - 30 - 1 - read-only - - - - - GINTSTS - GINTSTS - OTG_HS core interrupt register - 0x14 - 0x20 - 0x04000020 - - - CMOD - Current mode of operation - 0 - 1 - read-only - - - MMIS - Mode mismatch interrupt - 1 - 1 - read-write - - - OTGINT - OTG interrupt - 2 - 1 - read-only - - - SOF - Start of frame - 3 - 1 - read-write - - - RXFLVL - RxFIFO nonempty - 4 - 1 - read-only - - - NPTXFE - Nonperiodic TxFIFO empty - 5 - 1 - read-only - - - GINAKEFF - Global IN nonperiodic NAK effective - 6 - 1 - read-only - - - BOUTNAKEFF - Global OUT NAK effective - 7 - 1 - read-only - - - ESUSP - Early suspend - 10 - 1 - read-write - - - USBSUSP - USB suspend - 11 - 1 - read-write - - - USBRST - USB reset - 12 - 1 - read-write - - - ENUMDNE - Enumeration done - 13 - 1 - read-write - - - ISOODRP - Isochronous OUT packet dropped interrupt - 14 - 1 - read-write - - - EOPF - End of periodic frame interrupt - 15 - 1 - read-write - - - IEPINT - IN endpoint interrupt - 18 - 1 - read-only - - - OEPINT - OUT endpoint interrupt - 19 - 1 - read-only - - - IISOIXFR - Incomplete isochronous IN transfer - 20 - 1 - read-write - - - PXFR_INCOMPISOOUT - Incomplete periodic transfer - 21 - 1 - read-write - - - DATAFSUSP - Data fetch suspended - 22 - 1 - read-write - - - HPRTINT - Host port interrupt - 24 - 1 - read-only - - - HCINT - Host channels interrupt - 25 - 1 - read-only - - - PTXFE - Periodic TxFIFO empty - 26 - 1 - read-only - - - CIDSCHG - Connector ID status change - 28 - 1 - read-write - - - DISCINT - Disconnect detected interrupt - 29 - 1 - read-write - - - SRQINT - Session request/new session detected interrupt - 30 - 1 - read-write - - - WKUINT - Resume/remote wakeup detected interrupt - 31 - 1 - read-write - - - - - GINTMSK - GINTMSK - OTG_HS interrupt mask register - 0x18 - 0x20 - 0x00000000 - - - MMISM - Mode mismatch interrupt mask - 1 - 1 - read-write - - - OTGINT - OTG interrupt mask - 2 - 1 - read-write - - - SOFM - Start of frame mask - 3 - 1 - read-write - - - RXFLVLM - Receive FIFO nonempty mask - 4 - 1 - read-write - - - NPTXFEM - Nonperiodic TxFIFO empty mask - 5 - 1 - read-write - - - GINAKEFFM - Global nonperiodic IN NAK effective mask - 6 - 1 - read-write - - - GONAKEFFM - Global OUT NAK effective mask - 7 - 1 - read-write - - - ESUSPM - Early suspend mask - 10 - 1 - read-write - - - USBSUSPM - USB suspend mask - 11 - 1 - read-write - - - USBRST - USB reset mask - 12 - 1 - read-write - - - ENUMDNEM - Enumeration done mask - 13 - 1 - read-write - - - ISOODRPM - Isochronous OUT packet dropped interrupt mask - 14 - 1 - read-write - - - EOPFM - End of periodic frame interrupt mask - 15 - 1 - read-write - - - IEPINT - IN endpoints interrupt mask - 18 - 1 - read-write - - - OEPINT - OUT endpoints interrupt mask - 19 - 1 - read-write - - - IISOIXFRM - Incomplete isochronous IN transfer mask - 20 - 1 - read-write - - - PXFRM_IISOOXFRM - Incomplete periodic transfer mask - 21 - 1 - read-write - - - FSUSPM - Data fetch suspended mask - 22 - 1 - read-write - - - PRTIM - Host port interrupt mask - 24 - 1 - read-only - - - HCIM - Host channels interrupt mask - 25 - 1 - read-write - - - PTXFEM - Periodic TxFIFO empty mask - 26 - 1 - read-write - - - CIDSCHGM - Connector ID status change mask - 28 - 1 - read-write - - - DISCINT - Disconnect detected interrupt mask - 29 - 1 - read-write - - - SRQIM - Session request/new session detected interrupt mask - 30 - 1 - read-write - - - WUIM - Resume/remote wakeup detected interrupt mask - 31 - 1 - read-write - - - RSTDE - Reset detected interrupt mask - 23 - 1 - read-write - - - LPMINTM - LPM interrupt mask - 27 - 1 - read-write - - - - - GRXSTSR_Host - GRXSTSR_Host - OTG_HS Receive status debug read register (host mode) - 0x1C - 0x20 - read-only - 0x00000000 - - - CHNUM - Channel number - 0 - 4 - - - BCNT - Byte count - 4 - 11 - - - DPID - Data PID - 15 - 2 - - - PKTSTS - Packet status - 17 - 4 - - - - - GRXSTSP_Host - GRXSTSP_Host - OTG_HS status read and pop register (host mode) - 0x20 - 0x20 - read-only - 0x00000000 - - - CHNUM - Channel number - 0 - 4 - - - BCNT - Byte count - 4 - 11 - - - DPID - Data PID - 15 - 2 - - - PKTSTS - Packet status - 17 - 4 - - - - - GRXFSIZ - GRXFSIZ - OTG_HS Receive FIFO size register - 0x24 - 0x20 - read-write - 0x00000200 - - - RXFD - RxFIFO depth - 0 - 16 - - - - - HNPTXFSIZ - HNPTXFSIZ_Host - OTG_HS nonperiodic transmit FIFO size register (host mode) - 0x28 - 0x20 - read-write - 0x00000200 - - - NPTXFSA - Nonperiodic transmit RAM start address - 0 - 16 - - - NPTXFD - Nonperiodic TxFIFO depth - 16 - 16 - - - - - DIEPTXF0 - DIEPTXF0_Device - Endpoint 0 transmit FIFO size (peripheral mode) - HNPTXFSIZ - 0x28 - 0x20 - read-write - 0x00000200 - - - TX0FSA - Endpoint 0 transmit RAM start address - 0 - 16 - - - TX0FD - Endpoint 0 TxFIFO depth - 16 - 16 - - - - - HNPTXSTS - GNPTXSTS - OTG_HS nonperiodic transmit FIFO/queue status register - 0x2C - 0x20 - read-only - 0x00080200 - - - NPTXFSAV - Nonperiodic TxFIFO space available - 0 - 16 - - - NPTQXSAV - Nonperiodic transmit request queue space available - 16 - 8 - - - NPTXQTOP - Top of the nonperiodic transmit request queue - 24 - 7 - - - - - GCCFG - GCCFG - OTG_HS general core configuration register - 0x38 - 0x20 - read-write - 0x00000000 - - - PWRDWN - Power down - 16 - 1 - - - BCDEN - Battery charging detector (BCD) enable - 17 - 1 - - - DCDEN - Data contact detection (DCD) mode enable - 18 - 1 - - - PDEN - Primary detection (PD) mode enable - 19 - 1 - - - SDEN - Secondary detection (SD) mode enable - 20 - 1 - - - VBDEN - USB VBUS detection enable - 21 - 1 - - - DCDET - Data contact detection (DCD) status - 0 - 1 - - - PDET - Primary detection (PD) status - 1 - 1 - - - SDET - Secondary detection (SD) status - 2 - 1 - - - PS2DET - DM pull-up detection status - 3 - 1 - - - - - CID - CID - OTG_HS core ID register - 0x3C - 0x20 - read-write - 0x00001200 - - - PRODUCT_ID - Product ID field - 0 - 32 - - - - - HPTXFSIZ - HPTXFSIZ - OTG_HS Host periodic transmit FIFO size register - 0x100 - 0x20 - read-write - 0x02000600 - - - PTXSA - Host periodic TxFIFO start address - 0 - 16 - - - PTXFD - Host periodic TxFIFO depth - 16 - 16 - - - - - DIEPTXF1 - DIEPTXF1 - OTG_HS device IN endpoint transmit FIFO size register - 0x104 - 0x20 - read-write - 0x02000400 - - - INEPTXSA - IN endpoint FIFOx transmit RAM start address - 0 - 16 - - - INEPTXFD - IN endpoint TxFIFO depth - 16 - 16 - - - - - DIEPTXF2 - DIEPTXF2 - OTG_HS device IN endpoint transmit FIFO size register - 0x108 - 0x20 - read-write - 0x02000600 - - - INEPTXSA - IN endpoint FIFOx transmit RAM start address - 0 - 16 - - - INEPTXFD - IN endpoint TxFIFO depth - 16 - 16 - - - - - DIEPTXF3 - DIEPTXF3 - OTG_HS device IN endpoint transmit FIFO size register - 0x10C - 0x20 - read-write - 0x02000800 - - - INEPTXSA - IN endpoint FIFOx transmit RAM start address - 0 - 16 - - - INEPTXFD - IN endpoint TxFIFO depth - 16 - 16 - - - - - DIEPTXF4 - DIEPTXF4 - OTG_HS device IN endpoint transmit FIFO size register - 0x110 - 0x20 - read-write - 0x02000A00 - - - INEPTXSA - IN endpoint FIFOx transmit RAM start address - 0 - 16 - - - INEPTXFD - IN endpoint TxFIFO depth - 16 - 16 - - - - - DIEPTXF5 - DIEPTXF5 - OTG_HS device IN endpoint transmit FIFO size register - 0x114 - 0x20 - read-write - 0x02000C00 - - - INEPTXSA - IN endpoint FIFOx transmit RAM start address - 0 - 16 - - - INEPTXFD - IN endpoint TxFIFO depth - 16 - 16 - - - - - DIEPTXF6 - DIEPTXF6 - OTG_HS device IN endpoint transmit FIFO size register - 0x118 - 0x20 - read-write - 0x02000E00 - - - INEPTXSA - IN endpoint FIFOx transmit RAM start address - 0 - 16 - - - INEPTXFD - IN endpoint TxFIFO depth - 16 - 16 - - - - - DIEPTXF7 - DIEPTXF7 - OTG_HS device IN endpoint transmit FIFO size register - 0x11C - 0x20 - read-write - 0x02001000 - - - INEPTXSA - IN endpoint FIFOx transmit RAM start address - 0 - 16 - - - INEPTXFD - IN endpoint TxFIFO depth - 16 - 16 - - - - - GRXSTSR_Device - GRXSTSR_Device - OTG_HS Receive status debug read register (peripheral mode mode) - GRXSTSR_Host - 0x1C - 0x20 - read-only - 0x00000000 - - - EPNUM - Endpoint number - 0 - 4 - - - BCNT - Byte count - 4 - 11 - - - DPID - Data PID - 15 - 2 - - - PKTSTS - Packet status - 17 - 4 - - - FRMNUM - Frame number - 21 - 4 - - - - - GRXSTSP_Device - GRXSTSP_Device - OTG_HS status read and pop register (peripheral mode) - GRXSTSP_Host - 0x20 - 0x20 - read-only - 0x00000000 - - - EPNUM - Endpoint number - 0 - 4 - - - BCNT - Byte count - 4 - 11 - - - DPID - Data PID - 15 - 2 - - - PKTSTS - Packet status - 17 - 4 - - - FRMNUM - Frame number - 21 - 4 - - - - - GLPMCFG - GLPMCFG - OTG core LPM configuration register - 0x54 - 0x20 - 0x00000000 - - - LPMEN - LPM support enable - 0 - 1 - read-write - - - LPMACK - LPM token acknowledge enable - 1 - 1 - read-write - - - BESL - Best effort service latency - 2 - 4 - read-only - - - REMWAKE - bRemoteWake value - 6 - 1 - read-only - - - L1SSEN - L1 Shallow Sleep enable - 7 - 1 - read-write - - - BESLTHRS - BESL threshold - 8 - 4 - read-write - - - L1DSEN - L1 deep sleep enable - 12 - 1 - read-write - - - LPMRST - LPM response - 13 - 2 - read-only - - - SLPSTS - Port sleep status - 15 - 1 - read-only - - - L1RSMOK - Sleep State Resume OK - 16 - 1 - read-only - - - LPMCHIDX - LPM Channel Index - 17 - 4 - read-write - - - LPMRCNT - LPM retry count - 21 - 3 - read-write - - - SNDLPM - Send LPM transaction - 24 - 1 - read-write - - - LPMRCNTSTS - LPM retry count status - 25 - 3 - read-only - - - ENBESL - Enable best effort service latency - 28 - 1 - read-write - - - - - DIEPTXF8 - OTG_HS device IN endpoint transmit FIFO size register - 0x120 - 0x20 - read-write - 0x02001200 - - - INEPTXSA - IN endpoint FIFOx transmit RAM start address - 0 - 16 - - - INEPTXFD - IN endpoint TxFIFO depth - 16 - 16 - - - - - - - OTG_HS_HOST - USB on the go high speed - USB_OTG_HS - 0x40040400 - - 0x0 - 0x400 - registers - - - - HCFG - HCFG - OTG_HS host configuration register - 0x0 - 0x20 - 0x00000000 - - - FSLSPCS - FS/LS PHY clock select - 0 - 2 - read-write - - - FSLSS - FS- and LS-only support - 2 - 1 - read-only - - - - - HFIR - HFIR - OTG_HS Host frame interval register - 0x4 - 0x20 - read-write - 0x0000EA60 - - - FRIVL - Frame interval - 0 - 16 - - - - - HFNUM - HFNUM - OTG_HS host frame number/frame time remaining register - 0x8 - 0x20 - read-only - 0x00003FFF - - - FRNUM - Frame number - 0 - 16 - - - FTREM - Frame time remaining - 16 - 16 - - - - - HPTXSTS - HPTXSTS - OTG_HS_Host periodic transmit FIFO/queue status register - 0x10 - 0x20 - 0x00080100 - - - PTXFSAVL - Periodic transmit data FIFO space available - 0 - 16 - read-write - - - PTXQSAV - Periodic transmit request queue space available - 16 - 8 - read-only - - - PTXQTOP - Top of the periodic transmit request queue - 24 - 8 - read-only - - - - - HAINT - HAINT - OTG_HS Host all channels interrupt register - 0x14 - 0x20 - read-only - 0x00000000 - - - HAINT - Channel interrupts - 0 - 16 - - - - - HAINTMSK - HAINTMSK - OTG_HS host all channels interrupt mask register - 0x18 - 0x20 - read-write - 0x00000000 - - - HAINTM - Channel interrupt mask - 0 - 16 - - - - - HPRT - HPRT - OTG_HS host port control and status register - 0x40 - 0x20 - 0x00000000 - - - PCSTS - Port connect status - 0 - 1 - read-only - - - PCDET - Port connect detected - 1 - 1 - read-write - - - PENA - Port enable - 2 - 1 - read-write - - - PENCHNG - Port enable/disable change - 3 - 1 - read-write - - - POCA - Port overcurrent active - 4 - 1 - read-only - - - POCCHNG - Port overcurrent change - 5 - 1 - read-write - - - PRES - Port resume - 6 - 1 - read-write - - - PSUSP - Port suspend - 7 - 1 - read-write - - - PRST - Port reset - 8 - 1 - read-write - - - PLSTS - Port line status - 10 - 2 - read-only - - - PPWR - Port power - 12 - 1 - read-write - - - PTCTL - Port test control - 13 - 4 - read-write - - - PSPD - Port speed - 17 - 2 - read-only - - - - - 16 - 0x20 - 0-15 - HC%s - Host channel - 0x100 - - CHAR - HCCHAR0 - OTG_HS host channel-0 characteristics register - 0x0 - 0x20 - read-write - 0x00000000 - - - MPSIZ - Maximum packet size - 0 - 11 - - - EPNUM - Endpoint number - 11 - 4 - - - EPDIR - Endpoint direction - 15 - 1 - - - LSDEV - Low-speed device - 17 - 1 - - - EPTYP - Endpoint type - 18 - 2 - - - MC - Multi Count (MC) / Error Count (EC) - 20 - 2 - - - DAD - Device address - 22 - 7 - - - ODDFRM - Odd frame - 29 - 1 - - - CHDIS - Channel disable - 30 - 1 - - - CHENA - Channel enable - 31 - 1 - - - - - SPLT - HCSPLT0 - OTG_HS host channel-0 split control register - 0x4 - 0x20 - read-write - 0x00000000 - - - PRTADDR - Port address - 0 - 7 - - - HUBADDR - Hub address - 7 - 7 - - - XACTPOS - XACTPOS - 14 - 2 - - - COMPLSPLT - Do complete split - 16 - 1 - - - SPLITEN - Split enable - 31 - 1 - - - - - INT - HCINT0 - OTG_HS host channel-11 interrupt register - 0x8 - 0x20 - read-write - 0x00000000 - - - XFRC - Transfer completed - 0 - 1 - - - CHH - Channel halted - 1 - 1 - - - AHBERR - AHB error - 2 - 1 - - - STALL - STALL response received interrupt - 3 - 1 - - - NAK - NAK response received interrupt - 4 - 1 - - - ACK - ACK response received/transmitted interrupt - 5 - 1 - - - NYET - Response received interrupt - 6 - 1 - - - TXERR - Transaction error - 7 - 1 - - - BBERR - Babble error - 8 - 1 - - - FRMOR - Frame overrun - 9 - 1 - - - DTERR - Data toggle error - 10 - 1 - - - - - INTMSK - HCINTMSK0 - OTG_HS host channel-11 interrupt mask register - 0xC - 0x20 - read-write - 0x00000000 - - - XFRCM - Transfer completed mask - 0 - 1 - - - CHHM - Channel halted mask - 1 - 1 - - - AHBERR - AHB error - 2 - 1 - - - STALLM - STALL response received interrupt mask - 3 - 1 - - - NAKM - NAK response received interrupt mask - 4 - 1 - - - ACKM - ACK response received/transmitted interrupt mask - 5 - 1 - - - NYET - response received interrupt mask - 6 - 1 - - - TXERRM - Transaction error mask - 7 - 1 - - - BBERRM - Babble error mask - 8 - 1 - - - FRMORM - Frame overrun mask - 9 - 1 - - - DTERRM - Data toggle error mask - 10 - 1 - - - - - TSIZ - HCTSIZ0 - OTG_HS host channel-11 transfer size register - 0x10 - 0x20 - read-write - 0x00000000 - - - XFRSIZ - Transfer size - 0 - 19 - - - PKTCNT - Packet count - 19 - 10 - - - DPID - Data PID - 29 - 2 - - - - - DMA - HCDMA0 - OTG_HS host channel-0 DMA address register - 0x14 - 0x20 - read-write - 0x00000000 - - - DMAADDR - DMA address - 0 - 32 - - - - - - - - OTG_HS_DEVICE - USB on the go high speed - USB_OTG_HS - 0x40040800 - - 0x0 - 0x400 - registers - - - - DCFG - DCFG - OTG_HS device configuration register - 0x0 - 0x20 - read-write - 0x02200000 - - - DSPD - Device speed - 0 - 2 - - - NZLSOHSK - Nonzero-length status OUT handshake - 2 - 1 - - - DAD - Device address - 4 - 7 - - - PFIVL - Periodic (micro)frame interval - 11 - 2 - - - PERSCHIVL - Periodic scheduling interval - 24 - 2 - - - - - DCTL - DCTL - OTG_HS device control register - 0x4 - 0x20 - 0x00000000 - - - RWUSIG - Remote wakeup signaling - 0 - 1 - read-write - - - SDIS - Soft disconnect - 1 - 1 - read-write - - - GINSTS - Global IN NAK status - 2 - 1 - read-only - - - GONSTS - Global OUT NAK status - 3 - 1 - read-only - - - TCTL - Test control - 4 - 3 - read-write - - - SGINAK - Set global IN NAK - 7 - 1 - write-only - - - CGINAK - Clear global IN NAK - 8 - 1 - write-only - - - SGONAK - Set global OUT NAK - 9 - 1 - write-only - - - CGONAK - Clear global OUT NAK - 10 - 1 - write-only - - - POPRGDNE - Power-on programming done - 11 - 1 - read-write - - - - - DSTS - DSTS - OTG_HS device status register - 0x8 - 0x20 - read-only - 0x00000010 - - - SUSPSTS - Suspend status - 0 - 1 - - - ENUMSPD - Enumerated speed - 1 - 2 - - - EERR - Erratic error - 3 - 1 - - - FNSOF - Frame number of the received SOF - 8 - 14 - - - - - DIEPMSK - DIEPMSK - OTG_HS device IN endpoint common interrupt mask register - 0x10 - 0x20 - read-write - 0x00000000 - - - XFRCM - Transfer completed interrupt mask - 0 - 1 - - - EPDM - Endpoint disabled interrupt mask - 1 - 1 - - - TOM - Timeout condition mask (nonisochronous endpoints) - 3 - 1 - - - ITTXFEMSK - IN token received when TxFIFO empty mask - 4 - 1 - - - INEPNMM - IN token received with EP mismatch mask - 5 - 1 - - - INEPNEM - IN endpoint NAK effective mask - 6 - 1 - - - TXFURM - FIFO underrun mask - 8 - 1 - - - BIM - BNA interrupt mask - 9 - 1 - - - - - DOEPMSK - DOEPMSK - OTG_HS device OUT endpoint common interrupt mask register - 0x14 - 0x20 - read-write - 0x00000000 - - - XFRCM - Transfer completed interrupt mask - 0 - 1 - - - EPDM - Endpoint disabled interrupt mask - 1 - 1 - - - STUPM - SETUP phase done mask - 3 - 1 - - - OTEPDM - OUT token received when endpoint disabled mask - 4 - 1 - - - B2BSTUP - Back-to-back SETUP packets received mask - 6 - 1 - - - OPEM - OUT packet error mask - 8 - 1 - - - BOIM - BNA interrupt mask - 9 - 1 - - - - - DAINT - DAINT - OTG_HS device all endpoints interrupt register - 0x18 - 0x20 - read-only - 0x00000000 - - - IEPINT - IN endpoint interrupt bits - 0 - 16 - - - OEPINT - OUT endpoint interrupt bits - 16 - 16 - - - - - DAINTMSK - DAINTMSK - OTG_HS all endpoints interrupt mask register - 0x1C - 0x20 - read-write - 0x00000000 - - - IEPM - IN EP interrupt mask bits - 0 - 16 - - - OEPM - OUT EP interrupt mask bits - 16 - 16 - - - - - DVBUSDIS - DVBUSDIS - OTG_HS device VBUS discharge time register - 0x28 - 0x20 - read-write - 0x000017D7 - - - VBUSDT - Device VBUS discharge time - 0 - 16 - - - - - DVBUSPULSE - DVBUSPULSE - OTG_HS device VBUS pulsing time register - 0x2C - 0x20 - read-write - 0x000005B8 - - - DVBUSP - Device VBUS pulsing time - 0 - 12 - - - - - DTHRCTL - DTHRCTL - OTG_HS Device threshold control register - 0x30 - 0x20 - read-write - 0x00000000 - - - NONISOTHREN - Nonisochronous IN endpoints threshold enable - 0 - 1 - - - ISOTHREN - ISO IN endpoint threshold enable - 1 - 1 - - - TXTHRLEN - Transmit threshold length - 2 - 9 - - - RXTHREN - Receive threshold enable - 16 - 1 - - - RXTHRLEN - Receive threshold length - 17 - 9 - - - ARPEN - Arbiter parking enable - 27 - 1 - - - - - DIEPEMPMSK - DIEPEMPMSK - OTG_HS device IN endpoint FIFO empty interrupt mask register - 0x34 - 0x20 - read-write - 0x00000000 - - - INEPTXFEM - IN EP Tx FIFO empty interrupt mask bits - 0 - 16 - - - - - DEACHINT - DEACHINT - OTG_HS device each endpoint interrupt register - 0x38 - 0x20 - read-write - 0x00000000 - - - IEP1INT - IN endpoint 1interrupt bit - 1 - 1 - - - OEP1INT - OUT endpoint 1 interrupt bit - 17 - 1 - - - - - DEACHINTMSK - DEACHINTMSK - OTG_HS device each endpoint interrupt register mask - 0x3C - 0x20 - read-write - 0x00000000 - - - IEP1INTM - IN Endpoint 1 interrupt mask bit - 1 - 1 - - - OEP1INTM - OUT Endpoint 1 interrupt mask bit - 17 - 1 - - - - - DIEP0 - Device IN endpoint 0 - 0x100 - - CTL - DIEPCTL0 - OTG device endpoint-0 control register - 0x0 - 0x20 - 0x00000000 - - - MPSIZ - Maximum packet size - 0 - 11 - read-write - - - USBAEP - USB active endpoint - 15 - 1 - read-write - - - EONUM_DPID - Even/odd frame - 16 - 1 - read-only - - - NAKSTS - NAK status - 17 - 1 - read-only - - - EPTYP - Endpoint type - 18 - 2 - read-write - - - STALL - STALL handshake - 21 - 1 - read-write - - - TXFNUM - TxFIFO number - 22 - 4 - read-write - - - CNAK - Clear NAK - 26 - 1 - write-only - - - SNAK - Set NAK - 27 - 1 - write-only - - - SD0PID_SEVNFRM - Set DATA0 PID - 28 - 1 - write-only - - - SODDFRM - Set odd frame - 29 - 1 - write-only - - - EPDIS - Endpoint disable - 30 - 1 - read-write - - - EPENA - Endpoint enable - 31 - 1 - read-write - - - - - INT - DIEPINT0 - OTG device endpoint-0 interrupt register - 0x8 - 0x20 - 0x00000080 - - - XFRC - Transfer completed interrupt - 0 - 1 - read-write - - - EPDISD - Endpoint disabled interrupt - 1 - 1 - read-write - - - TOC - Timeout condition - 3 - 1 - read-write - - - ITTXFE - IN token received when TxFIFO is empty - 4 - 1 - read-write - - - INEPNE - IN endpoint NAK effective - 6 - 1 - read-write - - - TXFE - Transmit FIFO empty - 7 - 1 - read-only - - - TXFIFOUDRN - Transmit Fifo Underrun - 8 - 1 - read-write - - - BNA - Buffer not available interrupt - 9 - 1 - read-write - - - PKTDRPSTS - Packet dropped status - 11 - 1 - read-write - - - BERR - Babble error interrupt - 12 - 1 - read-write - - - NAK - NAK interrupt - 13 - 1 - read-write - - - - - TSIZ - DIEPTSIZ0 - OTG_HS device IN endpoint 0 transfer size register - 0x10 - 0x20 - read-write - 0x00000000 - - - XFRSIZ - Transfer size - 0 - 7 - - - PKTCNT - Packet count - 19 - 2 - - - - - DMA - OTG_HS device endpoint-0 DMA address register - 0x14 - 0x20 - read-write - 0x00000000 - - - DMAADDR - DMA address - 0 - 32 - - - - - TXFSTS - DTXFSTS0 - OTG_HS device IN endpoint transmit FIFO status register - 0x18 - 0x20 - read-only - 0x00000000 - - - INEPTFSAV - IN endpoint TxFIFO space avail - 0 - 16 - - - - - - 8 - 0x20 - 1-8 - DIEP%s - Device IN endpoint X - 0x120 - - CTL - DIEPCTL1 - OTG device endpoint-1 control register - 0x0 - 0x20 - 0x00000000 - - - MPSIZ - Maximum packet size - 0 - 11 - read-write - - - USBAEP - USB active endpoint - 15 - 1 - read-write - - - EONUM_DPID - Even/odd frame - 16 - 1 - read-only - - - NAKSTS - NAK status - 17 - 1 - read-only - - - EPTYP - Endpoint type - 18 - 2 - read-write - - - STALL - STALL handshake - 21 - 1 - read-write - - - TXFNUM - TxFIFO number - 22 - 4 - read-write - - - CNAK - Clear NAK - 26 - 1 - write-only - - - SNAK - Set NAK - 27 - 1 - write-only - - - SD0PID_SEVNFRM - Set DATA0 PID - 28 - 1 - write-only - - - SODDFRM - Set odd frame - 29 - 1 - write-only - - - EPDIS - Endpoint disable - 30 - 1 - read-write - - - EPENA - Endpoint enable - 31 - 1 - read-write - - - - - INT - DIEPINT1 - OTG device endpoint-1 interrupt register - 0x8 - 0x20 - 0x00000000 - - - XFRC - Transfer completed interrupt - 0 - 1 - read-write - - - EPDISD - Endpoint disabled interrupt - 1 - 1 - read-write - - - TOC - Timeout condition - 3 - 1 - read-write - - - ITTXFE - IN token received when TxFIFO is empty - 4 - 1 - read-write - - - INEPNE - IN endpoint NAK effective - 6 - 1 - read-write - - - TXFE - Transmit FIFO empty - 7 - 1 - read-only - - - TXFIFOUDRN - Transmit Fifo Underrun - 8 - 1 - read-write - - - BNA - Buffer not available interrupt - 9 - 1 - read-write - - - PKTDRPSTS - Packet dropped status - 11 - 1 - read-write - - - BERR - Babble error interrupt - 12 - 1 - read-write - - - NAK - NAK interrupt - 13 - 1 - read-write - - - - - TSIZ - DIEPTSIZ1 - OTG_HS device endpoint transfer size register - 0x10 - 0x20 - read-write - 0x00000000 - - - XFRSIZ - Transfer size - 0 - 19 - - - PKTCNT - Packet count - 19 - 10 - - - MCNT - Multi count - 29 - 2 - - - - - DMA - DIEPDMA1 - OTG_HS device endpoint-1 DMA address register - 0x14 - 0x20 - read-write - 0x00000000 - - - DMAADDR - DMA address - 0 - 32 - - - - - TXFSTS - DTXFSTS1 - OTG_HS device IN endpoint transmit FIFO status register - 0x18 - 0x20 - read-only - 0x00000000 - - - INEPTFSAV - IN endpoint TxFIFO space avail - 0 - 16 - - - - - - DOEP0 - Device OUT endpoint 0 - 0x300 - - CTL - DOEPCTL0 - OTG_HS device control OUT endpoint 0 control register - 0x0 - 0x20 - 0x00008000 - - - MPSIZ - Maximum packet size - 0 - 2 - read-only - - - USBAEP - USB active endpoint - 15 - 1 - read-only - - - NAKSTS - NAK status - 17 - 1 - read-only - - - EPTYP - Endpoint type - 18 - 2 - read-only - - - SNPM - Snoop mode - 20 - 1 - read-write - - - STALL - STALL handshake - 21 - 1 - read-write - - - CNAK - Clear NAK - 26 - 1 - write-only - - - SNAK - Set NAK - 27 - 1 - write-only - - - EPDIS - Endpoint disable - 30 - 1 - read-only - - - EPENA - Endpoint enable - 31 - 1 - read-write - - - - - INT - DOEPINT0 - OTG_HS device endpoint-0 interrupt register - 0x8 - 0x20 - read-write - 0x00000080 - - - XFRC - Transfer completed interrupt - 0 - 1 - - - EPDISD - Endpoint disabled interrupt - 1 - 1 - - - STUP - SETUP phase done - 3 - 1 - - - OTEPDIS - OUT token received when endpoint disabled - 4 - 1 - - - B2BSTUP - Back-to-back SETUP packets received - 6 - 1 - - - NYET - NYET interrupt - 14 - 1 - - - - - TSIZ - DOEPTSIZ0 - OTG_HS device endpoint-0 transfer size register - 0x10 - 0x20 - read-write - 0x00000000 - - - XFRSIZ - Transfer size - 0 - 7 - - - PKTCNT - Packet count - 19 - 1 - - - STUPCNT - SETUP packet count - 29 - 2 - - - - - DMA - OTG_HS device endpoint-0 DMA address register - 0x14 - 0x20 - read-write - 0x00000000 - - - DMAADDR - DMA address - 0 - 32 - - - - - - 8 - 0x20 - 1-8 - DOEP%s - Device IN endpoint X - 0x320 - - CTL - DOEPCTL1 - OTG device endpoint-1 control register - 0x0 - 0x20 - 0x00000000 - - - MPSIZ - Maximum packet size - 0 - 11 - read-write - - - USBAEP - USB active endpoint - 15 - 1 - read-write - - - EONUM_DPID - Even odd frame/Endpoint data PID - 16 - 1 - read-only - - - NAKSTS - NAK status - 17 - 1 - read-only - - - EPTYP - Endpoint type - 18 - 2 - read-write - - - SNPM - Snoop mode - 20 - 1 - read-write - - - STALL - STALL handshake - 21 - 1 - read-write - - - CNAK - Clear NAK - 26 - 1 - write-only - - - SNAK - Set NAK - 27 - 1 - write-only - - - SD0PID_SEVNFRM - Set DATA0 PID/Set even frame - 28 - 1 - write-only - - - SODDFRM - Set odd frame - 29 - 1 - write-only - - - EPDIS - Endpoint disable - 30 - 1 - read-write - - - EPENA - Endpoint enable - 31 - 1 - read-write - - - - - INT - DOEPINT1 - OTG_HS device endpoint-1 interrupt register - 0x8 - 0x20 - read-write - 0x00000000 - - - XFRC - Transfer completed interrupt - 0 - 1 - - - EPDISD - Endpoint disabled interrupt - 1 - 1 - - - STUP - SETUP phase done - 3 - 1 - - - OTEPDIS - OUT token received when endpoint disabled - 4 - 1 - - - B2BSTUP - Back-to-back SETUP packets received - 6 - 1 - - - NYET - NYET interrupt - 14 - 1 - - - - - DMA - OTG_HS device endpoint-1 DMA address register - 0x14 - 0x20 - read-write - 0x00000000 - - - DMAADDR - DMA address - 0 - 32 - - - - - TSIZ - DOEPTSIZ1 - OTG_HS device endpoint-1 transfer size register - 0x10 - 0x20 - read-write - 0x00000000 - - - XFRSIZ - Transfer size - 0 - 19 - - - PKTCNT - Packet count - 19 - 10 - - - RXDPID_STUPCNT - Received data PID/SETUP packet count - 29 - 2 - - - - - - DIEPEACHMSK1 - 0x44 - 0x20 - read-write - 0x00000000 - - - XFRCM - Transfer completed interrupt mask - 0 - 1 - - - EPDM - Endpoint disabled interrupt mask - 1 - 1 - - - AHBERRM - AHB error mask - 2 - 1 - - - TOM - Timeout condition mask (Non-isochronous endpoints) - 3 - 1 - - - ITTXFEMSK - IN token received when TxFIFO empty mask - 4 - 1 - - - INEPNEM - IN endpoint NAK effective mask - 6 - 1 - - - TXFURM - FIFO underrun mask - 8 - 1 - - - BNAM - BNA interrupt mask - 9 - 1 - - - NAKM - NAK interrupt mask - 13 - 1 - - - - - DOEPEACHMSK1 - 0x84 - 0x20 - read-write - 0x00000000 - - - XFRCM - Transfer completed interrupt mask - 0 - 1 - - - EPDM - Endpoint disabled interrupt mask - 1 - 1 - - - AHBERRM - AHB error mask - 2 - 1 - - - STUPM - SETUP phase done mask - 3 - 1 - - - OTEPDM - OUT token received when endpoint disabled mask - 4 - 1 - - - B2BSTUPM - Back-to-back SETUP packets received mask - 6 - 1 - - - OUTPKTERRM - Out packet error mask - 8 - 1 - - - BNAM - BNA interrupt mask - 9 - 1 - - - BERRM - Babble error interrupt mask - 12 - 1 - - - NAKMSK - NAK interrupt mask - 13 - 1 - - - NYETMSK - NYET interrupt mask - 14 - 1 - - - - - - - OTG_HS_PWRCLK - USB on the go high speed - USB_OTG_HS - 0x40040E00 - - 0x0 - 0x3F200 - registers - - - OTG_HS_EP1_OUT - USB On The Go HS End Point 1 Out global - interrupt - 74 - - - OTG_HS_EP1_IN - USB On The Go HS End Point 1 In global - interrupt - 75 - - - OTG_HS_WKUP - USB On The Go HS Wakeup through EXTI - interrupt - 76 - - - OTG_HS - USB On The Go HS global - interrupt - 77 - - - - PCGCR - PCGCR - Power and clock gating control register - 0x0 - 0x20 - read-write - 0x00000000 - - - STPPCLK - Stop PHY clock - 0 - 1 - - - GATEHCLK - Gate HCLK - 1 - 1 - - - PHYSUSP - PHY suspended - 4 - 1 - - - - - - - NVIC - Nested Vectored Interrupt Controller - NVIC - 0xE000E100 - - 0x0 - 0x369 - registers - - - - ISER0 - ISER0 - Interrupt Set-Enable Register - 0x0 - 0x20 - read-write - 0x00000000 - - - SETENA - SETENA - 0 - 32 - - - - - ISER1 - ISER1 - Interrupt Set-Enable Register - 0x4 - 0x20 - read-write - 0x00000000 - - - SETENA - SETENA - 0 - 32 - - - - - ISER2 - ISER2 - Interrupt Set-Enable Register - 0x8 - 0x20 - read-write - 0x00000000 - - - SETENA - SETENA - 0 - 32 - - - - - ICER0 - ICER0 - Interrupt Clear-Enable Register - 0x80 - 0x20 - read-write - 0x00000000 - - - CLRENA - CLRENA - 0 - 32 - - - - - ICER1 - ICER1 - Interrupt Clear-Enable Register - 0x84 - 0x20 - read-write - 0x00000000 - - - CLRENA - CLRENA - 0 - 32 - - - - - ICER2 - ICER2 - Interrupt Clear-Enable Register - 0x88 - 0x20 - read-write - 0x00000000 - - - CLRENA - CLRENA - 0 - 32 - - - - - ISPR0 - ISPR0 - Interrupt Set-Pending Register - 0x100 - 0x20 - read-write - 0x00000000 - - - SETPEND - SETPEND - 0 - 32 - - - - - ISPR1 - ISPR1 - Interrupt Set-Pending Register - 0x104 - 0x20 - read-write - 0x00000000 - - - SETPEND - SETPEND - 0 - 32 - - - - - ISPR2 - ISPR2 - Interrupt Set-Pending Register - 0x108 - 0x20 - read-write - 0x00000000 - - - SETPEND - SETPEND - 0 - 32 - - - - - ICPR0 - ICPR0 - Interrupt Clear-Pending Register - 0x180 - 0x20 - read-write - 0x00000000 - - - CLRPEND - CLRPEND - 0 - 32 - - - - - ICPR1 - ICPR1 - Interrupt Clear-Pending Register - 0x184 - 0x20 - read-write - 0x00000000 - - - CLRPEND - CLRPEND - 0 - 32 - - - - - ICPR2 - ICPR2 - Interrupt Clear-Pending Register - 0x188 - 0x20 - read-write - 0x00000000 - - - CLRPEND - CLRPEND - 0 - 32 - - - - - IABR0 - IABR0 - Interrupt Active Bit Register - 0x200 - 0x20 - read-only - 0x00000000 - - - ACTIVE - ACTIVE - 0 - 32 - - - - - IABR1 - IABR1 - Interrupt Active Bit Register - 0x204 - 0x20 - read-only - 0x00000000 - - - ACTIVE - ACTIVE - 0 - 32 - - - - - IABR2 - IABR2 - Interrupt Active Bit Register - 0x208 - 0x20 - read-only - 0x00000000 - - - ACTIVE - ACTIVE - 0 - 32 - - - - - IPR0 - IPR0 - Interrupt Priority Register - 0x300 - 0x20 - read-write - 0x00000000 - - - IPR_N0 - IPR_N0 - 0 - 8 - - - IPR_N1 - IPR_N1 - 8 - 8 - - - IPR_N2 - IPR_N2 - 16 - 8 - - - IPR_N3 - IPR_N3 - 24 - 8 - - - - - IPR1 - IPR1 - Interrupt Priority Register - 0x304 - 0x20 - read-write - 0x00000000 - - - IPR_N0 - IPR_N0 - 0 - 8 - - - IPR_N1 - IPR_N1 - 8 - 8 - - - IPR_N2 - IPR_N2 - 16 - 8 - - - IPR_N3 - IPR_N3 - 24 - 8 - - - - - IPR2 - IPR2 - Interrupt Priority Register - 0x308 - 0x20 - read-write - 0x00000000 - - - IPR_N0 - IPR_N0 - 0 - 8 - - - IPR_N1 - IPR_N1 - 8 - 8 - - - IPR_N2 - IPR_N2 - 16 - 8 - - - IPR_N3 - IPR_N3 - 24 - 8 - - - - - IPR3 - IPR3 - Interrupt Priority Register - 0x30C - 0x20 - read-write - 0x00000000 - - - IPR_N0 - IPR_N0 - 0 - 8 - - - IPR_N1 - IPR_N1 - 8 - 8 - - - IPR_N2 - IPR_N2 - 16 - 8 - - - IPR_N3 - IPR_N3 - 24 - 8 - - - - - IPR4 - IPR4 - Interrupt Priority Register - 0x310 - 0x20 - read-write - 0x00000000 - - - IPR_N0 - IPR_N0 - 0 - 8 - - - IPR_N1 - IPR_N1 - 8 - 8 - - - IPR_N2 - IPR_N2 - 16 - 8 - - - IPR_N3 - IPR_N3 - 24 - 8 - - - - - IPR5 - IPR5 - Interrupt Priority Register - 0x314 - 0x20 - read-write - 0x00000000 - - - IPR_N0 - IPR_N0 - 0 - 8 - - - IPR_N1 - IPR_N1 - 8 - 8 - - - IPR_N2 - IPR_N2 - 16 - 8 - - - IPR_N3 - IPR_N3 - 24 - 8 - - - - - IPR6 - IPR6 - Interrupt Priority Register - 0x318 - 0x20 - read-write - 0x00000000 - - - IPR_N0 - IPR_N0 - 0 - 8 - - - IPR_N1 - IPR_N1 - 8 - 8 - - - IPR_N2 - IPR_N2 - 16 - 8 - - - IPR_N3 - IPR_N3 - 24 - 8 - - - - - IPR7 - IPR7 - Interrupt Priority Register - 0x31C - 0x20 - read-write - 0x00000000 - - - IPR_N0 - IPR_N0 - 0 - 8 - - - IPR_N1 - IPR_N1 - 8 - 8 - - - IPR_N2 - IPR_N2 - 16 - 8 - - - IPR_N3 - IPR_N3 - 24 - 8 - - - - - IPR8 - IPR8 - Interrupt Priority Register - 0x320 - 0x20 - read-write - 0x00000000 - - - IPR_N0 - IPR_N0 - 0 - 8 - - - IPR_N1 - IPR_N1 - 8 - 8 - - - IPR_N2 - IPR_N2 - 16 - 8 - - - IPR_N3 - IPR_N3 - 24 - 8 - - - - - IPR9 - IPR9 - Interrupt Priority Register - 0x324 - 0x20 - read-write - 0x00000000 - - - IPR_N0 - IPR_N0 - 0 - 8 - - - IPR_N1 - IPR_N1 - 8 - 8 - - - IPR_N2 - IPR_N2 - 16 - 8 - - - IPR_N3 - IPR_N3 - 24 - 8 - - - - - IPR10 - IPR10 - Interrupt Priority Register - 0x328 - 0x20 - read-write - 0x00000000 - - - IPR_N0 - IPR_N0 - 0 - 8 - - - IPR_N1 - IPR_N1 - 8 - 8 - - - IPR_N2 - IPR_N2 - 16 - 8 - - - IPR_N3 - IPR_N3 - 24 - 8 - - - - - IPR11 - IPR11 - Interrupt Priority Register - 0x32C - 0x20 - read-write - 0x00000000 - - - IPR_N0 - IPR_N0 - 0 - 8 - - - IPR_N1 - IPR_N1 - 8 - 8 - - - IPR_N2 - IPR_N2 - 16 - 8 - - - IPR_N3 - IPR_N3 - 24 - 8 - - - - - IPR12 - IPR12 - Interrupt Priority Register - 0x330 - 0x20 - read-write - 0x00000000 - - - IPR_N0 - IPR_N0 - 0 - 8 - - - IPR_N1 - IPR_N1 - 8 - 8 - - - IPR_N2 - IPR_N2 - 16 - 8 - - - IPR_N3 - IPR_N3 - 24 - 8 - - - - - IPR13 - IPR13 - Interrupt Priority Register - 0x334 - 0x20 - read-write - 0x00000000 - - - IPR_N0 - IPR_N0 - 0 - 8 - - - IPR_N1 - IPR_N1 - 8 - 8 - - - IPR_N2 - IPR_N2 - 16 - 8 - - - IPR_N3 - IPR_N3 - 24 - 8 - - - - - IPR14 - IPR14 - Interrupt Priority Register - 0x338 - 0x20 - read-write - 0x00000000 - - - IPR_N0 - IPR_N0 - 0 - 8 - - - IPR_N1 - IPR_N1 - 8 - 8 - - - IPR_N2 - IPR_N2 - 16 - 8 - - - IPR_N3 - IPR_N3 - 24 - 8 - - - - - IPR15 - IPR15 - Interrupt Priority Register - 0x33C - 0x20 - read-write - 0x00000000 - - - IPR_N0 - IPR_N0 - 0 - 8 - - - IPR_N1 - IPR_N1 - 8 - 8 - - - IPR_N2 - IPR_N2 - 16 - 8 - - - IPR_N3 - IPR_N3 - 24 - 8 - - - - - IPR16 - IPR16 - Interrupt Priority Register - 0x340 - 0x20 - read-write - 0x00000000 - - - IPR_N0 - IPR_N0 - 0 - 8 - - - IPR_N1 - IPR_N1 - 8 - 8 - - - IPR_N2 - IPR_N2 - 16 - 8 - - - IPR_N3 - IPR_N3 - 24 - 8 - - - - - IPR17 - IPR17 - Interrupt Priority Register - 0x344 - 0x20 - read-write - 0x00000000 - - - IPR_N0 - IPR_N0 - 0 - 8 - - - IPR_N1 - IPR_N1 - 8 - 8 - - - IPR_N2 - IPR_N2 - 16 - 8 - - - IPR_N3 - IPR_N3 - 24 - 8 - - - - - IPR18 - IPR18 - Interrupt Priority Register - 0x348 - 0x20 - read-write - 0x00000000 - - - IPR_N0 - IPR_N0 - 0 - 8 - - - IPR_N1 - IPR_N1 - 8 - 8 - - - IPR_N2 - IPR_N2 - 16 - 8 - - - IPR_N3 - IPR_N3 - 24 - 8 - - - - - IPR19 - IPR19 - Interrupt Priority Register - 0x34C - 0x20 - read-write - 0x00000000 - - - IPR_N0 - IPR_N0 - 0 - 8 - - - IPR_N1 - IPR_N1 - 8 - 8 - - - IPR_N2 - IPR_N2 - 16 - 8 - - - IPR_N3 - IPR_N3 - 24 - 8 - - - - - IPR20 - IPR20 - Interrupt Priority Register - 0x350 - 0x20 - read-write - 0x00000000 - - - IPR_N0 - IPR_N0 - 0 - 8 - - - IPR_N1 - IPR_N1 - 8 - 8 - - - IPR_N2 - IPR_N2 - 16 - 8 - - - IPR_N3 - IPR_N3 - 24 - 8 - - - - - IPR21 - IPR21 - Interrupt Priority Register - 0x354 - 0x20 - read-write - 0x00000000 - - - IPR_N0 - IPR_N0 - 0 - 8 - - - IPR_N1 - IPR_N1 - 8 - 8 - - - IPR_N2 - IPR_N2 - 16 - 8 - - - IPR_N3 - IPR_N3 - 24 - 8 - - - - - IPR22 - IPR22 - Interrupt Priority Register - 0x358 - 0x20 - read-write - 0x00000000 - - - IPR_N0 - IPR_N0 - 0 - 8 - - - IPR_N1 - IPR_N1 - 8 - 8 - - - IPR_N2 - IPR_N2 - 16 - 8 - - - IPR_N3 - IPR_N3 - 24 - 8 - - - - - IPR23 - IPR23 - Interrupt Priority Register - 0x35C - 0x20 - read-write - 0x00000000 - - - IPR_N0 - IPR_N0 - 0 - 8 - - - IPR_N1 - IPR_N1 - 8 - 8 - - - IPR_N2 - IPR_N2 - 16 - 8 - - - IPR_N3 - IPR_N3 - 24 - 8 - - - - - IPR24 - IPR24 - Interrupt Priority Register - 0x360 - 0x20 - read-write - 0x00000000 - - - IPR_N0 - IPR_N0 - 0 - 8 - - - IPR_N1 - IPR_N1 - 8 - 8 - - - IPR_N2 - IPR_N2 - 16 - 8 - - - IPR_N3 - IPR_N3 - 24 - 8 - - - - - IPR25 - IPR25 - Interrupt Priority Register - 0x364 - 0x20 - read-write - 0x00000000 - - - IPR_N0 - IPR_N0 - 0 - 8 - - - IPR_N1 - IPR_N1 - 8 - 8 - - - IPR_N2 - IPR_N2 - 16 - 8 - - - IPR_N3 - IPR_N3 - 24 - 8 - - - - - - - MPU - Memory protection unit - MPU - 0xE000ED90 - - 0x0 - 0x15 - registers - - - - TYPER - TYPER - MPU type register - 0x0 - 0x20 - read-only - 0x00000800 - - - SEPARATE - Separate flag - 0 - 1 - - - DREGION - Number of MPU data regions - 8 - 8 - - - IREGION - Number of MPU instruction regions - 16 - 8 - - - - - CTRL - CTRL - MPU control register - 0x4 - 0x20 - read-only - 0x00000000 - - - ENABLE - Enables the MPU - 0 - 1 - - - HFNMIENA - Enables the operation of MPU during hard fault - 1 - 1 - - - PRIVDEFENA - Enable priviliged software access to default memory map - 2 - 1 - - - - - RNR - RNR - MPU region number register - 0x8 - 0x20 - read-write - 0x00000000 - - - REGION - MPU region - 0 - 8 - - - - - RBAR - RBAR - MPU region base address register - 0xC - 0x20 - read-write - 0x00000000 - - - REGION - MPU region field - 0 - 4 - - - VALID - MPU region number valid - 4 - 1 - - - ADDR - Region base address field - 5 - 27 - - - - - RASR - RASR - MPU region attribute and size register - 0x10 - 0x20 - read-write - 0x00000000 - - - ENABLE - Region enable bit. - 0 - 1 - - - SIZE - Size of the MPU protection region - 1 - 5 - - - SRD - Subregion disable bits - 8 - 8 - - - B - memory attribute - 16 - 1 - - - C - memory attribute - 17 - 1 - - - S - Shareable memory attribute - 18 - 1 - - - TEX - memory attribute - 19 - 3 - - - AP - Access permission - 24 - 3 - - - XN - Instruction access disable bit - 28 - 1 - - - - - - - STK - SysTick timer - STK - 0xE000E010 - - 0x0 - 0x11 - registers - - - - CSR - CSR - SysTick control and status register - 0x0 - 0x20 - read-write - 0x00000000 - - - ENABLE - Counter enable - 0 - 1 - - - TICKINT - SysTick exception request enable - 1 - 1 - - - CLKSOURCE - Clock source selection - 2 - 1 - - - COUNTFLAG - COUNTFLAG - 16 - 1 - - - - - RVR - RVR - SysTick reload value register - 0x4 - 0x20 - read-write - 0x00000000 - - - RELOAD - RELOAD value - 0 - 24 - - - - - CVR - CVR - SysTick current value register - 0x8 - 0x20 - read-write - 0x00000000 - - - CURRENT - Current counter value - 0 - 24 - - - - - CALIB - CALIB - SysTick calibration value register - 0xC - 0x20 - read-write - 0x00000000 - - - TENMS - Calibration value - 0 - 24 - - - SKEW - SKEW flag: Indicates whether the TENMS value is exact - 30 - 1 - - - NOREF - NOREF flag. Reads as zero - 31 - 1 - - - - - - - NVIC_STIR - Nested vectored interrupt controller - NVIC - 0xE000EF00 - - 0x0 - 0x5 - registers - - - - STIR - STIR - Software trigger interrupt register - 0x0 - 0x20 - read-write - 0x00000000 - - - INTID - Software generated interrupt ID - 0 - 9 - - - - - - - FPU_CPACR - Floating point unit CPACR - FPU - 0xE000ED88 - - 0x0 - 0x5 - registers - - - - CPACR - CPACR - Coprocessor access control register - 0x0 - 0x20 - read-write - 0x00000000 - - - CP - CP - 20 - 4 - - - - - - - SCB_ACTRL - System control block ACTLR - SCB - 0xE000E008 - - 0x0 - 0x5 - registers - - - - ACTRL - ACTRL - Auxiliary control register - 0x0 - 0x20 - read-write - 0x00000000 - - - DISFOLD - DISFOLD - 2 - 1 - - - FPEXCODIS - FPEXCODIS - 10 - 1 - - - DISRAMODE - DISRAMODE - 11 - 1 - - - DISITMATBFLUSH - DISITMATBFLUSH - 12 - 1 - - - - - - - FPU - Floting point unit - FPU - 0xE000EF34 - - 0x0 - 0xD - registers - - - FPU - Floating point unit interrupt - 81 - - - - FPCCR - FPCCR - Floating-point context control register - 0x0 - 0x20 - read-write - 0x00000000 - - - LSPACT - LSPACT - 0 - 1 - - - USER - USER - 1 - 1 - - - THREAD - THREAD - 3 - 1 - - - HFRDY - HFRDY - 4 - 1 - - - MMRDY - MMRDY - 5 - 1 - - - BFRDY - BFRDY - 6 - 1 - - - MONRDY - MONRDY - 8 - 1 - - - LSPEN - LSPEN - 30 - 1 - - - ASPEN - ASPEN - 31 - 1 - - - - - FPCAR - FPCAR - Floating-point context address register - 0x4 - 0x20 - read-write - 0x00000000 - - - ADDRESS - Location of unpopulated floating-point - 3 - 29 - - - - - FPSCR - FPSCR - Floating-point status control register - 0x8 - 0x20 - read-write - 0x00000000 - - - IOC - Invalid operation cumulative exception bit - 0 - 1 - - - DZC - Division by zero cumulative exception bit. - 1 - 1 - - - OFC - Overflow cumulative exception bit - 2 - 1 - - - UFC - Underflow cumulative exception bit - 3 - 1 - - - IXC - Inexact cumulative exception bit - 4 - 1 - - - IDC - Input denormal cumulative exception bit. - 7 - 1 - - - RMode - Rounding Mode control field - 22 - 2 - - - FZ - Flush-to-zero mode control bit: - 24 - 1 - - - DN - Default NaN mode control bit - 25 - 1 - - - AHP - Alternative half-precision control bit - 26 - 1 - - - V - Overflow condition code flag - 28 - 1 - - - C - Carry condition code flag - 29 - 1 - - - Z - Zero condition code flag - 30 - 1 - - - N - Negative condition code flag - 31 - 1 - - - - - - - SCB - System control block - SCB - 0xE000ED00 - - 0x0 - 0x41 - registers - - - - CPUID - CPUID - CPUID base register - 0x0 - 0x20 - read-only - 0x410FC241 - - - Revision - Revision number - 0 - 4 - - - PartNo - Part number of the processor - 4 - 12 - - - Constant - Reads as 0xF - 16 - 4 - - - Variant - Variant number - 20 - 4 - - - Implementer - Implementer code - 24 - 8 - - - - - ICSR - ICSR - Interrupt control and state register - 0x4 - 0x20 - read-write - 0x00000000 - - - VECTACTIVE - Active vector - 0 - 9 - - - RETTOBASE - Return to base level - 11 - 1 - - - VECTPENDING - Pending vector - 12 - 7 - - - ISRPENDING - Interrupt pending flag - 22 - 1 - - - PENDSTCLR - SysTick exception clear-pending bit - 25 - 1 - - - PENDSTSET - SysTick exception set-pending bit - 26 - 1 - - - PENDSVCLR - PendSV clear-pending bit - 27 - 1 - - - PENDSVSET - PendSV set-pending bit - 28 - 1 - - - NMIPENDSET - NMI set-pending bit. - 31 - 1 - - - - - VTOR - VTOR - Vector table offset register - 0x8 - 0x20 - read-write - 0x00000000 - - - TBLOFF - Vector table base offset field - 9 - 21 - - - - - AIRCR - AIRCR - Application interrupt and reset control register - 0xC - 0x20 - read-write - 0x00000000 - - - VECTRESET - VECTRESET - 0 - 1 - - - VECTCLRACTIVE - VECTCLRACTIVE - 1 - 1 - - - SYSRESETREQ - SYSRESETREQ - 2 - 1 - - - PRIGROUP - PRIGROUP - 8 - 3 - - - ENDIANESS - ENDIANESS - 15 - 1 - - - VECTKEYSTAT - Register key - 16 - 16 - - - - - SCR - SCR - System control register - 0x10 - 0x20 - read-write - 0x00000000 - - - SLEEPONEXIT - SLEEPONEXIT - 1 - 1 - - - SLEEPDEEP - SLEEPDEEP - 2 - 1 - - - SEVEONPEND - Send Event on Pending bit - 4 - 1 - - - - - CCR - CCR - Configuration and control register - 0x14 - 0x20 - read-write - 0x00000000 - - - NONBASETHRDENA - Configures how the processor enters Thread mode - 0 - 1 - - - USERSETMPEND - USERSETMPEND - 1 - 1 - - - UNALIGN__TRP - UNALIGN_ TRP - 3 - 1 - - - DIV_0_TRP - DIV_0_TRP - 4 - 1 - - - BFHFNMIGN - BFHFNMIGN - 8 - 1 - - - STKALIGN - STKALIGN - 9 - 1 - - - DC - DC - 16 - 1 - - - IC - IC - 17 - 1 - - - BP - BP - 18 - 1 - - - - - SHPR1 - SHPR1 - System handler priority registers - 0x18 - 0x20 - read-write - 0x00000000 - - - PRI_4 - Priority of system handler 4 - 0 - 8 - - - PRI_5 - Priority of system handler 5 - 8 - 8 - - - PRI_6 - Priority of system handler 6 - 16 - 8 - - - - - SHPR2 - SHPR2 - System handler priority registers - 0x1C - 0x20 - read-write - 0x00000000 - - - PRI_11 - Priority of system handler 11 - 24 - 8 - - - - - SHPR3 - SHPR3 - System handler priority registers - 0x20 - 0x20 - read-write - 0x00000000 - - - PRI_14 - Priority of system handler 14 - 16 - 8 - - - PRI_15 - Priority of system handler 15 - 24 - 8 - - - - - SHCRS - SHCRS - System handler control and state register - 0x24 - 0x20 - read-write - 0x00000000 - - - MEMFAULTACT - Memory management fault exception active bit - 0 - 1 - - - BUSFAULTACT - Bus fault exception active bit - 1 - 1 - - - USGFAULTACT - Usage fault exception active bit - 3 - 1 - - - SVCALLACT - SVC call active bit - 7 - 1 - - - MONITORACT - Debug monitor active bit - 8 - 1 - - - PENDSVACT - PendSV exception active bit - 10 - 1 - - - SYSTICKACT - SysTick exception active bit - 11 - 1 - - - USGFAULTPENDED - Usage fault exception pending bit - 12 - 1 - - - MEMFAULTPENDED - Memory management fault exception pending bit - 13 - 1 - - - BUSFAULTPENDED - Bus fault exception pending bit - 14 - 1 - - - SVCALLPENDED - SVC call pending bit - 15 - 1 - - - MEMFAULTENA - Memory management fault enable bit - 16 - 1 - - - BUSFAULTENA - Bus fault enable bit - 17 - 1 - - - USGFAULTENA - Usage fault enable bit - 18 - 1 - - - - - CFSR_UFSR_BFSR_MMFSR - CFSR_UFSR_BFSR_MMFSR - Configurable fault status register - 0x28 - 0x20 - read-write - 0x00000000 - - - IACCVIOL - IACCVIOL - 0 - 1 - - - DACCVIOL - DACCVIOL - 1 - 1 - - - MUNSTKERR - MUNSTKERR - 3 - 1 - - - MSTKERR - MSTKERR - 4 - 1 - - - MLSPERR - MLSPERR - 5 - 1 - - - MMARVALID - MMARVALID - 7 - 1 - - - IBUSERR - Instruction bus error - 8 - 1 - - - PRECISERR - Precise data bus error - 9 - 1 - - - IMPRECISERR - Imprecise data bus error - 10 - 1 - - - UNSTKERR - Bus fault on unstacking for a return from exception - 11 - 1 - - - STKERR - Bus fault on stacking for exception entry - 12 - 1 - - - LSPERR - Bus fault on floating-point lazy state preservation - 13 - 1 - - - BFARVALID - Bus Fault Address Register (BFAR) valid flag - 15 - 1 - - - UNDEFINSTR - Undefined instruction usage fault - 16 - 1 - - - INVSTATE - Invalid state usage fault - 17 - 1 - - - INVPC - Invalid PC load usage fault - 18 - 1 - - - NOCP - No coprocessor usage fault. - 19 - 1 - - - UNALIGNED - Unaligned access usage fault - 24 - 1 - - - DIVBYZERO - Divide by zero usage fault - 25 - 1 - - - - - HFSR - HFSR - Hard fault status register - 0x2C - 0x20 - read-write - 0x00000000 - - - VECTTBL - Vector table hard fault - 1 - 1 - - - FORCED - Forced hard fault - 30 - 1 - - - DEBUG_VT - Reserved for Debug use - 31 - 1 - - - - - MMFAR - MMFAR - Memory management fault address register - 0x34 - 0x20 - read-write - 0x00000000 - - - ADDRESS - Memory management fault address - 0 - 32 - - - - - BFAR - BFAR - Bus fault address register - 0x38 - 0x20 - read-write - 0x00000000 - - - ADDRESS - Bus fault address - 0 - 32 - - - - - - - PF - Processor features - PF - 0xE000ED78 - - 0x0 - 0xD - registers - - - - CLIDR - CLIDR - Cache Level ID register - 0x0 - 0x20 - read-only - 0x09000003 - - - CL1 - CL1 - 0 - 3 - - - CL2 - CL2 - 3 - 3 - - - CL3 - CL3 - 6 - 3 - - - CL4 - CL4 - 9 - 3 - - - CL5 - CL5 - 12 - 3 - - - CL6 - CL6 - 15 - 3 - - - CL7 - CL7 - 18 - 3 - - - LoUIS - LoUIS - 21 - 3 - - - LoC - LoC - 24 - 3 - - - LoU - LoU - 27 - 3 - - - - - CTR - CTR - Cache Type register - 0x4 - 0x20 - read-only - 0x8303C003 - - - _IminLine - IminLine - 0 - 4 - - - DMinLine - DMinLine - 16 - 4 - - - ERG - ERG - 20 - 4 - - - CWG - CWG - 24 - 4 - - - Format - Format - 29 - 3 - - - - - CCSIDR - CCSIDR - Cache Size ID register - 0x8 - 0x20 - read-only - 0x00000000 - - - LineSize - LineSize - 0 - 3 - - - Associativity - Associativity - 3 - 10 - - - NumSets - NumSets - 13 - 15 - - - WA - WA - 28 - 1 - - - RA - RA - 29 - 1 - - - WB - WB - 30 - 1 - - - WT - WT - 31 - 1 - - - - - - - AC - Access control - AC - 0xE000EF90 - - 0x0 - 0x1D - registers - - - - ITCMCR - ITCMCR - Instruction and Data Tightly-Coupled Memory Control Registers - 0x0 - 0x20 - read-write - 0x00000000 - - - EN - EN - 0 - 1 - - - RMW - RMW - 1 - 1 - - - RETEN - RETEN - 2 - 1 - - - SZ - SZ - 3 - 4 - - - - - DTCMCR - DTCMCR - Instruction and Data Tightly-Coupled Memory Control Registers - 0x4 - 0x20 - read-write - 0x00000000 - - - EN - EN - 0 - 1 - - - RMW - RMW - 1 - 1 - - - RETEN - RETEN - 2 - 1 - - - SZ - SZ - 3 - 4 - - - - - AHBPCR - AHBPCR - AHBP Control register - 0x8 - 0x20 - read-write - 0x00000000 - - - EN - EN - 0 - 1 - - - SZ - SZ - 1 - 3 - - - - - CACR - CACR - Auxiliary Cache Control register - 0xC - 0x20 - read-write - 0x00000000 - - - SIWT - SIWT - 0 - 1 - - - ECCEN - ECCEN - 1 - 1 - - - FORCEWT - FORCEWT - 2 - 1 - - - - - AHBSCR - AHBSCR - AHB Slave Control register - 0x10 - 0x20 - read-write - 0x00000000 - - - CTL - CTL - 0 - 2 - - - TPRI - TPRI - 2 - 9 - - - INITCOUNT - INITCOUNT - 11 - 5 - - - - - ABFSR - ABFSR - Auxiliary Bus Fault Status register - 0x18 - 0x20 - read-write - 0x00000000 - - - ITCM - ITCM - 0 - 1 - - - DTCM - DTCM - 1 - 1 - - - AHBP - AHBP - 2 - 1 - - - AXIM - AXIM - 3 - 1 - - - EPPB - EPPB - 4 - 1 - - - AXIMTYPE - AXIMTYPE - 8 - 2 - - - - - - - \ No newline at end of file diff --git a/Tools/Toolsets/pico.json b/Tools/Toolsets/pico.json deleted file mode 100644 index 15f589c1..00000000 --- a/Tools/Toolsets/pico.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "schemaVersion": "1.0", - "swiftCompiler": { - "extraCLIOptions": [ - "-Xfrontend", "-disable-stack-protector", - "-enable-experimental-feature", "Embedded", - "-Xcc", "-mcpu=cortex-m0plus" - ] - }, - "linker": { - "extraCLIOptions": [ - "-arch", "armv6m", - "-dead_strip", - "-static", - "-e", "_reset", - "-no_zero_fill_sections", - "-segalign", "4", - "-segaddr", "__RESET", "0x20000000", - "-segaddr", "__VECTORS", "0x20000100", - "-seg1addr", "0x20000200", - "-pagezero_size", "0" - ] - } -} diff --git a/Tools/Toolsets/pico2.json b/Tools/Toolsets/pico2.json deleted file mode 100644 index 873afca3..00000000 --- a/Tools/Toolsets/pico2.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "schemaVersion": "1.0", - "swiftCompiler": { - "extraCLIOptions": [ - "-Xfrontend", "-disable-stack-protector", - "-enable-experimental-feature", "Embedded" - ] - }, - "linker": { - "extraCLIOptions": [ - "-arch", "armv7em", - "-dead_strip", - "-static", - "-e", "_reset", - "-no_zero_fill_sections", - "-segalign", "4", - "-segaddr", "__VECTORS", "0x20000000", - "-segaddr", "__RESET", "0x20000200", - "-seg1addr", "0x20000300", - "-pagezero_size", "0" - ] - } -} diff --git a/Tools/Toolsets/rpi-5-elf.json b/Tools/Toolsets/rpi-5-elf.json deleted file mode 100644 index 88d9a133..00000000 --- a/Tools/Toolsets/rpi-5-elf.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "schemaVersion": "1.0", - "swiftCompiler": { - "extraCLIOptions": [ - "-Xfrontend", "-disable-stack-protector", - "-Xfrontend", "-function-sections", - "-enable-experimental-feature", "Embedded", - "-Xfrontend", "-mergeable-symbols", - "-Xclang-linker", "-fuse-ld=lld", - "-Xclang-linker", "-nostdlib" - ] - }, - "linker": { - "extraCLIOptions": [ - "-T", "Sources/Support/linkerscript.ld", - "--unresolved-symbols=ignore-in-object-files" - ] - } -} diff --git a/Tools/Toolsets/stm32f74x-lcd.json b/Tools/Toolsets/stm32f74x-lcd.json deleted file mode 100644 index e6983782..00000000 --- a/Tools/Toolsets/stm32f74x-lcd.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "schemaVersion": "1.0", - "swiftCompiler": { - "extraCLIOptions": [ - "-Xfrontend", "-disable-stack-protector", - "-enable-experimental-feature", "Embedded" - ] - }, - "linker": { - "extraCLIOptions": [ - "-arch", "armv7em", - "-dead_strip", - "-static", - "-e", "_reset", - "-no_zero_fill_sections", - "-segalign", "4", - "-segaddr", "__VECTORS", "0x00200000", - "-seg1addr", "0x00200200", - "-pagezero_size", "0" - ] - } -} diff --git a/Tools/Toolsets/stm32f74x.json b/Tools/Toolsets/stm32f74x.json deleted file mode 100644 index b22fb6e6..00000000 --- a/Tools/Toolsets/stm32f74x.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "schemaVersion": "1.0", - "swiftCompiler": { - "extraCLIOptions": [ - "-Xfrontend", "-disable-stack-protector", - "-enable-experimental-feature", "Embedded" - ] - }, - "linker": { - "extraCLIOptions": [ - "-arch", "armv7em", - "-dead_strip", - "-static", - "-e", "_reset", - "-no_zero_fill_sections", - "-segalign", "4", - "-segaddr", "__VECTORS", "0x20010000", - "-seg1addr", "0x20010200", - "-pagezero_size", "0" - ] - } -} diff --git a/Tools/elf2hex.py b/Tools/elf2hex.py deleted file mode 100755 index acb84502..00000000 --- a/Tools/elf2hex.py +++ /dev/null @@ -1,139 +0,0 @@ -#! /usr/bin/env -S uv run --script - -# /// script -# dependencies = [ -# "pyelftools==0.31", -# ] -# /// - -# This source file is part of the Swift open source project -# -# Copyright (c) 2023 Apple Inc. and the Swift project authors. -# Licensed under Apache License v2.0 with Runtime Library Exception -# -# See https://swift.org/LICENSE.txt for license information - -# -# elf2hex -- Converts a statically-linked ELF executable into an "Intel HEX" -# file format suitable for flashing onto some embedded devices. -# -# Usage: -# $ elf2hex.py [--symbol-map ] [--relocate-data-segment] -# -# Example: -# $ elf2hex.py ./blink ./blink.hex --symbol-map ./blink.symbols -# -# The --relocate-data-segment option expects to be able to locate symbols with names -# - __data_start -# - __flash_data_start -# - __flash_data_len -# and then it physically relocates a segment located at __data_start to -# __flash_data_start, without changing virtual/physical addresses of any ELF -# headers. This means that the .hex file is not validly mapped until a boot-time -# reverse relocation step. -# -# See the linker script used in a particular demo folder for a detailed -# explanation of the linking, packing, and runtime relocation scheme. -# - -import argparse -import json -import pathlib - -import elftools.elf.elffile - - -def main(): - parser = argparse.ArgumentParser() - parser.add_argument('input') - parser.add_argument('output') - parser.add_argument('--symbol-map') - parser.add_argument('--relocate-data-segment', action='store_true') - args = parser.parse_args() - - inf = open(args.input, "rb") - outf = open(args.output, "wb") - - def emitrecord(record): - checksum = 0 - pos = 0 - while pos < len(record): - checksum = (checksum + int(record[pos:pos + 2], 16)) % 256 - pos += 2 - checksum = (256 - checksum) % 256 - outf.write((":" + record + f"{checksum:02X}" + "\n").encode()) - - def emit(vmaddr, data): - pos = 0 - while pos < len(data): - chunklen = min(16, len(data) - pos) - chunk = data[pos:pos + chunklen] - chunkhex = chunk.hex().upper() - - assert vmaddr < 0x100000000, f"vmaddr: {vmaddr:x}" - vmaddr_high = (vmaddr >> 16) & 0xffff - recordtype = "04" # Extended Linear Address - emitrecord(f"{2:02X}{0:04X}{recordtype}{vmaddr_high:04X}") - - vmaddr_low = vmaddr & 0xffff - recordtype = "00" # Data - emitrecord(f"{chunklen:02X}{vmaddr_low:04X}{recordtype}{chunkhex}") - - pos += chunklen - vmaddr += chunklen - - elffile = elftools.elf.elffile.ELFFile(inf) - - symbol_map = {} - symtab_section = elffile.get_section_by_name(".symtab") - for s in symtab_section.iter_symbols(): - if s.entry.st_info.type not in ["STT_FUNC", "STT_NOTYPE"]: - continue - if s.name == "": - continue - symbol_map[s.name] = s.entry.st_value - - if args.symbol_map is not None: - pathlib.Path(args.symbol_map).write_text(json.dumps(symbol_map)) - - relocations = {} - if args.relocate_data_segment: - __flash_data_start = symbol_map["__flash_data_start"] - __data_start = symbol_map["__data_start"] - __flash_data_len = symbol_map["__flash_data_len"] - print("Relocation info:") - print(f" __flash_data_start = 0x{__flash_data_start:08x}") - print(f" __data_start = 0x{__data_start:08x}") - print(f" __flash_data_len = 0x{__flash_data_len:08x}") - relocations = {__data_start: __flash_data_start} - - for segment in elffile.iter_segments(): - if segment.header.p_type != "PT_LOAD": - continue - vmaddr = segment.header.p_paddr - data = segment.data() - flags = "" - flags += "r" if segment.header.p_flags & 0x4 else "-" - flags += "w" if segment.header.p_flags & 0x2 else "-" - flags += "x" if segment.header.p_flags & 0x1 else "-" - print(f"PT_LOAD {flags} at 0x{segment.header.p_paddr:08x} - " - f"0x{segment.header.p_paddr + len(data):08x}, " - f"size {len(data)} " - f"(0x{len(data):04x})") - placement_addr = segment.header.p_paddr - if segment.header.p_paddr in relocations: - placement_addr = relocations[segment.header.p_paddr] - print(f" ... relocating to 0x{placement_addr:08x}") - emit(placement_addr, data) - - chunklen = 0 - vmaddr = 0 - recordtype = "01" # EOF - emitrecord(f"{chunklen:02X}{vmaddr:04X}{recordtype}") - - inf.close() - outf.close() - - -if __name__ == '__main__': - main() diff --git a/Tools/macho2bin.py b/Tools/macho2bin.py deleted file mode 100755 index 842b4b2f..00000000 --- a/Tools/macho2bin.py +++ /dev/null @@ -1,111 +0,0 @@ -#! /usr/bin/env -S uv run --script - -# /// script -# dependencies = [ -# "macholib==1.16.3", -# ] -# /// - -# This source file is part of the Swift open source project -# -# Copyright (c) 2023 Apple Inc. and the Swift project authors. -# Licensed under Apache License v2.0 with Runtime Library Exception -# -# See https://swift.org/LICENSE.txt for license information - -# -# macho2bin -- Converts a statically-linked executable Mach-O into a flat "BIN" file -# suitable for flashing as a single contiguous blob onto some embedded devices. Note -# that this format assumes the embedded device can boot from a state where the entire -# firmware (all segments) are flashed contigously into one smalle address range. This -# is true for e.g. the STM32F746 devices if we place the vector table at 0x00200000, -# and code and data right after it, as the vector table also contains a pointer to the -# initial PC. This setup might not work for other devices. -# -# Usage: -# $ macho2bin.py --base-address --segments -# -# -# Example: -# $ macho2bin.py ./blink ./blink.bin --base-address 0x00200000 --segments -# '__TEXT,__DATA,__VECTORS' -# -# Requirements and notes: -# * The output BIN file is a flat contiguous representation of the segments -# (--segments) based on their VM addresses. -# * The BIN file's first byte corresponds to the specified base address -# (--base-address). -# * Any gaps between segments are filled with zero bytes. -# * Because of that, you want the input Mach-O to have all segments "close", and not -# have gaps. -# - -import argparse -import os - -from macholib import MachO -from macholib import mach_o - - -def main(): - parser = argparse.ArgumentParser() - parser.add_argument("input") - parser.add_argument("output") - parser.add_argument("--base-address", required=True) - parser.add_argument("--segments", required=True) - args = parser.parse_args() - args.base_address = int(args.base_address, 16) - args.segments = args.segments.split(",") - - segments = [] - macho = MachO.MachO(args.input) - assert len(macho.headers) == 1 - mh = macho.headers[0] - for command in mh.commands: - if isinstance(command[1], mach_o.segment_command): - (_, segment, sections) = command - segname = segment.segname.decode().strip("\0") - if segname not in args.segments: - continue - - with open(args.input, "rb") as f: - f.seek(mh.offset + segment.fileoff) - data = f.read(segment.filesize) - segments.append( - {"vmaddr": segment.vmaddr, "data": data, "name": segname} - ) - - segments = sorted(segments, key=lambda x: x["vmaddr"]) - - assert segments[0]["vmaddr"] == args.base_address, ( - f"first segment's vmaddr 0x{segments[0]['vmaddr']:08x} does not match the" - f" passed --base-address 0x{args.base_address:08x}" - ) - - if os.path.exists(args.output): - os.unlink(args.output) - - vmaddr = segments[0]["vmaddr"] - with open(args.output, "wb") as f: - for segment in segments: - gap = segment["vmaddr"] - vmaddr - if gap != 0: - print( - f"Writing gap of size {gap} (0x{gap:0x}) at vmaddr 0x{vmaddr:08x}" - ) - f.write(b"\0" * gap) - assert gap >= 0 - vmaddr = segment["vmaddr"] - print( - f"Writing segment {segment['name']} size" - f" {len(segment['data'])} (0x{len(segment['data']):x}) at vmaddr" - f" 0x{vmaddr:08x}" - ) - f.write(segment["data"]) - vmaddr = segment["vmaddr"] + len(segment["data"]) - - print(f"Produced {args.output} with {vmaddr - args.base_address} bytes") - - -if __name__ == "__main__": - main() diff --git a/Tools/macho2uf2.py b/Tools/macho2uf2.py deleted file mode 100755 index 39acd6c3..00000000 --- a/Tools/macho2uf2.py +++ /dev/null @@ -1,139 +0,0 @@ -#! /usr/bin/env -S uv run --script - -# /// script -# dependencies = [ -# "macholib==1.16.3", -# ] -# /// - -# This source file is part of the Swift open source project -# -# Copyright (c) 2023 Apple Inc. and the Swift project authors. -# Licensed under Apache License v2.0 with Runtime Library Exception -# -# See https://swift.org/LICENSE.txt for license information - -# -# macho2uf2 -- Converts a statically-linked executable Mach-O into a flat "UF2" file -# suitable for flashing as a single contiguous blob onto some embedded devices, in -# particular Raspberry Pi Pico (W). Note that the UF2 format allows for discontiguous -# memory regions, but this utility does not support that. -# -# Usage: -# $ macho2uf2.py --base-address --segments -# -# -# Example: -# $ macho2uf2.py ./blink ./blink.uf2 --base-address 0x00200000 --segments -# '__TEXT,__DATA,__VECTORS' -# -# Requirements and notes: -# * The output UF2 file is a flat contiguous representation of the segments -# (--segments) based on their VM addresses. -# * The UF2 file's first byte corresponds to the specified base address -# (--base-address). -# * Any gaps between segments are filled with zero bytes. -# * Because of that, you want the input Mach-O to have all segments "close", and not -# have gaps. -# - -import argparse -import os -import struct -import subprocess - -MY_DIR = os.path.dirname(os.path.abspath(__file__)) - - -def main(): - parser = argparse.ArgumentParser() - parser.add_argument("input") - parser.add_argument("output") - parser.add_argument("--base-address", required=True) - parser.add_argument("--segments", required=True) - parser.add_argument("--pico-family", required=True) - args = parser.parse_args() - args.base_address = int(args.base_address, 16) - args.segments = args.segments.split(",") - if args.pico_family == "rp2040": - family_id = 0xE48BFF56 - add_errata_block = False - elif args.pico_family == "rp2350": - family_id = 0xE48BFF59 - add_errata_block = True - else: - assert False - - subprocess.check_call( - [ - MY_DIR + "/macho2bin.py", - args.input, - args.input + ".bin", - "--base-address", - "0x%08x" % args.base_address, - "--segments", - ",".join(args.segments), - ] - ) - - def emit_block(output, block, vmaddr, block_number, num_blocks, family_id): - assert len(block) <= 256 - - if len(block) < 256: - block += b"\0" * (256 - len(block)) - - # UF2_Block header - output += struct.pack("/export.sh -$ idf.py set-target esp32c6 -$ idf.py build -``` - -## Running - -- Connect the Esp32-C6-Bug board (or any other board with integrated LED on GPIO pin 8) over a USB cable to your Mac. Alternatively you can just connect external LED to GPIO pin 8 on any other board. -- Connect RX pin of USB-UART converter to TX0 pin of your board if you need serial ouput. You may also need to connect GND converter pin to the GND pin of the board. -- Use `idf.py` to upload the firmware and to run it: - -```console -$ idf.py flash -``` - -- The LED should be blinking now. - -### Simulating in VS Code - -- Build the project, to generate binaries for simulation -- Install [Wokwi for VS Code](https://docs.wokwi.com/vscode/getting-started/). -- Open the `diagram.json` file. -- Click the Play button to start simulation. -- Click the Pause button to freeze simulation and display states of GPIOs. - diff --git a/esp32-led-blink-sdk/assets/images/ledoff.jpg b/esp32-led-blink-sdk/assets/images/ledoff.jpg deleted file mode 100644 index 81d3b93d1ca31bddb3dee7fea34f51841cdcbf84..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 213181 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 z%0A88ggZ1{!lswVQw7KhL+_)bLW9NVa%yrIQU)86MqzY)FNuob2NK6r1i_>jB@jvR zecr__NkykL>;~0S>4oS~#FB_s3*RBiK|LhCnTncYR?r3e?=fb$*!N7R=&~n=*pfmR z48&hz(3@0B?)KOU!+V)tW}`I-%em&))`GTyAkYj@GI)k~KB@r`7>37hc31+{3un;r zOTuy&JA4!#A<-g`zy|8CJKm9TQeF(1({6lrQTQy~?tRFZYpo{6;i*g)2#Xi%`A zXe=1Wu!#1`iT;-#4y|0pxD@?MOP$iibpb$h*s0RJZ`Md^k`uK5#ibY6^M3FGR{FXsWNjOt5)gT7I|4_*e_e;wqpsV)N zM}nq$tu>NEvhw>xsPe2ERDSK~Y#nZL5@R*&sG%cM^br&VaY~?~Et)qt*8!;rLEGd6 z;S!)mL~n=o(%uuP2-*3^x#vNG=V5mKuX>rYM$6ftEfFM=CSS^>{}E zR{9DLxgiXL4Bm@E6^0NcKD^D4M?w%xARn$0+BhhOECG^S+CpJ`Q7pLz4<_n?_bg

SSokF)5(w%ft&}iE@Mb7w$aRRoNBt<#;_}oe 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�N$tq=iffC+-N2oc0~fJoiZV-&PTZf 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

+yua0>Fgy) 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 E^dn~i-|M!$kIks-Fy}v6ZQx> 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

>hCZ22L%Lt-F}Nfga!1d%lzGTdl61 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 X?HB9imDBID&TJ&u$n72HAxv zVM`08kaZa0m)nHXfdU$jjI(7DKc+g+hYs=oaNJ~w)iiN*XJ!@nUl(}I&&cJ0@;L15 z?;zYNWm+r!k+CwYdq=6y7!*Fd%kmUsbE#!UU$Jtjr+`1T`~RC={}*u;OjYp2=J!>6 z_kk*1Gbibjx&;My6 zW!iIC!Z!iu-+UN{_IamZ;Tkt)3nhJ)2{LbC63$*_rEH*;%WnNxnArj^tVk z-R9=dmd1{}jyrUxMa?lBh|4B%bkpY+MS%i%L`iXcyz!@-KSVHMjooIL%n98aTOx7E zhlxh=Gz>4nkV^S)52uv{+|neiE zwo+dlDa}#<0q3BjDiq3jM!YeQ&`g*7PPXLl9511uO~C1O999b9%~^!n(cr9?DCW~QX)MgqGDmKk7nKu+_VhRp#OV3 zDA+m)8DvfH=A%~))&-d$AW2Am1{wG|qmsO_+N?2}iwc{h3-V&^cQkgwMryH>I0UD% zC`Vx?QHk6fq~!VpLG1y`vNgAWbFT!wn|$wgSml^JA7g%zv2JtIFhjq+zP)u*%GMFD zHS%F>Skk4u>-uNR*=_~f2Uh?n)s(O_RM2K`2Us5@WX?nvsE7�ZZ1V)kcXFEZpyH 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 b-^8Hu+`*}*yls`68QKElyytD7u)+V?Cm^7# diff --git a/esp32-led-blink-sdk/diagram.json b/esp32-led-blink-sdk/diagram.json deleted file mode 100644 index 7d76a534..00000000 --- a/esp32-led-blink-sdk/diagram.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "version": 1, - "author": "", - "editor": "wokwi", - "parts": [ - { - "type": "board-esp32-c6-devkitc-1", - "id": "esp", - "top": 0, - "left": 0, - "attrs": { "builder": "esp-idf" } - }, - { - "type": "wokwi-resistor", - "id": "r1", - "top": 119.15, - "left": -76.8, - "attrs": { "value": "1000" } - }, - { - "type": "wokwi-led", - "id": "led1", - "top": 25.2, - "left": -111.4, - "attrs": { "color": "red" } - } - ], - "connections": [ - [ "esp:TX", "$serialMonitor:RX", "", [] ], - [ "esp:RX", "$serialMonitor:TX", "", [] ], - [ "r1:2", "esp:8", "red", [ "v0" ] ], - [ "r1:1", "led1:A", "red", [ "h0" ] ], - [ "led1:C", "esp:GND.1", "black", [ "v0" ] ] - ], - "dependencies": {} -} diff --git a/esp32-led-blink-sdk/main/BridgingHeader.h b/esp32-led-blink-sdk/main/BridgingHeader.h deleted file mode 100644 index 4c7c46cf..00000000 --- a/esp32-led-blink-sdk/main/BridgingHeader.h +++ /dev/null @@ -1,17 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2024 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -#include - -#include "freertos/FreeRTOS.h" -#include "freertos/task.h" -#include "driver/gpio.h" -#include "sdkconfig.h" diff --git a/esp32-led-blink-sdk/main/CMakeLists.txt b/esp32-led-blink-sdk/main/CMakeLists.txt deleted file mode 100644 index be495aab..00000000 --- a/esp32-led-blink-sdk/main/CMakeLists.txt +++ /dev/null @@ -1,72 +0,0 @@ -# Register the app as an IDF component -idf_component_register( - SRCS /dev/null # We don't have any C++ sources - PRIV_INCLUDE_DIRS "." -) - -idf_build_get_property(target IDF_TARGET) -idf_build_get_property(arch IDF_TARGET_ARCH) - -if("${arch}" STREQUAL "xtensa") - message(FATAL_ERROR "Not supported target: ${target}") -endif() - -# Extract the -march flag and remove any vendor-specific extensions (_x*) -string(REGEX MATCH "-march=[^ ]+" march_flag "${CMAKE_C_FLAGS}") -string(REGEX REPLACE "_x[^ ]*" "" march_flag "${march_flag}") - -# Extract the -mabi flag or set a default value if not present -string(REGEX MATCH "-mabi=[^ ]+" mabi_flag "${CMAKE_C_FLAGS}") -if("${mabi_flag}" STREQUAL "") - set(mabi_flag "-mabi=ilp32") -endif() - -# Clear the default COMPILE_OPTIONS which include a lot of C/C++ specific compiler flags that the Swift compiler will not accept -get_target_property(var ${COMPONENT_LIB} COMPILE_OPTIONS) -set_target_properties(${COMPONENT_LIB} PROPERTIES COMPILE_OPTIONS "") - -# Compute -Xcc flags to set up the C and C++ header search paths for Swift (for bridging header). -set(SWIFT_INCLUDES) -foreach(dir ${CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES}) - string(CONCAT SWIFT_INCLUDES ${SWIFT_INCLUDES} "-Xcc ") - string(CONCAT SWIFT_INCLUDES ${SWIFT_INCLUDES} "-I${dir} ") -endforeach() -foreach(dir ${CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES}) - string(CONCAT SWIFT_INCLUDES ${SWIFT_INCLUDES} "-Xcc ") - string(CONCAT SWIFT_INCLUDES ${SWIFT_INCLUDES} "-I${dir} ") -endforeach() - -# Swift compiler flags to build in Embedded Swift mode, optimize for size, choose the right ISA, ABI, etc. -target_compile_options(${COMPONENT_LIB} PUBLIC "$<$:SHELL: - -target riscv32-none-none-eabi - -Xfrontend -function-sections -enable-experimental-feature Embedded -wmo -parse-as-library -Osize - -Xcc ${march_flag} -Xcc ${mabi_flag} -Xcc -fno-pic -Xcc -fno-pie - - -pch-output-dir /tmp - -Xfrontend -enable-single-module-llvm-emission - - ${SWIFT_INCLUDES} - - -import-bridging-header ${CMAKE_CURRENT_LIST_DIR}/BridgingHeader.h - >") - -# Enable Swift support in CMake, force Whole Module builds (required by Embedded Swift), and use "CMAKE_Swift_COMPILER_WORKS" to -# skip the trial compilations which don't (yet) correctly work when cross-compiling. -set(CMAKE_Swift_COMPILER_WORKS YES) -set(CMAKE_Swift_COMPILATION_MODE_DEFAULT wholemodule) -set(CMAKE_Swift_COMPILATION_MODE wholemodule) -enable_language(Swift) - -# List of Swift source files to build. -target_sources(${COMPONENT_LIB} - PRIVATE - Main.swift - Led.swift -) - -add_custom_command( - TARGET ${COMPONENT_LIB} - POST_BUILD - COMMAND ${CMAKE_OBJCOPY} --remove-section .swift_modhash - $ $ -) diff --git a/esp32-led-blink-sdk/main/Led.swift b/esp32-led-blink-sdk/main/Led.swift deleted file mode 100644 index 5fdd4d96..00000000 --- a/esp32-led-blink-sdk/main/Led.swift +++ /dev/null @@ -1,30 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2024 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -// A simple "overlay" to provide nicer APIs in Swift -struct Led { - var ledPin: gpio_num_t - init(gpioPin: Int) { - ledPin = gpio_num_t(Int32(gpioPin)) - - guard gpio_reset_pin(ledPin) == ESP_OK else { - fatalError("cannot reset led") - } - - guard gpio_set_direction(ledPin, GPIO_MODE_OUTPUT) == ESP_OK else { - fatalError("cannot reset led") - } - } - func setLed(value: Bool) { - let level: UInt32 = value ? 1 : 0 - gpio_set_level(ledPin, level) - } -} diff --git a/esp32-led-blink-sdk/main/Main.swift b/esp32-led-blink-sdk/main/Main.swift deleted file mode 100644 index 9b2d4cc0..00000000 --- a/esp32-led-blink-sdk/main/Main.swift +++ /dev/null @@ -1,26 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2024 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -// The code will blink an LED on GPIO8. To change the pin, modify Led(gpioPin: 8) -@_cdecl("app_main") -func main() { - print("Hello from Swift on ESP32-C6!") - - var ledValue: Bool = false - let blinkDelayMs: UInt32 = 500 - let led = Led(gpioPin: 8) - - while true { - led.setLed(value: ledValue) - ledValue.toggle() // Toggle the boolean value - vTaskDelay(blinkDelayMs / (1000 / UInt32(configTICK_RATE_HZ))) - } -} diff --git a/esp32-led-blink-sdk/main/idf_component.yml b/esp32-led-blink-sdk/main/idf_component.yml deleted file mode 100644 index e69de29b..00000000 diff --git a/esp32-led-blink-sdk/wokwi.toml b/esp32-led-blink-sdk/wokwi.toml deleted file mode 100644 index ab73f47b..00000000 --- a/esp32-led-blink-sdk/wokwi.toml +++ /dev/null @@ -1,8 +0,0 @@ -# Wokwi Configuration File -# Reference: https://docs.wokwi.com/vscode/project-config -[wokwi] -version = 1 -firmware = 'build/flasher_args.json' -elf = 'build/main.elf' -# gdbServerPort=3333 - diff --git a/esp32-led-strip-sdk/CMakeLists.txt b/esp32-led-strip-sdk/CMakeLists.txt deleted file mode 100644 index bdc05581..00000000 --- a/esp32-led-strip-sdk/CMakeLists.txt +++ /dev/null @@ -1,3 +0,0 @@ -cmake_minimum_required(VERSION 3.29) -include($ENV{IDF_PATH}/tools/cmake/project.cmake) -project(main) diff --git a/esp32-led-strip-sdk/README.md b/esp32-led-strip-sdk/README.md deleted file mode 100644 index 4f50c021..00000000 --- a/esp32-led-strip-sdk/README.md +++ /dev/null @@ -1,46 +0,0 @@ -# esp32-led-strip-sdk - -This example demonstrates how to integrate with the ESP-IDF SDK via CMake and how to use the existing LED strip library to control WS8212 lights from Swift. This example is specifically made for the RISC-V MCUs from ESP32 (the Xtensa MCUs are not currently supported by Swift). - - - -## Requirements - -- Set up the [ESP-IDF](https://docs.espressif.com/projects/esp-idf/en/stable/esp32/) development environment. Follow the steps in the [ESP32-C6 "Get Started" guide](https://docs.espressif.com/projects/esp-idf/en/v5.2/esp32c6/get-started/index.html). - - Make sure you specifically set up development for the RISC-V ESP32-C6, and not the Xtensa based products. - -- Before trying to use Swift with the ESP-IDF SDK, make sure your environment works and can build the provided C/C++ sample projects, in particular: - - Try building and running the "get-started/blink" example from ESP-IDF written in C. - -## Building - -- Make sure you have a recent nightly Swift toolchain that has Embedded Swift support. -- If needed, run export.sh to get access to the idf.py script from ESP-IDF. -- Specify and the target board type by using `idf.py set-target`. -``` console -$ cd esp32-led-strip-sdk -$ . /export.sh -$ idf.py set-target esp32c6 -$ idf.py build -``` - -## Running - -- Connect the ESP32-C6-DevKitC-1 board over a USB cable to your Mac. -- Wire up an external WS8212 LED strip and use GPIO pin 0 as the data pin. You might need to use a level shifter. -- Use `idf.py` to upload the firmware and to run it: - -```console -$ idf.py flash -``` - -- The LED strip should now be animating a sequence of random colors moving in one direction. - -### Simulating in VS Code - -- Build the project, to generate binaries for simulation -- Install [Wokwi for VS Code](https://docs.wokwi.com/vscode/getting-started/). -- Open the `diagram.json` file. -- Click the Play button to start simulation. -- Click the Pause button to freeze simulation and display states of GPIOs. - diff --git a/esp32-led-strip-sdk/diagram.json b/esp32-led-strip-sdk/diagram.json deleted file mode 100644 index f8e70fe3..00000000 --- a/esp32-led-strip-sdk/diagram.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "version": 1, - "author": "", - "editor": "wokwi", - "parts": [ - { - "type": "board-esp32-c6-devkitc-1", - "id": "esp", - "top": -13.91, - "left": 90.52, - "attrs": { "builder": "esp-idf" } - }, - { "type": "wokwi-neopixel", "id": "rgb1", "top": 73.3, "left": -20.2, "attrs": {} }, - { "type": "wokwi-neopixel", "id": "rgb2", "top": 73.3, "left": 18.2, "attrs": {} }, - { "type": "wokwi-neopixel", "id": "rgb3", "top": 73.3, "left": -250.6, "attrs": {} }, - { "type": "wokwi-neopixel", "id": "rgb4", "top": 73.3, "left": -212.2, "attrs": {} }, - { "type": "wokwi-neopixel", "id": "rgb5", "top": 73.3, "left": -58.6, "attrs": {} }, - { "type": "wokwi-neopixel", "id": "rgb6", "top": 73.3, "left": -173.8, "attrs": {} }, - { "type": "wokwi-neopixel", "id": "rgb7", "top": 73.3, "left": -97, "attrs": {} }, - { "type": "wokwi-neopixel", "id": "rgb8", "top": 73.3, "left": -135.4, "attrs": {} } - ], - "connections": [ - [ "esp:TX", "$serialMonitor:RX", "", [] ], - [ "esp:RX", "$serialMonitor:TX", "", [] ], - [ "rgb2:DIN", "esp:0", "green", [ "h28", "v-38.4" ] ], - [ "rgb2:DOUT", "rgb1:DIN", "green", [ "h-9.6", "v-10.5" ] ], - [ "rgb5:DOUT", "rgb7:DIN", "green", [ "h-9.6", "v-10.5" ] ], - [ "rgb8:DOUT", "rgb6:DIN", "green", [ "h-9.6", "v-10.5" ] ], - [ "rgb6:DOUT", "rgb4:DIN", "green", [ "v-0.9", "h-9.6", "v-9.6" ] ], - [ "rgb4:DOUT", "rgb3:DIN", "green", [ "v-0.9", "h-9.6", "v-9.6" ] ], - [ "rgb1:DOUT", "rgb5:DIN", "green", [ "h-9.6", "v-10.5" ] ], - [ "rgb2:VSS", "esp:5V", "red", [ "h18.4", "v75.9" ] ], - [ "rgb2:VDD", "rgb1:VSS", "red", [ "h-9.6", "v10.5" ] ], - [ "rgb1:VDD", "rgb5:VSS", "red", [ "h-9.6", "v10.5" ] ], - [ "rgb5:VDD", "rgb7:VSS", "red", [ "h-9.6", "v10.5" ] ], - [ "rgb7:VDD", "rgb8:VSS", "red", [ "h-9.6", "v10.5" ] ], - [ "rgb8:VDD", "rgb6:VSS", "red", [ "h-9.6", "v10.5" ] ], - [ "rgb6:VDD", "rgb4:VSS", "red", [ "h-9.6", "v10.5" ] ], - [ "rgb4:VDD", "rgb3:VSS", "red", [ "h-9.6", "v10.5" ] ], - [ "rgb3:VDD", "esp:GND.1", "black", [ "h-9.6", "v96" ] ], - [ "rgb8:DIN", "rgb7:DOUT", "green", [ "h8.8", "v9.6", "h9.6" ] ] - ], - "dependencies": {} -} diff --git a/esp32-led-strip-sdk/main/BridgingHeader.h b/esp32-led-strip-sdk/main/BridgingHeader.h deleted file mode 100644 index 5feff4bc..00000000 --- a/esp32-led-strip-sdk/main/BridgingHeader.h +++ /dev/null @@ -1,17 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2023 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -#include - -#include "freertos/FreeRTOS.h" -#include "freertos/task.h" -#include "led_strip.h" -#include "sdkconfig.h" diff --git a/esp32-led-strip-sdk/main/CMakeLists.txt b/esp32-led-strip-sdk/main/CMakeLists.txt deleted file mode 100644 index fc2ecd0f..00000000 --- a/esp32-led-strip-sdk/main/CMakeLists.txt +++ /dev/null @@ -1,72 +0,0 @@ -# Register the app as an IDF component -idf_component_register( - SRCS /dev/null # We don't have any C++ sources - PRIV_INCLUDE_DIRS "." -) - -idf_build_get_property(target IDF_TARGET) -idf_build_get_property(arch IDF_TARGET_ARCH) - -if("${arch}" STREQUAL "xtensa") - message(FATAL_ERROR "Not supported target: ${target}") -endif() - -# Extract the -march flag and remove any vendor-specific extensions (_x*) -string(REGEX MATCH "-march=[^ ]+" march_flag "${CMAKE_C_FLAGS}") -string(REGEX REPLACE "_x[^ ]*" "" march_flag "${march_flag}") - -# Extract the -mabi flag or set a default value if not present -string(REGEX MATCH "-mabi=[^ ]+" mabi_flag "${CMAKE_C_FLAGS}") -if("${mabi_flag}" STREQUAL "") - set(mabi_flag "-mabi=ilp32") -endif() - -# Clear the default COMPILE_OPTIONS which include a lot of C/C++ specific compiler flags that the Swift compiler will not accept -get_target_property(var ${COMPONENT_LIB} COMPILE_OPTIONS) -set_target_properties(${COMPONENT_LIB} PROPERTIES COMPILE_OPTIONS "") - -# Compute -Xcc flags to set up the C and C++ header search paths for Swift (for bridging header). -set(SWIFT_INCLUDES) -foreach(dir ${CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES}) - string(CONCAT SWIFT_INCLUDES ${SWIFT_INCLUDES} "-Xcc ") - string(CONCAT SWIFT_INCLUDES ${SWIFT_INCLUDES} "-I${dir} ") -endforeach() -foreach(dir ${CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES}) - string(CONCAT SWIFT_INCLUDES ${SWIFT_INCLUDES} "-Xcc ") - string(CONCAT SWIFT_INCLUDES ${SWIFT_INCLUDES} "-I${dir} ") -endforeach() - -# Swift compiler flags to build in Embedded Swift mode, optimize for size, choose the right ISA, ABI, etc. -target_compile_options(${COMPONENT_LIB} PUBLIC "$<$:SHELL: - -target riscv32-none-none-eabi - -Xfrontend -function-sections -enable-experimental-feature Embedded -wmo -parse-as-library -Osize - -Xcc ${march_flag} -Xcc ${mabi_flag} -Xcc -fno-pic -Xcc -fno-pie - - -pch-output-dir /tmp - -Xfrontend -enable-single-module-llvm-emission - - ${SWIFT_INCLUDES} - - -import-bridging-header ${CMAKE_CURRENT_LIST_DIR}/BridgingHeader.h - >") - -# Enable Swift support in CMake, force Whole Module builds (required by Embedded Swift), and use "CMAKE_Swift_COMPILER_WORKS" to -# skip the trial compilations which don't (yet) correctly work when cross-compiling. -set(CMAKE_Swift_COMPILER_WORKS YES) -set(CMAKE_Swift_COMPILATION_MODE_DEFAULT wholemodule) -set(CMAKE_Swift_COMPILATION_MODE wholemodule) -enable_language(Swift) - -# List of Swift source files to build. -target_sources(${COMPONENT_LIB} - PRIVATE - Main.swift - LedStrip.swift -) - -add_custom_command( - TARGET ${COMPONENT_LIB} - POST_BUILD - COMMAND ${CMAKE_OBJCOPY} --remove-section .swift_modhash - $ $ -) diff --git a/esp32-led-strip-sdk/main/LedStrip.swift b/esp32-led-strip-sdk/main/LedStrip.swift deleted file mode 100644 index ed275379..00000000 --- a/esp32-led-strip-sdk/main/LedStrip.swift +++ /dev/null @@ -1,56 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2023 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -// A simple "overlay" to provide nicer APIs in Swift -struct LedStrip { - private let handle: led_strip_handle_t - - init(gpioPin: Int, maxLeds: Int) { - var handle = led_strip_handle_t(bitPattern: 0) - var stripConfig = led_strip_config_t( - strip_gpio_num: Int32(gpioPin), - max_leds: UInt32(maxLeds), - led_pixel_format: LED_PIXEL_FORMAT_GRB, - led_model: LED_MODEL_WS2812, - flags: .init(invert_out: 0) - ) - var spiConfig = led_strip_spi_config_t( - clk_src: SPI_CLK_SRC_DEFAULT, - spi_bus: SPI2_HOST, - flags: .init(with_dma: 1) - ) - guard led_strip_new_spi_device(&stripConfig, &spiConfig, &handle) == ESP_OK, - let handle = handle - else { fatalError("cannot configure spi device") } - self.handle = handle - } - - struct Color { - static var white = Color(r: 255, g: 255, b: 255) - static var lightWhite = Color(r: 16, g: 16, b: 16) - static var lightRandom: Color { - Color( - r: .random(in: 0...16), g: .random(in: 0...16), b: .random(in: 0...16)) - } - static var off = Color(r: 0, g: 0, b: 0) - - var r, g, b: UInt8 - } - - func setPixel(index: Int, color: Color) { - led_strip_set_pixel( - handle, UInt32(index), UInt32(color.r), UInt32(color.g), UInt32(color.b)) - } - - func refresh() { led_strip_refresh(handle) } - - func clear() { led_strip_clear(handle) } -} diff --git a/esp32-led-strip-sdk/main/Main.swift b/esp32-led-strip-sdk/main/Main.swift deleted file mode 100644 index 8a4d3a71..00000000 --- a/esp32-led-strip-sdk/main/Main.swift +++ /dev/null @@ -1,33 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2023 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -@_cdecl("app_main") -func main() { - print("Hello from Swift on ESP32-C6!") - - let n = 8 - let ledStrip = LedStrip(gpioPin: 0, maxLeds: n) - ledStrip.clear() - - var colors: [LedStrip.Color] = .init(repeating: .off, count: n) - while true { - colors.removeLast() - colors.insert(.lightRandom, at: 0) - - for index in 0.." "$" COMPILE_DEFINITIONS "${COMPILE_DEFINITIONS}") -string(REPLACE ";" " -Xcc -D" COMPILE_DEFINITIONS "${COMPILE_DEFINITIONS} ") -message("COMPILE_DEFINITIONS: ${COMPILE_DEFINITIONS}") - -get_target_property(var pico_standard_link INTERFACE_COMPILE_OPTIONS) -set_target_properties(pico_standard_link PROPERTIES INTERFACE_COMPILE_OPTIONS "") - -# Compute -Xcc flags to set up the C and C++ header search paths for Swift (for -# the bridging header). -set(SWIFT_INCLUDES) -foreach(dir ${CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES}) - string(CONCAT SWIFT_INCLUDES ${SWIFT_INCLUDES} "-Xcc ") - string(CONCAT SWIFT_INCLUDES ${SWIFT_INCLUDES} "-I${dir} ") -endforeach() -foreach(dir ${CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES}) - string(CONCAT SWIFT_INCLUDES ${SWIFT_INCLUDES} "-Xcc ") - string(CONCAT SWIFT_INCLUDES ${SWIFT_INCLUDES} "-I${dir} ") -endforeach() - -# Swift compiler flags to build in Embedded Swift mode, optimize for size, -# choose the right ISA, ABI, etc. -target_compile_options(app PUBLIC "$<$:SHELL: - -target armv6m-none-none-eabi - -Xfrontend -function-sections -wmo -parse-as-library -Osize - -enable-experimental-feature Embedded - -enable-experimental-feature Extern - -enable-experimental-feature Span - -enable-experimental-feature SymbolLinkageMarkers - - -assert-config Debug - - -Xcc -mfloat-abi=soft -Xcc -fshort-enums - -Xcc -D__APPLE_CC__ - - -Xcc -I${CMAKE_CURRENT_LIST_DIR}/include - - -pch-output-dir /tmp - -Xfrontend -enable-single-module-llvm-emission - - ${SWIFT_INCLUDES} - ${COMPILE_DEFINITIONS} - - -import-bridging-header ${CMAKE_CURRENT_LIST_DIR}/Sources/Application/BridgingHeader.h - >") - -# Enable Swift support in CMake, force Whole Module builds (required by Embedded -# Swift), and use "CMAKE_Swift_COMPILER_WORKS" to skip the trial compilations -# which don't (yet) correctly work when cross-compiling. -set(CMAKE_Swift_COMPILER_WORKS YES) -set(CMAKE_Swift_COMPILATION_MODE_DEFAULT wholemodule) -set(CMAKE_Swift_COMPILATION_MODE wholemodule) -enable_language(Swift) - -# Don't link via the Swift driver, it doesn't understand some GNU linker -# arguments, and it's not necessary for Embedded Swift. -set_property(TARGET app PROPERTY LINKER_LANGUAGE C) - -# List of Swift and C source files to build. -target_sources(app - PRIVATE - Sources/Application/Button.swift - Sources/Application/ButtonTimes.swift - Sources/Application/LEDStrip.swift - Sources/Application/Logging.swift - Sources/Application/Main.swift - Sources/Application/QuadratureEncoder.swift - Sources/Application/Stubs.swift - - Sources/Audio/AudioAnalyzer.swift - Sources/Audio/AudioBuffer.swift - Sources/Audio/AudioBufferTransport.swift - Sources/Audio/AudioEngine.swift - Sources/Audio/AudioI2S.swift - Sources/Audio/AudioPico.swift - Sources/Audio/MAX9744.swift - Sources/Audio/Resampler.swift - Sources/Audio/Ring.swift - Sources/Audio/RingBuffer.swift - Sources/Audio/SpinLock.swift - Sources/Audio/TPA2016D2.swift - - Sources/Bluetooth/A2DP.swift - Sources/Bluetooth/AVRCP.swift - Sources/Bluetooth/HCI.swift - Sources/Bluetooth/SBC.swift - Sources/Bluetooth/SDP.swift - - Sources/PIOPrograms/I2S.pio - Sources/PIOPrograms/QuadratureEncoder.pio - Sources/PIOPrograms/WS2812.pio -) - -pico_add_extra_outputs(app) diff --git a/harmony/README.md b/harmony/README.md deleted file mode 100644 index 9e8a55f9..00000000 --- a/harmony/README.md +++ /dev/null @@ -1,113 +0,0 @@ -# Harmony - -> [!NOTE] -> This README is still under construction. - -Harmony is a Bluetooth speaker and Ferrofluidic music visualizer. - -![Harmony device](./assets/hero.jpg) - -## Table of Contents - -- [Overview](#overview) -- [Features](#features) -- [Bill of Materials](#bill-of-materials) -- [Compiling the firmware](#compiling-the-firmware) -- [Flashing and running](#flashing-and-running) -- [Monitoring UART](#monitoring-uart) -- [Hardware Setup](#hardware-setup) -- [Software Architecture](#software-architecture) - -## Overview - -Harmony combines Bluetooth audio streaming with the visual effects of a ferrofluid display reacting to the music's rhythm and bass. - -> [!WARNING] -> This project involves power electronics which can be dangerous. Take proper -> safety precautions and consult a qualified professional if unsure. - -## Features - -- Bluetooth audio streaming (using the SBC codec) -- Ferrofluid visualization synchronized with music -- Volume and playback controls -- Customizable LED lighting effects - -## Bill of Materials - -A detailed Bill of Materials (BOM) can be found in `BillOfMaterials.md`. This document lists all the necessary components for building Harmony. - -## Compiling the firmware - -The firmware for Harmony is built using CMake and requires the Raspberry Pi Pico SDK. - -1. Ensure you have the Pico SDK set up on your system. See the official Raspberry Pi Pico documentation for instructions: [https://www.raspberrypi.com/documentation/pico/getting-started/](https://www.raspberrypi.com/documentation/pico/getting-started/) - -2. Clone the swift-embedded-examples repository (if not already done): - ```bash - git clone https://github.com/swiftlang/swift-embedded-examples.git - cd harmony - ``` - -3. Set the necessary environment variables: - ```bash - export PICO_BOARD=pico_w - export PICO_SDK_PATH='' # e.g., ../pico-sdk - export PICO_EXTRAS_PATH='' # e.g., ../pico-extras - export PICO_TOOLCHAIN_PATH='' # e.g., /usr/bin - ``` - -4. Generate the build files using CMake: - ```bash - cmake -B build -G Ninja . -DCMAKE_EXPORT_COMPILE_COMMANDS=On - ``` - -5. Build the firmware: - ```bash - cmake --build build - ``` - -## Flashing and running - -To flash the compiled firmware onto the Raspberry Pi Pico, you'll need OpenOCD. - -1. Connect your Pico to your computer using a USB cable and put it into BOOTSEL mode by holding the BOOTSEL button while plugging it in. - -2. Run OpenOCD with the appropriate configuration files: - ```bash - openocd -f interface/cmsis-dap.cfg -f target/rp2040.cfg -c "adapter speed 5000" -c "program build/app.elf verify reset exit" - ``` - -## Monitoring UART - -For debugging and monitoring, you can connect to the Pico's UART using a serial terminal program like `screen`. - -1. Identify the serial port connected to your Pico. You can usually find it using `ls /dev/cu.usbmodem*` on macOS or by checking the Device Manager on Windows. - -2. Connect to the UART using `screen`: - ```bash - screen /dev/cu.usbmodem<...> 115200 - ``` - (Replace `<...>` with the correct port identifier) - -## Hardware Setup - -> [!NOTE] -> This README is still under construction. - -## Software Architecture - -> [!NOTE] -> This README is still under construction. - -The firmware is designed with a modular architecture for efficient audio processing and visualization control. - -- **Bluetooth Handlers:** Manage the Bluetooth connection and incoming audio stream using the SBC codec. -- **SBC Ring Buffer:** Stores the decoded SBC audio data for further processing. -- **Audio Decoder:** Decodes the SBC encoded audio stream into PCM (Pulse Code Modulation) format. -- **PCM Ring Buffer:** Stores the decoded PCM audio data. -- **Audio Analyzer:** Analyzes the PCM audio data to extract relevant information like amplitude and frequency. This data is used to control the ferrofluid display. -- **Audio Driver:** Sends the PCM audio data to the DAC (Digital-to-Analog Converter). -- **DAC:** Converts the digital audio signal to an analog signal. -- **Amplifier:** Amplifies the analog audio signal to drive the speaker. -- **Electromagnet Driver:** Controls the electromagnet based on the analyzed audio data, creating the ferrofluid movements. diff --git a/harmony/Sources/Application/BridgingHeader.h b/harmony/Sources/Application/BridgingHeader.h deleted file mode 100644 index 74f7f34a..00000000 --- a/harmony/Sources/Application/BridgingHeader.h +++ /dev/null @@ -1,69 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2024 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -#pragma once - -// C Stdlib -#include - -// Pico SDK -#include -#include -#include - -#include -#include -#include -#include -#include - -// Bluetooth SDK -#include -#include -#include -#include - -// PIO Programs -#include "I2S.pio.h" -#include "QuadratureEncoder.pio.h" -#include "WS2812.pio.h" - -#undef ISB -#include "arm_math.h" - -// Shims -static inline pio_hw_t* _pio0(void) { return pio0; } -static inline pio_hw_t* _pio1(void) { return pio1; } -static inline int32_t _errno() { return errno; } - -static const q15_t _samples_512[512] = { - // 10000 Hz - // 0, 32419, 9435, -29673, -18071, 24413, 25176, -17086, -30149, 8311, 32568, 1166, -32228, -10546, 29159, 19033, -23619, -25907, 16079, 30587, -7177, -32676, -2332, 31997, 11644, -28608, -19971, 22796, 26605, -15052, -30986, 6034, 32742, 3494, -31725, -12728, 28021, 20883, -21943, -27269, 14006, 31346, -4883, -32767, -4652, 31413, 13795, -27398, -21769, 21062, 27899, -12943, -31666, 3726, 32751, 5805, -31061, -14845, 26741, 22627, -20155, -28493, 11862, 31946, -2565, -32692, -6949, 30670, 15876, -26049, -23457, 19222, 29052, -10767, -32185, 1400, 32593, 8085, -30240, -16886, 25325, 24257, -18265, -29573, 9658, 32384, -233, -32452, -9211, 29771, 17876, -24568, -25026, 17285, 30057, -8537, -32541, -933, 32270, 10325, -29265, -18842, 23781, 25763, -16282, -30502, 7405, 32658, 2099, -32047, -11426, 28721, 19785, -22963, -26468, 15259, 30909, -6263, -32732, -3262, 31783, 12512, -28141, -20703, 22116, 27139, -14217, -31277, 5114, 32766, 4421, -31479, -13583, 27525, 21594, -21241, -27776, 13157, 31605, -3958, -32757, -5575, 31135, 14636, -26875, -22458, 20339, 28377, -12080, -31893, 2797, 32707, 6721, -30751, -15671, 26190, 23293, -19411, -28943, 10987, 32141, -1633, -32616, -7859, 30329, 16686, -25472, -24099, 18458, 29472, -9881, -32347, 466, 32483, 8987, -29868, -17679, 24722, 24875, -17483, -29963, 8762, 32513, 700, -32309, -10103, 29369, 18651, -23941, -25619, 16484, 30416, -7632, -32638, -1866, 32094, 11207, -28833, -19598, 23129, 26330, -15466, -30831, 6492, 32721, 3030, -31839, -12296, 28260, 20521, -22287, -27008, 14427, 31207, -5344, -32762, -4190, 31543, 13370, -27651, -21418, 21418, 27651, -13370, -31543, 4190, 32762, 5344, -31207, -14427, 27008, 22287, -20521, -28260, 12296, 31839, -3030, -32721, -6492, 30831, 15466, -26330, -23129, 19598, 28833, -11207, -32094, 1866, 32638, 7632, -30416, -16484, 25619, 23941, -18651, -29369, 10103, 32309, -700, -32513, -8762, 29963, 17483, -24875, -24722, 17679, 29868, -8987, -32483, -466, 32347, 9881, -29472, -18458, 24099, 25472, -16686, -30329, 7859, 32616, 1633, -32141, -10987, 28943, 19411, -23293, -26190, 15671, 30751, -6721, -32707, -2797, 31893, 12080, -28377, -20339, 22458, 26875, -14636, -31135, 5575, 32757, 3958, -31605, -13157, 27776, 21241, -21594, -27525, 13583, 31479, -4421, -32766, -5114, 31277, 14217, -27139, -22116, 20703, 28141, -12512, -31783, 3262, 32732, 6263, -30909, -15259, 26468, 22963, -19785, -28721, 11426, 32047, -2099, -32658, -7405, 30502, 16282, -25763, -23781, 18842, 29265, -10325, -32270, 933, 32541, 8537, -30057, -17285, 25026, 24568, -17876, -29771, 9211, 32452, 233, -32384, -9658, 29573, 18265, -24257, -25325, 16886, 30240, -8085, -32593, -1400, 32185, 10767, -29052, -19222, 23457, 26049, -15876, -30670, 6949, 32692, 2565, -31946, -11862, 28493, 20155, -22627, -26741, 14845, 31061, -5805, -32751, -3726, 31666, 12943, -27899, -21062, 21769, 27398, -13795, -31413, 4652, 32767, 4883, -31346, -14006, 27269, 21943, -20883, -28021, 12728, 31725, -3494, -32742, -6034, 30986, 15052, -26605, -22796, 19971, 28608, -11644, -31997, 2332, 32676, 7177, -30587, -16079, 25907, 23619, -19033, -29159, 10546, 32228, -1166, -32568, -8311, 30149, 17086, -25176, -24413, 18071, 29673, -9435, -32419, 0, 32419, 9435, -29673, -18071, 24413, 25176, -17086, -30149, 8311, 32568, 1166, -32228, -10546, 29159, 19033, -23619, -25907, 16079, 30587, -7177, -32676, -2332, 31997, 11644, -28608, -19971, 22796, 26605, -15052, -30986, 6034, 32742, 3494, -31725, -12728, 28021, 20883, -21943, -27269, 14006, 31346, -4883, -32767, -4652, 31413, 13795, -27398, -21769, 21062, 27899, -12943, -31666, 3726, 32751, 5805, -31061, -14845, 26741, 22627, -20155, -28493, 11862, 31946, -2565, -32692, -6949, 30670, 15876, -26049, -23457 - // 100 Hz - // 0, 466, 933, 1400, 1866, 2332, 2797, 3262, 3726, 4190, 4652, 5114, 5575, 6034, 6492, 6949, 7405, 7859, 8311, 8762, 9211, 9658, 10103, 10546, 10987, 11426, 11862, 12296, 12728, 13157, 13583, 14006, 14427, 14845, 15259, 15671, 16079, 16484, 16886, 17285, 17679, 18071, 18458, 18842, 19222, 19598, 19971, 20339, 20703, 21062, 21418, 21769, 22116, 22458, 22796, 23129, 23457, 23781, 24099, 24413, 24722, 25026, 25325, 25619, 25907, 26190, 26468, 26741, 27008, 27269, 27525, 27776, 28021, 28260, 28493, 28721, 28943, 29159, 29369, 29573, 29771, 29963, 30149, 30329, 30502, 30670, 30831, 30986, 31135, 31277, 31413, 31543, 31666, 31783, 31893, 31997, 32094, 32185, 32270, 32347, 32419, 32483, 32541, 32593, 32638, 32676, 32707, 32732, 32751, 32762, 32767, 32766, 32757, 32742, 32721, 32692, 32658, 32616, 32568, 32513, 32452, 32384, 32309, 32228, 32141, 32047, 31946, 31839, 31725, 31605, 31479, 31346, 31207, 31061, 30909, 30751, 30587, 30416, 30240, 30057, 29868, 29673, 29472, 29265, 29052, 28833, 28608, 28377, 28141, 27899, 27651, 27398, 27139, 26875, 26605, 26330, 26049, 25763, 25472, 25176, 24875, 24568, 24257, 23941, 23619, 23293, 22963, 22627, 22287, 21943, 21594, 21241, 20883, 20521, 20155, 19785, 19411, 19033, 18651, 18265, 17876, 17483, 17086, 16686, 16282, 15876, 15466, 15052, 14636, 14217, 13795, 13370, 12943, 12512, 12080, 11644, 11207, 10767, 10325, 9881, 9435, 8987, 8537, 8085, 7632, 7177, 6721, 6263, 5805, 5344, 4883, 4421, 3958, 3494, 3030, 2565, 2099, 1633, 1166, 700, 233, -233, -700, -1166, -1633, -2099, -2565, -3030, -3494, -3958, -4421, -4883, -5344, -5805, -6263, -6721, -7177, -7632, -8085, -8537, -8987, -9435, -9881, -10325, -10767, -11207, -11644, -12080, -12512, -12943, -13370, -13795, -14217, -14636, -15052, -15466, -15876, -16282, -16686, -17086, -17483, -17876, -18265, -18651, -19033, -19411, -19785, -20155, -20521, -20883, -21241, -21594, -21943, -22287, -22627, -22963, -23293, -23619, -23941, -24257, -24568, -24875, -25176, -25472, -25763, -26049, -26330, -26605, -26875, -27139, -27398, -27651, -27899, -28141, -28377, -28608, -28833, -29052, -29265, -29472, -29673, -29868, -30057, -30240, -30416, -30587, -30751, -30909, -31061, -31207, -31346, -31479, -31605, -31725, -31839, -31946, -32047, -32141, -32228, -32309, -32384, -32452, -32513, -32568, -32616, -32658, -32692, -32721, -32742, -32757, -32766, -32767, -32762, -32751, -32732, -32707, -32676, -32638, -32593, -32541, -32483, -32419, -32347, -32270, -32185, -32094, -31997, -31893, -31783, -31666, -31543, -31413, -31277, -31135, -30986, -30831, -30670, -30502, -30329, -30149, -29963, -29771, -29573, -29369, -29159, -28943, -28721, -28493, -28260, -28021, -27776, -27525, -27269, -27008, -26741, -26468, -26190, -25907, -25619, -25325, -25026, -24722, -24413, -24099, -23781, -23457, -23129, -22796, -22458, -22116, -21769, -21418, -21062, -20703, -20339, -19971, -19598, -19222, -18842, -18458, -18071, -17679, -17285, -16886, -16484, -16079, -15671, -15259, -14845, -14427, -14006, -13583, -13157, -12728, -12296, -11862, -11426, -10987, -10546, -10103, -9658, -9211, -8762, -8311, -7859, -7405, -6949, -6492, -6034, -5575, -5114, -4652, -4190, -3726, -3262, -2797, -2332, -1866, -1400, -933, -466, 0, 466, 933, 1400, 1866, 2332, 2797, 3262, 3726, 4190, 4652, 5114, 5575, 6034, 6492, 6949, 7405, 7859, 8311, 8762, 9211, 9658, 10103, 10546, 10987, 11426, 11862, 12296, 12728, 13157, 13583, 14006, 14427, 14845, 15259, 15671, 16079, 16484, 16886, 17285, 17679, 18071, 18458, 18842, 19222, 19598, 19971, 20339, 20703, 21062, 21418, 21769, 22116, 22458, 22796, 23129, 23457, 23781, 24099, 24413, 24722, 25026, 25325, 25619, 25907, 26190, 26468, 26741, 27008, 27269, 27525 - // Random - // -23267, -28627, -22857, 28240, 13800, 30726, -24151, 26079, -13476, -12798, 13052, 13852, -22637, -6154, -3815, -12039, 25243, -1585, -19939, -8784, -28265, -26459, -11751, 11175, 29945, 6392, 2017, -26312, 705, 3937, 15719, 15254, 2106, -19522, -11782, 14779, 17287, -573, -4131, 1598, -17359, -2321, 29406, 10983, -1820, 10484, 2547, 21179, -8994, -2079, -27106, 10036, 24048, 20759, -22663, 30870, -23019, -6484, 10645, 28446, 5694, 29587, 2716, 28330, -31127, -24224, 11747, 4653, 25607, 2060, -13584, 18776, 3286, 4279, -23640, -19751, -29165, -26461, 1009, -26, 24934, 1737, 25904, 13741, 26638, -9855, 24739, 1151, 1288, 27717, -14507, 31321, 14853, 30335, 6779, -25100, -31174, 21443, -26019, 10443, -16230, -7792, -17010, 22850, 26999, -22520, -3965, -28776, 20422, 32717, -13509, 615, 3751, 14471, -31442, 331, -4401, -13910, -9235, -22272, -20351, -18042, -12559, -26528, -21608, -10967, -10773, 7318, 29416, 11987, -18385, 18446, -7565, -1826, 5991, -1501, -18115, 11245, -26602, 26281, -27812, 606, 10535, -24038, -9512, -28585, 17743, -23902, -5358, 14428, -6620, -11902, 29990, -1351, 229, 505, -20824, 2948, -10728, -8917, -30529, -8611, 10386, 8405, 29667, 1259, -933, 27763, 15110, -7538, 2579, -2260, 16781, 3587, 987, 10675, -12646, -26337, -15515, 10036, -10923, 19627, 23472, -19409, -25964, -15233, -12738, -17699, 21449, 12398, 31055, 3204, 10120, -5165, 28072, 3534, 8925, 8718, 12006, -14307, 3727, -2169, -9054, -32745, -27455, -2414, -30904, -27071, 29227, -1711, -32026, 16670, 4041, 11990, -6825, 19509, -10102, -5291, 14789, 13031, 27966, 3079, -30755, 18652, 8718, 17518, 27673, -21518, 26194, -7598, 8682, -30879, -26492, 25542, -683, 29625, -18786, -11302, 14478, -25560, 2884, 16250, -17512, -5658, 10514, -32180, 19268, 13426, -17484, 15865, 12636, 5169, -8869, 24014, 26874, 21372, -31006, 1717, 28024, 1712, 24846, 28640, 14211, 38, -32053, -23226, 4101, 10121, 17271, 67, 20471, -265, 17592, -17786, -14468, 836, 24620, -10300, -31533, 18124, -27177, 8895, -14010, 3583, 4616, -370, -1692, -24560, 7943, -15712, -548, 22854, 6585, -6472, -3219, -5611, -6953, 27266, 32132, -9528, 27921, -5179, 25555, -1361, 7012, 20560, -9756, 20686, -28590, -9269, 23420, -6441, -26236, -26378, -16303, -4482, -32143, 879, 28814, -15829, 13154, -32500, 10497, -15844, 27537, 12933, 24326, -8289, -25445, 5613, 3783, 19422, 13656, -28388, 10940, 23522, -8935, -10820, -23230, -6261, 8161, 16840, -23319, -14576, -20202, 9909, 14492, 17965, 830, 2347, -11266, -8371, -9564, -4490, 10044, -1236, -14600, 27197, 31869, 9030, 28833, 27173, -31152, 4385, 31150, 24565, -17190, 15066, 31896, -18756, 20622, -3244, -11415, 28206, 824, 11787, 17574, -32303, 23499, -23228, 24135, 29557, 11106, -12688, -1300, 16113, 4289, 8128, -10194, 8058, -24081, -13334, -22492, -20062, -21175, -31592, 11336, 26112, -14411, 29755, 8660, -19490, -11577, 17292, -8281, -2277, 3554, 4593, -2709, -5323, -8179, 10204, -17385, 18261, -301, 12645, -14775, -12287, -16381, 29835, -25494, 17111, 17776, 19593, 2789, 17686, -30471, -23637, -29774, -16137, 14721, -22862, 4031, -29039, -22289, 11175, 10518, -15373, 695, -23720, -24736, 14425, -9407, -25318, 2501, -5415, -21451, -20293, -19032, 27457, 28601, -11034, -9415, -8598, -30687, -26219, 31028, 9152, -20955, -30113, 31446, -23025, -14905, 384, -738, -871, 43, -5814, -6575, -12151, 13081, 14489, -3276, -24880, -27900, 5863, 7411, -21359, -26944, -9252, 15265, -12092, -8907, 17623, -13430, -3138, 23092, 10217, 13241, 1005, 11791, -12903, -12487, -13885, -8748, -7247, -12551, 1132, 16750, 29330, 9297, -22940, -2912, 7094, -3066, 20032, -13050, -26769, -32399, -23202, 13843, 18265 - // Mixed content - 0, 20065, 20774, 14478, 7238, -8053, -16118, -4051, 7534, 6075, 3660, -2261, -17285, -20472, -3071, 12656, 19351, 24507, 16764, -5807, -17284, -11343, -5570, 1128, 11683, 7992, -8598, -12980, -4950, 2096, 14516, 28344, 21538, 414, -11404, -16217, -18132, -4858, 13563, 13604, 3724, 32, -4475, -6513, 8151, 23989, 20258, 8508, -1704, -17249, -25082, -10049, 8615, 14091, 16355, 14067, -790, -9122, 1929, 12576, 13845, 15030, 7381, -13670, -23561, -13069, -737, 10830, 25231, 24491, 6096, -4544, -2850, -1845, 4676, 16574, 12215, -5964, -14129, -13027, -9898, 6065, 27202, 28380, 14823, 5084, -5222, -13918, -4550, 11428, 11365, 3816, -424, -9456, -14133, 1869, 21552, 25413, 22684, 15389, -4598, -19263, -11696, 681, 5865, 12445, 12521, -2447, -10764, -435, 10586, 17554, 26412, 21788, -1044, -16380, -15529, -11888, -1615, 16659, 20446, 7035, -458, -336, -1161, 7875, 23559, 21483, 4371, -7233, -15614, -21255, -8114, 14640, 21499, 16945, 13025, 2104, -8840, -766, 13847, 14491, 9531, 3725, -12102, -23332, -11514, 7094, 16637, 24423, 24493, 6412, -9454, -6591, -251, 3352, 11817, 11634, -5689, -16853, -11022, -2732, 8793, 26686, 29578, 11646, -3250, -9050, -14188, -8191, 9209, 13344, 2263, -4056, -7008, -10299, 1348, 22278, 26522, 16272, 6387, -8487, -23100, -16775, 1463, 8630, 9698, 10245, -523, -11784, -3252, 12037, 16701, 18293, 14505, -5708, -23916, -20524, -9316, -5, 14238, 20734, 7077, -5948, -4177, -816, 3751, 15842, 16850, -1764, -16792, -19304, -19174, -8705, 14023, 23853, 14256, 5119, -2037, -11764, -8128, 8128, 11764, 2037, -5119, -14256, -23853, -14023, 8705, 19174, 19304, 16792, 1764, -16850, -15842, -3751, 816, 4177, 5948, -7077, -20734, -14238, 5, 9316, 20524, 23916, 5708, -14505, -18293, -16701, -12037, 3252, 11784, 523, -10245, -9698, -8630, -1463, 16775, 23100, 8487, -6387, -16272, -26522, -22278, -1348, 10299, 7008, 4056, -2263, -13344, -9209, 8191, 14188, 9050, 3250, -11646, -29578, -26686, -8793, 2732, 11022, 16853, 5689, -11634, -11817, -3352, 251, 6591, 9454, -6412, -24493, -24423, -16637, -7094, 11514, 23332, 12102, -3725, -9531, -14491, -13847, 766, 8840, -2104, -13025, -16945, -21499, -14640, 8114, 21255, 15614, 7233, -4371, -21483, -23559, -7875, 1161, 336, 458, -7035, -20446, -16659, 1615, 11888, 15529, 16380, 1044, -21788, -26412, -17554, -10586, 435, 10764, 2447, -12521, -12445, -5865, -681, 11696, 19263, 4598, -15389, -22684, -25413, -21552, -1869, 14133, 9456, 424, -3816, -11365, -11428, 4550, 13918, 5222, -5084, -14823, -28380, -27202, -6065, 9898, 13027, 14129, 5964, -12215, -16574, -4676, 1845, 2850, 4544, -6096, -24491, -25231, -10830, 737, 13069, 23561, 13670, -7381, -15030, -13845, -12576, -1929, 9122, 790, -14067, -16355, -14091, -8615, 10049, 25082, 17249, 1704, -8508, -20258, -23989, -8151, 6513, 4475, -32, -3724, -13604, -13563, 4858, 18132, 16217, 11404, -414, -21538, -28344, -14516, -2096, 4950, 12980, 8598, -7992, -11683, -1128, 5570, 11343, 17284, 5807, -16764, -24507, -19351, -12656, 3071, 20472, 17285, 2261, -3660, -6075, -7534, 4051, 16118, 8053, -7238, -14478, -20774, -20065, 0, 20065, 20774, 14478, 7238, -8053, -16118, -4051, 7534, 6075, 3660, -2261, -17285, -20472, -3071, 12656, 19351, 24507, 16764, -5807, -17284, -11343, -5570, 1128, 11683, 7992, -8598, -12980, -4950, 2096, 14516, 28344, 21538, 414, -11404, -16217, -18132, -4858, 13563, 13604, 3724, 32, -4475, -6513, 8151, 23989, 20258, 8508, -1704, -17249, -25082, -10049, 8615, 14091, 16355, 14067, -790, -9122, 1929, 12576, 13845, 15030, 7381, -13670, -23561, -13069, -737, 10830, 25231, 24491, 6096 -}; - -const q15_t* samples_512(void) { - return _samples_512; -} - -static const q15_t _samples_64[64] = { - 0, 16209, 4717, -14836, -9035, 12206, 12588, -8543, -15074, 4155, 16284, 583, -16114, -5273, 14579, 9516, -11809, -12953, 8039, 15293, -3588, -16338, -1166, 15998, 5822, -14304, -9985, 11398, 13302, -7526, -15493, 3017, 16371, 1747, -15862, -6364, 14010, 10441, -10971, -13634, 7003, 15673, -2441, -16383, -2326, 15706, 6897, -13699, -10884, 10531, 13949, -6471, -15833, 1863, 16375, 2902, -15530, -7422, 13370, 11313, -10077, -14246, 5931, 15973 -}; - -const q15_t* samples_64(void) { - return _samples_64; -} - diff --git a/harmony/Sources/Application/Button.swift b/harmony/Sources/Application/Button.swift deleted file mode 100644 index 03867b54..00000000 --- a/harmony/Sources/Application/Button.swift +++ /dev/null @@ -1,29 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2024 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -struct Button: ~Copyable { - var pin: UInt32 - - init(pin: UInt32, onPress callback: @convention(c) (UInt32, UInt32) -> Void) { - self.pin = pin - - gpio_init(pin) - gpio_set_dir(pin, false) // input - gpio_pull_up(pin) // pull up the pin - gpio_set_irq_enabled_with_callback( - pin, UInt32(GPIO_IRQ_EDGE_FALL.rawValue), true, callback) - } - - deinit { - gpio_deinit(self.pin) - } -} - diff --git a/harmony/Sources/Application/ButtonTimes.swift b/harmony/Sources/Application/ButtonTimes.swift deleted file mode 100644 index 63d53b47..00000000 --- a/harmony/Sources/Application/ButtonTimes.swift +++ /dev/null @@ -1,42 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2024 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -struct ButtonTimes { - typealias Times = ( - UInt32, UInt32, UInt32, UInt32, - UInt32, UInt32, UInt32, UInt32, - UInt32, UInt32, UInt32, UInt32) - static let count = 12 - static let rawSize = MemoryLayout.size - static let reboundSize = Self.count * MemoryLayout.size - - private var times: Times = - (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) - - subscript(_ index: some FixedWidthInteger) -> UInt32 { - get { - precondition(Self.rawSize == Self.reboundSize) - return withUnsafePointer(to: self.times) { - $0.withMemoryRebound(to: UInt32.self, capacity: Self.count) { - $0[Int(index)] - } - } - } - set { - precondition(Self.rawSize == Self.reboundSize) - return withUnsafeMutablePointer(to: &self.times) { - $0.withMemoryRebound(to: UInt32.self, capacity: Self.count) { - $0[Int(index)] = newValue - } - } - } - } -} diff --git a/harmony/Sources/Application/LEDStrip.swift b/harmony/Sources/Application/LEDStrip.swift deleted file mode 100644 index f8f058b5..00000000 --- a/harmony/Sources/Application/LEDStrip.swift +++ /dev/null @@ -1,92 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2024 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -struct LEDStrip: ~Copyable { - var dataPin: UInt32 - var ledCount: Int - - var pio: UInt32 - var pioSm: UInt32 - var pioHw: PIO - var pioOffset: UInt32 - - init( - dataPin: UInt32, - ledCount: Int, - // FIXME: change to `PIO` - pio: UInt32, - pioSm: UInt32 - ) { - self.dataPin = dataPin - self.ledCount = ledCount - self.pio = pio - self.pioSm = pioSm - self.pioHw = - switch self.pio { - case 0: _pio0() - case 1: _pio1() - default: fatalError("Invalid PIO index") - } - self.pioOffset = 0 - - pio_gpio_init(self.pioHw, self.dataPin) - - // FIXME: lower quadrature_encoder_program_init max_step_rate - pio_sm_claim(self.pioHw, self.pioSm) - self.pioOffset = withUnsafePointer(to: ws2812_program) { - UInt32(pio_add_program(self.pioHw, $0)) - } - ws2812_program_init(self.pioHw, self.pioSm, self.pioOffset, self.dataPin, 800000, false) - } - - deinit { - withUnsafePointer(to: ws2812_program) { - pio_remove_program_and_unclaim_sm($0, self.pioHw, self.pioSm, self.pioOffset) - } - - gpio_deinit(self.dataPin) - } -} - -extension LEDStrip { - // mutating func putPixel(pixelGRB: UInt32) { - // pio_sm_put_blocking(self.pioHw, self.pioSm, pixelGRB << 8) - // } - - // func urgb_u32(_ r: UInt8, _ g: UInt8, _ b: UInt8) -> UInt32 { - // (UInt32(r) << 8) | (UInt32(g) << 16) | UInt32(b) - // } - - // mutating func patternSnakes(t: UInt32) { - // for i in 0..> 1)) % 64 - // if x < 10 { - // putPixel(pixelGRB: urgb_u32(0xff, 0, 0)) - // } else if x >= 15 && x < 25 { - // putPixel(pixelGRB: urgb_u32(0, 0xff, 0)) - // } else if x >= 30 && x < 40 { - // putPixel(pixelGRB: urgb_u32(0, 0, 0xff)) - // } else { - // putPixel(pixelGRB: 0) - // } - // } - // } - - mutating func setColor(red: UInt8, green: UInt8, blue: UInt8) { - for _ in 0.. StreamingSerialMessage, - terminator: StaticString = "\n" -) { - _ = message() - SerialPrinter().write(terminator) -} - -/// An implementation of `CharacterPrinter` that calls `putchar` to write to serial. -struct SerialPrinter: CharacterPrinter { - func write(rawByte: UInt8) { - _ = putchar(CInt(rawByte)) - } - - func write(contentsOf: Self) { - // Don't need to handle nested SerialPrinter objects: they will have - // already written out to serial. - } -} - -// String interpolation objects cast to this type will be streamed -// to serial via calls to `putchar`. -typealias StreamingSerialMessage = StreamingMessage - -/// This file provides functionality for logging interpolated strings without -/// requiring construction of String types (which are not available in Embedded -/// Swift). - -/// Types that implement `Loggable` are able to be logged using the -/// `StreamingInterpolation` mechanisms. -/// -/// The `write` function should write a human-readable instance of the object to -/// the passed-in `Printer` type: -/// -/// struct MyType: Loggable { -/// func write(to printer: Printer) { -/// printer.write("A static string") -/// printer.write(42) -/// printer.write(anyLoggableItem) -/// printer.write("A more \(complex) string \(interpolation)") -/// } -/// } -protocol Loggable: ~Copyable { - func write(to: Printer) -} - -/// A type that supports printing individual characters. -/// -/// Characters can either be streamed directly out to a log (e.g. stdout), or -/// buffered any manually written out by the user. -protocol CharacterPrinter { - /// Initialize a new instance. - /// - /// Unfortunately, Swift calls this from within the compiler's generated - /// code, with a fresh object created each time string interpolation is - /// used, and no chance to have any instance variables. - init() - - /// Write a single byte to output. - func write(rawByte: UInt8) - - /// Write the contents of the given `CharacterPrinter` to this - /// `CharacterPrinter`. - /// - /// This method is required to be implemented so that implementors of the - /// `Loggable` protocol can themselves use String Interpolation. - /// - /// Implementations of `CharacterPrinter` that don't buffer anything (for - /// example, if they just forward characters directly to `stdout`) need not - /// do anything here. However, implementations of `CharacterPrinter` that - /// are attempting to buffer the text will need to append the contents of - /// the child `CharacterPrinter` into the parent `CharacterPrinter`. - func write(contentsOf: Self) -} - -// Convenience functions for writing basic objects to a CharacterPrinter. -// -// Most types should either just implement `Loggable` (preferred), or implement -// their type as an overload to `StreamingInterpolation.appendInterpolation` -// directly (for generic types or types requiring additional parameters). -extension CharacterPrinter { - /// Write the given object that implements the `Loggable` interface to the - /// printer. - func write(_ value: some Loggable) { - value.write(to: self) - } - - /// Write an integer to the printer. - func write(_ value: some FixedWidthInteger) { - value.write(to: self) - } - - /// Write the given buffer to the printer. - /// - /// This function will print the entire buffer, including NUL bytes and - /// anything following them. To print NUL-terminated strings, see the - /// overload `write(nulTerminated)`. - func write(contentsOf buffer: UnsafeBufferPointer) { - self.write(contentsOf: UnsafeRawBufferPointer(buffer)) - } - - /// Write the given buffer to the printer. - /// - /// This function will print the entire buffer, including NUL bytes and - /// anything following them. To print NUL-terminated strings, see the - /// overload `write(nulTerminated)`. - @inline(never) // avoid aggressive inlining of non-perf-sensitive code - func write(contentsOf buffer: UnsafeRawBufferPointer) { - for c in buffer { - self.write(rawByte: c) - } - } - - /// Write a NULL-terminated (C style) string to the printer. - @inline(never) // avoid aggressive inlining of non-perf-sensitive code - func write(nullTerminated value: UnsafeBufferPointer) { - for c in value { - if c == 0 { - break - } - self.write(rawByte: UInt8(c)) - } - } - - // Write the given interpolated string to this character printer. - // - // This allows implementations of `Loggable` to themselves use interpolated - // strings: - // - // ``` - // class MyClass: Loggable { - // func write(printer: P) { - // printer.write("hello, \(self.world)") - // } - // } - // ``` - @_disfavoredOverload - func write(_ value: @autoclosure () -> StreamingMessage) { - self.write(contentsOf: value().printer) - } -} - -// Loggable implementation for various types. -extension Bool: Loggable { - func write(to printer: Printer) { - if self { - printer.write("true") - } else { - printer.write("false") - } - } -} - -extension StaticString: Loggable { - func write(to printer: Printer) { - self.withUTF8Buffer { - printer.write(contentsOf: $0) - } - } -} - -extension UnsafeRawBufferPointer: Loggable { - func write(to printer: Printer) { - let base = UInt(bitPattern: self.baseAddress) - printer.write("\(hex: base), count: \(self.count)") - } -} - -extension UnsafeMutableRawBufferPointer: Loggable { - func write(to printer: Printer) { - printer.write(UnsafeRawBufferPointer(self)) - } -} - -extension CharacterPrinter { - // Write the given UInt64 to a CharacterPrinter. - // - // We use this function so that all integer sizes can reuse the same version of - // the code in the compiled binary. - @inline(never) - fileprivate func write(value: UInt64, isNegative: Bool, radix: Int) { - precondition(radix == 10 || radix == 16) - - // Special case for zero, which otherwise would have no digits printed for - // it in the algorithm below. - if value == 0 { - if radix == 16 { - self.write("0x0") - } else { - self.write("0") - } - return - } - - // Convert the given digit to its ASCII code. - func _ascii(_ digit: UInt8) -> UInt8 { - if digit < 10 { - UInt8(("0" as Unicode.Scalar).value) + digit - } else { - UInt8(("a" as Unicode.Scalar).value) + (digit - 10) - } - } - - // Render to a temporary buffer. - // - // Worst case: 64-bit type and radix 10, requires `ceil(log_10(2**64)) == 20` - // characters to render. We use another for the negative sign, and another two - // for the `0x` prefix on base 16. - withUnsafeTemporaryAllocation(byteCount: 32, alignment: 1) { buffer in - var index = buffer.count - 1 - var value = value - while value != 0 { - let (quotient, remainder) = value.quotientAndRemainder( - dividingBy: UInt64(radix)) - buffer[index] = _ascii(UInt8(truncatingIfNeeded: remainder)) - index -= 1 - value = quotient - } - if radix == 16 { - buffer[index - 1] = UInt8(("0" as Unicode.Scalar).value) - buffer[index - 0] = UInt8(("x" as Unicode.Scalar).value) - index -= 2 - } - if isNegative { - buffer[index] = UInt8(("-" as Unicode.Scalar).value) - index -= 1 - } - let start = index + 1 - let end = buffer.count - 1 - let count = end - start + 1 - self.write( - contentsOf: - UnsafeBufferPointer( - start: buffer.baseAddress?.advanced(by: start).assumingMemoryBound( - to: UInt8.self), count: count)) - } - } -} - -// Functionality to write FixedWidthInteger types to a CharacterPrinter. -extension FixedWidthInteger { - // Write a FixedWidthInteger to the given CharacterPrinter in the given radix. - func write(to printer: some CharacterPrinter, radix: Int = 10) { - precondition(radix == 10 || radix == 16) - precondition(Self.bitWidth <= 64) - - let isNegative = Self.isSigned && self < (0 as Self) - let value = self.magnitude - printer.write(value: UInt64(value), isNegative: isNegative, radix: radix) - } -} - -// Write a `StringInterpolation` to the given `CharacterPrinter` type. -// -// That is, given a type `Printer` implementing the protocol -// `CharacterPrinter`, we will convert types used in string interpolations into -// a form that can be written out to the Printer. -// -// See Swift's documentation on `StringInterpolationProtocol` for details. -struct StreamingInterpolation: StringInterpolationProtocol -{ - typealias StringLiteralType = StaticString - var printer: P = P() - - init(literalCapacity: Int, interpolationCount: Int) {} - - // Write a string literal. - mutating func appendLiteral(_ literal: StaticString) { - printer.write(literal) - } - - // Write a StaticString interpolated variable. - mutating func appendInterpolation( - _ value: StaticString - ) { - printer.write(value) - } - - // Write a basic integer type (Int16, UInt64, etc). - mutating func appendInterpolation( - _ value: some FixedWidthInteger - ) { - printer.write(value) - } -} - -extension StreamingInterpolation { - mutating func appendInterpolation(cString pointer: UnsafePointer?) { - guard var pointer else { - self.printer.write("nil") - return - } - while pointer.pointee != 0 { - self.printer.write(rawByte: pointer.pointee) - pointer = pointer.advanced(by: 1) - } - } - - mutating func appendInterpolation(cString pointer: UnsafePointer?) { - guard var pointer else { - self.printer.write("nil") - return - } - while pointer.pointee != 0 { - self.printer.write(rawByte: UInt8(pointer.pointee)) - pointer = pointer.advanced(by: 1) - } - } - - mutating func appendInterpolation(cString buffer: UnsafeBufferPointer?) - { - guard let buffer else { - self.printer.write("nil") - return - } - for byte in buffer { - guard byte != 0 else { break } - self.printer.write(rawByte: byte) - } - } - -} - -extension StreamingInterpolation { - // Write a basic integer type in hex. - // - // This can be used by writing `"the value in hex is \(hex: value)."`. - mutating func appendInterpolation( - hex value: @autoclosure () -> Word - ) { - value().write(to: printer, radix: 16) - } - - // Write an object conforming to the `Loggable` protocol. - mutating func appendInterpolation( - _ value: @autoclosure () -> some Loggable - ) { - printer.write(value()) - } - - // Write a pointer's value. - mutating func appendInterpolation(_ value: some _Pointer) { - appendInterpolation(hex: UInt(bitPattern: value)) - } - - // Write a generic `UnsafeBufferPointer` value to the stream. - mutating func appendInterpolation( - _ value: @autoclosure () -> UnsafeBufferPointer - ) { - appendInterpolation(hex: UInt(bitPattern: value().baseAddress)) - appendInterpolation(", count: ") - appendInterpolation(value().count) - } - - // Write a generic `UnsafeMutableBufferPointer` value to the stream. - mutating func appendInterpolation( - _ value: @autoclosure () -> UnsafeMutableBufferPointer - ) { - appendInterpolation(UnsafeBufferPointer(value())) - } - -} - -// Initiates a StringInterpolation. -// -// See Swift's documentation on `StringInterpolationProtocol` for details. -struct StreamingMessage: ExpressibleByStringInterpolation { - typealias StringInterpolation = StreamingInterpolation

- - init(printer: P, stringInterpolation: StreamingInterpolation

) { - self.interpolation = stringInterpolation - } - - init(stringInterpolation: StreamingInterpolation

) { - self.interpolation = stringInterpolation - } - - init(stringLiteral value: StaticString) { - self.interpolation = StreamingInterpolation( - literalCapacity: 0, interpolationCount: 0) - self.interpolation.appendLiteral(value) - } - - var printer: P { interpolation.printer } - - private var interpolation: StreamingInterpolation

-} diff --git a/harmony/Sources/Application/Main.swift b/harmony/Sources/Application/Main.swift deleted file mode 100644 index 23eb9897..00000000 --- a/harmony/Sources/Application/Main.swift +++ /dev/null @@ -1,387 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2024 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -// swift-format-ignore: AlwaysUseLowerCamelCase, NeverForceUnwrap - -struct A2DPStreamEndpoint { - var a2dp_local_seid: UInt8 = 0 - var media_sbc_codec_configuration: (UInt8, UInt8, UInt8, UInt8) = (0, 0, 0, 0) -} - -var hci_event_callback_registration = btstack_packet_callback_registration_t() -var stream_endpoint = A2DPStreamEndpoint() - -// we support all configurations with bitpool 2-53 -var media_sbc_codec_capabilities: (UInt8, UInt8, UInt8, UInt8) = ( - //(AVDTP_SBC_44100 << 4) | AVDTP_SBC_STEREO, - 0xFF, - //(AVDTP_SBC_BLOCK_LENGTH_16 << 4) | (AVDTP_SBC_SUBBANDS_8 << 2) | AVDTP_SBC_ALLOCATION_METHOD_LOUDNESS, - 0xFF, - 2, 53 -) - -// FIXME: use Vector -let sdp_avdtp_sink_service_buffer = UnsafeMutableRawBufferPointer.allocate( - byteCount: 150, - alignment: MemoryLayout.alignment) -// FIXME: use Vector -let sdp_avrcp_target_service_buffer = UnsafeMutableRawBufferPointer.allocate( - byteCount: 150, - alignment: MemoryLayout.alignment) -// FIXME: use Vector -let sdp_avrcp_controller_service_buffer = - UnsafeMutableRawBufferPointer.allocate( - byteCount: 200, - alignment: MemoryLayout.alignment) -// FIXME: use Vector -let device_id_sdp_service_buffer = UnsafeMutableRawBufferPointer.allocate( - byteCount: 100, - alignment: MemoryLayout.alignment) - -// FIXME: use `Vector` -func buttonCallback(pin: UInt32, event: UInt32) { - guard event & UInt32(GPIO_IRQ_EDGE_FALL.rawValue) != 0 else { return } - Application.shared.buttonPressed(pin: pin) -} - -let BUFFER_SAMPLE_CAPACITY = 512 - - -let LED_STRIP_LED_COUNT = 20 - -let MUTE_BUTTON_PIN: UInt32 = 6 -let ROTARY_ENCODER_A_PIN : UInt32 = 7 -let ROTARY_ENCODER_B_PIN: UInt32 = 8 -let PLAY_PAUSE_BUTTON_PIN: UInt32 = 9 -let PREVIOUS_BUTTON_PIN: UInt32 = 10 -let NEXT_BUTTON_PIN: UInt32 = 11 -let LED_STRIP_PIN: UInt32 = 17 -let EM_DRIVE_PIN: UInt32 = 18 - -let WIRELESS_LED_PIN = UInt32(CYW43_WL_GPIO_LED_PIN) - -struct Application: ~Copyable { - var audioEngine = AudioEngine() - - var audioAnalyzer = AudioAnalyzer() - - let wirelessLedBlinkPeriodMs: UInt32 = 1000 - var wirelessLedBlinkTimer = btstack_timer_source_t() - var wirelessLedBlinkState = false - - let ledStripUpdatePeriodMs: UInt32 = 1000 - var ledStripUpdateTimer = btstack_timer_source_t() - var ledStrip = LEDStrip( - dataPin: LED_STRIP_PIN, - ledCount: LED_STRIP_LED_COUNT, - pio: 0, - pioSm: 1) - - let volumeKnobSamplerPeriodMs: UInt32 = 100 - var volumeKnobSamplerTimer = btstack_timer_source_t() - var volumeKnob = QuadratureEncoder( - pinA: ROTARY_ENCODER_A_PIN, - pinB: ROTARY_ENCODER_B_PIN, - pio: 1, - pioSm: 0) - - var previousPressTimes = ButtonTimes() - - var muteButton = Button( - pin: MUTE_BUTTON_PIN, - onPress: buttonCallback) - var nextButton = Button( - pin: NEXT_BUTTON_PIN, - onPress: buttonCallback) - var playPauseButton = Button( - pin: PLAY_PAUSE_BUTTON_PIN, - onPress: buttonCallback) - var previousButton = Button( - pin: PREVIOUS_BUTTON_PIN, - onPress: buttonCallback) - - mutating func run() { - stdio_init_all() - i2c_init() - - multicore_launch_core1 { - log("core1_main") - Application.shared.audioAnalyzer.run() - } - - log("Hello!") - log("sys clock running at \(clock_get_hz(clk_sys)) Hz") - log("Initializing cyw43_driver") - precondition(cyw43_arch_init() == 0, "cyw43_arch_init failed") - wirelessLedBlink(count: 2) - - gpio_init(EM_DRIVE_PIN) - gpio_set_dir(EM_DRIVE_PIN, true) - - var sdp = ServiceDiscoveryProtocol() - _setup_demo(&sdp) - - - // turn on! - log("Starting BTstack ...") - hci_power_control(HCI_POWER_ON) - wirelessLedBlink(count: 2) - log("[main] Started, starting btstack run loop") - - btstack_run_loop_set_timer_handler(&self.volumeKnobSamplerTimer) { timer in - guard let timer else { return } - Application.shared.volumeKnobSamplerHandler(&timer.pointee) - } - btstack_run_loop_set_timer(&self.volumeKnobSamplerTimer, volumeKnobSamplerPeriodMs) - btstack_run_loop_add_timer(&self.volumeKnobSamplerTimer) - - btstack_run_loop_set_timer_handler(&self.ledStripUpdateTimer) { timer in - guard let timer else { return } - Application.shared.ledStripUpdateHandler(&timer.pointee) - } - btstack_run_loop_set_timer(&self.ledStripUpdateTimer, ledStripUpdatePeriodMs) - btstack_run_loop_add_timer(&self.ledStripUpdateTimer) - - btstack_run_loop_set_timer_handler(&self.wirelessLedBlinkTimer) { timer in - guard let timer else { return } - Application.shared.wirelessLedBlinkHandler(&timer.pointee) - } - btstack_run_loop_set_timer(&self.wirelessLedBlinkTimer, wirelessLedBlinkPeriodMs) - btstack_run_loop_add_timer(&self.wirelessLedBlinkTimer) - - - btstack_run_loop_execute() // btstack_run_loop_execute never returns - _ = sdp // make sure SDP lives until the runloop exits - } -} - -// Timer handlers -extension Application { - mutating func volumeKnobSamplerHandler(_ timer: inout btstack_timer_source_t) { - let scaleFactor: Int32 = 5 - audioEngine.adjustVolume(by: Application.shared.volumeKnob.delta() * scaleFactor) - btstack_run_loop_set_timer(&timer, volumeKnobSamplerPeriodMs) - btstack_run_loop_add_timer(&timer) - } - - mutating func ledStripUpdateHandler(_ timer: inout btstack_timer_source_t) { - ledStrip.setColor( - red: .random(in: 0...255), - green: .random(in: 0...255), - blue: .random(in: 0...255)) - btstack_run_loop_set_timer(&timer, ledStripUpdatePeriodMs) - btstack_run_loop_add_timer(&timer) - } - - mutating func wirelessLedBlinkHandler(_ timer: inout btstack_timer_source_t) { - self.wirelessLedBlinkState.toggle() - cyw43_arch_gpio_put(WIRELESS_LED_PIN, self.wirelessLedBlinkState) - btstack_run_loop_set_timer(&timer, wirelessLedBlinkPeriodMs) - btstack_run_loop_add_timer(&timer) - } -} - -// Button press callbacks -extension Application { - // FIXME: use `time_us_64` - // This is a particularly large debounce time - static let buttonDebounceTimeMs = 150 - mutating func buttonPressed(pin: UInt32) { - let currentTime = to_ms_since_boot(get_absolute_time()) - guard currentTime - previousPressTimes[pin] > Self.buttonDebounceTimeMs else { - log("soft debounce \(pin)") - return - } - previousPressTimes[pin] = currentTime - - switch pin { - case MUTE_BUTTON_PIN: - self.toggleMute() - case NEXT_BUTTON_PIN: - self.nextTrack() - case PLAY_PAUSE_BUTTON_PIN: - self.playPauseTrack() - case PREVIOUS_BUTTON_PIN: - self.previousTrack() - default: - // ignore - break - } - } - - mutating func toggleMute() { - self.audioEngine.toggleMute() - } - - mutating func nextTrack() { - log("avrcp_controller_forward") - avrcp_controller_forward(avrcp_connection.avrcp_cid) - } - - mutating func playPauseTrack() { - // FIXME: this state management is almost certainly wrong - if audioEngine.running { - log("avrcp_controller_stop") - avrcp_controller_pause(avrcp_connection.avrcp_cid) - } else { - log("avrcp_controller_play") - avrcp_controller_play(avrcp_connection.avrcp_cid) - } - } - - mutating func previousTrack() { - log("avrcp_controller_backward") - avrcp_controller_backward(avrcp_connection.avrcp_cid) - } -} - -extension Application { - func wirelessLedBlink(count: UInt32) { - for _ in 0.. Int32 { - let value = quadrature_encoder_get_count(self.pioHw, self.pioSm) - self.previousValue = value - return value - } - - mutating func delta() -> Int32 { - let value = quadrature_encoder_get_count(self.pioHw, self.pioSm) - // NOTE: Thanks to two's complement arithmetic `delta`` will always be - // correct even when `value`` wraps around `Int32.max` / `Int32.min`. - let delta = value &- self.previousValue - self.previousValue = value - return delta - } -} diff --git a/harmony/Sources/Application/Stubs.swift b/harmony/Sources/Application/Stubs.swift deleted file mode 100644 index b6e8deb0..00000000 --- a/harmony/Sources/Application/Stubs.swift +++ /dev/null @@ -1,39 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2024 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -// Embedded Swift currently requires posix_memalign, but the C libraries in the -// Pico SDK do not provide it. Let's implement it and forward the calls to -// aligned_alloc(3). -@_cdecl("posix_memalign") -public func posix_memalign( - memptr: UnsafeMutablePointer, - alignment: size_t, - size: size_t -) -> Int32 { - if let allocation = aligned_alloc(alignment, size) { - memptr.pointee = allocation - return 0 - } - return _errno() -} - -// FIXME: document -@_cdecl("swift_isEscapingClosureAtFileLocation") -func swift_isEscapingClosureAtFileLocation( - object: UnsafeRawPointer, - filename: UnsafePointer, - filenameLength: Int32, - line: Int32, - column: Int32, - type: UInt -) -> Bool { - false -} diff --git a/harmony/Sources/Audio/AudioAnalyzer.swift b/harmony/Sources/Audio/AudioAnalyzer.swift deleted file mode 100644 index 1939fd3f..00000000 --- a/harmony/Sources/Audio/AudioAnalyzer.swift +++ /dev/null @@ -1,94 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2024 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -struct AnalyzedAudioBuffer: ~Copyable { - var enableMagnet: Bool - var buffer: AudioBuffer -} - -struct AudioAnalyzer: ~Copyable { - // FIXME: add soft limit for time magnet can be enabled - - var fft_instance: arm_rfft_instance_q15 - // Used for both sample input and fft magnitude output - var dataBuffer0: UnsafeMutableBufferPointer - // Used for fft output - var dataBuffer1: UnsafeMutableBufferPointer - - init() { - let audioBufferCapacity = BUFFER_SAMPLE_CAPACITY - let fftOutputBufferCapacity = BUFFER_SAMPLE_CAPACITY * 2 // real + complex - - self.fft_instance = arm_rfft_instance_q15() - self.dataBuffer0 = .allocate(capacity: audioBufferCapacity) - self.dataBuffer1 = .allocate(capacity: fftOutputBufferCapacity) - // IMPORTANT: `bitReverseFlag` must be set. I don't understand why based on - // the documentation - arm_rfft_init_q15(&fft_instance, UInt32(audioBufferCapacity), 0, 1) - } - - deinit { - self.dataBuffer1.deallocate() - self.dataBuffer0.deallocate() - } - - mutating func run() { - while true { - guard let buffer = Application.shared.audioEngine.buffers.popFullBuffer() else { continue } - - /// Copy data from buffer to dataBuffer0 (because the fft will modify the data) - precondition(self.dataBuffer0.update(from: buffer.storage).index == self.dataBuffer0.count) - // Perform the fft using the data in dataBuffer0 and store the result in dataBuffer1 - arm_rfft_q15(&self.fft_instance, self.dataBuffer0.baseAddress, self.dataBuffer1.baseAddress) - // Calculate the magnitude of the fft output in dataBuffer1 and store the result in dataBuffer0 - arm_cmplx_mag_q15(self.dataBuffer1.baseAddress, self.dataBuffer0.baseAddress, UInt32(self.dataBuffer0.count)) - - // NOTE: This is probably wrong becasue buffer.storage is stereo data - - // Given we take an fft of audio data at 44100 Hz with a window of 512 - // samples, each output bin of the fft represents a 172 Hz range - // (44100 Hz / 2 / 512 = ~172Hz) - - // 1 Khz - let lowend = - self.dataBuffer0[00] + - self.dataBuffer0[01] + - self.dataBuffer0[02] + - self.dataBuffer0[03] + - self.dataBuffer0[04] + - self.dataBuffer0[05] + - self.dataBuffer0[06] + - self.dataBuffer0[07] + - self.dataBuffer0[08] + - self.dataBuffer0[09] + - self.dataBuffer0[10] + - self.dataBuffer0[10] + - self.dataBuffer0[11] + - self.dataBuffer0[12] + - self.dataBuffer0[13] + - self.dataBuffer0[14] + - self.dataBuffer0[15] + - self.dataBuffer0[16] + - self.dataBuffer0[17] + - self.dataBuffer0[18] + - self.dataBuffer0[19] - - - - let avg = lowend / 20 - - let analyzedBuffer = AnalyzedAudioBuffer( - enableMagnet: avg > (1 << 8), - buffer: buffer) - Application.shared.audioEngine.buffers.pushAnalyzedBuffer(analyzedBuffer) - } - } -} diff --git a/harmony/Sources/Audio/AudioBuffer.swift b/harmony/Sources/Audio/AudioBuffer.swift deleted file mode 100644 index 49431b52..00000000 --- a/harmony/Sources/Audio/AudioBuffer.swift +++ /dev/null @@ -1,28 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2024 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -struct AudioBuffer: ~Copyable { - // FIXME: Raw - var storage: UnsafeMutableBufferPointer - var capacity: Int { self.storage.count } - var count: Int - - init(capacity: Int) { - self.storage = .allocate(capacity: capacity) - self.storage.initialize(repeating: 0) - // FIXME: don't assume filled. - self.count = capacity - } - - deinit { - self.storage.deallocate() - } -} diff --git a/harmony/Sources/Audio/AudioBufferTransport.swift b/harmony/Sources/Audio/AudioBufferTransport.swift deleted file mode 100644 index 907637d3..00000000 --- a/harmony/Sources/Audio/AudioBufferTransport.swift +++ /dev/null @@ -1,54 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2024 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -struct AudioBufferTransport: ~Copyable { - var emptyBuffers: Ring - var fullBuffers: Ring - var analyzedBuffers: Ring - - init(bufferCount: Int, bufferCapacity: Int) { - // Ring buffer needs one extra slot to distinguish between empty and full. - self.emptyBuffers = Ring(capacity: bufferCount + 1) - self.fullBuffers = Ring(capacity: bufferCount + 1) - self.analyzedBuffers = Ring(capacity: bufferCount + 1) - - for _ in 0.. AudioBuffer? { - self.emptyBuffers.pop() - } - - mutating func pushFullBuffer(_ buffer: consuming AudioBuffer) { - self.fullBuffers.push(buffer) - } - - mutating func popFullBuffer() -> AudioBuffer? { - self.fullBuffers.pop() - } - - mutating func pushAnalyzedBuffer(_ buffer: consuming AnalyzedAudioBuffer) { - self.analyzedBuffers.push(buffer) - } - - mutating func popAnalyzedBuffer() -> AnalyzedAudioBuffer? { - self.analyzedBuffers.pop() - } -} diff --git a/harmony/Sources/Audio/AudioEngine.swift b/harmony/Sources/Audio/AudioEngine.swift deleted file mode 100644 index 660b2367..00000000 --- a/harmony/Sources/Audio/AudioEngine.swift +++ /dev/null @@ -1,120 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2024 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -struct AudioEngine: ~Copyable { - var running: Bool - var mute: Bool - var volume: UInt8 - var rawVolume: UInt8 - - var audio_pico: AudioPico - var audio_i2s: AudioI2S - var buffers: AudioBufferTransport - var amp: MAX9744 - - init() { - self.running = false - self.mute = false - self.volume = 0 - self.rawVolume = 30 - - self.audio_pico = AudioPico() - self.audio_i2s = AudioI2S( - data_pin: PICO_AUDIO_I2S_DATA_PIN, - clock_pin_base: PICO_AUDIO_I2S_CLOCK_PIN_BASE, - pio: 0, - pio_sm: 0, - // FIXME: Dont claim on each `media_processing_init`?? - dma_channel: UInt32(dma_claim_unused_channel(true))) - self.buffers = AudioBufferTransport(bufferCount: 8, bufferCapacity: BUFFER_SAMPLE_CAPACITY) - self.amp = MAX9744(i2c: i2c0_inst) - - self.set(volume: 0) - } -} - -extension AudioEngine { - mutating func `init`(_ configuration: MediaCodecConfigurationSBC) { - log(#function) - SBCDecoder.configure(mode: SBC_MODE_STANDARD) - - // setup audio playback - // FIXME: update channel count in resampler - // FIXME: update output sample-rate - - self.audio_i2s.update_pio_frequency( - UInt32(configuration.sampling_frequency)) - - self.running = false - } - - mutating func toggleMute() { - self.mute.toggle() - if self.mute { - self.amp.set(rawVolume: 0) - } else { - self.amp.set(rawVolume: rawVolume) - } - } - - mutating func set(volume: UInt8) { - guard self.volume != volume else { return } - self.volume = volume - // FIXME: - avrcp_target_volume_changed(avrcp_connection.avrcp_cid, volume >> 1) - - // Map volume (0-255) to gain (0-63) - let rawVolume = UInt8((UInt32(volume) * 63) / 255) - guard self.rawVolume != rawVolume else { return } - self.rawVolume = rawVolume - - guard !self.mute else { return } - self.amp.set(rawVolume: rawVolume) - } - - mutating func adjustVolume(by delta: Int32) { - guard delta != 0 else { return } - let volume = Int32(self.volume) + delta - let clamped = UInt8(clamping: volume) - log("Adjust volume by \(delta) to \(clamped)") - self.set(volume: clamped) - } - - mutating func start() { - guard !self.running else { return } - guard self.audio_pico.sbc_frames.count >= OPTIMAL_FRAMES_MIN else { return } - log(#function) - // start audio playback - self.audio_pico.start_stream() - self.audio_i2s.enable(true) - self.running = true - } - - mutating func pause() { - guard self.running else { return } - log(#function) - self.close() - } - - mutating func close() { - log(#function) - - // stop audio playback - self.running = false - self.audio_pico.stop_stream() - self.audio_i2s.enable(false) - - // discard pending data - self.audio_pico.decoded_audio.clear() - self.audio_pico.sbc_frame_size = 0 - self.audio_pico.sbc_frames.clear() - } -} diff --git a/harmony/Sources/Audio/AudioI2S.swift b/harmony/Sources/Audio/AudioI2S.swift deleted file mode 100644 index 52e4b96d..00000000 --- a/harmony/Sources/Audio/AudioI2S.swift +++ /dev/null @@ -1,174 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2024 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -var zero: UInt32 = 0 - -// FIXME: #define __time_critical_func(func_name) __not_in_flash_func(func_name) -// irq handler for DMA -@_cdecl("audio_i2s_dma_irq_handler") -func audio_i2s_dma_irq_handler() { - Application.shared.audioEngine.audio_i2s.handle_dma_irq() -} - -struct AudioI2S: ~Copyable { - var enabled: Bool - var freq: UInt32 - var playing_buffer: AudioBuffer? - - var pio: UInt32 - var pio_sm: UInt32 - var dma_channel: UInt32 - var pioHw: PIO - - init( - data_pin: UInt32, - clock_pin_base: UInt32, - pio: UInt32, - pio_sm: UInt32, - // FIXME: dma_channel is already claimed - dma_channel: UInt32, - ) { - self.enabled = false - self.freq = 0 - - self.pio = pio - self.pio_sm = pio_sm - self.dma_channel = dma_channel - - let gpioFunc: gpio_function_rp2040 - switch pio { - case 0: - self.pioHw = _pio0() - gpioFunc = GPIO_FUNC_PIO0 - case 1: - self.pioHw = _pio1() - gpioFunc = GPIO_FUNC_PIO1 - default: - fatalError("Invalid PIO index") - } - - gpio_set_function(data_pin, gpioFunc) - gpio_set_function(clock_pin_base, gpioFunc) - gpio_set_function(clock_pin_base + 1, gpioFunc) - - pio_sm_claim(self.pioHw, self.pio_sm) - - let offset = withUnsafePointer(to: audio_i2s_program) { - pio_add_program(self.pioHw, $0) - } - - audio_i2s_program_init( - self.pioHw, self.pio_sm, UInt32(offset), data_pin, clock_pin_base) - - __mem_fence_release() - - var dma_config = dma_channel_get_default_config(dma_channel) - - channel_config_set_dreq( - &dma_config, - UInt32(DREQ_PIO0_TX0.rawValue) + self.pio_sm) - - channel_config_set_transfer_data_size(&dma_config, i2s_dma_configure_size) - dma_channel_configure( - dma_channel, - &dma_config, - // FIXME: .advanced(by: Int(self.pio_sm)) - self.pioHw.pointer(to: \.txf), // dest - nil, // src - 0, // count - false) // trigger - - irq_add_shared_handler( - UInt32(DMA_IRQ_0.rawValue) + PICO_AUDIO_I2S_DMA_IRQ, - audio_i2s_dma_irq_handler, - UInt8(PICO_SHARED_IRQ_HANDLER_DEFAULT_ORDER_PRIORITY)) - dma_irqn_set_channel_enabled(PICO_AUDIO_I2S_DMA_IRQ, dma_channel, true) - } - - mutating func enable(_ enable: Bool) { - guard self.enabled != enable else { return } - self.enabled = enable - - irq_set_enabled(UInt32(DMA_IRQ_0.rawValue) + PICO_AUDIO_I2S_DMA_IRQ, enable) - - if enable { - self.audio_start_dma_transfer() - } else { - // if there was a buffer in flight, it will not be freed by DMA IRQ, - // let's do it manually - self.audio_finish_dma_transfer() - gpio_put(EM_DRIVE_PIN, false) - } - - pio_sm_set_enabled(self.pioHw, self.pio_sm, enable) - } - - mutating func update_pio_frequency(_ sample_freq: UInt32?) { - guard let sample_freq = sample_freq else { return } - guard sample_freq != self.freq else { return } - - let system_clock_frequency = clock_get_hz(clk_sys) - precondition(system_clock_frequency < 0x4000_0000) - // avoid arithmetic overflow - let divider = system_clock_frequency * 4 / sample_freq - precondition(divider < 0x1000000) - pio_sm_set_clkdiv_int_frac( - self.pioHw, self.pio_sm, UInt16(divider >> 8), UInt8(divider & 0xff)) - self.freq = sample_freq - } - - mutating func handle_dma_irq() { - guard dma_irqn_get_channel_status(PICO_AUDIO_I2S_DMA_IRQ, self.dma_channel) - else { return } - dma_irqn_acknowledge_channel(PICO_AUDIO_I2S_DMA_IRQ, self.dma_channel) - - // free the buffer we just finished - self.audio_finish_dma_transfer() - self.audio_start_dma_transfer() - } - - mutating func audio_start_dma_transfer() { - precondition(self.playing_buffer == nil) - - // FIXME: support dynamic frequency shifting - - if let ab = Application.shared.audioEngine.buffers.popAnalyzedBuffer() { - gpio_put(EM_DRIVE_PIN, ab.enableMagnet) - - let ab = ab.buffer - let buf = UnsafeMutableRawBufferPointer(ab.storage) - self.playing_buffer = consume ab - - var c = dma_get_channel_config(self.dma_channel) - channel_config_set_read_increment(&c, true) - dma_channel_set_config(self.dma_channel, &c, false) - dma_channel_transfer_from_buffer_now( - self.dma_channel, - buf.baseAddress, - // FIXME: using capacity instead of ab count - UInt32(buf.count) / 4) - } else { - gpio_put(EM_DRIVE_PIN, false) - log("buffer pool low") - // just play some silence - var c = dma_get_channel_config(self.dma_channel) - channel_config_set_read_increment(&c, false) - dma_channel_set_config(self.dma_channel, &c, false) - dma_channel_transfer_from_buffer_now( - self.dma_channel, &zero, PICO_AUDIO_I2S_SILENCE_BUFFER_SAMPLE_LENGTH) - } - } - - mutating func audio_finish_dma_transfer() { - guard let playingBuffer = self.playing_buffer.take() else { return } - Application.shared.audioEngine.buffers.pushEmptyBuffer(playingBuffer) - } -} diff --git a/harmony/Sources/Audio/AudioPico.swift b/harmony/Sources/Audio/AudioPico.swift deleted file mode 100644 index ef540daf..00000000 --- a/harmony/Sources/Audio/AudioPico.swift +++ /dev/null @@ -1,181 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2024 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -extension UnsafeMutableBufferPointer where Element: ~Copyable { - func split(at index: Self.Index) -> (Self, Self) { - (self.extracting(.. - var sbc_frames: RingBuffer - var sbc_frames_in_buffer: Int { - guard sbc_frame_size > 0 else { return 0 } - return self.sbc_frames.count / self.sbc_frame_size - } - - // overflow buffer for not fully used sbc frames, with additional frames for resampling - let decoded_audio_buffer: UnsafeMutableBufferPointer - var decoded_audio: RingBuffer - - init() { - let CHANNELS_PER_FRAME = 2 - let capacity = (128 + 16) * CHANNELS_PER_FRAME - - self.fill_timer = btstack_timer_source_t() - self.resampler = Resampler(channels: CHANNELS_PER_FRAME) - - self.sbc_frame_size = 0 - self.sbc_frame_buffer = UnsafeMutableBufferPointer.allocate( - capacity: MAX_SBC_FRAME_SIZE) - self.sbc_frames = RingBuffer( - capacity: (OPTIMAL_FRAMES_MAX + ADDITIONAL_FRAMES) * MAX_SBC_FRAME_SIZE) - - self.decoded_audio_buffer = .allocate(capacity: capacity) - self.decoded_audio = RingBuffer(capacity: capacity) - } - - mutating func enqueue(sbc_frames: UnsafeMutableBufferPointer, frame_size: Int) - { - self.sbc_frame_size = frame_size - if !self.sbc_frames.write(contentsOf: sbc_frames) { - log("Error: SBC frame buffer overflow") - } - self.updateResamplingFactor() - } - - mutating func updateResamplingFactor() { - let nominal_factor: UInt32 = 0x10000 - let compensation: UInt32 = 0x00100 - - let resampling_factor = - switch self.sbc_frames_in_buffer { - case ..) { - // called from lower-layer but guaranteed to be on main thread - guard self.sbc_frame_size != 0 else { - log("Frame size is 0") - buffer.update(repeating: 0) - return - } - - // first fill from resampled audio - let samplesReadCount = self.decoded_audio.read(into: buffer) - var buffer = buffer.extracting(samplesReadCount...) - - // then start decoding sbc frames into the buffer - while buffer.count > 0, self.sbc_frames.count > self.sbc_frame_size { - // decode frame - let elementsRead = self.sbc_frames.read( - into: self.sbc_frame_buffer, count: self.sbc_frame_size) - precondition( - elementsRead == self.sbc_frame_size, "sbc frame size mismatch") - - SBCDecoder.decode_signed_16( - mode: SBC_MODE_STANDARD, - packet_status_flag: 0, - buffer: UnsafeRawBufferPointer(self.sbc_frame_buffer) - ) { samples, num_channels, sample_rate in - precondition(num_channels == 2, "must be stereo") - - // Resample audio to compensate for the amount of buffered SBC frames - let samples = self.resampler.resample( - samples: .init(samples), - usingTemporaryBuffer: self.decoded_audio_buffer) - - // Store samples in buffer first and excess in the ring buffer. - let (samples_to_copy, samples_to_store) = samples.split( - at: min(samples.count, buffer.count)) - let samplesCopiedCount = buffer.moveUpdate( - fromContentsOf: samples_to_copy) - buffer = buffer.extracting(samplesCopiedCount...) - if !self.decoded_audio.write(contentsOf: samples_to_store) { - log("ERROR: PCM ring buffer full!") - } - } - } - } - - mutating func fill_timer( - _ timer: UnsafeMutablePointer? - ) { - // refill - self.fill_buffers() - - // re-set timer - btstack_run_loop_set_timer(timer, UInt32(DRIVER_POLL_INTERVAL_MS)) - btstack_run_loop_add_timer(timer) - } - - mutating func start_stream() { - // pre-fill buffers - self.fill_buffers() - - // start timer - // FIXME: Use ctx - // NOTE: hardcoded to `Self` because the timer callback has no context - // argument which can be used to pass `self` - btstack_run_loop_set_timer_handler( - &self.fill_timer, { Application.shared.audioEngine.audio_pico.fill_timer($0) }) - btstack_run_loop_set_timer_context(&self.fill_timer, nil) - btstack_run_loop_set_timer( - &self.fill_timer, UInt32(DRIVER_POLL_INTERVAL_MS)) - btstack_run_loop_add_timer(&self.fill_timer) - } - - mutating func stop_stream() { - // stop timer - btstack_run_loop_remove_timer(&self.fill_timer) - } -} diff --git a/harmony/Sources/Audio/MAX9744.swift b/harmony/Sources/Audio/MAX9744.swift deleted file mode 100644 index 6c969508..00000000 --- a/harmony/Sources/Audio/MAX9744.swift +++ /dev/null @@ -1,105 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2024 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -struct MAX9744: ~Copyable { - static let i2cAddress: UInt8 = 0x4B // 7 bit address - static let absoluteVolumeControlRegisterAddress: UInt8 = 0x0 - - static let modulationControlRegisterAddress: UInt8 = 0x1 - static let filterlessModulationBitPattern: UInt8 = 0x0 - static let pwmModulationBitPattern: UInt8 = 0x1 - - static let incrementalVolumeControlRegisterAddress: UInt8 = 0x3 - static let increaseVolumeBitPattern: UInt8 = 0x4 - static let decreaseVolumeBitPattern: UInt8 = 0x5 - - var i2c: i2c_inst_t - - init(i2c: i2c_inst_t) { - self.i2c = i2c - } -} - -extension MAX9744 { - static func validAddress(_ address: UInt8) -> Bool { - switch address { - case Self.absoluteVolumeControlRegisterAddress: true - case Self.filterlessModulationBitPattern: true - case Self.incrementalVolumeControlRegisterAddress: true - default: false - } - } - - mutating func write(address: UInt8, value: UInt8) { - precondition(Self.validAddress(address)) - var data = (address << 6) | value - log("attempting to write \(hex: data)") - let size = MemoryLayout.size(ofValue: data) - let result = i2c_write_blocking( - &self.i2c, - Self.i2cAddress, - &data, - size, - false) - precondition(result == size, "I2C write failed") - } - - mutating func read(address: UInt8) -> UInt8 { - precondition(Self.validAddress(address)) - var data = address << 6 - let size = MemoryLayout.size(ofValue: data) - let readResult = i2c_read_blocking( - &self.i2c, - Self.i2cAddress, - &data, - size, - false) - precondition(readResult == size, "I2C read failed") - return data - } -} - -extension MAX9744 { - /// 6 bit value ranging from 0 (mute) to 63 (+ 9.5 dB) - mutating func set(rawVolume: UInt8) { - precondition(0 <= rawVolume && rawVolume <= 63) - self.write( - address: Self.absoluteVolumeControlRegisterAddress, - value: rawVolume) - } - - enum ModulationMode { - case filterless - case pwm - } - - mutating func set(moduluationMode: ModulationMode) { - let modulationBitPattern = switch moduluationMode { - case .filterless: Self.filterlessModulationBitPattern - case .pwm: Self.pwmModulationBitPattern - } - self.write( - address: Self.modulationControlRegisterAddress, - value: modulationBitPattern) - } - - mutating func increaseVolume() { - self.write( - address: Self.incrementalVolumeControlRegisterAddress, - value: Self.increaseVolumeBitPattern) - } - - mutating func decreaseVolume() { - self.write( - address: Self.incrementalVolumeControlRegisterAddress, - value: Self.decreaseVolumeBitPattern) - } -} diff --git a/harmony/Sources/Audio/Resampler.swift b/harmony/Sources/Audio/Resampler.swift deleted file mode 100644 index ef4cd8bb..00000000 --- a/harmony/Sources/Audio/Resampler.swift +++ /dev/null @@ -1,52 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2024 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -struct Resampler: ~Copyable { - var channels: Int - var context: btstack_resample_t - - init(channels: Int) { - self.channels = channels - self.context = btstack_resample_t() - btstack_resample_init(&self.context, Int32(channels)) - } - - mutating func set(channels: Int) { - self.channels = channels - btstack_resample_init(&self.context, Int32(channels)) - } - - mutating func set(factor: UInt32) { - btstack_resample_set_factor(&self.context, factor) - } - - /// Resamples the given samples using the previously set resampling factor. - /// - /// Returns a slice of the temporary buffer that contains the resampled audio. - mutating func resample( - samples: UnsafeBufferPointer, - usingTemporaryBuffer buffer: UnsafeMutableBufferPointer - ) -> UnsafeMutableBufferPointer { - precondition(samples.count.isMultiple(of: self.channels)) - - // FIXME: understand why this is not `samples.count / self.channels` - // The documentation just calls this parameter `numFrames` which implies - // the sample count should be divided by the channel count. - let inputFrameCount = samples.count - let resampledFrameCount = btstack_resample_block( - &self.context, - samples.baseAddress, - UInt32(inputFrameCount), - buffer.baseAddress) - let resampledSampleCount = Int(resampledFrameCount) * self.channels - return buffer.extracting(..: ~Copyable { - // FIMXE: Use an inline allocation like `Vector` - var storage: UnsafeMutableBufferPointer - var readerIndex: Int - var writerIndex: Int - - init(capacity: Int) { - self.storage = .allocate(capacity: capacity) - self.readerIndex = 0 - self.writerIndex = 0 - } - - deinit { - var readerIndex = self.readerIndex - while self.readerIndex != self.writerIndex { - self.storage.deinitializeElement(at: readerIndex) - readerIndex = (readerIndex + 1) % self.storage.count - } - // FIXME: why can't we use a mutating method here? - // while _ = self.pop() { } - self.storage.deallocate() - } -} - -extension Ring where Element: ~Copyable { - mutating func push(_ element: consuming Element) { - let nextWriterIndex = (self.writerIndex + 1) % self.storage.count - guard nextWriterIndex != self.readerIndex else { fatalError("Overflow") } - self.storage.initializeElement(at: self.writerIndex, to: element) - __dsb() // Make sure the element is written before updating the index - self.writerIndex = nextWriterIndex - } - - mutating func pop() -> Element? { - guard self.readerIndex != self.writerIndex else { return nil } - let element = self.storage.moveElement(from: self.readerIndex) - __dsb() // Make sure the element is read before updating the index - self.readerIndex = (self.readerIndex + 1) % self.storage.count - return element - } -} diff --git a/harmony/Sources/Audio/RingBuffer.swift b/harmony/Sources/Audio/RingBuffer.swift deleted file mode 100644 index 11a30d0e..00000000 --- a/harmony/Sources/Audio/RingBuffer.swift +++ /dev/null @@ -1,126 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2024 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -// FIXME: RingBuffer -struct RingBuffer: ~Copyable { - // FIMXE: Use an inline allocation like `Vector` - var storage: UnsafeMutableBufferPointer - var count: Int - var readerIndex: Int - var writerIndex: Int - - init(capacity: Int) { - self.storage = .allocate(capacity: capacity) - self.readerIndex = 0 - self.writerIndex = 0 - self.count = 0 - } - - deinit { - self.storage.deallocate() - } -} - -extension RingBuffer { - var capacity: Int { self.storage.count } - var availableCapacity: Int { self.capacity - self.count } - var isEmpty: Bool { self.count == 0 } - var isFull: Bool { self.count == self.capacity } -} - -extension RingBuffer { - mutating func clear() { - // Forget about the contents of `storage`, this is safe because - // `Element` is `BitwiseCopyable`. - self.count = 0 - self.readerIndex = 0 - self.writerIndex = 0 - } - - mutating func read( - into buffer: UnsafeMutableBufferPointer, - count: Int? = nil - ) -> Int { - let elementsToRead = min(buffer.count, count ?? Int.max, self.count) - - // Reading 0 elements is a no-op. - guard elementsToRead > 0 else { return elementsToRead } - - // Read the initial elements from the end of the ring buffer. - let elementsUntilEnd = self.capacity - self.readerIndex - let elementsToReadFirstHalf = min(elementsUntilEnd, elementsToRead) - buffer.baseAddress!.update( - from: self.storage.baseAddress! + self.readerIndex, - count: elementsToReadFirstHalf) - self.readerIndex += elementsToReadFirstHalf - - // Update the reader index to wrap if needed. - if self.readerIndex == self.capacity { - self.readerIndex = 0 - } - - // Read the remaining elements from the beginning of the ring buffer. - let elementsToReadSecondHalf = elementsToRead - elementsToReadFirstHalf - precondition(elementsToReadSecondHalf >= 0) - (buffer.baseAddress! + elementsToReadFirstHalf).update( - from: self.storage.baseAddress! + self.readerIndex, - count: elementsToReadSecondHalf) - self.readerIndex += elementsToReadSecondHalf - - // Update bookkeeping with the new count. - self.count -= elementsToRead - - return elementsToRead - } - - mutating func write( - contentsOf buffer: UnsafeMutableBufferPointer - ) -> Bool { - self.write(contentsOf: UnsafeBufferPointer(buffer)) - } - - mutating func write( - contentsOf buffer: UnsafeBufferPointer - ) -> Bool { - let elementsToWrite = buffer.count - - // Writing 0 elements is a no-op. - guard elementsToWrite > 0 else { return true } - // Writing more than the available capacity is an error. - guard elementsToWrite <= self.availableCapacity else { return false } - - // Write the initial elements to the end of the ring buffer. - let elementsUntilEnd = self.capacity - self.writerIndex - let elementsToWriteFirstHalf = min(elementsUntilEnd, elementsToWrite) - (self.storage.baseAddress! + self.writerIndex).update( - from: buffer.baseAddress!, - count: elementsToWriteFirstHalf) - self.writerIndex += elementsToWriteFirstHalf - - // Update the writer index to wrap if needed. - if self.writerIndex == self.capacity { - self.writerIndex = 0 - } - - // Write the remaining elements to the beginning of the ring buffer. - let elementsToWriteSecondHalf = elementsToWrite - elementsToWriteFirstHalf - precondition(elementsToWriteSecondHalf >= 0) - (self.storage.baseAddress! + self.writerIndex).update( - from: buffer.baseAddress! + elementsToWriteFirstHalf, - count: elementsToWriteSecondHalf) - self.writerIndex += elementsToWriteSecondHalf - - // Update bookkeeping with the new count. - self.count += elementsToWrite - - return true - } -} diff --git a/harmony/Sources/Audio/SpinLock.swift b/harmony/Sources/Audio/SpinLock.swift deleted file mode 100644 index 8212f04f..00000000 --- a/harmony/Sources/Audio/SpinLock.swift +++ /dev/null @@ -1,38 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2024 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -struct SpinLock: ~Copyable { - var _lock: UnsafeMutablePointer - var value: Value - - init(index: Int, initialValue: consuming Value) { - self._lock = spin_lock_init(UInt32(index)) - self.value = initialValue - } -} - -extension SpinLock where Value: ~Copyable { - func lock() -> UInt32 { - spin_lock_blocking(self._lock) - } - - func unlock(irq_mask: UInt32) { - spin_unlock(self._lock, irq_mask) - } - - mutating func withLock( - _ body: (inout Value) throws(Error) -> Result - ) throws(Error) -> Result where Result: ~Copyable { - let irq_mask = self.lock() - defer { self.unlock(irq_mask: irq_mask) } - return try body(&self.value) - } -} diff --git a/harmony/Sources/Audio/TPA2016D2.swift b/harmony/Sources/Audio/TPA2016D2.swift deleted file mode 100644 index 59b56640..00000000 --- a/harmony/Sources/Audio/TPA2016D2.swift +++ /dev/null @@ -1,118 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2024 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -func i2c_init() { - i2c_init(&i2c0_inst, 100 * 1000) // 400kHz "Fast Mode" - gpio_set_function(UInt32(PICO_DEFAULT_I2C_SDA_PIN), GPIO_FUNC_I2C) - gpio_set_function(UInt32(PICO_DEFAULT_I2C_SCL_PIN), GPIO_FUNC_I2C) - gpio_pull_up(UInt32(PICO_DEFAULT_I2C_SDA_PIN)) - gpio_pull_up(UInt32(PICO_DEFAULT_I2C_SCL_PIN)) - - // I2C reserves some addresses for special purposes. We exclude these from the scan. - // These are any addresses of the form 000 0xxx or 111 1xxx - func reserved_addr(_ addr: UInt8) -> Bool{ - return (addr & 0x78) == 0 || (addr & 0x78) == 0x78 - } - - log("\nI2C Bus Scan") - log(" 0 1 2 3 4 5 6 7 8 9 A B C D E F") - for addr in UInt8(0) ..< (1 << 7) { - if addr.isMultiple(of: 16) { - log("\(addr >> 4) ", terminator: "") - } - - // Perform a 1-byte dummy read from the probe address. If a slave - // acknowledges this address, the function returns the number of bytes - // transferred. If the address byte is ignored, the function returns - // -1. - - // Skip over any reserved addresses. - var rxdata: UInt8 = 0 - let ret = if reserved_addr(addr) { - Int32(PICO_ERROR_GENERIC.rawValue) - } else { - i2c_read_blocking(&i2c0_inst, addr, &rxdata, 1, false) - } - - log(ret < 0 ? "." : "@", terminator: addr % 16 == 15 ? "\n" : " ") - } - log("Done.\n") -} - -struct TPA2016D2: ~Copyable { - static let address: UInt8 = 0x58 // 7 bit address - static let IC_FUNCTION_CONTROL: UInt8 = 0x1 - static let AGC_ATTACK_CONTROL: UInt8 = 0x2 - static let AGC_RELEASE_CONTROL: UInt8 = 0x3 - static let AGC_HOLD_TIME_CONTROL: UInt8 = 0x4 - static let AGC_FIXED_GAIN_CONTROL: UInt8 = 0x5 - static let AGC_CONTROL_0: UInt8 = 0x6 - static let AGC_CONTROL_1: UInt8 = 0x7 - - var i2c: i2c_inst_t - - init(i2c: i2c_inst_t) { - self.i2c = i2c - - for r in UInt8(0x1) ... 0x7 { - log("Register \(hex: r); read \(hex: self.read(address: r))") - } - - // Immediately configure the amp to our desired defaults. - // Disable AGC (Automatic Gain Control). - self.write(address: Self.AGC_CONTROL_1, value: 0x0) - // Disable Output Limiter - self.write(address: Self.AGC_CONTROL_0, value: 1 << 7) - // Set the attack time to the fastest setting (0.1067 ms per step) - self.write(address: Self.AGC_ATTACK_CONTROL, value: 1) - // Set the release time to the fastest setting (0.0137 s per step) - self.write(address: Self.AGC_RELEASE_CONTROL, value: 1) - // Disable the hold time entirely - self.write(address: Self.AGC_HOLD_TIME_CONTROL, value: 0) - } -} - -extension TPA2016D2 { - mutating func write(address: UInt8, value: UInt8) { - var combined: UInt16 = (UInt16(value) << 8) | UInt16(address) - let result = i2c_write_blocking( - &self.i2c, - Self.address, - &combined, - MemoryLayout.size(ofValue: combined), - false) - precondition(result == 2, "I2C write failed") - // log("Register \(hex: address); wrote \(hex: value) - read \(hex: self.read(address: address))") - } - - mutating func read(address: UInt8) -> UInt8 { - var data = address - let writeResult = i2c_write_blocking(&self.i2c, Self.address, &data, 1, false) - precondition(writeResult == 1, "I2C write failed") - let readResult = i2c_read_blocking(&self.i2c, Self.address, &data, 1, false) - precondition(readResult == 1, "I2C read failed") - return data - } -} - -extension TPA2016D2 { - // scale from 0 to 255 - mutating func set(gain: UInt8) { - precondition(0 <= gain && gain <= 30) - self.write(address: Self.AGC_FIXED_GAIN_CONTROL, value: gain) - } - - mutating func mute(_ mute: Bool) { - var value = self.read(address: Self.IC_FUNCTION_CONTROL) - value = mute ? value | (1 << 5) : value & ~(1 << 5) - self.write(address: Self.IC_FUNCTION_CONTROL, value: value) - } -} diff --git a/harmony/Sources/Audio/Timer.swift b/harmony/Sources/Audio/Timer.swift deleted file mode 100644 index acad420a..00000000 --- a/harmony/Sources/Audio/Timer.swift +++ /dev/null @@ -1,20 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2024 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -// struct Timer: ~Copyable, ~Escapable { -// var context: UnsafePointer - -// init(context: borrowing Context) dependsOn(context) { -// withUnsafePointerToInstance(context) { context in -// self.context = context -// } -// } -// } \ No newline at end of file diff --git a/harmony/Sources/Bluetooth/A2DP.swift b/harmony/Sources/Bluetooth/A2DP.swift deleted file mode 100644 index ebb257f6..00000000 --- a/harmony/Sources/Bluetooth/A2DP.swift +++ /dev/null @@ -1,300 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2024 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -// Advanced Audio Distribution Profile - -struct MediaCodecConfigurationSBC { - var reconfigure: UInt8 - var num_channels: UInt8 - var sampling_frequency: UInt16 - var block_length: UInt8 - var subbands: UInt8 - var min_bitpool_value: UInt8 - var max_bitpool_value: UInt8 - var channel_mode: btstack_sbc_channel_mode_t - var allocation_method: btstack_sbc_allocation_method_t - - init() { - self.reconfigure = 0 - self.num_channels = 0 - self.sampling_frequency = 0 - self.block_length = 0 - self.subbands = 0 - self.min_bitpool_value = 0 - self.max_bitpool_value = 0 - self.channel_mode = SBC_CHANNEL_MODE_MONO - self.allocation_method = SBC_ALLOCATION_METHOD_LOUDNESS - } - - func dump() { - log( - """ - - num_channels: \(self.num_channels) - - sampling_frequency: \(self.sampling_frequency) - - channel_mode: \(self.channel_mode.rawValue) - - block_length: \(self.block_length) - - subbands: \(self.subbands) - - allocation_method: \(self.allocation_method.rawValue) - - bitpool_value [\(self.min_bitpool_value), \(self.max_bitpool_value)] - """) - } -} - -enum StreamState { - case closed - case open - case playing - case paused -} - -struct A2DPConnection { - static var shared = Self() - - var addr: bd_addr_t = (0, 0, 0, 0, 0, 0) - var a2dp_cid: UInt16 = 0 - var a2dp_local_seid: UInt8 = 0 - var stream_state: StreamState = .closed - var sbc_configuration: MediaCodecConfigurationSBC = .init() -} - -@_cdecl("a2dp_sink_packet_handler") -func a2dp_sink_packet_handler( - packet_type: UInt8, - channel: UInt16, - packet: UnsafeMutablePointer?, - size: UInt16 -) { - guard packet_type == HCI_EVENT_PACKET else { return } - guard hci_event_packet_get_type(packet) == HCI_EVENT_A2DP_META else { return } - - let subevent = packet?[2] - switch subevent { - case UInt8(A2DP_SUBEVENT_SIGNALING_MEDIA_CODEC_OTHER_CONFIGURATION): - log("A2DP Sink : Received non SBC codec - not implemented") - - case UInt8(A2DP_SUBEVENT_SIGNALING_MEDIA_CODEC_SBC_CONFIGURATION): - log("A2DP Sink : Received SBC codec configuration") - A2DPConnection.shared.sbc_configuration.reconfigure = - a2dp_subevent_signaling_media_codec_sbc_configuration_get_reconfigure( - packet) - A2DPConnection.shared.sbc_configuration.num_channels = - a2dp_subevent_signaling_media_codec_sbc_configuration_get_num_channels( - packet) - A2DPConnection.shared.sbc_configuration.sampling_frequency = - a2dp_subevent_signaling_media_codec_sbc_configuration_get_sampling_frequency( - packet) - A2DPConnection.shared.sbc_configuration.block_length = - a2dp_subevent_signaling_media_codec_sbc_configuration_get_block_length( - packet) - A2DPConnection.shared.sbc_configuration.subbands = - a2dp_subevent_signaling_media_codec_sbc_configuration_get_subbands(packet) - A2DPConnection.shared.sbc_configuration.min_bitpool_value = - a2dp_subevent_signaling_media_codec_sbc_configuration_get_min_bitpool_value( - packet) - A2DPConnection.shared.sbc_configuration.max_bitpool_value = - a2dp_subevent_signaling_media_codec_sbc_configuration_get_max_bitpool_value( - packet) - - let allocation_method = - a2dp_subevent_signaling_media_codec_sbc_configuration_get_allocation_method( - packet) - - // Adapt Bluetooth spec definition to SBC Encoder expected input - A2DPConnection.shared.sbc_configuration.allocation_method = - (btstack_sbc_allocation_method_t)(allocation_method - 1) - - switch avdtp_channel_mode_t( - a2dp_subevent_signaling_media_codec_sbc_configuration_get_channel_mode( - packet)) - { - case AVDTP_CHANNEL_MODE_JOINT_STEREO: - A2DPConnection.shared.sbc_configuration.channel_mode = - SBC_CHANNEL_MODE_JOINT_STEREO - case AVDTP_CHANNEL_MODE_STEREO: - A2DPConnection.shared.sbc_configuration.channel_mode = - SBC_CHANNEL_MODE_STEREO - case AVDTP_CHANNEL_MODE_DUAL_CHANNEL: - A2DPConnection.shared.sbc_configuration.channel_mode = - SBC_CHANNEL_MODE_DUAL_CHANNEL - case AVDTP_CHANNEL_MODE_MONO: - A2DPConnection.shared.sbc_configuration.channel_mode = - SBC_CHANNEL_MODE_MONO - default: - fatalError() - } - A2DPConnection.shared.sbc_configuration.dump() - - case UInt8(A2DP_SUBEVENT_STREAM_ESTABLISHED): - let status = a2dp_subevent_stream_established_get_status(packet) - guard status == ERROR_CODE_SUCCESS else { - log( - "A2DP Sink : Streaming connection failed, status \(hex: status)" - ) - return - } - - a2dp_subevent_stream_established_get_bd_addr( - packet, &A2DPConnection.shared.addr) - A2DPConnection.shared.a2dp_cid = - a2dp_subevent_stream_established_get_a2dp_cid(packet) - A2DPConnection.shared.a2dp_local_seid = - a2dp_subevent_stream_established_get_local_seid(packet) - A2DPConnection.shared.stream_state = .open - - log( - "A2DP Sink : Streaming connection is established, address \(cString: bd_addr_to_str(&A2DPConnection.shared.addr)), cid \(hex: A2DPConnection.shared.a2dp_cid), local seid \(A2DPConnection.shared.a2dp_local_seid)" - ) - - #if ENABLE_AVDTP_ACCEPTOR_EXPLICIT_START_STREAM_CONFIRMATION - case UInt8(A2DP_SUBEVENT_START_STREAM_REQUESTED): - log( - "A2DP Sink : Explicit Accept to start stream, local_seid %d\n", - a2dp_subevent_start_stream_requested_get_local_seid(packet)) - a2dp_sink_start_stream_accept(a2dp_cid, a2dp_local_seid) - #endif - - case UInt8(A2DP_SUBEVENT_STREAM_STARTED): - log("A2DP Sink : Stream started") - A2DPConnection.shared.stream_state = .playing - if A2DPConnection.shared.sbc_configuration.reconfigure != 0 { - Application.shared.audioEngine.close() - } - // prepare media processing - // audio playback starts when buffer reaches minimal level - Application.shared.audioEngine.`init`(A2DPConnection.shared.sbc_configuration) - - case UInt8(A2DP_SUBEVENT_STREAM_SUSPENDED): - log("A2DP Sink : Stream paused") - A2DPConnection.shared.stream_state = .paused - Application.shared.audioEngine.pause() - - case UInt8(A2DP_SUBEVENT_STREAM_RELEASED): - log("A2DP Sink : Stream released") - A2DPConnection.shared.stream_state = .closed - Application.shared.audioEngine.close() - - case UInt8(A2DP_SUBEVENT_SIGNALING_CONNECTION_RELEASED): - log("A2DP Sink : Signaling connection released") - A2DPConnection.shared.a2dp_cid = 0 - Application.shared.audioEngine.close() - - default: - log("AVRCP Sink : Event \(hex: subevent ?? 0xff) is not parsed") - } -} - -/* @section Handle Media Data Packet - * - * @text Here the audio data, are received through the a2dp_sink_media_handler callback. - * Currently, only the SBC media codec is supported. Hence, the media data consists of the media packet header and the SBC packet. - * The SBC frame will be stored in a ring buffer for later processing (instead of decoding it to PCM right away which would require a much larger buffer). - * If the audio stream wasn't started already and there are enough SBC frames in the ring buffer, start playback. - */ - -func read_media_data_header( - _ packet: UnsafeMutablePointer?, - _ size: Int32, - _ offset: UnsafeMutablePointer, - _ media_header: UnsafeMutablePointer -) -> Bool { - guard let packet else { return false } - let media_header_len: Int32 = 12 // without crc - var pos = Int(offset.pointee) - - if size - Int32(pos) < media_header_len { - log( - "Not enough data to read media packet header, expected \(media_header_len), received \(size-Int32(pos))" - ) - return false - } - - media_header.pointee.version = packet[pos] & 0x03 - media_header.pointee.padding = UInt8(get_bit16(UInt16(packet[pos]), 2)) - media_header.pointee.extension = UInt8(get_bit16(UInt16(packet[pos]), 3)) - media_header.pointee.csrc_count = (packet[pos] >> 4) & 0x0F - pos += 1 - - media_header.pointee.marker = UInt8(get_bit16(UInt16(packet[pos]), 0)) - media_header.pointee.payload_type = (packet[pos] >> 1) & 0x7F - pos += 1 - - media_header.pointee.sequence_number = UInt16( - big_endian_read_16(packet, Int32(pos))) - pos += 2 - - media_header.pointee.timestamp = big_endian_read_32(packet, Int32(pos)) - pos += 4 - - media_header.pointee.synchronization_source = big_endian_read_32( - packet, Int32(pos)) - pos += 4 - offset.pointee = Int32(pos) - return true -} - -func read_sbc_header( - _ packet: UnsafeMutablePointer?, - _ size: Int32, - _ offset: UnsafeMutablePointer, - _ sbc_header: UnsafeMutablePointer -) -> Bool { - guard let packet else { return false } - let sbc_header_len: Int32 = 12 // without crc - var pos: Int32 = offset.pointee - - if size - pos < sbc_header_len { - log( - "Not enough data to read SBC header, expected \(sbc_header_len), received \(size-pos)" - ) - return false - } - - sbc_header.pointee.fragmentation = UInt8( - get_bit16(UInt16(packet[Int(pos)]), 7)) - sbc_header.pointee.starting_packet = UInt8( - get_bit16(UInt16(packet[Int(pos)]), 6)) - sbc_header.pointee.last_packet = UInt8(get_bit16(UInt16(packet[Int(pos)]), 5)) - sbc_header.pointee.num_frames = UInt8(packet[Int(pos)] & 0x0f) - pos += 1 - offset.pointee = pos - return true -} - -@_cdecl("a2dp_sink_media_handler") -func a2dp_sink_media_handler( - seid: UInt8, - packet: UnsafeMutablePointer?, - size: UInt16 -) { - var pos: Int32 = 0 - - var media_header = avdtp_media_packet_header_t() - guard read_media_data_header(packet, Int32(size), &pos, &media_header) else { - log("Failed to read media data header") - return - } - - var sbc_header = avdtp_sbc_codec_header_t() - guard read_sbc_header(packet, Int32(size), &pos, &sbc_header) else { - log("Failed to read SBC header") - return - } - - let packet_length = UInt32(size) - UInt32(pos) - let packet_begin = packet?.advanced(by: Int(pos)) - let sbc_frame_size = Int(packet_length / UInt32(sbc_header.num_frames)) - - let packetBuffer = UnsafeMutableBufferPointer( - start: packet_begin, count: Int(packet_length)) - Application.shared.audioEngine.audio_pico.enqueue( - sbc_frames: packetBuffer, frame_size: sbc_frame_size) - Application.shared.audioEngine.start() -} diff --git a/harmony/Sources/Bluetooth/AVRCP.swift b/harmony/Sources/Bluetooth/AVRCP.swift deleted file mode 100644 index 6f5bc44a..00000000 --- a/harmony/Sources/Bluetooth/AVRCP.swift +++ /dev/null @@ -1,286 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2024 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -// Audio/Video Remote Control Profile - -struct AVRCPConnection { - var addr: bd_addr_t - var avrcp_cid: UInt16 - var playing: Bool - var notifications_supported_by_target: UInt16 -} - -var avrcp_connection = AVRCPConnection( - addr: (0, 0, 0, 0, 0, 0), - avrcp_cid: 0, - playing: false, - notifications_supported_by_target: 0) - -@_cdecl("avrcp_packet_handler") -func avrcp_packet_handler( - packet_type: UInt8, - channel: UInt16, - packet: UnsafeMutablePointer?, - size: UInt16 -) { - guard packet_type == HCI_EVENT_PACKET else { return } - guard hci_event_packet_get_type(packet) == HCI_EVENT_AVRCP_META else { - return - } - - let subevent = packet?[2] - switch subevent { - case UInt8(AVRCP_SUBEVENT_CONNECTION_ESTABLISHED): - log("AVRCP_SUBEVENT_CONNECTION_ESTABLISHED") - let local_cid = avrcp_subevent_connection_established_get_avrcp_cid(packet) - let status = avrcp_subevent_connection_established_get_status(packet) - - if status != ERROR_CODE_SUCCESS { - log("AVRCP: Connection failed, status \(hex: status)") - avrcp_connection.avrcp_cid = 0 - return - } - - avrcp_connection.avrcp_cid = local_cid - var address: bd_addr_t = (0, 0, 0, 0, 0, 0) - avrcp_subevent_connection_established_get_bd_addr(packet, &address) - log( - "AVRCP: Connected to \(cString: bd_addr_to_str(&address)), cid \(hex: avrcp_connection.avrcp_cid)" - ) - - avrcp_target_support_event( - avrcp_connection.avrcp_cid, AVRCP_NOTIFICATION_EVENT_VOLUME_CHANGED) - avrcp_target_support_event( - avrcp_connection.avrcp_cid, AVRCP_NOTIFICATION_EVENT_BATT_STATUS_CHANGED) - let battery_status = AVRCP_BATTERY_STATUS_WARNING - avrcp_target_battery_status_changed( - avrcp_connection.avrcp_cid, battery_status) - - // query supported events: - avrcp_controller_get_supported_events(avrcp_connection.avrcp_cid) - - case UInt8(AVRCP_SUBEVENT_CONNECTION_RELEASED): - log("AVRCP_SUBEVENT_CONNECTION_RELEASED") - log( - "AVRCP: Channel released: cid \(hex: avrcp_subevent_connection_released_get_avrcp_cid(packet))" - ) - avrcp_connection.avrcp_cid = 0 - avrcp_connection.notifications_supported_by_target = 0 - - default: - log("AVRCP: Event \(hex: subevent ?? 0xff) is not parsed") - } -} - -@_cdecl("avrcp_controller_packet_handler") -func avrcp_controller_packet_handler( - packet_type: UInt8, - channel: UInt16, - packet: UnsafeMutablePointer?, - size: UInt16 -) { - guard packet_type == HCI_EVENT_PACKET else { return } - guard hci_event_packet_get_type(packet) == HCI_EVENT_AVRCP_META else { - return - } - guard avrcp_connection.avrcp_cid != 0 else { return } - - let subevent = packet?[2] - switch subevent { - case UInt8(AVRCP_SUBEVENT_GET_CAPABILITY_EVENT_ID): - avrcp_connection.notifications_supported_by_target |= - (1 << avrcp_subevent_get_capability_event_id_get_event_id(packet)) - - case UInt8(AVRCP_SUBEVENT_GET_CAPABILITY_EVENT_ID_DONE): - log("AVRCP Controller: supported notifications by target:") - for event_id in UInt8( - AVRCP_NOTIFICATION_EVENT_FIRST_INDEX.rawValue).. 0 else { break } - let avrcp_subevent_value = UnsafeBufferPointer( - start: avrcp_subevent_now_playing_title_info_get_value(packet), - count: Int(count)) - log("AVRCP Controller: Title \(cString: avrcp_subevent_value)") - - case UInt8(AVRCP_SUBEVENT_NOW_PLAYING_ARTIST_INFO): - let count = avrcp_subevent_now_playing_artist_info_get_value_len(packet) - guard count > 0 else { break } - let avrcp_subevent_value = UnsafeBufferPointer( - start: avrcp_subevent_now_playing_artist_info_get_value(packet), - count: Int(count)) - log("AVRCP Controller: Artist \(cString: avrcp_subevent_value)") - - case UInt8(AVRCP_SUBEVENT_NOW_PLAYING_ALBUM_INFO): - let count = avrcp_subevent_now_playing_album_info_get_value_len(packet) - guard count > 0 else { break } - let avrcp_subevent_value = UnsafeBufferPointer( - start: avrcp_subevent_now_playing_album_info_get_value(packet), - count: Int(count)) - log("AVRCP Controller: Album \(cString: avrcp_subevent_value)") - - case UInt8(AVRCP_SUBEVENT_NOW_PLAYING_GENRE_INFO): - let count = avrcp_subevent_now_playing_genre_info_get_value_len(packet) - guard count > 0 else { break } - let avrcp_subevent_value = UnsafeBufferPointer( - start: avrcp_subevent_now_playing_genre_info_get_value(packet), - count: Int(count)) - log("AVRCP Controller: Genre \(cString: avrcp_subevent_value)") - - case UInt8(AVRCP_SUBEVENT_PLAY_STATUS): - let songLength = avrcp_subevent_play_status_get_song_length(packet) - let songPosition = avrcp_subevent_play_status_get_song_position(packet) - let playStatus = avrcp_play_status2str( - avrcp_subevent_play_status_get_play_status(packet)) - log( - "AVRCP Controller: Song length \(songLength) ms, Song position \(songPosition) ms, Play status \(cString: playStatus)" - ) - - case UInt8(AVRCP_SUBEVENT_OPERATION_COMPLETE): - let operationId = avrcp_operation2str( - avrcp_subevent_operation_complete_get_operation_id(packet)) - log("AVRCP Controller: \(cString: operationId) complete") - - case UInt8(AVRCP_SUBEVENT_OPERATION_START): - let operationId = avrcp_operation2str( - avrcp_subevent_operation_start_get_operation_id(packet)) - log("AVRCP Controller: \(cString: operationId) start") - - case UInt8(AVRCP_SUBEVENT_NOTIFICATION_EVENT_TRACK_REACHED_END): - log("AVRCP Controller: Track reached end") - - case UInt8(AVRCP_SUBEVENT_PLAYER_APPLICATION_VALUE_RESPONSE): - let commandType = avrcp_ctype2str( - avrcp_subevent_player_application_value_response_get_command_type(packet)) - log("AVRCP Controller: Set Player App Value \(cString: commandType)") - - default: - break - } -} - -@_cdecl("avrcp_target_packet_handler") -func avrcp_target_packet_handler( - packet_type: UInt8, - channel: UInt16, - packet: UnsafeMutablePointer?, - size: UInt16 -) { - guard packet_type == HCI_EVENT_PACKET else { return } - guard hci_event_packet_get_type(packet) == HCI_EVENT_AVRCP_META else { - return - } - - let subevent = packet?[2] - switch subevent { - case UInt8(AVRCP_SUBEVENT_NOTIFICATION_VOLUME_CHANGED): - let volume = avrcp_subevent_notification_volume_changed_get_absolute_volume( - packet) - log("AVRCP Target : Volume set to [\(volume) / 127]") - Application.shared.audioEngine.set(volume: volume << 1) - - case UInt8(AVRCP_SUBEVENT_OPERATION): - let operation_id = avrcp_operation_id_t( - avrcp_subevent_operation_get_operation_id(packet)) - let button_state: StaticString = - avrcp_subevent_operation_get_button_pressed(packet) > 0 - ? "PRESS" : "RELEASE" - switch operation_id { - case AVRCP_OPERATION_ID_VOLUME_UP: - log("AVRCP Target : VOLUME UP (\(button_state))") - case AVRCP_OPERATION_ID_VOLUME_DOWN: - log("AVRCP Target : VOLUME DOWN (\(button_state))") - default: - return - } - - default: - log("AVRCP Target : Event \(hex: subevent ?? 0xff) is not parsed") - } -} diff --git a/harmony/Sources/Bluetooth/HCI.swift b/harmony/Sources/Bluetooth/HCI.swift deleted file mode 100644 index e025e281..00000000 --- a/harmony/Sources/Bluetooth/HCI.swift +++ /dev/null @@ -1,30 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2024 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -// Host Controller Interface - -@_cdecl("hci_packet_handler") -func hci_packet_handler( - packet_type: UInt8, - channel: UInt16, - packet: UnsafeMutablePointer?, - size: UInt16 -) { - guard packet_type == HCI_EVENT_PACKET else { return } - guard hci_event_packet_get_type(packet) == HCI_EVENT_PIN_CODE_REQUEST else { - return - } - - var address: bd_addr_t = (0, 0, 0, 0, 0, 0) - log("Pin code request - using '0000'") - hci_event_pin_code_request_get_bd_addr(packet, &address) - gap_pin_code_response(&address, "0000") -} diff --git a/harmony/Sources/Bluetooth/SBC.swift b/harmony/Sources/Bluetooth/SBC.swift deleted file mode 100644 index 2b9a3093..00000000 --- a/harmony/Sources/Bluetooth/SBC.swift +++ /dev/null @@ -1,61 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2024 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -enum SBCDecoder { - typealias Callback = ( - _ data: UnsafeMutableBufferPointer, - _ num_channels: Int32, - _ sample_rate: Int32 - ) -> Void - - static var context = btstack_sbc_decoder_bluedroid_t() - static var instance: UnsafePointer? = nil - static var callback: Callback? = nil - - static func configure(mode: btstack_sbc_mode_t) { - self.instance = btstack_sbc_decoder_bluedroid_init_instance(&context) - - func decode_callback( - _ data: UnsafeMutablePointer?, - _ num_samples: Int32, - _ num_channels: Int32, - _ sample_rate: Int32, - _ context: UnsafeMutableRawPointer? - ) { - let data = UnsafeMutableBufferPointer( - start: data, count: Int(num_samples)) - Self.callback?(data, num_channels, sample_rate) - } - - instance?.pointee.configure(&context, mode, decode_callback, nil) - } - - static func decode_signed_16( - mode: btstack_sbc_mode_t, - packet_status_flag: UInt8, - buffer: UnsafeRawBufferPointer, - callback: Callback - ) { - guard let instance = Self.instance else { - preconditionFailure("Must call configure prior to decode_signed_16") - } - - return withoutActuallyEscaping(callback) { - Self.callback = $0 - instance.pointee.decode_signed_16( - &Self.context, - packet_status_flag, - buffer.baseAddress, - UInt16(buffer.count)) - Self.callback = nil - } - } -} diff --git a/harmony/Sources/Bluetooth/SDP.swift b/harmony/Sources/Bluetooth/SDP.swift deleted file mode 100644 index d7d37fac..00000000 --- a/harmony/Sources/Bluetooth/SDP.swift +++ /dev/null @@ -1,50 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2024 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -// Service Discovery Protocol - -struct ServiceDiscoveryProtocol: ~Copyable { - typealias ServiceRecord = UnsafePointer - typealias ServiceRecordHandle = UInt32 - - init() { - sdp_init() - } - - deinit { - sdp_deinit() - } - - mutating func registerService(record: ServiceRecord) { - precondition(sdp_register_service(record) == 0) - } - - mutating func registerService(record: UnsafeMutableRawBufferPointer) { - precondition(de_get_len(record.baseAddress) <= record.count) - precondition(sdp_register_service(record.baseAddress) == 0) - } - - mutating func unregisterService(handle: ServiceRecordHandle) { - sdp_unregister_service(handle) - } - - mutating func getServiceRecordHandle(for record: ServiceRecord) -> ServiceRecordHandle { - sdp_get_service_record_handle(record) - } - - mutating func makeServiceRecordHandle() -> ServiceRecordHandle { - sdp_create_service_record_handle() - } - - mutating func getServiceRecord(for handle: ServiceRecordHandle) -> ServiceRecord? { - ServiceRecord(sdp_get_record_for_handle(handle)) - } -} diff --git a/harmony/Sources/PIOPrograms/I2S.pio b/harmony/Sources/PIOPrograms/I2S.pio deleted file mode 100644 index 7b9ab6ec..00000000 --- a/harmony/Sources/PIOPrograms/I2S.pio +++ /dev/null @@ -1,64 +0,0 @@ -; -; Copyright (c) 2020 Raspberry Pi (Trading) Ltd. -; -; SPDX-License-Identifier: BSD-3-Clause -; - -; Transmit a mono or stereo I2S audio stream as stereo -; This is 16 bits per sample; can be altered by modifying the "set" params, -; or made programmable by replacing "set x" with "mov x, y" and using Y as a config register. -; -; Autopull must be enabled, with threshold set to 32. -; Since I2S is MSB-first, shift direction should be to left. -; Hence the format of the FIFO word is: -; -; | 31 : 16 | 15 : 0 | -; | sample ws=0 | sample ws=1 | -; -; Data is output at 1 bit per clock. Use clock divider to adjust frequency. -; Fractional divider will probably be needed to get correct bit clock period, -; but for common syslck freqs this should still give a constant word select period. -; -; One output pin is used for the data output. -; Two side-set pins are used. Bit 0 is clock, bit 1 is word select. - -; Send 16 bit words to the PIO for mono, 32 bit words for stereo - -.program audio_i2s -.side_set 2 - - ; /--- LRCLK - ; |/-- BCLK -bitloop1: ; || - out pins, 1 side 0b10 - jmp x-- bitloop1 side 0b11 - out pins, 1 side 0b00 - set x, 14 side 0b01 - -bitloop0: - out pins, 1 side 0b00 - jmp x-- bitloop0 side 0b01 - out pins, 1 side 0b10 -public entry_point: - set x, 14 side 0b11 - -% c-sdk { - -static inline void audio_i2s_program_init(PIO pio, uint sm, uint offset, uint data_pin, uint clock_pin_base) { - pio_sm_config sm_config = audio_i2s_program_get_default_config(offset); - - sm_config_set_out_pins(&sm_config, data_pin, 1); - sm_config_set_sideset_pins(&sm_config, clock_pin_base); - sm_config_set_out_shift(&sm_config, false, true, 32); - sm_config_set_fifo_join(&sm_config, PIO_FIFO_JOIN_TX); - - pio_sm_init(pio, sm, offset, &sm_config); - - uint pin_mask = (1u << data_pin) | (3u << clock_pin_base); - pio_sm_set_pindirs_with_mask(pio, sm, pin_mask, pin_mask); - pio_sm_set_pins(pio, sm, 0); // clear pins - - pio_sm_exec(pio, sm, pio_encode_jmp(offset + audio_i2s_offset_entry_point)); -} - -%} diff --git a/harmony/Sources/PIOPrograms/QuadratureEncoder.pio b/harmony/Sources/PIOPrograms/QuadratureEncoder.pio deleted file mode 100644 index 37ed3948..00000000 --- a/harmony/Sources/PIOPrograms/QuadratureEncoder.pio +++ /dev/null @@ -1,148 +0,0 @@ - -// FROM: https://github.com/raspberrypi/pico-examples/blob/master/pio/quadrature_encoder/quadrature_encoder.pio - -; -; Copyright (c) 2023 Raspberry Pi (Trading) Ltd. -; -; SPDX-License-Identifier: BSD-3-Clause -; -.pio_version 0 // only requires PIO version 0 - -.program quadrature_encoder - -; the code must be loaded at address 0, because it uses computed jumps -.origin 0 - - -; the code works by running a loop that continuously shifts the 2 phase pins into -; ISR and looks at the lower 4 bits to do a computed jump to an instruction that -; does the proper "do nothing" | "increment" | "decrement" action for that pin -; state change (or no change) - -; ISR holds the last state of the 2 pins during most of the code. The Y register -; keeps the current encoder count and is incremented / decremented according to -; the steps sampled - -; the program keeps trying to write the current count to the RX FIFO without -; blocking. To read the current count, the user code must drain the FIFO first -; and wait for a fresh sample (takes ~4 SM cycles on average). The worst case -; sampling loop takes 10 cycles, so this program is able to read step rates up -; to sysclk / 10 (e.g., sysclk 125MHz, max step rate = 12.5 Msteps/sec) - -; 00 state - JMP update ; read 00 - JMP decrement ; read 01 - JMP increment ; read 10 - JMP update ; read 11 - -; 01 state - JMP increment ; read 00 - JMP update ; read 01 - JMP update ; read 10 - JMP decrement ; read 11 - -; 10 state - JMP decrement ; read 00 - JMP update ; read 01 - JMP update ; read 10 - JMP increment ; read 11 - -; to reduce code size, the last 2 states are implemented in place and become the -; target for the other jumps - -; 11 state - JMP update ; read 00 - JMP increment ; read 01 -decrement: - ; note: the target of this instruction must be the next address, so that - ; the effect of the instruction does not depend on the value of Y. The - ; same is true for the "JMP X--" below. Basically "JMP Y--, " - ; is just a pure "decrement Y" instruction, with no other side effects - JMP Y--, update ; read 10 - - ; this is where the main loop starts -.wrap_target -update: - MOV ISR, Y ; read 11 - PUSH noblock - -sample_pins: - ; we shift into ISR the last state of the 2 input pins (now in OSR) and - ; the new state of the 2 pins, thus producing the 4 bit target for the - ; computed jump into the correct action for this state. Both the PUSH - ; above and the OUT below zero out the other bits in ISR - OUT ISR, 2 - IN PINS, 2 - - ; save the state in the OSR, so that we can use ISR for other purposes - MOV OSR, ISR - ; jump to the correct state machine action - MOV PC, ISR - - ; the PIO does not have a increment instruction, so to do that we do a - ; negate, decrement, negate sequence -increment: - MOV Y, ~Y - JMP Y--, increment_cont -increment_cont: - MOV Y, ~Y -.wrap ; the .wrap here avoids one jump instruction and saves a cycle too - - - -% c-sdk { - -#include "hardware/clocks.h" -#include "hardware/gpio.h" - -// max_step_rate is used to lower the clock of the state machine to save power -// if the application doesn't require a very high sampling rate. Passing zero -// will set the clock to the maximum - -static inline void quadrature_encoder_program_init(PIO pio, uint sm, uint pin, int max_step_rate) -{ - pio_sm_set_consecutive_pindirs(pio, sm, pin, 2, false); - pio_gpio_init(pio, pin); - pio_gpio_init(pio, pin + 1); - - gpio_pull_up(pin); - gpio_pull_up(pin + 1); - - pio_sm_config c = quadrature_encoder_program_get_default_config(0); - - sm_config_set_in_pins(&c, pin); // for WAIT, IN - sm_config_set_jmp_pin(&c, pin); // for JMP - // shift to left, autopull disabled - sm_config_set_in_shift(&c, false, false, 32); - // don't join FIFO's - sm_config_set_fifo_join(&c, PIO_FIFO_JOIN_NONE); - - // passing "0" as the sample frequency, - if (max_step_rate == 0) { - sm_config_set_clkdiv(&c, 1.0); - } else { - // one state machine loop takes at most 10 cycles - float div = (float)clock_get_hz(clk_sys) / (10 * max_step_rate); - sm_config_set_clkdiv(&c, div); - } - - pio_sm_init(pio, sm, 0, &c); - pio_sm_set_enabled(pio, sm, true); -} - -static inline int32_t quadrature_encoder_get_count(PIO pio, uint sm) -{ - uint ret; - int n; - - // if the FIFO has N entries, we fetch them to drain the FIFO, - // plus one entry which will be guaranteed to not be stale - n = pio_sm_get_rx_fifo_level(pio, sm) + 1; - while (n > 0) { - ret = pio_sm_get_blocking(pio, sm); - n--; - } - return ret; -} - -%} \ No newline at end of file diff --git a/harmony/Sources/PIOPrograms/WS2812.pio b/harmony/Sources/PIOPrograms/WS2812.pio deleted file mode 100644 index 839ce5f2..00000000 --- a/harmony/Sources/PIOPrograms/WS2812.pio +++ /dev/null @@ -1,49 +0,0 @@ -; -; Copyright (c) 2020 Raspberry Pi (Trading) Ltd. -; -; SPDX-License-Identifier: BSD-3-Clause -; -.pio_version 0 // only requires PIO version 0 - -.program ws2812 -.side_set 1 - -; The following constants are selected for broad compatibility with WS2812, -; WS2812B, and SK6812 LEDs. Other constants may support higher bandwidths for -; specific LEDs, such as (7,10,8) for WS2812B LEDs. - -.define public T1 3 -.define public T2 3 -.define public T3 4 - -.wrap_target -bitloop: - out x, 1 side 0 [T3 - 1] ; Side-set still takes place when instruction stalls - jmp !x do_zero side 1 [T1 - 1] ; Branch on the bit we shifted out. Positive pulse -do_one: - jmp bitloop side 1 [T2 - 1] ; Continue driving high, for a long pulse -do_zero: - nop side 0 [T2 - 1] ; Or drive low, for a short pulse -.wrap - -% c-sdk { -#include "hardware/clocks.h" - -static inline void ws2812_program_init(PIO pio, uint sm, uint offset, uint pin, float freq, bool rgbw) { - - pio_gpio_init(pio, pin); - pio_sm_set_consecutive_pindirs(pio, sm, pin, 1, true); - - pio_sm_config c = ws2812_program_get_default_config(offset); - sm_config_set_sideset_pins(&c, pin); - sm_config_set_out_shift(&c, false, true, rgbw ? 32 : 24); - sm_config_set_fifo_join(&c, PIO_FIFO_JOIN_TX); - - int cycles_per_bit = ws2812_T1 + ws2812_T2 + ws2812_T3; - float div = clock_get_hz(clk_sys) / (freq * cycles_per_bit); - sm_config_set_clkdiv(&c, div); - - pio_sm_init(pio, sm, offset, &c); - pio_sm_set_enabled(pio, sm, true); -} -%} diff --git a/harmony/Tests/AudioTests/RingBufferTests.swift b/harmony/Tests/AudioTests/RingBufferTests.swift deleted file mode 100644 index 70e119e9..00000000 --- a/harmony/Tests/AudioTests/RingBufferTests.swift +++ /dev/null @@ -1,177 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2024 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -import XCTest - -@testable import Core - -extension RingBuffer { - mutating func write(contentsOf array: [Element]) -> Bool { - array.withUnsafeBufferPointer { - self.write(contentsOf: $0) - } - } - - mutating func read(into array: inout [Element], count: Int? = nil) -> Int { - array.withUnsafeMutableBufferPointer { buffer in - self.read(into: buffer, count: count) - } - } - - func assertState( - count: Int, - readerIndex: Int, - writerIndex: Int, - file: StaticString = #filePath, - line: UInt = #line - ) { - XCTAssertEqual( - self.availableCapacity, self.capacity - count, - "incorrect availableCapacity", file: file, line: line) - XCTAssertEqual( - self.isEmpty, (count == 0), "incorrect isEmpty", file: file, line: line) - XCTAssertEqual( - self.isFull, (count == self.capacity), "incorrect isFull", file: file, - line: line) - XCTAssertEqual(self.count, count, "incorrect count", file: file, line: line) - XCTAssertEqual( - self.readerIndex, readerIndex, "incorrect readerIndex", file: file, - line: line) - XCTAssertEqual( - self.writerIndex, writerIndex, "incorrect writerIndex", file: file, - line: line) - if self.isEmpty || self.isFull { - XCTAssertEqual(self.readerIndex, self.writerIndex, file: file, line: line) - } - } -} - -final class RingBufferTests: XCTestCase { - func testInitialization() { - let ringBuffer = RingBuffer(capacity: 10) - XCTAssertEqual(ringBuffer.capacity, 10) - ringBuffer.assertState(count: 0, readerIndex: 0, writerIndex: 0) - } - - func testCapacityAndAvailableCapacity() { - var ringBuffer = RingBuffer(capacity: 5) - ringBuffer.assertState(count: 0, readerIndex: 0, writerIndex: 0) - - XCTAssertTrue(ringBuffer.write(contentsOf: [1, 2, 3])) - ringBuffer.assertState(count: 3, readerIndex: 0, writerIndex: 3) - - XCTAssertTrue(ringBuffer.write(contentsOf: [4, 5])) - ringBuffer.assertState(count: 5, readerIndex: 0, writerIndex: 0) - } - - func testWriteAndRead() { - var ringBuffer = RingBuffer(capacity: 5) - - // Write data to the buffer - XCTAssertTrue(ringBuffer.write(contentsOf: [1, 2, 3])) - ringBuffer.assertState(count: 3, readerIndex: 0, writerIndex: 3) - - // Attempt to read from the buffer - var readBuffer = Array(repeating: 0, count: 3) - let readCount = ringBuffer.read(into: &readBuffer) - XCTAssertEqual(readCount, 3) - XCTAssertEqual(readBuffer, [1, 2, 3]) - ringBuffer.assertState(count: 0, readerIndex: 3, writerIndex: 3) - } - - func testOverwriteBehavior() { - var ringBuffer = RingBuffer(capacity: 3) - - // Fill buffer to capacity - XCTAssertTrue(ringBuffer.write(contentsOf: [1, 2, 3])) - ringBuffer.assertState(count: 3, readerIndex: 0, writerIndex: 0) - - // Attempt to overwrite when full - XCTAssertFalse(ringBuffer.write(contentsOf: [4])) - ringBuffer.assertState(count: 3, readerIndex: 0, writerIndex: 0) - - // Read and check if the buffer remains unaltered - var readBuffer = Array(repeating: 0, count: 3) - let readCount = ringBuffer.read(into: &readBuffer) - XCTAssertEqual(readCount, 3) - XCTAssertEqual(readBuffer, [1, 2, 3]) - ringBuffer.assertState(count: 0, readerIndex: 0, writerIndex: 0) - } - - func testClearBuffer() { - var ringBuffer = RingBuffer(capacity: 5) - XCTAssertTrue(ringBuffer.write(contentsOf: [1, 2, 3])) - ringBuffer.assertState(count: 3, readerIndex: 0, writerIndex: 3) - - ringBuffer.clear() - ringBuffer.assertState(count: 0, readerIndex: 0, writerIndex: 0) - } - - func testWrappingBehavior() { - var ringBuffer = RingBuffer(capacity: 5) - - // Step 1: Write some data to fill part of the buffer - XCTAssertTrue(ringBuffer.write(contentsOf: [1, 2, 3])) - ringBuffer.assertState(count: 3, readerIndex: 0, writerIndex: 3) - - // Step 2: Read some data, advancing the reader index - var readBuffer = Array(repeating: 0, count: 2) - let readCount = ringBuffer.read(into: &readBuffer) - XCTAssertEqual(readCount, 2) - XCTAssertEqual(readBuffer, [1, 2]) - ringBuffer.assertState(count: 1, readerIndex: 2, writerIndex: 3) - - // Step 3: Write more data, causing the writer index to wrap around - XCTAssertTrue(ringBuffer.write(contentsOf: [4, 5, 6])) - ringBuffer.assertState(count: 4, readerIndex: 2, writerIndex: 1) - - // Step 4: Read remaining data to verify the wrap-around behavior - readBuffer = Array(repeating: 0, count: 4) - let totalReadCount = ringBuffer.read(into: &readBuffer) - XCTAssertEqual(totalReadCount, 4) - XCTAssertEqual(readBuffer, [3, 4, 5, 6]) - ringBuffer.assertState(count: 0, readerIndex: 1, writerIndex: 1) - } - - func testWrappingWriteOverflowAndWrappingReadUnderflow() { - var ringBuffer = RingBuffer(capacity: 5) - - // Step 1: Fill the buffer almost to capacity - XCTAssertTrue(ringBuffer.write(contentsOf: [1, 2, 3])) - ringBuffer.assertState(count: 3, readerIndex: 0, writerIndex: 3) - - // Step 2: Read some data to advance the reader index - var readBuffer = Array(repeating: 0, count: 2) - let readCount = ringBuffer.read(into: &readBuffer) - XCTAssertEqual(readCount, 2) - XCTAssertEqual(readBuffer, [1, 2]) - ringBuffer.assertState(count: 1, readerIndex: 2, writerIndex: 3) - - // Step 3: Write more data to cause the writer index to wrap around - XCTAssertTrue(ringBuffer.write(contentsOf: [4, 5, 6])) - // Writer wraps around - ringBuffer.assertState(count: 4, readerIndex: 2, writerIndex: 1) - - // Step 4: Attempt a write that overflows (fails due to lack of capacity) - XCTAssertFalse(ringBuffer.write(contentsOf: [7, 8, 9])) - // State remains unchanged - ringBuffer.assertState(count: 4, readerIndex: 2, writerIndex: 1) - - // Step 5: Read more data than available to test wrapping underflow - readBuffer = Array(repeating: 0, count: 5) - let underflowReadCount = ringBuffer.read(into: &readBuffer) - XCTAssertEqual(underflowReadCount, 4) // Should only read 4 elements - // Validate read data - XCTAssertEqual(readBuffer.prefix(underflowReadCount), [3, 4, 5, 6]) - // Reader wraps around - ringBuffer.assertState(count: 0, readerIndex: 1, writerIndex: 1) - } -} diff --git a/harmony/assets/hero.jpg b/harmony/assets/hero.jpg deleted file mode 100644 index 460065f26380ebb5a3880b12a6ab5daeef29c2d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 868393 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

noI@ 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 z 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⪚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

@`P{TMjtF|gR~EGj%%Bn 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 z z9P59hBJ|O%?0%4T znmzqHw$|N9Xv$87IO<(71dp8;NRSFBb99VW4g#f7(*qUQ1gOxRlr3dwW*(ieZT>{g zv3jx`RoA|NTP-UyHJqCq05fxMc;#Sc&1&4cI~`knqKo6R1YTyCNRTl*&Kr^{S1SnQ zTiwA(e`pXu-g*nucS zq`<{u5iO5MSea&2(qTrDRv-%?5)5?+Jzy3<)YfA}Y_P=FNq^t0_3e}+^6A$z{l}U4 zbws35>6O-lT1Xm9pPBA)%dF>1z9u4Oz|OU=-0*!WOc6~UiSCe~yO`yrA;2Nv5_68V zuNr=WNCK&SQPxz;Fw~MDscTwboYcCtS+2@#RM%S}wpcx$z2p!#H7cQ)Flw&dYmec> z*kghY_N;=(R!J*hj|S5z)wK|9^-;Yqu&y2=ns-BpN-MtO1ZOtliVG9a>mv_|p7iN_ znv;dM^l?xA4zZL@AWI!&a-Z`4KtdaEKWp8Mpb+9%nd7nXK`ylY{MrZj}O1 zAFvc*4$CYUMitX1>4t86&&u5iM=eJ z;-W94TaCQ$ne1fUY}c7(zWkYpQP};6R=6@-*z{T&A_0Pnylc~n&=4qfuj zvO+JCjEE#^!IStJq$kh|<=cKzHg8c;hcD?J+l_Hg-RKZu_i7DcPim?zVjiag?J!w~ zB$U}t!?ui`)Ld&K)cUPsozkNS;n$O(ab<`L7oV|iH$qI^)5RI~D0xC@nCi$#y$8C% zkb}4i0HatIW+o8G?`5e5(g`V%P#)3|E@$jP4~`j#<@*BtA?rr_16D2oE5&Gz?&Ji8 zQmol9Lw+p~V1c{{3@Hmucd?jeN~p?EEimZ~u=rj(0tbwAw#R-^oX6(i>K*M1{uhk? zzuc~+iSaA0Odye(m+8_{OjaS#zJ*dW?ZATtUdS%>LP{O8*j;teN&2|Er=MEJiM&0kqzrTv z&U4!{H7L4KRVFufYPzVZn5ZOvcjt7Sff8t>7m@K%syrU10bR#l)>>sBk%o)cb~g3A z!=7!EsQ1m6R3%mHQx;;~fd+JGl@q;)>m16}D$Gh%n5pIzut=Gn7Cb84T$#yw_76|< z@_2=8BSM0nIP)ve_RW9N%1l z>8TYq598+qE&TuU{85vVMIP!a?s_Q~;~vuspx8WlLOxRsc1Gy4Q#P~=VGX+?16qK} zTs8E786tt#GGe>|9M4^&BGZIEg|v>18YhpA9;opi0;(&v{5LP`)2Yx~1~ER{lviqa z6>C0suO^^fo^>&IjZfzSEd+5561#nZPstQS!KZU|%~{uia`(zQ$PmOQN3~?Dlo&N3 z9K-Zt?`-#2OTw+5nlm{(td<6xW3S&%s2Tg6g=mOaU1p0SCGCcI2UIamhWx6f-@#NM zU?;a~XP6o&Phr@P2-tv?|NVvkWkc1Jg@f0jLfYs7g9|{gyRA!?;N}ntaxGBOB1EtF zLu=j5(;t1jaGhu0VV_shz;gKUnzz<43+N-oikc!Z?w$WlXxmQx%i%DGKiK^)WF0_m0QM z8R7Nl`)DoyNLOVkQ<_xF^t7wh3;`xg6LYm%=1C#I21=U4$6I%R(Fy8>1DQ_&$lBxm z3O}5=jVyz;PowEYSCtFBX{nb?Eu5-&rdFYVOp0GApHoF;o?UZB+<*FseoBtebBQQ)U&9O!9M9q2hB+A`3y!JqPaN;8Yy~9`tYq^j)({0skAh^DV$pCR8-y*--^J#`>>fR={JmQYC zskM8R1VEV>@aghoD#{+K@`=6tkCAF=qK~elFYS#00_*>N01%?b>eZ%`S8EX$V6On2 zl1?6J9!FoLQ8m4xS!pEq;1Wl}+g2n}X_s8#2Lk>*|0#fPU%YZv#oRQLH(9x8jaSil zewofMQZ@xzCa6K3qzTApDtO8RRWuSKhQ9J(`p(Z2=$osIZ=fNWTx+%+rhW@Z(l!dX z4qmBH|3Fu_INh;}gGfb3TXMmgKRmj6!WGCw7uNU)Z9n^l{2-0@^I8arX#N{%AXj*=tq(2hJwqNpqV=@*y|x2v z9in~9bpHXxt3(pc-pw^_EOW}&wOVg!u&LGoWMA8sdX=yOjE6&a6!_JRE+vjpWf1AC zlW#}O=c+cCEbu;{dK7^yP&^<$*-zH7mpLcwDTG+HFK2#_njRQcW0}?40eSBJCZD~@ zuDZysPK9Z|SoD}K*ERXSFal76kTmaMM;GdTL~4jBJ{}U0z~ikPrx9>^46{U31Skdx z@MMx%BHF6Tx$qnSd%J&S;_Y4zs-pW;l2{$ykFj`(NF^ca$ooOMyUqEbbPE2?g_b+H zfx!j3nv_u;1CbrESeET+NJ`#00<<(-&?ASI);&;WZC4vtm5DPW&z2VKdOUi4Mh*J> zG~t}b1o(r2p^#K$M5(NjwfW9kA`_8U(jFpHdy6k;%PeC4(=k=f;bwXQjN^J3-8US# zj8BC~ar7}0z&Xc;MDy6}rwJLAjJ1pVm3qaQ;?<`vvBH@VKLKQLQAvqjnM)S%Z;_FX z2Loj()Zy^Ipty!6WuO-*knu`ui-}$c3h5kxWZ552eY1bxj4=)zsqA<>mtbM&HcL&ICfM$+siif*|_R=Ov*->}98akoZ}W zqa|LSQb?DJuZ~)|cuJt8=IDMiW1aV^d~fs=(LHXB=<&`hgX2=I&Ua0f zA#87u;@d|Xr}GO2l&7-=^b@ZQU4Bhrl70BMU(K2NSEvzmuchob7Ljeda1rMgEC#{W zU(G?JP8>I+O{iKVQb#_u8=gxqrvMK6F{r00AdJ6*`#O?qS8o24m)arNMtRh2nUH9 zX%?cjfl-5{jn(OOE!Qffld;#f$Pr%ENY#NrbU@Dha(}V7W|K|MYQ==ShBeO>XH%pA zYVto>_J6-Ko~)RWyp6k9sa+hGoue72M*9R`34A9>PcRT%$e4*8dSvdJQ>iw6$y)d! z4CsNQJF(2%x|Ml3fLD2ha9VTS7l6(WZEsUe9w^VXTE-9TdZNRBO2=+V`%H*`DIr0+ zM<#l{2Kol|@Pjjgo&Xp5oiFh;Mjkrb)EW|q>?OFL31YG3JT1{}BRz1)0RyoB9_O8x z=@B@~dzB$t8#us)W*&HtzU~T9Ires$W8$>K^3}5`^os~o#(}ct^9BESnW zr-G}I96co~Z(mb6Lyl#>O`(9+GV}sXd#I+-8ekibozNO<0fy?_VZz=Z_vIS4uF~us z? zN~S{oZ{>rLUgP*D0g0GUpu@2iYs)@$sztZZ$47@ojR3L~KByPh)Wn;YulH=0DLh`B zdwg8xw2m77`3FATFB$3}&Aq#tLWphyIOhHIXUy$^&<~-F0Qzp-&0A*4o+cAw<ZPVu#F z(h`s$tyR{o54!XdW>c}?MbI*HO<4dj@{7~1{(ZE(+z+_uJ7SP-yD-PCR?IBbk50gp zowcF<6P5R^lt;c#Lo+ZJ2tIe>LLd&J$!!qr{+xtDxP~R_{z0NgIMvy7tNk$kqfG#w z<|D5LjVqN}X0r2PTCyc<;_jd2c0E-~07kIJqXw5GSnhb% zi*P4;9K32>bIg?w>yqx&eE+Dp)Le)-@l}J{60FOBKDs=E%{7n)FJ0pvk0>DJiJH?$ zjh|#f?Btc$_qu#ZQ3YwF@dKMY6xCte}mZH=jR9=^^{ku=}O;F5$LX} zFhIvEM63Gz$>X-TsC>8dp_Kjfz#|+7X$+B&ykuknqY%HG0)L*6^Cuy^&n# z#17Y1X96x7MIhV(k5c_xEo5a{q=V3@Af{ZawGw1INKVpD(22Um8u&@LIjVcyTVzu> z2+MWg0TWc{fWK0}FZ64tyRF6uy%hh99(@bLwwW5F%0V4FzM-}Uc`bP*M5lunHCokA zx56C~_Ie#`20wBBiJw+Cqg-Y9g`n!6$Rk>sR%^FOx8nR#a80+Kj7CIs0DE)%5=*iM zqWd<9jcr*LqV+4R*+>G>Q<277#HW#RPtLWPpC3T9CG-A*?j`r>0`7e-u}r z+@=P_mc?yj-4O8$&&a_}P=-B1l~!2x{&!h5zHxG}D{@z>U}CE1QOu%ia}39lK(oLg z%FLu-KEAjMBxD{M)ZGSquBeK6)HTiAmEE$aw?LSYO&o1gVH<z z)2n6}3dGx6QXb(nIAsaECZ#?|6`&r-8bm{35@Q9*O6-;G7a6M@2UN-bFkn$NnwnUg zU+wsn@ElkhRmz-`$l|7Snk8mbyDnX6^1TXN1 z=3<*3ykiCUW0(lF-Ix@8zcDKeQ{cV=m7p($QynYg! z&sSfuimRqk15f710Fw$V_B#8PP((!{QyTc-unz6f^_tsY1Gt_F8W$26@Yx9q9QEUD*B1E-EtpuaD~pc*E#Q7_n42kM~yZ);uVQJ?U> zvvBaWoxH1t+}g*Qd+WYaMkS7?kwv@g-}L2tCIM`-+qnJ)A|my5bPck-F3j!-IN&j8YryONzm!+2!3B#a_@FOxWbO! zwag6R(%67DU__R=1Dhed2yWo)Aw0g-waRhVmnO8_x)KfD(O`*A?*BvdE z#cd~#!cxWuQUHSW31vWd{^FX9)AdLdyXorq4)&JAFwBh;LF^Nv zUL3Uos|?wFObHv>YK38iAKQdBN?fcFki6lwekX|Di2Xe^u7-l`S>_tReXvX=Ey|HLw97X@xd41+Vq#pfE3C6)+O}(VK{`nKC52%{g-w_ zRiphRO*z`o^VM{nlTMGL3wwJsfiHWJKJgXiEg$5$eGoyFGQj8Sy&rHw5}?5WE7*^x zX0WcB%ItxyI;O5u)`nPhS?uW}5~RA|)f(BPY`d3~LLeU&3rKH=$Cv9p|AMmd`0*ot zewa9V&D$iHMaF#^zBPb!jl4I)>6I&e9BTD2bnA5K&Yx95Op*BAG=R#9k$F`Ou;+4i z5N4FZ`k1J*?c)HUmq3_4Iro)Rbn++>l|(8UJD~*eU!V}N{6T9;Orkn~&=#C>n)il{ z`*Cxc+Uf9 z^iysIuy;OTYOr^47cU>mq2t_4msvh91Zn8{vNo9g*|Y>&&Un;!sHw%V$uH^%oR! z3Y}3YlNTXn4*p2!WB-DcU@kFUNwmX=vH7H)L12NG`Ex)k`ylSNJyx0}| z!L$>)_}{M?^xoq%M^B18p-fYjl>J~HS(8JzR1L1ZwcYcu!43pjUaDHmm{Rz?3Ov9n zyLHvj&O2d9+T0p;%$M$Z?eh+U8vSByHsXhu4nP~ha;-)p*3c1mOo?KlEcRM}1*us7 zL2WFiZ<1eYE6cHgyS zc6}ruPX`<(JaR;`6@F$|hA%TfzO4?MatBX4tBzH`ZL`neQ!ktgCfOMndZSh4S|JYq z774UOnvf$I4n*xLaT0)_V9^GKUdRI6&fdO;%-7;X&PB7fEXu)(Htx$F$8!uSKtcTv ztz)tf0=iS|9A=ay~Kto0NnM!-*lz$)TU8;;0r6?SPnRWw49yj@fMTip`5 z>P7In_gm)pIT5P9!Ge^FBl_$bPBQl44lVb=r?d7T6eM*_P!Z4BmcbmIM9x8x>OG4WUKGok%pcb zKHwtqUNGH0gV`ZRVBM6eFbu?ort8vu;_Xb2xe)nms}myR<#X7#hTO`UGv-S5{yOP6 zvSIEyKR2~=A*!L|;QWfS6YiROZ>sZ*cETCgw^bWP%zFz|QAiJd3zt?nzywrly~;Yw z5V=ha!mL{kKX`7g|;enL9|bjV|;vG zCX$-fa^OJFSID{5sDF#!bn7^o^yC)X65HCgjB9GUb`f&qZKtHCen%Jc<`wh{@Jc%W z?u=?|xjki6v%P$xG2yf}HBgQ1br6u)-h6ktePId8Jq%Z48#O*NS&^-OM2EfxGW%4K z$xI<{)<@+1X))bHc2oFibse?M=rNb6O1oN@(YHougb`iJ<#=r4KjR@sjh(mRoo5ELWCGs2(bK%uY`qBPD0^XZYkyDJn7DD$u z%O_Mh7Nlb)L4?9vKu;)H6+$g%;8+j@D>@!17I3E;KT$~Z7iFjRfa*t^;U5VO_j-|t^Y%5_H`Lg*Z=oXWz9uzx z3BH$G_2;!tyATO%x-!J2ae2B%piN;?`jGeeRE@Z*-&>bA_5SY*YSU#6J8*A~F7+Y- zy(70*yI{eN=(=j?e$GG|5%w0&D6vN--EL-V769oYjGGolYgxIk1f>6yX+FE&P^bjU zXz5?rmNwn;+UbMQ)U z!#+ls8r$*N7wFW1uZ3p+kwS;0J)t-5U-Vd#C{F1oW3HO$i07MVo{5E=HEVT;I3M@& z>|k6?kf9y*wy!;+IdFV7M(8u<*-LkAGe$))DKN)<#RbwP*M17^g820JBJY_na9|ke z3R`>;(-*L^8@9~8pf?ZTf7U*rehIM#pNvUR6^WV2{r>>e#zskKmScq zVH11r-TF+#{7L0r(ypI&dh_D}Xoa(VNCG5fggw zALxL)clMg9oA(BJ)~uFdY97m?{aw814q0lBC*Miqy!%JM7550{79Sl=9{7Mpel1sP zsvElZNkd>$GRHmWA6lacsz8mZJ>)9Xd@8t6i&^3S*qdpEZeOj<<-EQ-@{_dqEIxrVuALz#Q0S-cZ$T=68MiA(HXwx_axQO1#S5`~G^vrE#@} zpI@v%suamDV(XP+4=mRXfA-3Gg#HT(vi%AD3mT``X07?iRWJ%w<*0MT)F;p58?AU? zDM4!}8Zh*j00Qy*n|4UjMM(RZYg5ym+YvXle7T*My2tK_H3xLkao@{jMD-%7vv`Zo z-k9Se_oY!aXOF~$|XT7B)ycLzPS$aggIHH&C5Qui2 zk@(5V1lpCAT#2h0XtHKMawG-b$U!(|ja4jl%-;D#bf!{xmro8mK-4jyjC zPo8c~`OE#acZZ|k%ejCFpTL;nFXvln>82yNFQkOvRv*!cMN+$JNl`@Y#2_w8nr@pa zC+VQHn=-n)RIMBh{yJL})2_q{>ElScs`BjQcprN~XwuXWNc{GNui%A)rq-EbN=(%_ z_Se$IF2+^YRn`R~z1L14M#Kt4N%cF_>EjrEUx@XW6Q^fpFs#(A6?P(&-YMR*p~YhV zJ_{bFmk=F`*!VocI&*wDL8IkR3%;DOQb+2 z*~A@hl@i@E*}RE9!fx+$K~{!jO;2P1G?G; z3yhQjoUwL==*}M%yN*)2?{2utah%aWL{UZVhH>R~(gdqUgqI#EnnXWwd7AFBHsIET zVV7l`II-A^pkm~x1~*N$dz`_d%(7KMDE_3aE-j+9W+dB-r@IJO~l` ziW>OFZ-5(JYPAD>-OkpjiWLj%S_2#-H=n}!1m2}BZ5{#U+U0XB@IVP`;@DxLi{S@S z{3oCdU6X$`T1uL5&+r2s>YXgIOE=ZZddLd|!%c*8;lImwLaXO;5J3kwv}qP+mcd=m zJX{~6oW^Z*;Q|e$Rw9kq*+O^}FW2_H}wN8kNg0t!@**eStr7Z;csXvVRSX>g&J%yyy&X9r-s)pl|sm<7Z$ z?g>a~f-OWWIZ$SKFl)^Ioy^KP>w|HC^Q)rq*!SeTX2$+=4l2jmGU<9qJ$LV00y?5+QTAO8jUx7cMqmVS{J5xUw48BH16`&@^6$0dee^_BwE zAd~c-Emui%$r=cQe?OUQ^?84@I|_XQ(u&76P_K4puiXi!Eo586fU1yvGUW&BFSgO+ z=EfRfSE0WZ3j%BYyZi+v<=-mi9$V8U<8jk{e6nz$JdUvdJ}+L-&xo)#bT_2jg+7AP zx7M7rhG_#97KGfWLcj~OnGF6ozocayg^nWucDn=5Tt5xpDN)4hCQm&?^c;^lbdg+xVt|xR9DK(zK^Iet)vakMhN3-KVpS zG5@o+x_!*Z+4^8b>*#i(zhwR5Yh!+EF!eNLS;RC4m$=D}tct!s7c+ZJBGh&mVj@>r z(V&3?lXq&K=b>(3ouCw>oM?MBhur z6JJBIso+OztP6%56PtK7n31a$=6eCD>10kq@>d%iHrU)`gVyrt^_S9Jtp;>wP4wd- zILDJ*9$K}7Ch6M2&5WcP0ER262+W?%Kyt+q20Yu@Aj&p7uKOkkc1+%=UR}NpD^9EbTAoCeT<|I_F5jfzp(3KwE07 z_<8gnwWEJQ8h=6a=#-DvZ?fJu*{`JhX*Kxu`-O8_*v`M8w7qGMiPM=gxbC%L=8^0x zCv~^WO8fwNPI4aeHoW3(tH!Q7pW#q*}|fKg;mHsF9V(u*aLzB;;Gyf+t0RI|Nd&{_n(!2 zFn>Y6?5Sef6_N#L*D^Y%{C37bocADBY9C_J+f9~ ze6N*j-nQl6qd1S|M7K$nxaKp^_#*1Mg_smxaaHSWm#zjf zJ%IVKEIUAD^d0U?*SLGM)SnPrCpFu>s~t4us$Iv9Lsb<<)Oq9%Arh{{{^SI&Y37$S z2S3wVSUueNB{E z73q9r+-6n|u#Xo1NvB_2#6R?Zuq{elPspvi9LKiX`h=>tL?`sbS;5RKJq z(pAYVPx%U~L7w>+p4XcG=k}%*`)4?-+zOriL3}Bmp@y6IRV4qq;t&76uFPB8r0(kP`sbLp~)wv#=7LEPetwWl_iOW?8zgNrW(ZMN&nvtv5vx1e*%Yf@UPKI?=m zU2ZinG2ZQ`ztD} zV9YK#KWmGWm0HbLXFO(p{E27mQJQ_A@8w3i@>mCNLrr=10c>SIWl3$zZ5_yr9%{#` zvj78W>xSjDhb{-_kkFH@nGcnoW)4wa_|zr=CBXj4%F3c&97jj+9r5zYlGcRa3Pu~K zCcLH;DE2v;)R^u7Bb_W|nh{mSwCb%eM4og)KI2pf>Ei#Z#rCSAqE;LKj&1y8)<~1$ zp1Gj8cPK>9t%)OTjUesg4Y8| zPrl-bDA-xo3c;2{v_l|3(Dm*TG)V&}6NIyPiE3gp3hE+F$A&+Nx>YD%1)NZsl1ctS z4k1Ne0z4lEj+UuV><{kkOXkcb_-rL}_n^tj$8{{-GE1EHJ`?(&*HrH;M>8moW0ea# z@z!h!<}!}H+r^LqPQz41m>Lw)BomywzlnW_zxPeQu>JJoO6~)bd zs?FoihsK}18ZPlwbw;oyA-HM!`+v3SKYynyo0~&4HgtC8dVbB~k?`NI1@*iIX9_cQ z|AIzQgHwarAu2nMeUEkp0YUd#(0Q1_J1pV{PR))W-TX!L`uBIUAuMl(z;_k@O3~$*5pQfN9c(&JPwaGrN%7497eFt zIyPm8;q)^1Y#kJNn@+Cud-h*YaNr-@*Qtb9x|_U-v0~4VyygW9KpKj;_UQI@bvRt( zqkE##wzbT7fp87Qq4Qm#$F7|Lm5aSuV)O>Y+qAGaUCiODwc^yJF%Gu(s*6UitM!sCW|Nj@wbIh9Gi;m zi+Vw{BzaFs^W{FqjmVGj!~6C_jPt=_uRnMt%-VGC%U9CBi!7QlP)o}B<#YDabH^jp zY`Tq)TDwg7h|`)N?-b)v@IJH!<=yBJiH&2tC#vUeUX(l2T$EmkVb(@u!2|(^lm34rPs-mn8^1miussI<9JC;bXG};h z!mvjg=dOW>PwJF{&G@1Y?1=IsID=*%`sw?s&C^?W-RhnP<1G6o8er3IdA)?Zm)kk^ z57N1TP0Gx}cFL?P|H<-H?mm>geFdGE8fvPzsKr#QnDl#V0PDxEthN(P# zw*%n4`iDo$1Ig0`(LS|14Qf%PIr+6>6zHfnOLe5Lj{|rd>m>ygUeBqKV+!bn>4$@o z@jmk$+<&;(kZq-p67;^EK68>k@p;lSy{boX-|5G;cj|A72Y38NhEA5=dM*Fahd(QE z;Plnx(*+II9+-2#bXwg`?4I-OFZ(8EVBPHNq`Uv7!($M{*-DOz(24wta?rY6u_ac0 z^lU>AZBJg$1o=#aM*Q3e6TyV^^v8%PT}b}fETT{kMMik>_b5jir+onC34Iy4{c1t9 zoMGP}qP$(|K(O2;@uyj>MrStXzB*kZa;$nPHuCQF_av7gQX>sRemMug?5zxw7x(;1 zATC=aU;@t6tBW4BEq*cd%y&r@4>+E()wZ8Pb*&!^QnC_8lhG(S-3N(($1 z6hf9Sq&>CYgyxw41)Y+9C6D~++-kVb=*nQ9UEIjN=%KB>8(Zdb=%((vsYalAZn{za zg%UFX(;dhM;&Hia^g`*q~ScSbY+G*3k&j z3*XVJq<$@KmHr51ymrO$Wxxdkiwp9mK1VUx`&H7zzMT>CP6x+4P7a+m{t*J^JOJ=RZJRTaF5S_Wwul23v`UCOHqu=m0rTVj+R-`9M}kJsfL z`3^+XN}4MQ{>hkgN%M3HI|FI+uacryEp(r>L_R5b zQ2Tdi;}>uW@nbVeBCi++nk|$m30H%fQ7UhPcka+PKhcQjgmfP^^z(UGpaoj=-_b@d z4SeGj#*#?&h*db{ASiBO*i_OL(tpT7x5(NJ=)V0?I--+0yzh`X+WYzg&PmK41<$w7 zBwBrXc3`6?*ce%2@s%4Ce2p?b`VI%N=U>Uk^K6fyH&vImJoB!eTX&<`MJV7^;>AAX8!XE&_jRqS<1gr_yG3cu{ zCzg!UeqrPf)$gsrj>DBCXd67w-r4g@F088f)wa2b4BgGI#P$hN+P)j1uWj6CjTf2Olh1=l#zpA-0`Xalw--@*urLY-9U;L9`L(4D+r zB%{AbM_OQ(9RFnQHGTKrxEfqZRc`H1;g22N+Sj$VKMs^MH&=W07gR==TM1U2dwFRW z>s7wZw~ql47aVpqsU`r7&S-0uGv0ZBuW8RYq$v7B#^t!mk|PqnJlieFM{KgR*_ZO^&hlSS>>uiCB|J}p^(wCi%EN4#148?r2f4MY;ake5c->A7bnj0H+XeR_ozURje@$$}aP-MDT-*_O(>mPtmTqt-oV zepXZjqp)v-{k@7DMj`e_Let)l%KLZbnBwQ! z!^iYSc3qGbEK4ZWM7!PC=aEO-2K2Bma63N{*_D0!;Pc;NBg~ZNcO&n-zcvNJj#ogYLB>R4i6}*|7E(%PPu_J zwt^6tHg2gI#XnFbdS4FfbZcr%2o1P%LtcVzB0+=oNe7yY`7jntNXl^5iDqzKL0fUx zoXM05c2S3^bo73T2`P1W^eH7IM}V%z7^X&YbVu9|`2OR;}|15Bbn z5E%0-=Bq@CtYLOJ+V#e^>u1t7+&+waub~I#ZmXKwP1YbZsYOQdo?|a9>!!kIYbXuX z>e5?c1&!cT`%j1NpE(@u9P`x@C3*06`;4x+8taDE>piL$MI%i$wsC%-Kmi@}-x(W( zfGkoknyr5BCU+DUnaF#*P(&OVm!6YC-gc7WkG`yotRL` zrUyCgLZa3#@?=a)RSJy^J#C?pv_yoo6o1( z^R0pXtMibx^anYjJ}Tv6=_-(bSfTo5th8Q_eF0CYCXBk;=e0*lM}JLB@Hu+@iZeal z=4Io`&FfP#QbSu0yuG2EefK+G_C03)z1Y52c_ZIBo`J<@y&Gpk zBtGPAT44On-YZymH7+X^r|_Z8(R}vSE}b1^({NFb;aXgs{$>5(c4X9n@0W$?BXpw0 z3!PV2qIcOnPLf2+1mC0?ND}$)uI09V;`d7!)XEs<(A_D+9eHvx%i2%4zm6{YUmV}v zjr*Mzm#*+Y5U=*6b@{AGF6>Z&{l6qr6`X*H#kj{$0CyX}4n)Q?{)gzecbYRXz>!Q0 zaHGViQ7P#nOkl-(tJGJnK*Am8Rw#YdgNvL5z-1i1e@B3gqgPp4Ep`=#Bon!}$Z_Bf z?b|_Bcrb8MCePJm9RPU=ee*-3pTExJC|e)AFo7WgfGzIfqpQaLvU`g=RL81)2_NEG z6-FO07Q`!cVgfO?7dzQpjRNo(3{-P8=Bgnoa?KnpV>jV(IL1pB#P~XAqBvk4M>-n# z8?Bs$D>N{PROTS;y0mZ4FeP#8r>Fdxc_Ei-);~%n)K}kg|8J?;G4!3hFwbxI<>2@3 zu*(8#$Wxh2bDhjR{=GzNLrNLW;bLCT*Q4?{@ZfG(v{&%fxpj0yq)z-6M3oM!SC89o3A1SW!yJm8_1a$k^%a>2|PM(Uh{_Lo~Tl$$U z(`p8di?ZCA(F2lD+ORH_5CSZ0<(yH>&6m5B8uL+?7l;CsyvG@0d9@W;q^bKwVj-u);G61g_( zgs7;_1d7f7fv7Hhb-ea;`*4D2b(LYSQbNs8!53`Lk1kg?x1rt;>`3VD#_jK6!F~MB zPNkD+T}fWT)3gA+MW@>7_sCW?$MrI*rQWi5lh12cPicr&NB+1vaK|06Wf!BQ~q3sB)0gN0@Qg?a(q z%h4hSQE-8)sKjxS@`PFt{~Zege3id+nBYP{b7W9Iy(jS^}^WnKi*(QzeR`0^_2@gOxcB)tQ;#^_RMfwF{neM;{@Y50vFn&$IA zW7a~JYSf;*esV(MLhKwVjifB*nbZkA8$I<$RRAu}^wMh^)v>*%+QNjD)$K$t|i8D zVtf}S`j2kh@BQ`0koC;~=U_1vT0*=o7(ds)azna!vPff(|JI%{rz!2cB_i2wA9|jt`)nq_KX;I3nsiY&j1`w5Q8WtqtD2%bg#(qgRT} zQjr9@L$Jv_V%(sA2p*G2JMEO3H-5?@CX;^_ty*|ZPFSlr241b9SyH^PdwOPF&cD~XpZ=(N8m~^JBitCc+-Scr0LE8yX&8I+WcUlA{KCmK zM1%ih-Ol+Ojlm{)aL?z6FBI!l(*AEzYUw6J^4!)VXa(Vh5Rr9Ka^k?U$2#|r%?mCH zwq~8o7@9tV<^xgZvmgxE(lOBz zKV-Rx_le`a#@BDwGEA8#B~}S8apRUC+N;u&Y;<$dpSoMs6yy|8T7nQ?S(0P0!Jj@( zj+H9tg;&YVcqBEq&;V&p)`c6Q^wGScMUsFDLk*(R=CI4aoI-B=w%su6xwiNLPLHk7 zW{3t}ZGFH-+o#ys{6R5Mf{c>YUT$T);S%=l z;3K}@Ur-cMWQQ_w2okUj<+_4!8qTZ@6k5}CbydX$+n4#W9RwnmK1L5H2(U(mNE{{XtgUn!*_Z%epKe&EF#=`8K|!}fPkj3p?! zso3Lf6=dMdVioOkpGI|!rdw1Y5~$CWZCRr*C7})}ef@W#x=Bg@kT@Sbr*(^|GVs82l)uTR-+HWThiT|k3PMYy{7^r~}mj_+heT*CF;_@bR%I{6fg5KdzCK{oJIT=IYFN`(G` z(<;r6$N?Hzp`he2sEz~^=fe<@BPMl(sZxr(U>*j#gU~_0fzi3U9Ri`jT$o@#@ZJKY!h@l?HSR0KS9u8zp>`^HLXZ|MP|otx?EaFu9YMfEg_X2iJf zqXye6!+8hN`xC+Ubqt`3H;Osb$C6zoLJK8bk6w8#;^}NUsE~}-TaI(Z&;lODrYR@) zwI|xkU%5(3CRq>CHF)i znNkFJ9iJi%BSKkfA2#ETu?gVYy1nd&6!dtobh%;7$H2~u3F_j@y7({p-}AmxDI9ry z#Wb$M_8`+<3*lojZsxFqnC?WMIfYB*oPr(0Tv12qxJ_Pc@mhQ6hlmTX4Rk${(5s?M zkleB5Lbc&pb+q@roDhRt!T`ksot_Hyb=W>%fB%I&JKE_ZUW#>!7c}-S2+tNeu+G5i zzw|rgM38pVNo#@Z2S$WjB^pe9X)B1vs{-)TM=Veqp; z1}L#Ri$vZD!{7J4AeYjgO8XGVle3zh9c`t} zJY4^TefIGJ{=U;!G$)5~vx)E}My$L5KQ)+{x9;G;zbeNu=NEx9CS zxX2H3B5B9bML&4YTGsu^6oox)QX-iER7R3}4$pF23OAo@=@%ouDB}91aZ)nFiHz1^34TWw)eg4d>t#MREs>u4jv(+e${C`e;9_ zz8sJdl!a)Nzh`SnRA?UtdkkRwB2^x@D&qHD@45p%52lZD4x!A)bFcx_@O;HbDX$Wm zXKYT9AMu0Vd1G*<3u`U9zJ?ff@{W}EuM+Kk^L$0+`04Sy(G2AA=EkYh9}h9Ur1u-O z8T&(uM@v%z-OXrkFk# zJ}>-+(po=jA~+CZ1vNznPY`d-9p=S6Xmm%}M4X0@4AxD_kLG#D4!*x6v&p&5G&WmS zAh)o-8^^P2tjL}c-A^o^!v6iY_zEb5MAMq_7n(}$;Tz^t%t@8})D7*KU0?;>`qNQnJE3(T?vZ7^JmTqAs9qbB9(2*4LOqV>MgAeB08QwI z{hNhn2Z?wj#Una8nnB=UUfY!44Nf^pj&;tvI)~-5+KcC86fe!qN;;^q)qF-J6%dFe zh#nq=d`?ehP#k1x)lS!SBht2CnaBRLg@jq^v@Z}rzaF79Ii_)Wq@!G+{{1%m?|8cyBm0Q{@>Rxkd6M|i9ja>#R*kDaL2A~FbY6vk2&)L6&b`S1=S-)=xwGre9JPo-&Z37r2#?C znvI3t!w}B}6{=qA5rNtzi5=?|e5rhd(=-&_6ONEI_3kR+Muq)CbMn}i!L&DWp35*U zlxc6SO=4G9(2bM@An?-%bFtoX*pl$gH3&oBUX}r#igLPIK%ShXGL73`&}3OHS5B_O zvehzgPSY}1r^OMXbSWi7VE|-vTFe^#JsYy6=6<7Lx=U&K{-~eY%Y4D{PP)?I>Q^>d z;UDDC5?U7)H3kJzzm=e<(a(uavNeS;XEy0M$-B7<{lw7X0(aEw=qBeb_*}fsw-kei z4qbGqt52&kc4eo~;MWO%EM7BAL=r2?{MKnae1ICusjW)ql*=vw;^EEnZ9ka)c%d ziahKSOi@Yvl^iA|PU@;Fr8gRaw}xa8)&Y4JqPV}7c*U!`d=LD^-T%vB9{cfapW26l zE$z9S6v0$!QdiSsGHH=Gp&QOx@RVt^>=D#;X!kpqca%>Y1OfVz#M;*88wO71RK zikMJZWVcPOB5$@0=e=KmolS*~ORQH84AmLOzeT6vrz>%vR3YW4aC;PyE>*!D-NBG! z@bi4#O*K9>7at5#mE*y(b$lDNPj9y8@eoFmNnN6UmDH7lUOyA&u^Q0J07)$?RUv#j z#Edtvoai(x;DTyN`<@2eVciF;2V`-Vxxu?>1WZ1EK?-_hO_E}qyOD+SWrMD~tXp3) z4AN)Th~Mm1xO;a}Qi(Lo;K_w&^dx;TXC0@xW%7-r)34?Yae?Fj7Aa~M_cx^d zjo3UYBu=kdOz|`g7jM%MGGNf2!bE>T&*}UUhNbN;Cip${(=9hS4gNmFzs2BtQYt0!-fqI`Qz4{b`%F(k@bJ%wLI$qTOB}}+^`S{o z7*n$gDK&*eeHin3*{@BSFdqy_99DzdL`anTuv`B|3N(6v`&PyZ@3_>8uSR>kJ0@Vy z9d72$P5U0K(5L?wWJIImxO_78{fSYkBSv)kzReT;31-E+YX1>fuoeBT6G&$+sMvPr z-8Ku(q<|K)!Jswsoc@ji74lGwCj9oFqH%5CzQ_M>SIsYnCohhVA2aJ0AZnCk$)Tt) zo^d_BpRnq+gj$}~_sDsN%Q8Sih#K5e3rFY{j&6&-7VQd`EFmRN{``=E`xZ64p$f^b zvRZrr>xqNtN{~93kGI~&X-_*W5lMqt^ZFf)bw%_DPf+Ln{;&`!n94s8picLW=1jPD z(YCQxSQdzZ#{sJhMiR}$?^g^4D$F*pj8i-{PMw-zMJK-HLSzMu_ZtFy(WcKTXo2N1 zWZ;{{v&h^xz~b&5^8@RSN4J1Bv&MM@PVa4Vtf}fvNF7!n}mlGiq}v zGRiD6ruXT!w?|Hx`vxg(7aW7vy&vkCtF3*-qj7WLN;i3b=U#m`%B z#D;ytuwhPXmgeq~Rx8NaHY8(Fe)fs3`7g-h&DFgs62_AR{_(V(m98dIU&nYn6!_psok{U7w+pM3`Q!e+U)L)56oz??d5NY);vlxw?@szG!g!o-33ZU5 z9A_iV&cy6OcuE&OKs~z4czIV!twTRj_&v83wzFS}AAL8IqwKQ@dA!+7cYrykp0@Ec z`}+G_-_DV8KFjmC><@(#J8Ti0QrC76*G8mEEDY0PlTpn}V~d*^LHc%tXGZVswa`}5 zP@IuJyf9KDJXBs`%4{?qJ_uKxr9tb7h}L{&+IuwFfsrwh!i5Za{aHP6+NqNi19El zwFl1@D*`_(GI(FwDJpxUDb(M9XGa-Rh&}#o&_WHwJfBDWbg!_vqp1LfT91W&JO#oi ztOuC=k_|$C=>32MAOO76dNoRqiim~v^939c!sC7dOz_iW7WHEP{9^~pCHuqX5OR*j z!Z|#Oj6J!vIn;vc0HVU7Th_sgG)TBBA5fz^l23u-h+}M)exZ$3W?h`)6E^@!N3*DR zw@_dIcuU)@-w^`qE=h?puC7a7D-UeDm_#<@6N{L9bhH+$Aur6nYihE>iquH?h(-RA zhF5$WbWd0=!S85qhTG=P;9`Ell;ufVog0)65fTd+hK{hjHeqpU3AymyQQA}v8d|r0 z3MQly+g!PY!)r1-SBA3Tw^|BSE{#?5=AiPEd6IUPAmJ&rgl~c0V%j3bw>CJ&;sJB@ z?*bp2sE@8kUKTIS<&n5QkNUoLc3LfFB`$1@=4Y=)Z5v`<+u^-uaQi{w_-ky3HCjBc z3;aVNG(;|?fRg#hDEUzxz4H%)vzKn+h=qo_w#@e*8<$MPZx|*y*QCAVBVH>kj!=G$ zpTB3A+aq<-`J66Zy^KHQr1N3}NcHKn#Uc`<;GxVbZip;*Nm?j2C5AF#Ibt2R6*vAV zwum-_V0X!vYYg|a=SRa79fLnp+CEtC32oT&N8vL>_8x(8MJw68q#Wr*fYW>=<3x#I zWl&t_Yke*ZOZfd6w`J-bC7L;?C1hfLRneZAw>z_C27kfPCK*7VW!HphR4@%jU{hc4 zS-*S5(L`pl0Ugr8K1&G@bFC5B6PLSn%uazbo`ooh zb2QqvXX3FYbc}7=+}>*HEmyd__;p*HF_A$$;VeomI9f zum!ggLAe=tR$U>oF>2ND5CWtCk%T=1k?iwOcwspOyhNYJi=wBaWt@L#w}7FEna^hnLx89s^By*HMh9VT^j_;=8K+lrhRLOi&K5w-VzS)KN`WwOsTTjLZJhu-^ov56B`U8-wTLCIX~Svg zZ6v<(AF&?!A%BeHPX>rC2&V*=iX}~;5R(ee$jC|`CNj}Z*_07^-}R2c?LX_>*FTP)I5_jjlHN~vXeh#%M}gTY5#htXrFvTyhsPQV_=cB^QgNU7_; zs(R|Bu#A{)?2xfToc<1fFL-4@|KVE?vJ-Nl=qUH`by?lb$@vHcyb~;rUQ5J6sgI~s6Q@Zoi@Dfb<`2~pg&|*2Nk3j`Xf>`rP zx+a}LnDonS5X4?<`Dkbk?HE?9vxQp#hKYk;$fb5A=cTk2E*2dfWKfci&Wk9s>UiDv z`(180vmQJI;-Y6vw>Gio?KwM**bzAzsZ-$i`1yB9IHqaaiI+@@RFf>kv9|zJ`H3;C zAaF5WWcPT0A>!F~EIwDzV+Sg=JhBAK70ZJx5ACNdoOTSLF6wJtkv zPLBTlg42EWd%?Gsxi+MxK8+lV_1_t*Eqq!1CmK`5zG0wq zK+w#SF}-qmIMO;sX|BnWKJ>UuIMU*T%$s|iBoC)r)xc>u`}ERXcyBhwwW?VI515yrDuWTezm4z&P6(^t9eImATnv$X>(^YgpIav_rnMv0!V{ywH}`E9SvzRODa8GYIu z$<1h*Zf@m7Kdc6}=Vrl&K0ShW%B{a0nQMnbapuOq?_DVba~h-)9xIstUgB-dY-izY zb^h-0wK6{|+ouG>z&j~-{~7xMckphJ(-xI*xK{qBc|5IGgqHtTTLr2O;CP`3*DW}R z1iwf-dTevCgGWCPcLB}6;*ZI*5f?2w?iuASsj+`MH3{;W ziWomXHB66?Sw9(2fQn}wE*-?-T_8)nv9Kha+go~8+12A=f{qFl(2}-t_$>_BG#04H zzy~0fJtP3gt345FqNS)fT^4pXkb=y$`$1Pz7fx5{ad~DGy*1(}KBlFu{njeMoufy&JEjltviZi1T1-B$k z%Uflzo}_2C0>!#+Il%1};XoJxOD40#hccdDj5{z#>Zj;~70D@>#|4&X+Md&0>(6FUA$0yqnpvNg~3 z&oQ>K{j#K|uk+;vbc7B~2te-2vcR)U+EH{$w2Tx}lj7Qs_3U?7mP5-7A3muaK#E_L z$m%5w>W$Rdb18NNcgz9JjYoT&-gr17q&S@>3jJ^(WichIxOxu zWmQi0hoD%6`aS%_(xycNeu<^zZTWyX5~ROC5=y1$1;&of<<2j3=`$Q$(D-yDY@c_t zP9wf0#AvKF`Goo#gi8jS{=XT_lPyH1BjPPE$Z-W=mcT0)KIOeXKEeK$gIfO^;9o9; z+@(`d*DAv)Pav5Y>$@JJ>3IGn^rz0|+PM_8i*}Ab8#(ikpg~sI;j@Leq=DE^f)x$w zR#%Bk+bQx;NtF^-t>42E=kPBNZq7ZEb64K7z!C)ruP>e?UzfnLNF4%;vTTX`3<8pd zBxrC7P-x*}xI~7!I(Jb`pR$Q)N!EBhTm!F9#J40U<&R*uv|x3Blv9|{*w+ivV}GBX z$LDePpo7*Z#;}Nl4^%bZ6d%>r zzj~i%y=CEYCXJ1M7XY)SpOqa=*Y~(@31w10ZuQSaD_z!Q$RTXGOFf<`YuY^zl6n^*ewk?P%I;;pv-C?15AKXbY=#OX%g$Pn9b0 zAu-bC!t1kGa>1wRs-@Yw9*>;yf$m;5z}Zba8AIoB%pea5T~71n4S_OWj4momQDlbd z9Kp{bDJlX4mq#dvuuN173lF|UlQM7L^I6_9@HCUSRJK8fr@9aUDr@Y`-Lu~AU-XSr zCv&%*op+%hvPsM0Pqiic0v3GbPi=qr`1F!pQ#huGpf<73n`W2N7}|M{DSC}8X8rCq z6bN|mIc1TbRfGgtby+SKZ=D&&WmEcEAKmjJTl@?1pZk0T&By)1PJEV3xF}Qo?TPot zEz9Hh!iY<{k=>g?77}~=-L1|KFE_ta{c5X&%LcX>@_(Xx(e9)q1vF7i0x0Tj1OIIG z;cm?|_i{_WgsZamEoUkD0Mpj?^7O*e$SH60_ni10-?~@+hG!tM@sdAfzi&vDF6T;Q z#Ss^b2*`uW@!9`P$YJC9^P@nXQynU!e*ys-AHMc!5|caFgT?z$c%eW8joZ+_VR|Pp zN53Q(jipc*k_Di%KrZy(mpo4}_{iIcKxwQCH7fmUfp_3E`>^q+w0{~KvTa6Mq#I`lGn6} z(>An)+=C zs#6E);I0GyeMW}~dVJ*T7u!n_zaaU5B*k5M}?+MWr# zd~#-WrdDQeWOdhD$6eywo8*s#Tik}pO45(TKUG878oD_*$3yO4){jq%lwJ511SqLx z^_S0$vr0;`Gq|AKm}KxSg!=K3Snp!5EC7C}CS3!c2(o@bbE;Z>b}$ErmtnxD&rTZ-56 zbCwD0uX!k z2#FU1Yx-gn+Svcg#W(gK;oRTAX~qES%OEAlqK&sa+bLB=Ko^Y&!ygDHcdFd)!_2r) z0hH<0bdvq5${W6*DMpdAsC~PqXOfjI8Yp|sLz7+D+OAu8TEAOdSO>?C0Ev<-g@X@i z5u({)*c;Di0Jvb9W&3HrR4VBQshQ(X>jSO64`t;)`-DH3$!!rr3H|Af7CIiFofz;( zbUr54ax7n$8=3!ks9T#K5GrR*JT|amchF~2+lEkB9qs{#GAxs#(#fF%v^$uWrq|2y z{9%7V2{_aGL+8M*Ki7~K9Ks68yS%BBF9JTtovgOhS<)NaQGE7X>@9_3YBIfNr4#%h zFfwP2=EorGL1-6veHIlbRu*DNuPFPlYTew-v!$ra-6kbNF;J~yfvd;3uV1EV3nzHj zVbsA--z)KYX|jbZBVF6Ks_=%iH%2;L_BqA3_SFyuAdScWr=2sZ*0DZ@Ll}6;WFtCG0w>uba2DcyL;Cz$C$Ckw<|zHLtL6o=6yQj{-z)Jr|hf zE1It23%H@CzkVi=V^VVQ@%z5{XrUq_zGG9~_*$U7;laV|Gzy<)JV>!-l~($w-p>zk z=Qw?>c%YA#HiXshi!_e5VSQyTi`;# z%5{9RD!r;M3qnohkgg9z9v(>GSDG**m~+A^`o;~DpX`>?{iff%(7GN@w-!-(<8iw& z9q-(Xu9&R}cW#tS10=qCvtSZe_se?c?=L%jY()O8!8(Wp%>f7I>_EJB%U}&}5xUPXK zrw>eIZ9<7I!qtrFU6mv1qvf7HUek*AWiiH^6;;|`|B1N|LA|}FwT_RH%kH*471-$l z9|a@i9gA67#BZqUsQTqs%jXG>VW#HUm%2WkJ9H;^oP4cE=0R0Vrc?DVt~7rHG2;ea z2fuyG#7}U-q~qxIxT#-wND&O=J0qUDwa}{dRI|}DrZY~!*Ey_S2eeOB;S@Co&iHgR z!*?#=NYCeu;J+aG!TqXe8Sl>{OH2=kc;eq?&pn`J>RC`3H2JxJu-EDd_O zgXr(5A72mXeSo)n9d%gRFtxSxTL@R{(w3qwGk67=2U`>`=BgjdM+8x3nosH-;(~wX zv3yGCK4$t5SVbN6)jrwA-RpwhTE^e2D6J`mmrYy&x8Z{U+YKdrRN=jU+qui~?J^fr zg!SeU)mOO7=+2+IIhslv)F*is4IhPAW|}*uMfJ;${JyWMSO)qyny#mZUg)&L^_C%l z5k9e#M>_t@q%UF^C(sUyb7lFAx|IG?c133zn$>jK-no8TRtRaI)Bev7XY-<9b^h^n zDv-3B4Kbur;ER1L8G9Y(8=kxVPk}11Lgq(di1#DZ!GR&=Ur*Wv<}#yy20yYfXaBM4 zTq1R2)xef0sV}N|3+Q6}*J|`%DNYhl3KJKWlk0~vZ~BKr=ciu0jnk<9Sv{u8`VVdg zWFgKUT3x_ufLfX29p#B*WETTBicoYh2h9mBdJW)DQF@_z5$5BYe*TCg{M3I|i&-B+ zcb>we$$!6Jz!Tc1@~>%!wW(-@G(H$9;ae0*@EPSIM*bJ%C~*n*$f+-2OdihWxg6qL zD{#Y^SM0+zrBGjZZ#@qvzKs82^y?zIBdG9OxNL-7n}$po`3|C^?ew&~LJ{`nKBQ8p zsZ!P|-sSWJTR4-dUu;Y>!W+j+@MX%W&|czx71`Em)zuxudFiX$j7}duGomEd zl4~CJMQ3v~J}-N&AaRHE_2)L*;>|}bK6(?Ub0$Q-Pi{C}LVzT}JGR~M4PoOSv)}Fy z&8o)%vFZvx`CctW6Q&1qwZVe`nskP@FVI~w)_EOzwc&X^tS}o0N%_uaXTW=u+a4#E zV&Qilq|Rz5IWLkUPj9`y1EV}hz?i3(us5nsi`H6+;KolE{R5pSEcW{|muViVPpH>e zzf0QPK9+`7PI`F99|GP`8bZ^Bmq>?ozpyp8b42(G8Wy4P!Phsqo=}W`{NU$+obmcI9>O z40!D#>6I>;FPIx2MX$d=1f_z43B4xw6MyCr{^`@4qBK$I@VZqn6>9nbeQ;lGOhMy` zog1#_=Iu&LW4z4Ma;+MRZ}FEkQx5xww|^T@L7}kmsrH{176B|#b`i^O3_06j9q2oQ z^wxY&%I7NHXx7o@7%+Ws^NaejcL%qaZU>K7KMFKD4cp(Tde9rh`yFjDD{!G1LsMgJ zTN+?}5R~VWX?a@7xYs9jy~Hm&nA>06Te(FkepX4(RN?pgot%VEyy9EL_0>jHMWFK% zMT|N9fsA?#bKKJ_{yx7p_otA^51}NZIsaB64Cq`bRQOe-d%L96mIf?^7dy6*Uo=ai z{EQPi~ft;3AlftzempgFtw+rAf7kz(56#!;3g6efFB7rB>1p1%SYO_Zds>XyGOQ zu#|3tw`_#;wvkz%s_0C-0$d+Q#J~;O*e*nwQ zbc-Jx&07r7G3JONSXl|qNm-S@?_%<;ZcJe@aeW`##`Pj?u)*t!mrng1=E3qrb44-} z6ui+%-o{aNw$=ZDk!l}ZXYTmu-5?=l-s(aV$f#DLcgI@i;B^P}g!7|chr>%1m8@=& zAC{fV3%$C*YZmo;J-91=tg6@+^j2Maw6cCcz7h@F#njLRChASSi1YPl+NU0*!#NxC z1Q&*WWu~=}8wEhksvM(JGdN9JDX@9pzx(b>k}LLyF_Ac$s?P_j@g9g8`lr{XrhXZn z47sVfLSNZJWFb#&kM3U4+kut+74beAvMzt8Ykgb7#G%c*)EU>pHgndu7eC(;Z5pUT zQl z-b(LYu>;={Ft>{^{QtFUJ2BFj0}Y`tJ=jbAn8tOB?!-`cR- zds(DSpKyBP>qxubo2kZ*#4WGw@+vw1g8CCB1}#Hn=c-mswXXX=moQ9GJ-9f&D$TBn z*b}=An$;=d9rLt^I!#@aUBpyZJ*lm(tES`E<#z-cFWXVQxerByZ*REaMy>sfq|0u8 zCaHdTp>kaHcp^yjEdT0be2os$RVpf`O`$kx-L!!>!@n%rHz6j_k)glfwKtfS?aT)_ z^SwZ~HP?OAc)fb-xa!UR8_ZpAMIPtkTqzce*h$p8ApSFtFRsN@5VZ}b$(K!$O9VY# zfEj%Zcq7%z>ncgA&?NRLgEW_vK0&BZ`+Dxg{C8SSOa(@evMsrM^FDXsx6B+zeul)YKKMnwdCcTB9K)Z=8R4>?eWCQrd z%tN{4)t|c*jtQbK;$eCKSx|d{XZc_GAtRG)pT>1qK?V1ZWn=l8&&NfT38b-Oz=+HF zn#ZtzPL@cW-?@vH+Lw|%BuGC;KX`$KsoxlE_B>-->1_0g-?cRUsKoDE@&w`C)swh zsWm}ODeTMVhUL`dobefs+X6p)hDDC6?w&=UQqDOaex(+VH0 z=$pcs?_J7XX}6w<9e6xB%d`eHCn>ihR-S1~ykq0dnE{_tL|#2D4=_1v#p*<-HDE=@ z1=m}+g}mx_p9}aex|x?@|AGkYZ^V9P_WI2$s^-#+=*zx8?(<>V*}CN3y1_q7D8dC% z#hSk`wwE#%n14gE{cR`#W5|VaJkxn{CWbvn^_>(J%eOXkl<%u_e=5fxsscp{2~+N! zRQaLN2<}wwC#Gb0bNEG#jsEF)xcWsS<<#o_JB*44C&=l0jg9-|bQz3O|=C*m0c&aL97ICGN&=`Q*GOnW3>zo2v6M*Fp4$HNIxS-3*GldSqeUV^_+ z-;0`Xy;e7H{c9baWTRRirtU)%$J9S*Dv$XPZqr6%jauJ|H%J`atA+7FG=D*?bplu2 zQ2Ty0nIIX%*Ix=>$$eUOmLABVesb`U!5iPds`wO}csrG0U^&Pw_LSht;SVg+>pMcI zy(KtDwv6sF==*%VVY)XLVcr1a49++b+9PCrMByTAkmC>R2fm{A-bAF&iQnXvrMa6t zeuIu5yn`0EN%|=H`nX#z#bo>NS%?`M%iH;PvEPX@7XMZeNSSV|jZJ5f3F z#~UxEhqhiAzI)3d?O~L9*12#nzZS~M z!)W+JRP}*A&d~C+PL&_s5B0)&&kUO~KpPiMVCRz039TnPF# zfzWo~Dfc=Ce3boC`hZV@+912blh7 zdrB3R02_u@nKm}Xc^rH2@XrfE%gTg;QR4D5FPn{#yBH@j4o;k-w)(I zT#dA3R>Mfe-I74E@LZ76kp1%R|$JvU0!Bdza{AmoB zdz62w;<*;&_hh+1igT=f=gedQTAPm#gXBthjiRC6cgAR;>4rcuRs|AntyRa%ui@z5X^jx;~(W}9rrv8r|* z#$nqm4L>9%t{PQem1)gouhZ*4y_@4IeK4BUQFdndA$Dfi-#}LJhiH(4i_<4(;Z@qG zJwHRgwFkU$e!=ST2KzeFQ?}5x_*US*Xr<1v@;qL!BQNvj#+kaS%2w)g+Rf@14Ww zp73k-D6F#)%>Xx)jx5hUTT?Z5p|)<38VzUj%Rt^J1^?2y=o7AQjjYsAUD<=LVxztM z^+f9V<*p4ot**kMfbWyGyewu&2bNyY@E7zfB%t-+NIa0_31p%nzGzN!^DH6kaN(;A zxt6C}$unYw&`sHrZueY=k5soIC|Tigrs0n}iHe)TO_mTZ3|e^2mGD{Mu#)BG=y{>$ zvQy14g$$z;BVTRl<&FLf@igPpF(`N~V{m1sl94YnQOk)7sY>FQhJqpTX9Kg2d=K+p zF{1OplmU6b`UBYP{G;_~;oT$p;9FIkQvnVYj!eyU)})?2CzY>8dZki}f7#5i-*C2j z^yUzWi>Uaz9j0vXPA0hN8KpQzNmL-d=jRPOaOVU4qQIKuH?C`Msr{toxJozM@#)Ou zAY->@Np!*XFe=VzXF=fRuJ(d}^CvL#Jrl51Io@o!{@~bXwi2~fb|ZuRorFFp3MtV2 zuk6wYVAWqCr{cwaaJ-?`ePUsBiTx zo~9pj0QxD#Y4n6;OGw)JH9Nf`FVVTeYiabBW8%eIPszt82--O~1hj#25uoAxMgWTH zW=dz)$*XEU-U#ac>@e$kb1O7ob5OwMO?&skXg>5~U?z(jhM;P)`Gb;2fE1;y)T3e` zOJ`rKUu6BV-$!oT<)tt|?4$FlKEe-H+wtcc!P&l;jF>z64sQ zceu^)W;GMK5LZm6b*4sPd!h?QrU+Se-PD0j=rR{W`{Q89$w+hy^}|O>AJ(!RPQC7h zFw_<;-9CSDpJtg(r>Tmx^T+5N_SWcb>%*O0A?Znj?6`qoKcCIQ zE7>&4tBhA~G!;L{aYTKvX^2wH;2v`b5H!#F3py$5wYt*^lrx_bFAY+tujjYkYb$^J zxt4B>7F*hj|9usl#^nvY*%(1B88pW3erSJBKvPIX{VMLkufhx0C#QWLbq=+KJ7T#! zf6}Qv|1kcV;7ETl&0B0abGcAsXczM>SnR%yNjl=FYdJ(ZepSu()Hhl37P4V6ZvHPQ zq#|ABQX`!3T{x4%v>m{-(tl<7ii>%XJe;9)lcQNF!Itrr4xuxhN|AgjPpt}D|Jtj2 zx4Q9E`*nb=qEhcF2@=<|cT7{d(b@VO10T{G_bMce{3?@xGdC+2nhyl@u=7IB`m}I( zcwF+@l0v2NUr?W+I8$rPpISdb1ykkESXm7{x;wu1!4Xc343C{s30$1&M+1QCgMgd@ z?pHh2piW(NEIR~RygFIVk2*A0Xxax=tV%}_XU+3eadt2-2!oX~=1C(F+(3l+-y#IR zqGeFEg)&dg{Kl6FIx7AtXu;uQIyLpP$&(DSxMldTxCCQrfN(V(E#A=sk*I6sC%ux= zBgFV6B3}KB)k_(YuoM0Kkh<$3{S?rZ_jTs0%$QF4))OjNv=sbZ&~b+ucN~(`L8fjD zDVVaQb5HO6^JCO|S)ick7DMS%${p={q(1K-1*gR&cbEyL^0eONN;%FW$Vm}z_AS(7 z3=q(yuAdz|{L;>}v=@Zi0-qZkNSwYqsQQv^{377AzMlV3;ofYX zKeo+y*|5c=2AU9F^)$x`XA%Cpp5ncXSjE$a@9BRTXYu@=VvtwAKGGrwDot8?%k z1Bzf)>)ip|6Vl^IshTF_3X-JELLxIhxmm!eeGAn;#Paf|iu(8QcP6AZ>orX4h|f+h z{rL!4nRp~+4sc@~yi+�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 diff --git a/harmony/include/btstack_config.h b/harmony/include/btstack_config.h deleted file mode 100644 index 1b969e1b..00000000 --- a/harmony/include/btstack_config.h +++ /dev/null @@ -1,89 +0,0 @@ -#ifndef _PICO_BTSTACK_BTSTACK_CONFIG_H -#define _PICO_BTSTACK_BTSTACK_CONFIG_H - -// BTstack features that can be enabled -#define ENABLE_LOG_INFO -#define ENABLE_LOG_ERROR -#define ENABLE_PRINTF_HEXDUMP -#define ENABLE_SCO_OVER_HCI - -#ifdef ENABLE_BLE -#define ENABLE_GATT_CLIENT_PAIRING -#define ENABLE_L2CAP_LE_CREDIT_BASED_FLOW_CONTROL_MODE -#define ENABLE_LE_CENTRAL -#define ENABLE_LE_DATA_LENGTH_EXTENSION -#define ENABLE_LE_PERIPHERAL -#define ENABLE_LE_PRIVACY_ADDRESS_RESOLUTION -#define ENABLE_LE_SECURE_CONNECTIONS -#endif - -#ifdef ENABLE_CLASSIC -#define ENABLE_L2CAP_ENHANCED_RETRANSMISSION_MODE -#define ENABLE_GOEP_L2CAP -#endif - -#if defined (ENABLE_CLASSIC) && defined(ENABLE_BLE) -#define ENABLE_CROSS_TRANSPORT_KEY_DERIVATION -#endif - -// BTstack configuration. buffers, sizes, ... -#define HCI_OUTGOING_PRE_BUFFER_SIZE 4 -#define HCI_ACL_PAYLOAD_SIZE (1691 + 4) -#define HCI_ACL_CHUNK_SIZE_ALIGNMENT 4 -#define MAX_NR_AVDTP_CONNECTIONS 1 -#define MAX_NR_AVDTP_STREAM_ENDPOINTS 1 -#define MAX_NR_AVRCP_CONNECTIONS 2 -#define MAX_NR_BNEP_CHANNELS 1 -#define MAX_NR_BNEP_SERVICES 1 -#define MAX_NR_BTSTACK_LINK_KEY_DB_MEMORY_ENTRIES 2 -#define MAX_NR_GATT_CLIENTS 1 -#define MAX_NR_HCI_CONNECTIONS 2 -#define MAX_NR_HID_HOST_CONNECTIONS 1 -#define MAX_NR_HIDS_CLIENTS 1 -#define MAX_NR_HFP_CONNECTIONS 1 -#define MAX_NR_L2CAP_CHANNELS 4 -#define MAX_NR_L2CAP_SERVICES 3 -#define MAX_NR_RFCOMM_CHANNELS 1 -#define MAX_NR_RFCOMM_MULTIPLEXERS 1 -#define MAX_NR_RFCOMM_SERVICES 1 -#define MAX_NR_SERVICE_RECORD_ITEMS 4 -#define MAX_NR_SM_LOOKUP_ENTRIES 3 -#define MAX_NR_WHITELIST_ENTRIES 16 -#define MAX_NR_LE_DEVICE_DB_ENTRIES 16 - -// Limit number of ACL/SCO Buffer to use by stack to avoid cyw43 shared bus overrun -#define MAX_NR_CONTROLLER_ACL_BUFFERS 3 -#define MAX_NR_CONTROLLER_SCO_PACKETS 3 - -// Enable and configure HCI Controller to Host Flow Control to avoid cyw43 shared bus overrun -#define ENABLE_HCI_CONTROLLER_TO_HOST_FLOW_CONTROL -#define HCI_HOST_ACL_PACKET_LEN 1024 -#define HCI_HOST_ACL_PACKET_NUM 3 -#define HCI_HOST_SCO_PACKET_LEN 120 -#define HCI_HOST_SCO_PACKET_NUM 3 - -// Link Key DB and LE Device DB using TLV on top of Flash Sector interface -#define NVM_NUM_DEVICE_DB_ENTRIES 16 -#define NVM_NUM_LINK_KEYS 16 - -// We don't give btstack a malloc, so use a fixed-size ATT DB. -#define MAX_ATT_DB_SIZE 512 - -// BTstack HAL configuration -#define HAVE_EMBEDDED_TIME_MS - -// map btstack_assert onto Pico SDK assert() -#define HAVE_ASSERT - -// Some USB dongles take longer to respond to HCI reset (e.g. BCM20702A). -#define HCI_RESET_RESEND_TIMEOUT_MS 1000 - -#define ENABLE_SOFTWARE_AES128 -#define ENABLE_MICRO_ECC_FOR_LE_SECURE_CONNECTIONS - -#define HAVE_BTSTACK_STDIN - -// To get the audio demos working even with HCI dump at 115200, this truncates long ACL packets -//#define HCI_DUMP_STDOUT_MAX_SIZE_ACL 100 - -#endif // _PICO_BTSTACK_BTSTACK_CONFIG_H diff --git a/harmony/include/lwipopts.h b/harmony/include/lwipopts.h deleted file mode 100644 index fefe1e4b..00000000 --- a/harmony/include/lwipopts.h +++ /dev/null @@ -1,24 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift.org open source project -// -// Copyright (c) 2024 Apple Inc. and the Swift project authors -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors -// -//===----------------------------------------------------------------------===// - -#ifndef _LWIPOPTS_H -#define _LWIPOPTS_H - -#define NO_SYS 1 -#define LWIP_SOCKET 0 -#define LWIP_NETCONN 0 - -// Watch out: Without this, lwip fails to initialize and crashes inside -// memp_init_pool due to misaligned memory access (the fallback is "1"). -#define MEM_ALIGNMENT 4 - -#endif diff --git a/nrfx-blink-sdk/BridgingHeader.h b/nrfx-blink-sdk/BridgingHeader.h deleted file mode 100644 index 8a4377ab..00000000 --- a/nrfx-blink-sdk/BridgingHeader.h +++ /dev/null @@ -1,18 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2023 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -#include - -#include -#include - -#define LED0_NODE DT_ALIAS(led0) -static struct gpio_dt_spec led0 = GPIO_DT_SPEC_GET(LED0_NODE, gpios); diff --git a/nrfx-blink-sdk/CMakeLists.txt b/nrfx-blink-sdk/CMakeLists.txt deleted file mode 100644 index 24ba2fcc..00000000 --- a/nrfx-blink-sdk/CMakeLists.txt +++ /dev/null @@ -1,73 +0,0 @@ -cmake_minimum_required(VERSION 3.29) -find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE}) - -# Use the armv7em-none-none-eabi target triple for Swift -set(CMAKE_Swift_COMPILER_TARGET armv7em-none-none-eabi) -# Enable "wmo" as needed by Embedded Swift -set(CMAKE_Swift_COMPILATION_MODE wholemodule) -# FIXME: Skip checking if the compiler works -set(CMAKE_Swift_COMPILER_WORKS true) - -# Create a new project called "blinky" and enable "Swift" as a supported language -project(blinky Swift) - -# Set global Swift compiler flags -add_compile_options( - # Enable Embedded Swift - "$<$:SHELL:-enable-experimental-feature Embedded>" - - # Enable function sections to enable dead code stripping on elf - "$<$:SHELL:-Xfrontend -function-sections>" - - # Use software floating point operations matching GCC - "$<$:SHELL:-Xcc -mfloat-abi=soft>" - - # Use compacted C enums matching GCC - "$<$:SHELL:-Xcc -fshort-enums>" - - # Disable PIC - "$<$:SHELL:-Xcc -fno-pic>" - - # Add Libc include paths - "$<$:SHELL:-Xcc -I -Xcc ${ZEPHYR_SDK_INSTALL_DIR}/arm-zephyr-eabi/picolibc/include>" -) - -# Add definitions from Zephyr to -Xcc flags -get_target_property(ZEPHYR_DEFINES zephyr_interface INTERFACE_COMPILE_DEFINITIONS) -if(ZEPHYR_DEFINES) - foreach(flag ${ZEPHYR_DEFINES}) - # Ignore expressions like "$" - string(FIND "${flag}" "$<" start_of_expression) - if(NOT start_of_expression EQUAL -1) - continue() - endif() - - add_compile_options("$<$:SHELL:-Xcc -D${flag}>") - endforeach() -endif() - -target_sources(app PRIVATE Stubs.c) - -# The Swift code providing "main" needs to be in an OBJECT library (instead of STATIC library) to make sure it actually gets linker. -# A STATIC library would get dropped from linking because Zephyr provides a default weak empty main definition. -add_library(app_swift OBJECT Main.swift) - -add_dependencies(app_swift syscall_list_h_target) -target_compile_options(app_swift PRIVATE - -parse-as-library - - -Osize - - -Xfrontend -disable-stack-protector - - # FIXME: add dependency on BridgingHeader.h - -import-bridging-header ${CMAKE_CURRENT_LIST_DIR}/BridgingHeader.h -) - -# Copy include paths from C target to Swift target -target_include_directories(app_swift PRIVATE - "$" -) - -# Link the Swift target into the primary target -target_link_libraries(app PRIVATE app_swift) diff --git a/nrfx-blink-sdk/Main.swift b/nrfx-blink-sdk/Main.swift deleted file mode 100644 index 84c5ffec..00000000 --- a/nrfx-blink-sdk/Main.swift +++ /dev/null @@ -1,24 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2023 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -@main -struct Main { - static func main() { - // Note: & in Swift is not the "address of" operator, but on a global variable declared in C - // it will give the correct address of the global. - gpio_pin_configure_dt( - &led0, GPIO_OUTPUT | GPIO_OUTPUT_INIT_HIGH | GPIO_OUTPUT_INIT_LOGICAL) - while true { - gpio_pin_toggle_dt(&led0) - k_msleep(100) - } - } -} diff --git a/nrfx-blink-sdk/README.md b/nrfx-blink-sdk/README.md deleted file mode 100644 index 8a8de074..00000000 --- a/nrfx-blink-sdk/README.md +++ /dev/null @@ -1,42 +0,0 @@ -# nrfx-blink-sdk - -This example demonstrates how to integrate with the Zephyr SDK via CMake and how to build a Swift firmware application on top of the SDK and the libraries from it. The example was tested on a nRF52840-DK board, but it should also work on other Zephyr-supported boards. - - - -## Requirements - -- Download and install [Zephyr](https://docs.zephyrproject.org/latest/), and make sure you are set up for development with it, e.g. by following the [Zephyr Getting Started Guide](https://docs.zephyrproject.org/latest/develop/getting_started/index.html). In particular, you will need: - - CMake, Ninja, and other build tools. - - The West build system. - - A Python virtualenv for Zephyr. - - Zephyr SDK/toolchain. - - Host flash/debug tools for the board you're using. For example, for the nRF52840-DK board you'll need the [nRF Util](https://www.nordicsemi.com/Products/Development-tools/nRF-Util). - -- Before trying to use Swift with the Zephyr SDK, make sure your environment works and can build the provided C/C++ sample projects, in particular: - - Try building and running the "simple/blink" example from Zephyr written in C. - -## Building - -- Make sure you have a recent nightly Swift toolchain that has Embedded Swift support. -- Build the program in the Zephyr virtualenv, specify the target board type via the `-DBOARD=...` CMake setting: - -```console -$ cd nrfx-blink-sdk -$ source ~/zephyrproject/.venv/bin/activate -(.venv) cmake -B build -G Ninja -DBOARD=nrf52840dk/nrf52840 -DUSE_CCACHE=0 . -(.venv) cmake --build build -``` - -## Running - -- Connect the nRF52840-DK board over a USB cable to your Mac using the J-Link connector on the board. -- Use the `nrfutil device` command to upload the firmware and to run it: - -```console -(.venv) nrfutil device program --firmware build/zephyr/zephyr.hex -(.venv) nrfutil device fw-verify --firmware build/zephyr/zephyr.hex -(.venv) nrfutil device reset -``` - -- The green LED should now be blinking in a pattern. diff --git a/nrfx-blink-sdk/Stubs.c b/nrfx-blink-sdk/Stubs.c deleted file mode 100644 index 605bb39f..00000000 --- a/nrfx-blink-sdk/Stubs.c +++ /dev/null @@ -1,30 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2023 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -#include -#include - -void *aligned_alloc(size_t alignment, size_t size); - -// Embedded Swift currently requires posix_memalign, but the C libraries in the -// Zephyr SDK do not provide it. Let's implement it and forward the calls to -// aligned_alloc(3). -int -posix_memalign(void **memptr, size_t alignment, size_t size) -{ - void *p = aligned_alloc(alignment, size); - if (p) { - *memptr = p; - return 0; - } - - return errno; -} diff --git a/nrfx-blink-sdk/prj.conf b/nrfx-blink-sdk/prj.conf deleted file mode 100644 index 7a123333..00000000 --- a/nrfx-blink-sdk/prj.conf +++ /dev/null @@ -1,2 +0,0 @@ -CONFIG_GPIO=y -CONFIG_NEWLIB_LIBC=y diff --git a/nrfx-blink-sdk/west.yml b/nrfx-blink-sdk/west.yml deleted file mode 100644 index ec668bea..00000000 --- a/nrfx-blink-sdk/west.yml +++ /dev/null @@ -1,13 +0,0 @@ -manifest: - remotes: - - name: zephyrproject-rtos - url-base: https://github.com/zephyrproject-rtos - - projects: - - name: zephyr - remote: zephyrproject-rtos - revision: v4.1.0 - import: - name-allowlist: - - cmsis # required by the ARM port - - hal_nordic # required by the custom_plank board (Nordic based) diff --git a/nuttx-riscv-blink/CMakeLists.txt b/nuttx-riscv-blink/CMakeLists.txt deleted file mode 100644 index da191f00..00000000 --- a/nuttx-riscv-blink/CMakeLists.txt +++ /dev/null @@ -1,134 +0,0 @@ -cmake_minimum_required(VERSION 3.14...3.30) - -project(blink - VERSION 1.0 - DESCRIPTION "Blink on NuttX" - LANGUAGES Swift -) - -if("${CMAKE_Swift_COMPILER_VERSION}" VERSION_LESS 6.1) - message(FATAL_ERROR "Swift 6.1 or later is required") -endif() - -if(POLICY CMP0169) - # allow to call FetchContent_Populate directly - cmake_policy(SET CMP0169 OLD) -endif() - -option(LIST_ALL_BOARDS "List all available boards" OFF) -option(ENABLE_NUTTX_TRACE "Enable NuttX trace" OFF) - -if(ENABLE_NUTTX_TRACE) - set(TRACEFLAG "--trace") -else() - set(TRACEFLAG "") -endif() - -set(FETCHCONTENT_QUIET FALSE) -include(FetchContent) -FetchContent_Declare( - apps - GIT_REPOSITORY https://github.com/apache/nuttx-apps.git - GIT_TAG nuttx-12.7.0 - SOURCE_DIR ${CMAKE_BINARY_DIR}/apps - FIND_PACKAGE_ARGS -) -FetchContent_GetProperties(apps) -if(NOT apps_POPULATED) - FetchContent_Populate(apps) -endif() - -FetchContent_Declare( - nuttx - GIT_REPOSITORY https://github.com/apache/nuttx.git - GIT_TAG nuttx-12.7.0 - SOURCE_DIR ${CMAKE_BINARY_DIR}/nuttx - FIND_PACKAGE_ARGS -) -FetchContent_GetProperties(nuttx) -if(NOT nuttx_POPULATED) - FetchContent_Populate(nuttx) -endif() - -if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows") - set(SCRIPT_SUFFIX .bat) -else() - set(SCRIPT_SUFFIX .sh) -endif() - -if(LIST_ALL_BOARDS) - execute_process( - COMMAND ${CMAKE_COMMAND} -E chdir ${nuttx_SOURCE_DIR} - ${CMAKE_COMMAND} -E env PATH=${nuttx_SOURCE_DIR}/tools:$ENV{PATH} - ${nuttx_SOURCE_DIR}/tools/configure${SCRIPT_SUFFIX} -L - RESULT_VARIABLE result - ) - if(result) - message(FATAL_ERROR "Failed to run tools/configure") - endif() -else() - if(NOT DEFINED BOARD_CONFIG) - message(FATAL_ERROR "Please define configuration with BOARD_CONFIG") - else() - message(STATUS "BOARD_CONFIG: ${BOARD_CONFIG}") - endif() - - # Send swift-blinky example to nuttx-apps path - file(COPY ${CMAKE_SOURCE_DIR}/leds_swift DESTINATION ${apps_SOURCE_DIR}/examples) - file(COPY ${CMAKE_SOURCE_DIR}/defconfig DESTINATION ${nuttx_SOURCE_DIR}/boards/risc-v/qemu-rv/rv-virt/configs/leds_swift) - - add_custom_target(distclean - COMMAND ${CMAKE_COMMAND} -E chdir ${nuttx_SOURCE_DIR} - ${CMAKE_COMMAND} -E env PATH=${nuttx_SOURCE_DIR}/tools:$ENV{PATH} - make distclean - COMMENT "Clean NuttX" - ) - - execute_process( - COMMAND ${CMAKE_COMMAND} -E chdir ${nuttx_SOURCE_DIR} - ${CMAKE_COMMAND} -E env PATH=${nuttx_SOURCE_DIR}/tools:$ENV{PATH} - ${nuttx_SOURCE_DIR}/tools/configure${SCRIPT_SUFFIX} -l ${BOARD_CONFIG} - RESULT_VARIABLE result - ) - if(result) - message(FATAL_ERROR "Failed to run tools/configure") - endif() - - add_custom_target(copy_swift_example - COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_SOURCE_DIR}/leds_swift ${apps_SOURCE_DIR}/examples/leds_swift - COMMENT "Copying leds_swift example to nuttx-apps" - ) - - add_custom_target(build_nuttx ALL - COMMAND ${CMAKE_COMMAND} -E chdir ${nuttx_SOURCE_DIR} - ${CMAKE_COMMAND} -E env PATH=${nuttx_SOURCE_DIR}/tools:$ENV{PATH} - make ${TRACEFLAG} -j ${JOB_POOLS} - DEPENDS copy_swift_example - COMMENT "Building NuttX" - ) - - add_custom_command( - TARGET build_nuttx - POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy ${nuttx_SOURCE_DIR}/nuttx ${CMAKE_BINARY_DIR}/nuttx.elf - ) - - add_custom_target(export_nuttx - COMMAND ${CMAKE_COMMAND} -E chdir ${nuttx_SOURCE_DIR} - ${CMAKE_COMMAND} -E env PATH=${nuttx_SOURCE_DIR}/tools:$ENV{PATH} - make export - COMMENT "Exporting NuttX" - ) - - add_custom_target(extract_nuttx_export - COMMAND ${CMAKE_COMMAND} -E tar xzf ${nuttx_SOURCE_DIR}/nuttx-export-12.7.0.tar.gz - WORKING_DIRECTORY ${CMAKE_BINARY_DIR} - COMMAND ${CMAKE_COMMAND} -E remove ${nuttx_SOURCE_DIR}/nuttx-export-12.7.0.tar.gz - DEPENDS export_nuttx - COMMENT "Extracting NuttX export" - ) - - add_custom_target(nuttx-libs - DEPENDS build_nuttx export_nuttx extract_nuttx_export - ) -endif() diff --git a/nuttx-riscv-blink/README.md b/nuttx-riscv-blink/README.md deleted file mode 100644 index 4a472393..00000000 --- a/nuttx-riscv-blink/README.md +++ /dev/null @@ -1,71 +0,0 @@ -# Swift 6 on NuttX RTOS using CMake - -## Description - -Run blink rv32-blink_leds (QEMU) example on NuttX RTOS. - -> [!NOTE] -> CMake is adapted to build NuttX and NuttX-apps (Makefiles) with Swift 6. - -## Requirements - -- [NuttX](https://github.com/apache/nuttx) & [NuttX-apps](https://github.com/apache/nuttx-apps) -- [kconfig-frontends](https://bitbucket.org/nuttx/tools) -- [CMake](https://cmake.org/download/) -- [QEMU](https://www.qemu.org/) -- [Swift 6](https://swift.org/download/) - Swift 6.1 or greater -- [RISC-V GNU Toolchain](https://github.com/riscv-collab/riscv-gnu-toolchain/releases) - -## How to build - -```bash -# list all supported boards -cmake -B build -DLIST_ALL_BOARDS=ON | less -# build configuration -cmake -B build -GNinja -DBOARD_CONFIG=rv-virt:leds_swift -DENABLE_NUTTX_TRACE=[ON|OFF] -# build -cmake --build build -# clean -cmake --build build -t distclean -# export NuttX as library -cmake --build build -t nuttx-libs -``` - -- **Output** -```bash -qemu-system-riscv32 \ - -semihosting \ - -M virt,aclint=on \ - -cpu rv32 -smp 8 \ - -bios none \ - -kernel build/nuttx.elf -nographic -NuttShell (NSH) NuttX-12.7.0 -nsh> leds_swift -leds_main: led_daemon started - -led_daemon (pid# 4): Running -led_daemon: Opening /dev/userleds -led_daemon: Supported LEDs 0x7 -led_daemon: LED set 0x1 -board_userled: LED 1 set to 1 -board_userled: LED 2 set to 0 -board_userled: LED 3 set to 0 -nsh> led_daemon: LED set 0x0 -board_userled: LED 1 set to 0 -board_userled: LED 2 set to 0 -board_userled: LED 3 set to 0 -led_daemon: LED set 0x1 -board_userled: LED 1 set to 1 -board_userled: LED 2 set to 0 -board_userled: LED 3 set to 0 -led_daemon: LED set 0x0 -# [...] see output in QEMU -``` - -Quit from QEMU: `Ctrl-a x` - -## References - -- [Nuttx - Compiling with CMake](https://nuttx.apache.org/docs/latest/quickstart/compiling_cmake.html) -- [NuttX - C++ Example using CMake](https://nuttx.apache.org/docs/latest/guides/cpp_cmake.html) -- [NuttX - leds_rust](https://lupyuen.github.io/articles/rust6) diff --git a/nuttx-riscv-blink/defconfig b/nuttx-riscv-blink/defconfig deleted file mode 100644 index 5091081e..00000000 --- a/nuttx-riscv-blink/defconfig +++ /dev/null @@ -1,76 +0,0 @@ -# -# 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_DISABLE_OS_API is not set -# CONFIG_NSH_DISABLE_LOSMART is not set -CONFIG_16550_ADDRWIDTH=0 -CONFIG_16550_UART0=y -CONFIG_16550_UART0_BASE=0x10000000 -CONFIG_16550_UART0_CLOCK=3686400 -CONFIG_16550_UART0_IRQ=37 -CONFIG_16550_UART0_SERIAL_CONSOLE=y -CONFIG_16550_UART=y -CONFIG_ARCH="risc-v" -CONFIG_ARCH_BOARD="rv-virt" -CONFIG_ARCH_BOARD_QEMU_RV_VIRT=y -CONFIG_ARCH_CHIP="qemu-rv" -# CONFIG_ARCH_CHIP_QEMU_RV64=y -CONFIG_ARCH_CHIP_QEMU_RV=y -CONFIG_ARCH_CHIP_QEMU_RV_ISA_A=y -CONFIG_ARCH_CHIP_QEMU_RV_ISA_C=y -CONFIG_ARCH_CHIP_QEMU_RV_ISA_M=y -CONFIG_ARCH_INTERRUPTSTACK=2048 -CONFIG_ARCH_RISCV=y -CONFIG_ARCH_STACKDUMP=y -CONFIG_BCH=y -CONFIG_BOARDCTL_POWEROFF=y -CONFIG_BOARD_LATE_INITIALIZE=y -CONFIG_BOARD_LOOPSPERMSEC=6366 -CONFIG_BUILTIN=y -CONFIG_DEBUG_FEATURES=y -CONFIG_DEBUG_FULLOPT=y -CONFIG_DEBUG_SYMBOLS=y -CONFIG_DEVICE_TREE=y -CONFIG_DEV_ZERO=y -CONFIG_ELF=y -# CONFIG_EXAMPLES_HELLO=y -CONFIG_EXAMPLES_LEDS=y -CONFIG_EXAMPLES_LEDS_SWIFT=y -CONFIG_FS_HOSTFS=y -CONFIG_FS_PROCFS=y -CONFIG_IDLETHREAD_STACKSIZE=2048 -CONFIG_INIT_ENTRYPOINT="nsh_main" -CONFIG_INIT_STACKSIZE=3072 -CONFIG_LIBC_ENVPATH=y -CONFIG_LIBC_EXECFUNCS=y -CONFIG_LIBC_PERROR_STDOUT=y -CONFIG_LIBC_STRERROR=y -CONFIG_LIBM=y -CONFIG_NFILE_DESCRIPTORS_PER_BLOCK=6 -CONFIG_NSH_ARCHINIT=y -CONFIG_NSH_BUILTIN_APPS=y -CONFIG_NSH_FILEIOSIZE=512 -CONFIG_NSH_READLINE=y -CONFIG_PATH_INITIAL="/system/bin" -CONFIG_RAM_SIZE=33554432 -CONFIG_RAM_START=0x80000000 -CONFIG_READLINE_CMD_HISTORY=y -CONFIG_RISCV_SEMIHOSTING_HOSTFS=y -CONFIG_RR_INTERVAL=200 -CONFIG_SCHED_WAITPID=y -CONFIG_SERIAL_UART_ARCH_MMIO=y -CONFIG_STACK_COLORATION=y -CONFIG_START_MONTH=12 -CONFIG_START_YEAR=2021 -CONFIG_SYMTAB_ORDEREDBYNAME=y -CONFIG_SYSTEM_NSH=y -CONFIG_SYSTEM_NSH_STACKSIZE=3072 -CONFIG_TESTING_GETPRIME=y -CONFIG_TESTING_OSTEST=y -CONFIG_USEC_PER_TICK=1000 -CONFIG_USERLED=y -CONFIG_USERLED_LOWER=y diff --git a/nuttx-riscv-blink/leds_swift/BridgingHeader.h b/nuttx-riscv-blink/leds_swift/BridgingHeader.h deleted file mode 100644 index 7b2ceba1..00000000 --- a/nuttx-riscv-blink/leds_swift/BridgingHeader.h +++ /dev/null @@ -1,124 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2024 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define LED_DEVPATH "/dev/userleds" - -const int LEDS_PRIORITY = CONFIG_EXAMPLES_LEDS_PRIORITY; -const int LEDS_STACKSIZE = CONFIG_EXAMPLES_LEDS_STACKSIZE; - -static bool g_led_daemon_started = false; - -static void sigterm_action(int signo, siginfo_t *siginfo, void *arg) { - if (signo == SIGTERM) { - printf("SIGTERM received\n"); - g_led_daemon_started = false; - printf("led_daemon: Terminated.\n"); - } else { - printf("\nsigterm_action: Received signo=%d siginfo=%p arg=%p\n", signo, - (void *)siginfo, arg); - } -} - -int led_daemon(int argc, char *argv[]) { - userled_set_t supported = 0; - userled_set_t ledset = 0; - bool incrementing = true; - - struct sigaction act = {.sa_sigaction = sigterm_action, - .sa_flags = SA_SIGINFO}; - - sigemptyset(&act.sa_mask); - sigaddset(&act.sa_mask, SIGTERM); - - if (sigaction(SIGTERM, &act, NULL) != 0) { - printf("Failed to install SIGTERM handler, errno=%d\n", errno); - return EXIT_FAILURE; - } - - pid_t mypid = getpid(); - g_led_daemon_started = true; - printf("\nled_daemon (pid# %d): Running\n", mypid); - - printf("led_daemon: Opening %s\n", CONFIG_EXAMPLES_LEDS_DEVPATH); - int fd = open(CONFIG_EXAMPLES_LEDS_DEVPATH, O_WRONLY); - if (fd < 0) { - printf("led_daemon: ERROR: Failed to open %s: %d\n", - CONFIG_EXAMPLES_LEDS_DEVPATH, errno); - g_led_daemon_started = false; - return EXIT_FAILURE; - } - - int ret = ioctl(fd, ULEDIOC_SUPPORTED, (unsigned long)&supported); - if (ret < 0) { - printf("led_daemon: ERROR: ioctl(ULEDIOC_SUPPORTED) failed: %d\n", errno); - close(fd); - g_led_daemon_started = false; - return EXIT_FAILURE; - } - - printf("led_daemon: Supported LEDs 0x%x\n", supported); - supported &= CONFIG_EXAMPLES_LEDS_LEDSET; - - while (g_led_daemon_started) { - userled_set_t newset = 0; - userled_set_t tmp = 0; - - if (incrementing) { - tmp = ledset; - while (newset == ledset) { - tmp++; - newset = tmp & supported; - } - - if (newset == 0) { - incrementing = false; - continue; - } - } else { - if (ledset == 0) { - incrementing = true; - continue; - } - - tmp = ledset; - while (newset == ledset) { - tmp--; - newset = tmp & supported; - } - } - - ledset = newset; - printf("led_daemon: LED set 0x%x\n", ledset); - - ret = ioctl(fd, ULEDIOC_SETALL, (unsigned long)ledset); - if (ret < 0) { - printf("led_daemon: ERROR: ioctl(ULEDIOC_SETALL) failed: %d\n", errno); - close(fd); - g_led_daemon_started = false; - return EXIT_FAILURE; - } - - usleep(500 * 1000); - } - - close(fd); - return EXIT_SUCCESS; -} \ No newline at end of file diff --git a/nuttx-riscv-blink/leds_swift/Kconfig b/nuttx-riscv-blink/leds_swift/Kconfig deleted file mode 100644 index e39ce088..00000000 --- a/nuttx-riscv-blink/leds_swift/Kconfig +++ /dev/null @@ -1,30 +0,0 @@ -# -# For a description of the syntax of this configuration file, -# see the file kconfig-language.txt in the NuttX tools repository. -# - -config EXAMPLES_LEDS_SWIFT - tristate "\"LEDs Swift\" example" - default y - depends on USERLED - ---help--- - Enable the \"LEDs Swift\" example - -if EXAMPLES_LEDS_SWIFT - -config EXAMPLES_LEDS_SWIFT_PROGNAME - string "Program name" - default "leds_swift" - ---help--- - This is the name of the program that will be used when the NSH ELF - program is installed. - -config EXAMPLES_LEDS_SWIFT_PRIORITY - int "LEDs Swift task priority" - default 100 - -config EXAMPLES_LEDS_SWIFT_STACKSIZE - int "LEDs Swift stack size" - default DEFAULT_TASK_STACKSIZE - -endif diff --git a/nuttx-riscv-blink/leds_swift/Make.defs b/nuttx-riscv-blink/leds_swift/Make.defs deleted file mode 100644 index 9070565f..00000000 --- a/nuttx-riscv-blink/leds_swift/Make.defs +++ /dev/null @@ -1,24 +0,0 @@ -############################################################################ -# apps/examples/leds_swift/Make.defs -# -# Copyright (c) 2024 Apple Inc. and the Swift project authors. -# 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. -# -############################################################################ - -ifneq ($(CONFIG_EXAMPLES_LEDS_SWIFT),) -CONFIGURED_APPS += $(APPDIR)/examples/leds_swift -endif diff --git a/nuttx-riscv-blink/leds_swift/Makefile b/nuttx-riscv-blink/leds_swift/Makefile deleted file mode 100644 index e2fc7df4..00000000 --- a/nuttx-riscv-blink/leds_swift/Makefile +++ /dev/null @@ -1,38 +0,0 @@ -############################################################################ -# apps/examples/leds_swift/Makefile -# -# Copyright (c) 2024 Apple Inc. and the Swift project authors. -# 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 $(APPDIR)/Make.defs - -# Blink in Swift Embedded Example - -MAINSRC = $(wildcard *.swift) $(wildcard *.h) - -# leds_swift built-in application info - -SWIFTFLAGS += -import-bridging-header BridgingHeader.h -I$(TOPDIR)/include -SWIFTFLAGS += -Xfrontend -function-sections -Xfrontend -disable-stack-protector -SWIFTFLAGS += -Xfrontend -enable-single-module-llvm-emission -PROGNAME = $(CONFIG_EXAMPLES_LEDS_SWIFT_PROGNAME) -PRIORITY = $(CONFIG_EXAMPLES_LEDS_SWIFT_PRIORITY) -STACKSIZE = $(CONFIG_EXAMPLES_LEDS_SWIFT_STACKSIZE) -MODULE = $(CONFIG_EXAMPLES_LEDS_SWIFT) - -include $(APPDIR)/Application.mk diff --git a/nuttx-riscv-blink/leds_swift/leds_swift.swift b/nuttx-riscv-blink/leds_swift/leds_swift.swift deleted file mode 100644 index 1cadcf47..00000000 --- a/nuttx-riscv-blink/leds_swift/leds_swift.swift +++ /dev/null @@ -1,30 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2024 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -@_cdecl("leds_swift_main") -public func cMain( - _ argc: Int32, _ argv: UnsafeMutablePointer?> -) -> Int32 { - let ret = task_create( - "led_daemon", - LEDS_PRIORITY, - LEDS_STACKSIZE, - led_daemon, - nil) - - if ret < 0 { - print("leds_main: ERROR: Failed to start led_daemon") - return ret - } - - print("leds_main: led_daemon started") - return 0 -} diff --git a/rpi-4b-blink/Makefile b/rpi-4b-blink/Makefile deleted file mode 100644 index 1ee6e512..00000000 --- a/rpi-4b-blink/Makefile +++ /dev/null @@ -1,46 +0,0 @@ -##===----------------------------------------------------------------------===## -## -## This source file is part of the Swift open source project -## -## Copyright (c) 2025 Apple Inc. and the Swift project authors. -## Licensed under Apache License v2.0 with Runtime Library Exception -## -## See https://swift.org/LICENSE.txt for license information -## -##===----------------------------------------------------------------------===## - -# Paths -REPOROOT := $(shell git rev-parse --show-toplevel) -TOOLSROOT := $(REPOROOT)/Tools -TOOLSET := $(TOOLSROOT)/Toolsets/rpi-5-elf.json -LLVM_OBJCOPY := llvm-objcopy -SWIFT_BUILD := swift build - -# Flags -ARCH := aarch64 -TARGET := $(ARCH)-none-none-elf -SWIFT_BUILD_ARGS := \ - --configuration release \ - --triple $(TARGET) \ - --toolset $(TOOLSET) -BUILDROOT := $(shell $(SWIFT_BUILD) $(SWIFT_BUILD_ARGS) --show-bin-path) - -.PHONY: build -build: - @echo "building..." - $(SWIFT_BUILD) \ - $(SWIFT_BUILD_ARGS) \ - --verbose - - @echo "extracting binary..." - $(LLVM_OBJCOPY) \ - -O binary \ - "$(BUILDROOT)/Application" \ - "$(BUILDROOT)/Application.bin" \ - - -.PHONY: clean -clean: - @echo "cleaning..." - @swift package clean - @rm -rf .build diff --git a/rpi-4b-blink/Package.resolved b/rpi-4b-blink/Package.resolved deleted file mode 100644 index bfffc5ae..00000000 --- a/rpi-4b-blink/Package.resolved +++ /dev/null @@ -1,33 +0,0 @@ -{ - "originHash" : "d0330fea11b0fbdacbddd4f13debd9a4fe72ed5b628ad4959a93972f3572bf1f", - "pins" : [ - { - "identity" : "swift-argument-parser", - "kind" : "remoteSourceControl", - "location" : "https://github.com/apple/swift-argument-parser.git", - "state" : { - "revision" : "41982a3656a71c768319979febd796c6fd111d5c", - "version" : "1.5.0" - } - }, - { - "identity" : "swift-mmio", - "kind" : "remoteSourceControl", - "location" : "https://github.com/apple/swift-mmio.git", - "state" : { - "branch" : "main", - "revision" : "5232c5129a8c70beafc3d6acfbae2716c1b6822a" - } - }, - { - "identity" : "swift-syntax", - "kind" : "remoteSourceControl", - "location" : "https://github.com/swiftlang/swift-syntax.git", - "state" : { - "revision" : "0687f71944021d616d34d922343dcef086855920", - "version" : "600.0.1" - } - } - ], - "version" : 3 -} diff --git a/rpi-4b-blink/Package.swift b/rpi-4b-blink/Package.swift deleted file mode 100644 index 5c4c7081..00000000 --- a/rpi-4b-blink/Package.swift +++ /dev/null @@ -1,21 +0,0 @@ -// swift-tools-version: 6.0 - -import PackageDescription - -let package = Package( - name: "rpi-4b-blink", - products: [ - .executable(name: "Application", targets: ["Application"]) - ], - dependencies: [ - .package(url: "https://github.com/apple/swift-mmio.git", branch: "main") - ], - targets: [ - .executableTarget( - name: "Application", - dependencies: [ - .product(name: "MMIO", package: "swift-mmio"), - "Support", - ]), - .target(name: "Support"), - ]) diff --git a/rpi-4b-blink/README.md b/rpi-4b-blink/README.md deleted file mode 100644 index a5ed157a..00000000 --- a/rpi-4b-blink/README.md +++ /dev/null @@ -1,21 +0,0 @@ -# rpi-4b-blink - - - -## Requirements - -- A Raspberry Pi 4B board -- An SD Card, with a Raspberry Pi OS installed (this way, we don't need to create the configuration files from scratch). You may backup `kernel8.img` and `config.txt` if you need the Linux install later, since we will change these files. - -## How to build and run this example: - -- Make sure you have a recent nightly Swift toolchain that has Embedded Swift support. -- Build the program, then copy the kernel image to the SD card. -``` console -$ cd rpi-4b-blink -$ make -$ cp .build/release/Application.bin /Volumes/bootfs/kernel8.img -``` -- If your original OS is not 64-bit, make sure to set `arm_64bit=1` in `config.txt`. -- Place the SD card in your Raspberry Pi 4B, and connect it to power. -- After the boot sequence, the green (ACT) led will start blinking in a regular pattern. diff --git a/rpi-4b-blink/Sources/Application/Application.swift b/rpi-4b-blink/Sources/Application/Application.swift deleted file mode 100644 index 4a41320d..00000000 --- a/rpi-4b-blink/Sources/Application/Application.swift +++ /dev/null @@ -1,85 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2025 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -import MMIO -import Support - -@Register(bitWidth: 32) -struct GPSET1 { - @ReadWrite(bits: 10..<11, as: Bool.self) - var set: SET -} - -@Register(bitWidth: 32) -struct GPCLR1 { - @ReadWrite(bits: 10..<11, as: Bool.self) - var clear: CLEAR -} - -@Register(bitWidth: 32) -struct GPFSEL4 { - @ReadWrite(bits: 6..<7, as: Bool.self) - var fsel42b1: FSEL42b1 - @ReadWrite(bits: 7..<8, as: Bool.self) - var fsel42b2: FSEL42b2 - @ReadWrite(bits: 8..<9, as: Bool.self) - var fsel42b3: FSEL42b3 -} - -@RegisterBlock -struct GPIO { - @RegisterBlock(offset: 0x200020) - var gpset1: Register - @RegisterBlock(offset: 0x20002c) - var gpclr1: Register - @RegisterBlock(offset: 0x200010) - var gpfsel4: Register -} - -let gpio = GPIO(unsafeAddress: 0xFE00_0000) - -func setLedOutput() { - gpio.gpfsel4.modify { - // setFunction Select 42 (fsel42) to 001 - $0.fsel42b1 = true - $0.fsel42b2 = false - $0.fsel42b3 = false - } -} - -func ledOn() { - gpio.gpset1.modify { - $0.set = true - } -} - -func ledOff() { - gpio.gpclr1.modify { - $0.clear = true - } -} - -func delay() { - for _ in 1..<1_000_000 { nop() } -} - -@main -struct Application { - static func main() { - setLedOutput() - while true { - ledOn() - delay() - ledOff() - delay() - } - } -} diff --git a/rpi-4b-blink/Sources/Support/boot.S b/rpi-4b-blink/Sources/Support/boot.S deleted file mode 100644 index 0a8f8c39..00000000 --- a/rpi-4b-blink/Sources/Support/boot.S +++ /dev/null @@ -1,41 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2024 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -.section ".text.boot" - -.global _start - -_start: - // Check processor ID is zero (executing on main core), else hang - mrs x1, mpidr_el1 - and x1, x1, #3 - cbz x1, 2f - // We're not on the main core, so hang in an infinite wait loop -1: wfe - b 1b -2: // We're on the main core! - - // Set stack to start below our code - ldr x1, =_start - mov sp, x1 - - // Clean the BSS section - ldr x1, =__bss_start // Start address - ldr w2, =__bss_size // Size of the section -3: cbz w2, 4f // Quit loop if zero - str xzr, [x1], #8 - sub w2, w2, #1 - cbnz w2, 3b // Loop if non-zero - - // Jump to Swift! -4: bl main - // Halt if Swift returns - b 1b diff --git a/rpi-4b-blink/Sources/Support/include/Support.h b/rpi-4b-blink/Sources/Support/include/Support.h deleted file mode 100644 index deac9bed..00000000 --- a/rpi-4b-blink/Sources/Support/include/Support.h +++ /dev/null @@ -1,16 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2025 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -#pragma once - -static inline __attribute((always_inline)) void nop() { - asm volatile("nop"); -} diff --git a/rpi-4b-blink/Sources/Support/linkerscript.ld b/rpi-4b-blink/Sources/Support/linkerscript.ld deleted file mode 100644 index 8f10b405..00000000 --- a/rpi-4b-blink/Sources/Support/linkerscript.ld +++ /dev/null @@ -1,27 +0,0 @@ -SECTIONS -{ - /* Kernel load address for AArch64 */ - . = 0x80000; - .text : { KEEP(*(.text.boot)) *(.text .text.* .gnu.linkonce.t*) } - .rodata : { *(.rodata .rodata.* .gnu.linkonce.r*) } - PROVIDE(_data = .); - .data : { *(.data .data.* .gnu.linkonce.d*) } - .bss (NOLOAD) : { - . = ALIGN(16); - __bss_start = .; - *(.bss .bss.*) - *(COMMON) - __bss_end = .; - } - _end = .; - - /DISCARD/ : { - *(.comment) - *(.gnu*) - *(.note*) - *(.eh_frame*) - *(.swift_modhash) - } -} - -__bss_size = (__bss_end - __bss_start) >> 3; diff --git a/rpi-4b-blink/assets/hero.jpg b/rpi-4b-blink/assets/hero.jpg deleted file mode 100644 index 7deaf8f09ba3167ad37d539774427fe7b1c04187..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 531343 zcmeFZbyOTr*Dl()LxA9#V8I;{G(d0&?iMV#yIVp6!3pl}?(XjH?(Q(?+{y2KzwbTg zu6x!x_uM~k_DokjT~oEYc1^9C-OuhC@H}_}7!-9i`w9TEvH%?b0EhrQ6czvjK~Rtv z07VGE{euBO6^iJ;u`blRf7gKq0BG$0)c;`y!2Y{FMCU&u@$d70

b~fB-3hWnp7u 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℘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�^EYE;W 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 A&Hw-a diff --git a/rpi-5-blink/Makefile b/rpi-5-blink/Makefile deleted file mode 100644 index f07ed954..00000000 --- a/rpi-5-blink/Makefile +++ /dev/null @@ -1,46 +0,0 @@ -##===----------------------------------------------------------------------===## -## -## This source file is part of the Swift open source project -## -## Copyright (c) 2025 Apple Inc. and the Swift project authors. -## Licensed under Apache License v2.0 with Runtime Library Exception -## -## See https://swift.org/LICENSE.txt for license information -## -##===----------------------------------------------------------------------===## - -# Paths -REPOROOT := $(shell git rev-parse --show-toplevel) -TOOLSROOT := $(REPOROOT)/Tools -TOOLSET := $(TOOLSROOT)/Toolsets/rpi-5-elf.json -LLVM_OBJCOPY := llvm-objcopy -SWIFT_BUILD := swift build - -# Flags -ARCH := aarch64 -TARGET := $(ARCH)-none-none-elf -SWIFT_BUILD_ARGS := \ - --configuration release \ - --triple $(TARGET) \ - --toolset $(TOOLSET) -BUILDROOT := $(shell $(SWIFT_BUILD) $(SWIFT_BUILD_ARGS) --show-bin-path) - -.PHONY: build -build: - @echo "building..." - $(SWIFT_BUILD) \ - $(SWIFT_BUILD_ARGS) \ - --verbose - - @echo "extracting binary..." - $(LLVM_OBJCOPY) \ - -O binary \ - "$(BUILDROOT)/Application" \ - "$(BUILDROOT)/Application.bin" - - -.PHONY: clean -clean: - @echo "cleaning..." - @swift package clean - @rm -rf .build diff --git a/rpi-5-blink/Package.resolved b/rpi-5-blink/Package.resolved deleted file mode 100644 index 4cf1835e..00000000 --- a/rpi-5-blink/Package.resolved +++ /dev/null @@ -1,33 +0,0 @@ -{ - "originHash" : "5bb00fe2bf59115297c70799769d8080cf6ce836d32f4a41d42e7c420afddec6", - "pins" : [ - { - "identity" : "swift-argument-parser", - "kind" : "remoteSourceControl", - "location" : "https://github.com/apple/swift-argument-parser.git", - "state" : { - "revision" : "41982a3656a71c768319979febd796c6fd111d5c", - "version" : "1.5.0" - } - }, - { - "identity" : "swift-mmio", - "kind" : "remoteSourceControl", - "location" : "https://github.com/apple/swift-mmio.git", - "state" : { - "branch" : "main", - "revision" : "5232c5129a8c70beafc3d6acfbae2716c1b6822a" - } - }, - { - "identity" : "swift-syntax", - "kind" : "remoteSourceControl", - "location" : "https://github.com/swiftlang/swift-syntax.git", - "state" : { - "revision" : "0687f71944021d616d34d922343dcef086855920", - "version" : "600.0.1" - } - } - ], - "version" : 3 -} diff --git a/rpi-5-blink/Package.swift b/rpi-5-blink/Package.swift deleted file mode 100644 index 7bd48409..00000000 --- a/rpi-5-blink/Package.swift +++ /dev/null @@ -1,21 +0,0 @@ -// swift-tools-version: 6.0 - -import PackageDescription - -let package = Package( - name: "rpi-5-blink", - products: [ - .executable(name: "Application", targets: ["Application"]) - ], - dependencies: [ - .package(url: "https://github.com/apple/swift-mmio.git", branch: "main") - ], - targets: [ - .executableTarget( - name: "Application", - dependencies: [ - .product(name: "MMIO", package: "swift-mmio"), - "Support", - ]), - .target(name: "Support"), - ]) diff --git a/rpi-5-blink/README.md b/rpi-5-blink/README.md deleted file mode 100644 index 2ff683ca..00000000 --- a/rpi-5-blink/README.md +++ /dev/null @@ -1,22 +0,0 @@ -# rpi-5-blink - - - -## Requirements - -- A Raspberry Pi 5 board -- An SD Card, with a Raspberry Pi OS installed (this way, we don't need to create the configuration files from scratch). You may backup `kernel8.img` and `kernel_2712.img` if you need the Linux install later, since we will change these files. - -## How to build and run this example: - -- Make sure you have a recent nightly Swift toolchain that has Embedded Swift support. -- Build the program, then copy the kernel image to the SD card. -``` console -$ cd rpi-5-blink -$ make -$ cp .build/release/Application.bin /Volumes/bootfs/kernel8.img # Copy kernel image to SD card -$ rm /Volumes/bootfs/kernel_2712.img # Delete this kernel image so our kernel8.img is used -$ # You can also rename our kernel8.img to kernel_2712.img, or set it to anything you want and specify "kernel=[your-img-name]" in config.txt. -``` -- Place the SD card in your Raspberry Pi 5, and connect it to power. -- After the boot sequence, the green (ACT) led will start blinking in a regular pattern. diff --git a/rpi-5-blink/Sources/Application/Application.swift b/rpi-5-blink/Sources/Application/Application.swift deleted file mode 100644 index 6173a1aa..00000000 --- a/rpi-5-blink/Sources/Application/Application.swift +++ /dev/null @@ -1,70 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2025 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -import MMIO -import Support - -@Register(bitWidth: 32) -struct GIOIODIR { - @ReadWrite(bits: 9..<10, as: Bool.self) - var direction: DIRECTION -} - -@Register(bitWidth: 32) -struct GIODATA { - @ReadWrite(bits: 9..<10, as: Bool.self) - var value: VALUE -} - -@RegisterBlock -struct GPIO { - @RegisterBlock(offset: 0x00008) - var gioiodir: Register - @RegisterBlock(offset: 0x00004) - var giodata: Register -} - -let gpio = GPIO(unsafeAddress: 0x10_7d51_7c00) - -func setLedOutput() { - gpio.gioiodir.modify { - $0.direction = false // 0 is output, 1 is input - } -} - -func ledOn() { - gpio.giodata.modify { - $0.value = true // pin on - } -} - -func ledOff() { - gpio.giodata.modify { - $0.value = false // pin off - } -} - -func delay() { - for _ in 1..<1_000_000 { nop() } -} - -@main -struct Application { - static func main() { - setLedOutput() - while true { - ledOn() - delay() - ledOff() - delay() - } - } -} diff --git a/rpi-5-blink/Sources/Support/boot.S b/rpi-5-blink/Sources/Support/boot.S deleted file mode 100644 index 0a8f8c39..00000000 --- a/rpi-5-blink/Sources/Support/boot.S +++ /dev/null @@ -1,41 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2024 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -.section ".text.boot" - -.global _start - -_start: - // Check processor ID is zero (executing on main core), else hang - mrs x1, mpidr_el1 - and x1, x1, #3 - cbz x1, 2f - // We're not on the main core, so hang in an infinite wait loop -1: wfe - b 1b -2: // We're on the main core! - - // Set stack to start below our code - ldr x1, =_start - mov sp, x1 - - // Clean the BSS section - ldr x1, =__bss_start // Start address - ldr w2, =__bss_size // Size of the section -3: cbz w2, 4f // Quit loop if zero - str xzr, [x1], #8 - sub w2, w2, #1 - cbnz w2, 3b // Loop if non-zero - - // Jump to Swift! -4: bl main - // Halt if Swift returns - b 1b diff --git a/rpi-5-blink/Sources/Support/include/Support.h b/rpi-5-blink/Sources/Support/include/Support.h deleted file mode 100644 index deac9bed..00000000 --- a/rpi-5-blink/Sources/Support/include/Support.h +++ /dev/null @@ -1,16 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2025 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -#pragma once - -static inline __attribute((always_inline)) void nop() { - asm volatile("nop"); -} diff --git a/rpi-5-blink/Sources/Support/linkerscript.ld b/rpi-5-blink/Sources/Support/linkerscript.ld deleted file mode 100644 index 8f10b405..00000000 --- a/rpi-5-blink/Sources/Support/linkerscript.ld +++ /dev/null @@ -1,27 +0,0 @@ -SECTIONS -{ - /* Kernel load address for AArch64 */ - . = 0x80000; - .text : { KEEP(*(.text.boot)) *(.text .text.* .gnu.linkonce.t*) } - .rodata : { *(.rodata .rodata.* .gnu.linkonce.r*) } - PROVIDE(_data = .); - .data : { *(.data .data.* .gnu.linkonce.d*) } - .bss (NOLOAD) : { - . = ALIGN(16); - __bss_start = .; - *(.bss .bss.*) - *(COMMON) - __bss_end = .; - } - _end = .; - - /DISCARD/ : { - *(.comment) - *(.gnu*) - *(.note*) - *(.eh_frame*) - *(.swift_modhash) - } -} - -__bss_size = (__bss_end - __bss_start) >> 3; diff --git a/rpi-5-blink/assets/hero.jpg b/rpi-5-blink/assets/hero.jpg deleted file mode 100644 index 2f6b172e749ffd4e9162a074a7fab73fb5e00acf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 552044 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

{{ZAte`qdQ2>sB&z!=G< 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 z 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 ^S1va=^5avq4xNQpnb~65_glU_DLn>{ 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�~@%guj@J|a?a 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 Yh*d}C$fD6U^EC={jPl)_2t9URry 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⁢Ae&QtviYKVK-%Qg>QdK%#Or9@hB(=$pf#; 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 JbeqgjSG9U9r(uKX(<> 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 diff --git a/rpi-pico-blink-sdk/BridgingHeader.h b/rpi-pico-blink-sdk/BridgingHeader.h deleted file mode 100644 index 417e466e..00000000 --- a/rpi-pico-blink-sdk/BridgingHeader.h +++ /dev/null @@ -1,14 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2023 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -#pragma once - -#include "pico/stdlib.h" diff --git a/rpi-pico-blink-sdk/CMakeLists.txt b/rpi-pico-blink-sdk/CMakeLists.txt deleted file mode 100644 index 63a9a58d..00000000 --- a/rpi-pico-blink-sdk/CMakeLists.txt +++ /dev/null @@ -1,113 +0,0 @@ -cmake_minimum_required(VERSION 3.29) -include($ENV{PICO_SDK_PATH}/external/pico_sdk_import.cmake) - -set(CMAKE_Swift_COMPILATION_MODE wholemodule) -set(CMAKE_Swift_COMPILER_WORKS YES) - -project(swift-blinky) -pico_sdk_init() -enable_language(Swift) - -set(SWIFT_TARGET "armv6m-none-none-eabi") # default for rp2040 - -if(PICO_PLATFORM STREQUAL "rp2350-arm-s") - message(STATUS "PICO_PLATFORM is set to rp2350-arm-s, using armv7em") - set(SWIFT_TARGET "armv7em-none-none-eabi") - list(APPEND CLANG_ARCH_ABI_FLAGS "-Xcc -mfloat-abi=soft") -elseif(PICO_PLATFORM STREQUAL "rp2040") - message(STATUS "PICO_PLATFORM is set to RP2040, using armv6m") - list(APPEND CLANG_ARCH_ABI_FLAGS "-Xcc -mfloat-abi=soft") -elseif(PICO_PLATFORM STREQUAL "rp2350-riscv") - message(STATUS "PICO_PLATFORM is set to rp2350-riscv, using riscv32.") - set(SWIFT_TARGET "riscv32-none-none-eabi") - list(APPEND CLANG_ARCH_ABI_FLAGS "-Xcc -march=rv32imac_zicsr_zifencei_zba_zbb_zbs_zbkb -Xcc -mabi=ilp32") -endif() - -add_executable(swift-blinky - # Source files: - Main.swift -) - -set_target_properties(swift-blinky PROPERTIES LINKER_LANGUAGE CXX) - -target_link_libraries(swift-blinky - pico_stdlib hardware_uart hardware_gpio -) - -# Clear the default COMPILE_OPTIONS which include C specific compiler flags that the Swift compiler will not accept -# Instead, set those options to only apply when compiling C code. -set_target_properties(pico_standard_link PROPERTIES INTERFACE_COMPILE_OPTIONS "") -target_compile_options(pico_standard_link INTERFACE "$<$:SHELL: -ffunction-sections -fdata-sections>") - -# Gather C compile definitions from all dependencies -set_property(GLOBAL PROPERTY visited_targets "") -set_property(GLOBAL PROPERTY compilerdefs_list "") - -function(gather_compile_definitions_recursive target) - # Get the current value of visited_targets - get_property(visited_targets GLOBAL PROPERTY visited_targets) - - # make sure we don't visit the same target twice - # and that we don't visit the special generator expressions - if (${target} MATCHES "\\\$<" OR ${target} MATCHES "::@" OR ${target} IN_LIST visited_targets) - return() - endif() - - # Append the target to visited_targets - list(APPEND visited_targets ${target}) - set_property(GLOBAL PROPERTY visited_targets "${visited_targets}") - - get_target_property(target_definitions ${target} INTERFACE_COMPILE_DEFINITIONS) - if (target_definitions) - # Append the target definitions to compilerdefs_list - get_property(compilerdefs_list GLOBAL PROPERTY compilerdefs_list) - list(APPEND compilerdefs_list ${target_definitions}) - set_property(GLOBAL PROPERTY compilerdefs_list "${compilerdefs_list}") - endif() - - get_target_property(target_linked_libs ${target} INTERFACE_LINK_LIBRARIES) - if (target_linked_libs) - foreach(linked_target ${target_linked_libs}) - # Recursively gather compile definitions from dependencies - gather_compile_definitions_recursive(${linked_target}) - endforeach() - endif() -endfunction() - -gather_compile_definitions_recursive(swift-blinky) -get_property(COMPILE_DEFINITIONS GLOBAL PROPERTY compilerdefs_list) -get_property(INCLUDES GLOBAL PROPERTY includes_list) - -# Convert compiler definitions into a format that swiftc can understand -list(REMOVE_DUPLICATES COMPILE_DEFINITIONS) -list(PREPEND COMPILE_DEFINITIONS "") # adds a semicolon at the beginning -string(REPLACE "$" "$" COMPILE_DEFINITIONS "${COMPILE_DEFINITIONS}") -string(REPLACE ";" " -Xcc -D" COMPILE_DEFINITIONS "${COMPILE_DEFINITIONS}") - -# Compute -Xcc flags to set up the C and C++ header search paths for Swift (for bridging header). -set(IMPLICIT_INCLUDES) -foreach(dir ${CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES}) - string(CONCAT IMPLICIT_INCLUDES ${IMPLICIT_INCLUDES} "-Xcc ") - string(CONCAT IMPLICIT_INCLUDES ${IMPLICIT_INCLUDES} "-I${dir} ") -endforeach() -foreach(dir ${CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES}) - string(CONCAT IMPLICIT_INCLUDES ${IMPLICIT_INCLUDES} "-Xcc ") - string(CONCAT IMPLICIT_INCLUDES ${IMPLICIT_INCLUDES} "-I${dir} ") -endforeach() - -target_compile_options(swift-blinky PUBLIC - "$<$:SHELL: - -target ${SWIFT_TARGET} - -enable-experimental-feature Embedded - -parse-as-library - -module-name swift_blinky - - ${CLANG_ARCH_ABI_FLAGS} - -Xcc -fshort-enums - -Xfrontend -function-sections - -import-bridging-header ${CMAKE_CURRENT_LIST_DIR}/BridgingHeader.h - ${COMPILE_DEFINITIONS} - ${IMPLICIT_INCLUDES} - >") - -pico_add_extra_outputs(swift-blinky) diff --git a/rpi-pico-blink-sdk/Main.swift b/rpi-pico-blink-sdk/Main.swift deleted file mode 100644 index 74c0d7af..00000000 --- a/rpi-pico-blink-sdk/Main.swift +++ /dev/null @@ -1,25 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2023 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -@main -struct Main { - static func main() { - let led = UInt32(PICO_DEFAULT_LED_PIN) - gpio_init(led) - gpio_set_dir(led, true) - while true { - gpio_put(led, true) - sleep_ms(250) - gpio_put(led, false) - sleep_ms(250) - } - } -} diff --git a/rpi-pico-blink-sdk/README.md b/rpi-pico-blink-sdk/README.md deleted file mode 100644 index bd6d9e85..00000000 --- a/rpi-pico-blink-sdk/README.md +++ /dev/null @@ -1,43 +0,0 @@ -# rpi-pico-blink-sdk - -This example demonstrates how to integrate with the Pico SDK which is using CMake as its build system -- the simplest way to integrate with it is to also use CMake to build a Swift firmware application on top of the SDK and the libraries from it. - - - -## Requirements - -- A Raspberry Pi Pico (non-W) board. If you have a Pico W instead, refer to the [rpi-picow-blink-sdk](../rpi-picow-blink-sdk) sample instead. -- Follow the setup steps at https://datasheets.raspberrypi.com/pico/getting-started-with-pico.pdf, in particular you'll need: - - A checkout of the [pico-sdk](https://github.com/raspberrypi/pico-sdk.git), with git submodules checked out. If you'd like to try RISC-V support for RP2350, you'll need Pico SDK 2.1.0 or later. - - A checkout of the [pico-examples](https://github.com/raspberrypi/pico-examples.git). - - CMake. - - The [Arm Embedded Toolchain](https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads), or the RISC-V toolchain if you want to build for the RISC-V cores on the RP2350. -- Before trying to use Swift with the Pico SDK, make sure your environment works and can build the provided C/C++ sample projects, in particular: - - Try building and running the "blink" example from pico-examples written in C. - - -## Building - -- Make sure you have a recent nightly Swift toolchain that has Embedded Swift support. -- Build and copy the program in the UF2 format to the Mass Storage device to trigger flashing the program into memory (after which the device will reboot and run the firmware): - -``` console -$ cd rpi-pico-blink-sdk -$ export PICO_BOARD='' # Examples: pico, pico2 -$ export PICO_PLATFORM='' # Optional; useful if you'd like to compile for RISC-V. Examples: rp2040, rp2350-arm-s, rp2350-riscv -$ export PICO_SDK_PATH='' -$ export PICO_TOOLCHAIN_PATH='' # A default `brew` install will be located at `/Applications/ArmGNUToolchain/[version]/arm-none-eabi`. This can also be a RISC-V toolchain for the RP2350. -$ cmake -B build -G Ninja . -DCMAKE_EXPORT_COMPILE_COMMANDS=On -$ cmake --build build -``` - -## Running - -- Connect the Pico board via a USB cable to your Mac, and make sure it's in the USB Mass Storage firmware upload mode (either hold the BOOTSEL button while plugging the board, or make sure your Flash memory doesn't contain any valid firmware). -- Copy the UF2 firmware to the Mass Storage device: - -```console -$ cp build/swift-blinky.uf2 /Volumes/RP2040 -``` - -- The green LED should now be blinking in a pattern. diff --git a/rpi-pico-blink/Makefile b/rpi-pico-blink/Makefile deleted file mode 100755 index 15cee44d..00000000 --- a/rpi-pico-blink/Makefile +++ /dev/null @@ -1,60 +0,0 @@ -##===----------------------------------------------------------------------===## -## -## This source file is part of the Swift open source project -## -## Copyright (c) 2025 Apple Inc. and the Swift project authors. -## Licensed under Apache License v2.0 with Runtime Library Exception -## -## See https://swift.org/LICENSE.txt for license information -## -##===----------------------------------------------------------------------===## - -# Paths -REPOROOT := $(shell git rev-parse --show-toplevel) -TOOLSROOT := $(REPOROOT)/Tools -TOOLSET := $(TOOLSROOT)/Toolsets/pico.json -MACHO2UF2 := $(TOOLSROOT)/macho2uf2.py -SWIFT_BUILD := swift build - -# Flags -PICO_FAMILY := rp2040 -ARCH := armv6m -TARGET := $(ARCH)-apple-none-macho -SWIFT_BUILD_ARGS := \ - --configuration release \ - --triple $(TARGET) \ - --toolset $(TOOLSET) -BUILDROOT := $(shell $(SWIFT_BUILD) $(SWIFT_BUILD_ARGS) --show-bin-path) - -.PHONY: build -build: - @echo "building..." - $(SWIFT_BUILD) \ - $(SWIFT_BUILD_ARGS) \ - -Xlinker -map -Xlinker $(BUILDROOT)/Application.mangled.map \ - --verbose - - @echo "demangling linker map..." - cat $(BUILDROOT)/Application.mangled.map \ - | c++filt | swift demangle > $(BUILDROOT)/Application.map - - @echo "disassembling..." - otool \ - -arch $(ARCH) -v -V -d -t \ - $(BUILDROOT)/Application \ - | c++filt | swift demangle > $(BUILDROOT)/Application.disassembly - - @echo "extracting binary..." - $(MACHO2UF2) \ - --pico-family "$(PICO_FAMILY)" \ - "$(BUILDROOT)/Application" \ - "$(BUILDROOT)/Application.uf2" \ - --base-address 0x20000000 \ - --segments '__TEXT,__DATA,__VECTORS,__RESET' - - -.PHONY: clean -clean: - @echo "cleaning..." - @swift package clean - @rm -rf .build diff --git a/rpi-pico-blink/Package.swift b/rpi-pico-blink/Package.swift deleted file mode 100644 index df681886..00000000 --- a/rpi-pico-blink/Package.swift +++ /dev/null @@ -1,15 +0,0 @@ -// swift-tools-version: 6.0 - -import PackageDescription - -let package = Package( - name: "RP2040", - products: [ - .executable(name: "Application", targets: ["Application"]) - ], - targets: [ - .executableTarget(name: "Application", dependencies: ["RP2040"]), - .target(name: "Support"), - .target(name: "RP2040", dependencies: ["Support"]), - ], - swiftLanguageModes: [.v5]) diff --git a/rpi-pico-blink/README.md b/rpi-pico-blink/README.md deleted file mode 100644 index 12ed0a5f..00000000 --- a/rpi-pico-blink/README.md +++ /dev/null @@ -1,21 +0,0 @@ -# rpi-pico-blink - - - -## Requirements - -- A Raspberry Pi Pico (non-W) board. If you have a Pico W instead, this sample code will require modifications. - -## How to build and run this example: - -- Connect the Pico board via a USB cable to your Mac, and make sure it's in the USB Mass Storage firmware upload mode (either hold the BOOTSEL button while plugging the board, or make sure your Flash memory doesn't contain any valid firmware). -- Make sure you have a recent nightly Swift toolchain that has Embedded Swift support. -- Build and copy the program in the UF2 format to the Mass Storage device to trigger flashing the program into memory (after which the device will reboot and run the firmware): - -``` console -$ cd rpi-pico-blink -$ make -$ cp .build/Application.uf2 /Volumes/RP2040 -``` - -- The green LED should now be blinking in a pattern. diff --git a/rpi-pico-blink/Sources/Application/Application.swift b/rpi-pico-blink/Sources/Application/Application.swift deleted file mode 100644 index a27b8b76..00000000 --- a/rpi-pico-blink/Sources/Application/Application.swift +++ /dev/null @@ -1,367 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2023 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -import RP2040 - -@main -struct Application { - // swift-format-ignore: NeverUseImplicitlyUnwrappedOptionals - static var board: RP2040! = nil - - static func main() { - board = RP2040() - - board.setMode(.output, pin: .d22) - board.digitalWrite(pin: .d22, true) - - let str: StaticString = "Hello Swift!" - - board.sleep(forMilliseconds: 1000) - - board.digitalWrite(pin: .d22, false) - - while true { - str.withUTF8Buffer { buffer in - for ch in buffer { - emit(ch) - } - delay(7) - } - } - } - - static func delay(_ count: Int = 1) { - board.sleep(forMilliseconds: 100 * count) - } - - static func dot() { - board.digitalWrite(pin: .d22, true) - delay() - board.digitalWrite(pin: .d22, false) - delay() - } - - static func dash() { - board.digitalWrite(pin: .d22, true) - delay(3) - board.digitalWrite(pin: .d22, false) - delay() - } - - static func letter(_ codes: () -> Void) { - codes() - delay(3) - } - - static func emit(_ ch: UInt8) { - switch ch { - case 0x41, 0x61: - letter { - dot() - dash() - } - case 0x42, 0x62: - letter { - dash() - dot() - dot() - dot() - } - case 0x43, 0x63: - letter { - dash() - dot() - dash() - dot() - } - case 0x44, 0x64: - letter { - dash() - dot() - dot() - } - case 0x45, 0x65: letter { dot() } - case 0x46, 0x66: - letter { - dot() - dot() - dash() - dot() - } - case 0x47, 0x67: - letter { - dash() - dash() - dot() - } - case 0x48, 0x68: - letter { - dot() - dot() - dot() - dot() - } - case 0x49, 0x69: - letter { - dot() - dot() - } - case 0x4A, 0x6A: - letter { - dot() - dash() - dash() - dash() - } - case 0x4B, 0x6B: - letter { - dash() - dot() - dash() - } - case 0x4C, 0x6C: - letter { - dot() - dash() - dot() - dot() - } - case 0x4D, 0x6D: - letter { - dash() - dash() - } - case 0x4E, 0x6E: - letter { - dash() - dot() - } - case 0x4F, 0x6F: - letter { - dash() - dash() - dash() - } - case 0x50, 0x70: - letter { - dot() - dash() - dash() - dot() - } - case 0x51, 0x71: - letter { - dash() - dash() - dot() - dash() - } - case 0x52, 0x72: - letter { - dot() - dash() - dot() - } - case 0x53, 0x73: - letter { - dot() - dot() - dot() - } - case 0x54, 0x74: letter { dash() } - case 0x55, 0x75: - letter { - dot() - dot() - dash() - } - case 0x56, 0x76: - letter { - dot() - dot() - dot() - dash() - } - case 0x57, 0x77: - letter { - dot() - dash() - dash() - } - case 0x58, 0x78: - letter { - dash() - dot() - dot() - dash() - } - case 0x59, 0x79: - letter { - dash() - dot() - dash() - dash() - } - case 0x5A, 0x7A: - letter { - dash() - dash() - dot() - dot() - } - case 0x31: - letter { - dot() - dash() - dash() - dash() - dash() - } - case 0x32: - letter { - dot() - dot() - dash() - dash() - dash() - } - case 0x33: - letter { - dot() - dot() - dot() - dash() - dash() - } - case 0x34: - letter { - dot() - dot() - dot() - dot() - dash() - } - case 0x35: - letter { - dot() - dot() - dot() - dot() - dot() - } - case 0x36: - letter { - dash() - dot() - dot() - dot() - dot() - } - case 0x37: - letter { - dash() - dash() - dot() - dot() - dot() - } - case 0x38: - letter { - dash() - dash() - dash() - dot() - dot() - } - case 0x39: - letter { - dash() - dash() - dash() - dash() - dot() - } - case 0x30: - letter { - dash() - dash() - dash() - dash() - dash() - } - case 0x2E: - letter { - dot() - dash() - dot() - dash() - dot() - dash() - } - case 0x2C: - letter { - dash() - dash() - dot() - dot() - dash() - dash() - } - case 0x3F: - letter { - dot() - dot() - dash() - dash() - dot() - dot() - } - case 0x21: - letter { - dash() - dot() - dash() - dot() - dash() - dash() - } - case 0x2F: - letter { - dash() - dot() - dot() - dash() - dot() - } - case 0x28: - letter { - dash() - dot() - dash() - dash() - dot() - } - case 0x29: - letter { - dash() - dot() - dash() - dash() - dot() - dash() - } - case 0x20: - delay(7) - default: - break - } - } -} diff --git a/rpi-pico-blink/Sources/RP2040/HAL/Digital.swift b/rpi-pico-blink/Sources/RP2040/HAL/Digital.swift deleted file mode 100644 index d6643c20..00000000 --- a/rpi-pico-blink/Sources/RP2040/HAL/Digital.swift +++ /dev/null @@ -1,131 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2023 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -extension RP2040 { - enum PinDirection { - case input - case output - } - - func setDirection(_ pin: some DigitalPin, _ direction: PinDirection) { - switch direction { - case .output: - hardware.sio.enableOutput(1 << pin.rawValue) - case .input: - hardware.sio.disableOutput(1 << pin.rawValue) - } - } - - func put(_ pin: some DigitalPin, _ value: Bool) { - switch value { - case true: - hardware.sio.setOutput(1 << pin.rawValue) - case false: - hardware.sio.clearOutput(1 << pin.rawValue) - } - } - - public func write( - _ byte: UInt8, - to pins: ( - some DigitalPin, some DigitalPin, some DigitalPin, some DigitalPin, - some DigitalPin, some DigitalPin, some DigitalPin, some DigitalPin - ) - ) { - var set = UInt32(0) - var clear = UInt32(0) - - if byte & (1 << 0) != 0 { - set |= 1 << pins.0.rawValue - } else { - clear |= 1 << pins.0.rawValue - } - if byte & (1 << 1) != 0 { - set |= 1 << pins.1.rawValue - } else { - clear |= 1 << pins.1.rawValue - } - if byte & (1 << 2) != 0 { - set |= 1 << pins.2.rawValue - } else { - clear |= 1 << pins.2.rawValue - } - if byte & (1 << 3) != 0 { - set |= 1 << pins.0.rawValue - } else { - clear |= 1 << pins.3.rawValue - } - if byte & (1 << 4) != 0 { - set |= 1 << pins.4.rawValue - } else { - clear |= 1 << pins.4.rawValue - } - if byte & (1 << 5) != 0 { - set |= 1 << pins.5.rawValue - } else { - clear |= 1 << pins.5.rawValue - } - if byte & (1 << 6) != 0 { - set |= 1 << pins.6.rawValue - } else { - clear |= 1 << pins.6.rawValue - } - if byte & (1 << 7) != 0 { - set |= 1 << pins.7.rawValue - } else { - clear |= 1 << pins.7.rawValue - } - hardware.sio.setOutput(set) - hardware.sio.clearOutput(clear) - } - - func setFunction( - _ pin: some DigitalPin, - _ function: RP2040Hardware.IOBank.GPIOControl.Projection.FuncSel - ) { - hardware.padsBank0.gpio[pin.rawValue].modify { - $0.outputDisable = false - $0.inputEnable = true - $0.driveStrength = .level4mA - $0.pullUpEnable = false - $0.pullDownEnable = true - $0.schmittTriggerEnable = true - $0.slewRateControl = .slow - } - hardware.ioBank0.gpioControl[pin.rawValue].modify { - $0.functionSelection = function - } - } - - func initialize(_ pin: some DigitalPin) { - setDirection(pin, .input) - put(pin, false) - setFunction(pin, .sio0) - } - - public func setMode(_ mode: PinMode, pin: some DigitalPin) { - switch mode { - case .output4mA: - initialize(pin) - hardware.padsBank0.gpio[pin.rawValue].modify { - $0.driveStrength = .level4mA - } - setDirection(pin, .output) - default: - break - } - } - - public func digitalWrite(pin: some DigitalPin, _ value: Bool) { - setFunction(pin, .sio0) - put(pin, value) - } -} diff --git a/rpi-pico-blink/Sources/RP2040/HAL/Pins.swift b/rpi-pico-blink/Sources/RP2040/HAL/Pins.swift deleted file mode 100644 index cf9afec5..00000000 --- a/rpi-pico-blink/Sources/RP2040/HAL/Pins.swift +++ /dev/null @@ -1,502 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2023 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -// swift-format-ignore-file - -extension RP2040 { - public enum PinMode { - case input - case inputPullup - case inputPulldown - case output2mA - case output4mA - case output8mA - case output12mA - - public static var output: PinMode { return .output4mA } - } -} - - -public protocol RawPin { - var rawValue: UInt32 { get } -} - -public protocol DigitalPin: RawPin { } - -public protocol AnalogPin: RawPin { } - -public protocol I2CSDAPin: RawPin { } -public protocol I2CSCLPin: RawPin { } - -public protocol I2C0SDAPin: I2CSDAPin { } -public protocol I2C0SCLPin: I2CSCLPin { } - -public protocol I2C1SDAPin: I2CSDAPin { } -public protocol I2C1SCLPin: I2CSCLPin { } - -public protocol SPISCKPin: RawPin { } -public protocol SPITXPin: RawPin { } -public protocol SPIRXPin: RawPin { } -public protocol SPICSPin: RawPin { } - -public protocol SPI0SCKPin: SPISCKPin { } -public protocol SPI0TXPin: SPITXPin { } -public protocol SPI0RXPin: SPIRXPin { } -public protocol SPI0CSPin: SPICSPin { } - -public protocol SPI1SCKPin: SPISCKPin { } -public protocol SPI1TXPin: SPITXPin { } -public protocol SPI1RXPin: SPIRXPin { } -public protocol SPI1CSPin: SPICSPin { } - -public protocol UARTTXPin: RawPin { } -public protocol UARTRXPin: RawPin { } - -public protocol UART0TXPin: UARTTXPin { } -public protocol UART0RXPin: UARTRXPin { } - -public protocol UART1TXPin: UARTTXPin { } -public protocol UART1RXPin: UART0RXPin { } - -public struct PhysicalPin1: DigitalPin, SPI0RXPin, I2C0SDAPin, UART0TXPin { - public var rawValue: UInt32 { 0 } -} - -public struct PhysicalPin2: DigitalPin, SPI0CSPin, I2C0SCLPin, UART0RXPin { - public var rawValue: UInt32 { 1 } -} - -public struct PhysicalPin3 { } // GND - -public struct PhysicalPin4: DigitalPin, SPI0SCKPin, I2C1SDAPin { - public var rawValue: UInt32 { 2 } -} - -public struct PhysicalPin5: DigitalPin, SPI0TXPin, I2C1SCLPin { - public var rawValue: UInt32 { 3 } -} - -public struct PhysicalPin6: DigitalPin, SPI0RXPin, I2C0SDAPin, UART1TXPin { - public var rawValue: UInt32 { 4 } -} - -public struct PhysicalPin7: DigitalPin, SPI0CSPin, I2C0SCLPin, UART1RXPin { - public var rawValue: UInt32 { 5 } -} - -public struct PhysicalPin8 { } // GND - -public struct PhysicalPin9: DigitalPin, SPI0SCKPin, I2C1SDAPin { - public var rawValue: UInt32 { 6 } -} - -public struct PhysicalPin10: DigitalPin, SPI0TXPin, I2C1SCLPin { - public var rawValue: UInt32 { 7 } -} - -public struct PhysicalPin11: DigitalPin, SPI1RXPin, I2C0SDAPin, UART1TXPin { - public var rawValue: UInt32 { 8 } -} - -public struct PhysicalPin12: DigitalPin, SPI1CSPin, I2C0SCLPin, UART1RXPin { - public var rawValue: UInt32 { 9 } -} - -public struct PhysicalPin13 { } // GND - -public struct PhysicalPin14: DigitalPin, SPI1SCKPin, I2C1SDAPin { - public var rawValue: UInt32 { 10 } -} - -public struct PhysicalPin15: DigitalPin, SPI1TXPin, I2C1SCLPin { - public var rawValue: UInt32 { 11 } -} - -public struct PhysicalPin16: DigitalPin, SPI1RXPin, I2C0SDAPin, UART0TXPin { - public var rawValue: UInt32 { 12 } -} - -public struct PhysicalPin17: DigitalPin, SPI1CSPin, I2C0SCLPin, UART0RXPin { - public var rawValue: UInt32 { 13 } -} - -public struct PhysicalPin18 { } // GND - -public struct PhysicalPin19: DigitalPin, SPI1SCKPin, I2C1SDAPin { - public var rawValue: UInt32 { 14 } -} - -public struct PhysicalPin20: DigitalPin, SPI1TXPin, I2C1SCLPin { - public var rawValue: UInt32 { 15 } -} - -public struct PhysicalPin21: DigitalPin, SPI0RXPin, I2C0SDAPin, UART0TXPin { - public var rawValue: UInt32 { 16 } -} - -public struct PhysicalPin22: DigitalPin, SPI0CSPin, I2C0SCLPin, UART0RXPin { - public var rawValue: UInt32 { 17 } -} - -public struct PhysicalPin23 { } // GND - -public struct PhysicalPin24: DigitalPin, SPI0SCKPin, I2C1SDAPin { - public var rawValue: UInt32 { 18 } -} - -public struct PhysicalPin25: DigitalPin, SPI0TXPin, I2C1SCLPin { - public var rawValue: UInt32 { 19 } -} - -public struct PhysicalPin26: DigitalPin, I2C0SDAPin { - public var rawValue: UInt32 { 20 } -} - -public struct PhysicalPin27: DigitalPin, I2C0SCLPin { - public var rawValue: UInt32 { 21 } -} - -public struct PhysicalPin28 { } // GND - -public struct PhysicalPin29: DigitalPin { - public var rawValue: UInt32 { 25 } -} - -public struct PhysicalPin30 { } // RUN - -public struct PhysicalPin31: DigitalPin, AnalogPin, I2C1SDAPin { - public var rawValue: UInt32 { 26 } -} - -public struct PhysicalPin32: DigitalPin, AnalogPin, I2C1SCLPin { - public var rawValue: UInt32 { 27 } -} - -public struct PhysicalPin33 { } // GDN, AGND - -public struct PhysicalPin34: DigitalPin, AnalogPin { - public var rawValue: UInt32 { 28 } -} - -public struct PhysicalPin35 { } // ADC_VREF - -public struct PhysicalPin36 { } // 3V3 - -public struct PhysicalPin37 { } // 3V3_EN - -public struct PhysicalPin38 { } // GND - -public struct PhysicalPin39 { } // VSYS - -public struct PhysicalPin40 { } // VBUS - -extension DigitalPin where Self == PhysicalPin1 { public static var d0: some DigitalPin { PhysicalPin1() } } -extension DigitalPin where Self == PhysicalPin2 { public static var d1: some DigitalPin { PhysicalPin2() } } -extension DigitalPin where Self == PhysicalPin4 { public static var d2: some DigitalPin { PhysicalPin4() } } -extension DigitalPin where Self == PhysicalPin5 { public static var d3: some DigitalPin { PhysicalPin5() } } -extension DigitalPin where Self == PhysicalPin6 { public static var d4: some DigitalPin { PhysicalPin6() } } -extension DigitalPin where Self == PhysicalPin7 { public static var d5: some DigitalPin { PhysicalPin7() } } -extension DigitalPin where Self == PhysicalPin9 { public static var d6: some DigitalPin { PhysicalPin9() } } -extension DigitalPin where Self == PhysicalPin10 { public static var d7: some DigitalPin { PhysicalPin10() } } -extension DigitalPin where Self == PhysicalPin11 { public static var d8: some DigitalPin { PhysicalPin11() } } -extension DigitalPin where Self == PhysicalPin12 { public static var d9: some DigitalPin { PhysicalPin12() } } -extension DigitalPin where Self == PhysicalPin14 { public static var d10: some DigitalPin { PhysicalPin14() } } -extension DigitalPin where Self == PhysicalPin15 { public static var d11: some DigitalPin { PhysicalPin15() } } -extension DigitalPin where Self == PhysicalPin16 { public static var d12: some DigitalPin { PhysicalPin16() } } -extension DigitalPin where Self == PhysicalPin17 { public static var d13: some DigitalPin { PhysicalPin17() } } -extension DigitalPin where Self == PhysicalPin19 { public static var d14: some DigitalPin { PhysicalPin19() } } -extension DigitalPin where Self == PhysicalPin20 { public static var d15: some DigitalPin { PhysicalPin20() } } -extension DigitalPin where Self == PhysicalPin21 { public static var d16: some DigitalPin { PhysicalPin21() } } -extension DigitalPin where Self == PhysicalPin22 { public static var d17: some DigitalPin { PhysicalPin22() } } -extension DigitalPin where Self == PhysicalPin24 { public static var d18: some DigitalPin { PhysicalPin24() } } -extension DigitalPin where Self == PhysicalPin25 { public static var d19: some DigitalPin { PhysicalPin25() } } -extension DigitalPin where Self == PhysicalPin26 { public static var d20: some DigitalPin { PhysicalPin26() } } -extension DigitalPin where Self == PhysicalPin27 { public static var d21: some DigitalPin { PhysicalPin27() } } -extension DigitalPin where Self == PhysicalPin29 { public static var d22: some DigitalPin { PhysicalPin29() } } -extension DigitalPin where Self == PhysicalPin31 { public static var d26: some DigitalPin { PhysicalPin31() } } -extension DigitalPin where Self == PhysicalPin32 { public static var d27: some DigitalPin { PhysicalPin32() } } -extension DigitalPin where Self == PhysicalPin34 { public static var d28: some DigitalPin { PhysicalPin34() } } - -extension SPI0RXPin where Self == PhysicalPin1 { public static var d0: some SPI0RXPin { PhysicalPin1() } } -extension SPI0RXPin where Self == PhysicalPin6 { public static var d4: some SPI0RXPin { PhysicalPin6() } } -extension SPI0RXPin where Self == PhysicalPin21 { public static var d16: some SPI0RXPin { PhysicalPin21() } } - -extension SPI0CSPin where Self == PhysicalPin2 { public static var d0: some SPI0CSPin { PhysicalPin2() } } -extension SPI0CSPin where Self == PhysicalPin7 { public static var d5: some SPI0CSPin { PhysicalPin7() } } -extension SPI0CSPin where Self == PhysicalPin22 { public static var d17: some SPI0CSPin { PhysicalPin22() } } - -extension SPI0SCKPin where Self == PhysicalPin4 { public static var d2: some SPI0SCKPin { PhysicalPin4() } } -extension SPI0SCKPin where Self == PhysicalPin9 { public static var d6: some SPI0SCKPin { PhysicalPin9() } } -extension SPI0SCKPin where Self == PhysicalPin24 { public static var d18: some SPI0SCKPin { PhysicalPin24() } } - -extension SPI0TXPin where Self == PhysicalPin5 { public static var d2: some SPI0TXPin { PhysicalPin5() } } -extension SPI0TXPin where Self == PhysicalPin10 { public static var d7: some SPI0TXPin { PhysicalPin10() } } -extension SPI0TXPin where Self == PhysicalPin25 { public static var d19: some SPI0TXPin { PhysicalPin25() } } - -extension SPI1RXPin where Self == PhysicalPin11 { public static var d8: some SPI1RXPin { PhysicalPin11() } } -extension SPI1RXPin where Self == PhysicalPin16 { public static var d12: some SPI1RXPin { PhysicalPin16() } } - -extension SPI1CSPin where Self == PhysicalPin12 { public static var d9: some SPI1CSPin { PhysicalPin12() } } -extension SPI1CSPin where Self == PhysicalPin17 { public static var d13: some SPI1CSPin { PhysicalPin17() } } - -extension SPI1SCKPin where Self == PhysicalPin14 { public static var d10: some SPI1SCKPin { PhysicalPin14() } } -extension SPI1SCKPin where Self == PhysicalPin19 { public static var d14: some SPI1SCKPin { PhysicalPin19() } } - -extension SPI1TXPin where Self == PhysicalPin15 { public static var d11: some SPI1TXPin { PhysicalPin15() } } -extension SPI1TXPin where Self == PhysicalPin20 { public static var d15: some SPI1TXPin { PhysicalPin20() } } - -extension I2C0SDAPin where Self == PhysicalPin1 { public static var d0: some I2C0SDAPin { PhysicalPin1() } } -extension I2C0SDAPin where Self == PhysicalPin6 { public static var d4: some I2C0SDAPin { PhysicalPin6() } } -extension I2C0SDAPin where Self == PhysicalPin11 { public static var d8: some I2C0SDAPin { PhysicalPin11() } } -extension I2C0SDAPin where Self == PhysicalPin21 { public static var d16: some I2C0SDAPin { PhysicalPin21() } } -extension I2C0SDAPin where Self == PhysicalPin26 { public static var d20: some I2C0SDAPin { PhysicalPin26() } } - -extension I2C0SCLPin where Self == PhysicalPin2 { public static var d1: some I2C0SCLPin { PhysicalPin2() } } -extension I2C0SCLPin where Self == PhysicalPin7 { public static var d5: some I2C0SCLPin { PhysicalPin7() } } -extension I2C0SCLPin where Self == PhysicalPin12 { public static var d9: some I2C0SCLPin { PhysicalPin12() } } -extension I2C0SCLPin where Self == PhysicalPin22 { public static var d17: some I2C0SCLPin { PhysicalPin22() } } -extension I2C0SCLPin where Self == PhysicalPin27 { public static var d21: some I2C0SCLPin { PhysicalPin27() } } - -extension I2C1SDAPin where Self == PhysicalPin4 { public static var d2: some I2C1SDAPin { PhysicalPin4() } } -extension I2C1SDAPin where Self == PhysicalPin9 { public static var d6: some I2C1SDAPin { PhysicalPin9() } } -extension I2C1SDAPin where Self == PhysicalPin14 { public static var d10: some I2C1SDAPin { PhysicalPin14() } } -extension I2C1SDAPin where Self == PhysicalPin19 { public static var d14: some I2C1SDAPin { PhysicalPin19() } } -extension I2C1SDAPin where Self == PhysicalPin24 { public static var d18: some I2C1SDAPin { PhysicalPin24() } } -extension I2C1SDAPin where Self == PhysicalPin31 { public static var d26: some I2C1SDAPin { PhysicalPin31() } } - -extension I2C1SCLPin where Self == PhysicalPin5 { public static var d3: some I2C1SCLPin { PhysicalPin5() } } -extension I2C1SCLPin where Self == PhysicalPin10 { public static var d7: some I2C1SCLPin { PhysicalPin10() } } -extension I2C1SCLPin where Self == PhysicalPin15 { public static var d11: some I2C1SCLPin { PhysicalPin15() } } -extension I2C1SCLPin where Self == PhysicalPin20 { public static var d15: some I2C1SCLPin { PhysicalPin20() } } -extension I2C1SCLPin where Self == PhysicalPin25 { public static var d19: some I2C1SCLPin { PhysicalPin25() } } -extension I2C1SCLPin where Self == PhysicalPin32 { public static var d27: some I2C1SCLPin { PhysicalPin32() } } - -extension UART0TXPin where Self == PhysicalPin1 { public static var d0: some UART0TXPin { PhysicalPin1() } } -extension UART0TXPin where Self == PhysicalPin16 { public static var d12: some UART0TXPin { PhysicalPin16() } } -extension UART0TXPin where Self == PhysicalPin21 { public static var d16: some UART0TXPin { PhysicalPin21() } } - -extension UART0RXPin where Self == PhysicalPin2 { public static var d1: some UART0RXPin { PhysicalPin2() } } -extension UART0RXPin where Self == PhysicalPin17 { public static var d13: some UART0RXPin { PhysicalPin17() } } -extension UART0RXPin where Self == PhysicalPin22 { public static var d17: some UART0RXPin { PhysicalPin22() } } - -extension UART1TXPin where Self == PhysicalPin6 { public static var d4: some UART1TXPin { PhysicalPin6() } } -extension UART1TXPin where Self == PhysicalPin11 { public static var d8: some UART1TXPin { PhysicalPin11() } } - -extension UART1RXPin where Self == PhysicalPin7 { public static var d5: some UART1RXPin { PhysicalPin7() } } -extension UART1RXPin where Self == PhysicalPin12 { public static var d9: some UART1RXPin { PhysicalPin12() } } - -extension AnalogPin where Self == PhysicalPin31 { public static var a0: some AnalogPin { PhysicalPin31() } } -extension AnalogPin where Self == PhysicalPin32 { public static var a1: some AnalogPin { PhysicalPin32() } } -extension AnalogPin where Self == PhysicalPin34 { public static var a3: some AnalogPin { PhysicalPin34() } } - -extension RP2040 { - public struct AnyDigitalPin: DigitalPin { - public var rawValue: UInt32 - - internal init(rawValue: UInt32) { - self.rawValue = rawValue - } - } - - public struct AnyAnalogPin: AnalogPin { - public var rawValue: UInt32 - - internal init(rawValue: UInt32) { - self.rawValue = rawValue - } - } - - public struct AnyI2C0SDAPin: I2C0SDAPin { - public var rawValue: UInt32 - internal init(rawValue: UInt32) { - self.rawValue = rawValue - } - } - - public struct AnyI2C0SCLPin: I2C0SCLPin { - public var rawValue: UInt32 - internal init(rawValue: UInt32) { - self.rawValue = rawValue - } - } - - public struct AnyI2C1SDAPin: I2C1SDAPin { - public var rawValue: UInt32 - internal init(rawValue: UInt32) { - self.rawValue = rawValue - } - } - - public struct AnyI2C1SCLPin: I2C1SCLPin { - public var rawValue: UInt32 - internal init(rawValue: UInt32) { - self.rawValue = rawValue - } - } - - public struct AnySPI0SCKPin: SPI0SCKPin { - public var rawValue: UInt32 - internal init(rawValue: UInt32) { - self.rawValue = rawValue - } - } - - public struct AnySPI0TXPin: SPI0TXPin { - public var rawValue: UInt32 - internal init(rawValue: UInt32) { - self.rawValue = rawValue - } - } - - public struct AnySPI0RXPin: SPI0RXPin { - public var rawValue: UInt32 - internal init(rawValue: UInt32) { - self.rawValue = rawValue - } - } - - public struct AnySPI0CSPin: SPI0CSPin { - public var rawValue: UInt32 - internal init(rawValue: UInt32) { - self.rawValue = rawValue - } - } - - public struct AnySPI1SCKPin: SPI1SCKPin { - public var rawValue: UInt32 - internal init(rawValue: UInt32) { - self.rawValue = rawValue - } - } - - public struct AnySPI1TXPin: SPI1TXPin { - public var rawValue: UInt32 - internal init(rawValue: UInt32) { - self.rawValue = rawValue - } - } - - public struct AnySPI1RXPin: SPI1RXPin { - public var rawValue: UInt32 - internal init(rawValue: UInt32) { - self.rawValue = rawValue - } - } - - public struct AnySPI1CSPin: SPI1CSPin { - public var rawValue: UInt32 - internal init(rawValue: UInt32) { - self.rawValue = rawValue - } - } - - public struct AnyUART0TXPin: UART0TXPin { - public var rawValue: UInt32 - internal init(rawValue: UInt32) { - self.rawValue = rawValue - } - } - - public struct AnyUART0RXPin: UART0RXPin { - public var rawValue: UInt32 - internal init(rawValue: UInt32) { - self.rawValue = rawValue - } - } - - public struct AnyUART1TXPin: UART1TXPin { - public var rawValue: UInt32 - internal init(rawValue: UInt32) { - self.rawValue = rawValue - } - } - - public struct AnyUART1RXPin: UART1RXPin { - public var rawValue: UInt32 - internal init(rawValue: UInt32) { - self.rawValue = rawValue - } - } - - - public func digital(pin: some DigitalPin) -> AnyDigitalPin { - AnyDigitalPin(rawValue: pin.rawValue) - } - - public func analog(pin: some AnalogPin) -> AnyAnalogPin { - AnyAnalogPin(rawValue: pin.rawValue) - } - - public func i2c0(sda pin: some I2C0SDAPin) -> AnyI2C0SDAPin { - AnyI2C0SDAPin(rawValue: pin.rawValue) - } - - public func i2c0(scl pin: some I2C0SCLPin) -> AnyI2C0SCLPin { - AnyI2C0SCLPin(rawValue: pin.rawValue) - } - - public func i2c1(sda pin: some I2C1SDAPin) -> AnyI2C1SDAPin { - AnyI2C1SDAPin(rawValue: pin.rawValue) - } - - public func i2c1SCL(scl pin: some I2C1SCLPin) -> AnyI2C1SCLPin { - AnyI2C1SCLPin(rawValue: pin.rawValue) - } - - public func spi0(sck pin: some SPI0SCKPin) -> AnySPI0SCKPin { - AnySPI0SCKPin(rawValue: pin.rawValue) - } - - public func spi0(tx pin: some SPI0TXPin) -> AnySPI0TXPin { - AnySPI0TXPin(rawValue: pin.rawValue) - } - - public func spi0(rx pin: some SPI0RXPin) -> AnySPI0RXPin { - AnySPI0RXPin(rawValue: pin.rawValue) - } - - public func spi0(cs pin: some SPI0CSPin) -> AnySPI0CSPin { - AnySPI0CSPin(rawValue: pin.rawValue) - } - - public func spi1(sck pin: some SPI1SCKPin) -> AnySPI1SCKPin { - AnySPI1SCKPin(rawValue: pin.rawValue) - } - - public func spi1(tx pin: some SPI1TXPin) -> AnySPI1TXPin { - AnySPI1TXPin(rawValue: pin.rawValue) - } - - public func spi1(rx pin: some SPI1RXPin) -> AnySPI1RXPin { - AnySPI1RXPin(rawValue: pin.rawValue) - } - - public func spi1(cs pin: some SPI1CSPin) -> AnySPI1CSPin { - AnySPI1CSPin(rawValue: pin.rawValue) - } - - public func uart0(tx pin: some UART0TXPin) -> AnyUART0TXPin { - AnyUART0TXPin(rawValue: pin.rawValue) - } - - public func uart0(rx pin: some UART0RXPin) -> AnyUART0RXPin { - AnyUART0RXPin(rawValue: pin.rawValue) - } - - public func uart1(tx pin: some UART1TXPin) -> AnyUART1TXPin { - AnyUART1TXPin(rawValue: pin.rawValue) - } - - public func uart1(rx pin: some UART1RXPin) -> AnyUART1RXPin { - AnyUART1RXPin(rawValue: pin.rawValue) - } -} diff --git a/rpi-pico-blink/Sources/RP2040/HAL/RP2040.swift b/rpi-pico-blink/Sources/RP2040/HAL/RP2040.swift deleted file mode 100644 index 772d6139..00000000 --- a/rpi-pico-blink/Sources/RP2040/HAL/RP2040.swift +++ /dev/null @@ -1,16 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2023 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -public struct RP2040 { - let hardware = RP2040Hardware() - - public init() {} -} diff --git a/rpi-pico-blink/Sources/RP2040/HAL/Time.swift b/rpi-pico-blink/Sources/RP2040/HAL/Time.swift deleted file mode 100644 index 7c1e5766..00000000 --- a/rpi-pico-blink/Sources/RP2040/HAL/Time.swift +++ /dev/null @@ -1,59 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2023 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -import Support - -extension RP2040 { - var now: UInt64 { - var high = hardware.timer.awh - var low: UInt32 - repeat { - low = hardware.timer.awl - let nextHigh = hardware.timer.awh - if high == nextHigh { - break - } - high = nextHigh - } while true - return UInt64(high) << 32 | UInt64(low) - } - - public func sleep(forMicroseconds microseconds: UInt64) { - let start = now - let deadline = start + microseconds - - let highDeadline = UInt32(deadline >> 32) - let lowDeadline = UInt32(deadline & UInt64(UInt32.max)) - var high = hardware.timer.awh - - while high < highDeadline { - high = hardware.timer.awh - } - - while high == highDeadline && hardware.timer.awl < lowDeadline { - high = hardware.timer.awh - } - } - - public func sleep(forMilliseconds milliseconds: Int) { - for _ in 0.. 0 { - sleep(forMicroseconds: UInt64(microseconds)) - } - } -} diff --git a/rpi-pico-blink/Sources/RP2040/Hardware/Clocks.swift b/rpi-pico-blink/Sources/RP2040/Hardware/Clocks.swift deleted file mode 100644 index 9425e645..00000000 --- a/rpi-pico-blink/Sources/RP2040/Hardware/Clocks.swift +++ /dev/null @@ -1,342 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2023 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -// swift-format-ignore-file - -extension RP2040Hardware { - public var clocks: Clocks { - Clocks(unsafeAddress: 0x40008000) - } - - public struct Clocks { - let unsafeAddress: UInt - - init(unsafeAddress: UInt) { - self.unsafeAddress = unsafeAddress - } - - public var reference: Reference { - Reference(unsafeAddress: unsafeAddress) - } - - public struct Reference { - let unsafeAddress: UInt - - init(unsafeAddress: UInt) { - self.unsafeAddress = unsafeAddress - } - - public var control: Control { - Control(unsafeAddress: unsafeAddress + 0x0030) - } - - public struct Control { - let unsafeAddress: UInt - - init(unsafeAddress: UInt) { - self.unsafeAddress = unsafeAddress - } - - public struct Projection { - public enum AuxiliarySource: UInt8 { - case clksrc_pll_usb = 0 - case clksrc_gpin0 = 1 - case clksrc_gpin1 = 2 - - init(decoding value: UInt32) { - self.init(rawValue: UInt8(value))! - } - - var encoded: UInt32 { - UInt32(rawValue) - } - } - - public var auxiliarySource: AuxiliarySource - - public enum Source: UInt8 { - case rosc_clksrc_ph = 0 - case clksrc_clk_ref_aux = 1 - case xosc_clksrc = 2 - - init(decoding value: UInt32) { - self.init(rawValue: UInt8(value))! - } - - var encoded: UInt32 { - UInt32(rawValue) - } - } - - public var source: Source - - init(decoding value: UInt32) { - auxiliarySource = AuxiliarySource(decoding: (value >> 5) & 0x3) - source = Source(decoding: (value >> 0) & 0x3) - } - - var encoded: UInt32 { - var value = UInt32(0) - value |= auxiliarySource.encoded << 5 - value |= source.encoded << 0 - return value - } - } - - public func modify(_ apply: (inout Projection) -> T) -> T { - let value = RP2040Hardware.read(UInt32.self, from: unsafeAddress) - var projection = Projection(decoding: value) - let result = apply(&projection) - RP2040Hardware.write(projection.encoded, to: unsafeAddress) - return result - } - - public func set(_ projection: Projection) { - RP2040Hardware.write(projection.encoded, to: unsafeAddress | RP2040Hardware.setAliasMask) - } - - public var value: Projection { - Projection(decoding: RP2040Hardware.read(UInt32.self, from: unsafeAddress)) - } - - public func clearSource() { - RP2040Hardware.write(UInt32(0x00000001), to: unsafeAddress | RP2040Hardware.clearAliasMask) - } - - public func clearReference() { - RP2040Hardware.write(UInt32(0x00000800), to: unsafeAddress | RP2040Hardware.clearAliasMask) - } - } - - public var divisor: Divisor { - Divisor(unsafeAddress: unsafeAddress + 0x0034) - } - - public struct Divisor { - let unsafeAddress: UInt - - init(unsafeAddress: UInt) { - self.unsafeAddress = unsafeAddress - } - - public struct Projection { - public var integer: UInt32 - - init(decoding value: UInt32) { - integer = (value >> 8) & 0x3 - } - - var encoded: UInt32 { - var value = UInt32(0) - value |= (integer & 0x3) << 8 - return value - } - } - - public func modify(_ apply: (inout Projection) -> T) -> T { - let value = RP2040Hardware.read(UInt32.self, from: unsafeAddress) - var projection = Projection(decoding: value) - let result = apply(&projection) - RP2040Hardware.write(projection.encoded, to: unsafeAddress) - return result - } - - public func setRawValue(_ value: UInt32) { - RP2040Hardware.write(value, to: unsafeAddress) - } - } - - public var selected: Bool { - RP2040Hardware.read(UInt32.self, from: unsafeAddress + 0x0038) != 0 - } - } - - public var system: System { - System(unsafeAddress: unsafeAddress) - } - - public struct System { - let unsafeAddress: UInt - - init(unsafeAddress: UInt) { - self.unsafeAddress = unsafeAddress - } - - public var control: Control { - Control(unsafeAddress: unsafeAddress + 0x003c) - } - - public struct Control { - let unsafeAddress: UInt - - init(unsafeAddress: UInt) { - self.unsafeAddress = unsafeAddress - } - - public struct Projection { - public enum AuxiliarySource: UInt8 { - case clksrc_pll_sys = 0 - case clksrc_pll_usb = 1 - case rosc_clksrc = 2 - case xosc_clksrc = 3 - case clksrc_gpin0 = 4 - case clksrc_gpin1 = 5 - - init(decoding value: UInt32) { - self.init(rawValue: UInt8(value))! - } - - var encoded: UInt32 { - UInt32(rawValue) - } - } - - public var auxiliarySource: AuxiliarySource - - public enum Source: UInt8 { - case clk_ref = 0 - case clksrc_clk_sys_aux = 1 - - init(decoding value: UInt32) { - self.init(rawValue: UInt8(value))! - } - - var encoded: UInt32 { - UInt32(rawValue) - } - } - - public var source: Source - - init(decoding value: UInt32) { - auxiliarySource = AuxiliarySource(decoding: (value >> 5) & 0x7) - source = Source(decoding: (value >> 0) & 0x3) - } - - var encoded: UInt32 { - var value = UInt32(0) - value |= auxiliarySource.encoded << 5 - value |= source.encoded << 0 - return value - } - } - - public func modify(_ apply: (inout Projection) -> T) -> T { - let value = RP2040Hardware.read(UInt32.self, from: unsafeAddress) - var projection = Projection(decoding: value) - let result = apply(&projection) - RP2040Hardware.write(projection.encoded, to: unsafeAddress) - return result - } - - public func set(_ projection: Projection) { - RP2040Hardware.write(projection.encoded, to: unsafeAddress | RP2040Hardware.setAliasMask) - } - - public var value: Projection { - Projection(decoding: RP2040Hardware.read(UInt32.self, from: unsafeAddress)) - } - - public func clearSource() { - RP2040Hardware.write(UInt32(0x00000001), to: unsafeAddress | RP2040Hardware.clearAliasMask) - } - } - - public var divisor: Divisor { - Divisor(unsafeAddress: unsafeAddress + 0x0040) - } - - public struct Divisor { - let unsafeAddress: UInt - - init(unsafeAddress: UInt) { - self.unsafeAddress = unsafeAddress - } - - public struct Projection { - public var integer: UInt32 - public var fraction: UInt32 - - init(decoding value: UInt32) { - integer = (value >> 8) & 0xFFFFFF - fraction = (value >> 0) & 0xFF - } - - var encoded: UInt32 { - var value = UInt32(0) - value |= (integer & 0xFFFFFF) << 8 - value |= (fraction & 0xFF) << 0 - return value - } - } - - public func modify(_ apply: (inout Projection) -> T) -> T { - let value = RP2040Hardware.read(UInt32.self, from: unsafeAddress) - var projection = Projection(decoding: value) - let result = apply(&projection) - RP2040Hardware.write(projection.encoded, to: unsafeAddress) - return result - } - - public func setRawValue(_ value: UInt32) { - RP2040Hardware.write(value, to: unsafeAddress) - } - } - - public var selected: Bool { - RP2040Hardware.read(UInt32.self, from: unsafeAddress + 0x0044) != 0 - } - } - - public var resus: Resus { - Resus(unsafeAddress: unsafeAddress + 0x0038) - } - - public struct Resus { - let unsafeAddress: UInt - - init(unsafeAddress: UInt) { - self.unsafeAddress = unsafeAddress - } - - public struct Projection { - public var clear: Bool - public var force: Bool - public var enable: Bool - public var timeout: UInt8 - - init(decoding value: UInt32) { - clear = (value >> 16) & 0x1 != 0 - force = (value >> 12) & 0x1 != 0 - enable = (value >> 8) & 0x1 != 0 - timeout = UInt8((value >> 0) & 0xFF) - } - - var encoded: UInt32 { - var value = UInt32(0) - value |= clear ? 1 << 16 : 0x0 - value |= force ? 1 << 12 : 0x0 - value |= enable ? 1 << 8 : 0x0 - value |= UInt32(timeout << 0) - return value - } - } - - public func modify(_ apply: (inout Projection) -> T) -> T { - let value = RP2040Hardware.read(UInt32.self, from: unsafeAddress) - var projection = Projection(decoding: value) - let result = apply(&projection) - RP2040Hardware.write(projection.encoded, to: unsafeAddress) - return result - } - } - } -} \ No newline at end of file diff --git a/rpi-pico-blink/Sources/RP2040/Hardware/IOBank.swift b/rpi-pico-blink/Sources/RP2040/Hardware/IOBank.swift deleted file mode 100644 index 6feb7727..00000000 --- a/rpi-pico-blink/Sources/RP2040/Hardware/IOBank.swift +++ /dev/null @@ -1,170 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2023 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -// swift-format-ignore-file - -extension RP2040Hardware { - public var ioBank0: IOBank { - IOBank(unsafeAddress: 0x40014000) - } - - public struct IOBank { - let unsafeAddress: UInt - - init(unsafeAddress: UInt) { - self.unsafeAddress = unsafeAddress - } - - public struct GPIOControlList { - let unsafeAddress: UInt - let startOffset: UInt - let stride: UInt - let count: Int - init(unsafeAddress: UInt, startOffset: UInt, stride: UInt, count: Int) { - self.unsafeAddress = unsafeAddress - self.startOffset = startOffset - self.stride = stride - self.count = count - } - - public subscript(index: UInt32) -> GPIOControl { - precondition(index < count) - let addr = unsafeAddress + UInt(index) * stride + startOffset - return GPIOControl(unsafeAddress: addr) - } - } - - public var gpioControl: GPIOControlList { - GPIOControlList(unsafeAddress: unsafeAddress, startOffset: 0x0004, stride: 0x8, count: 30) - } - - public struct GPIOControl { - let unsafeAddress: UInt - - init(unsafeAddress: UInt) { - self.unsafeAddress = unsafeAddress - } - - public struct Projection { - public enum IRQ: UInt32 { - case normal = 0 - case invert = 1 - case low = 2 - case high = 3 - - init(decoding value: UInt32) { - self.init(rawValue: (value & 0x30000000) >> 28)! - } - - var encoded: UInt32 { - (self.rawValue << 28) & 0x30000000 - } - } - - public enum Input: UInt32 { - case normal = 0 - case inverted = 1 - case low = 2 - case high = 3 - - init(decoding value: UInt32) { - self.init(rawValue: (value & 0x30000) >> 16)! - } - - var encoded: UInt32 { - (self.rawValue << 16) & 0x30000 - } - } - - public enum OutputEnable: UInt32 { - case normal = 0 - case inverted = 1 - case disabled = 2 - case enabled = 3 - - init(decoding value: UInt32) { - self.init(rawValue: (value & 0x3000) >> 12)! - } - - var encoded: UInt32 { - (self.rawValue << 12) & 0x3000 - } - } - - public enum Output: UInt32 { - case normal = 0 - case inverted = 1 - case low = 2 - case high = 3 - - init(decoding value: UInt32) { - self.init(rawValue: (value & 0x300) >> 8)! - } - - var encoded: UInt32 { - (self.rawValue << 8) & 0x300 - } - } - - public enum FuncSel: UInt32 { - case jtagTCK = 0 - case spiRx = 1 - case uart0Tx = 2 - case i20SDA = 3 - case pwmA0 = 4 - case sio0 = 5 - case pio0 = 6 - case pio1 = 7 - case usbMuxingOvercurrentDetect = 9 - case null = 31 - - init(decoding value: UInt32) { - self.init(rawValue: (value & 0x1F) >> 0)! - } - - var encoded: UInt32 { - (self.rawValue << 0) & 0x1F - } - } - - public var irq: IRQ - public var input: Input - public var outputEnable: OutputEnable - public var output: Output - public var functionSelection: FuncSel - - init(decoding value: UInt32) { - irq = IRQ(decoding: value) - input = Input(decoding: value) - outputEnable = OutputEnable(decoding: value) - output = Output(decoding: value) - functionSelection = FuncSel(decoding: value) - } - - var encoded: UInt32 { - irq.encoded | - input.encoded | - outputEnable.encoded | - output.encoded | - functionSelection.encoded - } - } - - public func modify(_ apply: (inout Projection) -> T) -> T { - let value = RP2040Hardware.read(UInt32.self, from: unsafeAddress) - var projection = Projection(decoding: value) - let result = apply(&projection) - RP2040Hardware.write(projection.encoded, to: unsafeAddress) - return result - } - } - } -} diff --git a/rpi-pico-blink/Sources/RP2040/Hardware/PLL.swift b/rpi-pico-blink/Sources/RP2040/Hardware/PLL.swift deleted file mode 100644 index 1b5ba639..00000000 --- a/rpi-pico-blink/Sources/RP2040/Hardware/PLL.swift +++ /dev/null @@ -1,87 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2023 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -// swift-format-ignore-file - -extension RP2040Hardware { - public var pllSystem: PLL { - PLL(unsafeAddress: 0x40028000) - } - - public var pllUSB: PLL { - PLL(unsafeAddress: 0xe0000000) - } - - public struct PLL { - let unsafeAddress: UInt - - init(unsafeAddress: UInt) { - self.unsafeAddress = unsafeAddress - } - - public var status: Status { - Status(unsafeAddress: unsafeAddress + 0x0000) - } - - public struct Status { - let unsafeAddress: UInt - - init(unsafeAddress: UInt) { - self.unsafeAddress = unsafeAddress - } - - public struct Projection { - public let locked: Bool - public var bypass: Bool - public var referenceDivide: UInt8 - - init(decoding value: UInt32) { - locked = (value >> 31) & 0x1 != 0 - bypass = (value >> 8) & 0x1 != 0 - referenceDivide = UInt8((value >> 0) & 0x3F) - } - - var encoded: UInt32 { - var value = UInt32(0) - value |= locked ? 1 << 31 : 0x0 - value |= bypass ? 1 << 8 : 0x0 - value |= UInt32(referenceDivide & 0x3F) << 0 - return value - } - } - - public func modify(_ apply: (inout Projection) -> T) -> T { - let value = RP2040Hardware.read(UInt32.self, from: unsafeAddress) - var projection = Projection(decoding: value) - let result = apply(&projection) - RP2040Hardware.write(projection.encoded, to: unsafeAddress | RP2040Hardware.setAliasMask) - return result - } - - public var value: Projection { - let value = RP2040Hardware.read(UInt32.self, from: unsafeAddress) - return Projection(decoding: value) - } - } - - public var power: Power { - Power(unsafeAddress: unsafeAddress + 0x0004) - } - - public struct Power { - let unsafeAddress: UInt - - init(unsafeAddress: UInt) { - self.unsafeAddress = unsafeAddress - } - } - } -} diff --git a/rpi-pico-blink/Sources/RP2040/Hardware/PPB.swift b/rpi-pico-blink/Sources/RP2040/Hardware/PPB.swift deleted file mode 100644 index 0e69e986..00000000 --- a/rpi-pico-blink/Sources/RP2040/Hardware/PPB.swift +++ /dev/null @@ -1,71 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2023 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -// swift-format-ignore-file - -extension RP2040Hardware { - public var ppb: PPB { - PPB(unsafeAddress: 0xe0000000) - } - - public struct PPB { - let unsafeAddress: UInt - - init(unsafeAddress: UInt) { - self.unsafeAddress = unsafeAddress - } - - public var cpuID: CPUID { - CPUID(unsafeAddress: unsafeAddress + 0xed00) - } - - public struct CPUID { - let unsafeAddress: UInt - - init(unsafeAddress: UInt) { - self.unsafeAddress = unsafeAddress - } - } - - public var icsr: ICSR { - ICSR(unsafeAddress: unsafeAddress + 0xed04) - } - - public struct ICSR { - let unsafeAddress: UInt - - init(unsafeAddress: UInt) { - self.unsafeAddress = unsafeAddress - } - } - - public var vtor: VTOR { - VTOR(unsafeAddress: unsafeAddress + 0xed08) - } - - public struct VTOR { - let unsafeAddress: UInt - - init(unsafeAddress: UInt) { - self.unsafeAddress = unsafeAddress - } - - public var tableOffset: UInt32 { - get { - RP2040Hardware.read(UInt32.self, from: unsafeAddress) - } - nonmutating set { - RP2040Hardware.write(newValue & 0xffffff00, to: unsafeAddress) - } - } - } - } -} \ No newline at end of file diff --git a/rpi-pico-blink/Sources/RP2040/Hardware/PadsBank.swift b/rpi-pico-blink/Sources/RP2040/Hardware/PadsBank.swift deleted file mode 100644 index 74943258..00000000 --- a/rpi-pico-blink/Sources/RP2040/Hardware/PadsBank.swift +++ /dev/null @@ -1,307 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2023 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -// swift-format-ignore-file - -extension RP2040Hardware { - public var padsBank0: PadsBank { - PadsBank(unsafeAddress: 0x4001c000) - } - - public struct PadsBank { - let unsafeAddress: UInt - - init(unsafeAddress: UInt) { - self.unsafeAddress = unsafeAddress - } - - public var voltageSelect: VoltageSelect { - VoltageSelect(unsafeAddress: unsafeAddress + 0x0000) - } - - public struct VoltageSelect { - let unsafeAddress: UInt - - init(unsafeAddress: UInt) { - self.unsafeAddress = unsafeAddress - } - - public enum Value: UInt8 { - case voltage3_3 = 0 - case voltage1_8 = 1 - - init(decoding value: UInt32) { - self.init(rawValue: UInt8(value & (1 << 0)))! - } - - var encoded: UInt32 { - UInt32(self.rawValue) - } - } - - public var value: Value { - get { - Value(decoding: RP2040Hardware.read(UInt32.self, from: unsafeAddress)) - } - set { - RP2040Hardware.write(newValue.encoded, to: unsafeAddress) - } - } - } - - public struct GPIOList { - let unsafeAddress: UInt - let startOffset: UInt - let stride: UInt - let count: Int - init(unsafeAddress: UInt, startOffset: UInt, stride: UInt, count: Int) { - self.unsafeAddress = unsafeAddress - self.startOffset = startOffset - self.stride = stride - self.count = count - } - - public subscript(index: UInt32) -> GPIO { - precondition(index < count) - let addr = unsafeAddress + UInt(index) * stride + startOffset - return GPIO(unsafeAddress: addr) - } - } - - public var gpio: GPIOList { - GPIOList(unsafeAddress: unsafeAddress, startOffset: 0x4, stride: 0x4, count: 30) - } - - public struct GPIO { - let unsafeAddress: UInt - - init(unsafeAddress: UInt) { - self.unsafeAddress = unsafeAddress - } - - public struct Projection { - public enum DriveStrength: UInt32 { - case level2mA = 0 - case level4mA = 1 - case level8mA = 2 - case level12mA = 3 - - init(decoding value: UInt32) { - self.init(rawValue: (value & 0x30) >> 4)! - } - - var encoded: UInt32 { - (self.rawValue << 4) & 0x30 - } - } - public enum SlewRateControl: UInt32 { - case slow = 0 - case fast = 1 - - init(decoding value: UInt32) { - self.init(rawValue: (value & 0x1) >> 0)! - } - - var encoded: UInt32 { - (self.rawValue << 0) & 0x1 - } - } - public var outputDisable: Bool - public var inputEnable: Bool - public var driveStrength: DriveStrength - public var pullUpEnable: Bool - public var pullDownEnable: Bool - public var schmittTriggerEnable: Bool - public var slewRateControl: SlewRateControl - - init(decoding value: UInt32) { - outputDisable = value & (1 << 7) != 0 - inputEnable = value & (1 << 6) != 0 - driveStrength = DriveStrength(decoding: value) - pullUpEnable = value & (1 << 3) != 0 - pullDownEnable = value & (1 << 2) != 0 - schmittTriggerEnable = value & (1 << 1) != 0 - slewRateControl = SlewRateControl(decoding: value) - } - - var encoded: UInt32 { - (outputDisable ? 1 << 7 : 0x0) | - (inputEnable ? 1 << 6 : 0x0) | - driveStrength.encoded | - (pullUpEnable ? 1 << 3 : 0x0) | - (pullDownEnable ? 1 << 2 : 0x0) | - (schmittTriggerEnable ? 1 << 1 : 0x0) | - slewRateControl.encoded - } - } - - public func modify(_ apply: (inout Projection) -> T) -> T { - let value = RP2040Hardware.read(UInt32.self, from: unsafeAddress) - var projection = Projection(decoding: value) - let result = apply(&projection) - RP2040Hardware.write(projection.encoded, to: unsafeAddress) - return result - } - } - - public var swclk: SWCLK { - SWCLK(unsafeAddress: unsafeAddress + 0x000000da) - } - - public struct SWCLK { - let unsafeAddress: UInt - - init(unsafeAddress: UInt) { - self.unsafeAddress = unsafeAddress - } - - public struct Projection { - public enum DriveStrength: UInt32 { - case level2mA = 0 - case level4mA = 1 - case level8mA = 2 - case level12mA = 3 - - init(decoding value: UInt32) { - self.init(rawValue: (value & 0x30) >> 4)! - } - - var encoded: UInt32 { - (self.rawValue << 4) & 0x30 - } - } - public enum SlewRateControl: UInt32 { - case slow = 0 - case fast = 1 - - init(decoding value: UInt32) { - self.init(rawValue: (value & 0x1) >> 0)! - } - - var encoded: UInt32 { - (self.rawValue << 0) & 0x1 - } - } - public var outputDisable: Bool - public var inputEnable: Bool - public var driveStrength: DriveStrength - public var pullUpEnable: Bool - public var pullDownEnable: Bool - public var schmittTriggerEnable: Bool - public var slewRateControl: SlewRateControl - - init(decoding value: UInt32) { - outputDisable = value & (1 << 7) != 0 - inputEnable = value & (1 << 6) != 0 - driveStrength = DriveStrength(decoding: value) - pullUpEnable = value & (1 << 3) != 0 - pullDownEnable = value & (1 << 2) != 0 - schmittTriggerEnable = value & (1 << 1) != 0 - slewRateControl = SlewRateControl(decoding: value) - } - - var encoded: UInt32 { - (outputDisable ? 1 << 7 : 0x0) | - (inputEnable ? 1 << 6 : 0x0) | - driveStrength.encoded | - (pullUpEnable ? 1 << 3 : 0x0) | - (pullDownEnable ? 1 << 2 : 0x0) | - (schmittTriggerEnable ? 1 << 1 : 0x0) | - slewRateControl.encoded - } - } - - public func modify(_ apply: (inout Projection) -> T) -> T { - let value = RP2040Hardware.read(UInt32.self, from: unsafeAddress) - var projection = Projection(decoding: value) - let result = apply(&projection) - RP2040Hardware.write(projection.encoded, to: unsafeAddress) - return result - } - } - - public var swd: SWD { - SWD(unsafeAddress: unsafeAddress + 0x000000da) - } - - public struct SWD { - let unsafeAddress: UInt - - init(unsafeAddress: UInt) { - self.unsafeAddress = unsafeAddress - } - - public struct Projection { - public enum DriveStrength: UInt32 { - case level2mA = 0 - case level4mA = 1 - case level8mA = 2 - case level12mA = 3 - - init(decoding value: UInt32) { - self.init(rawValue: (value & 0x30) >> 4)! - } - - var encoded: UInt32 { - (self.rawValue << 4) & 0x30 - } - } - public enum SlewRateControl: UInt32 { - case slow = 0 - case fast = 1 - - init(decoding value: UInt32) { - self.init(rawValue: (value & 0x1) >> 0)! - } - - var encoded: UInt32 { - (self.rawValue << 0) & 0x1 - } - } - public var outputDisable: Bool - public var inputEnable: Bool - public var driveStrength: DriveStrength - public var pullUpEnable: Bool - public var pullDownEnable: Bool - public var schmittTriggerEnable: Bool - public var slewRateControl: SlewRateControl - - init(decoding value: UInt32) { - outputDisable = value & (1 << 7) != 0 - inputEnable = value & (1 << 6) != 0 - driveStrength = DriveStrength(decoding: value) - pullUpEnable = value & (1 << 3) != 0 - pullDownEnable = value & (1 << 2) != 0 - schmittTriggerEnable = value & (1 << 1) != 0 - slewRateControl = SlewRateControl(decoding: value) - } - - var encoded: UInt32 { - (outputDisable ? 1 << 7 : 0x0) | - (inputEnable ? 1 << 6 : 0x0) | - driveStrength.encoded | - (pullUpEnable ? 1 << 3 : 0x0) | - (pullDownEnable ? 1 << 2 : 0x0) | - (schmittTriggerEnable ? 1 << 1 : 0x0) | - slewRateControl.encoded - } - } - - public func modify(_ apply: (inout Projection) -> T) -> T { - let value = RP2040Hardware.read(UInt32.self, from: unsafeAddress) - var projection = Projection(decoding: value) - let result = apply(&projection) - RP2040Hardware.write(projection.encoded, to: unsafeAddress | RP2040Hardware.setAliasMask) - return result - } - } - } -} \ No newline at end of file diff --git a/rpi-pico-blink/Sources/RP2040/Hardware/RP2040Hardware.swift b/rpi-pico-blink/Sources/RP2040/Hardware/RP2040Hardware.swift deleted file mode 100644 index fc7061ba..00000000 --- a/rpi-pico-blink/Sources/RP2040/Hardware/RP2040Hardware.swift +++ /dev/null @@ -1,229 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2023 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -import Support - -public struct RP2040Hardware { - static var readWriteAliasMask: UInt { 0 << 12 } - static var xorAliasMask: UInt { 1 << 12 } - static var setAliasMask: UInt { 2 << 12 } - static var clearAliasMask: UInt { 3 << 12 } - - static var initialized = false - - public static var systemClockHz = UInt32(0) - public static var referenceClockHz = UInt32(0) - - public init() { - if !RP2040Hardware.initialized { - RP2040Hardware.initialized = true - resets.reset.set([ - .uart1, - .uart0, - .timer, - .tbman, - .sysinfo, - .spi1, - .spi0, - .rtc, - .pwm, - .pio1, - .pio0, - .pads_bank0, - .jtag, - .io_bank0, - .i2c1, - .i2c0, - .dma, - .busctrl, - .adc, - ]) - var value = Resets.ResetValue.all - value.remove([ - .adc, - .rtc, - .spi0, - .spi1, - .uart0, - .uart1, - .usbctrl, - ]) - resets.reset.clear(value) - - while !resets.resetDone.value.contains(value) {} - - initializeClocks() - - resets.reset.clear(.all) - padsBank0.gpio[26].modify { $0.inputEnable = false } - padsBank0.gpio[27].modify { $0.inputEnable = false } - padsBank0.gpio[28].modify { $0.inputEnable = false } - padsBank0.gpio[29].modify { $0.inputEnable = false } - } - - func initialize( - _ pll: PLL, vcoFrequency: UInt32, postDivisor1: UInt32, - postDivisor2: UInt32 - ) { - let referenceFrequency = UInt32(12000 * 1000) - - let fbdiv = vcoFrequency / referenceFrequency - - let pdiv = postDivisor1 << 16 | postDivisor2 << 12 - - let resetTarget: Resets.ResetValue = - pll.unsafeAddress == pllUSB.unsafeAddress ? .pll_usb : .pll_sys - resets.reset.set(resetTarget) - resets.reset.clear(resetTarget) - while !resets.resetDone.value.contains(resetTarget) {} - } - - func initializeClocks() { - let xoscKHz = UInt16(12000) - let usbClockKHz = UInt16(48000) - let systemClockKHz = UInt32(125000) - // this is technically hardware dependent (e.g. the adafruit feather has - // 64 here) - let multiplier = UInt16(1) - let freq1KHz = UInt16(1000) - - watchdog.tick.modify { - $0.cycles = xoscKHz / freq1KHz - $0.enabled = true - } - - clocks.resus.modify { - $0.clear = false - $0.force = false - $0.enable = false - $0.timeout = 0 - } - - while !xosc.status.value.stable {} - - clocks.system.control.clearSource() - while !clocks.system.selected {} - - clocks.reference.control.clearSource() - while !clocks.reference.selected {} - - initialize( - pllSystem, vcoFrequency: 1500 * 1000 * 1000, postDivisor1: 6, - postDivisor2: 2) - initialize( - pllUSB, vcoFrequency: 1200 * 1000 * 1000, postDivisor1: 5, - postDivisor2: 5) - - RP2040Hardware.referenceClockHz = clocks.reference.configure( - UInt32(xoscKHz) * UInt32(freq1KHz), UInt32(xoscKHz) * UInt32(freq1KHz)) - RP2040Hardware.systemClockHz = clocks.system.configure( - systemClockKHz * UInt32(freq1KHz), systemClockKHz * UInt32(freq1KHz)) - } - } - - static func read( - _ type: Bool.Type, from unsafeAddress: UInt, offset: UInt = 0, - bitMask: UInt32 = 0x0000_0001 - ) -> Bool { - read(UInt8.self, from: unsafeAddress, offset: offset, bitMask: bitMask) != 0 - } - - static func write(_ newValue: Bool, to unsafeAddress: UInt, offset: UInt = 0) - { - write(newValue ? UInt8(0x1) : UInt8(0x0), to: unsafeAddress, offset: offset) - } - - static func read( - _ type: UInt8.Type, from unsafeAddress: UInt, offset: UInt = 0, - bitMask: UInt32 = 0x0000_00FF - ) -> UInt8 { - // swift-format-ignore: NeverForceUnwrap - UInt8( - volatile_load_uint32_t( - UnsafeMutablePointer(bitPattern: unsafeAddress + offset)!) - & bitMask) - } - - static func write( - _ newValue: UInt8, to unsafeAddress: UInt, offset: UInt = 0, - bitMask: UInt32 = 0x0000_00FF - ) { - // swift-format-ignore: NeverForceUnwrap - volatile_store_uint32_t( - UnsafeMutablePointer(bitPattern: unsafeAddress + offset)!, - UInt32(newValue) & bitMask) - } - - static func read( - _ type: UInt16.Type, from unsafeAddress: UInt, offset: UInt = 0, - bitMask: UInt32 = 0x0000_FFFF - ) -> UInt16 { - // swift-format-ignore: NeverForceUnwrap - UInt16( - volatile_load_uint32_t( - UnsafeMutablePointer(bitPattern: unsafeAddress + offset)!) - & bitMask) - } - - static func write( - _ newValue: UInt16, to unsafeAddress: UInt, offset: UInt = 0 - ) { - // swift-format-ignore: NeverForceUnwrap - volatile_store_uint32_t( - UnsafeMutablePointer(bitPattern: unsafeAddress + offset)!, - UInt32(newValue)) - } - - static func read( - _ type: UInt32.Type, from unsafeAddress: UInt, offset: UInt = 0 - ) -> UInt32 { - // swift-format-ignore: NeverForceUnwrap - volatile_load_uint32_t( - UnsafeMutablePointer(bitPattern: unsafeAddress + offset)!) - } - - static func write( - _ newValue: UInt32, to unsafeAddress: UInt, offset: UInt = 0 - ) { - // swift-format-ignore: NeverForceUnwrap - volatile_store_uint32_t( - UnsafeMutablePointer(bitPattern: unsafeAddress + offset)!, - newValue) - } -} - -extension RP2040Hardware.Clocks.Reference { - func configure(_ sourceFrequency: UInt32, _ frequency: UInt32) -> UInt32 { - precondition(sourceFrequency >= frequency) - let div = UInt32((UInt64(sourceFrequency) << 8) / UInt64(frequency)) - control.clearReference() - control.modify { - $0.source = .xosc_clksrc - } - divisor.setRawValue(div) - return UInt32((UInt64(sourceFrequency) << 8) / UInt64(div)) - } -} - -extension RP2040Hardware.Clocks.System { - func configure(_ sourceFrequency: UInt32, _ frequency: UInt32) -> UInt32 { - precondition(sourceFrequency >= frequency) - let div = UInt32((UInt64(sourceFrequency) << 8) / UInt64(frequency)) - control.clearSource() - while !selected {} - control.modify { - $0.source = .clksrc_clk_sys_aux - $0.auxiliarySource = .xosc_clksrc - } - divisor.setRawValue(div) - return UInt32((UInt64(sourceFrequency) << 8) / UInt64(div)) - } -} diff --git a/rpi-pico-blink/Sources/RP2040/Hardware/Resets.swift b/rpi-pico-blink/Sources/RP2040/Hardware/Resets.swift deleted file mode 100644 index 9e36d666..00000000 --- a/rpi-pico-blink/Sources/RP2040/Hardware/Resets.swift +++ /dev/null @@ -1,142 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2023 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -// swift-format-ignore-file - -extension RP2040Hardware { - public var resets: Resets { - Resets(unsafeAddress: 0x4000c000) - } - - public struct Resets { - public struct ResetValue: OptionSet { - public var rawValue: UInt32 - - public init(rawValue: UInt32) { - self.rawValue = rawValue - } - - public init() { - self.init(rawValue: 0x0) - } - - public static var usbctrl: ResetValue { ResetValue(rawValue: 0x01000000) } - public static var uart1: ResetValue { ResetValue(rawValue: 0x00800000) } - public static var uart0: ResetValue { ResetValue(rawValue: 0x00400000) } - public static var timer: ResetValue { ResetValue(rawValue: 0x00200000) } - public static var tbman: ResetValue { ResetValue(rawValue: 0x00100000) } - public static var sysinfo: ResetValue { ResetValue(rawValue: 0x00080000) } - public static var syscfg: ResetValue { ResetValue(rawValue: 0x00040000) } - public static var spi1: ResetValue { ResetValue(rawValue: 0x00020000) } - public static var spi0: ResetValue { ResetValue(rawValue: 0x00010000) } - public static var rtc: ResetValue { ResetValue(rawValue: 0x00008000) } - public static var pwm: ResetValue { ResetValue(rawValue: 0x00004000) } - public static var pll_usb: ResetValue { ResetValue(rawValue: 0x00002000) } - public static var pll_sys: ResetValue { ResetValue(rawValue: 0x00001000) } - public static var pio1: ResetValue { ResetValue(rawValue: 0x00000800) } - public static var pio0: ResetValue { ResetValue(rawValue: 0x00000400) } - public static var pads_qspi: ResetValue { ResetValue(rawValue: 0x00000200) } - public static var pads_bank0: ResetValue { ResetValue(rawValue: 0x00000100) } - public static var jtag: ResetValue { ResetValue(rawValue: 0x00000080) } - public static var io_qspi: ResetValue { ResetValue(rawValue: 0x00000040) } - public static var io_bank0: ResetValue { ResetValue(rawValue: 0x00000020) } - public static var i2c1: ResetValue { ResetValue(rawValue: 0x00000010) } - public static var i2c0: ResetValue { ResetValue(rawValue: 0x00000008) } - public static var dma: ResetValue { ResetValue(rawValue: 0x00000004) } - public static var busctrl: ResetValue { ResetValue(rawValue: 0x00000002) } - public static var adc: ResetValue { ResetValue(rawValue: 0x00000001) } - - public static var all: ResetValue { - return [ - .usbctrl, - .uart1, - .uart0, - .timer, - .tbman, - .sysinfo, - .syscfg, - .spi1, - .spi0, - .rtc, - .pwm, - .pll_usb, - .pll_sys, - .pio1, - .pio0, - .pads_qspi, - .pads_bank0, - .jtag, - .io_qspi, - .io_bank0, - .i2c1, - .i2c0, - .dma, - .busctrl, - .adc - ] - } - } - - let unsafeAddress: UInt - - init(unsafeAddress: UInt) { - self.unsafeAddress = unsafeAddress - } - - public var reset: Reset { - Reset(unsafeAddress: unsafeAddress + 0x0000) - } - - public var watchdogSelect: WatchdogSelect { - WatchdogSelect(unsafeAddress: unsafeAddress + 0x0004) - } - - public var resetDone: ResetDone { - ResetDone(unsafeAddress: unsafeAddress + 0x0008) - } - - public struct Reset { - let unsafeAddress: UInt - - init(unsafeAddress: UInt) { - self.unsafeAddress = unsafeAddress - } - - public func set(_ value: ResetValue) { - RP2040Hardware.write(value.rawValue, to: unsafeAddress | RP2040Hardware.setAliasMask) - } - - public func clear(_ value: ResetValue) { - RP2040Hardware.write(value.rawValue, to: unsafeAddress | RP2040Hardware.clearAliasMask) - } - } - - public struct WatchdogSelect { - let unsafeAddress: UInt - - init(unsafeAddress: UInt) { - self.unsafeAddress = unsafeAddress - } - } - - public struct ResetDone { - let unsafeAddress: UInt - - init(unsafeAddress: UInt) { - self.unsafeAddress = unsafeAddress - } - - public var value: ResetValue { - ResetValue(rawValue: RP2040Hardware.read(UInt32.self, from: unsafeAddress)) - } - } - } -} \ No newline at end of file diff --git a/rpi-pico-blink/Sources/RP2040/Hardware/SIO.swift b/rpi-pico-blink/Sources/RP2040/Hardware/SIO.swift deleted file mode 100644 index a2ac0a00..00000000 --- a/rpi-pico-blink/Sources/RP2040/Hardware/SIO.swift +++ /dev/null @@ -1,42 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2023 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -// swift-format-ignore-file - -extension RP2040Hardware { - public var sio: SIO { - SIO(unsafeAddress: 0xd0000000) - } - - public struct SIO { - let unsafeAddress: UInt - - init(unsafeAddress: UInt) { - self.unsafeAddress = unsafeAddress - } - - public func setOutput(_ bits: UInt32) { - RP2040Hardware.write(bits & 0x3FFFFFFF, to: unsafeAddress, offset: 0x0014) - } - - public func clearOutput(_ bits: UInt32) { - RP2040Hardware.write(bits & 0x3FFFFFFF, to: unsafeAddress, offset: 0x0018) - } - - public func enableOutput(_ bits: UInt32) { - RP2040Hardware.write(bits & 0x3FFFFFFF, to: unsafeAddress, offset: 0x0024) - } - - public func disableOutput(_ bits: UInt32) { - RP2040Hardware.write(bits & 0x3FFFFFFF, to: unsafeAddress, offset: 0x0028) - } - } -} \ No newline at end of file diff --git a/rpi-pico-blink/Sources/RP2040/Hardware/Timer.swift b/rpi-pico-blink/Sources/RP2040/Hardware/Timer.swift deleted file mode 100644 index 7ce6d2b6..00000000 --- a/rpi-pico-blink/Sources/RP2040/Hardware/Timer.swift +++ /dev/null @@ -1,34 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2023 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -// swift-format-ignore-file - -extension RP2040Hardware { - public var timer: Timer { - Timer(unsafeAddress: 0x40054000) - } - - public struct Timer { - let unsafeAddress: UInt - - init(unsafeAddress: UInt) { - self.unsafeAddress = unsafeAddress - } - - public var awh: UInt32 { - RP2040Hardware.read(UInt32.self, from: unsafeAddress, offset: 0x0024) - } - - public var awl: UInt32 { - RP2040Hardware.read(UInt32.self, from: unsafeAddress, offset: 0x0028) - } - } -} \ No newline at end of file diff --git a/rpi-pico-blink/Sources/RP2040/Hardware/Watchdog.swift b/rpi-pico-blink/Sources/RP2040/Hardware/Watchdog.swift deleted file mode 100644 index 567fa750..00000000 --- a/rpi-pico-blink/Sources/RP2040/Hardware/Watchdog.swift +++ /dev/null @@ -1,67 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2023 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -// swift-format-ignore-file - -extension RP2040Hardware { - public var watchdog: Watchdog { - Watchdog(unsafeAddress: 0x40058000) - } - - public struct Watchdog { - let unsafeAddress: UInt - - init(unsafeAddress: UInt) { - self.unsafeAddress = unsafeAddress - } - - public var tick: Tick { - Tick(unsafeAddress: unsafeAddress + 0x002c) - } - - public struct Tick { - let unsafeAddress: UInt - - init(unsafeAddress: UInt) { - self.unsafeAddress = unsafeAddress - } - - public struct Projection { - public var count: UInt16 - public var running: Bool - public var enabled: Bool - public var cycles: UInt16 - - init(decoding value: UInt32) { - count = UInt16((value & 0xFF800) >> 11) - running = value & (1 << 10) != 0 - enabled = value & (1 << 9) != 0 - cycles = UInt16((value & 0x1FF) >> 0) - } - - var encoded: UInt32 { - UInt32(count & 0x1FF) << 11 | - (running ? 1 << 10 : 0x0) | - (enabled ? 1 << 9 : 0x0) | - UInt32(cycles & 0x1FF) << 0 - } - } - - public func modify(_ apply: (inout Projection) -> T) -> T { - let value = RP2040Hardware.read(UInt32.self, from: unsafeAddress) - var projection = Projection(decoding: value) - let result = apply(&projection) - RP2040Hardware.write(projection.encoded, to: unsafeAddress) - return result - } - } - } -} \ No newline at end of file diff --git a/rpi-pico-blink/Sources/RP2040/Hardware/XOSC.swift b/rpi-pico-blink/Sources/RP2040/Hardware/XOSC.swift deleted file mode 100644 index 495cc6ae..00000000 --- a/rpi-pico-blink/Sources/RP2040/Hardware/XOSC.swift +++ /dev/null @@ -1,206 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2023 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -// swift-format-ignore-file - -import Support - -extension RP2040Hardware { - public var xosc: XOSC { - XOSC(unsafeAddress: 0x40024000) - } - - public struct XOSC { - let unsafeAddress: UInt - - init(unsafeAddress: UInt) { - self.unsafeAddress = unsafeAddress - } - - public var control: Control { - Control(unsafeAddress: unsafeAddress + 0x0000) - } - - public struct Control { - let unsafeAddress: UInt - - init(unsafeAddress: UInt) { - self.unsafeAddress = unsafeAddress - } - - public struct Projection { - public enum Enable: UInt32 { - case enabled = 4011 - case disabled = 3358 - - init?(decoding value: UInt32) { - self.init(rawValue: value) - } - - var encoded: UInt32 { - self.rawValue - } - } - - public var enable: Enable? - - public enum FrequencyRange: UInt32 { - case oneToFifteenMHz = 0xaa0 - case reserved1 = 0xaa1 - case reserved2 = 0xaa2 - case reserved3 = 0xaa3 - case unknown = 0xfa5 // somehow this is a value? - - init(decoding value: UInt32) { - self.init(rawValue: value)! - } - - var encoded: UInt32 { - self.rawValue - } - } - - public var frequencyRange: FrequencyRange - - init(decoding value: UInt32) { - enable = Enable(decoding: (value >> 12) & 0xFFF) - frequencyRange = FrequencyRange(decoding: (value >> 0) & 0xFFF) - } - - var encoded: UInt32 { - var value = UInt32(0) - if let enable { - value |= enable.encoded << 12 - } - value |= frequencyRange.encoded << 0 - return value - } - } - - public func modify(_ apply: (inout Projection) -> T) -> T { - let value = RP2040Hardware.read(UInt32.self, from: unsafeAddress) - var projection = Projection(decoding: value) - let result = apply(&projection) - RP2040Hardware.write(projection.encoded, to: unsafeAddress) - return result - } - - public func set(_ apply: (inout Projection) -> T) -> T { - let value = RP2040Hardware.read(UInt32.self, from: unsafeAddress) - var projection = Projection(decoding: value) - let result = apply(&projection) - RP2040Hardware.write(projection.encoded, to: unsafeAddress | RP2040Hardware.setAliasMask) - return result - } - } - - public var status: Status { - Status(unsafeAddress: unsafeAddress + 0x0004) - } - - public struct Status { - let unsafeAddress: UInt - - init(unsafeAddress: UInt) { - self.unsafeAddress = unsafeAddress - } - - public struct Projection { - public let stable: Bool - public var clearBadWrite: Bool - public let enabled: Bool - - public enum FrequencyRange: UInt32 { - case oneToFifteenMHz = 0 - case reserved1 = 1 - case reserved2 = 2 - case reserved3 = 3 - - init(decoding value: UInt32) { - self.init(rawValue: value)! - } - - var encoded: UInt32 { - self.rawValue - } - } - - public let frequencyRange: FrequencyRange - - init(decoding value: UInt32) { - stable = (value >> 31) & 0x1 != 0 - clearBadWrite = (value >> 24) & 0x1 != 0 - enabled = (value >> 12) & 0x1 != 0 - frequencyRange = FrequencyRange(decoding: (value >> 0) & 0x3) - } - - var encoded: UInt32 { - var value = UInt32(0) - value |= stable ? 1 << 31 : 0x0 - value |= clearBadWrite ? 1 << 24 : 0x0 - value |= enabled ? 1 << 12 : 0x0 - value |= frequencyRange.rawValue << 0 - return value - } - } - - public var value: Projection { - Projection(decoding: RP2040Hardware.read(UInt32.self, from: unsafeAddress)) - } - } - - public var dormant: UInt32 { - get { - RP2040Hardware.read(UInt32.self, from: unsafeAddress, offset: 0x0008) - } - set { - RP2040Hardware.write(newValue, to: unsafeAddress, offset: 0x0008) - } - } - - public var startup: Startup { - Startup(unsafeAddress: unsafeAddress + 0x000c) - } - - public struct Startup { - let unsafeAddress: UInt - - init(unsafeAddress: UInt) { - self.unsafeAddress = unsafeAddress - } - - public struct Projection { - public var x4: Bool - public var delay: UInt16 - - init(decoding value: UInt32) { - x4 = (value >> 20) & 0x1 != 0 - delay = UInt16((value >> 0) & 0x3FFF) - } - - var encoded: UInt32 { - var value = UInt32(0) - value |= x4 ? 1 << 20 : 0x0 - value |= UInt32(delay) << 0 - return value - } - } - - public func modify(_ apply: (inout Projection) -> T) -> T { - let value = RP2040Hardware.read(UInt32.self, from: unsafeAddress) - var projection = Projection(decoding: value) - let result = apply(&projection) - RP2040Hardware.write(projection.encoded, to: unsafeAddress | RP2040Hardware.setAliasMask) - return result - } - } - } -} \ No newline at end of file diff --git a/rpi-pico-blink/Sources/Support/Support.c b/rpi-pico-blink/Sources/Support/Support.c deleted file mode 100644 index 0ca75471..00000000 --- a/rpi-pico-blink/Sources/Support/Support.c +++ /dev/null @@ -1,41 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2023 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -#include -#include -#include - -#include "Support.h" - -extern int main(int argc, char *argv[]); - -void reset(void) { - int exit_code = main(0, NULL); - __builtin_trap(); -} - -void interrupt(void) { - while (1) {} -} - -__attribute((section("__DATA,stack"), aligned(32))) -char stack[0x800]; - -__attribute((used)) __attribute((section("__VECTORS,vectors"))) -void *vector_table[48] = { - (void *)(&stack[sizeof(stack)]), // initial SP - reset, // Reset - - interrupt, // NMI - interrupt, // HardFault - - 0 // NULL for all the other handlers -}; diff --git a/rpi-pico-blink/Sources/Support/crt0.S b/rpi-pico-blink/Sources/Support/crt0.S deleted file mode 100644 index 08456306..00000000 --- a/rpi-pico-blink/Sources/Support/crt0.S +++ /dev/null @@ -1,31 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2023 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - - .syntax unified - .thumb - .section __RESET,reset - .thumb_func - .global _entry_point - -_entry_point: - // Set VTOR (offset 0xed08 in Cortex-M0+ registers) to point to the vector table - ldr r0, =_vector_table - ldr r1, =(0xe0000000 + 0x0000ed08) - str r0, [r1] - - // Load the first two entries of the vector table, (1) r1 = initial SP, (2) r2 = reset function - ldmia r0!, {r1, r2} - - // Set stack pointer - msr msp, r1 - - // Transfer to reset function - bx r2 diff --git a/rpi-pico-blink/Sources/Support/include/Support.h b/rpi-pico-blink/Sources/Support/include/Support.h deleted file mode 100644 index 4b5e60ae..00000000 --- a/rpi-pico-blink/Sources/Support/include/Support.h +++ /dev/null @@ -1,44 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2023 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -#pragma once - -#include - -#define VOLATILE_LOAD(type) \ - __attribute__((always_inline)) \ - static type volatile_load_##type(const volatile type * _Nonnull pointer) { return *pointer; } - -VOLATILE_LOAD(uint8_t); -VOLATILE_LOAD(uint16_t); -VOLATILE_LOAD(uint32_t); -VOLATILE_LOAD(uint64_t); - -#define VOLATILE_STORE(type) \ - __attribute__((always_inline)) \ - static void volatile_store_##type(volatile type * _Nonnull pointer, type value) { *pointer = value; } - -VOLATILE_STORE(uint8_t); -VOLATILE_STORE(uint16_t); -VOLATILE_STORE(uint32_t); -VOLATILE_STORE(uint64_t); - -static inline void busyWait(uint32_t cycles) { - asm( - "1: subs %0, #3\n" - "bcs 1b\n" - : "+l" (cycles) : : "memory" - ); -} - -static inline void nop(void) { - asm volatile("nop"); -} diff --git a/rpi-pico2-neopixel/.sourcekit-lsp/config.json b/rpi-pico2-neopixel/.sourcekit-lsp/config.json deleted file mode 100644 index 30e471b6..00000000 --- a/rpi-pico2-neopixel/.sourcekit-lsp/config.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "swiftPM": { - "configuration": "release" - } -} \ No newline at end of file diff --git a/rpi-pico2-neopixel/Makefile b/rpi-pico2-neopixel/Makefile deleted file mode 100644 index 448b28ce..00000000 --- a/rpi-pico2-neopixel/Makefile +++ /dev/null @@ -1,58 +0,0 @@ -##===----------------------------------------------------------------------===## -## -## This source file is part of the Swift open source project -## -## Copyright (c) 2024 Apple Inc. and the Swift project authors. -## Licensed under Apache License v2.0 with Runtime Library Exception -## -## See https://swift.org/LICENSE.txt for license information -## -##===----------------------------------------------------------------------===## - -# Determine file paths -REPOROOT := $(shell git rev-parse --show-toplevel) -TOOLSROOT := $(REPOROOT)/Tools -TOOLSET := $(TOOLSROOT)/Toolsets/pico2.json -MACHO2UF2 := $(TOOLSROOT)/macho2uf2.py -SWIFT_BUILD := swift build - -# Setup tools and build flags -ARCH := armv7em -TARGET := $(ARCH)-apple-none-macho -SWIFT_BUILD_ARGS := \ - --configuration release \ - --triple $(TARGET) \ - --toolset $(TOOLSET) -BUILDROOT := $(shell $(SWIFT_BUILD) $(SWIFT_BUILD_ARGS) --show-bin-path) - -.PHONY: build -build: - @echo "building..." - $(SWIFT_BUILD) \ - $(SWIFT_BUILD_ARGS) \ - -Xlinker -map -Xlinker $(BUILDROOT)/Application.mangled.map \ - --verbose - - @echo "demangling linker map..." - cat $(BUILDROOT)/Application.mangled.map \ - | c++filt | swift demangle > $(BUILDROOT)/Application.map - - @echo "disassembling..." - otool \ - -arch $(ARCH) -v -V -d -t \ - $(BUILDROOT)/Application \ - | c++filt | swift demangle > $(BUILDROOT)/Application.disassembly - - @echo "extracting binary..." - $(MACHO2UF2) \ - $(BUILDROOT)/Application \ - $(BUILDROOT)/Application.uf2 \ - --pico-family rp2350 \ - --base-address 0x20000000 \ - --segments '__TEXT,__DATA,__VECTORS,__RESET' - -.PHONY: clean -clean: - @echo "cleaning..." - @swift package clean - @rm -rf .build diff --git a/rpi-pico2-neopixel/Package.resolved b/rpi-pico2-neopixel/Package.resolved deleted file mode 100644 index f76fcd9b..00000000 --- a/rpi-pico2-neopixel/Package.resolved +++ /dev/null @@ -1,33 +0,0 @@ -{ - "originHash" : "b2e24bf273e42b2971d4fabcbfa10a408d2817cd829c0ce45e1fc8e2e0aac421", - "pins" : [ - { - "identity" : "swift-argument-parser", - "kind" : "remoteSourceControl", - "location" : "https://github.com/apple/swift-argument-parser.git", - "state" : { - "revision" : "41982a3656a71c768319979febd796c6fd111d5c", - "version" : "1.5.0" - } - }, - { - "identity" : "swift-mmio", - "kind" : "remoteSourceControl", - "location" : "https://github.com/apple/swift-mmio.git", - "state" : { - "branch" : "main", - "revision" : "5232c5129a8c70beafc3d6acfbae2716c1b6822a" - } - }, - { - "identity" : "swift-syntax", - "kind" : "remoteSourceControl", - "location" : "https://github.com/swiftlang/swift-syntax.git", - "state" : { - "revision" : "0687f71944021d616d34d922343dcef086855920", - "version" : "600.0.1" - } - } - ], - "version" : 3 -} diff --git a/rpi-pico2-neopixel/Package.swift b/rpi-pico2-neopixel/Package.swift deleted file mode 100644 index f06e7e6f..00000000 --- a/rpi-pico2-neopixel/Package.swift +++ /dev/null @@ -1,27 +0,0 @@ -// swift-tools-version: 6.0 - -import PackageDescription - -let package = Package( - name: "rpi-pico2-neopixel", - products: [ - .executable(name: "Application", targets: ["Application"]) - ], - dependencies: [ - .package(url: "https://github.com/apple/swift-mmio.git", branch: "main") - ], - targets: [ - .executableTarget( - name: "Application", - dependencies: ["RP2350", "Support"]), - .target( - name: "RP2350", - dependencies: [ - .product(name: "MMIO", package: "swift-mmio") - ], - plugins: [ - .plugin(name: "SVD2SwiftPlugin", package: "swift-mmio") - ]), - .target(name: "Support"), - ], - swiftLanguageModes: [.v5]) diff --git a/rpi-pico2-neopixel/README.md b/rpi-pico2-neopixel/README.md deleted file mode 100644 index f6225a76..00000000 --- a/rpi-pico2-neopixel/README.md +++ /dev/null @@ -1,43 +0,0 @@ -# rpi-pico2-neopixel - -An example project demonstrating how to drive a Neopixel RGB LED from an RP2350. - -![A SparkFun Pro Micro - RP2350 with its RGB LED glowing Red](assets/images/example.jpg) - -## Requirements - -- An RP2350 board, such as the "SparkFun Pro Micro - RP2350". - -## Configuring - -This example uses the hard coded constant `LED_PIN` in `Application.swift` to select the GPIO pin used to drive the attached Neopixel RGB LED. If you are using the "SparkFun Pro Micro - RP2350" no configuration is necessary, if you are using a different board you will need to adjust this constant to the pin used to drive your LED. - -Example diff: - -```diff -diff --git a/rpi-pico2-neopixel/Sources/Application/Application.swift b/rpi-pico2-neopixel/Sources/Application/Application.swift -index f6867b5..a2291db 100644 ---- a/rpi-pico2-neopixel/Sources/Application/Application.swift -+++ b/rpi-pico2-neopixel/Sources/Application/Application.swift -@@ -11,7 +11,7 @@ - - import RP2350 - --let LED_PIN: UInt32 = 25 -+let LED_PIN: UInt32 = 18 - - /// Configures GPIO pin as a front-end to PIO0. - func configure_output_pin() { -``` - -## How to build and run this example: - -- Connect the Pico2 board via a USB cable to your Mac, and make sure it's in the USB Mass Storage firmware upload mode (either hold the BOOTSEL button while plugging the board, or make sure your Flash memory doesn't contain any valid firmware). -- Make sure you have a recent nightly Swift toolchain that has Embedded Swift support. -- Build and copy the program in the UF2 format to the Mass Storage device to trigger flashing the program into memory (after which the device will reboot and run the firmware): -``` console -$ cd rpi-pico2-neopixel -$ make -$ cp .build/release/Application.uf2 /Volumes/RP2350 -``` -- The RGB LED should be animating through the color wheel. diff --git a/rpi-pico2-neopixel/Sources/Application/Application.swift b/rpi-pico2-neopixel/Sources/Application/Application.swift deleted file mode 100644 index e19b197a..00000000 --- a/rpi-pico2-neopixel/Sources/Application/Application.swift +++ /dev/null @@ -1,171 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2024 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -import RP2350 - -// swift-format-ignore: AlwaysUseLowerCamelCase -let LED_PIN: UInt32 = 25 - -/// Configures GPIO pin 25 as a front-end to PIO0. -func configureOutputPin() { - // Configure GPIO general properties - pads_bank0.gpio[LED_PIN].modify { rw in - rw.raw.od = 0 // Enable output - rw.raw.ie = 0 // Disable input - rw.raw.pue = 1 // Disable pull up - rw.raw.pde = 1 // Enable pull down - rw.raw.schmitt = 1 // Enable schmitt trigger - rw.raw.slewfast = 0 // Use slow slew rate - } - - // Configure GPIO function selection to use PIO0 - io_bank0.gpio[LED_PIN].gpio_ctrl.modify { rw in - rw.raw.funcsel = 0x6 // Forward output from pio0 to this pin - } - - // Remove pad isolation now that the correct peripheral is driving the pad - pads_bank0.gpio[LED_PIN].modify { rw in - rw.raw.iso = 0 // Disable isolation - } -} - -/// Configures PIO0 SM0 with a small program that drives WS2812 leds. -/// -/// This is not a general method to load PIO programs like is provided in the -/// pico-sdk. We assume no other programs are loaded into the state machine, as -/// a result we don't need to track program offsets and associated complexity. -/// -/// Additionally, this method doesn't reset any state in the PIO or state -/// machines. A more complete implementation will want to use `sm_reset` and -/// `clkdiv_restart` to clear any persisted state. -func configurePio() { - // Load the assembled program directly into the PIO's instruction memory. - withUnsafeBytes(of: WS2812.pioInstructions) { pointer in - let pioInstructions = pointer.assumingMemoryBound(to: UInt16.self) - for (index, pio_instr) in pioInstructions.enumerated() { - pio0.instr_mem[index].write { w in - w.raw.instr_mem0 = UInt32(pio_instr) - } - } - - // Configure the PIO program wrap boundaries. - pio0.sm[0].sm_execctrl.modify { r, w in - w.raw.wrap_bottom = 1 // Continue at 1 - w.raw.wrap_top = UInt32(pioInstructions.count - 1) // Wrap after last. - } - } - - // Setup the clock diver. - // - // From section 8.3.1. Ring Oscillator (ROSC) Overview - // > The Ring Oscillator (ROSC) ... provides the clock to the cores during - // > boot, ... the ROSC runs at a nominal 11MHz. - // - // Given the 11MHz input clock, the desired output frequency of 800KHz, and - // that each pio program cycle takes 10 cpu cycles. We can derive an - // approximate clock division factor. - // - // (11MHz) / (800KHz * 10) = 1.375 - // - // Mapping this to the integer register values: - // - // int: floor(1.375) = 1 - // frac: floor(0.375 * 255) = 95 - pio0.sm[0].sm_clkdiv.write { rw in - rw.raw.int = 1 - rw.raw.frac = 95 - } - - // Setup how the PIO state machine data pipeline. - // - // Use auto pull data from the txfifo into the OSR (output state register) - // every 24 bits. If no data is in the txfifo, the state machine will stall. - // Additional bond the RX TX fifos into one larger TX fifo so we can buffer - // more pixel data. - pio0.sm[0].sm_shiftctrl.modify { rw in - rw.raw.autopull = 1 // Enable autopull - rw.raw.pull_thresh = 24 // 24 bit pull threshold - rw.raw.out_shiftdir = 0 // Left shift from OSR - rw.raw.fjoin_tx = 1 // Join RX TX fifos - } - - // Setup the PIO state machine to output to the correct gpio pins. - pio0.sm[0].sm_pinctrl.modify { rw in - rw.raw.set_base = LED_PIN - rw.raw.set_count = 1 - rw.raw.sideset_base = LED_PIN - rw.raw.sideset_count = 1 - } - - // Start the state machine, it should immediately stall waiting for data in - // the txfifo. - pio0.ctrl.modify { _, w in - w.raw.sm_enable = 1 << 0 // Enable state machine 0 - } -} - -/// Writes an HSV8Pixel to the PIO TX fifo. -func pioWritePixel(_ hsv: HSV8Pixel) { - let rgb = RGB8Pixel(hsv) - - // Pixels need to be G R B 0 left to right. - let ws2812Value: UInt32 = - UInt32(rgb.green) << 24 | UInt32(rgb.red) << 16 | UInt32(rgb.blue) << 8 - - func txFifoFull() -> Bool { - pio0.fstat.read().raw.txfull & 0x1 != 0 - } - - // Wait for the TX fifo to have space before writing to it. - while txFifoFull() {} - - // Write the pixel value to TX fifo. - pio0.txf[0].write { w in - w.raw.txf0 = ws2812Value - } -} - -@main -struct Application { - static func main() { - // Take peripherals out of reset - resets.reset.modify { rw in - rw.raw.pio0 = 0 - rw.raw.pads_bank0 = 0 - rw.raw.io_bank0 = 0 - } - - var done = false - while !done { - let resetDone = resets.reset_done.read().raw - done = - resetDone.pio0 == 1 && resetDone.pads_bank0 == 1 - && resetDone.io_bank0 == 1 - } - - configureOutputPin() - configurePio() - - // Infinitely loop, cycling through colors. - var color = HSV8Pixel(hue: 0, saturation: .max, value: 64) - var x: UInt32 = 0 - while true { - // This is a poor excuse for writing pixel data at some frequency. Really - // this program should setup the system clocks at a chosen frequency and - // use the timer peripheral to sleep for N ms. - if x.isMultiple(of: 1 << 12) { - pioWritePixel(color) - color.hue &+= 1 - } - x &+= 1 - } - } -} diff --git a/rpi-pico2-neopixel/Sources/Application/HSV8Pixel.swift b/rpi-pico2-neopixel/Sources/Application/HSV8Pixel.swift deleted file mode 100644 index e13190e4..00000000 --- a/rpi-pico2-neopixel/Sources/Application/HSV8Pixel.swift +++ /dev/null @@ -1,16 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2024 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -struct HSV8Pixel { - var hue: UInt8 - var saturation: UInt8 - var value: UInt8 -} diff --git a/rpi-pico2-neopixel/Sources/Application/RGB8Pixel.swift b/rpi-pico2-neopixel/Sources/Application/RGB8Pixel.swift deleted file mode 100644 index e7c36b94..00000000 --- a/rpi-pico2-neopixel/Sources/Application/RGB8Pixel.swift +++ /dev/null @@ -1,75 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2024 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -struct RGB8Pixel { - var red: UInt8 - var green: UInt8 - var blue: UInt8 -} - -extension RGB8Pixel { - init(_ pixel: HSV8Pixel) { - // Fast path: gray scale. - guard pixel.saturation != 0 else { - self.red = pixel.value - self.green = pixel.value - self.blue = pixel.value - return - } - - // Slow path: compute each color component. - var hue = Float32(pixel.hue) / Float32(UInt8.max) - let saturation = Float32(pixel.saturation) / Float32(UInt8.max) - let value = Float32(pixel.value) / Float32(UInt8.max) - - let clampedHue = max(0, min(1 - .ulpOfOne, hue)) - let scaledHue = clampedHue * 6 - let sector = UInt8(scaledHue) - hue = scaledHue - Float32(sector) - - let fractionalChannel1 = value * (1.0 - (saturation * (1.0 - 0.0))) - let fractionalChannel2 = value * (1.0 - (saturation * (hue - 0.0))) - let fractionalChannel3 = value * (1.0 - (saturation * (1.0 - hue))) - - let channel1 = UInt8(fractionalChannel1 * Float32(UInt8.max)) - let channel2 = UInt8(fractionalChannel2 * Float32(UInt8.max)) - let channel3 = UInt8(fractionalChannel3 * Float32(UInt8.max)) - - switch sector { - case 0: - self.red = pixel.value - self.green = channel3 - self.blue = channel1 - case 1: - self.red = channel2 - self.green = pixel.value - self.blue = channel1 - case 2: - self.red = channel1 - self.green = pixel.value - self.blue = channel3 - case 3: - self.red = channel1 - self.green = channel2 - self.blue = pixel.value - case 4: - self.red = channel3 - self.green = channel1 - self.blue = pixel.value - case 5: - self.red = pixel.value - self.green = channel1 - self.blue = channel2 - default: - fatalError("Unreachable") - } - } -} diff --git a/rpi-pico2-neopixel/Sources/Application/WS2812.swift b/rpi-pico2-neopixel/Sources/Application/WS2812.swift deleted file mode 100644 index 7d1e86bc..00000000 --- a/rpi-pico2-neopixel/Sources/Application/WS2812.swift +++ /dev/null @@ -1,23 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2024 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -enum WS2812 { - // Precompiled PIO program using pioasm - static let pioInstructions: (UInt16, UInt16, UInt16, UInt16, UInt16) = ( - 0xe081, // 0: set pindirs, 1 side 0 - // .wrap_target - 0x6321, // 1: out x, 1 side 0 [3] - 0x1224, // 2: jmp !x, 4 side 1 [2] - 0x1201, // 3: jmp 1 side 1 [2] - 0xa242 // 4: nop side 0 [2] - // .wrap - ) -} diff --git a/rpi-pico2-neopixel/Sources/RP2350/Empty.swift b/rpi-pico2-neopixel/Sources/RP2350/Empty.swift deleted file mode 100644 index 934a795a..00000000 --- a/rpi-pico2-neopixel/Sources/RP2350/Empty.swift +++ /dev/null @@ -1,13 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2024 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -// This file is intentionally left empty for SwiftPM to recognize the target as -// a Swift source module. diff --git a/rpi-pico2-neopixel/Sources/RP2350/rp235x.patched.svd b/rpi-pico2-neopixel/Sources/RP2350/rp235x.patched.svd deleted file mode 120000 index 3bb01c54..00000000 --- a/rpi-pico2-neopixel/Sources/RP2350/rp235x.patched.svd +++ /dev/null @@ -1 +0,0 @@ -../../../Tools/SVDs/rp235x.patched.svd \ No newline at end of file diff --git a/rpi-pico2-neopixel/Sources/RP2350/svd2swift.json b/rpi-pico2-neopixel/Sources/RP2350/svd2swift.json deleted file mode 100644 index c4dd705d..00000000 --- a/rpi-pico2-neopixel/Sources/RP2350/svd2swift.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "peripherals": [ - "PADS_BANK0", - "PIO0", - "IO_BANK0", - "RESETS" - ], - "access-level": "public" -} diff --git a/rpi-pico2-neopixel/Sources/Support/Support.c b/rpi-pico2-neopixel/Sources/Support/Support.c deleted file mode 100644 index 8cd3077e..00000000 --- a/rpi-pico2-neopixel/Sources/Support/Support.c +++ /dev/null @@ -1,72 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2024 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -#include -#include - -extern int main(int argc, char *argv[]); - -void enableFPU(void) { - uint32_t* cpacr = (uint32_t*)0xE000ED88; - // Read CPACR. - // Set bits 20-23 to enable CP10 and CP11 coprocessors. - // Write back the modified value to the CPACR. - *cpacr |= 0xF << 20; - // Wait for the coprocessors to become active. - asm volatile("dsb"); - asm volatile("isb"); -} - -void reset(void) { - enableFPU(); - int exit_code = main(0, NULL); - __builtin_trap(); -} - -void interrupt(void) { - while (1) {} -} - -__attribute((section("__DATA,stack"), aligned(32))) -char stack[0x1600]; - -__attribute((used)) __attribute((section("__VECTORS,vectors"))) -void *vector_table[73] = { - (void *)(&stack[sizeof(stack) - 4]), // initial SP - reset, // Reset - - interrupt, // NMI - interrupt, // HardFault - - interrupt, interrupt, interrupt, interrupt, - interrupt, interrupt, interrupt, interrupt, - interrupt, interrupt, interrupt, interrupt, - interrupt, interrupt, interrupt, interrupt, - interrupt, interrupt, interrupt, interrupt, - interrupt, interrupt, interrupt, interrupt, - interrupt, interrupt, interrupt, interrupt, - interrupt, interrupt, interrupt, interrupt, - interrupt, interrupt, interrupt, interrupt, - interrupt, interrupt, interrupt, interrupt, - interrupt, interrupt, interrupt, interrupt, - interrupt, interrupt, interrupt, interrupt, - interrupt, interrupt, interrupt, interrupt, - interrupt, interrupt, interrupt, interrupt, - interrupt, interrupt, interrupt, interrupt, - interrupt, interrupt, interrupt, interrupt, - - // Minimal image per RP2350 datasheet - (void*)0xffffded3, // PICOBIN_BLOCK_MARKER_START - (void*)0x10210142, // item: PICOBIN_BLOCK_ITEM_1BS_IMAGE_TYPE - (void*)0x000001ff, // item: PICOBIN_BLOCK_ITEM_2BS_LAST - (void*)0x00000000, // link to self / "this is the last block" - (void*)0xab123579, // PICOBIN_BLOCK_MARKER_END -}; diff --git a/rpi-pico2-neopixel/Sources/Support/crt0.S b/rpi-pico2-neopixel/Sources/Support/crt0.S deleted file mode 100644 index f87c3eca..00000000 --- a/rpi-pico2-neopixel/Sources/Support/crt0.S +++ /dev/null @@ -1,31 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2024 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - - .syntax unified - .thumb - .section __RESET,reset - .thumb_func - .global _entry_point - -_entry_point: - // Set VTOR (offset 0xed08 in Cortex-M33F registers) to point to the vector table - ldr r0, =_vector_table - ldr r1, =(0xe0000000 + 0x0000ed08) - str r0, [r1] - - // Load the first two entries of the vector table, (1) r1 = initial SP, (2) r2 = reset function - ldmia r0!, {r1, r2} - - // Set stack pointer - msr msp, r1 - - // Transfer to reset function - bx r2 diff --git a/rpi-pico2-neopixel/Sources/Support/include/Support.h b/rpi-pico2-neopixel/Sources/Support/include/Support.h deleted file mode 100644 index 158cce06..00000000 --- a/rpi-pico2-neopixel/Sources/Support/include/Support.h +++ /dev/null @@ -1,12 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2024 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -#pragma once diff --git a/rpi-pico2-neopixel/assets/images/example.jpg b/rpi-pico2-neopixel/assets/images/example.jpg deleted file mode 100644 index bbee6276994fd4301003d2e7f5d9a68a7e1bde0e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 528680 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

L?*mub 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 wDi|{Jfwr_*;lZ^ga7~l diff --git a/rpi-picow-blink-sdk/BridgingHeader.h b/rpi-picow-blink-sdk/BridgingHeader.h deleted file mode 100644 index 69a2fec8..00000000 --- a/rpi-picow-blink-sdk/BridgingHeader.h +++ /dev/null @@ -1,15 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2024 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -#pragma once - -#include "pico/stdlib.h" -#include "pico/cyw43_arch.h" diff --git a/rpi-picow-blink-sdk/CMakeLists.txt b/rpi-picow-blink-sdk/CMakeLists.txt deleted file mode 100644 index 41cb7fcd..00000000 --- a/rpi-picow-blink-sdk/CMakeLists.txt +++ /dev/null @@ -1,97 +0,0 @@ -cmake_minimum_required(VERSION 3.29) -include($ENV{PICO_SDK_PATH}/external/pico_sdk_import.cmake) - -set(CMAKE_Swift_COMPILATION_MODE wholemodule) -set(CMAKE_Swift_COMPILER_WORKS YES) - -project(swift-blinky) -pico_sdk_init() -enable_language(Swift) - -add_executable(swift-blinky - # Source files: - Main.swift -) - -set_target_properties(swift-blinky PROPERTIES LINKER_LANGUAGE CXX) - -target_link_libraries(swift-blinky - pico_stdlib hardware_uart hardware_gpio pico_lwip_arch pico_cyw43_arch_none -) - -# Clear the default COMPILE_OPTIONS which include C specific compiler flags that the Swift compiler will not accept -# Instead, set those options to only apply when compiling C code. -set_target_properties(pico_standard_link PROPERTIES INTERFACE_COMPILE_OPTIONS "") -target_compile_options(pico_standard_link INTERFACE "$<$:SHELL: -ffunction-sections -fdata-sections>") - -# Gather C compile definitions from all dependencies -set_property(GLOBAL PROPERTY visited_targets "") -set_property(GLOBAL PROPERTY compilerdefs_list "") - -function(gather_compile_definitions_recursive target) - # Get the current value of visited_targets - get_property(visited_targets GLOBAL PROPERTY visited_targets) - - # make sure we don't visit the same target twice - # and that we don't visit the special generator expressions - if (${target} MATCHES "\\\$<" OR ${target} MATCHES "::@" OR ${target} IN_LIST visited_targets) - return() - endif() - - # Append the target to visited_targets - list(APPEND visited_targets ${target}) - set_property(GLOBAL PROPERTY visited_targets "${visited_targets}") - - get_target_property(target_definitions ${target} INTERFACE_COMPILE_DEFINITIONS) - if (target_definitions) - # Append the target definitions to compilerdefs_list - get_property(compilerdefs_list GLOBAL PROPERTY compilerdefs_list) - list(APPEND compilerdefs_list ${target_definitions}) - set_property(GLOBAL PROPERTY compilerdefs_list "${compilerdefs_list}") - endif() - - get_target_property(target_linked_libs ${target} INTERFACE_LINK_LIBRARIES) - if (target_linked_libs) - foreach(linked_target ${target_linked_libs}) - # Recursively gather compile definitions from dependencies - gather_compile_definitions_recursive(${linked_target}) - endforeach() - endif() -endfunction() - -gather_compile_definitions_recursive(swift-blinky) -get_property(COMPILE_DEFINITIONS GLOBAL PROPERTY compilerdefs_list) -get_property(INCLUDES GLOBAL PROPERTY includes_list) - -# Convert compiler definitions into a format that swiftc can understand -list(REMOVE_DUPLICATES COMPILE_DEFINITIONS) -list(PREPEND COMPILE_DEFINITIONS "") # adds a semicolon at the beginning -string(REPLACE "$" "$" COMPILE_DEFINITIONS "${COMPILE_DEFINITIONS}") -string(REPLACE ";" " -Xcc -D" COMPILE_DEFINITIONS "${COMPILE_DEFINITIONS}") - -# Compute -Xcc flags to set up the C and C++ header search paths for Swift (for bridging header). -set(IMPLICIT_INCLUDES) -foreach(dir ${CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES}) - string(CONCAT IMPLICIT_INCLUDES ${IMPLICIT_INCLUDES} "-Xcc ") - string(CONCAT IMPLICIT_INCLUDES ${IMPLICIT_INCLUDES} "-I${dir} ") -endforeach() -foreach(dir ${CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES}) - string(CONCAT IMPLICIT_INCLUDES ${IMPLICIT_INCLUDES} "-Xcc ") - string(CONCAT IMPLICIT_INCLUDES ${IMPLICIT_INCLUDES} "-I${dir} ") -endforeach() - -target_compile_options(swift-blinky PUBLIC - "$<$:SHELL: - -target armv6m-none-none-eabi - -enable-experimental-feature Embedded - -parse-as-library - -module-name swift_blinky - - -Xcc -fshort-enums - -Xfrontend -function-sections - -import-bridging-header ${CMAKE_CURRENT_LIST_DIR}/BridgingHeader.h - ${COMPILE_DEFINITIONS} - ${IMPLICIT_INCLUDES} - >") - -pico_add_extra_outputs(swift-blinky) diff --git a/rpi-picow-blink-sdk/Main.swift b/rpi-picow-blink-sdk/Main.swift deleted file mode 100644 index a60f13d3..00000000 --- a/rpi-picow-blink-sdk/Main.swift +++ /dev/null @@ -1,46 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2024 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -@main -struct Main { - static func main() { - let led = UInt32(CYW43_WL_GPIO_LED_PIN) - if cyw43_arch_init() != 0 { - print("Wi-Fi init failed") - return - } - let dot = { - cyw43_arch_gpio_put(led, true) - sleep_ms(250) - cyw43_arch_gpio_put(led, false) - sleep_ms(250) - } - let dash = { - cyw43_arch_gpio_put(led, true) - sleep_ms(500) - cyw43_arch_gpio_put(led, false) - sleep_ms(250) - } - while true { - dot() - dot() - dot() - - dash() - dash() - dash() - - dot() - dot() - dot() - } - } -} diff --git a/rpi-picow-blink-sdk/README.md b/rpi-picow-blink-sdk/README.md deleted file mode 100644 index 1b88c093..00000000 --- a/rpi-picow-blink-sdk/README.md +++ /dev/null @@ -1,41 +0,0 @@ -# rpi-picow-blink-sdk - -This example demonstrates how to integrate with the Pico SDK which is using CMake as its build system -- the simplest way to integrate with it is to also use CMake to build a Swift firmware application on top of the SDK and the libraries from it. - - - -## Requirements - -- A Raspberry Pi Pico W / Pico 2W board. If you have a Pico (non-W) instead, refer to the [rpi-pico-blink-sdk](../rpi-pico-blink-sdk) sample instead. -- Follow the setup steps at https://datasheets.raspberrypi.com/pico/getting-started-with-pico.pdf, in particular you'll need: - - A checkout of the [pico-sdk](https://github.com/raspberrypi/pico-sdk.git), with git submodules checked out. - - A checkout of the [pico-examples](https://github.com/raspberrypi/pico-examples.git). - - CMake. - - The [Arm Embedded Toolchain](https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads). -- Before trying to use Swift with the Pico SDK, make sure your environment works and can build the provided C/C++ sample projects, in particular: - - Try building and running the "blink" example from pico-examples written in C. - - -## Building - -- Make sure you have a recent nightly Swift toolchain that has Embedded Swift support. -- Build and copy the program in the UF2 format to the Mass Storage device to trigger flashing the program into memory (after which the device will reboot and run the firmware): -``` console -$ cd rpi-picow-blink-sdk -$ export PICO_BOARD=pico_w # or pico2_w -$ export PICO_SDK_PATH='' -$ export PICO_TOOLCHAIN_PATH='' -$ cmake -B build -G Ninja . -DCMAKE_EXPORT_COMPILE_COMMANDS=On -$ cmake --build build -``` - -## Running - -- Connect the Pico W board via a USB cable to your Mac, and make sure it's in the USB Mass Storage firmware upload mode (either hold the BOOTSEL button while plugging the board, or make sure your Flash memory doesn't contain any valid firmware). -- Copy the UF2 firmware to the Mass Storage device: - -```console -$ cp build/swift-blinky.uf2 /Volumes/RP2040 # or /Volumes/RP2350 for Pico 2W -``` - -- The green LED should now be blinking in a pattern. diff --git a/rpi-picow-blink-sdk/include/lwipopts.h b/rpi-picow-blink-sdk/include/lwipopts.h deleted file mode 100644 index 94b02c4d..00000000 --- a/rpi-picow-blink-sdk/include/lwipopts.h +++ /dev/null @@ -1,18 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift.org open source project -// -// Copyright (c) 2024 Apple Inc. and the Swift project authors -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors -// -//===----------------------------------------------------------------------===// - -// Generally you would define your own explicit list of lwIP options -// (see https://www.nongnu.org/lwip/2_1_x/group__lwip__opts.html) - -#ifndef _LWIPOPTS_H -#define _LWIPOPTS_H -#endif diff --git a/stm32-blink/Board.swift b/stm32-blink/Board.swift deleted file mode 100644 index 130932e2..00000000 --- a/stm32-blink/Board.swift +++ /dev/null @@ -1,115 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2023 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -#if STM32F746G_DISCOVERY - -typealias Board = STM32F746Board -enum STM32F746Board { - static func initialize() { - // (1) AHB1ENR[lecConfig.0] = 1 ... enable clock - setRegisterBit( - baseAddress: RCC.BaseAddress, offset: RCC.Offsets.AHB1ENR, - bit: RCC.AHB1ENRBit(for: ledConfig.0), - value: 1) - // (2) MODER[1] = 1 ... set mode to output - setRegisterTwoBitField( - baseAddress: GPIO.GPIOi_BaseAddress, offset: GPIO.Offsets.MODER, - bitsStartingAt: 2 * ledConfig.1, value: 1) - // (3) OTYPER[1] = 0 ... output type is push-pull - setRegisterBit( - baseAddress: GPIO.GPIOi_BaseAddress, offset: GPIO.Offsets.OTYPER, - bit: ledConfig.1, - value: 0) - // (4) OSPEEDR[1] = 2 ... speed is high - setRegisterTwoBitField( - baseAddress: GPIO.GPIOi_BaseAddress, offset: GPIO.Offsets.OSPEEDR, - bitsStartingAt: 2 * ledConfig.1, value: 2) - // (5) PUPDR[1] = 2 ... set pull to down - setRegisterTwoBitField( - baseAddress: GPIO.GPIOi_BaseAddress, offset: GPIO.Offsets.PUPDR, - bitsStartingAt: 2 * ledConfig.1, value: 2) - - ledOff() - } - - static func ledOn() { - // ODR[1] = 1 - setRegisterBit( - baseAddress: GPIO.GPIOi_BaseAddress, offset: GPIO.Offsets.ODR, bit: 1, - value: 1) - } - - static func ledOff() { - // ODR[1] = 0 - setRegisterBit( - baseAddress: GPIO.GPIOi_BaseAddress, offset: GPIO.Offsets.ODR, bit: 1, - value: 0) - } - - static func delay(milliseconds: Int) { - for _ in 0..<10_000 * milliseconds { - nop() - } - } -} - -#elseif NUCLEO_F103RB - -typealias Board = STM32F1Board -enum STM32F1Board { - static func initialize() { - // (1) APB2ENR[ledConfig.0] = 1 ... enable clock - setRegisterBit( - baseAddress: RCC.BaseAddress, offset: RCC.Offsets.APB2ENR, - bit: RCC.APB2ENRBit(for: ledConfig.0), - value: 1) - // (2) CRL.MODE[ledConfig.1] = 0b11 ... set mode to output, high speed - setRegisterTwoBitField( - baseAddress: GPIO.GPIOBaseAddress(for: ledConfig.0), - offset: GPIO.Offsets.CRL, - bitsStartingAt: 4 * ledConfig.1, value: 3) - // (3) CRL.CNF[ledConfig.1] = 0b00 ... general purpose, push-pull - setRegisterTwoBitField( - baseAddress: GPIO.GPIOBaseAddress(for: ledConfig.0), - offset: GPIO.Offsets.CRL, - bitsStartingAt: 4 * ledConfig.1 + 2, value: 0) - - ledOff() - } - - static func ledOn() { - // ODR[ledConfig.1] = 1 - setRegisterBit( - baseAddress: GPIO.GPIOBaseAddress(for: ledConfig.0), - offset: GPIO.Offsets.ODR, bit: ledConfig.1, - value: 1) - } - - static func ledOff() { - // ODR[ledConfig.1] = 0 - setRegisterBit( - baseAddress: GPIO.GPIOBaseAddress(for: ledConfig.0), - offset: GPIO.Offsets.ODR, bit: ledConfig.1, - value: 0) - } - - static func delay(milliseconds: Int) { - for _ in 0..<10_000 * milliseconds { - nop() - } - } -} - -#else - -#error("Unknown board") - -#endif diff --git a/stm32-blink/BridgingHeader.h b/stm32-blink/BridgingHeader.h deleted file mode 100644 index 6b807332..00000000 --- a/stm32-blink/BridgingHeader.h +++ /dev/null @@ -1,16 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2023 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -#pragma once - -static inline __attribute((always_inline)) void nop() { - asm volatile("nop"); -} diff --git a/stm32-blink/Main.swift b/stm32-blink/Main.swift deleted file mode 100644 index 43d23858..00000000 --- a/stm32-blink/Main.swift +++ /dev/null @@ -1,42 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2023 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -#if STM32F746G_DISCOVERY - -// I1 pin aka "Arduino D13" pin on STM32F746 Discovery Board -// https://www.st.com/resource/en/schematic_pack/mb1191-f746ngh6-c01_schematic.pdf -let ledConfig: (GPIOBank, GPIOPin) = (.i, 1) - -#elseif NUCLEO_F103RB - -// A5 pin aka "Arduino D13" pin on Nucleo-64 boards -// https://www.st.com/resource/en/user_manual/um1724-stm32-nucleo64-boards-mb1136-stmicroelectronics.pdf -let ledConfig: (GPIOBank, GPIOPin) = (.a, 5) - -#else - -#error("Unknown board") - -#endif - -@main -struct Main { - static func main() { - Board.initialize() - - while true { - Board.ledOn() - Board.delay(milliseconds: 100) - Board.ledOff() - Board.delay(milliseconds: 300) - } - } -} diff --git a/stm32-blink/README.md b/stm32-blink/README.md deleted file mode 100644 index 12797e03..00000000 --- a/stm32-blink/README.md +++ /dev/null @@ -1,56 +0,0 @@ -# stm32-blink - -This example shows a simple baremetal firmware for an STM32 board that blinks an LED repeatedly. The example does not use any vendor SDKs or external toolchains, the entire firmware is only built from code in this example directory. - - - -## Requirements - -- Connect the STM32F746G-DISCO board via the ST-LINK USB port to your Mac. -- Download and install a [recent nightly Swift toolchain](https://swift.org/download). Use the "Development Snapshot" from "main". -- Install the [`stlink`](https://github.com/stlink-org/stlink) command line tools, e.g. via `brew install stlink`. - -## Building and running the firmware as Mach-O on macOS - -- Build and upload the program to flash memory of the microcontroller: -```console -$ cd stm32-blink -$ export STM_BOARD=STM32F746G_DISCOVERY # or NUCLEO_F103RB -$ ./build-macho.sh -$ st-flash --reset write .build/blink.bin 0x08000000 -``` -- The green LED next to the RESET button should now be blinking in a pattern. - -## Building and running the firmware as ELF (on either macOS or Linux) - -- Build and upload the program to flash memory of the microcontroller: -```console -$ cd stm32-blink -$ export STM_BOARD=STM32F746G_DISCOVERY # or NUCLEO_F103RB -$ ./build-elf.sh -$ st-flash --format ihex --reset write .build/blink.hex -``` -- The green LED next to the RESET button should now be blinking in a pattern. - -## Binary size - -The resulting size of the compiled and linked binary is very small (which shouldn't be surprising given that this toy example only blinks an LED), and demonstrates how the Embedded Swift compilation mode doesn't include unnecessary code or data in the resulting program: - -```console -$ size -m .build/blink -Segment __TEXT: 656 - Section __text: 142 - total 142 -Segment __VECTORS: 456 - Section __text: 456 - total 456 -Segment __LINKEDIT: 188 -total 1300 -``` - -The binary contains only 142 bytes of code! Additionally, the vector table needed by the CPU is actually dominating the size of the final firmware. Note that the `__LINKEDIT` segment is discarded when forming the final `.bin` file, which is 1168 bytes in size: - -```console -$ cat .build/blink.bin | wc -c - 1168 -``` diff --git a/stm32-blink/Registers.swift b/stm32-blink/Registers.swift deleted file mode 100644 index ccbf13fb..00000000 --- a/stm32-blink/Registers.swift +++ /dev/null @@ -1,178 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2023 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -// swift-format-ignore-file - -import _Volatile - -#if STM32F746G_DISCOVERY - -// Register definitions for STM32F746NG MCU -// https://www.st.com/resource/en/reference_manual/rm0385-stm32f75xxx-and-stm32f74xxx-advanced-armbased-32bit-mcus-stmicroelectronics.pdf - -enum GPIOBank: Int { - case a, b, c, d, e, f, g, h, i, j, k -} -typealias GPIOPin = Int - -enum RCC { - static let BaseAddress = UnsafeMutablePointer(bitPattern: 0x40023800 as UInt)! - enum Offsets { - static let AHB1ENR = 0x30 - } - enum Bits { - static let AHB1ENR_GPIOAEN = 0 - static let AHB1ENR_GPIOBEN = 1 - static let AHB1ENR_GPIOCEN = 2 - static let AHB1ENR_GPIODEN = 3 - static let AHB1ENR_GPIOEEN = 4 - static let AHB1ENR_GPIOFEN = 5 - static let AHB1ENR_GPIOGEN = 6 - static let AHB1ENR_GPIOHEN = 7 - static let AHB1ENR_GPIOIEN = 8 - static let AHB1ENR_GPIOJEN = 9 - static let AHB1ENR_GPIOKEN = 10 - } - - static func AHB1ENRBit(for bank: GPIOBank) -> Int { - return switch bank { - case .a: Bits.AHB1ENR_GPIOAEN - case .b: Bits.AHB1ENR_GPIOBEN - case .c: Bits.AHB1ENR_GPIOCEN - case .d: Bits.AHB1ENR_GPIODEN - case .e: Bits.AHB1ENR_GPIOEEN - case .f: Bits.AHB1ENR_GPIOFEN - case .g: Bits.AHB1ENR_GPIOGEN - case .h: Bits.AHB1ENR_GPIOHEN - case .i: Bits.AHB1ENR_GPIOIEN - case .j: Bits.AHB1ENR_GPIOJEN - case .k: Bits.AHB1ENR_GPIOKEN - } - } -} - -enum GPIO { - static let GPIOa_BaseAddress = UnsafeMutablePointer(bitPattern: 0x40020000 as UInt)! - static let GPIOb_BaseAddress = UnsafeMutablePointer(bitPattern: 0x40020400 as UInt)! - static let GPIOc_BaseAddress = UnsafeMutablePointer(bitPattern: 0x40020800 as UInt)! - static let GPIOd_BaseAddress = UnsafeMutablePointer(bitPattern: 0x40020c00 as UInt)! - static let GPIOe_BaseAddress = UnsafeMutablePointer(bitPattern: 0x40021000 as UInt)! - static let GPIOf_BaseAddress = UnsafeMutablePointer(bitPattern: 0x40021400 as UInt)! - static let GPIOg_BaseAddress = UnsafeMutablePointer(bitPattern: 0x40021800 as UInt)! - static let GPIOh_BaseAddress = UnsafeMutablePointer(bitPattern: 0x40021c00 as UInt)! - static let GPIOi_BaseAddress = UnsafeMutablePointer(bitPattern: 0x40022000 as UInt)! - static let GPIOj_BaseAddress = UnsafeMutablePointer(bitPattern: 0x40022400 as UInt)! - static let GPIOk_BaseAddress = UnsafeMutablePointer(bitPattern: 0x40022800 as UInt)! - - enum Offsets { - static let MODER = 0x0 - static let OTYPER = 0x4 - static let OSPEEDR = 0x8 - static let PUPDR = 0xc - static let IDR = 0x10 - static let ODR = 0x14 - } -} - -#elseif NUCLEO_F103RB - -// Register definitions for STM32F103RB MCU -// https://www.st.com/resource/en/reference_manual/rm0008-stm32f101xx-stm32f102xx-stm32f103xx-stm32f105xx-and-stm32f107xx-advanced-armbased-32bit-mcus-stmicroelectronics.pdf - -enum GPIOBank: Int { - case a, b, c, d, e, f, g -} -typealias GPIOPin = Int - -enum RCC { - static let BaseAddress = UnsafeMutablePointer(bitPattern: 0x40021000 as UInt)! - enum Offsets { - static let APB2ENR = 0x18 - } - enum Bits { - static let APB2ENR_IOPAEN = 2 - static let APB2ENR_IOPBEN = 3 - static let APB2ENR_IOPCEN = 4 - static let APB2ENR_IOPDEN = 5 - static let APB2ENR_IOPEEN = 6 - static let APB2ENR_IOPFEN = 7 - static let APB2ENR_IOPGEN = 8 - } - - static func APB2ENRBit(for bank: GPIOBank) -> Int { - return switch bank { - case .a: Bits.APB2ENR_IOPAEN - case .b: Bits.APB2ENR_IOPBEN - case .c: Bits.APB2ENR_IOPCEN - case .d: Bits.APB2ENR_IOPDEN - case .e: Bits.APB2ENR_IOPEEN - case .f: Bits.APB2ENR_IOPFEN - case .g: Bits.APB2ENR_IOPGEN - } - } -} - -enum GPIO { - static let GPIOa_BaseAddress = UnsafeMutablePointer(bitPattern: 0x40010800 as UInt)! - static let GPIOb_BaseAddress = UnsafeMutablePointer(bitPattern: 0x40010c00 as UInt)! - static let GPIOc_BaseAddress = UnsafeMutablePointer(bitPattern: 0x40011000 as UInt)! - static let GPIOd_BaseAddress = UnsafeMutablePointer(bitPattern: 0x40011400 as UInt)! - static let GPIOe_BaseAddress = UnsafeMutablePointer(bitPattern: 0x40011800 as UInt)! - static let GPIOf_BaseAddress = UnsafeMutablePointer(bitPattern: 0x40011c00 as UInt)! - static let GPIOg_BaseAddress = UnsafeMutablePointer(bitPattern: 0x40012000 as UInt)! - - static func GPIOBaseAddress(for bank: GPIOBank) -> UnsafeMutablePointer { - return switch bank { - case .a: GPIOa_BaseAddress - case .b: GPIOb_BaseAddress - case .c: GPIOc_BaseAddress - case .d: GPIOd_BaseAddress - case .e: GPIOe_BaseAddress - case .f: GPIOf_BaseAddress - case .g: GPIOg_BaseAddress - } - } - - enum Offsets { - static let CRL = 0x0 - static let CRH = 0x4 - static let IDR = 0x8 - static let ODR = 0xc - } -} - -#else - -#error("Unknown board") - -#endif - -func setRegisterBit(baseAddress: UnsafeMutablePointer, offset: Int, bit: Int, value: Int) { - precondition(offset % 4 == 0) - precondition(bit >= 0 && bit < 32) - precondition(value >= 0 && value < 2) - let p = baseAddress.advanced(by: offset / 4) - let m = VolatileMappedRegister(unsafeBitPattern: UInt(bitPattern: p)) - let previousValue: UInt32 = m.load() - let newValue: UInt32 = previousValue & ~(1 << UInt32(bit)) | (UInt32(value) << UInt32(bit)) - m.store(newValue) -} - -func setRegisterTwoBitField(baseAddress: UnsafeMutablePointer, offset: Int, bitsStartingAt: Int, value: Int) { - precondition(offset % 4 == 0) - precondition(bitsStartingAt >= 0 && bitsStartingAt < 31) - precondition(value >= 0 && value < 4) - let p = baseAddress.advanced(by: offset / 4) - let m = VolatileMappedRegister(unsafeBitPattern: UInt(bitPattern: p)) - let previousValue: UInt32 = m.load() - let newValue: UInt32 = previousValue & ~(0b11 << UInt32(bitsStartingAt)) | (UInt32(value) << UInt32(bitsStartingAt)) - m.store(newValue) -} diff --git a/stm32-blink/Startup.c b/stm32-blink/Startup.c deleted file mode 100644 index 9237afb1..00000000 --- a/stm32-blink/Startup.c +++ /dev/null @@ -1,44 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2023 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -#include -#include - -extern int main(int argc, char *argv[]); - -void reset(void) { - main(0, NULL); -} - -void interrupt(void) { - while (1) {} -} - -__attribute((used)) -#if defined(__ELF__) -__attribute((section(".vectors"))) -#elif defined(__MACH__) -__attribute((section("__VECTORS,__text"))) -#else -#error Unknown file format -#endif -void *vector_table[114] = { - (void *)0x20001ffc, // initial SP, assume we have 8 KB of SRAM - reset, // Reset - - interrupt, // NMI - interrupt, // HardFault - interrupt, // MemManage - interrupt, // BusFault - interrupt, // UsageFault - - 0 // NULL for all the other handlers -}; diff --git a/stm32-blink/build-elf.sh b/stm32-blink/build-elf.sh deleted file mode 100755 index afd9413e..00000000 --- a/stm32-blink/build-elf.sh +++ /dev/null @@ -1,52 +0,0 @@ -#!/bin/bash - -set -vex - -# Determine file paths -REPOROOT=$(realpath -- "$(dirname "${BASH_SOURCE[0]}")")/.. -TOOLSROOT="$REPOROOT/Tools" -SRCROOT="$REPOROOT/stm32-blink" -BUILDROOT="$SRCROOT/.build" - -# Clean the build directory -rm -r "$BUILDROOT" || true - -# Setup tools and build flags -TARGET=armv7em-none-none-eabi - -if [[ ! "$STM_BOARD" ]] ; then - echo "STM_BOARD must be set to STM32F746G_DISCOVERY or NUCLEO_F103RB" - exit 1 -fi - -SWIFT_EXEC=${SWIFT_EXEC:-$(which swiftc)} -SWIFT_FLAGS="-target $TARGET -Osize" -SWIFT_FLAGS+=" -import-bridging-header $SRCROOT/BridgingHeader.h -wmo -enable-experimental-feature Embedded" -SWIFT_FLAGS+=" -Xfrontend -function-sections -D${STM_BOARD}" - -CLANG_EXEC=${CLANG_EXEC:-$(which clang)} -CLANG_FLAGS="-target $TARGET -Oz" - -LD_EXEC=${LD_EXEC:-$CLANG_EXEC} -LD_FLAGS="-target $TARGET -fuse-ld=lld -nostdlib -static -Wl,-e,vector_table -Wl,--gc-sections -Wl,-T,$SRCROOT/elf-linkerscript.ld" - -# Create build directory -mkdir -p "$BUILDROOT" - -# Build Swift sources -# shellcheck disable=SC2086 # intentional splitting -"$SWIFT_EXEC" $SWIFT_FLAGS -c $SRCROOT/*.swift -o "$BUILDROOT/blink.o" - -# Build C sources -# shellcheck disable=SC2086 # intentional splitting -"$CLANG_EXEC" $CLANG_FLAGS -c "$SRCROOT/Startup.c" -o "$BUILDROOT/Startup.o" - -# Link objects into executable -# shellcheck disable=SC2086 # intentional splitting -"$LD_EXEC" $LD_FLAGS "$BUILDROOT/blink.o" "$BUILDROOT/Startup.o" -o "$BUILDROOT/blink.elf" - -# Convert to Intel HEX for flashing -"$TOOLSROOT"/elf2hex.py "$BUILDROOT/blink.elf" "$BUILDROOT/blink.hex" - -# Echo final binary path -ls -al "$BUILDROOT/blink.hex" diff --git a/stm32-blink/build-macho.sh b/stm32-blink/build-macho.sh deleted file mode 100755 index 7e9fa3d4..00000000 --- a/stm32-blink/build-macho.sh +++ /dev/null @@ -1,56 +0,0 @@ -#!/bin/bash - -set -vex - -# Determine file paths -REPOROOT=$(git rev-parse --show-toplevel) -TOOLSROOT="$REPOROOT/Tools" -SRCROOT="$REPOROOT/stm32-blink" -BUILDROOT="$SRCROOT/.build" - -# Clean the build directory -rm -r "$BUILDROOT" || true - -# Setup tools and build flags -TARGET=armv7em-apple-none-macho - -if [[ ! "$STM_BOARD" ]] ; then - echo "STM_BOARD must be set to STM32F746G_DISCOVERY or NUCLEO_F103RB" - exit 1 -fi - -SWIFT_EXEC=${SWIFT_EXEC:-$(xcrun -f swiftc)} -SWIFT_FLAGS="-target $TARGET -Osize" -SWIFT_FLAGS+=" -import-bridging-header $SRCROOT/BridgingHeader.h -wmo -enable-experimental-feature Embedded" -SWIFT_FLAGS+=" -Xcc -ffreestanding" -SWIFT_FLAGS+=" -D${STM_BOARD}" - -CLANG_EXEC=${CLANG_EXEC:-$(xcrun -f clang)} -CLANG_FLAGS="-target $TARGET -Oz" - -LD_EXEC=${LD_EXEC:-$CLANG_EXEC} -LD_FLAGS="-target $TARGET -nostdlib -static -Wl,-e,_reset -dead_strip -Wl,-no_zero_fill_sections -Wl,-segalign,4 -Wl,-segaddr,__VECTORS,0x08000000 -Wl,-seg1addr,0x08000200 -Wl,-pagezero_size,0" - -PYTHON_EXEC=${PYTHON_EXEC:-$(xcrun -f python3)} -MACHO2BIN="$TOOLSROOT/macho2bin.py" - -# Create build directory -mkdir -p "$BUILDROOT" - -# Build Swift sources -# shellcheck disable=SC2086 # intentional splitting -"$SWIFT_EXEC" $SWIFT_FLAGS -c "$SRCROOT/"*.swift -o "$BUILDROOT/blink.o" - -# Build C sources -# shellcheck disable=SC2086 # intentional splitting -"$CLANG_EXEC" $CLANG_FLAGS -c "$SRCROOT/Startup.c" -o "$BUILDROOT/Startup.o" - -# Link objects into executable -# shellcheck disable=SC2086 # intentional splitting -"$LD_EXEC" $LD_FLAGS "$BUILDROOT/blink.o" "$BUILDROOT/Startup.o" -o "$BUILDROOT/blink" - -# Extract sections from executable into flashable binary -"$PYTHON_EXEC" "$MACHO2BIN" "$BUILDROOT/blink" "$BUILDROOT/blink.bin" --base-address 0x08000000 --segments '__TEXT,__DATA,__VECTORS' - -# Echo final binary path -ls -al "$BUILDROOT/blink.bin" diff --git a/stm32-blink/elf-linkerscript.ld b/stm32-blink/elf-linkerscript.ld deleted file mode 100644 index 98d5f00a..00000000 --- a/stm32-blink/elf-linkerscript.ld +++ /dev/null @@ -1,13 +0,0 @@ -MEMORY -{ - flash : ORIGIN = 0x08000000, LENGTH = 32K - sram : ORIGIN = 0x20000000, LENGTH = 8K -} - -SECTIONS -{ - .text : { *(.vectors*) ; *(.text*) } > flash - .bss : { *(.bss*) } > sram - .data : { *(.data*) } > sram - /DISCARD/ : { *(.swift_modhash*) } -} diff --git a/stm32-lcd-logo/Makefile b/stm32-lcd-logo/Makefile deleted file mode 100644 index ae097811..00000000 --- a/stm32-lcd-logo/Makefile +++ /dev/null @@ -1,57 +0,0 @@ -##===----------------------------------------------------------------------===## -## -## This source file is part of the Swift open source project -## -## Copyright (c) 2023 Apple Inc. and the Swift project authors. -## Licensed under Apache License v2.0 with Runtime Library Exception -## -## See https://swift.org/LICENSE.txt for license information -## -##===----------------------------------------------------------------------===## - -# Paths -REPOROOT := $(shell git rev-parse --show-toplevel) -TOOLSROOT := $(REPOROOT)/Tools -TOOLSET := $(TOOLSROOT)/Toolsets/stm32f74x-lcd.json -MACHO2BIN := $(TOOLSROOT)/macho2bin.py -SWIFT_BUILD := swift build - -# Flags -ARCH := armv7em -TARGET := $(ARCH)-apple-none-macho -SWIFT_BUILD_ARGS := \ - --configuration release \ - --triple $(TARGET) \ - --toolset $(TOOLSET) -BUILDROOT := $(shell $(SWIFT_BUILD) $(SWIFT_BUILD_ARGS) --show-bin-path) - -.PHONY: build -build: - @echo "building..." - $(SWIFT_BUILD) \ - $(SWIFT_BUILD_ARGS) \ - -Xlinker -map -Xlinker $(BUILDROOT)/Application.mangled.map \ - --verbose - - @echo "demangling linker map..." - cat $(BUILDROOT)/Application.mangled.map \ - | c++filt | swift demangle > $(BUILDROOT)/Application.map - - @echo "disassembling..." - otool \ - -arch $(ARCH) -v -V -d -t \ - $(BUILDROOT)/Application \ - | c++filt | swift demangle > $(BUILDROOT)/Application.disassembly - - @echo "extracting binary..." - $(MACHO2BIN) \ - $(BUILDROOT)/Application \ - $(BUILDROOT)/Application.bin \ - --base-address 0x00200000 \ - --segments '__TEXT,__DATA,__VECTORS' - -.PHONY: clean -clean: - @echo "cleaning..." - @swift package clean - @rm -rf .build diff --git a/stm32-lcd-logo/Package.resolved b/stm32-lcd-logo/Package.resolved deleted file mode 100644 index f36366ea..00000000 --- a/stm32-lcd-logo/Package.resolved +++ /dev/null @@ -1,33 +0,0 @@ -{ - "originHash" : "0259de139c240d30a60426d7d7f2d119ccc92fffcb5377eccefe0c9a21e3ef9c", - "pins" : [ - { - "identity" : "swift-argument-parser", - "kind" : "remoteSourceControl", - "location" : "https://github.com/apple/swift-argument-parser.git", - "state" : { - "revision" : "41982a3656a71c768319979febd796c6fd111d5c", - "version" : "1.5.0" - } - }, - { - "identity" : "swift-mmio", - "kind" : "remoteSourceControl", - "location" : "https://github.com/apple/swift-mmio", - "state" : { - "branch" : "main", - "revision" : "5232c5129a8c70beafc3d6acfbae2716c1b6822a" - } - }, - { - "identity" : "swift-syntax", - "kind" : "remoteSourceControl", - "location" : "https://github.com/swiftlang/swift-syntax.git", - "state" : { - "revision" : "0687f71944021d616d34d922343dcef086855920", - "version" : "600.0.1" - } - } - ], - "version" : 3 -} diff --git a/stm32-lcd-logo/Package.swift b/stm32-lcd-logo/Package.swift deleted file mode 100644 index 29041b56..00000000 --- a/stm32-lcd-logo/Package.swift +++ /dev/null @@ -1,38 +0,0 @@ -// swift-tools-version: 6.0 - -import PackageDescription - -let package = Package( - name: "stm32-lcd-logo", - products: [ - .executable(name: "Application", targets: ["Application"]) - ], - dependencies: [ - .package(url: "https://github.com/apple/swift-mmio", branch: "main") - ], - targets: [ - .executableTarget( - name: "Application", - dependencies: ["STM32F7X6", "Support"], - swiftSettings: [ - .enableExperimentalFeature("InlineArrayTypeSugar"), - .enableExperimentalFeature("SymbolLinkageMarkers"), - ]), - // SVD2Swift \ - // --input Sources/STM32F7X6/stm32f7x6.patched.svd \ - // --output Sources/STM32F7X6 \ - // --access-level public \ - // --indentation-width 2 \ - // --peripherals FLASH GPIOA GPIOB GPIOC GPIOD GPIOE GPIOF GPIOG GPIOH GPIOI GPIOJ GPIOK LTDC RCC - .target( - name: "STM32F7X6", - dependencies: [ - .product(name: "MMIO", package: "swift-mmio") - ], - plugins: [ - // Plugin disabled because SwiftPM is slow. - // .plugin(name: "SVD2SwiftPlugin", package: "swift-mmio") - ]), - .target(name: "Support"), - ], - swiftLanguageModes: [.v5]) diff --git a/stm32-lcd-logo/README.md b/stm32-lcd-logo/README.md deleted file mode 100644 index 764f5998..00000000 --- a/stm32-lcd-logo/README.md +++ /dev/null @@ -1,34 +0,0 @@ -# stm32-lcd-logo - - - -## How to build and run this example: - -- Connect the STM32F746G-DISCO board via the ST-LINK USB port to your Mac. -- Make sure you have a recent nightly Swift toolchain that has Embedded Swift support. -- Install the `stlink` (https://github.com/stlink-org/stlink) command line tools, e.g. via `brew install stlink`. -- Build and upload the program to flash memory of the STM: -```console -$ cd stm32-lcd-logo -$ make -$ st-flash --reset write .build/lcd-logo.bin 0x08000000 -``` -- The LCD display on the board should now be showing a bouncing animating Swift logo on a fading background, and the user LED on should be blinking. - -Resulting size of the compiled and linked binary follows (3.5 kB of code + 10 kB of pixel data): -```console -$ size -m .build/lcd-logo -Segment __TEXT: 14376 - Section __text: 3604 - Section __const: 10000 - total 13604 -Segment __DATA: 8 - Section __nl_symbol_ptr: 4 - Section __data: 4 - total 8 -Segment __VECTORS: 456 - Section __text: 456 - total 456 -Segment __LINKEDIT: 1056 -total 15896 -``` diff --git a/stm32-lcd-logo/Sources/Application/Application.swift b/stm32-lcd-logo/Sources/Application/Application.swift deleted file mode 100644 index d6ab1f67..00000000 --- a/stm32-lcd-logo/Sources/Application/Application.swift +++ /dev/null @@ -1,80 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2023 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -import STM32F7X6 -import Support - -@main -struct Application { - static let logoSize = Size( - width: LTDC.Constants.layerWidth, - height: LTDC.Constants.layerHeight) - static let displaySize = Size( - width: LTDC.Constants.displayWidth, - height: LTDC.Constants.displayHeight) - static let maxLogoPosition = Point( - x: Self.displaySize.width - Self.logoSize.width, - y: Self.displaySize.height - Self.logoSize.height) - - static func main() { - // FIXME: remove sleep hack for some bug in clock configuration - Self.delay(milliseconds: 1) - configureFlash() - initializeLTCD() - ltdc.configure() - - var logoPosition = Point(x: 100, y: 100) - var logoDelta = Point(x: 1, y: 1) - var backgroundGray: UInt8 = .min - var backgroundDelta: Int8 = -1 - - while true { - Self.delay(milliseconds: 10) - - if logoPosition.x <= 0 || logoPosition.x >= maxLogoPosition.x { - logoDelta.x *= -1 - } - if logoPosition.y <= 0 || logoPosition.y >= maxLogoPosition.y { - logoDelta.y *= -1 - } - logoPosition = logoPosition.offset(by: logoDelta) - ltdc.set(layer: 1, position: logoPosition) - - if backgroundGray == .min || backgroundGray == .max { - backgroundDelta *= -1 - } - backgroundGray = UInt8(Int16(backgroundGray) + Int16(backgroundDelta)) - ltdc.set(backgroundColor: .gray(backgroundGray)) - } - } - - static func delay(milliseconds: Int) { - for _ in 0..<100_000 * milliseconds { - nop() - } - } - - static func configureFlash() { - flash.acr.modify { $0.latency = .WS5 } - } - - static func initializeLTCD() { - rcc.cfgr.write { $0.raw.storage = 0 } - rcc.cr.modify { r, w in - w.hsion = .On - w.csson = .Off - w.raw.hseon = 1 - w.raw.pllon = 0 - w.raw.hsebyp = 0 - } - while rcc.cr.read().raw.hserdy == 0 {} - } -} diff --git a/stm32-lcd-logo/Sources/Application/Geometry/Color.swift b/stm32-lcd-logo/Sources/Application/Geometry/Color.swift deleted file mode 100644 index c553d8f2..00000000 --- a/stm32-lcd-logo/Sources/Application/Geometry/Color.swift +++ /dev/null @@ -1,18 +0,0 @@ -// -// Color.swift -// stm32-lcd-logo -// -// Created by Rauhul Varma on 3/12/25. -// - -struct Color { - var red: UInt8 - var green: UInt8 - var blue: UInt8 -} - -extension Color { - static func gray(_ value: UInt8) -> Color { - Color(red: value, green: value, blue: value) - } -} diff --git a/stm32-lcd-logo/Sources/Application/Geometry/Point.swift b/stm32-lcd-logo/Sources/Application/Geometry/Point.swift deleted file mode 100644 index 7f3a9944..00000000 --- a/stm32-lcd-logo/Sources/Application/Geometry/Point.swift +++ /dev/null @@ -1,15 +0,0 @@ -// -// Point.swift -// stm32-lcd-logo -// -// Created by Rauhul Varma on 3/12/25. -// - -struct Point { - var x: Int - var y: Int - - func offset(by: Point) -> Point { - Point(x: x + by.x, y: y + by.y) - } -} diff --git a/stm32-lcd-logo/Sources/Application/Geometry/Size.swift b/stm32-lcd-logo/Sources/Application/Geometry/Size.swift deleted file mode 100644 index 30688054..00000000 --- a/stm32-lcd-logo/Sources/Application/Geometry/Size.swift +++ /dev/null @@ -1,11 +0,0 @@ -// -// Size.swift -// stm32-lcd-logo -// -// Created by Rauhul Varma on 3/12/25. -// - -struct Size { - var width: Int - var height: Int -} diff --git a/stm32-lcd-logo/Sources/Application/HAL/GPIOA+Helpers.swift b/stm32-lcd-logo/Sources/Application/HAL/GPIOA+Helpers.swift deleted file mode 100644 index c6e978e1..00000000 --- a/stm32-lcd-logo/Sources/Application/HAL/GPIOA+Helpers.swift +++ /dev/null @@ -1,124 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2024 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -import STM32F7X6 - -extension GPIOA { - public enum Port: Int { - case a, b, c, d, e, f, g, h, i, j, k - } - - enum Mode: UInt32 { - case input = 0x0 - case output = 0x1 - case alternateFunction = 0x2 - case analog = 0x3 - } - - enum OutputType: UInt32 { - case pushPull = 0x0 - case openDrain = 0x1 - } - - enum OutputSpeed: UInt32 { - case low = 0x0 - case medium = 0x1 - case high = 0x2 - case max = 0x3 - } - - enum Pull: UInt32 { - case `none` = 0x0 - case up = 0x1 - case down = 0x2 - } - - struct Configuration { - var mode: Mode - var outputType: OutputType - var outputSpeed: OutputSpeed - var pull: Pull - var alternateFunction: UInt32 - } - - func configure(pin: Int, as configuration: Configuration) { - self.moder.modify { rw in - rw.raw.storage.set( - value: configuration.mode.rawValue, - mask: 0b11, - offset: pin * 2) - } - - // Comprised of 16 x 1 bit fields. - self.otyper.modify { rw in - rw.raw.storage.set( - value: configuration.outputType.rawValue, - mask: 0b1, - offset: pin) - } - - // Comprised of 16 x 2 bit fields. - self.ospeedr.modify { rw in - rw.raw.storage.set( - value: configuration.outputSpeed.rawValue, - mask: 0b11, - offset: pin * 2) - } - - // Comprised of 16 x 2 bit fields. - self.pupdr.modify { rw in - rw.raw.storage.set( - value: configuration.pull.rawValue, - mask: 0b11, - offset: pin * 2) - } - - // Comprised of 16 x 4 bit fields, split across 2 registers. - if pin < 8 { - self.afrl.modify { rw in - rw.raw.storage.set( - value: configuration.alternateFunction, - mask: 0b1111, - offset: pin * 4) - } - } else { - self.afrh.modify { rw in - rw.raw.storage.set( - value: configuration.alternateFunction, - mask: 0b1111, - offset: (pin - 8) * 4) - } - } - } - - func set(pin: Int, to value: Bool) { - // Lower 16 bits are set, upper 16 bits are reset. - if value { - self.bsrr.write { $0.raw.storage = 1 << pin } - } else { - self.bsrr.write { $0.raw.storage = 1 << (pin + 16) } - } - } -} - -extension UInt32 { - fileprivate func get(mask: Self, offset: UInt8) -> Self { - let mask = mask &<< offset - return (self & mask) &>> offset - } - - fileprivate mutating func set(value: Self, mask: Self, offset: Int) { - let mask = mask &<< offset - let oldValue: UInt32 = self & ~mask - let newValue: UInt32 = (value &<< offset) & mask - self = oldValue | newValue - } -} diff --git a/stm32-lcd-logo/Sources/Application/HAL/LTDC+Helpers.swift b/stm32-lcd-logo/Sources/Application/HAL/LTDC+Helpers.swift deleted file mode 100644 index 22c400bd..00000000 --- a/stm32-lcd-logo/Sources/Application/HAL/LTDC+Helpers.swift +++ /dev/null @@ -1,654 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2024 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -import STM32F7X6 -import Support - -extension LTDC { - enum Constants { - static let hsync = 30 - static let vsync = 10 - static let hbp = 13 - static let hfp = 32 - static let vbp = 2 - static let vfp = 2 - - static let pixelSize = 4 - - static let displayWidth = 480 - static let displayHeight = 272 - - static let layerWidth = 50 - static let layerHeight = 50 - } - - func configure() { - rcc.pllcfgr.write { - $0.raw.pllm = 25 - $0.raw.plln = 432 - $0.pllsrc = .HSE - } - - rcc.cr.modify { $1.raw.pllon = 1 } - while rcc.cr.read().raw.pllrdy != 1 {} - - // FIXME: use named fields - rcc.cfgr.modify { - $0.raw.storage &= 0b11 - $0.raw.storage |= 0b10 - } - while rcc.cfgr.read().raw.storage & 0b1100 != 0b1000 {} - - rcc.pllsaicfgr.modify { - $0.raw.pllsain = 192 - $0.raw.pllsair = 5 - } - rcc.dckcfgr1.modify { $0.pllsaidivr = .Div4 } - - rcc.cr.modify { $1.raw.pllsaion = 1 } - while rcc.cr.read().raw.pllsairdy != 1 {} - - rcc.enableGPIOPortClock(.a) - rcc.enableGPIOPortClock(.b) - rcc.enableGPIOPortClock(.c) - rcc.enableGPIOPortClock(.d) - rcc.enableGPIOPortClock(.e) - rcc.enableGPIOPortClock(.f) - rcc.enableGPIOPortClock(.g) - rcc.enableGPIOPortClock(.h) - rcc.enableGPIOPortClock(.i) - rcc.enableGPIOPortClock(.j) - rcc.enableGPIOPortClock(.k) - - let pinConfiguration = GPIOA.Configuration( - mode: .alternateFunction, - outputType: .pushPull, - outputSpeed: .high, - pull: .none, - alternateFunction: 14) - - let clkPin = 14 - let dePin = 7 - let hsyncPin = 10 - let vsyncPin = 9 - - gpioi.configure(pin: clkPin, as: pinConfiguration) - gpiok.configure(pin: dePin, as: pinConfiguration) - gpioi.configure(pin: hsyncPin, as: pinConfiguration) - gpioi.configure(pin: vsyncPin, as: pinConfiguration) - - let r0Pin = 15 - let r1Pin = 0 - let r2Pin = 1 - let r3Pin = 2 - let r4Pin = 3 - let r5Pin = 4 - let r6Pin = 5 - let r7Pin = 6 - - gpioi.configure(pin: r0Pin, as: pinConfiguration) - gpioj.configure(pin: r1Pin, as: pinConfiguration) - gpioj.configure(pin: r2Pin, as: pinConfiguration) - gpioj.configure(pin: r3Pin, as: pinConfiguration) - gpioj.configure(pin: r4Pin, as: pinConfiguration) - gpioj.configure(pin: r5Pin, as: pinConfiguration) - gpioj.configure(pin: r6Pin, as: pinConfiguration) - gpioj.configure(pin: r7Pin, as: pinConfiguration) - - let g0Pin = 7 - let g1Pin = 8 - let g2Pin = 9 - let g3Pin = 10 - let g4Pin = 11 - let g5Pin = 0 - let g6Pin = 1 - let g7Pin = 2 - - gpioj.configure(pin: g0Pin, as: pinConfiguration) - gpioj.configure(pin: g1Pin, as: pinConfiguration) - gpioj.configure(pin: g2Pin, as: pinConfiguration) - gpioj.configure(pin: g3Pin, as: pinConfiguration) - gpioj.configure(pin: g4Pin, as: pinConfiguration) - gpiok.configure(pin: g5Pin, as: pinConfiguration) - gpiok.configure(pin: g6Pin, as: pinConfiguration) - gpiok.configure(pin: g7Pin, as: pinConfiguration) - - let b0Pin = 4 - let b1Pin = 13 - let b2Pin = 14 - let b3Pin = 15 - let b4Pin = 12 - let b5Pin = 4 - let b6Pin = 5 - let b7Pin = 6 - - gpioe.configure(pin: b0Pin, as: pinConfiguration) - gpioj.configure(pin: b1Pin, as: pinConfiguration) - gpioj.configure(pin: b2Pin, as: pinConfiguration) - gpioj.configure(pin: b3Pin, as: pinConfiguration) - gpiog.configure(pin: b4Pin, as: pinConfiguration) - gpiok.configure(pin: b5Pin, as: pinConfiguration) - gpiok.configure(pin: b6Pin, as: pinConfiguration) - gpiok.configure(pin: b7Pin, as: pinConfiguration) - - let lcdPinConfiguration = GPIOA.Configuration( - mode: .output, - outputType: .pushPull, - outputSpeed: .low, - pull: .down, - alternateFunction: 0) - - let backlightPin = 3 - let lcdDispPin = 12 - - gpiok.configure(pin: backlightPin, as: lcdPinConfiguration) - gpioi.configure(pin: lcdDispPin, as: lcdPinConfiguration) - - gpioi.set(pin: lcdDispPin, to: true) - gpiok.set(pin: backlightPin, to: true) - - rcc.apb2enr.modify { $0.raw.ltdcen = 1 } - - self.sscr.modify { $0.raw.vsh = UInt32(Constants.vsync - 1) } - self.sscr.modify { $0.raw.hsw = UInt32(Constants.hsync - 1) } - self.bpcr.modify { - $0.raw.ahbp = UInt32(Constants.hsync + Constants.hbp - 1) - } - self.bpcr.modify { - $0.raw.avbp = UInt32(Constants.vsync + Constants.vbp - 1) - } - self.awcr.modify { - $0.raw.aah = UInt32( - Constants.displayHeight + Constants.vsync + Constants.vbp - 1) - } - self.awcr.modify { - $0.raw.aaw = UInt32( - Constants.displayWidth + Constants.hsync + Constants.hbp - 1) - } - self.twcr.modify { - $0.raw.totalw = UInt32( - Constants.displayWidth + Constants.hsync + Constants.hbp + Constants.hfp - - 1) - } - self.twcr.modify { - $0.raw.totalh = UInt32( - Constants.displayHeight + Constants.vsync + Constants.vbp - + Constants.vfp - 1) - } - - self.layer[1].pfcr.modify { $0.raw.storage = 0 } // Format ARGB8888 - - // FIXME: Escaping a pointer like this is very unsafe. - // We get away with it because `pixelData` is a global let. - pixelData.span.withUnsafeBytes { buffer in - // swift-format-ignore: NeverForceUnwrap - let data = UInt32(UInt(bitPattern: buffer.baseAddress!)) - self.layer[1].cfbar.modify { $0.raw.storage = data } - } - self.layer[1].cacr.modify { $0.raw.consta = 255 } - self.layer[1].bfcr.modify { $0.raw.bf1 = 5 } - self.layer[1].bfcr.modify { $0.raw.bf2 = 4 } - self.layer[1].cfblr.modify { - $0.raw.storage = - UInt32(UInt32(Constants.pixelSize * Constants.layerWidth) << 16) - | UInt32(Constants.pixelSize * Constants.layerWidth + 3) - } - self.layer[1].cfblnr.modify { - $0.raw.cfblnbr = UInt32(Constants.layerHeight) - } - self.layer[1].cr.modify { $0.raw.len = 1 } - - self.srcr.modify { $0.raw.vbr = 1 } // reload - - self.gcr.modify { $1.raw.ltdcen = 1 } - } - - func set(layer: Int, position point: Point) { - let i: Int = - ((Constants.layerWidth + Constants.hbp + Constants.hsync - 1 - + point.x) << 16) | (Constants.hbp + Constants.hsync + point.x) - self.layer[layer].whpcr.modify { $0.raw.storage = UInt32(i) } - let j: Int = - ((Constants.layerHeight + Constants.vsync + Constants.vbp - 1 - + point.y) << 16) | (Constants.vsync + Constants.vbp + point.y) - self.layer[layer].wvpcr.modify { $0.raw.storage = UInt32(j) } - self.srcr.modify { $0.raw.vbr = 1 } - } - - func set(backgroundColor: Color) { - self.bccr.modify { - $0.raw.bcred = UInt32(backgroundColor.red) - $0.raw.bcgreen = UInt32(backgroundColor.green) - $0.raw.bcblue = UInt32(backgroundColor.blue) - } - } -} - -@_used -let pixelData: InlineArray<_, UInt32> = [ - 0x0000_0000, 0x0000_0000, 0x0000_0000, 0x0000_0000, 0x0000_0000, 0x0000_0000, - 0x03ff_5555, 0x3cee_5137, 0x86f0_5237, 0xbbf0_5038, 0xd6f0_5138, 0xeff0_5137, - 0xf9f0_5138, 0xfdf0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfdf0_5138, 0xf8f0_5138, 0xe6ef_5139, 0xcff0_5137, 0xb9f0_5139, 0x8bf0_5139, - 0x47f1_5339, 0x02ff_8000, 0x0000_0000, 0x0000_0000, 0x0000_0000, 0x0000_0000, - 0x0000_0000, 0x0000_0000, 0x0000_0000, 0x0000_0000, 0x0000_0000, 0x0000_0000, - 0x0000_0000, 0x5df1_5237, 0xe4f0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xe1f0_5038, 0x57f0_5238, 0x0000_0000, - 0x0000_0000, 0x0000_0000, 0x0000_0000, 0x0000_0000, 0x0000_0000, 0x0000_0000, - 0x0000_0000, 0x15f3_553d, 0xb2f1_5238, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0x9df0_5137, 0x0be8_462e, 0x0000_0000, 0x0000_0000, 0x0000_0000, - 0x0000_0000, 0x0000_0000, 0x0be8_462e, 0xd4f1_5139, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xd1f0_5138, 0x0be8_462e, - 0x0000_0000, 0x0000_0000, 0x0000_0000, 0x0000_0000, 0x9df0_5137, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0x9df0_5137, 0x0000_0000, 0x0000_0000, 0x0000_0000, 0x57f0_5238, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0x57f0_5238, 0x0000_0000, - 0x02ff_8000, 0xe1f0_5038, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xe1f0_5038, 0x02ff_8000, 0x47f1_5339, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff4_7b68, 0xfff1_6049, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0x47f1_5339, 0x8cf0_5038, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff1_5941, 0xfffc_ddd8, 0xfff4_8573, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0x8cf0_5038, - 0xb9f0_5139, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff5_8c7b, - 0xffff_ffff, 0xfff8_ada1, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xb9f0_5139, 0xd0f0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff2_6b56, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfffb_d1ca, 0xffff_ffff, 0xfff9_b9af, 0xfff0_523a, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xcff0_5137, 0xe6ef_5139, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff1_5941, - 0xfff7_9f91, 0xfff0_5239, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff3_7461, 0xffff_ffff, - 0xffff_ffff, 0xfffa_c4bb, 0xfff0_533a, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xe6ef_5139, - 0xf9f0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_563e, 0xfff2_6852, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff3_7662, 0xfff9_bab0, 0xfff0_523a, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfffc_dad5, 0xffff_ffff, 0xffff_ffff, 0xfff8_b1a6, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xf8f0_5138, 0xfdf0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff4_8573, - 0xfff4_806e, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff7_a193, - 0xfffa_c4bb, 0xfff0_553d, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff6_9788, 0xffff_ffff, 0xffff_ffff, - 0xffff_ffff, 0xfff5_9080, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfdf0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff9_bbb2, 0xfff6_998b, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5239, 0xfffb_cdc6, 0xfffb_d2cb, 0xfff1_5b43, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff2_634c, - 0xffff_fefe, 0xffff_ffff, 0xffff_ffff, 0xffff_faf9, 0xfff3_705c, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff1_5941, 0xfffc_e0db, - 0xfff9_b7ad, 0xfff0_543c, 0xfff0_5138, 0xfff0_5138, 0xfff1_5d46, 0xfffd_eae7, - 0xfffc_dfda, 0xfff2_634c, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfffc_e0dc, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, - 0xfffc_d7d2, 0xfff0_5239, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff2_6751, 0xfffe_f2f0, 0xfffc_d8d3, 0xfff2_634d, 0xfff0_5138, - 0xfff0_5138, 0xfff3_7561, 0xffff_fafa, 0xfffd_ebe8, 0xfff3_705b, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff9_bfb6, 0xffff_ffff, - 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xfff6_9282, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff4_7e6c, 0xffff_fcfc, - 0xfffe_f0ee, 0xfff4_7d6b, 0xfff0_5138, 0xfff0_5138, 0xfff6_9484, 0xffff_ffff, - 0xfffe_f7f6, 0xfff5_8675, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff7_a294, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xfffe_f0ee, - 0xfff1_5840, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff6_9c8e, 0xffff_ffff, 0xffff_fdfd, 0xfff7_a294, 0xfff0_5138, - 0xfff0_5138, 0xfff9_b6ab, 0xffff_ffff, 0xffff_fefd, 0xfff7_a295, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff6_9384, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, - 0xffff_ffff, 0xffff_ffff, 0xfff6_9586, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff9_b8ae, 0xffff_ffff, - 0xffff_ffff, 0xfffb_cbc4, 0xfff1_5e47, 0xfff0_543b, 0xfffb_cec7, 0xffff_ffff, - 0xffff_ffff, 0xfffa_c6bd, 0xfff1_5941, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff5_8a79, 0xffff_ffff, - 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xfffc_ddd8, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_533a, 0xfffb_cbc4, 0xffff_ffff, 0xffff_ffff, 0xfffd_edea, 0xfff4_7d6b, - 0xfff1_5941, 0xfffc_ded9, 0xffff_ffff, 0xffff_ffff, 0xfffd_e4e0, 0xfff2_6d58, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff5_9080, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, - 0xffff_ffff, 0xfff3_7561, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff1_5941, 0xfffc_dcd6, 0xffff_ffff, - 0xffff_ffff, 0xffff_fefe, 0xfff8_b0a4, 0xfff2_6751, 0xfffd_eae7, 0xffff_ffff, - 0xffff_ffff, 0xfffe_f7f6, 0xfff6_9383, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff6_9b8d, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, - 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xfff7_a699, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff1_614a, 0xfffd_e9e6, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xfffc_e2dd, - 0xfff6_9181, 0xfffe_f3f2, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xfffa_c2b9, - 0xfff1_5b44, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff9_b9af, 0xffff_ffff, - 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xfffb_cfc8, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff2_6c56, 0xfffe_efed, 0xffff_ffff, - 0xffff_ffff, 0xffff_ffff, 0xffff_fdfd, 0xfffc_e0db, 0xffff_ffff, 0xffff_ffff, - 0xffff_ffff, 0xffff_ffff, 0xfffd_ebe8, 0xfff4_7d6a, 0xfff0_5138, 0xfff0_5138, - 0xfffc_dcd7, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, - 0xffff_ffff, 0xfffe_f5f4, 0xfff0_523a, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff2_6e59, 0xfffe_f0ee, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, - 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_fefe, - 0xfff9_b7ac, 0xfff2_6c57, 0xffff_fefd, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, - 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xfff1_5f48, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff3_6f5a, 0xfffe_f1ef, 0xffff_ffff, - 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, - 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_fcfb, 0xffff_ffff, 0xffff_ffff, - 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, - 0xfff2_6953, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff3_705b, 0xfffe_f1ef, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, - 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, - 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, - 0xffff_ffff, 0xffff_ffff, 0xfff3_725e, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff3_715d, 0xfffe_efec, 0xffff_ffff, - 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, - 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, - 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xfff3_6f5a, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_543b, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff2_654f, 0xfffc_e0dc, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, - 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, - 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_fefe, - 0xfff1_573f, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff5_8c7c, 0xfff5_8675, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff1_5a42, 0xfffb_cec7, 0xffff_ffff, - 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, - 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, - 0xffff_ffff, 0xfffd_ece9, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5239, - 0xfffb_d0c9, 0xfffb_cdc6, 0xfff2_6a54, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_533a, 0xfff9_b7ad, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, - 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, - 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xfffb_cfc8, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff1_614a, 0xfffe_efed, 0xffff_fafa, 0xfff8_b1a6, - 0xfff2_6953, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff2_654f, 0xfffd_e5e1, 0xffff_ffff, - 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, - 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xfffe_f5f3, - 0xfff2_654f, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff3_705c, - 0xfffe_f2f0, 0xffff_ffff, 0xffff_fefe, 0xfffb_d0c9, 0xfff6_9889, 0xfff2_6650, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_523a, 0xfff4_7e6c, 0xfff9_bcb3, 0xffff_fafa, - 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, - 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, - 0xffff_ffff, 0xffff_ffff, 0xfffb_d2cb, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff3_715d, 0xfffe_f2f0, 0xffff_ffff, 0xffff_ffff, - 0xffff_ffff, 0xffff_ffff, 0xfffd_ebe8, 0xfffb_cec7, 0xfff9_b5aa, 0xfff8_aa9d, - 0xfff7_a396, 0xfff8_ab9f, 0xfff9_b8ae, 0xfffb_d5cf, 0xfffe_f6f5, 0xffff_ffff, - 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, - 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, - 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xfff4_8473, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff3_725d, - 0xfffe_efec, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, - 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, - 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, - 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, - 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, - 0xffff_ffff, 0xfffc_d7d2, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff1_614a, 0xfffb_d0c9, 0xffff_ffff, 0xffff_ffff, - 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, - 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, - 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, - 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, - 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xfff2_6852, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfdf0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_523a, - 0xfff7_a598, 0xffff_fdfd, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, - 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, - 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, - 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, - 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, - 0xfff6_9b8d, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfdf0_5138, 0xf8f0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff3_6e5a, 0xfffa_c9c1, 0xffff_ffff, - 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, - 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, - 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, - 0xffff_ffff, 0xfffd_ece9, 0xfffa_c8c0, 0xfff9_beb5, 0xfffb_d3cc, 0xffff_fafa, - 0xffff_ffff, 0xffff_ffff, 0xfff9_bcb3, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xf8f0_5138, 0xe6ef_5139, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff3_7763, 0xfffb_d2cb, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, - 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, - 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, - 0xffff_ffff, 0xfffa_c9c1, 0xfff4_7f6c, 0xfff0_5239, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff1_624c, 0xfffa_c6bd, 0xffff_ffff, 0xfffb_d0c9, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xe6ef_5139, - 0xcff0_5137, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff2_6c57, - 0xfff8_aea2, 0xfffd_e5e1, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, - 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, 0xffff_ffff, - 0xfffd_ebe8, 0xfff8_aa9d, 0xfff2_6953, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5239, 0xfffa_c3ba, - 0xfffb_d1cb, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xcff0_5137, 0xb9f0_5139, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff2_654f, 0xfff5_8d7d, - 0xfff8_a99d, 0xfffa_c0b7, 0xfffa_cac3, 0xfffb_cfc8, 0xfff9_bdb4, 0xfff8_a99d, - 0xfff6_9585, 0xfff3_7966, 0xfff0_5239, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff1_5d45, 0xfff7_9d8f, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xb9f0_5139, 0x8bf0_5139, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0x8bf0_5139, - 0x47f1_5339, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0x47f1_5339, 0x02ff_8000, 0xe1f0_5038, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xe1f0_5038, 0x02ff_8000, 0x0000_0000, 0x57f0_5238, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0x57f0_5238, 0x0000_0000, - 0x0000_0000, 0x0000_0000, 0x9df0_5137, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0x9df0_5137, - 0x0000_0000, 0x0000_0000, 0x0000_0000, 0x0000_0000, 0x0be8_462e, 0xd1f0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xd1f0_5138, 0x0be8_462e, 0x0000_0000, 0x0000_0000, 0x0000_0000, 0x0000_0000, - 0x0000_0000, 0x0be8_462e, 0x9df0_5137, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0x9df0_5137, 0x0be8_462e, 0x0000_0000, 0x0000_0000, 0x0000_0000, - 0x0000_0000, 0x0000_0000, 0x0000_0000, 0x0000_0000, 0x0000_0000, 0x57f0_5238, - 0xe1f0_5038, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xe1f0_5038, 0x57f0_5238, 0x0000_0000, 0x0000_0000, 0x0000_0000, - 0x0000_0000, 0x0000_0000, 0x0000_0000, 0x0000_0000, 0x0000_0000, 0x0000_0000, - 0x0000_0000, 0x0000_0000, 0x02ff_8000, 0x47f1_5339, 0x8cf0_5038, 0xb9f0_5139, - 0xd0f0_5138, 0xe6ef_5139, 0xf8f0_5138, 0xfdf0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, 0xfff0_5138, - 0xfff0_5138, 0xfff0_5138, 0xfdf0_5138, 0xf8f0_5138, 0xe6ef_5139, 0xd0f0_5138, - 0xb9f0_5139, 0x8cf0_5038, 0x47f1_5339, 0x02ff_8000, 0x0000_0000, 0x0000_0000, - 0x0000_0000, 0x0000_0000, 0x0000_0000, 0x0000_0000, -] diff --git a/stm32-lcd-logo/Sources/Application/HAL/RCC+Helpers.swift b/stm32-lcd-logo/Sources/Application/HAL/RCC+Helpers.swift deleted file mode 100644 index e7eb20c3..00000000 --- a/stm32-lcd-logo/Sources/Application/HAL/RCC+Helpers.swift +++ /dev/null @@ -1,66 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2024 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -import STM32F7X6 - -extension RCC { - func enableGPIOPortClock(_ port: GPIOA.Port) { - switch port { - case .a: self.ahb1enr.modify { $0.raw.gpioaen = 1 } - case .b: self.ahb1enr.modify { $0.raw.gpioben = 1 } - case .c: self.ahb1enr.modify { $0.raw.gpiocen = 1 } - case .d: self.ahb1enr.modify { $0.raw.gpioden = 1 } - case .e: self.ahb1enr.modify { $0.raw.gpioeen = 1 } - case .f: self.ahb1enr.modify { $0.raw.gpiofen = 1 } - case .g: self.ahb1enr.modify { $0.raw.gpiogen = 1 } - case .h: self.ahb1enr.modify { $0.raw.gpiohen = 1 } - case .i: self.ahb1enr.modify { $0.raw.gpioien = 1 } - case .j: self.ahb1enr.modify { $0.raw.gpiojen = 1 } - case .k: self.ahb1enr.modify { $0.raw.gpioken = 1 } - } - } - - func enableUARTClock(_ uartNum: UInt8) { - switch uartNum { - case 1: self.apb2enr.modify { $0.raw.usart1en = 1 } - case 2: self.apb1enr.modify { $0.raw.usart2en = 1 } - case 3: self.apb1enr.modify { $0.raw.usart3en = 1 } - case 4: self.apb1enr.modify { $0.raw.uart4en = 1 } - case 5: self.apb1enr.modify { $0.raw.uart5en = 1 } - case 6: self.apb2enr.modify { $0.raw.usart6en = 1 } - case 7: self.apb1enr.modify { $0.raw.uart7en = 1 } - case 8: self.apb1enr.modify { $0.raw.uart8en = 1 } - default: fatalError("Invalid UART number") - } - } - - func enableI2CClock(_ i2cNum: UInt8) { - switch i2cNum { - case 1: self.apb1enr.modify { $0.raw.i2c1en = 1 } - case 2: self.apb1enr.modify { $0.raw.i2c2en = 1 } - case 3: self.apb1enr.modify { $0.raw.i2c3en = 1 } - case 4: self.apb1enr.modify { $0.raw.i2c4en = 1 } - default: fatalError("Invalid I2C number") - } - } - - func enableSPIClock(_ spiNum: UInt8) { - switch spiNum { - case 1: self.apb2enr.modify { $0.raw.spi1en = 1 } - case 2: self.apb1enr.modify { $0.raw.spi2en = 1 } - case 3: self.apb1enr.modify { $0.raw.spi3en = 1 } - case 4: self.apb2enr.modify { $0.raw.spi4en = 1 } - case 5: self.apb2enr.modify { $0.raw.spi5en = 1 } - case 6: self.apb2enr.modify { $0.raw.spi6en = 1 } - default: fatalError("Invalid SPI number") - } - } -} diff --git a/stm32-lcd-logo/Sources/STM32F7X6/Device.swift b/stm32-lcd-logo/Sources/STM32F7X6/Device.swift deleted file mode 100644 index 3166a664..00000000 --- a/stm32-lcd-logo/Sources/STM32F7X6/Device.swift +++ /dev/null @@ -1,45 +0,0 @@ -// Generated by svd2swift. - -import MMIO - -/// FLASH -public let flash = FLASH(unsafeAddress: 0x40023c00) - -/// General-purpose I/Os -public let gpioa = GPIOA(unsafeAddress: 0x40020000) - -/// General-purpose I/Os -public let gpiob = GPIOB(unsafeAddress: 0x40020400) - -/// General-purpose I/Os -public let gpioc = GPIOC(unsafeAddress: 0x40020800) - -/// General-purpose I/Os -public let gpiod = GPIOD(unsafeAddress: 0x40020c00) - -/// General-purpose I/Os -public let gpioe = GPIOE(unsafeAddress: 0x40021000) - -/// General-purpose I/Os -public let gpiof = GPIOF(unsafeAddress: 0x40021400) - -/// General-purpose I/Os -public let gpiog = GPIOG(unsafeAddress: 0x40021800) - -/// General-purpose I/Os -public let gpioh = GPIOH(unsafeAddress: 0x40021c00) - -/// General-purpose I/Os -public let gpioi = GPIOI(unsafeAddress: 0x40022000) - -/// General-purpose I/Os -public let gpioj = GPIOJ(unsafeAddress: 0x40022400) - -/// General-purpose I/Os -public let gpiok = GPIOK(unsafeAddress: 0x40022800) - -/// LCD-TFT Controller -public let ltdc = LTDC(unsafeAddress: 0x40016800) - -/// Reset and clock control -public let rcc = RCC(unsafeAddress: 0x40023800) diff --git a/stm32-lcd-logo/Sources/STM32F7X6/Empty.swift b/stm32-lcd-logo/Sources/STM32F7X6/Empty.swift deleted file mode 100644 index 934a795a..00000000 --- a/stm32-lcd-logo/Sources/STM32F7X6/Empty.swift +++ /dev/null @@ -1,13 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2024 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -// This file is intentionally left empty for SwiftPM to recognize the target as -// a Swift source module. diff --git a/stm32-lcd-logo/Sources/STM32F7X6/FLASH.swift b/stm32-lcd-logo/Sources/STM32F7X6/FLASH.swift deleted file mode 100644 index 1903ed94..00000000 --- a/stm32-lcd-logo/Sources/STM32F7X6/FLASH.swift +++ /dev/null @@ -1,469 +0,0 @@ -// Generated by svd2swift. - -import MMIO - -/// FLASH -@RegisterBlock -public struct FLASH { - /// Flash access control register - @RegisterBlock(offset: 0x0) - public var acr: Register - - /// Flash key register - @RegisterBlock(offset: 0x4) - public var keyr: Register - - /// Flash option key register - @RegisterBlock(offset: 0x8) - public var optkeyr: Register - - /// Status register - @RegisterBlock(offset: 0xc) - public var sr: Register - - /// Control register - @RegisterBlock(offset: 0x10) - public var cr: Register - - /// Flash option control register - @RegisterBlock(offset: 0x14) - public var optcr: Register - - /// Flash option control register 1 - @RegisterBlock(offset: 0x18) - public var optcr1: Register -} - -extension FLASH { - /// Flash access control register - @Register(bitWidth: 32) - public struct ACR { - /// Latency - @ReadWrite(bits: 0..<4, as: LATENCYValues.self) - public var latency: LATENCY - - /// Prefetch enable - @ReadWrite(bits: 8..<9, as: PRFTENValues.self) - public var prften: PRFTEN - - /// ART Accelerator Enable - @ReadWrite(bits: 9..<10, as: ARTENValues.self) - public var arten: ARTEN - - /// ART Accelerator reset - @ReadWrite(bits: 11..<12, as: ARTRSTValues.self) - public var artrst: ARTRST - } - - /// Flash key register - @Register(bitWidth: 32) - public struct KEYR { - /// FPEC key - @WriteOnly(bits: 0..<32) - public var key: KEY - } - - /// Flash option key register - @Register(bitWidth: 32) - public struct OPTKEYR { - /// Option byte key - @WriteOnly(bits: 0..<32) - public var optkeyr_field: OPTKEYR_FIELD - } - - /// Status register - @Register(bitWidth: 32) - public struct SR { - /// End of operation - @ReadWrite(bits: 0..<1) - public var eop: EOP - - /// Operation error - @ReadWrite(bits: 1..<2) - public var operr: OPERR - - /// Write protection error - @ReadWrite(bits: 4..<5) - public var wrperr: WRPERR - - /// Programming alignment error - @ReadWrite(bits: 5..<6) - public var pgaerr: PGAERR - - /// Programming parallelism error - @ReadWrite(bits: 6..<7) - public var pgperr: PGPERR - - /// Programming sequence error - @ReadWrite(bits: 7..<8) - public var erserr: ERSERR - - /// Busy - @ReadOnly(bits: 16..<17) - public var bsy: BSY - } - - /// Control register - @Register(bitWidth: 32) - public struct CR { - /// Programming - @ReadWrite(bits: 0..<1, as: PGValues.self) - public var pg: PG - - /// Sector Erase - @ReadWrite(bits: 1..<2, as: SERValues.self) - public var ser: SER - - /// Mass Erase of sectors 0 to 11 - @ReadWrite(bits: 2..<3, as: MERValues.self) - public var mer: MER - - /// Sector number - @ReadWrite(bits: 3..<7) - public var snb: SNB - - /// Program size - @ReadWrite(bits: 8..<10, as: PSIZEValues.self) - public var psize: PSIZE - - /// Start - @ReadWrite(bits: 16..<17, as: STRTValues.self) - public var strt: STRT - - /// End of operation interrupt enable - @ReadWrite(bits: 24..<25, as: EOPIEValues.self) - public var eopie: EOPIE - - /// Error interrupt enable - @ReadWrite(bits: 25..<26, as: ERRIEValues.self) - public var errie: ERRIE - - /// Lock - @ReadWrite(bits: 31..<32, as: LOCKValues.self) - public var lock: LOCK - } - - /// Flash option control register - @Register(bitWidth: 32) - public struct OPTCR { - /// Option lock - @ReadWrite(bits: 0..<1) - public var optlock: OPTLOCK - - /// Option start - @ReadWrite(bits: 1..<2) - public var optstrt: OPTSTRT - - /// BOR reset Level - @ReadWrite(bits: 2..<4) - public var bor_lev: BOR_LEV - - /// User option bytes - @ReadWrite(bits: 4..<5) - public var wwdg_sw: WWDG_SW - - /// User option bytes - @ReadWrite(bits: 5..<6) - public var iwdg_sw: IWDG_SW - - /// User option bytes - @ReadWrite(bits: 6..<7) - public var nrst_stop: nRST_STOP - - /// User option bytes - @ReadWrite(bits: 7..<8) - public var nrst_stdby: nRST_STDBY - - /// Read protect - @ReadWrite(bits: 8..<16) - public var rdp: RDP - - /// Not write protect - @ReadWrite(bits: 16..<24) - public var nwrp: nWRP - - /// Independent watchdog counter freeze in standby mode - @ReadWrite(bits: 30..<31) - public var iwdg_stdby: IWDG_STDBY - - /// Independent watchdog counter freeze in Stop mode - @ReadWrite(bits: 31..<32) - public var iwdg_stop: IWDG_STOP - } - - /// Flash option control register 1 - @Register(bitWidth: 32) - public struct OPTCR1 { - /// Boot base address when Boot pin =0 - @ReadWrite(bits: 0..<16) - public var boot_add0: BOOT_ADD0 - - /// Boot base address when Boot pin =1 - @ReadWrite(bits: 16..<32) - public var boot_add1: BOOT_ADD1 - } -} - -extension FLASH.ACR { - public struct LATENCYValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 4 - - /// 0 wait states - public static let WS0 = Self(rawValue: 0x0) - - /// 1 wait states - public static let WS1 = Self(rawValue: 0x1) - - /// 2 wait states - public static let WS2 = Self(rawValue: 0x2) - - /// 3 wait states - public static let WS3 = Self(rawValue: 0x3) - - /// 4 wait states - public static let WS4 = Self(rawValue: 0x4) - - /// 5 wait states - public static let WS5 = Self(rawValue: 0x5) - - /// 6 wait states - public static let WS6 = Self(rawValue: 0x6) - - /// 7 wait states - public static let WS7 = Self(rawValue: 0x7) - - /// 8 wait states - public static let WS8 = Self(rawValue: 0x8) - - /// 9 wait states - public static let WS9 = Self(rawValue: 0x9) - - /// 10 wait states - public static let WS10 = Self(rawValue: 0xa) - - /// 11 wait states - public static let WS11 = Self(rawValue: 0xb) - - /// 12 wait states - public static let WS12 = Self(rawValue: 0xc) - - /// 13 wait states - public static let WS13 = Self(rawValue: 0xd) - - /// 14 wait states - public static let WS14 = Self(rawValue: 0xe) - - /// 15 wait states - public static let WS15 = Self(rawValue: 0xf) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension FLASH.ACR { - public struct PRFTENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Prefetch is disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Prefetch is enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension FLASH.ACR { - public struct ARTENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// ART Accelerator is disabled - public static let Disabled = Self(rawValue: 0x0) - - /// ART Accelerator is enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension FLASH.ACR { - public struct ARTRSTValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Accelerator is not reset - public static let NotReset = Self(rawValue: 0x0) - - /// Accelerator is reset - public static let Reset = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension FLASH.CR { - public struct PGValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Flash programming activated - public static let Program = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension FLASH.CR { - public struct SERValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Erase activated for selected sector - public static let SectorErase = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension FLASH.CR { - public struct MERValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Erase activated for all user sectors - public static let MassErase = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension FLASH.CR { - public struct PSIZEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// Program x8 - public static let PSIZE8 = Self(rawValue: 0x0) - - /// Program x16 - public static let PSIZE16 = Self(rawValue: 0x1) - - /// Program x32 - public static let PSIZE32 = Self(rawValue: 0x2) - - /// Program x64 - public static let PSIZE64 = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension FLASH.CR { - public struct STRTValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Trigger an erase operation - public static let Start = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension FLASH.CR { - public struct EOPIEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// End of operation interrupt disabled - public static let Disabled = Self(rawValue: 0x0) - - /// End of operation interrupt enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension FLASH.CR { - public struct ERRIEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Error interrupt generation disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Error interrupt generation enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension FLASH.CR { - public struct LOCKValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// FLASH_CR register is unlocked - public static let Unlocked = Self(rawValue: 0x0) - - /// FLASH_CR register is locked - public static let Locked = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} diff --git a/stm32-lcd-logo/Sources/STM32F7X6/GPIOA.swift b/stm32-lcd-logo/Sources/STM32F7X6/GPIOA.swift deleted file mode 100644 index a70e68c7..00000000 --- a/stm32-lcd-logo/Sources/STM32F7X6/GPIOA.swift +++ /dev/null @@ -1,1075 +0,0 @@ -// Generated by svd2swift. - -import MMIO - -/// General-purpose I/Os -@RegisterBlock -public struct GPIOA { - /// GPIO port mode register - @RegisterBlock(offset: 0x0) - public var moder: Register - - /// GPIO port output type register - @RegisterBlock(offset: 0x4) - public var otyper: Register - - /// GPIO port output speed register - @RegisterBlock(offset: 0x8) - public var ospeedr: Register - - /// GPIO port pull-up/pull-down register - @RegisterBlock(offset: 0xc) - public var pupdr: Register - - /// GPIO port input data register - @RegisterBlock(offset: 0x10) - public var idr: Register - - /// GPIO port output data register - @RegisterBlock(offset: 0x14) - public var odr: Register - - /// GPIO port bit set/reset register - @RegisterBlock(offset: 0x18) - public var bsrr: Register - - /// GPIO port configuration lock register - @RegisterBlock(offset: 0x1c) - public var lckr: Register - - /// GPIO alternate function low register - @RegisterBlock(offset: 0x20) - public var afrl: Register - - /// GPIO alternate function high register - @RegisterBlock(offset: 0x24) - public var afrh: Register - - /// GPIO port bit reset register - @RegisterBlock(offset: 0x28) - public var brr: Register -} - -extension GPIOA { - /// GPIO port mode register - @Register(bitWidth: 32) - public struct MODER { - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 30..<32) - public var moder15: MODER15 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 28..<30) - public var moder14: MODER14 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 26..<28) - public var moder13: MODER13 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 24..<26) - public var moder12: MODER12 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 22..<24) - public var moder11: MODER11 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 20..<22) - public var moder10: MODER10 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 18..<20) - public var moder9: MODER9 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 16..<18) - public var moder8: MODER8 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 14..<16) - public var moder7: MODER7 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 12..<14) - public var moder6: MODER6 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 10..<12) - public var moder5: MODER5 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 8..<10) - public var moder4: MODER4 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 6..<8) - public var moder3: MODER3 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 4..<6) - public var moder2: MODER2 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 2..<4) - public var moder1: MODER1 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 0..<2, as: MODER0Values.self) - public var moder0: MODER0 - } - - /// GPIO port output type register - @Register(bitWidth: 32) - public struct OTYPER { - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 15..<16) - public var ot15: OT15 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 14..<15) - public var ot14: OT14 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 13..<14) - public var ot13: OT13 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 12..<13) - public var ot12: OT12 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 11..<12) - public var ot11: OT11 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 10..<11) - public var ot10: OT10 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 9..<10) - public var ot9: OT9 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 8..<9) - public var ot8: OT8 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 7..<8) - public var ot7: OT7 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 6..<7) - public var ot6: OT6 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 5..<6) - public var ot5: OT5 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 4..<5) - public var ot4: OT4 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 3..<4) - public var ot3: OT3 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 2..<3) - public var ot2: OT2 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 1..<2) - public var ot1: OT1 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 0..<1, as: OT0Values.self) - public var ot0: OT0 - } - - /// GPIO port output speed register - @Register(bitWidth: 32) - public struct OSPEEDR { - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 30..<32) - public var ospeedr15: OSPEEDR15 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 28..<30) - public var ospeedr14: OSPEEDR14 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 26..<28) - public var ospeedr13: OSPEEDR13 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 24..<26) - public var ospeedr12: OSPEEDR12 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 22..<24) - public var ospeedr11: OSPEEDR11 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 20..<22) - public var ospeedr10: OSPEEDR10 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 18..<20) - public var ospeedr9: OSPEEDR9 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 16..<18) - public var ospeedr8: OSPEEDR8 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 14..<16) - public var ospeedr7: OSPEEDR7 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 12..<14) - public var ospeedr6: OSPEEDR6 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 10..<12) - public var ospeedr5: OSPEEDR5 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 8..<10) - public var ospeedr4: OSPEEDR4 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 6..<8) - public var ospeedr3: OSPEEDR3 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 4..<6) - public var ospeedr2: OSPEEDR2 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 2..<4) - public var ospeedr1: OSPEEDR1 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 0..<2, as: OSPEEDR0Values.self) - public var ospeedr0: OSPEEDR0 - } - - /// GPIO port pull-up/pull-down register - @Register(bitWidth: 32) - public struct PUPDR { - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 30..<32) - public var pupdr15: PUPDR15 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 28..<30) - public var pupdr14: PUPDR14 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 26..<28) - public var pupdr13: PUPDR13 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 24..<26) - public var pupdr12: PUPDR12 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 22..<24) - public var pupdr11: PUPDR11 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 20..<22) - public var pupdr10: PUPDR10 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 18..<20) - public var pupdr9: PUPDR9 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 16..<18) - public var pupdr8: PUPDR8 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 14..<16) - public var pupdr7: PUPDR7 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 12..<14) - public var pupdr6: PUPDR6 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 10..<12) - public var pupdr5: PUPDR5 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 8..<10) - public var pupdr4: PUPDR4 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 6..<8) - public var pupdr3: PUPDR3 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 4..<6) - public var pupdr2: PUPDR2 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 2..<4) - public var pupdr1: PUPDR1 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 0..<2, as: PUPDR0Values.self) - public var pupdr0: PUPDR0 - } - - /// GPIO port input data register - @Register(bitWidth: 32) - public struct IDR { - /// Port input data (y = 0..15) - @ReadOnly(bits: 15..<16) - public var idr15: IDR15 - - /// Port input data (y = 0..15) - @ReadOnly(bits: 14..<15) - public var idr14: IDR14 - - /// Port input data (y = 0..15) - @ReadOnly(bits: 13..<14) - public var idr13: IDR13 - - /// Port input data (y = 0..15) - @ReadOnly(bits: 12..<13) - public var idr12: IDR12 - - /// Port input data (y = 0..15) - @ReadOnly(bits: 11..<12) - public var idr11: IDR11 - - /// Port input data (y = 0..15) - @ReadOnly(bits: 10..<11) - public var idr10: IDR10 - - /// Port input data (y = 0..15) - @ReadOnly(bits: 9..<10) - public var idr9: IDR9 - - /// Port input data (y = 0..15) - @ReadOnly(bits: 8..<9) - public var idr8: IDR8 - - /// Port input data (y = 0..15) - @ReadOnly(bits: 7..<8) - public var idr7: IDR7 - - /// Port input data (y = 0..15) - @ReadOnly(bits: 6..<7) - public var idr6: IDR6 - - /// Port input data (y = 0..15) - @ReadOnly(bits: 5..<6) - public var idr5: IDR5 - - /// Port input data (y = 0..15) - @ReadOnly(bits: 4..<5) - public var idr4: IDR4 - - /// Port input data (y = 0..15) - @ReadOnly(bits: 3..<4) - public var idr3: IDR3 - - /// Port input data (y = 0..15) - @ReadOnly(bits: 2..<3) - public var idr2: IDR2 - - /// Port input data (y = 0..15) - @ReadOnly(bits: 1..<2) - public var idr1: IDR1 - - /// Port input data (y = 0..15) - @ReadOnly(bits: 0..<1) - public var idr0: IDR0 - } - - /// GPIO port output data register - @Register(bitWidth: 32) - public struct ODR { - /// Port output data (y = 0..15) - @ReadWrite(bits: 15..<16) - public var odr15: ODR15 - - /// Port output data (y = 0..15) - @ReadWrite(bits: 14..<15) - public var odr14: ODR14 - - /// Port output data (y = 0..15) - @ReadWrite(bits: 13..<14) - public var odr13: ODR13 - - /// Port output data (y = 0..15) - @ReadWrite(bits: 12..<13) - public var odr12: ODR12 - - /// Port output data (y = 0..15) - @ReadWrite(bits: 11..<12) - public var odr11: ODR11 - - /// Port output data (y = 0..15) - @ReadWrite(bits: 10..<11) - public var odr10: ODR10 - - /// Port output data (y = 0..15) - @ReadWrite(bits: 9..<10) - public var odr9: ODR9 - - /// Port output data (y = 0..15) - @ReadWrite(bits: 8..<9) - public var odr8: ODR8 - - /// Port output data (y = 0..15) - @ReadWrite(bits: 7..<8) - public var odr7: ODR7 - - /// Port output data (y = 0..15) - @ReadWrite(bits: 6..<7) - public var odr6: ODR6 - - /// Port output data (y = 0..15) - @ReadWrite(bits: 5..<6) - public var odr5: ODR5 - - /// Port output data (y = 0..15) - @ReadWrite(bits: 4..<5) - public var odr4: ODR4 - - /// Port output data (y = 0..15) - @ReadWrite(bits: 3..<4) - public var odr3: ODR3 - - /// Port output data (y = 0..15) - @ReadWrite(bits: 2..<3) - public var odr2: ODR2 - - /// Port output data (y = 0..15) - @ReadWrite(bits: 1..<2) - public var odr1: ODR1 - - /// Port output data (y = 0..15) - @ReadWrite(bits: 0..<1, as: ODR0Values.self) - public var odr0: ODR0 - } - - /// GPIO port bit set/reset register - @Register(bitWidth: 32) - public struct BSRR { - /// Port x reset bit y (y = 0..15) - @WriteOnly(bits: 31..<32) - public var br15: BR15 - - /// Port x reset bit y (y = 0..15) - @WriteOnly(bits: 30..<31) - public var br14: BR14 - - /// Port x reset bit y (y = 0..15) - @WriteOnly(bits: 29..<30) - public var br13: BR13 - - /// Port x reset bit y (y = 0..15) - @WriteOnly(bits: 28..<29) - public var br12: BR12 - - /// Port x reset bit y (y = 0..15) - @WriteOnly(bits: 27..<28) - public var br11: BR11 - - /// Port x reset bit y (y = 0..15) - @WriteOnly(bits: 26..<27) - public var br10: BR10 - - /// Port x reset bit y (y = 0..15) - @WriteOnly(bits: 25..<26) - public var br9: BR9 - - /// Port x reset bit y (y = 0..15) - @WriteOnly(bits: 24..<25) - public var br8: BR8 - - /// Port x reset bit y (y = 0..15) - @WriteOnly(bits: 23..<24) - public var br7: BR7 - - /// Port x reset bit y (y = 0..15) - @WriteOnly(bits: 22..<23) - public var br6: BR6 - - /// Port x reset bit y (y = 0..15) - @WriteOnly(bits: 21..<22) - public var br5: BR5 - - /// Port x reset bit y (y = 0..15) - @WriteOnly(bits: 20..<21) - public var br4: BR4 - - /// Port x reset bit y (y = 0..15) - @WriteOnly(bits: 19..<20) - public var br3: BR3 - - /// Port x reset bit y (y = 0..15) - @WriteOnly(bits: 18..<19) - public var br2: BR2 - - /// Port x reset bit y (y = 0..15) - @WriteOnly(bits: 17..<18) - public var br1: BR1 - - /// Port x set bit y (y= 0..15) - @WriteOnly(bits: 16..<17) - public var br0: BR0 - - /// Port x set bit y (y= 0..15) - @WriteOnly(bits: 15..<16) - public var bs15: BS15 - - /// Port x set bit y (y= 0..15) - @WriteOnly(bits: 14..<15) - public var bs14: BS14 - - /// Port x set bit y (y= 0..15) - @WriteOnly(bits: 13..<14) - public var bs13: BS13 - - /// Port x set bit y (y= 0..15) - @WriteOnly(bits: 12..<13) - public var bs12: BS12 - - /// Port x set bit y (y= 0..15) - @WriteOnly(bits: 11..<12) - public var bs11: BS11 - - /// Port x set bit y (y= 0..15) - @WriteOnly(bits: 10..<11) - public var bs10: BS10 - - /// Port x set bit y (y= 0..15) - @WriteOnly(bits: 9..<10) - public var bs9: BS9 - - /// Port x set bit y (y= 0..15) - @WriteOnly(bits: 8..<9) - public var bs8: BS8 - - /// Port x set bit y (y= 0..15) - @WriteOnly(bits: 7..<8) - public var bs7: BS7 - - /// Port x set bit y (y= 0..15) - @WriteOnly(bits: 6..<7) - public var bs6: BS6 - - /// Port x set bit y (y= 0..15) - @WriteOnly(bits: 5..<6) - public var bs5: BS5 - - /// Port x set bit y (y= 0..15) - @WriteOnly(bits: 4..<5) - public var bs4: BS4 - - /// Port x set bit y (y= 0..15) - @WriteOnly(bits: 3..<4) - public var bs3: BS3 - - /// Port x set bit y (y= 0..15) - @WriteOnly(bits: 2..<3) - public var bs2: BS2 - - /// Port x set bit y (y= 0..15) - @WriteOnly(bits: 1..<2) - public var bs1: BS1 - - /// Port x set bit y (y= 0..15) - @WriteOnly(bits: 0..<1) - public var bs0: BS0 - } - - /// GPIO port configuration lock register - @Register(bitWidth: 32) - public struct LCKR { - /// Port x lock bit y (y= 0..15) - @ReadWrite(bits: 16..<17, as: LCKKValues.self) - public var lckk: LCKK - - /// Port x lock bit y (y= 0..15) - @ReadWrite(bits: 15..<16) - public var lck15: LCK15 - - /// Port x lock bit y (y= 0..15) - @ReadWrite(bits: 14..<15) - public var lck14: LCK14 - - /// Port x lock bit y (y= 0..15) - @ReadWrite(bits: 13..<14) - public var lck13: LCK13 - - /// Port x lock bit y (y= 0..15) - @ReadWrite(bits: 12..<13) - public var lck12: LCK12 - - /// Port x lock bit y (y= 0..15) - @ReadWrite(bits: 11..<12) - public var lck11: LCK11 - - /// Port x lock bit y (y= 0..15) - @ReadWrite(bits: 10..<11) - public var lck10: LCK10 - - /// Port x lock bit y (y= 0..15) - @ReadWrite(bits: 9..<10) - public var lck9: LCK9 - - /// Port x lock bit y (y= 0..15) - @ReadWrite(bits: 8..<9) - public var lck8: LCK8 - - /// Port x lock bit y (y= 0..15) - @ReadWrite(bits: 7..<8) - public var lck7: LCK7 - - /// Port x lock bit y (y= 0..15) - @ReadWrite(bits: 6..<7) - public var lck6: LCK6 - - /// Port x lock bit y (y= 0..15) - @ReadWrite(bits: 5..<6) - public var lck5: LCK5 - - /// Port x lock bit y (y= 0..15) - @ReadWrite(bits: 4..<5) - public var lck4: LCK4 - - /// Port x lock bit y (y= 0..15) - @ReadWrite(bits: 3..<4) - public var lck3: LCK3 - - /// Port x lock bit y (y= 0..15) - @ReadWrite(bits: 2..<3) - public var lck2: LCK2 - - /// Port x lock bit y (y= 0..15) - @ReadWrite(bits: 1..<2) - public var lck1: LCK1 - - /// Port x lock bit y (y= 0..15) - @ReadWrite(bits: 0..<1, as: LCK0Values.self) - public var lck0: LCK0 - } - - /// GPIO alternate function low register - @Register(bitWidth: 32) - public struct AFRL { - /// Alternate function selection for port x bit y (y = 0..7) - @ReadWrite(bits: 28..<32) - public var afrl7: AFRL7 - - /// Alternate function selection for port x bit y (y = 0..7) - @ReadWrite(bits: 24..<28) - public var afrl6: AFRL6 - - /// Alternate function selection for port x bit y (y = 0..7) - @ReadWrite(bits: 20..<24) - public var afrl5: AFRL5 - - /// Alternate function selection for port x bit y (y = 0..7) - @ReadWrite(bits: 16..<20) - public var afrl4: AFRL4 - - /// Alternate function selection for port x bit y (y = 0..7) - @ReadWrite(bits: 12..<16) - public var afrl3: AFRL3 - - /// Alternate function selection for port x bit y (y = 0..7) - @ReadWrite(bits: 8..<12) - public var afrl2: AFRL2 - - /// Alternate function selection for port x bit y (y = 0..7) - @ReadWrite(bits: 4..<8) - public var afrl1: AFRL1 - - /// Alternate function selection for port x bit y (y = 0..7) - @ReadWrite(bits: 0..<4, as: AFRL0Values.self) - public var afrl0: AFRL0 - } - - /// GPIO alternate function high register - @Register(bitWidth: 32) - public struct AFRH { - /// Alternate function selection for port x bit y (y = 8..15) - @ReadWrite(bits: 28..<32) - public var afrh15: AFRH15 - - /// Alternate function selection for port x bit y (y = 8..15) - @ReadWrite(bits: 24..<28) - public var afrh14: AFRH14 - - /// Alternate function selection for port x bit y (y = 8..15) - @ReadWrite(bits: 20..<24) - public var afrh13: AFRH13 - - /// Alternate function selection for port x bit y (y = 8..15) - @ReadWrite(bits: 16..<20) - public var afrh12: AFRH12 - - /// Alternate function selection for port x bit y (y = 8..15) - @ReadWrite(bits: 12..<16) - public var afrh11: AFRH11 - - /// Alternate function selection for port x bit y (y = 8..15) - @ReadWrite(bits: 8..<12) - public var afrh10: AFRH10 - - /// Alternate function selection for port x bit y (y = 8..15) - @ReadWrite(bits: 4..<8) - public var afrh9: AFRH9 - - /// Alternate function selection for port x bit y (y = 8..15) - @ReadWrite(bits: 0..<4, as: AFRH8Values.self) - public var afrh8: AFRH8 - } - - /// GPIO port bit reset register - @Register(bitWidth: 32) - public struct BRR { - /// Port A Reset bit 0 - @ReadWrite(bits: 0..<1) - public var br0: BR0 - - /// Port A Reset bit 1 - @ReadWrite(bits: 1..<2) - public var br1: BR1 - - /// Port A Reset bit 2 - @ReadWrite(bits: 2..<3) - public var br2: BR2 - - /// Port A Reset bit 3 - @ReadWrite(bits: 3..<4) - public var br3: BR3 - - /// Port A Reset bit 4 - @ReadWrite(bits: 4..<5) - public var br4: BR4 - - /// Port A Reset bit 5 - @ReadWrite(bits: 5..<6) - public var br5: BR5 - - /// Port A Reset bit 6 - @ReadWrite(bits: 6..<7) - public var br6: BR6 - - /// Port A Reset bit 7 - @ReadWrite(bits: 7..<8) - public var br7: BR7 - - /// Port A Reset bit 8 - @ReadWrite(bits: 8..<9) - public var br8: BR8 - - /// Port A Reset bit 9 - @ReadWrite(bits: 9..<10) - public var br9: BR9 - - /// Port A Reset bit 10 - @ReadWrite(bits: 10..<11) - public var br10: BR10 - - /// Port A Reset bit 11 - @ReadWrite(bits: 11..<12) - public var br11: BR11 - - /// Port A Reset bit 12 - @ReadWrite(bits: 12..<13) - public var br12: BR12 - - /// Port A Reset bit 13 - @ReadWrite(bits: 13..<14) - public var br13: BR13 - - /// Port A Reset bit 14 - @ReadWrite(bits: 14..<15) - public var br14: BR14 - - /// Port A Reset bit 15 - @ReadWrite(bits: 15..<16) - public var br15: BR15 - } -} - -extension GPIOA.MODER { - public struct MODER0Values: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// Input mode (reset state) - public static let Input = Self(rawValue: 0x0) - - /// General purpose output mode - public static let Output = Self(rawValue: 0x1) - - /// Alternate function mode - public static let Alternate = Self(rawValue: 0x2) - - /// Analog mode - public static let Analog = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension GPIOA.OTYPER { - public struct OT0Values: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Output push-pull (reset state) - public static let PushPull = Self(rawValue: 0x0) - - /// Output open-drain - public static let OpenDrain = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension GPIOA.OSPEEDR { - public struct OSPEEDR0Values: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// Low speed - public static let LowSpeed = Self(rawValue: 0x0) - - /// Medium speed - public static let MediumSpeed = Self(rawValue: 0x1) - - /// High speed - public static let HighSpeed = Self(rawValue: 0x2) - - /// Very high speed - public static let VeryHighSpeed = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension GPIOA.PUPDR { - public struct PUPDR0Values: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// No pull-up, pull-down - public static let Floating = Self(rawValue: 0x0) - - /// Pull-up - public static let PullUp = Self(rawValue: 0x1) - - /// Pull-down - public static let PullDown = Self(rawValue: 0x2) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension GPIOA.ODR { - public struct ODR0Values: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Set output to logic low - public static let Low = Self(rawValue: 0x0) - - /// Set output to logic high - public static let High = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension GPIOA.LCKR { - public struct LCKKValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Port configuration lock key not active - public static let NotActive = Self(rawValue: 0x0) - - /// Port configuration lock key active - public static let Active = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension GPIOA.LCKR { - public struct LCK0Values: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Port configuration not locked - public static let Unlocked = Self(rawValue: 0x0) - - /// Port configuration locked - public static let Locked = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension GPIOA.AFRL { - public struct AFRL0Values: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 4 - - /// AF0 - public static let AF0 = Self(rawValue: 0x0) - - /// AF1 - public static let AF1 = Self(rawValue: 0x1) - - /// AF2 - public static let AF2 = Self(rawValue: 0x2) - - /// AF3 - public static let AF3 = Self(rawValue: 0x3) - - /// AF4 - public static let AF4 = Self(rawValue: 0x4) - - /// AF5 - public static let AF5 = Self(rawValue: 0x5) - - /// AF6 - public static let AF6 = Self(rawValue: 0x6) - - /// AF7 - public static let AF7 = Self(rawValue: 0x7) - - /// AF8 - public static let AF8 = Self(rawValue: 0x8) - - /// AF9 - public static let AF9 = Self(rawValue: 0x9) - - /// AF10 - public static let AF10 = Self(rawValue: 0xa) - - /// AF11 - public static let AF11 = Self(rawValue: 0xb) - - /// AF12 - public static let AF12 = Self(rawValue: 0xc) - - /// AF13 - public static let AF13 = Self(rawValue: 0xd) - - /// AF14 - public static let AF14 = Self(rawValue: 0xe) - - /// AF15 - public static let AF15 = Self(rawValue: 0xf) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension GPIOA.AFRH { - public struct AFRH8Values: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 4 - - /// AF0 - public static let AF0 = Self(rawValue: 0x0) - - /// AF1 - public static let AF1 = Self(rawValue: 0x1) - - /// AF2 - public static let AF2 = Self(rawValue: 0x2) - - /// AF3 - public static let AF3 = Self(rawValue: 0x3) - - /// AF4 - public static let AF4 = Self(rawValue: 0x4) - - /// AF5 - public static let AF5 = Self(rawValue: 0x5) - - /// AF6 - public static let AF6 = Self(rawValue: 0x6) - - /// AF7 - public static let AF7 = Self(rawValue: 0x7) - - /// AF8 - public static let AF8 = Self(rawValue: 0x8) - - /// AF9 - public static let AF9 = Self(rawValue: 0x9) - - /// AF10 - public static let AF10 = Self(rawValue: 0xa) - - /// AF11 - public static let AF11 = Self(rawValue: 0xb) - - /// AF12 - public static let AF12 = Self(rawValue: 0xc) - - /// AF13 - public static let AF13 = Self(rawValue: 0xd) - - /// AF14 - public static let AF14 = Self(rawValue: 0xe) - - /// AF15 - public static let AF15 = Self(rawValue: 0xf) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} diff --git a/stm32-lcd-logo/Sources/STM32F7X6/GPIOB.swift b/stm32-lcd-logo/Sources/STM32F7X6/GPIOB.swift deleted file mode 100644 index bd0a35ba..00000000 --- a/stm32-lcd-logo/Sources/STM32F7X6/GPIOB.swift +++ /dev/null @@ -1,7 +0,0 @@ -// Generated by svd2swift. - -import MMIO - -/// General-purpose I/Os -public typealias GPIOB = GPIOA - diff --git a/stm32-lcd-logo/Sources/STM32F7X6/GPIOC.swift b/stm32-lcd-logo/Sources/STM32F7X6/GPIOC.swift deleted file mode 100644 index c46e6690..00000000 --- a/stm32-lcd-logo/Sources/STM32F7X6/GPIOC.swift +++ /dev/null @@ -1,7 +0,0 @@ -// Generated by svd2swift. - -import MMIO - -/// General-purpose I/Os -public typealias GPIOC = GPIOA - diff --git a/stm32-lcd-logo/Sources/STM32F7X6/GPIOD.swift b/stm32-lcd-logo/Sources/STM32F7X6/GPIOD.swift deleted file mode 100644 index d51ac802..00000000 --- a/stm32-lcd-logo/Sources/STM32F7X6/GPIOD.swift +++ /dev/null @@ -1,7 +0,0 @@ -// Generated by svd2swift. - -import MMIO - -/// General-purpose I/Os -public typealias GPIOD = GPIOA - diff --git a/stm32-lcd-logo/Sources/STM32F7X6/GPIOE.swift b/stm32-lcd-logo/Sources/STM32F7X6/GPIOE.swift deleted file mode 100644 index c78fa87f..00000000 --- a/stm32-lcd-logo/Sources/STM32F7X6/GPIOE.swift +++ /dev/null @@ -1,7 +0,0 @@ -// Generated by svd2swift. - -import MMIO - -/// General-purpose I/Os -public typealias GPIOE = GPIOA - diff --git a/stm32-lcd-logo/Sources/STM32F7X6/GPIOF.swift b/stm32-lcd-logo/Sources/STM32F7X6/GPIOF.swift deleted file mode 100644 index f4dce7fb..00000000 --- a/stm32-lcd-logo/Sources/STM32F7X6/GPIOF.swift +++ /dev/null @@ -1,7 +0,0 @@ -// Generated by svd2swift. - -import MMIO - -/// General-purpose I/Os -public typealias GPIOF = GPIOA - diff --git a/stm32-lcd-logo/Sources/STM32F7X6/GPIOG.swift b/stm32-lcd-logo/Sources/STM32F7X6/GPIOG.swift deleted file mode 100644 index 88fb4c6a..00000000 --- a/stm32-lcd-logo/Sources/STM32F7X6/GPIOG.swift +++ /dev/null @@ -1,7 +0,0 @@ -// Generated by svd2swift. - -import MMIO - -/// General-purpose I/Os -public typealias GPIOG = GPIOA - diff --git a/stm32-lcd-logo/Sources/STM32F7X6/GPIOH.swift b/stm32-lcd-logo/Sources/STM32F7X6/GPIOH.swift deleted file mode 100644 index 5a558ef3..00000000 --- a/stm32-lcd-logo/Sources/STM32F7X6/GPIOH.swift +++ /dev/null @@ -1,7 +0,0 @@ -// Generated by svd2swift. - -import MMIO - -/// General-purpose I/Os -public typealias GPIOH = GPIOA - diff --git a/stm32-lcd-logo/Sources/STM32F7X6/GPIOI.swift b/stm32-lcd-logo/Sources/STM32F7X6/GPIOI.swift deleted file mode 100644 index 6b2b5182..00000000 --- a/stm32-lcd-logo/Sources/STM32F7X6/GPIOI.swift +++ /dev/null @@ -1,7 +0,0 @@ -// Generated by svd2swift. - -import MMIO - -/// General-purpose I/Os -public typealias GPIOI = GPIOA - diff --git a/stm32-lcd-logo/Sources/STM32F7X6/GPIOJ.swift b/stm32-lcd-logo/Sources/STM32F7X6/GPIOJ.swift deleted file mode 100644 index 98b3c09a..00000000 --- a/stm32-lcd-logo/Sources/STM32F7X6/GPIOJ.swift +++ /dev/null @@ -1,7 +0,0 @@ -// Generated by svd2swift. - -import MMIO - -/// General-purpose I/Os -public typealias GPIOJ = GPIOA - diff --git a/stm32-lcd-logo/Sources/STM32F7X6/GPIOK.swift b/stm32-lcd-logo/Sources/STM32F7X6/GPIOK.swift deleted file mode 100644 index c1f074b8..00000000 --- a/stm32-lcd-logo/Sources/STM32F7X6/GPIOK.swift +++ /dev/null @@ -1,7 +0,0 @@ -// Generated by svd2swift. - -import MMIO - -/// General-purpose I/Os -public typealias GPIOK = GPIOA - diff --git a/stm32-lcd-logo/Sources/STM32F7X6/LTDC.swift b/stm32-lcd-logo/Sources/STM32F7X6/LTDC.swift deleted file mode 100644 index 7dd4bf0a..00000000 --- a/stm32-lcd-logo/Sources/STM32F7X6/LTDC.swift +++ /dev/null @@ -1,847 +0,0 @@ -// Generated by svd2swift. - -import MMIO - -/// LCD-TFT Controller -@RegisterBlock -public struct LTDC { - /// Synchronization Size Configuration Register - @RegisterBlock(offset: 0x8) - public var sscr: Register - - /// Back Porch Configuration Register - @RegisterBlock(offset: 0xc) - public var bpcr: Register - - /// Active Width Configuration Register - @RegisterBlock(offset: 0x10) - public var awcr: Register - - /// Total Width Configuration Register - @RegisterBlock(offset: 0x14) - public var twcr: Register - - /// Global Control Register - @RegisterBlock(offset: 0x18) - public var gcr: Register - - /// Shadow Reload Configuration Register - @RegisterBlock(offset: 0x24) - public var srcr: Register - - /// Background Color Configuration Register - @RegisterBlock(offset: 0x2c) - public var bccr: Register - - /// Interrupt Enable Register - @RegisterBlock(offset: 0x34) - public var ier: Register - - /// Interrupt Status Register - @RegisterBlock(offset: 0x38) - public var isr: Register - - /// Interrupt Clear Register - @RegisterBlock(offset: 0x3c) - public var icr: Register - - /// Line Interrupt Position Configuration Register - @RegisterBlock(offset: 0x40) - public var lipcr: Register - - /// Current Position Status Register - @RegisterBlock(offset: 0x44) - public var cpsr: Register - - /// Current Display Status Register - @RegisterBlock(offset: 0x48) - public var cdsr: Register - - /// Cluster LAYER%s, containing L?CR, L?WHPCR, L?WVPCR, L?CKCR, L?PFCR, L?CACR, L?DCCR, L?BFCR, L?CFBAR, L?CFBLR, L?CFBLNR, L?CLUTWR - @RegisterBlock(offset: 0x84, stride: 0x80, count: 2) - public var layer: RegisterArray -} - -extension LTDC { - /// Synchronization Size Configuration Register - @Register(bitWidth: 32) - public struct SSCR { - /// Horizontal Synchronization Width (in units of pixel clock period) - @ReadWrite(bits: 16..<28) - public var hsw: HSW - - /// Vertical Synchronization Height (in units of horizontal scan line) - @ReadWrite(bits: 0..<11) - public var vsh: VSH - } - - /// Back Porch Configuration Register - @Register(bitWidth: 32) - public struct BPCR { - /// Accumulated Horizontal back porch (in units of pixel clock period) - @ReadWrite(bits: 16..<28) - public var ahbp: AHBP - - /// Accumulated Vertical back porch (in units of horizontal scan line) - @ReadWrite(bits: 0..<11) - public var avbp: AVBP - } - - /// Active Width Configuration Register - @Register(bitWidth: 32) - public struct AWCR { - /// Accumulated Active Width (in units of pixel clock period) - @ReadWrite(bits: 16..<28) - public var aaw: AAW - - /// Accumulated Active Height (in units of horizontal scan line) - @ReadWrite(bits: 0..<11) - public var aah: AAH - } - - /// Total Width Configuration Register - @Register(bitWidth: 32) - public struct TWCR { - /// Total Width (in units of pixel clock period) - @ReadWrite(bits: 16..<28) - public var totalw: TOTALW - - /// Total Height (in units of horizontal scan line) - @ReadWrite(bits: 0..<11) - public var totalh: TOTALH - } - - /// Global Control Register - @Register(bitWidth: 32) - public struct GCR { - /// Horizontal Synchronization Polarity - @ReadWrite(bits: 31..<32, as: HSPOLValues.self) - public var hspol: HSPOL - - /// Vertical Synchronization Polarity - @ReadWrite(bits: 30..<31, as: VSPOLValues.self) - public var vspol: VSPOL - - /// Data Enable Polarity - @ReadWrite(bits: 29..<30, as: DEPOLValues.self) - public var depol: DEPOL - - /// Pixel Clock Polarity - @ReadWrite(bits: 28..<29, as: PCPOLValues.self) - public var pcpol: PCPOL - - /// Dither Enable - @ReadWrite(bits: 16..<17, as: DENValues.self) - public var den: DEN - - /// Dither Red Width - @ReadOnly(bits: 12..<15) - public var drw: DRW - - /// Dither Green Width - @ReadOnly(bits: 8..<11) - public var dgw: DGW - - /// Dither Blue Width - @ReadOnly(bits: 4..<7) - public var dbw: DBW - - /// LCD-TFT controller enable bit - @ReadWrite(bits: 0..<1, as: LTDCENValues.self) - public var ltdcen: LTDCEN - } - - /// Shadow Reload Configuration Register - @Register(bitWidth: 32) - public struct SRCR { - /// Vertical Blanking Reload - @ReadWrite(bits: 1..<2, as: VBRValues.self) - public var vbr: VBR - - /// Immediate Reload - @ReadWrite(bits: 0..<1, as: IMRValues.self) - public var imr: IMR - } - - /// Background Color Configuration Register - @Register(bitWidth: 32) - public struct BCCR { - /// Background color blue value - @ReadWrite(bits: 0..<8) - public var bcblue: BCBLUE - - /// Background color green value - @ReadWrite(bits: 8..<16) - public var bcgreen: BCGREEN - - /// Background color red value - @ReadWrite(bits: 16..<24) - public var bcred: BCRED - } - - /// Interrupt Enable Register - @Register(bitWidth: 32) - public struct IER { - /// Register Reload interrupt enable - @ReadWrite(bits: 3..<4, as: RRIEValues.self) - public var rrie: RRIE - - /// Transfer Error Interrupt Enable - @ReadWrite(bits: 2..<3, as: TERRIEValues.self) - public var terrie: TERRIE - - /// FIFO Underrun Interrupt Enable - @ReadWrite(bits: 1..<2, as: FUIEValues.self) - public var fuie: FUIE - - /// Line Interrupt Enable - @ReadWrite(bits: 0..<1, as: LIEValues.self) - public var lie: LIE - } - - /// Interrupt Status Register - @Register(bitWidth: 32) - public struct ISR { - /// Register Reload Interrupt Flag - @ReadOnly(bits: 3..<4) - public var rrif: RRIF - - /// Transfer Error interrupt flag - @ReadOnly(bits: 2..<3) - public var terrif: TERRIF - - /// FIFO Underrun Interrupt flag - @ReadOnly(bits: 1..<2) - public var fuif: FUIF - - /// Line Interrupt flag - @ReadOnly(bits: 0..<1) - public var lif: LIF - } - - /// Interrupt Clear Register - @Register(bitWidth: 32) - public struct ICR { - /// Clears Register Reload Interrupt Flag - @WriteOnly(bits: 3..<4) - public var crrif: CRRIF - - /// Clears the Transfer Error Interrupt Flag - @WriteOnly(bits: 2..<3) - public var cterrif: CTERRIF - - /// Clears the FIFO Underrun Interrupt flag - @WriteOnly(bits: 1..<2) - public var cfuif: CFUIF - - /// Clears the Line Interrupt Flag - @WriteOnly(bits: 0..<1) - public var clif: CLIF - } - - /// Line Interrupt Position Configuration Register - @Register(bitWidth: 32) - public struct LIPCR { - /// Line Interrupt Position - @ReadWrite(bits: 0..<11) - public var lipos: LIPOS - } - - /// Current Position Status Register - @Register(bitWidth: 32) - public struct CPSR { - /// Current X Position - @ReadOnly(bits: 16..<32) - public var cxpos: CXPOS - - /// Current Y Position - @ReadOnly(bits: 0..<16) - public var cypos: CYPOS - } - - /// Current Display Status Register - @Register(bitWidth: 32) - public struct CDSR { - /// Horizontal Synchronization display Status - @ReadOnly(bits: 3..<4) - public var hsyncs: HSYNCS - - /// Vertical Synchronization display Status - @ReadOnly(bits: 2..<3) - public var vsyncs: VSYNCS - - /// Horizontal Data Enable display Status - @ReadOnly(bits: 1..<2) - public var hdes: HDES - - /// Vertical Data Enable display Status - @ReadOnly(bits: 0..<1) - public var vdes: VDES - } - - /// Cluster LAYER%s, containing L?CR, L?WHPCR, L?WVPCR, L?CKCR, L?PFCR, L?CACR, L?DCCR, L?BFCR, L?CFBAR, L?CFBLR, L?CFBLNR, L?CLUTWR - @RegisterBlock - public struct LAYER { - /// Layerx Control Register - @RegisterBlock(offset: 0x0) - public var cr: Register - - /// Layerx Window Horizontal Position Configuration Register - @RegisterBlock(offset: 0x4) - public var whpcr: Register - - /// Layerx Window Vertical Position Configuration Register - @RegisterBlock(offset: 0x8) - public var wvpcr: Register - - /// Layerx Color Keying Configuration Register - @RegisterBlock(offset: 0xc) - public var ckcr: Register - - /// Layerx Pixel Format Configuration Register - @RegisterBlock(offset: 0x10) - public var pfcr: Register - - /// Layerx Constant Alpha Configuration Register - @RegisterBlock(offset: 0x14) - public var cacr: Register - - /// Layerx Default Color Configuration Register - @RegisterBlock(offset: 0x18) - public var dccr: Register - - /// Layerx Blending Factors Configuration Register - @RegisterBlock(offset: 0x1c) - public var bfcr: Register - - /// Layerx Color Frame Buffer Address Register - @RegisterBlock(offset: 0x28) - public var cfbar: Register - - /// Layerx Color Frame Buffer Length Register - @RegisterBlock(offset: 0x2c) - public var cfblr: Register - - /// Layerx ColorFrame Buffer Line Number Register - @RegisterBlock(offset: 0x30) - public var cfblnr: Register - - /// Layerx CLUT Write Register - @RegisterBlock(offset: 0x40) - public var clutwr: Register - } -} - -extension LTDC.LAYER { - /// Layerx Control Register - @Register(bitWidth: 32) - public struct CR { - /// Color Look-Up Table Enable - @ReadWrite(bits: 4..<5, as: CLUTENValues.self) - public var cluten: CLUTEN - - /// Color Keying Enable - @ReadWrite(bits: 1..<2, as: COLKENValues.self) - public var colken: COLKEN - - /// Layer Enable - @ReadWrite(bits: 0..<1, as: LENValues.self) - public var len: LEN - } - - /// Layerx Window Horizontal Position Configuration Register - @Register(bitWidth: 32) - public struct WHPCR { - /// Window Horizontal Stop Position - @ReadWrite(bits: 16..<28) - public var whsppos: WHSPPOS - - /// Window Horizontal Start Position - @ReadWrite(bits: 0..<12) - public var whstpos: WHSTPOS - } - - /// Layerx Window Vertical Position Configuration Register - @Register(bitWidth: 32) - public struct WVPCR { - /// Window Vertical Stop Position - @ReadWrite(bits: 16..<27) - public var wvsppos: WVSPPOS - - /// Window Vertical Start Position - @ReadWrite(bits: 0..<11) - public var wvstpos: WVSTPOS - } - - /// Layerx Color Keying Configuration Register - @Register(bitWidth: 32) - public struct CKCR { - /// Color Key Red value - @ReadWrite(bits: 16..<24) - public var ckred: CKRED - - /// Color Key Green value - @ReadWrite(bits: 8..<16) - public var ckgreen: CKGREEN - - /// Color Key Blue value - @ReadWrite(bits: 0..<8) - public var ckblue: CKBLUE - } - - /// Layerx Pixel Format Configuration Register - @Register(bitWidth: 32) - public struct PFCR { - /// Pixel Format - @ReadWrite(bits: 0..<3, as: PFValues.self) - public var pf: PF - } - - /// Layerx Constant Alpha Configuration Register - @Register(bitWidth: 32) - public struct CACR { - /// Constant Alpha - @ReadWrite(bits: 0..<8) - public var consta: CONSTA - } - - /// Layerx Default Color Configuration Register - @Register(bitWidth: 32) - public struct DCCR { - /// Default Color Alpha - @ReadWrite(bits: 24..<32) - public var dcalpha: DCALPHA - - /// Default Color Red - @ReadWrite(bits: 16..<24) - public var dcred: DCRED - - /// Default Color Green - @ReadWrite(bits: 8..<16) - public var dcgreen: DCGREEN - - /// Default Color Blue - @ReadWrite(bits: 0..<8) - public var dcblue: DCBLUE - } - - /// Layerx Blending Factors Configuration Register - @Register(bitWidth: 32) - public struct BFCR { - /// Blending Factor 1 - @ReadWrite(bits: 8..<11, as: BF1Values.self) - public var bf1: BF1 - - /// Blending Factor 2 - @ReadWrite(bits: 0..<3, as: BF2Values.self) - public var bf2: BF2 - } - - /// Layerx Color Frame Buffer Address Register - @Register(bitWidth: 32) - public struct CFBAR { - /// Color Frame Buffer Start Address - @ReadWrite(bits: 0..<32) - public var cfbadd: CFBADD - } - - /// Layerx Color Frame Buffer Length Register - @Register(bitWidth: 32) - public struct CFBLR { - /// Color Frame Buffer Pitch in bytes - @ReadWrite(bits: 16..<29) - public var cfbp: CFBP - - /// Color Frame Buffer Line Length - @ReadWrite(bits: 0..<13) - public var cfbll: CFBLL - } - - /// Layerx ColorFrame Buffer Line Number Register - @Register(bitWidth: 32) - public struct CFBLNR { - /// Frame Buffer Line Number - @ReadWrite(bits: 0..<11) - public var cfblnbr: CFBLNBR - } - - /// Layerx CLUT Write Register - @Register(bitWidth: 32) - public struct CLUTWR { - /// CLUT Address - @WriteOnly(bits: 24..<32) - public var clutadd: CLUTADD - - /// Red value - @WriteOnly(bits: 16..<24) - public var red: RED - - /// Green value - @WriteOnly(bits: 8..<16) - public var green: GREEN - - /// Blue value - @WriteOnly(bits: 0..<8) - public var blue: BLUE - } -} - -extension LTDC.GCR { - public struct HSPOLValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Horizontal synchronization polarity is active low - public static let ActiveLow = Self(rawValue: 0x0) - - /// Horizontal synchronization polarity is active high - public static let ActiveHigh = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension LTDC.GCR { - public struct VSPOLValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Vertical synchronization polarity is active low - public static let ActiveLow = Self(rawValue: 0x0) - - /// Vertical synchronization polarity is active high - public static let ActiveHigh = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension LTDC.GCR { - public struct DEPOLValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Data enable polarity is active low - public static let ActiveLow = Self(rawValue: 0x0) - - /// Data enable polarity is active high - public static let ActiveHigh = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension LTDC.GCR { - public struct PCPOLValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Pixel clock on rising edge - public static let RisingEdge = Self(rawValue: 0x0) - - /// Pixel clock on falling edge - public static let FallingEdge = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension LTDC.GCR { - public struct DENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Dither disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Dither enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension LTDC.GCR { - public struct LTDCENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// LCD-TFT controller disabled - public static let Disabled = Self(rawValue: 0x0) - - /// LCD-TFT controller enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension LTDC.SRCR { - public struct VBRValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// This bit is set by software and cleared only by hardware after reload (it cannot be cleared through register write once it is set) - public static let NoEffect = Self(rawValue: 0x0) - - /// The shadow registers are reloaded during the vertical blanking period (at the beginning of the first line after the active display area). - public static let Reload = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension LTDC.SRCR { - public struct IMRValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// This bit is set by software and cleared only by hardware after reload (it cannot be cleared through register write once it is set) - public static let NoEffect = Self(rawValue: 0x0) - - /// The shadow registers are reloaded immediately. This bit is set by software and cleared only by hardware after reload - public static let Reload = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension LTDC.IER { - public struct RRIEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Register reload interrupt disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Register reload interrupt enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension LTDC.IER { - public struct TERRIEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Transfer error interrupt disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Transfer error interrupt enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension LTDC.IER { - public struct FUIEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// FIFO underrun interrupt disabled - public static let Disabled = Self(rawValue: 0x0) - - /// FIFO underrun interrupt enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension LTDC.IER { - public struct LIEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Line interrupt disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Line interrupt enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension LTDC.LAYER.CR { - public struct CLUTENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Color look-up table disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Color look-up table enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension LTDC.LAYER.CR { - public struct COLKENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Color keying disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Color keying enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension LTDC.LAYER.CR { - public struct LENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Layer disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Layer enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension LTDC.LAYER.PFCR { - public struct PFValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 3 - - /// ARGB8888 - public static let ARGB8888 = Self(rawValue: 0x0) - - /// RGB888 - public static let RGB888 = Self(rawValue: 0x1) - - /// RGB565 - public static let RGB565 = Self(rawValue: 0x2) - - /// ARGB1555 - public static let ARGB1555 = Self(rawValue: 0x3) - - /// ARGB4444 - public static let ARGB4444 = Self(rawValue: 0x4) - - /// L8 (8-bit luminance) - public static let L8 = Self(rawValue: 0x5) - - /// AL44 (4-bit alpha, 4-bit luminance) - public static let AL44 = Self(rawValue: 0x6) - - /// AL88 (8-bit alpha, 8-bit luminance) - public static let AL88 = Self(rawValue: 0x7) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension LTDC.LAYER.BFCR { - public struct BF1Values: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 3 - - /// BF1 = constant alpha - public static let Constant = Self(rawValue: 0x4) - - /// BF1 = pixel alpha * constant alpha - public static let Pixel = Self(rawValue: 0x6) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension LTDC.LAYER.BFCR { - public struct BF2Values: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 3 - - /// BF2 = 1 - constant alpha - public static let Constant = Self(rawValue: 0x5) - - /// BF2 = 1 - pixel alpha * constant alpha - public static let Pixel = Self(rawValue: 0x7) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} diff --git a/stm32-lcd-logo/Sources/STM32F7X6/RCC.swift b/stm32-lcd-logo/Sources/STM32F7X6/RCC.swift deleted file mode 100644 index 4a36aea8..00000000 --- a/stm32-lcd-logo/Sources/STM32F7X6/RCC.swift +++ /dev/null @@ -1,2833 +0,0 @@ -// Generated by svd2swift. - -import MMIO - -/// Reset and clock control -@RegisterBlock -public struct RCC { - /// clock control register - @RegisterBlock(offset: 0x0) - public var cr: Register - - /// PLL configuration register - @RegisterBlock(offset: 0x4) - public var pllcfgr: Register - - /// clock configuration register - @RegisterBlock(offset: 0x8) - public var cfgr: Register - - /// clock interrupt register - @RegisterBlock(offset: 0xc) - public var cir: Register - - /// AHB1 peripheral reset register - @RegisterBlock(offset: 0x10) - public var ahb1rstr: Register - - /// AHB2 peripheral reset register - @RegisterBlock(offset: 0x14) - public var ahb2rstr: Register - - /// AHB3 peripheral reset register - @RegisterBlock(offset: 0x18) - public var ahb3rstr: Register - - /// APB1 peripheral reset register - @RegisterBlock(offset: 0x20) - public var apb1rstr: Register - - /// APB2 peripheral reset register - @RegisterBlock(offset: 0x24) - public var apb2rstr: Register - - /// AHB1 peripheral clock register - @RegisterBlock(offset: 0x30) - public var ahb1enr: Register - - /// AHB2 peripheral clock enable register - @RegisterBlock(offset: 0x34) - public var ahb2enr: Register - - /// AHB3 peripheral clock enable register - @RegisterBlock(offset: 0x38) - public var ahb3enr: Register - - /// APB1 peripheral clock enable register - @RegisterBlock(offset: 0x40) - public var apb1enr: Register - - /// APB2 peripheral clock enable register - @RegisterBlock(offset: 0x44) - public var apb2enr: Register - - /// AHB1 peripheral clock enable in low power mode register - @RegisterBlock(offset: 0x50) - public var ahb1lpenr: Register - - /// AHB2 peripheral clock enable in low power mode register - @RegisterBlock(offset: 0x54) - public var ahb2lpenr: Register - - /// AHB3 peripheral clock enable in low power mode register - @RegisterBlock(offset: 0x58) - public var ahb3lpenr: Register - - /// APB1 peripheral clock enable in low power mode register - @RegisterBlock(offset: 0x60) - public var apb1lpenr: Register - - /// APB2 peripheral clock enabled in low power mode register - @RegisterBlock(offset: 0x64) - public var apb2lpenr: Register - - /// Backup domain control register - @RegisterBlock(offset: 0x70) - public var bdcr: Register - - /// clock control & status register - @RegisterBlock(offset: 0x74) - public var csr: Register - - /// spread spectrum clock generation register - @RegisterBlock(offset: 0x80) - public var sscgr: Register - - /// PLLI2S configuration register - @RegisterBlock(offset: 0x84) - public var plli2scfgr: Register - - /// PLL configuration register - @RegisterBlock(offset: 0x88) - public var pllsaicfgr: Register - - /// dedicated clocks configuration register - @RegisterBlock(offset: 0x8c) - public var dckcfgr1: Register - - /// dedicated clocks configuration register - @RegisterBlock(offset: 0x90) - public var dckcfgr2: Register -} - -extension RCC { - /// clock control register - @Register(bitWidth: 32) - public struct CR { - /// PLLI2S clock ready flag - @ReadOnly(bits: 27..<28) - public var plli2srdy: PLLI2SRDY - - /// PLLI2S enable - @ReadWrite(bits: 26..<27) - public var plli2son: PLLI2SON - - /// Main PLL (PLL) clock ready flag - @ReadOnly(bits: 25..<26) - public var pllrdy: PLLRDY - - /// Main PLL (PLL) enable - @ReadWrite(bits: 24..<25) - public var pllon: PLLON - - /// Clock security system enable - @ReadWrite(bits: 19..<20, as: CSSONValues.self) - public var csson: CSSON - - /// HSE clock bypass - @ReadWrite(bits: 18..<19, as: HSEBYPValues.self) - public var hsebyp: HSEBYP - - /// HSE clock ready flag - @ReadOnly(bits: 17..<18) - public var hserdy: HSERDY - - /// HSE clock enable - @ReadWrite(bits: 16..<17) - public var hseon: HSEON - - /// Internal high-speed clock calibration - @ReadOnly(bits: 8..<16) - public var hsical: HSICAL - - /// Internal high-speed clock trimming - @ReadWrite(bits: 3..<8) - public var hsitrim: HSITRIM - - /// Internal high-speed clock ready flag - @ReadOnly(bits: 1..<2) - public var hsirdy: HSIRDY - - /// Internal high-speed clock enable - @ReadWrite(bits: 0..<1, as: HSIONValues.self) - public var hsion: HSION - - /// PLLSAI clock ready flag - @ReadOnly(bits: 29..<30) - public var pllsairdy: PLLSAIRDY - - /// PLLSAI enable - @ReadWrite(bits: 28..<29) - public var pllsaion: PLLSAION - } - - /// PLL configuration register - @Register(bitWidth: 32) - public struct PLLCFGR { - /// Main PLL(PLL) and audio PLL (PLLI2S) entry clock source - @ReadWrite(bits: 22..<23, as: PLLSRCValues.self) - public var pllsrc: PLLSRC - - /// Division factor for the main PLL (PLL) and audio PLL (PLLI2S) input clock - @ReadWrite(bits: 0..<6) - public var pllm: PLLM - - /// Main PLL (PLL) multiplication factor for VCO - @ReadWrite(bits: 6..<15) - public var plln: PLLN - - /// Main PLL (PLL) division factor for main system clock - @ReadWrite(bits: 16..<18, as: PLLPValues.self) - public var pllp: PLLP - - /// Main PLL (PLL) division factor for USB OTG FS, SDIO and random number generator clocks - @ReadWrite(bits: 24..<28) - public var pllq: PLLQ - } - - /// clock configuration register - @Register(bitWidth: 32) - public struct CFGR { - /// Microcontroller clock output 2 - @ReadWrite(bits: 30..<32, as: MCO2Values.self) - public var mco2: MCO2 - - /// MCO2 prescaler - @ReadWrite(bits: 27..<30) - public var mco2pre: MCO2PRE - - /// MCO1 prescaler - @ReadWrite(bits: 24..<27, as: MCO1PREValues.self) - public var mco1pre: MCO1PRE - - /// I2S clock selection - @ReadWrite(bits: 23..<24, as: I2SSRCValues.self) - public var i2ssrc: I2SSRC - - /// Microcontroller clock output 1 - @ReadWrite(bits: 21..<23, as: MCO1Values.self) - public var mco1: MCO1 - - /// HSE division factor for RTC clock - @ReadWrite(bits: 16..<21) - public var rtcpre: RTCPRE - - /// APB high-speed prescaler (APB2) - @ReadWrite(bits: 13..<16) - public var ppre2: PPRE2 - - /// APB Low speed prescaler (APB1) - @ReadWrite(bits: 10..<13, as: PPRE1Values.self) - public var ppre1: PPRE1 - - /// AHB prescaler - @ReadWrite(bits: 4..<8, as: HPREValues.self) - public var hpre: HPRE - - /// System clock switch - @Reserved(bits: 0..<2, as: SWValues.self) - public var sw: SW - - /// System clock switch status - @Reserved(bits: 2..<4) - public var sws: SWS - } - - /// clock interrupt register - @Register(bitWidth: 32) - public struct CIR { - /// Clock security system interrupt clear - @WriteOnly(bits: 23..<24) - public var cssc: CSSC - - /// PLLSAI Ready Interrupt Clear - @WriteOnly(bits: 22..<23) - public var pllsairdyc: PLLSAIRDYC - - /// PLLI2S ready interrupt clear - @WriteOnly(bits: 21..<22) - public var plli2srdyc: PLLI2SRDYC - - /// Main PLL(PLL) ready interrupt clear - @WriteOnly(bits: 20..<21) - public var pllrdyc: PLLRDYC - - /// HSE ready interrupt clear - @WriteOnly(bits: 19..<20) - public var hserdyc: HSERDYC - - /// HSI ready interrupt clear - @WriteOnly(bits: 18..<19) - public var hsirdyc: HSIRDYC - - /// LSE ready interrupt clear - @WriteOnly(bits: 17..<18) - public var lserdyc: LSERDYC - - /// LSI ready interrupt clear - @WriteOnly(bits: 16..<17) - public var lsirdyc: LSIRDYC - - /// PLLSAI Ready Interrupt Enable - @ReadWrite(bits: 14..<15) - public var pllsairdyie: PLLSAIRDYIE - - /// PLLI2S ready interrupt enable - @ReadWrite(bits: 13..<14) - public var plli2srdyie: PLLI2SRDYIE - - /// Main PLL (PLL) ready interrupt enable - @ReadWrite(bits: 12..<13) - public var pllrdyie: PLLRDYIE - - /// HSE ready interrupt enable - @ReadWrite(bits: 11..<12) - public var hserdyie: HSERDYIE - - /// HSI ready interrupt enable - @ReadWrite(bits: 10..<11) - public var hsirdyie: HSIRDYIE - - /// LSE ready interrupt enable - @ReadWrite(bits: 9..<10) - public var lserdyie: LSERDYIE - - /// LSI ready interrupt enable - @ReadWrite(bits: 8..<9, as: LSIRDYIEValues.self) - public var lsirdyie: LSIRDYIE - - /// Clock security system interrupt flag - @ReadOnly(bits: 7..<8) - public var cssf: CSSF - - /// PLLSAI ready interrupt flag - @ReadOnly(bits: 6..<7) - public var pllsairdyf: PLLSAIRDYF - - /// PLLI2S ready interrupt flag - @ReadOnly(bits: 5..<6) - public var plli2srdyf: PLLI2SRDYF - - /// Main PLL (PLL) ready interrupt flag - @ReadOnly(bits: 4..<5) - public var pllrdyf: PLLRDYF - - /// HSE ready interrupt flag - @ReadOnly(bits: 3..<4) - public var hserdyf: HSERDYF - - /// HSI ready interrupt flag - @ReadOnly(bits: 2..<3) - public var hsirdyf: HSIRDYF - - /// LSE ready interrupt flag - @ReadOnly(bits: 1..<2) - public var lserdyf: LSERDYF - - /// LSI ready interrupt flag - @ReadOnly(bits: 0..<1) - public var lsirdyf: LSIRDYF - } - - /// AHB1 peripheral reset register - @Register(bitWidth: 32) - public struct AHB1RSTR { - /// USB OTG HS module reset - @ReadWrite(bits: 29..<30) - public var otghsrst: OTGHSRST - - /// Ethernet MAC reset - @ReadWrite(bits: 25..<26) - public var ethmacrst: ETHMACRST - - /// DMA2D reset - @ReadWrite(bits: 23..<24) - public var dma2drst: DMA2DRST - - /// DMA2 reset - @ReadWrite(bits: 22..<23) - public var dma2rst: DMA2RST - - /// DMA2 reset - @ReadWrite(bits: 21..<22) - public var dma1rst: DMA1RST - - /// CRC reset - @ReadWrite(bits: 12..<13) - public var crcrst: CRCRST - - /// IO port K reset - @ReadWrite(bits: 10..<11) - public var gpiokrst: GPIOKRST - - /// IO port J reset - @ReadWrite(bits: 9..<10) - public var gpiojrst: GPIOJRST - - /// IO port I reset - @ReadWrite(bits: 8..<9) - public var gpioirst: GPIOIRST - - /// IO port H reset - @ReadWrite(bits: 7..<8) - public var gpiohrst: GPIOHRST - - /// IO port G reset - @ReadWrite(bits: 6..<7) - public var gpiogrst: GPIOGRST - - /// IO port F reset - @ReadWrite(bits: 5..<6) - public var gpiofrst: GPIOFRST - - /// IO port E reset - @ReadWrite(bits: 4..<5) - public var gpioerst: GPIOERST - - /// IO port D reset - @ReadWrite(bits: 3..<4) - public var gpiodrst: GPIODRST - - /// IO port C reset - @ReadWrite(bits: 2..<3) - public var gpiocrst: GPIOCRST - - /// IO port B reset - @ReadWrite(bits: 1..<2) - public var gpiobrst: GPIOBRST - - /// IO port A reset - @ReadWrite(bits: 0..<1, as: GPIOARSTValues.self) - public var gpioarst: GPIOARST - } - - /// AHB2 peripheral reset register - @Register(bitWidth: 32) - public struct AHB2RSTR { - /// USB OTG FS module reset - @ReadWrite(bits: 7..<8) - public var otgfsrst: OTGFSRST - - /// Random number generator module reset - @ReadWrite(bits: 6..<7) - public var rngrst: RNGRST - - /// Hash module reset - @ReadWrite(bits: 5..<6) - public var hsahrst: HSAHRST - - /// Cryptographic module reset - @ReadWrite(bits: 4..<5) - public var cryprst: CRYPRST - - /// Camera interface reset - @ReadWrite(bits: 0..<1, as: DCMIRSTValues.self) - public var dcmirst: DCMIRST - } - - /// AHB3 peripheral reset register - @Register(bitWidth: 32) - public struct AHB3RSTR { - /// Flexible memory controller module reset - @ReadWrite(bits: 0..<1, as: FMCRSTValues.self) - public var fmcrst: FMCRST - - /// Quad SPI memory controller reset - @ReadWrite(bits: 1..<2) - public var qspirst: QSPIRST - } - - /// APB1 peripheral reset register - @Register(bitWidth: 32) - public struct APB1RSTR { - /// TIM2 reset - @ReadWrite(bits: 0..<1, as: TIM2RSTValues.self) - public var tim2rst: TIM2RST - - /// TIM3 reset - @ReadWrite(bits: 1..<2) - public var tim3rst: TIM3RST - - /// TIM4 reset - @ReadWrite(bits: 2..<3) - public var tim4rst: TIM4RST - - /// TIM5 reset - @ReadWrite(bits: 3..<4) - public var tim5rst: TIM5RST - - /// TIM6 reset - @ReadWrite(bits: 4..<5) - public var tim6rst: TIM6RST - - /// TIM7 reset - @ReadWrite(bits: 5..<6) - public var tim7rst: TIM7RST - - /// TIM12 reset - @ReadWrite(bits: 6..<7) - public var tim12rst: TIM12RST - - /// TIM13 reset - @ReadWrite(bits: 7..<8) - public var tim13rst: TIM13RST - - /// TIM14 reset - @ReadWrite(bits: 8..<9) - public var tim14rst: TIM14RST - - /// Window watchdog reset - @ReadWrite(bits: 11..<12) - public var wwdgrst: WWDGRST - - /// SPI 2 reset - @ReadWrite(bits: 14..<15) - public var spi2rst: SPI2RST - - /// SPI 3 reset - @ReadWrite(bits: 15..<16) - public var spi3rst: SPI3RST - - /// USART 2 reset - @ReadWrite(bits: 17..<18) - public var usart2rst: USART2RST - - /// USART 3 reset - @ReadWrite(bits: 18..<19) - public var usart3rst: USART3RST - - /// USART 4 reset - @ReadWrite(bits: 19..<20) - public var uart4rst: UART4RST - - /// USART 5 reset - @ReadWrite(bits: 20..<21) - public var uart5rst: UART5RST - - /// I2C 1 reset - @ReadWrite(bits: 21..<22) - public var i2c1rst: I2C1RST - - /// I2C 2 reset - @ReadWrite(bits: 22..<23) - public var i2c2rst: I2C2RST - - /// I2C3 reset - @ReadWrite(bits: 23..<24) - public var i2c3rst: I2C3RST - - /// CAN1 reset - @ReadWrite(bits: 25..<26) - public var can1rst: CAN1RST - - /// CAN2 reset - @ReadWrite(bits: 26..<27) - public var can2rst: CAN2RST - - /// Power interface reset - @ReadWrite(bits: 28..<29) - public var pwrrst: PWRRST - - /// DAC reset - @ReadWrite(bits: 29..<30) - public var dacrst: DACRST - - /// UART7 reset - @ReadWrite(bits: 30..<31) - public var uart7rst: UART7RST - - /// UART8 reset - @ReadWrite(bits: 31..<32) - public var uart8rst: UART8RST - - /// SPDIF-RX reset - @ReadWrite(bits: 16..<17) - public var spdifrxrst: SPDIFRXRST - - /// HDMI-CEC reset - @ReadWrite(bits: 27..<28) - public var cecrst: CECRST - - /// Low power timer 1 reset - @ReadWrite(bits: 9..<10) - public var lptim1rst: LPTIM1RST - - /// I2C 4 reset - @ReadWrite(bits: 24..<25) - public var i2c4rst: I2C4RST - } - - /// APB2 peripheral reset register - @Register(bitWidth: 32) - public struct APB2RSTR { - /// TIM1 reset - @ReadWrite(bits: 0..<1, as: TIM1RSTValues.self) - public var tim1rst: TIM1RST - - /// TIM8 reset - @ReadWrite(bits: 1..<2) - public var tim8rst: TIM8RST - - /// USART1 reset - @ReadWrite(bits: 4..<5) - public var usart1rst: USART1RST - - /// USART6 reset - @ReadWrite(bits: 5..<6) - public var usart6rst: USART6RST - - /// ADC interface reset (common to all ADCs) - @ReadWrite(bits: 8..<9) - public var adcrst: ADCRST - - /// SPI 1 reset - @ReadWrite(bits: 12..<13) - public var spi1rst: SPI1RST - - /// SPI4 reset - @ReadWrite(bits: 13..<14) - public var spi4rst: SPI4RST - - /// System configuration controller reset - @ReadWrite(bits: 14..<15) - public var syscfgrst: SYSCFGRST - - /// TIM9 reset - @ReadWrite(bits: 16..<17) - public var tim9rst: TIM9RST - - /// TIM10 reset - @ReadWrite(bits: 17..<18) - public var tim10rst: TIM10RST - - /// TIM11 reset - @ReadWrite(bits: 18..<19) - public var tim11rst: TIM11RST - - /// SPI5 reset - @ReadWrite(bits: 20..<21) - public var spi5rst: SPI5RST - - /// SPI6 reset - @ReadWrite(bits: 21..<22) - public var spi6rst: SPI6RST - - /// SAI1 reset - @ReadWrite(bits: 22..<23) - public var sai1rst: SAI1RST - - /// LTDC reset - @ReadWrite(bits: 26..<27) - public var ltdcrst: LTDCRST - - /// SAI2 reset - @ReadWrite(bits: 23..<24) - public var sai2rst: SAI2RST - - /// SDMMC1 reset - @ReadWrite(bits: 11..<12) - public var sdmmc1rst: SDMMC1RST - } - - /// AHB1 peripheral clock register - @Register(bitWidth: 32) - public struct AHB1ENR { - /// USB OTG HSULPI clock enable - @ReadWrite(bits: 30..<31) - public var otghsulpien: OTGHSULPIEN - - /// USB OTG HS clock enable - @ReadWrite(bits: 29..<30) - public var otghsen: OTGHSEN - - /// Ethernet PTP clock enable - @ReadWrite(bits: 28..<29) - public var ethmacptpen: ETHMACPTPEN - - /// Ethernet Reception clock enable - @ReadWrite(bits: 27..<28) - public var ethmacrxen: ETHMACRXEN - - /// Ethernet Transmission clock enable - @ReadWrite(bits: 26..<27) - public var ethmactxen: ETHMACTXEN - - /// Ethernet MAC clock enable - @ReadWrite(bits: 25..<26) - public var ethmacen: ETHMACEN - - /// DMA2D clock enable - @ReadWrite(bits: 23..<24) - public var dma2den: DMA2DEN - - /// DMA2 clock enable - @ReadWrite(bits: 22..<23) - public var dma2en: DMA2EN - - /// DMA1 clock enable - @ReadWrite(bits: 21..<22) - public var dma1en: DMA1EN - - /// CCM data RAM clock enable - @ReadWrite(bits: 20..<21) - public var dtcmramen: DTCMRAMEN - - /// Backup SRAM interface clock enable - @ReadWrite(bits: 18..<19) - public var bkpsramen: BKPSRAMEN - - /// CRC clock enable - @ReadWrite(bits: 12..<13) - public var crcen: CRCEN - - /// IO port K clock enable - @ReadWrite(bits: 10..<11) - public var gpioken: GPIOKEN - - /// IO port J clock enable - @ReadWrite(bits: 9..<10) - public var gpiojen: GPIOJEN - - /// IO port I clock enable - @ReadWrite(bits: 8..<9) - public var gpioien: GPIOIEN - - /// IO port H clock enable - @ReadWrite(bits: 7..<8) - public var gpiohen: GPIOHEN - - /// IO port G clock enable - @ReadWrite(bits: 6..<7) - public var gpiogen: GPIOGEN - - /// IO port F clock enable - @ReadWrite(bits: 5..<6) - public var gpiofen: GPIOFEN - - /// IO port E clock enable - @ReadWrite(bits: 4..<5) - public var gpioeen: GPIOEEN - - /// IO port D clock enable - @ReadWrite(bits: 3..<4) - public var gpioden: GPIODEN - - /// IO port C clock enable - @ReadWrite(bits: 2..<3) - public var gpiocen: GPIOCEN - - /// IO port B clock enable - @ReadWrite(bits: 1..<2) - public var gpioben: GPIOBEN - - /// IO port A clock enable - @ReadWrite(bits: 0..<1, as: GPIOAENValues.self) - public var gpioaen: GPIOAEN - } - - /// AHB2 peripheral clock enable register - @Register(bitWidth: 32) - public struct AHB2ENR { - /// USB OTG FS clock enable - @ReadWrite(bits: 7..<8) - public var otgfsen: OTGFSEN - - /// Random number generator clock enable - @ReadWrite(bits: 6..<7) - public var rngen: RNGEN - - /// Hash modules clock enable - @ReadWrite(bits: 5..<6) - public var hashen: HASHEN - - /// Cryptographic modules clock enable - @ReadWrite(bits: 4..<5) - public var crypen: CRYPEN - - /// Camera interface enable - @ReadWrite(bits: 0..<1, as: DCMIENValues.self) - public var dcmien: DCMIEN - } - - /// AHB3 peripheral clock enable register - @Register(bitWidth: 32) - public struct AHB3ENR { - /// Flexible memory controller module clock enable - @ReadWrite(bits: 0..<1, as: FMCENValues.self) - public var fmcen: FMCEN - - /// Quad SPI memory controller clock enable - @ReadWrite(bits: 1..<2) - public var qspien: QSPIEN - } - - /// APB1 peripheral clock enable register - @Register(bitWidth: 32) - public struct APB1ENR { - /// TIM2 clock enable - @ReadWrite(bits: 0..<1, as: TIM2ENValues.self) - public var tim2en: TIM2EN - - /// TIM3 clock enable - @ReadWrite(bits: 1..<2) - public var tim3en: TIM3EN - - /// TIM4 clock enable - @ReadWrite(bits: 2..<3) - public var tim4en: TIM4EN - - /// TIM5 clock enable - @ReadWrite(bits: 3..<4) - public var tim5en: TIM5EN - - /// TIM6 clock enable - @ReadWrite(bits: 4..<5) - public var tim6en: TIM6EN - - /// TIM7 clock enable - @ReadWrite(bits: 5..<6) - public var tim7en: TIM7EN - - /// TIM12 clock enable - @ReadWrite(bits: 6..<7) - public var tim12en: TIM12EN - - /// TIM13 clock enable - @ReadWrite(bits: 7..<8) - public var tim13en: TIM13EN - - /// TIM14 clock enable - @ReadWrite(bits: 8..<9) - public var tim14en: TIM14EN - - /// Window watchdog clock enable - @ReadWrite(bits: 11..<12) - public var wwdgen: WWDGEN - - /// SPI2 clock enable - @ReadWrite(bits: 14..<15) - public var spi2en: SPI2EN - - /// SPI3 clock enable - @ReadWrite(bits: 15..<16) - public var spi3en: SPI3EN - - /// USART 2 clock enable - @ReadWrite(bits: 17..<18) - public var usart2en: USART2EN - - /// USART3 clock enable - @ReadWrite(bits: 18..<19) - public var usart3en: USART3EN - - /// UART4 clock enable - @ReadWrite(bits: 19..<20) - public var uart4en: UART4EN - - /// UART5 clock enable - @ReadWrite(bits: 20..<21) - public var uart5en: UART5EN - - /// I2C1 clock enable - @ReadWrite(bits: 21..<22) - public var i2c1en: I2C1EN - - /// I2C2 clock enable - @ReadWrite(bits: 22..<23) - public var i2c2en: I2C2EN - - /// I2C3 clock enable - @ReadWrite(bits: 23..<24) - public var i2c3en: I2C3EN - - /// CAN 1 clock enable - @ReadWrite(bits: 25..<26) - public var can1en: CAN1EN - - /// CAN 2 clock enable - @ReadWrite(bits: 26..<27) - public var can2en: CAN2EN - - /// Power interface clock enable - @ReadWrite(bits: 28..<29) - public var pwren: PWREN - - /// DAC interface clock enable - @ReadWrite(bits: 29..<30) - public var dacen: DACEN - - /// UART7 clock enable - @ReadWrite(bits: 30..<31) - public var uart7en: UART7EN - - /// UART8 clock enable - @ReadWrite(bits: 31..<32) - public var uart8en: UART8EN - - /// SPDIF-RX clock enable - @ReadWrite(bits: 16..<17) - public var spdifrxen: SPDIFRXEN - - /// HDMI-CEN clock enable - @ReadWrite(bits: 27..<28) - public var cecen: CECEN - - /// Low power timer 1 clock enable - @ReadWrite(bits: 9..<10) - public var lptim1en: LPTIM1EN - - /// I2C4 clock enable - @ReadWrite(bits: 24..<25) - public var i2c4en: I2C4EN - } - - /// APB2 peripheral clock enable register - @Register(bitWidth: 32) - public struct APB2ENR { - /// TIM1 clock enable - @ReadWrite(bits: 0..<1, as: TIM1ENValues.self) - public var tim1en: TIM1EN - - /// TIM8 clock enable - @ReadWrite(bits: 1..<2) - public var tim8en: TIM8EN - - /// USART1 clock enable - @ReadWrite(bits: 4..<5) - public var usart1en: USART1EN - - /// USART6 clock enable - @ReadWrite(bits: 5..<6) - public var usart6en: USART6EN - - /// ADC1 clock enable - @ReadWrite(bits: 8..<9) - public var adc1en: ADC1EN - - /// ADC2 clock enable - @ReadWrite(bits: 9..<10) - public var adc2en: ADC2EN - - /// ADC3 clock enable - @ReadWrite(bits: 10..<11) - public var adc3en: ADC3EN - - /// SPI1 clock enable - @ReadWrite(bits: 12..<13) - public var spi1en: SPI1EN - - /// SPI4 clock enable - @ReadWrite(bits: 13..<14) - public var spi4en: SPI4EN - - /// System configuration controller clock enable - @ReadWrite(bits: 14..<15) - public var syscfgen: SYSCFGEN - - /// TIM9 clock enable - @ReadWrite(bits: 16..<17) - public var tim9en: TIM9EN - - /// TIM10 clock enable - @ReadWrite(bits: 17..<18) - public var tim10en: TIM10EN - - /// TIM11 clock enable - @ReadWrite(bits: 18..<19) - public var tim11en: TIM11EN - - /// SPI5 clock enable - @ReadWrite(bits: 20..<21) - public var spi5en: SPI5EN - - /// SPI6 clock enable - @ReadWrite(bits: 21..<22) - public var spi6en: SPI6EN - - /// SAI1 clock enable - @ReadWrite(bits: 22..<23) - public var sai1en: SAI1EN - - /// LTDC clock enable - @ReadWrite(bits: 26..<27) - public var ltdcen: LTDCEN - - /// SAI2 clock enable - @ReadWrite(bits: 23..<24) - public var sai2en: SAI2EN - - /// SDMMC1 clock enable - @ReadWrite(bits: 11..<12) - public var sdmmc1en: SDMMC1EN - } - - /// AHB1 peripheral clock enable in low power mode register - @Register(bitWidth: 32) - public struct AHB1LPENR { - /// IO port A clock enable during sleep mode - @ReadWrite(bits: 0..<1, as: GPIOALPENValues.self) - public var gpioalpen: GPIOALPEN - - /// IO port B clock enable during Sleep mode - @ReadWrite(bits: 1..<2) - public var gpioblpen: GPIOBLPEN - - /// IO port C clock enable during Sleep mode - @ReadWrite(bits: 2..<3) - public var gpioclpen: GPIOCLPEN - - /// IO port D clock enable during Sleep mode - @ReadWrite(bits: 3..<4) - public var gpiodlpen: GPIODLPEN - - /// IO port E clock enable during Sleep mode - @ReadWrite(bits: 4..<5) - public var gpioelpen: GPIOELPEN - - /// IO port F clock enable during Sleep mode - @ReadWrite(bits: 5..<6) - public var gpioflpen: GPIOFLPEN - - /// IO port G clock enable during Sleep mode - @ReadWrite(bits: 6..<7) - public var gpioglpen: GPIOGLPEN - - /// IO port H clock enable during Sleep mode - @ReadWrite(bits: 7..<8) - public var gpiohlpen: GPIOHLPEN - - /// IO port I clock enable during Sleep mode - @ReadWrite(bits: 8..<9) - public var gpioilpen: GPIOILPEN - - /// IO port J clock enable during Sleep mode - @ReadWrite(bits: 9..<10) - public var gpiojlpen: GPIOJLPEN - - /// IO port K clock enable during Sleep mode - @ReadWrite(bits: 10..<11) - public var gpioklpen: GPIOKLPEN - - /// CRC clock enable during Sleep mode - @ReadWrite(bits: 12..<13) - public var crclpen: CRCLPEN - - /// Flash interface clock enable during Sleep mode - @ReadWrite(bits: 15..<16) - public var flitflpen: FLITFLPEN - - /// SRAM 1interface clock enable during Sleep mode - @ReadWrite(bits: 16..<17) - public var sram1lpen: SRAM1LPEN - - /// SRAM 2 interface clock enable during Sleep mode - @ReadWrite(bits: 17..<18) - public var sram2lpen: SRAM2LPEN - - /// Backup SRAM interface clock enable during Sleep mode - @ReadWrite(bits: 18..<19) - public var bkpsramlpen: BKPSRAMLPEN - - /// SRAM 3 interface clock enable during Sleep mode - @ReadWrite(bits: 19..<20) - public var sram3lpen: SRAM3LPEN - - /// DMA1 clock enable during Sleep mode - @ReadWrite(bits: 21..<22) - public var dma1lpen: DMA1LPEN - - /// DMA2 clock enable during Sleep mode - @ReadWrite(bits: 22..<23) - public var dma2lpen: DMA2LPEN - - /// DMA2D clock enable during Sleep mode - @ReadWrite(bits: 23..<24) - public var dma2dlpen: DMA2DLPEN - - /// Ethernet MAC clock enable during Sleep mode - @ReadWrite(bits: 25..<26) - public var ethmaclpen: ETHMACLPEN - - /// Ethernet transmission clock enable during Sleep mode - @ReadWrite(bits: 26..<27) - public var ethmactxlpen: ETHMACTXLPEN - - /// Ethernet reception clock enable during Sleep mode - @ReadWrite(bits: 27..<28) - public var ethmacrxlpen: ETHMACRXLPEN - - /// Ethernet PTP clock enable during Sleep mode - @ReadWrite(bits: 28..<29) - public var ethmacptplpen: ETHMACPTPLPEN - - /// USB OTG HS clock enable during Sleep mode - @ReadWrite(bits: 29..<30) - public var otghslpen: OTGHSLPEN - - /// USB OTG HS ULPI clock enable during Sleep mode - @ReadWrite(bits: 30..<31) - public var otghsulpilpen: OTGHSULPILPEN - - /// AXI to AHB bridge clock enable during Sleep mode - @ReadWrite(bits: 13..<14) - public var axilpen: AXILPEN - - /// DTCM RAM interface clock enable during Sleep mode - @ReadWrite(bits: 20..<21) - public var dtcmlpen: DTCMLPEN - } - - /// AHB2 peripheral clock enable in low power mode register - @Register(bitWidth: 32) - public struct AHB2LPENR { - /// USB OTG FS clock enable during Sleep mode - @ReadWrite(bits: 7..<8) - public var otgfslpen: OTGFSLPEN - - /// Random number generator clock enable during Sleep mode - @ReadWrite(bits: 6..<7) - public var rnglpen: RNGLPEN - - /// Hash modules clock enable during Sleep mode - @ReadWrite(bits: 5..<6) - public var hashlpen: HASHLPEN - - /// Cryptography modules clock enable during Sleep mode - @ReadWrite(bits: 4..<5) - public var cryplpen: CRYPLPEN - - /// Camera interface enable during Sleep mode - @ReadWrite(bits: 0..<1, as: DCMILPENValues.self) - public var dcmilpen: DCMILPEN - } - - /// AHB3 peripheral clock enable in low power mode register - @Register(bitWidth: 32) - public struct AHB3LPENR { - /// Flexible memory controller module clock enable during Sleep mode - @ReadWrite(bits: 0..<1, as: FMCLPENValues.self) - public var fmclpen: FMCLPEN - - /// Quand SPI memory controller clock enable during Sleep mode - @ReadWrite(bits: 1..<2) - public var qspilpen: QSPILPEN - } - - /// APB1 peripheral clock enable in low power mode register - @Register(bitWidth: 32) - public struct APB1LPENR { - /// TIM2 clock enable during Sleep mode - @ReadWrite(bits: 0..<1, as: TIM2LPENValues.self) - public var tim2lpen: TIM2LPEN - - /// TIM3 clock enable during Sleep mode - @ReadWrite(bits: 1..<2) - public var tim3lpen: TIM3LPEN - - /// TIM4 clock enable during Sleep mode - @ReadWrite(bits: 2..<3) - public var tim4lpen: TIM4LPEN - - /// TIM5 clock enable during Sleep mode - @ReadWrite(bits: 3..<4) - public var tim5lpen: TIM5LPEN - - /// TIM6 clock enable during Sleep mode - @ReadWrite(bits: 4..<5) - public var tim6lpen: TIM6LPEN - - /// TIM7 clock enable during Sleep mode - @ReadWrite(bits: 5..<6) - public var tim7lpen: TIM7LPEN - - /// TIM12 clock enable during Sleep mode - @ReadWrite(bits: 6..<7) - public var tim12lpen: TIM12LPEN - - /// TIM13 clock enable during Sleep mode - @ReadWrite(bits: 7..<8) - public var tim13lpen: TIM13LPEN - - /// TIM14 clock enable during Sleep mode - @ReadWrite(bits: 8..<9) - public var tim14lpen: TIM14LPEN - - /// Window watchdog clock enable during Sleep mode - @ReadWrite(bits: 11..<12) - public var wwdglpen: WWDGLPEN - - /// SPI2 clock enable during Sleep mode - @ReadWrite(bits: 14..<15) - public var spi2lpen: SPI2LPEN - - /// SPI3 clock enable during Sleep mode - @ReadWrite(bits: 15..<16) - public var spi3lpen: SPI3LPEN - - /// USART2 clock enable during Sleep mode - @ReadWrite(bits: 17..<18) - public var usart2lpen: USART2LPEN - - /// USART3 clock enable during Sleep mode - @ReadWrite(bits: 18..<19) - public var usart3lpen: USART3LPEN - - /// UART4 clock enable during Sleep mode - @ReadWrite(bits: 19..<20) - public var uart4lpen: UART4LPEN - - /// UART5 clock enable during Sleep mode - @ReadWrite(bits: 20..<21) - public var uart5lpen: UART5LPEN - - /// I2C1 clock enable during Sleep mode - @ReadWrite(bits: 21..<22) - public var i2c1lpen: I2C1LPEN - - /// I2C2 clock enable during Sleep mode - @ReadWrite(bits: 22..<23) - public var i2c2lpen: I2C2LPEN - - /// I2C3 clock enable during Sleep mode - @ReadWrite(bits: 23..<24) - public var i2c3lpen: I2C3LPEN - - /// CAN 1 clock enable during Sleep mode - @ReadWrite(bits: 25..<26) - public var can1lpen: CAN1LPEN - - /// CAN 2 clock enable during Sleep mode - @ReadWrite(bits: 26..<27) - public var can2lpen: CAN2LPEN - - /// Power interface clock enable during Sleep mode - @ReadWrite(bits: 28..<29) - public var pwrlpen: PWRLPEN - - /// DAC interface clock enable during Sleep mode - @ReadWrite(bits: 29..<30) - public var daclpen: DACLPEN - - /// UART7 clock enable during Sleep mode - @ReadWrite(bits: 30..<31) - public var uart7lpen: UART7LPEN - - /// UART8 clock enable during Sleep mode - @ReadWrite(bits: 31..<32) - public var uart8lpen: UART8LPEN - - /// SPDIF-RX clock enable during sleep mode - @ReadWrite(bits: 16..<17) - public var spdifrxlpen: SPDIFRXLPEN - - /// HDMI-CEN clock enable during Sleep mode - @ReadWrite(bits: 27..<28) - public var ceclpen: CECLPEN - - /// low power timer 1 clock enable during Sleep mode - @ReadWrite(bits: 9..<10) - public var lptim1lpen: LPTIM1LPEN - - /// I2C4 clock enable during Sleep mode - @ReadWrite(bits: 24..<25) - public var i2c4lpen: I2C4LPEN - } - - /// APB2 peripheral clock enabled in low power mode register - @Register(bitWidth: 32) - public struct APB2LPENR { - /// TIM1 clock enable during Sleep mode - @ReadWrite(bits: 0..<1, as: TIM1LPENValues.self) - public var tim1lpen: TIM1LPEN - - /// TIM8 clock enable during Sleep mode - @ReadWrite(bits: 1..<2) - public var tim8lpen: TIM8LPEN - - /// USART1 clock enable during Sleep mode - @ReadWrite(bits: 4..<5) - public var usart1lpen: USART1LPEN - - /// USART6 clock enable during Sleep mode - @ReadWrite(bits: 5..<6) - public var usart6lpen: USART6LPEN - - /// ADC1 clock enable during Sleep mode - @ReadWrite(bits: 8..<9) - public var adc1lpen: ADC1LPEN - - /// ADC2 clock enable during Sleep mode - @ReadWrite(bits: 9..<10) - public var adc2lpen: ADC2LPEN - - /// ADC 3 clock enable during Sleep mode - @ReadWrite(bits: 10..<11) - public var adc3lpen: ADC3LPEN - - /// SPI 1 clock enable during Sleep mode - @ReadWrite(bits: 12..<13) - public var spi1lpen: SPI1LPEN - - /// SPI 4 clock enable during Sleep mode - @ReadWrite(bits: 13..<14) - public var spi4lpen: SPI4LPEN - - /// System configuration controller clock enable during Sleep mode - @ReadWrite(bits: 14..<15) - public var syscfglpen: SYSCFGLPEN - - /// TIM9 clock enable during sleep mode - @ReadWrite(bits: 16..<17) - public var tim9lpen: TIM9LPEN - - /// TIM10 clock enable during Sleep mode - @ReadWrite(bits: 17..<18) - public var tim10lpen: TIM10LPEN - - /// TIM11 clock enable during Sleep mode - @ReadWrite(bits: 18..<19) - public var tim11lpen: TIM11LPEN - - /// SPI 5 clock enable during Sleep mode - @ReadWrite(bits: 20..<21) - public var spi5lpen: SPI5LPEN - - /// SPI 6 clock enable during Sleep mode - @ReadWrite(bits: 21..<22) - public var spi6lpen: SPI6LPEN - - /// SAI1 clock enable during sleep mode - @ReadWrite(bits: 22..<23) - public var sai1lpen: SAI1LPEN - - /// LTDC clock enable during sleep mode - @ReadWrite(bits: 26..<27) - public var ltdclpen: LTDCLPEN - - /// SAI2 clock enable during sleep mode - @ReadWrite(bits: 23..<24) - public var sai2lpen: SAI2LPEN - - /// SDMMC1 clock enable during Sleep mode - @ReadWrite(bits: 11..<12) - public var sdmmc1lpen: SDMMC1LPEN - } - - /// Backup domain control register - @Register(bitWidth: 32) - public struct BDCR { - /// Backup domain software reset - @ReadWrite(bits: 16..<17, as: BDRSTValues.self) - public var bdrst: BDRST - - /// RTC clock enable - @ReadWrite(bits: 15..<16, as: RTCENValues.self) - public var rtcen: RTCEN - - /// External low-speed oscillator bypass - @ReadWrite(bits: 2..<3, as: LSEBYPValues.self) - public var lsebyp: LSEBYP - - /// External low-speed oscillator ready - @ReadOnly(bits: 1..<2) - public var lserdy: LSERDY - - /// External low-speed oscillator enable - @ReadWrite(bits: 0..<1, as: LSEONValues.self) - public var lseon: LSEON - - /// LSE oscillator drive capability - @ReadWrite(bits: 3..<5, as: LSEDRVValues.self) - public var lsedrv: LSEDRV - - /// RTC clock source selection - @Reserved(bits: 8..<10, as: RTCSELValues.self) - public var rtcsel: RTCSEL - } - - /// clock control & status register - @Register(bitWidth: 32) - public struct CSR { - /// Low-power reset flag - @ReadWrite(bits: 31..<32) - public var lpwrrstf: LPWRRSTF - - /// Window watchdog reset flag - @ReadWrite(bits: 30..<31) - public var wwdgrstf: WWDGRSTF - - /// Independent watchdog reset flag - @ReadWrite(bits: 29..<30) - public var wdgrstf: WDGRSTF - - /// Software reset flag - @ReadWrite(bits: 28..<29) - public var sftrstf: SFTRSTF - - /// POR/PDR reset flag - @ReadWrite(bits: 27..<28) - public var porrstf: PORRSTF - - /// PIN reset flag - @ReadWrite(bits: 26..<27) - public var padrstf: PADRSTF - - /// BOR reset flag - @ReadWrite(bits: 25..<26) - public var borrstf: BORRSTF - - /// Remove reset flag - @ReadWrite(bits: 24..<25) - public var rmvf: RMVF - - /// Internal low-speed oscillator ready - @ReadOnly(bits: 1..<2) - public var lsirdy: LSIRDY - - /// Internal low-speed oscillator enable - @ReadWrite(bits: 0..<1, as: LSIONValues.self) - public var lsion: LSION - } - - /// spread spectrum clock generation register - @Register(bitWidth: 32) - public struct SSCGR { - /// Spread spectrum modulation enable - @ReadWrite(bits: 31..<32, as: SSCGENValues.self) - public var sscgen: SSCGEN - - /// Spread Select - @ReadWrite(bits: 30..<31, as: SPREADSELValues.self) - public var spreadsel: SPREADSEL - - /// Incrementation step - @ReadWrite(bits: 13..<28) - public var incstep: INCSTEP - - /// Modulation period - @ReadWrite(bits: 0..<13) - public var modper: MODPER - } - - /// PLLI2S configuration register - @Register(bitWidth: 32) - public struct PLLI2SCFGR { - /// PLLI2S division factor for I2S clocks - @ReadWrite(bits: 28..<31) - public var plli2sr: PLLI2SR - - /// PLLI2S division factor for SAI1 clock - @ReadWrite(bits: 24..<28) - public var plli2sq: PLLI2SQ - - /// PLLI2S multiplication factor for VCO - @ReadWrite(bits: 6..<15) - public var plli2sn: PLLI2SN - - /// PLLI2S division factor for SPDIFRX clock - @ReadWrite(bits: 16..<18, as: PLLI2SPValues.self) - public var plli2sp: PLLI2SP - } - - /// PLL configuration register - @Register(bitWidth: 32) - public struct PLLSAICFGR { - /// PLLSAI division factor for VCO - @ReadWrite(bits: 6..<15) - public var pllsain: PLLSAIN - - /// PLLSAI division factor for 48MHz clock - @ReadWrite(bits: 16..<18, as: PLLSAIPValues.self) - public var pllsaip: PLLSAIP - - /// PLLSAI division factor for SAI clock - @ReadWrite(bits: 24..<28) - public var pllsaiq: PLLSAIQ - - /// PLLSAI division factor for LCD clock - @ReadWrite(bits: 28..<31) - public var pllsair: PLLSAIR - } - - /// dedicated clocks configuration register - @Register(bitWidth: 32) - public struct DCKCFGR1 { - /// PLLI2S division factor for SAI1 clock - @ReadWrite(bits: 0..<5, as: PLLI2SDIVQValues.self) - public var plli2sdivq: PLLI2SDIVQ - - /// PLLSAI division factor for SAI1 clock - @ReadWrite(bits: 8..<13, as: PLLSAIDIVQValues.self) - public var pllsaidivq: PLLSAIDIVQ - - /// division factor for LCD_CLK - @ReadWrite(bits: 16..<18, as: PLLSAIDIVRValues.self) - public var pllsaidivr: PLLSAIDIVR - - /// SAI1 clock source selection - @ReadWrite(bits: 20..<22, as: SAI1SELValues.self) - public var sai1sel: SAI1SEL - - /// SAI2 clock source selection - @ReadWrite(bits: 22..<24, as: SAI2SELValues.self) - public var sai2sel: SAI2SEL - - /// Timers clocks prescalers selection - @ReadWrite(bits: 24..<25, as: TIMPREValues.self) - public var timpre: TIMPRE - } - - /// dedicated clocks configuration register - @Register(bitWidth: 32) - public struct DCKCFGR2 { - /// USART 1 clock source selection - @ReadWrite(bits: 0..<2, as: USART1SELValues.self) - public var usart1sel: USART1SEL - - /// USART 2 clock source selection - @ReadWrite(bits: 2..<4, as: USART2SELValues.self) - public var usart2sel: USART2SEL - - /// USART 3 clock source selection - @ReadWrite(bits: 4..<6) - public var usart3sel: USART3SEL - - /// UART 4 clock source selection - @ReadWrite(bits: 6..<8) - public var uart4sel: UART4SEL - - /// UART 5 clock source selection - @ReadWrite(bits: 8..<10) - public var uart5sel: UART5SEL - - /// USART 6 clock source selection - @ReadWrite(bits: 10..<12) - public var usart6sel: USART6SEL - - /// UART 7 clock source selection - @ReadWrite(bits: 12..<14) - public var uart7sel: UART7SEL - - /// UART 8 clock source selection - @ReadWrite(bits: 14..<16) - public var uart8sel: UART8SEL - - /// I2C1 clock source selection - @ReadWrite(bits: 16..<18, as: I2C1SELValues.self) - public var i2c1sel: I2C1SEL - - /// I2C2 clock source selection - @ReadWrite(bits: 18..<20) - public var i2c2sel: I2C2SEL - - /// I2C3 clock source selection - @ReadWrite(bits: 20..<22) - public var i2c3sel: I2C3SEL - - /// I2C4 clock source selection - @ReadWrite(bits: 22..<24) - public var i2c4sel: I2C4SEL - - /// Low power timer 1 clock source selection - @ReadWrite(bits: 24..<26, as: LPTIM1SELValues.self) - public var lptim1sel: LPTIM1SEL - - /// HDMI-CEC clock source selection - @ReadWrite(bits: 26..<27, as: CECSELValues.self) - public var cecsel: CECSEL - - /// 48MHz clock source selection - @ReadWrite(bits: 27..<28, as: CK48MSELValues.self) - public var ck48msel: CK48MSEL - - /// SDMMC clock source selection - @ReadWrite(bits: 28..<29, as: SDMMC1SELValues.self) - public var sdmmc1sel: SDMMC1SEL - } -} - -extension RCC.CR { - public struct CSSONValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Clock security system disabled (clock detector OFF) - public static let Off = Self(rawValue: 0x0) - - /// Clock security system enable (clock detector ON if the HSE is ready, OFF if not) - public static let On = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.CR { - public struct HSEBYPValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// HSE crystal oscillator not bypassed - public static let NotBypassed = Self(rawValue: 0x0) - - /// HSE crystal oscillator bypassed with external clock - public static let Bypassed = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.CR { - public struct HSIONValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Clock Off - public static let Off = Self(rawValue: 0x0) - - /// Clock On - public static let On = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.PLLCFGR { - public struct PLLSRCValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// HSI clock selected as PLL and PLLI2S clock entry - public static let HSI = Self(rawValue: 0x0) - - /// HSE oscillator clock selected as PLL and PLLI2S clock entry - public static let HSE = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.PLLCFGR { - public struct PLLPValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// PLLP=2 - public static let Div2 = Self(rawValue: 0x0) - - /// PLLP=4 - public static let Div4 = Self(rawValue: 0x1) - - /// PLLP=6 - public static let Div6 = Self(rawValue: 0x2) - - /// PLLP=8 - public static let Div8 = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.CFGR { - public struct MCO2Values: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// System clock (SYSCLK) selected - public static let SYSCLK = Self(rawValue: 0x0) - - /// PLLI2S clock selected - public static let PLLI2S = Self(rawValue: 0x1) - - /// HSE oscillator clock selected - public static let HSE = Self(rawValue: 0x2) - - /// PLL clock selected - public static let PLL = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.CFGR { - public struct MCO1PREValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 3 - - /// No division - public static let Div1 = Self(rawValue: 0x0) - - /// Division by 2 - public static let Div2 = Self(rawValue: 0x4) - - /// Division by 3 - public static let Div3 = Self(rawValue: 0x5) - - /// Division by 4 - public static let Div4 = Self(rawValue: 0x6) - - /// Division by 5 - public static let Div5 = Self(rawValue: 0x7) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.CFGR { - public struct I2SSRCValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// PLLI2S clock used as I2S clock source - public static let PLLI2S = Self(rawValue: 0x0) - - /// External clock mapped on the I2S_CKIN pin used as I2S clock source - public static let CKIN = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.CFGR { - public struct MCO1Values: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// HSI clock selected - public static let HSI = Self(rawValue: 0x0) - - /// LSE oscillator selected - public static let LSE = Self(rawValue: 0x1) - - /// HSE oscillator clock selected - public static let HSE = Self(rawValue: 0x2) - - /// PLL clock selected - public static let PLL = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.CFGR { - public struct PPRE1Values: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 3 - - /// HCLK not divided - public static let Div1 = Self(rawValue: 0x0) - - /// HCLK divided by 2 - public static let Div2 = Self(rawValue: 0x4) - - /// HCLK divided by 4 - public static let Div4 = Self(rawValue: 0x5) - - /// HCLK divided by 8 - public static let Div8 = Self(rawValue: 0x6) - - /// HCLK divided by 16 - public static let Div16 = Self(rawValue: 0x7) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.CFGR { - public struct HPREValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 4 - - /// SYSCLK not divided - public static let Div1 = Self(rawValue: 0x0) - - /// SYSCLK divided by 2 - public static let Div2 = Self(rawValue: 0x8) - - /// SYSCLK divided by 4 - public static let Div4 = Self(rawValue: 0x9) - - /// SYSCLK divided by 8 - public static let Div8 = Self(rawValue: 0xa) - - /// SYSCLK divided by 16 - public static let Div16 = Self(rawValue: 0xb) - - /// SYSCLK divided by 64 - public static let Div64 = Self(rawValue: 0xc) - - /// SYSCLK divided by 128 - public static let Div128 = Self(rawValue: 0xd) - - /// SYSCLK divided by 256 - public static let Div256 = Self(rawValue: 0xe) - - /// SYSCLK divided by 512 - public static let Div512 = Self(rawValue: 0xf) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.CFGR { - public struct SWValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// HSI selected as system clock - public static let HSI = Self(rawValue: 0x0) - - /// HSE selected as system clock - public static let HSE = Self(rawValue: 0x1) - - /// PLL selected as system clock - public static let PLL = Self(rawValue: 0x2) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.CIR { - public struct LSIRDYIEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Interrupt disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Interrupt enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.AHB1RSTR { - public struct GPIOARSTValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Reset the selected module - public static let Reset = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.AHB2RSTR { - public struct DCMIRSTValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Reset the selected module - public static let Reset = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.AHB3RSTR { - public struct FMCRSTValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Reset the selected module - public static let Reset = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.APB1RSTR { - public struct TIM2RSTValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Reset the selected module - public static let Reset = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.APB2RSTR { - public struct TIM1RSTValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Reset the selected module - public static let Reset = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.AHB1ENR { - public struct GPIOAENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// The selected clock is disabled - public static let Disabled = Self(rawValue: 0x0) - - /// The selected clock is enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.AHB2ENR { - public struct DCMIENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// The selected clock is disabled - public static let Disabled = Self(rawValue: 0x0) - - /// The selected clock is enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.AHB3ENR { - public struct FMCENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// The selected clock is disabled - public static let Disabled = Self(rawValue: 0x0) - - /// The selected clock is enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.APB1ENR { - public struct TIM2ENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// The selected clock is disabled - public static let Disabled = Self(rawValue: 0x0) - - /// The selected clock is enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.APB2ENR { - public struct TIM1ENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// The selected clock is disabled - public static let Disabled = Self(rawValue: 0x0) - - /// The selected clock is enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.AHB1LPENR { - public struct GPIOALPENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Selected module is disabled during Sleep mode - public static let DisabledInSleep = Self(rawValue: 0x0) - - /// Selected module is enabled during Sleep mode - public static let EnabledInSleep = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.AHB2LPENR { - public struct DCMILPENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Selected module is disabled during Sleep mode - public static let DisabledInSleep = Self(rawValue: 0x0) - - /// Selected module is enabled during Sleep mode - public static let EnabledInSleep = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.AHB3LPENR { - public struct FMCLPENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Selected module is disabled during Sleep mode - public static let DisabledInSleep = Self(rawValue: 0x0) - - /// Selected module is enabled during Sleep mode - public static let EnabledInSleep = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.APB1LPENR { - public struct TIM2LPENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Selected module is disabled during Sleep mode - public static let DisabledInSleep = Self(rawValue: 0x0) - - /// Selected module is enabled during Sleep mode - public static let EnabledInSleep = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.APB2LPENR { - public struct TIM1LPENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Selected module is disabled during Sleep mode - public static let DisabledInSleep = Self(rawValue: 0x0) - - /// Selected module is enabled during Sleep mode - public static let EnabledInSleep = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.BDCR { - public struct BDRSTValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Reset not activated - public static let Disabled = Self(rawValue: 0x0) - - /// Reset the entire RTC domain - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.BDCR { - public struct RTCENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// RTC clock disabled - public static let Disabled = Self(rawValue: 0x0) - - /// RTC clock enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.BDCR { - public struct LSEBYPValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// LSE crystal oscillator not bypassed - public static let NotBypassed = Self(rawValue: 0x0) - - /// LSE crystal oscillator bypassed with external clock - public static let Bypassed = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.BDCR { - public struct LSEONValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// LSE oscillator Off - public static let Off = Self(rawValue: 0x0) - - /// LSE oscillator On - public static let On = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.BDCR { - public struct LSEDRVValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// Low drive capacity - public static let Low = Self(rawValue: 0x0) - - /// Medium-high drive capacity - public static let MediumHigh = Self(rawValue: 0x1) - - /// Medium-low drive capacity - public static let MediumLow = Self(rawValue: 0x2) - - /// High drive capacity - public static let High = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.BDCR { - public struct RTCSELValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// No clock - public static let NoClock = Self(rawValue: 0x0) - - /// LSE oscillator clock used as RTC clock - public static let LSE = Self(rawValue: 0x1) - - /// LSI oscillator clock used as RTC clock - public static let LSI = Self(rawValue: 0x2) - - /// HSE oscillator clock divided by a prescaler used as RTC clock - public static let HSE = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.CSR { - public struct LSIONValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// LSI oscillator Off - public static let Off = Self(rawValue: 0x0) - - /// LSI oscillator On - public static let On = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.SSCGR { - public struct SSCGENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Spread spectrum modulation disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Spread spectrum modulation enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.SSCGR { - public struct SPREADSELValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Center spread - public static let Center = Self(rawValue: 0x0) - - /// Down spread - public static let Down = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.PLLI2SCFGR { - public struct PLLI2SPValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// PLL*P=2 - public static let Div2 = Self(rawValue: 0x0) - - /// PLL*P=4 - public static let Div4 = Self(rawValue: 0x1) - - /// PLL*P=6 - public static let Div6 = Self(rawValue: 0x2) - - /// PLL*P=8 - public static let Div8 = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.PLLSAICFGR { - public struct PLLSAIPValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// PLL*P=2 - public static let Div2 = Self(rawValue: 0x0) - - /// PLL*P=4 - public static let Div4 = Self(rawValue: 0x1) - - /// PLL*P=6 - public static let Div6 = Self(rawValue: 0x2) - - /// PLL*P=8 - public static let Div8 = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.DCKCFGR1 { - public struct PLLI2SDIVQValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 5 - - /// PLLI2SDIVQ = /1 - public static let Div1 = Self(rawValue: 0x0) - - /// PLLI2SDIVQ = /2 - public static let Div2 = Self(rawValue: 0x1) - - /// PLLI2SDIVQ = /3 - public static let Div3 = Self(rawValue: 0x2) - - /// PLLI2SDIVQ = /4 - public static let Div4 = Self(rawValue: 0x3) - - /// PLLI2SDIVQ = /5 - public static let Div5 = Self(rawValue: 0x4) - - /// PLLI2SDIVQ = /6 - public static let Div6 = Self(rawValue: 0x5) - - /// PLLI2SDIVQ = /7 - public static let Div7 = Self(rawValue: 0x6) - - /// PLLI2SDIVQ = /8 - public static let Div8 = Self(rawValue: 0x7) - - /// PLLI2SDIVQ = /9 - public static let Div9 = Self(rawValue: 0x8) - - /// PLLI2SDIVQ = /10 - public static let Div10 = Self(rawValue: 0x9) - - /// PLLI2SDIVQ = /11 - public static let Div11 = Self(rawValue: 0xa) - - /// PLLI2SDIVQ = /12 - public static let Div12 = Self(rawValue: 0xb) - - /// PLLI2SDIVQ = /13 - public static let Div13 = Self(rawValue: 0xc) - - /// PLLI2SDIVQ = /14 - public static let Div14 = Self(rawValue: 0xd) - - /// PLLI2SDIVQ = /15 - public static let Div15 = Self(rawValue: 0xe) - - /// PLLI2SDIVQ = /16 - public static let Div16 = Self(rawValue: 0xf) - - /// PLLI2SDIVQ = /17 - public static let Div17 = Self(rawValue: 0x10) - - /// PLLI2SDIVQ = /18 - public static let Div18 = Self(rawValue: 0x11) - - /// PLLI2SDIVQ = /19 - public static let Div19 = Self(rawValue: 0x12) - - /// PLLI2SDIVQ = /20 - public static let Div20 = Self(rawValue: 0x13) - - /// PLLI2SDIVQ = /21 - public static let Div21 = Self(rawValue: 0x14) - - /// PLLI2SDIVQ = /22 - public static let Div22 = Self(rawValue: 0x15) - - /// PLLI2SDIVQ = /23 - public static let Div23 = Self(rawValue: 0x16) - - /// PLLI2SDIVQ = /24 - public static let Div24 = Self(rawValue: 0x17) - - /// PLLI2SDIVQ = /25 - public static let Div25 = Self(rawValue: 0x18) - - /// PLLI2SDIVQ = /26 - public static let Div26 = Self(rawValue: 0x19) - - /// PLLI2SDIVQ = /27 - public static let Div27 = Self(rawValue: 0x1a) - - /// PLLI2SDIVQ = /28 - public static let Div28 = Self(rawValue: 0x1b) - - /// PLLI2SDIVQ = /29 - public static let Div29 = Self(rawValue: 0x1c) - - /// PLLI2SDIVQ = /30 - public static let Div30 = Self(rawValue: 0x1d) - - /// PLLI2SDIVQ = /31 - public static let Div31 = Self(rawValue: 0x1e) - - /// PLLI2SDIVQ = /32 - public static let Div32 = Self(rawValue: 0x1f) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.DCKCFGR1 { - public struct PLLSAIDIVQValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 5 - - /// PLLSAIDIVQ = /1 - public static let Div1 = Self(rawValue: 0x0) - - /// PLLSAIDIVQ = /2 - public static let Div2 = Self(rawValue: 0x1) - - /// PLLSAIDIVQ = /3 - public static let Div3 = Self(rawValue: 0x2) - - /// PLLSAIDIVQ = /4 - public static let Div4 = Self(rawValue: 0x3) - - /// PLLSAIDIVQ = /5 - public static let Div5 = Self(rawValue: 0x4) - - /// PLLSAIDIVQ = /6 - public static let Div6 = Self(rawValue: 0x5) - - /// PLLSAIDIVQ = /7 - public static let Div7 = Self(rawValue: 0x6) - - /// PLLSAIDIVQ = /8 - public static let Div8 = Self(rawValue: 0x7) - - /// PLLSAIDIVQ = /9 - public static let Div9 = Self(rawValue: 0x8) - - /// PLLSAIDIVQ = /10 - public static let Div10 = Self(rawValue: 0x9) - - /// PLLSAIDIVQ = /11 - public static let Div11 = Self(rawValue: 0xa) - - /// PLLSAIDIVQ = /12 - public static let Div12 = Self(rawValue: 0xb) - - /// PLLSAIDIVQ = /13 - public static let Div13 = Self(rawValue: 0xc) - - /// PLLSAIDIVQ = /14 - public static let Div14 = Self(rawValue: 0xd) - - /// PLLSAIDIVQ = /15 - public static let Div15 = Self(rawValue: 0xe) - - /// PLLSAIDIVQ = /16 - public static let Div16 = Self(rawValue: 0xf) - - /// PLLSAIDIVQ = /17 - public static let Div17 = Self(rawValue: 0x10) - - /// PLLSAIDIVQ = /18 - public static let Div18 = Self(rawValue: 0x11) - - /// PLLSAIDIVQ = /19 - public static let Div19 = Self(rawValue: 0x12) - - /// PLLSAIDIVQ = /20 - public static let Div20 = Self(rawValue: 0x13) - - /// PLLSAIDIVQ = /21 - public static let Div21 = Self(rawValue: 0x14) - - /// PLLSAIDIVQ = /22 - public static let Div22 = Self(rawValue: 0x15) - - /// PLLSAIDIVQ = /23 - public static let Div23 = Self(rawValue: 0x16) - - /// PLLSAIDIVQ = /24 - public static let Div24 = Self(rawValue: 0x17) - - /// PLLSAIDIVQ = /25 - public static let Div25 = Self(rawValue: 0x18) - - /// PLLSAIDIVQ = /26 - public static let Div26 = Self(rawValue: 0x19) - - /// PLLSAIDIVQ = /27 - public static let Div27 = Self(rawValue: 0x1a) - - /// PLLSAIDIVQ = /28 - public static let Div28 = Self(rawValue: 0x1b) - - /// PLLSAIDIVQ = /29 - public static let Div29 = Self(rawValue: 0x1c) - - /// PLLSAIDIVQ = /30 - public static let Div30 = Self(rawValue: 0x1d) - - /// PLLSAIDIVQ = /31 - public static let Div31 = Self(rawValue: 0x1e) - - /// PLLSAIDIVQ = /32 - public static let Div32 = Self(rawValue: 0x1f) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.DCKCFGR1 { - public struct PLLSAIDIVRValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// PLLSAIDIVR = /2 - public static let Div2 = Self(rawValue: 0x0) - - /// PLLSAIDIVR = /4 - public static let Div4 = Self(rawValue: 0x1) - - /// PLLSAIDIVR = /8 - public static let Div8 = Self(rawValue: 0x2) - - /// PLLSAIDIVR = /16 - public static let Div16 = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.DCKCFGR1 { - public struct SAI1SELValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// SAI1 clock frequency = f(PLLSAI_Q) / PLLSAIDIVQ - public static let PLLSAI = Self(rawValue: 0x0) - - /// SAI1 clock frequency = f(PLLI2S_Q) / PLLI2SDIVQ - public static let PLLI2S = Self(rawValue: 0x1) - - /// SAI1 clock frequency = Alternate function input frequency - public static let AFIF = Self(rawValue: 0x2) - - /// SAI1 clock frequency = HSI or HSE - public static let HSI_HSE = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.DCKCFGR1 { - public struct SAI2SELValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// SAI2 clock frequency = f(PLLSAI_Q) / PLLSAIDIVQ - public static let PLLSAI = Self(rawValue: 0x0) - - /// SAI2 clock frequency = f(PLLI2S_Q) / PLLI2SDIVQ - public static let PLLI2S = Self(rawValue: 0x1) - - /// SAI2 clock frequency = Alternate function input frequency - public static let AFIF = Self(rawValue: 0x2) - - /// SAI2 clock frequency = HSI or HSE - public static let HSI_HSE = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.DCKCFGR1 { - public struct TIMPREValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// If the APB prescaler is configured 1, TIMxCLK = PCLKx. Otherwise, TIMxCLK = 2xPCLKx - public static let Mul1Or2 = Self(rawValue: 0x0) - - /// If the APB prescaler is configured 1, 2 or 4, TIMxCLK = HCLK. Otherwise, TIMxCLK = 4xPCLKx - public static let Mul1Or4 = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.DCKCFGR2 { - public struct USART1SELValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// APB2 clock (PCLK2) is selected as USART clock - public static let APB2 = Self(rawValue: 0x0) - - /// System clock is selected as USART clock - public static let SYSCLK = Self(rawValue: 0x1) - - /// HSI clock is selected as USART clock - public static let HSI = Self(rawValue: 0x2) - - /// LSE clock is selected as USART clock - public static let LSE = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.DCKCFGR2 { - public struct USART2SELValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// APB1 clock (PCLK1) is selected as USART clock - public static let APB1 = Self(rawValue: 0x0) - - /// System clock is selected as USART clock - public static let SYSCLK = Self(rawValue: 0x1) - - /// HSI clock is selected as USART clock - public static let HSI = Self(rawValue: 0x2) - - /// LSE clock is selected as USART clock - public static let LSE = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.DCKCFGR2 { - public struct I2C1SELValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// APB clock selected as I2C clock - public static let APB = Self(rawValue: 0x0) - - /// System clock selected as I2C clock - public static let SYSCLK = Self(rawValue: 0x1) - - /// HSI clock selected as I2C clock - public static let HSI = Self(rawValue: 0x2) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.DCKCFGR2 { - public struct LPTIM1SELValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// APB1 clock (PCLK1) selected as LPTILM1 clock - public static let APB1 = Self(rawValue: 0x0) - - /// LSI clock is selected as LPTILM1 clock - public static let LSI = Self(rawValue: 0x1) - - /// HSI clock is selected as LPTILM1 clock - public static let HSI = Self(rawValue: 0x2) - - /// LSE clock is selected as LPTILM1 clock - public static let LSE = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.DCKCFGR2 { - public struct CECSELValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// LSE clock is selected as HDMI-CEC clock - public static let LSE = Self(rawValue: 0x0) - - /// HSI divided by 488 clock is selected as HDMI-CEC clock - public static let HSI_Div488 = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.DCKCFGR2 { - public struct CK48MSELValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// 48MHz clock from PLL is selected - public static let PLL = Self(rawValue: 0x0) - - /// 48MHz clock from PLLSAI is selected - public static let PLLSAI = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.DCKCFGR2 { - public struct SDMMC1SELValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// 48 MHz clock is selected as SD clock - public static let CK48M = Self(rawValue: 0x0) - - /// System clock is selected as SD clock - public static let SYSCLK = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} diff --git a/stm32-lcd-logo/Sources/STM32F7X6/stm32f7x6.patched.svd b/stm32-lcd-logo/Sources/STM32F7X6/stm32f7x6.patched.svd deleted file mode 120000 index a6442b50..00000000 --- a/stm32-lcd-logo/Sources/STM32F7X6/stm32f7x6.patched.svd +++ /dev/null @@ -1 +0,0 @@ -../../../Tools/SVDs/stm32f7x6.patched.svd \ No newline at end of file diff --git a/stm32-lcd-logo/Sources/STM32F7X6/svd2swift.json b/stm32-lcd-logo/Sources/STM32F7X6/svd2swift.json deleted file mode 100644 index dd674df6..00000000 --- a/stm32-lcd-logo/Sources/STM32F7X6/svd2swift.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "peripherals": [ - "FLASH", - "GPIOA", - "GPIOB", - "GPIOC", - "GPIOD", - "GPIOE", - "GPIOF", - "GPIOG", - "GPIOH", - "GPIOI", - "GPIOJ", - "GPIOK", - "LTDC", - "RCC" - ], - "access-level": "public" -} diff --git a/stm32-lcd-logo/Sources/Support/Startup.c b/stm32-lcd-logo/Sources/Support/Startup.c deleted file mode 100644 index 6838bdc0..00000000 --- a/stm32-lcd-logo/Sources/Support/Startup.c +++ /dev/null @@ -1,51 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2023 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -#include -#include - -extern int main(int argc, char *argv[]); - -void *memset(void *b, int c, size_t len) { - for (int i = 0; i < len; i++) { - ((char *)b)[i] = c; - } - return b; -} - -void *memcpy(void *restrict dst, const void *restrict src, size_t n) { - for (int i = 0; i < n; i++) { - ((char *)dst)[i] = ((char *)src)[i]; - } - return dst; -} - -void reset(void) { - main(0, NULL); -} - -void interrupt(void) { - while (1) {} -} - -__attribute((used)) __attribute((section("__VECTORS,__text"))) -void *vector_table[114] = { - (void *)0x2000fffc, // initial SP - reset, // Reset - - interrupt, // NMI - interrupt, // HardFault - interrupt, // MemManage - interrupt, // BusFault - interrupt, // UsageFault - - 0 // NULL for all the other handlers -}; diff --git a/stm32-lcd-logo/Sources/Support/include/Support.h b/stm32-lcd-logo/Sources/Support/include/Support.h deleted file mode 100644 index 14e4a7ac..00000000 --- a/stm32-lcd-logo/Sources/Support/include/Support.h +++ /dev/null @@ -1,16 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2023 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -#pragma once - -static inline void nop() { - asm volatile("nop"); -} diff --git a/stm32-lvgl/.gitignore b/stm32-lvgl/.gitignore deleted file mode 100644 index ea5f98bd..00000000 --- a/stm32-lvgl/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -lvgl -llvm-toolchain diff --git a/stm32-lvgl/.sourcekit-lsp/config.json b/stm32-lvgl/.sourcekit-lsp/config.json deleted file mode 100644 index 7f0beef5..00000000 --- a/stm32-lvgl/.sourcekit-lsp/config.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "swiftPM": { - "configuration": "release", - "triple": "armv7em-none-none-eabi", - "toolsets": ["toolset.json"], - "swiftCompilerFlags": [ - "-enable-experimental-feature", "Embedded", - "-enable-experimental-feature", "Extern" - ] - } -} diff --git a/stm32-lvgl/Makefile b/stm32-lvgl/Makefile deleted file mode 100644 index 54f59dd9..00000000 --- a/stm32-lvgl/Makefile +++ /dev/null @@ -1,94 +0,0 @@ -##===----------------------------------------------------------------------===## -## -## This source file is part of the Swift open source project -## -## Copyright (c) 2025 Apple Inc. and the Swift project authors. -## Licensed under Apache License v2.0 with Runtime Library Exception -## -## See https://swift.org/LICENSE.txt for license information -## -##===----------------------------------------------------------------------===## - -# Paths -REPOROOT := $(shell git rev-parse --show-toplevel) -TOOLSROOT := $(REPOROOT)/Tools -TOOLSET := $(PWD)/toolset.json -ELF2HEX := $(TOOLSROOT)/elf2hex.py -SWIFT_BUILD := swift build -NM := nm -LLVM_TOOLCHAIN := $(PWD)/llvm-toolchain - -# Flags -ARCH := armv7em -TARGET := $(ARCH)-none-none-eabi -SWIFT_BUILD_ARGS := \ - --configuration release \ - --triple $(TARGET) \ - --toolset $(TOOLSET) \ - --product Application -BUILDROOT := $(shell $(SWIFT_BUILD) $(SWIFT_BUILD_ARGS) --show-bin-path) - -.PHONY: build -build: - @echo "checking dependencies..." - - if [[ ! -d $(PWD)/lvgl ]]; then echo "\n *** LVGL checkout not found, please run ./fetch-dependencies.sh\n" ; exit 1 ; fi - if [[ ! -d $(PWD)/llvm-toolchain ]]; then echo "\n *** LLVM toolchain checkout not found, please run ./fetch-dependencies.sh\n" ; exit 1 ; fi - - mkdir -p .build - - @echo "configuring LVGL..." - cmake -B .build/lvgl -G Ninja ./lvgl \ - -DCMAKE_EXPORT_COMPILE_COMMANDS=On \ - -DTOOLCHAIN_PATH=$(LLVM_TOOLCHAIN) \ - -DCMAKE_TOOLCHAIN_FILE=../clang-arm-toolchain.cmake \ - -DLV_CONF_PATH=../Sources/CLVGL/include/lv_conf.h - - @echo "building LVGL..." - cmake --build .build/lvgl - - @echo "building..." - $(SWIFT_BUILD) \ - $(SWIFT_BUILD_ARGS) \ - --verbose - - @echo "disassembling..." - $(LLVM_TOOLCHAIN)/bin/llvm-objdump --all-headers --disassemble --mcpu=cortex-m7 \ - $(BUILDROOT)/Application \ - | c++filt | swift demangle > $(BUILDROOT)/Application.disassembly - - @echo "extracting binary..." - $(ELF2HEX) \ - $(BUILDROOT)/Application $(BUILDROOT)/Application.hex --relocate - ls -al $(BUILDROOT)/Application.hex - @echo "\n *** All done, build succeeded!\n" - -flash: - @echo "flashing..." - st-flash --reset --format ihex write $(BUILDROOT)/Application.hex - -simulator: - mkdir -p .build - - @echo "configuring LVGL..." - cmake -B .build/lvgl-host -G Ninja ./lvgl \ - -DCMAKE_EXPORT_COMPILE_COMMANDS=On \ - -DLV_CONF_PATH=../Sources/CLVGL/include/lv_conf.h - - @echo "building LVGL..." - cmake --build .build/lvgl-host - - @echo "building..." - $(SWIFT_BUILD) \ - --configuration release \ - --product HostSDLApp \ - --verbose - - @echo "running..." - $(PWD)/.build/release/HostSDLApp - -.PHONY: clean -clean: - @echo "cleaning..." - @swift package clean - @rm -rf .build diff --git a/stm32-lvgl/Package.resolved b/stm32-lvgl/Package.resolved deleted file mode 100644 index 35151e54..00000000 --- a/stm32-lvgl/Package.resolved +++ /dev/null @@ -1,42 +0,0 @@ -{ - "originHash" : "27891c7454528c694f8ba4111e7214ff70b5364bdb54bce808c6e0d4b188bd81", - "pins" : [ - { - "identity" : "swift-argument-parser", - "kind" : "remoteSourceControl", - "location" : "https://github.com/apple/swift-argument-parser.git", - "state" : { - "revision" : "41982a3656a71c768319979febd796c6fd111d5c", - "version" : "1.5.0" - } - }, - { - "identity" : "swift-mmio", - "kind" : "remoteSourceControl", - "location" : "https://github.com/apple/swift-mmio", - "state" : { - "branch" : "main", - "revision" : "5232c5129a8c70beafc3d6acfbae2716c1b6822a" - } - }, - { - "identity" : "swift-syntax", - "kind" : "remoteSourceControl", - "location" : "https://github.com/swiftlang/swift-syntax.git", - "state" : { - "revision" : "0687f71944021d616d34d922343dcef086855920", - "version" : "600.0.1" - } - }, - { - "identity" : "swiftsdl2", - "kind" : "remoteSourceControl", - "location" : "https://github.com/ctreffs/SwiftSDL2.git", - "state" : { - "revision" : "30a2886bd68e43fc19ba29b63ffe230ac0e4db7a", - "version" : "1.4.1" - } - } - ], - "version" : 3 -} diff --git a/stm32-lvgl/Package.swift b/stm32-lvgl/Package.swift deleted file mode 100644 index aa27549a..00000000 --- a/stm32-lvgl/Package.swift +++ /dev/null @@ -1,59 +0,0 @@ -// swift-tools-version: 5.10 - -import PackageDescription - -let package = Package( - name: "stm32-lvgl", - platforms: [ - .macOS(.v11) - ], - products: [ - .executable(name: "Application", targets: ["Application"]) - ], - dependencies: [ - .package(url: "https://github.com/apple/swift-mmio", branch: "main"), - .package(url: "https://github.com/ctreffs/SwiftSDL2.git", from: "1.4.0"), - ], - targets: [ - // - // FIRMWARE TARGETS - // - - .executableTarget( - name: "Application", - dependencies: [ - "Registers", - "Support", - "CLVGL", - ]), - - // SVD2Swift \ - // --input Tools/SVDs/stm32f7x6.patched.svd \ - // --output stm32-lvgl/Sources/STM32F7x6 \ - // --peripherals FLASH LTDC RCC PWR FMC SCB DBGMCU USART1 STK NVIC SYSCFG \ - // GPIOA GPIOB GPIOC GPIOD GPIOE GPIOF GPIOG GPIOH GPIOI GPIOJ GPIOK \ - // I2C1 I2C2 I2C3 I2C4 \ - // --access-level public - .target( - name: "Registers", - dependencies: [ - .product(name: "MMIO", package: "swift-mmio") - ]), - - .target(name: "Support"), - - .target(name: "CLVGL"), - - // - // HOST TARGETS - // - - .executableTarget( - name: "HostSDLApp", - dependencies: [ - .product(name: "SDL", package: "SwiftSDL2"), - "CLVGL", - ], - swiftSettings: [.enableExperimentalFeature("Extern")], - linkerSettings: [.unsafeFlags(["-L.build/lvgl-host/lib", "-llvgl", "-llvgl_demos"])]), - ]) diff --git a/stm32-lvgl/README.md b/stm32-lvgl/README.md deleted file mode 100644 index 8a4d932a..00000000 --- a/stm32-lvgl/README.md +++ /dev/null @@ -1,49 +0,0 @@ -# stm32-lvgl - - - -This sample code is demonstrating a "full" graphical firmware running on an STM32 microcontroller board, concretely the STM32F746G "Discovery" board. It shows using: - -- **ELF file format**, linking with lld, with a custom simple linker script (and thus it builds identically on both macOS and Linux hosts) -- **LLVM Embedded Toolchain for ARM** -- **LVGL** graphical/input/animation library -- The **DRAM, LCD, touch panel, GPIO pins and interrupts** on the STM32F746G -- **No other SDKs or library dependencies** -- all the startup code, including MCU, board and peripheral initialization is done in Swift source code - -Additionally, this sample code: - -- Has **LSP integration** set up via the `.sourcekit-lsp/config.json` file, confirmed to work in multiple code editors (VS Code, Sublime Text, Zed) -- Uses **SwiftPM's toolset.json** to define compiler and linker flags -- Has a host OS (macOS, Linux) **"simulator" using SDL** that can use the same "business logic" code to render the same LVGL UI. - -## How to build and run this example: - -1. Connect the STM32F746G-DISCO board via the ST-LINK USB port to your Mac. -2. Install the right Swift toolchain specified in this repo's `.swift-version` file. This is best done using `swiftly`: -```console -$ swiftly install # Run in the project's directory -``` -3. Install the `stlink` (https://github.com/stlink-org/stlink) command line tools, e.g. via `brew install stlink`. -4. Run a provided shell script that fetches the LVGL and LLVM dependencies: -```console -$ ./fetch-dependencies.sh -``` -5. Build the firmware by running make: -```console -$ make -``` -6. Flash the built firmware by running make with the following target: -```console -$ make flash -``` - -You should now see the UI animating on the board's LCD display, and the touch screen should react to inputs. - -Optionally, you can also run build and run the code in a desktop OS SDL "simulator" by: -```console -$ make simulator -``` - -## Additional information - -- The ELF linking, linker script and packaging scheme is destribed in detail [inside the linker script](Sources/Support/linkerscript.ld). diff --git a/stm32-lvgl/Sources/Application/Clocks.swift b/stm32-lvgl/Sources/Application/Clocks.swift deleted file mode 100644 index 2da683dc..00000000 --- a/stm32-lvgl/Sources/Application/Clocks.swift +++ /dev/null @@ -1,423 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2025 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -import Registers -import Support - -/* - * STM32F746 clock configuration has the following constraints: - * - * Select HSE_BYPASS if an oscillator is used instead of a crystal. - * - * VCO: 100-432MHz - * PLL input: 0.95-2.1MHz (higher is less jitter, but not required) - * PLL output: 24-216MHz - * - * Maximum HCLK, APB1, APB2: - * - * Power Scale Over-drive VDD12 HCLK APB1 APB2 - * 3 Off 1.14v 144MHz 45MHz 90MHz - * 2 Off 1.26v 168MHz 45MHz 90MHz - * 2 On 1.26v 180MHz 54MHz 108MHz - * 1 Off 1.32v 180MHz 45MHz 90MHz - * 1 On 1.32v 216MHz 54MHz 108MHz - * - * Ethernet requires HCLK>=25MHz, and USB-HS requires HCLK>=30MHz. - * - * Formulas: - * - * HSE = OSC_IN (e.g 25MHz) - * PLL input = HSE / PLLM (1-2MHz, PLLM=2..63) - * VCO = PLL input * PLLN (100-432MHz, PLLN=50..432) - * PLL output = VCO / PLLP (24-216MHz, PLLP=2,4,6,8) - * HCLK = PLL output / HPRE (Power-of-2 divide by 1-512) - * APB1 = HCLK / PPRE1 (Power-of-2 divide by 1-16) - * APB2 = HCLK / PPRE2 (Power-of-2 divide by 1-16) - * USB-FS/RNG = VCO / PLLQ (48MHz, PLLQ=2..15) - * - * APB1/APB2 TIMx timers have dedicated clocks which are 2x or 4x the - * domain they live in, limited to HCLK. This is selected by the - * TIMPRE bit in RCC: - * - * TIMPRE Multiplier - * 0 2x - * 1 4x - * - * USB-FS requires exactly 48MHz, but this is unused. RNG requires - * 48MHz or lower. - */ - -// The STM32F746-DISCO board has an external 25MHz oscillator -let CPU_TARGET_FREQ = 200 - -// Values for 200 MHz target freq: -let HSE_BYPASS = true // Oscillator, not crystal -let PLL_M: UInt32 = 12 // VCO input = 2.083MHz -let PLL_N: UInt32 = 192 // VCO = 400MHz -let PLL_P: UInt32 = 2 // Divide by 2 = 200MHz -let PLL_Q: UInt32 = 9 // Divide by 9 = 44.5MHz -let HPRE: UInt32 = 1 // AHB = 200 / 1 = 200MHz -let PPRE1: UInt32 = 4 // APB1 = 200 / 4 = 50MHz -let PPRE2: UInt32 = 2 // APB2 = 200 / 2 = 100MHz -let VOLTAGE_SCALE: UInt32 = 1 // 180MHz requires voltage scale 1 (1.32v) -let OVERDRIVE = true // Over-drive required for APB clocks -let TIMER_MUL: UInt32 = 2 // Timer clocks are 2xAPB - -// External oscillator or crystal. -let HSE_VALUE: UInt32 = 25_000_000 - -// This is the built-in oscillator. It always runs at 16MHz -let HSI_CLOCK: UInt32 = 16_000_000 - -/// Represents available system clock sources -public enum SystemClock: UInt32 { - case hsi = 0 // High-Speed Internal oscillator - case hse = 1 // High-Speed External oscillator - case pll = 2 // Phase-Locked Loop - case plli2s = 3 // I2S Phase-Locked Loop - case pllsai = 4 // SAI Phase-Locked Loop -} - -public func enableSystemClock(_ clock: SystemClock, enable: Bool) { - let v: UInt32 = enable ? 1 : 0 - switch clock { - case .hsi: - rcc.cr.modify { $1.raw.hsion = v } - case .hse: - rcc.cr.modify { $1.raw.hseon = v } - case .pll: - rcc.cr.modify { $1.raw.pllon = v } - case .plli2s: - rcc.cr.modify { $1.raw.plli2son = v } - case .pllsai: - rcc.cr.modify { $1.raw.pllsaion = v } - } - - // Dummy read-back as barrier. - _ = rcc.cr.read() -} - -public func waitSystemClock(_ clock: SystemClock, enable: Bool) { - let v: UInt32 = enable ? 1 : 0 - switch clock { - case .hsi: - while rcc.cr.read().raw.hsion != v { /* busy wait */ } - case .hse: - while rcc.cr.read().raw.hseon != v { /* busy wait */ } - case .pll: - while rcc.cr.read().raw.pllon != v { /* busy wait */ } - case .plli2s: - while rcc.cr.read().raw.plli2son != v { /* busy wait */ } - case .pllsai: - while rcc.cr.read().raw.pllsaion != v { /* busy wait */ } - } -} - -public func selectSystemClock(_ clock: SystemClock) { - let sw: UInt32 - let sws: UInt32 - - switch clock { - case .hsi: - sw = 0 // RCC_CFGR_SW_HSI - sws = 0 // RCC_CFGR_SWS_HSI - case .hse: - sw = 1 // RCC_CFGR_SW_HSE - sws = 1 // RCC_CFGR_SWS_HSE - case .pll: - sw = 2 // RCC_CFGR_SW_PLL - sws = 2 // RCC_CFGR_SWS_PLL - default: - preconditionFailure("Bad clock \(clock)") - } - - if rcc.cfgr.read().raw.sw != sw { - // Switch system clock source to the new source - rcc.cfgr.modify { $0.raw.sw = sw } - - // Wait until selected - while rcc.cfgr.read().raw.sws != sws { /* busy wait */ } - } -} - -func setFlashWaitStates(_ hclk: UInt32) { - if (hclk == 0) || (hclk > 216_000_000) { - preconditionFailure("HCLK out of range") - } - - // One wait state per 30MHz (exact multiple of 30MHz uses lower number) - let flash_ws = (hclk - 1) / 30_000_000 - - // Set the flash wait states. - flash.acr.modify { $0.latency = .init(rawValue: UInt8(flash_ws)) } - - // Dummy read-back as barrier. - _ = flash.acr.read() -} - -public func setPllConfiguration(_ config: (hse: Bool, q: UInt32, p: UInt32, n: UInt32, m: UInt32)) { - // PLLQ direct mapped 2..15 - // PLLP 2->0, 4->1, 6->2, 8->3 - // PLLN direct mapped 50..432 - // PLLM direct mapped 2..63 - - // Always assert limits. - if (config.q < 2) || (config.q > 15) || (config.p < 2) || (config.p > 8) || ((config.p % 1) != 0) || (config.n < 50) - || (config.n > 432) || (config.m < 2) || (config.m > 63) - { - preconditionFailure("PllConfig") - } - - // Update PLL configuration using structured register access - rcc.pllcfgr.modify { - $0.pllsrc = config.hse ? .HSE : .HSI - $0.raw.pllq = config.q - $0.raw.pllp = (config.p / 2) - 1 - $0.raw.plln = config.n - $0.raw.pllm = config.m - } - - // Dummy barrier read - _ = rcc.pllcfgr.read() -} - -func setVoltageScale(_ scale: UInt32) { - // Select voltage scaling. This is enacted by hardware when the - // PLL is turned on. The hardware encoding is the reverse of the - // documented voltage scale numbers. - let vosCode: UInt32 - if scale == 1 { - vosCode = 3 - } else if scale == 2 { - vosCode = 2 - } else if scale == 3 { - vosCode = 1 - } else { - preconditionFailure("Voltage scale must be 1..3") - } - - pwr.cr1.modify { - $0.raw.vos = vosCode - } - - // Dummy read-back as barrier. - _ = pwr.cr1.read() -} - -func setOverdrive(_ overdrive: Bool) { - // Configure overdrive mode on or off. - if overdrive { - // See "Entering Over-drive mode" section 4.1.4 STM32F746 Ref - // manual. - pwr.cr1.modify { $0.raw.oden = 1 } - - while pwr.csr1.read().raw.odrdy == 0 { - // Wait until overdrive ready - } - - // Enable overdrive switching. This stalls core clock, but - // this delay is hidden because we are regardless still - // waiting for the PLL to lock. - pwr.cr1.modify { $0.raw.odswen = 1 } - - while pwr.csr1.read().raw.odswrdy == 0 { - // Wait until overdrive switch ready - } - } else { - // Overdrive disable, while system clock is still on HSI. - pwr.cr1.modify { - $0.raw.oden = 0 - $0.raw.odswen = 0 - } - - // Dummy read-back as barrier. - _ = pwr.cr1.read() - } -} - -func setTimerMultiplier(_ multiplier: UInt32) { - if multiplier == 2 { - rcc.dckcfgr1.modify { $0.raw.timpre = 0 } - } else if multiplier == 4 { - rcc.dckcfgr1.modify { $0.raw.timpre = 1 } - } else { - preconditionFailure("Bad TIMPRE") - } -} - -func enableCSS(_ enable: Bool) { - rcc.cr.modify { $1.csson = enable ? .On : .Off } - - // Dummy read-back as barrier. - _ = rcc.cr.read() -} - -func setOscillator(_ enable: Bool) { - rcc.cr.modify { $1.hsebyp = enable ? .Bypassed : .NotBypassed } - - // Dummy read-back as barrier. - _ = rcc.cr.read() -} - -extension UInt64 { - func divideRoundingUp(divideBy: UInt64) -> UInt64 { - return (self + divideBy - 1) / divideBy - } -} - -func log2_exact(_ val: UInt32) -> UInt32 { - guard val.nonzeroBitCount == 1 else { - preconditionFailure("Value \(val) is not a power of 2") - } - return UInt32(val.trailingZeroBitCount) -} - -extension Main { - static func setPrescalers(_ prescalers: (hpre: UInt32, ppre1: UInt32, ppre2: UInt32)) { - let log2_ahb: UInt32 = log2_exact(prescalers.hpre) - let log2_apb1: UInt32 = log2_exact(prescalers.ppre1) - let log2_apb2: UInt32 = log2_exact(prescalers.ppre2) - - let hpreCode: UInt32 - if log2_ahb <= 4 { - // 1, 2, 4, 8, 16 -> 7, 8, 9, 10, 11 - hpreCode = 7 + log2_ahb - } else { - // The code for divide-by-32 is skipped for some reason. - // 64, 128, 256, 512 -> 12, 13, 14, 15 - hpreCode = 6 + log2_ahb - } - let ppre1Code: UInt32 = 3 + log2_apb1 // 1,2,4,8,16 -> 3,4,5,6,7 - let ppre2Code: UInt32 = 3 + log2_apb2 // 1,2,4,8,16 -> 3,4,5,6,7 - - withInterruptsDisabled { - rcc.cfgr.modify { - $0.raw.hpre = hpreCode - $0.raw.ppre1 = ppre1Code - $0.raw.ppre2 = ppre2Code - } - // Dummy read + wait up to 16 AHB clocks to take effect - _ = rcc.cfgr.read() - delay(16) - } - } - - static func initClocks() { - enableSystemClock(.hsi, enable: true) - waitSystemClock(.hsi, enable: true) - selectSystemClock(.hsi) - - setPrescalers((1, 1, 1)) - - // Set dedicated timer clock multiplier to default 2x. - setTimerMultiplier(2) - - // 16MHz operation allows zero-wait-state flash. - setFlashWaitStates(HSI_CLOCK) - - // Disable Clock Security System (CSS). - enableCSS(false) - - // Disable HSE, PLL, PLLI2S, PLLSAI. - enableSystemClock(.hse, enable: false) - enableSystemClock(.pll, enable: false) - enableSystemClock(.plli2s, enable: false) - enableSystemClock(.pllsai, enable: false) - waitSystemClock(.hse, enable: false) - waitSystemClock(.pll, enable: false) - waitSystemClock(.plli2s, enable: false) - waitSystemClock(.pllsai, enable: false) - - // Set PLLCFGR (prescalers and source) to the reset default value - // for 48MHz operation. - setPllConfiguration((hse: false, q: 4, p: 2, n: 96, m: 16)) - - // Default is crystal. - setOscillator(false) - - // XXX, HW required delay for the clocks to be set right - // TODO: figure out which exact operation in the sequence requires the - // delay - delay(4) - } - - static func checkQuiesced() { - // Check that the system is running from HSI. Otherwise, the setup - // sequence will disturb active clocks. - let cfgr = rcc.cfgr.read() - if cfgr.raw.sw != 0 || cfgr.raw.sws != 0 { - preconditionFailure("Not quiesced") - } - - // Check that non-HSI clocks are quiesced, otherwise the setup - // sequence will be prevented by hardware from updating - // configuration bits. - let cr = rcc.cr.read() - if cr.raw.hseon != 0 || cr.raw.csson != 0 || cr.raw.pllon != 0 || cr.raw.plli2son != 0 || cr.raw.pllsaion != 0 { - preconditionFailure("Not quiesced") - } - } - - static func systemSetCoreClock() { - withInterruptsDisabled { - // Check the system has started up sufficiently quiesced, or the - // config sequence may disturb clocks out of spec, or the micro - // may prevent some bits from being updated. - checkQuiesced() - - // We need the PWR block enabled. - rcc.apb1enr.modify { $0.raw.pwren = 1 } - delay(32) - - // Set flash controller wait states for the target HCLK. Quiesced - // state accepts any value (it just runs slow). - let hclk = UInt64(UInt64(HSE_VALUE) * UInt64(PLL_N)).divideRoundingUp( - divideBy: UInt64(PLL_M) * UInt64(PLL_P) * UInt64(HPRE)) - if (hclk == 0) || (hclk > 216_000_000) { - preconditionFailure("HCLK out of range") - } - setFlashWaitStates(UInt32(hclk)) - - // Configure the target PLL frequency and required voltage. - setPllConfiguration((hse: true, q: PLL_Q, p: PLL_P, n: PLL_N, m: PLL_M)) - setVoltageScale(VOLTAGE_SCALE) - - // Configure, enable, and wait for the HSE clock. - setOscillator(HSE_BYPASS) - enableSystemClock(.hse, enable: true) - waitSystemClock(.hse, enable: true) - - // Enable and wait for the PLL. PLL t_LOCK<=300usec takes a - // while. Overdrive Tod_swen<=100usec is also slow, and can be - // configure concurrently. - enableSystemClock(.pll, enable: true) - setOverdrive(OVERDRIVE) - waitSystemClock(.pll, enable: true) - - // Increase CPU and peripheral dividers. This will very - // temporarily run the system slow as we are still on 16MHz - // HSI. Then finally switch to the system to PLL. - setPrescalers((HPRE, PPRE1, PPRE2)) - selectSystemClock(.pll) - - // Set dedicated timer clock multiplier 2x or 4x. - setTimerMultiplier(TIMER_MUL) - - // Enable SYSCFG clock in APB2 peripheral clock register - rcc.apb2enr.modify { $0.raw.syscfgen = 1 } - delay(32) - - // Enable I/O Compensation Cell - syscfg.cmpcr.modify { $1.raw.cmp_pd = 1 } - while syscfg.cmpcr.read().raw.ready == 0 { /* busy wait */ } - } - } -} diff --git a/stm32-lvgl/Sources/Application/Debug.swift b/stm32-lvgl/Sources/Application/Debug.swift deleted file mode 100644 index b5788c22..00000000 --- a/stm32-lvgl/Sources/Application/Debug.swift +++ /dev/null @@ -1,67 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2025 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -import Registers -import Support - -extension Main { - static func initDebug() { - // Keep clocks going when we WFI - dbgmcu.cr.modify { $0.raw.dbg_standby = 1 } - } - - static func initUartOutput() { - // A9 is UART1 TX, which is relayed by ST-LINK over USB - - // Clock configuration - rcc.ahb1enr.modify { $0.raw.gpioaen = 1 } // Enable AHB clock to port A - rcc.apb2enr.modify { $0.raw.usart1en = 1 } // Enable APB clock to usart 1 - - // Configure A9 as UART1 TX - gpioa.moder.modify { $0.raw.moder9 = 0b10 } // Put Pin A9 into alternate function mode - gpioa.otyper.modify { $0.raw.ot9 = 0b0 } // Put Pin A9 into push pull - gpioa.ospeedr.modify { $0.raw.ospeedr9 = 0b00 } // Put Pin A9 into low speed - gpioa.pupdr.modify { $0.raw.pupdr9 = 0b00 } // Disable pull up/down on Pin A9 - gpioa.afrh.modify { $0.raw.afrh9 = 0b0111 } // Set alternate function usart1 on Pin A9 - - // Configure UART1, set the baud rate to 115200 (we boot at 16 MHz) - usart1.brr.modify { $0.raw.storage = 16_000_000 / 115_200 } - - usart1.cr1.modify { - $0.raw.ue = 1 // Enable USART 1 - $0.raw.te = 1 // Enable TX - } - } -} - -func waitTxBufferEmpty() { - // Spin while tx buffer not empty - while usart1.isr.read().raw.txe == 0 {} -} - -func tx(value: UInt8) { - usart1.tdr.write { $0.raw.tdr_field = UInt32(value) } -} - -@_cdecl("putchar") -public func putchar(_ value: CInt) -> CInt { - waitTxBufferEmpty() - tx(value: UInt8(value)) - waitTxBufferEmpty() - return 0 -} - -func log(_ s: String) { - let n = uptimeInMs / 1000 - var m = String(uptimeInMs % 1000) - while m.utf8.count < 3 { m = "0" + m } - print("[\(n).\(m)] " + s) -} diff --git a/stm32-lvgl/Sources/Application/I2C.swift b/stm32-lvgl/Sources/Application/I2C.swift deleted file mode 100644 index 266fc6dc..00000000 --- a/stm32-lvgl/Sources/Application/I2C.swift +++ /dev/null @@ -1,156 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2025 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -import MMIO -import Registers -import Support - -struct I2C { - let i2c: I2C1 - let deviceAddress: UInt8 - - enum Interface: Int { - case i2c1 = 0 - case i2c2 - case i2c3 - case i2c4 - } - - init(interface: Interface, deviceAddress: UInt8) { - self.deviceAddress = deviceAddress - - switch interface { - case .i2c1: - self.i2c = i2c1 - rcc.apb1enr.modify { $0.raw.i2c1en = 1 } // Enable clock - case .i2c2: - self.i2c = i2c2 - rcc.apb1enr.modify { $0.raw.i2c2en = 1 } // Enable clock - case .i2c3: - self.i2c = i2c3 - rcc.apb1enr.modify { $0.raw.i2c3en = 1 } // Enable clock - case .i2c4: - self.i2c = i2c4 - rcc.apb1enr.modify { $0.raw.i2c4en = 1 } // Enable clock - } - - // Reset I2C peripheral - i2c.cr1.write { $0.raw.pe = 0 } - - // Configure I2C timing for 100KHz (based on 50MHz APB1 clock) - i2c.timingr.write { - $0.raw.presc = 0x09 // Prescaler - $0.raw.scldel = 0x04 // Data setup time - $0.raw.sdadel = 0x02 // Data hold time - $0.raw.sclh = 0x0F // SCL high period - $0.raw.scll = 0x13 // SCL low period - } - - // Enable I2C peripheral - i2c.cr1.modify { - $0.raw.pe = 1 // Enable peripheral - $0.raw.anfoff = 0 // Analog filter enabled - $0.raw.dnf = 0 // Digital filter disabled - } - } - - func write(data: [UInt8]) -> Bool { - // Wait until I2C is not busy - while i2c.isr.read().raw.busy == 1 { /* busy wait */ } - - // Set slave address - i2c.cr2.write { - $0.raw.sadd = UInt32(deviceAddress) << 1 // 7-bit address, shifted left by 1 - $0.raw.nbytes = UInt32(data.count) - $0.raw.autoend = 1 // Automatic end mode - $0.raw.start = 1 // Generate start condition - $0.raw.rd_wrn = 0 // Write transfer - } - - // Send data bytes - for byte in data { - // Wait until TXIS is set (transmit register empty) - while i2c.isr.read().raw.txis == 0 { - // Check for errors - let isr = i2c.isr.read().raw - if isr.nackf == 1 { - // NACK received - i2c.icr.write { $0.raw.nackcf = 1 } // Clear NACK flag - return false - } - } - - // Write data to TXDR - i2c.txdr.write { $0.raw.txdata = UInt32(byte) } - } - - // Wait for transfer complete - while i2c.isr.read().raw.tc == 0 && i2c.isr.read().raw.tcr == 0 && i2c.isr.read().raw.stopf == 0 { - // Check for errors - if i2c.isr.read().raw.nackf == 1 { - i2c.icr.write { $0.raw.nackcf = 1 } // Clear NACK flag - return false - } - } - - // Clear flags - let isr = i2c.isr.read().raw - i2c.icr.write { - $0.raw.stopcf = isr.stopf - $0.raw.nackcf = isr.nackf - } - - return true - } - - func read(buffer: inout [UInt8], length: Int) -> Bool { - // Wait until I2C is not busy - while i2c.isr.read().raw.busy == 1 { /* busy wait */ } - - // Set slave address and read operation - i2c.cr2.write { - $0.raw.sadd = UInt32(deviceAddress) << 1 // 7-bit address, shifted left by 1 - $0.raw.nbytes = UInt32(length) - $0.raw.autoend = 1 // Automatic end mode - $0.raw.rd_wrn = 1 // Read transfer - $0.raw.start = 1 // Generate start condition - } - - // Read data - for i in 0.. Void) { - let oldMask = primask_get() - cpsid_i() - body() - primask_set(oldMask) -} - -extension Main { - static func initInterrupts() { - // Disable then clear all RCC interrupts. - rcc.cir.modify { - $1.raw.lsirdyie = 0 - $1.raw.lserdyie = 0 - $1.raw.hsirdyie = 0 - $1.raw.hserdyie = 0 - $1.raw.pllrdyie = 0 - $1.raw.plli2srdyie = 0 - $1.raw.pllsairdyie = 0 - } - rcc.cir.modify { - $1.raw.lsirdyie = 1 - $1.raw.lserdyie = 1 - $1.raw.hsirdyie = 1 - $1.raw.hserdyie = 1 - $1.raw.pllrdyie = 1 - $1.raw.plli2srdyie = 1 - $1.raw.pllsairdyie = 1 - } - } -} - -var uptimeInMs = 0 - -extension Main { - static func initSysTick() { - stk.rvr.write { $0.raw.reload = 200_000 } // Set the reload value, ~1ms - stk.cvr.write { $0.raw.current = 0 } // Clear the current value - - // Enable the SysTick timer with processor clock - stk.csr.modify { - $0.raw.enable = 1 - $0.raw.tickint = 1 - $0.raw.clksource = 1 - } - - // Wait one tick for wrap. This eliminates ambiguity at the - // zero count. This is only possible if SysTick is - // (significantly) slower than the core clock. - while stk.cvr.read().raw.current == 0 { /* busy wait */ } - } -} - -@_cdecl("SystickTimerISR") -func SystickTimerISR() { - uptimeInMs += 1 -} - -var lcdInterruptVerticalSyncHandler: (() -> Void)? = nil - -@_cdecl("LtdcIntHandlerISR") -func LtdcIntHandlerISR() { - let sr = ltdc.isr.read() - ltdc.icr.write { $0.storage = sr.storage } - if sr.raw.rrif != 0 { - lcdInterruptVerticalSyncHandler?() - } -} diff --git a/stm32-lvgl/Sources/Application/Lcd.swift b/stm32-lvgl/Sources/Application/Lcd.swift deleted file mode 100644 index bd8b26da..00000000 --- a/stm32-lvgl/Sources/Application/Lcd.swift +++ /dev/null @@ -1,128 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2025 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -import MMIO -import Registers -import Support - -enum Lcd { - static let LCD_HSYNC: UInt32 = 10 - static let LCD_VSYNC: UInt32 = 2 - static let LCD_HBP: UInt32 = 43 - static let LCD_VBP: UInt32 = 12 - static let LCD_WIDTH: UInt32 = 480 - static let LCD_HEIGHT: UInt32 = 272 - static let LCD_HFP: UInt32 = 8 - static let LCD_VFP: UInt32 = 4 - static let LCD_PIXSIZE: UInt32 = 4 - static let SDRAM_BASE: UInt32 = 0xC000_0000 - - /// Initialize the LTDC module and get the display panel running. - static func initialize() { - // Configure the PLL for the display refresh. The LTDC has its own PLL. - // This code sets the DOTCLK to 8MHz or so. - let sain: UInt32 = 192 - let saiq = rcc.pllsaicfgr.read().raw.pllsaiq - let sair: UInt32 = 4 - - rcc.pllsaicfgr.write { - $0.raw.pllsain = sain - $0.raw.pllsaiq = saiq - $0.raw.pllsair = sair - } - rcc.dckcfgr1.modify { $0.pllsaidivr = .Div8 } - rcc.cr.modify { $1.raw.pllsaion = 1 } - - // Wait for PLLSAI to be ready - while rcc.cr.read().raw.pllsairdy == 0 { /* busy wait */ } - - // Enable clock to the LCD controller - rcc.apb2enr.modify { $0.raw.ltdcen = 1 } - - // Program the timing parameters for the panel - ltdc.sscr.write { - $0.raw.hsw = LCD_HSYNC - 1 - $0.raw.vsh = LCD_VSYNC - 1 - } - ltdc.bpcr.write { - $0.raw.ahbp = LCD_HSYNC + LCD_HBP - 1 - $0.raw.avbp = LCD_VSYNC + LCD_VBP - 1 - } - ltdc.awcr.write { - $0.raw.aaw = LCD_HSYNC + LCD_HBP + LCD_WIDTH - 1 - $0.raw.aah = LCD_VSYNC + LCD_VBP + LCD_HEIGHT - 1 - } - ltdc.twcr.write { - $0.raw.totalw = LCD_HSYNC + LCD_HBP + LCD_WIDTH + LCD_HFP - 1 - $0.raw.totalh = LCD_VSYNC + LCD_VBP + LCD_HEIGHT + LCD_VFP - 1 - } - - // Set background color to black - ltdc.bccr.write { $0.raw.storage = 0 } - - // Configure layer 1 - let h_start = LCD_HSYNC + LCD_HBP + 0 - let h_stop = LCD_HSYNC + LCD_HBP + LCD_WIDTH - 1 - let v_start = LCD_VSYNC + LCD_VBP + 0 - let v_stop = LCD_VSYNC + LCD_VBP + LCD_HEIGHT - 1 - let pitch = LCD_WIDTH * LCD_PIXSIZE - let length = LCD_WIDTH * LCD_PIXSIZE + 3 - ltdc.layer[0].whpcr.write { - $0.raw.whsppos = h_stop - $0.raw.whstpos = h_start - } - ltdc.layer[0].wvpcr.write { - $0.raw.wvsppos = v_stop - $0.raw.wvstpos = v_start - } - ltdc.layer[0].pfcr.write { - $0.raw.pf = 0 // ARGB8888 - } - ltdc.layer[0].cfbar.write { - $0.raw.cfbadd = SDRAM_BASE - } - ltdc.layer[0].cfblr.write { - $0.raw.cfbp = pitch - $0.raw.cfbll = length - } - ltdc.layer[0].cfblnr.write { - $0.raw.cfblnbr = LCD_HEIGHT - } - ltdc.layer[0].cacr.write { - $0.raw.consta = 0xFF - } - ltdc.layer[0].bfcr.write { - $0.raw.bf1 = 6 - $0.raw.bf2 = 7 - } - - // Enable layer 1 - ltdc.layer[0].cr.modify { $0.raw.len = 1 } - - // Turn on the display - ltdc.srcr.modify { $0.raw.vbr = 1 } - ltdc.gcr.modify { $1.ltdcen = .Enabled } - - // Enable interrupts - ltdc.ier.modify { $0.raw.rrie = 1 } - nvic.iser2.modify { - $0.raw.setena = (1 << (88 - 64)) // LTDC_IRQn is typically 88 - } - } - - static func setFrameBuffer(_ p: UnsafeRawPointer) { - ltdc.layer[0].cfbar.write { $0.raw.cfbadd = UInt32(UInt(bitPattern: p)) } - } - - static func reloadConfiguration() { - ltdc.srcr.modify { $0.raw.vbr = 1 } - } -} diff --git a/stm32-lvgl/Sources/Application/Main.swift b/stm32-lvgl/Sources/Application/Main.swift deleted file mode 100644 index d2722dc4..00000000 --- a/stm32-lvgl/Sources/Application/Main.swift +++ /dev/null @@ -1,163 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2025 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -import CLVGL -import Registers -import Support - -@main -struct Main { - static func main() { - // main is called very early in the boot process; here we are just after - // (1) reset IRQ entrypoint, (2) enabling FPU, (3) relocating data sections - // from flash to SRAM. Notably, no HW register configuration has been done - // yet (except for the FPU enablement), and no static constructors have been - // called yet. - - // We boot at 16 MHz. - initDebug() - initUartOutput() - - withInterruptsDisabled { - log("initClock()") - initClocks() - - log("initInterrupts()") - initInterrupts() - - // Reset the vector table to where it should be. - log("init VTOR") - scb.vtor.modify { $0.storage = 0x0800_0000 } - } - - log("systemSetCoreClock()") - systemSetCoreClock() - - // We are running at 200 MHz CPU frequency now. Set the UART baud rate to - // 115200 again based on the new CPU frequency. - usart1.brr.modify { $0.raw.storage = 100_000_000 / 115_200 } - - log("initGpio()") - initGpio() - log("initSdram()") - initSdram() - log("Lcd.initialize()") - Lcd.initialize() - - log("initSysTick") - initSysTick() - - log("TouchPanel.initialize()") - TouchPanel.initialize() - - // Everything is initialized now. Run application logic. - - //log("dramTest()") - //dramTest() - - log("lvglDemo()") - lvglDemo() - } - - static func dramTest() { - let dramSizeInUInt32 = dramSize / 4 - - func fillAndCheck(pattern: UInt32) { - for i in 0.. 0 { - data!.pointee.point.x = Int32(touchData.x) - data!.pointee.point.y = Int32(touchData.y) - data!.pointee.state = LV_INDEV_STATE_PRESSED - //print("pressed: \(touchData.x) \(touchData.y)") - } else { - data!.pointee.state = LV_INDEV_STATE_RELEASED - //print("released") - } - }) - - // Add UI of application logic - UIAppLogic.createUI() - - log("LVGL setup done, starting render loop") - - while true { - // If we're pending a render, wait. - while lcdInterruptVerticalSyncHandler != nil { /* busy wait */ nop() } - - lv_timer_handler() - - // Update UI of application logic - UIAppLogic.updateFrame() - } - } -} diff --git a/stm32-lvgl/Sources/Application/Pins.swift b/stm32-lvgl/Sources/Application/Pins.swift deleted file mode 100644 index b117108d..00000000 --- a/stm32-lvgl/Sources/Application/Pins.swift +++ /dev/null @@ -1,882 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2025 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -import MMIO -import Registers -import Support - -/// GPIO Port enumerations -enum GPIOPort: UInt32 { - case portA = 0 - case portB, portC, portD, portE, portF, portG, portH, portI, portJ, portK -} - -/// GPIO Pin numbers -enum GPIOPinNumber: UInt32 { - case pin0 = 0 - case pin1, pin2, pin3, pin4, pin5, pin6, pin7 - case pin8, pin9, pin10, pin11, pin12, pin13, pin14, pin15 - case pin16, pin17, pin18, pin19, pin20, pin21, pin22, pin23 - case pin24, pin25, pin26, pin27, pin28, pin29, pin30, pin31 - case pin32, pin33, pin34, pin35, pin36, pin37, pin38, pin39 - case pin40, pin41 -} - -/// Alternate Function modes -enum AltFunction: UInt8 { - case altFunc0 = 0 - case altFunc1, altFunc2, altFunc3, altFunc4, altFunc5, altFunc6, altFunc7 - case altFunc8, altFunc9, altFunc10, altFunc11, altFunc12, altFunc13, altFunc14, altFunc15 -} - -/// Pull-up/Pull-down configurations -enum GPIOPull: UInt32 { - case none = 0 - case pullUp - case pullDown -} - -/// GPIO pin speed configurations -enum GPIOSpeed: UInt8 { - case low = 0 - case medium - case high - case max -} - -/// GPIO pin modes -enum GPIOMode: UInt32 { - case input = 0 - case output - case alternate - case analog - case disabled -} - -/// GPIO output modes -enum GPIOOutput: UInt32 { - case pushPull = 0 - case openDrain -} - -/// GPIO pin definition structure -struct GPIOPin { - let name: String - let port: GPIOPort - let number: GPIOPinNumber - let mode: GPIOMode - let pull: GPIOPull - let outputType: GPIOOutput - let altFunction: AltFunction - let defaultValue: Bool - let speed: GPIOSpeed - let activeLow: Bool - let inUse: Bool - let isEndOfTable: Bool -} - -/// GPIO direct output control structure -struct GPIOOutputDirect { - let setRegister: UnsafeMutablePointer - let setValue: UInt32 - let clearRegister: UnsafeMutablePointer - let clearValue: UInt32 -} - -/// GPIO direct input control structure -struct GPIOInputDirect { - let register: UnsafeMutablePointer - let mask: UInt32 -} - -/// GPIO mode control structure -struct GPIOModeDirect { - let modeRegister: UnsafeMutablePointer - let modeMask: UInt32 - let inputMode: UInt32 - let outputMode: UInt32 -} - -/// Typealias for GPIO identifier -typealias GPIO = Int - -/// Helper functions to create pin configurations -extension GPIOPin { - static func gpioOutput(name: String, port: GPIOPort, pin: GPIOPinNumber, defaultValue: Bool) -> GPIOPin { - return GPIOPin( - name: name, - port: port, - number: pin, - mode: .output, - pull: .none, - outputType: .pushPull, - altFunction: .altFunc0, - defaultValue: defaultValue, - speed: .low, - activeLow: false, - inUse: true, - isEndOfTable: false - ) - } - - static func gpioOutputSpeed(name: String, port: GPIOPort, pin: GPIOPinNumber, defaultValue: Bool, speed: GPIOSpeed) - -> GPIOPin - { - return GPIOPin( - name: name, - port: port, - number: pin, - mode: .output, - pull: .none, - outputType: .pushPull, - altFunction: .altFunc0, - defaultValue: defaultValue, - speed: speed, - activeLow: false, - inUse: true, - isEndOfTable: false - ) - } - - static func gpioOutputActiveLow(name: String, port: GPIOPort, pin: GPIOPinNumber, defaultValue: Bool) -> GPIOPin { - return GPIOPin( - name: name, - port: port, - number: pin, - mode: .output, - pull: .none, - outputType: .pushPull, - altFunction: .altFunc0, - defaultValue: defaultValue, - speed: .low, - activeLow: true, - inUse: true, - isEndOfTable: false - ) - } - - static func gpioOutputOpenDrain(name: String, port: GPIOPort, pin: GPIOPinNumber, defaultValue: Bool) -> GPIOPin { - return GPIOPin( - name: name, - port: port, - number: pin, - mode: .output, - pull: .none, - outputType: .openDrain, - altFunction: .altFunc0, - defaultValue: defaultValue, - speed: .low, - activeLow: false, - inUse: true, - isEndOfTable: false - ) - } - - static func gpioOutputOpenDrainActiveLow(name: String, port: GPIOPort, pin: GPIOPinNumber, defaultValue: Bool) - -> GPIOPin - { - return GPIOPin( - name: name, - port: port, - number: pin, - mode: .output, - pull: .none, - outputType: .openDrain, - altFunction: .altFunc0, - defaultValue: defaultValue, - speed: .low, - activeLow: true, - inUse: true, - isEndOfTable: false - ) - } - - static func altFunction(name: String, port: GPIOPort, pin: GPIOPinNumber, alt: AltFunction, outputType: GPIOOutput) - -> GPIOPin - { - return GPIOPin( - name: name, - port: port, - number: pin, - mode: .alternate, - pull: .none, - outputType: outputType, - altFunction: alt, - defaultValue: false, - speed: .low, - activeLow: false, - inUse: true, - isEndOfTable: false - ) - } - - static func altFunctionSpeed( - name: String, port: GPIOPort, pin: GPIOPinNumber, alt: AltFunction, outputType: GPIOOutput, speed: GPIOSpeed - ) -> GPIOPin { - return GPIOPin( - name: name, - port: port, - number: pin, - mode: .alternate, - pull: .none, - outputType: outputType, - altFunction: alt, - defaultValue: false, - speed: speed, - activeLow: false, - inUse: true, - isEndOfTable: false - ) - } - - static func altFunctionSpeedPullUp( - name: String, port: GPIOPort, pin: GPIOPinNumber, alt: AltFunction, outputType: GPIOOutput, speed: GPIOSpeed - ) -> GPIOPin { - return GPIOPin( - name: name, - port: port, - number: pin, - mode: .alternate, - pull: .pullUp, - outputType: outputType, - altFunction: alt, - defaultValue: false, - speed: speed, - activeLow: false, - inUse: true, - isEndOfTable: false - ) - } - - static func analog(name: String, port: GPIOPort, pin: GPIOPinNumber) -> GPIOPin { - return GPIOPin( - name: name, - port: port, - number: pin, - mode: .analog, - pull: .none, - outputType: .pushPull, - altFunction: .altFunc0, - defaultValue: false, - speed: .low, - activeLow: false, - inUse: true, - isEndOfTable: false - ) - } - - static func disabled(name: String, port: GPIOPort, pin: GPIOPinNumber) -> GPIOPin { - return GPIOPin( - name: name, - port: port, - number: pin, - mode: .disabled, - pull: .none, - outputType: .pushPull, - altFunction: .altFunc0, - defaultValue: false, - speed: .low, - activeLow: false, - inUse: true, - isEndOfTable: false - ) - } - - static func gpioInput(name: String, port: GPIOPort, pin: GPIOPinNumber) -> GPIOPin { - return GPIOPin( - name: name, - port: port, - number: pin, - mode: .input, - pull: .none, - outputType: .pushPull, - altFunction: .altFunc0, - defaultValue: false, - speed: .low, - activeLow: false, - inUse: true, - isEndOfTable: false - ) - } - - static func gpioInputSpeed(name: String, port: GPIOPort, pin: GPIOPinNumber, speed: GPIOSpeed) -> GPIOPin { - return GPIOPin( - name: name, - port: port, - number: pin, - mode: .input, - pull: .none, - outputType: .pushPull, - altFunction: .altFunc0, - defaultValue: false, - speed: speed, - activeLow: false, - inUse: true, - isEndOfTable: false - ) - } - - static func gpioInputPullUp(name: String, port: GPIOPort, pin: GPIOPinNumber) -> GPIOPin { - return GPIOPin( - name: name, - port: port, - number: pin, - mode: .input, - pull: .pullUp, - outputType: .pushPull, - altFunction: .altFunc0, - defaultValue: false, - speed: .low, - activeLow: false, - inUse: true, - isEndOfTable: false - ) - } - - static func gpioInputPullDown(name: String, port: GPIOPort, pin: GPIOPinNumber) -> GPIOPin { - return GPIOPin( - name: name, - port: port, - number: pin, - mode: .input, - pull: .pullDown, - outputType: .pushPull, - altFunction: .altFunc0, - defaultValue: false, - speed: .low, - activeLow: false, - inUse: true, - isEndOfTable: false - ) - } - - static func gpioInputActiveLow(name: String, port: GPIOPort, pin: GPIOPinNumber) -> GPIOPin { - return GPIOPin( - name: name, - port: port, - number: pin, - mode: .input, - pull: .none, - outputType: .pushPull, - altFunction: .altFunc0, - defaultValue: false, - speed: .low, - activeLow: true, - inUse: true, - isEndOfTable: false - ) - } - - static func gpioInputActiveLowPullUp(name: String, port: GPIOPort, pin: GPIOPinNumber) -> GPIOPin { - return GPIOPin( - name: name, - port: port, - number: pin, - mode: .input, - pull: .pullUp, - outputType: .pushPull, - altFunction: .altFunc0, - defaultValue: false, - speed: .low, - activeLow: true, - inUse: true, - isEndOfTable: false - ) - } - - static func gpioInputActiveLowPullDown(name: String, port: GPIOPort, pin: GPIOPinNumber) -> GPIOPin { - return GPIOPin( - name: name, - port: port, - number: pin, - mode: .input, - pull: .pullDown, - outputType: .pushPull, - altFunction: .altFunc0, - defaultValue: false, - speed: .low, - activeLow: true, - inUse: true, - isEndOfTable: false - ) - } - - static func endTable(name: String) -> GPIOPin { - return GPIOPin( - name: name, - port: .portA, - number: .pin0, - mode: .disabled, - pull: .none, - outputType: .pushPull, - altFunction: .altFunc0, - defaultValue: false, - speed: .low, - activeLow: false, - inUse: false, - isEndOfTable: true - ) - } -} - -/// GPIO pin identifier enum -enum GPIOPinID: Int { - case greenLED, blueButton - case uart1TX, uart1RX - case i2c1SCL, i2c1SDA, i2c3SCL, i2c3SDA - case bbI2C_SCL, bbI2C_SDA - case lcdBLCtrl, lcdINT, lcdDISP - case _sdramA0, _sdramA1, _sdramA2, _sdramA3, _sdramA4, _sdramA5, _sdramA6, _sdramA7 - case _sdramA8, _sdramA9, _sdramA10, _sdramA11 - case _sdramBA0, _sdramBA1 - case _sdramDQ0, _sdramDQ1, _sdramDQ2, _sdramDQ3, _sdramDQ4, _sdramDQ5, _sdramDQ6, _sdramDQ7 - case _sdramDQ8, _sdramDQ9, _sdramDQ10, _sdramDQ11, _sdramDQ12, _sdramDQ13, _sdramDQ14, _sdramDQ15 - case _sdramSDNE0, _sdramSDNWE, _sdramSDNRAS, _sdramSDNCAS, _sdramSDCLK, _sdramSDCKE0 - case _sdramNBL0, _sdramNBL1 - case _lcdHSYNC, _lcdVSYNC, _lcdDOTCLK, _lcdENABLE - case _lcdB0, _lcdB1, _lcdB2, _lcdB3, _lcdB4, _lcdB5, _lcdB6, _lcdB7 - case _lcdR0, _lcdR1, _lcdR2, _lcdR3, _lcdR4, _lcdR5, _lcdR6, _lcdR7 - case _lcdG0, _lcdG1, _lcdG2, _lcdG3, _lcdG4, _lcdG5, _lcdG6, _lcdG7 - case _ethTXEN, _ethTXD0, _ethTXD1, _ethRXD0, _ethRXD1, _ethRXER, _ethCRSDV - case _ethMDC, _ethMDIO, _ethREFCLK - case _ulpiCK, _ulpiSTP, _ulpiDIR, _ulpiNXT - case _ulpiD0, _ulpiD1, _ulpiD2, _ulpiD3, _ulpiD4, _ulpiD5, _ulpiD6, _ulpiD7 - case otgHSOC - case tableEnd -} - -/// Pin table definition -/// Note: This implementation uses a dictionary-based lookup which requires: -/// - Memory allocations for the dictionary storage -/// - Runtime dependencies (e.g. on getentropy for hash randomization) -/// - Additional overhead for hash table operations -/// -/// If these dependencies are unwanted, this code could be optimized to use a -/// compile-time array or a switch statement instead. -let pinTable: [GPIOPinID: GPIOPin] = [ - // The LED on the eval board - .greenLED: .gpioOutput(name: "GREEN_LED", port: .portI, pin: .pin1, defaultValue: true), - - // User button on the board - .blueButton: .gpioInput(name: "BLUE_BUTTON", port: .portI, pin: .pin11), - - // Console UART - .uart1TX: .altFunction(name: "UART1_TX", port: .portA, pin: .pin9, alt: .altFunc7, outputType: .pushPull), - .uart1RX: .altFunction(name: "UART1_RX", port: .portB, pin: .pin7, alt: .altFunc7, outputType: .pushPull), - - // I2C buses - .i2c1SCL: .altFunction(name: "I2C1_SCL", port: .portB, pin: .pin8, alt: .altFunc4, outputType: .openDrain), - .i2c1SDA: .altFunction(name: "I2C1_SDA", port: .portB, pin: .pin9, alt: .altFunc4, outputType: .openDrain), - .i2c3SCL: .altFunction(name: "I2C3_SCL", port: .portH, pin: .pin7, alt: .altFunc4, outputType: .openDrain), - .i2c3SDA: .altFunction(name: "I2C3_SDA", port: .portH, pin: .pin8, alt: .altFunc4, outputType: .openDrain), - .bbI2C_SCL: .gpioInput(name: "BBI2C_SCL", port: .portF, pin: .pin8), - .bbI2C_SDA: .gpioInput(name: "BBI2C_SDA", port: .portF, pin: .pin9), - - // LCD pins - .lcdBLCtrl: .gpioOutput(name: "LCD_BL_CTRL", port: .portK, pin: .pin3, defaultValue: true), - .lcdINT: .gpioInputPullUp(name: "LCD_INT", port: .portI, pin: .pin13), - .lcdDISP: .gpioOutput(name: "LCD_DISP", port: .portI, pin: .pin12, defaultValue: true), - - // SDRAM pins - ._sdramA0: .altFunctionSpeed( - name: "_SDRAM_A0", port: .portF, pin: .pin0, alt: .altFunc12, outputType: .pushPull, speed: .max), - ._sdramA1: .altFunctionSpeed( - name: "_SDRAM_A1", port: .portF, pin: .pin1, alt: .altFunc12, outputType: .pushPull, speed: .max), - ._sdramA2: .altFunctionSpeed( - name: "_SDRAM_A2", port: .portF, pin: .pin2, alt: .altFunc12, outputType: .pushPull, speed: .max), - ._sdramA3: .altFunctionSpeed( - name: "_SDRAM_A3", port: .portF, pin: .pin3, alt: .altFunc12, outputType: .pushPull, speed: .max), - ._sdramA4: .altFunctionSpeed( - name: "_SDRAM_A4", port: .portF, pin: .pin4, alt: .altFunc12, outputType: .pushPull, speed: .max), - ._sdramA5: .altFunctionSpeed( - name: "_SDRAM_A5", port: .portF, pin: .pin5, alt: .altFunc12, outputType: .pushPull, speed: .max), - ._sdramA6: .altFunctionSpeed( - name: "_SDRAM_A6", port: .portF, pin: .pin12, alt: .altFunc12, outputType: .pushPull, speed: .max), - ._sdramA7: .altFunctionSpeed( - name: "_SDRAM_A7", port: .portF, pin: .pin13, alt: .altFunc12, outputType: .pushPull, speed: .max), - ._sdramA8: .altFunctionSpeed( - name: "_SDRAM_A8", port: .portF, pin: .pin14, alt: .altFunc12, outputType: .pushPull, speed: .max), - ._sdramA9: .altFunctionSpeed( - name: "_SDRAM_A9", port: .portF, pin: .pin15, alt: .altFunc12, outputType: .pushPull, speed: .max), - ._sdramA10: .altFunctionSpeed( - name: "_SDRAM_A10", port: .portG, pin: .pin0, alt: .altFunc12, outputType: .pushPull, speed: .max), - ._sdramA11: .altFunctionSpeed( - name: "_SDRAM_A11", port: .portG, pin: .pin1, alt: .altFunc12, outputType: .pushPull, speed: .max), - - ._sdramBA0: .altFunctionSpeed( - name: "_SDRAM_BA0", port: .portG, pin: .pin4, alt: .altFunc12, outputType: .pushPull, speed: .max), - ._sdramBA1: .altFunctionSpeed( - name: "_SDRAM_BA1", port: .portG, pin: .pin5, alt: .altFunc12, outputType: .pushPull, speed: .max), - - ._sdramDQ0: .altFunctionSpeed( - name: "_SDRAM_DQ0", port: .portD, pin: .pin14, alt: .altFunc12, outputType: .pushPull, speed: .max), - ._sdramDQ1: .altFunctionSpeed( - name: "_SDRAM_DQ1", port: .portD, pin: .pin15, alt: .altFunc12, outputType: .pushPull, speed: .max), - ._sdramDQ2: .altFunctionSpeed( - name: "_SDRAM_DQ2", port: .portD, pin: .pin0, alt: .altFunc12, outputType: .pushPull, speed: .max), - ._sdramDQ3: .altFunctionSpeed( - name: "_SDRAM_DQ3", port: .portD, pin: .pin1, alt: .altFunc12, outputType: .pushPull, speed: .max), - ._sdramDQ4: .altFunctionSpeed( - name: "_SDRAM_DQ4", port: .portE, pin: .pin7, alt: .altFunc12, outputType: .pushPull, speed: .max), - ._sdramDQ5: .altFunctionSpeed( - name: "_SDRAM_DQ5", port: .portE, pin: .pin8, alt: .altFunc12, outputType: .pushPull, speed: .max), - ._sdramDQ6: .altFunctionSpeed( - name: "_SDRAM_DQ6", port: .portE, pin: .pin9, alt: .altFunc12, outputType: .pushPull, speed: .max), - ._sdramDQ7: .altFunctionSpeed( - name: "_SDRAM_DQ7", port: .portE, pin: .pin10, alt: .altFunc12, outputType: .pushPull, speed: .max), - ._sdramDQ8: .altFunctionSpeed( - name: "_SDRAM_DQ8", port: .portE, pin: .pin11, alt: .altFunc12, outputType: .pushPull, speed: .max), - ._sdramDQ9: .altFunctionSpeed( - name: "_SDRAM_DQ9", port: .portE, pin: .pin12, alt: .altFunc12, outputType: .pushPull, speed: .max), - ._sdramDQ10: .altFunctionSpeed( - name: "_SDRAM_DQ10", port: .portE, pin: .pin13, alt: .altFunc12, outputType: .pushPull, speed: .max), - ._sdramDQ11: .altFunctionSpeed( - name: "_SDRAM_DQ11", port: .portE, pin: .pin14, alt: .altFunc12, outputType: .pushPull, speed: .max), - ._sdramDQ12: .altFunctionSpeed( - name: "_SDRAM_DQ12", port: .portE, pin: .pin15, alt: .altFunc12, outputType: .pushPull, speed: .max), - ._sdramDQ13: .altFunctionSpeed( - name: "_SDRAM_DQ13", port: .portD, pin: .pin8, alt: .altFunc12, outputType: .pushPull, speed: .max), - ._sdramDQ14: .altFunctionSpeed( - name: "_SDRAM_DQ14", port: .portD, pin: .pin9, alt: .altFunc12, outputType: .pushPull, speed: .max), - ._sdramDQ15: .altFunctionSpeed( - name: "_SDRAM_DQ15", port: .portD, pin: .pin10, alt: .altFunc12, outputType: .pushPull, speed: .max), - - ._sdramSDNE0: .altFunctionSpeed( - name: "_SDRAM_SDNE0", port: .portH, pin: .pin3, alt: .altFunc12, outputType: .pushPull, speed: .max), - ._sdramSDNWE: .altFunctionSpeed( - name: "_SDRAM_SDNWE", port: .portH, pin: .pin5, alt: .altFunc12, outputType: .pushPull, speed: .max), - ._sdramSDNRAS: .altFunctionSpeed( - name: "_SDRAM_SDNRAS", port: .portF, pin: .pin11, alt: .altFunc12, outputType: .pushPull, speed: .max), - ._sdramSDNCAS: .altFunctionSpeed( - name: "_SDRAM_SDNCAS", port: .portG, pin: .pin15, alt: .altFunc12, outputType: .pushPull, speed: .max), - ._sdramSDCLK: .altFunctionSpeed( - name: "_SDRAM_SDCLK", port: .portG, pin: .pin8, alt: .altFunc12, outputType: .pushPull, speed: .max), - ._sdramSDCKE0: .altFunctionSpeed( - name: "_SDRAM_SDCKE0", port: .portC, pin: .pin3, alt: .altFunc12, outputType: .pushPull, speed: .max), - - ._sdramNBL0: .altFunctionSpeed( - name: "_SDRAM_NBL0", port: .portE, pin: .pin0, alt: .altFunc12, outputType: .pushPull, speed: .max), - ._sdramNBL1: .altFunctionSpeed( - name: "_SDRAM_NBL1", port: .portE, pin: .pin1, alt: .altFunc12, outputType: .pushPull, speed: .max), - - // LCD pins - ._lcdHSYNC: .altFunction(name: "_LCD_HSYNC", port: .portI, pin: .pin9, alt: .altFunc14, outputType: .pushPull), - ._lcdVSYNC: .altFunction(name: "_LCD_VSYNC", port: .portI, pin: .pin8, alt: .altFunc14, outputType: .pushPull), - ._lcdDOTCLK: .altFunction(name: "_LCD_DOTCLK", port: .portI, pin: .pin14, alt: .altFunc14, outputType: .pushPull), - ._lcdENABLE: .altFunction(name: "_LCD_ENABLE", port: .portK, pin: .pin7, alt: .altFunc14, outputType: .pushPull), - - ._lcdB0: .altFunctionSpeed( - name: "_LCD_B0", port: .portE, pin: .pin4, alt: .altFunc14, outputType: .pushPull, speed: .max), - ._lcdB1: .altFunctionSpeed( - name: "_LCD_B1", port: .portJ, pin: .pin13, alt: .altFunc14, outputType: .pushPull, speed: .max), - ._lcdB2: .altFunctionSpeed( - name: "_LCD_B2", port: .portJ, pin: .pin14, alt: .altFunc14, outputType: .pushPull, speed: .max), - ._lcdB3: .altFunctionSpeed( - name: "_LCD_B3", port: .portJ, pin: .pin15, alt: .altFunc14, outputType: .pushPull, speed: .max), - ._lcdB4: .altFunctionSpeed( - name: "_LCD_B4", port: .portG, pin: .pin12, alt: .altFunc14, outputType: .pushPull, speed: .max), - ._lcdB5: .altFunctionSpeed( - name: "_LCD_B5", port: .portK, pin: .pin4, alt: .altFunc14, outputType: .pushPull, speed: .max), - ._lcdB6: .altFunctionSpeed( - name: "_LCD_B6", port: .portK, pin: .pin5, alt: .altFunc14, outputType: .pushPull, speed: .max), - ._lcdB7: .altFunctionSpeed( - name: "_LCD_B7", port: .portK, pin: .pin6, alt: .altFunc14, outputType: .pushPull, speed: .max), - - ._lcdR0: .altFunctionSpeed( - name: "_LCD_R0", port: .portI, pin: .pin15, alt: .altFunc14, outputType: .pushPull, speed: .max), - ._lcdR1: .altFunctionSpeed( - name: "_LCD_R1", port: .portJ, pin: .pin0, alt: .altFunc14, outputType: .pushPull, speed: .max), - ._lcdR2: .altFunctionSpeed( - name: "_LCD_R2", port: .portJ, pin: .pin1, alt: .altFunc14, outputType: .pushPull, speed: .max), - ._lcdR3: .altFunctionSpeed( - name: "_LCD_R3", port: .portJ, pin: .pin2, alt: .altFunc14, outputType: .pushPull, speed: .max), - ._lcdR4: .altFunctionSpeed( - name: "_LCD_R4", port: .portJ, pin: .pin3, alt: .altFunc14, outputType: .pushPull, speed: .max), - ._lcdR5: .altFunctionSpeed( - name: "_LCD_R5", port: .portJ, pin: .pin4, alt: .altFunc14, outputType: .pushPull, speed: .max), - ._lcdR6: .altFunctionSpeed( - name: "_LCD_R6", port: .portJ, pin: .pin5, alt: .altFunc14, outputType: .pushPull, speed: .max), - ._lcdR7: .altFunctionSpeed( - name: "_LCD_R7", port: .portJ, pin: .pin6, alt: .altFunc14, outputType: .pushPull, speed: .max), - - ._lcdG0: .altFunctionSpeed( - name: "_LCD_G0", port: .portJ, pin: .pin7, alt: .altFunc14, outputType: .pushPull, speed: .max), - ._lcdG1: .altFunctionSpeed( - name: "_LCD_G1", port: .portJ, pin: .pin8, alt: .altFunc14, outputType: .pushPull, speed: .max), - ._lcdG2: .altFunctionSpeed( - name: "_LCD_G2", port: .portJ, pin: .pin9, alt: .altFunc14, outputType: .pushPull, speed: .max), - ._lcdG3: .altFunctionSpeed( - name: "_LCD_G3", port: .portJ, pin: .pin10, alt: .altFunc14, outputType: .pushPull, speed: .max), - ._lcdG4: .altFunctionSpeed( - name: "_LCD_G4", port: .portJ, pin: .pin10, alt: .altFunc14, outputType: .pushPull, speed: .max), - ._lcdG5: .altFunctionSpeed( - name: "_LCD_G5", port: .portK, pin: .pin0, alt: .altFunc14, outputType: .pushPull, speed: .max), - ._lcdG6: .altFunctionSpeed( - name: "_LCD_G6", port: .portK, pin: .pin1, alt: .altFunc14, outputType: .pushPull, speed: .max), - ._lcdG7: .altFunctionSpeed( - name: "_LCD_G7", port: .portK, pin: .pin2, alt: .altFunc14, outputType: .pushPull, speed: .max), - - // Ethernet - ._ethTXEN: .altFunctionSpeed( - name: "_ETH_TX_EN", port: .portG, pin: .pin11, alt: .altFunc11, outputType: .pushPull, speed: .max), - ._ethTXD0: .altFunctionSpeed( - name: "_ETH_TXD0", port: .portG, pin: .pin13, alt: .altFunc11, outputType: .pushPull, speed: .max), - ._ethTXD1: .altFunctionSpeed( - name: "_ETH_TXD1", port: .portG, pin: .pin14, alt: .altFunc11, outputType: .pushPull, speed: .max), - ._ethRXD0: .altFunctionSpeed( - name: "_ETH_RXD0", port: .portC, pin: .pin4, alt: .altFunc11, outputType: .pushPull, speed: .max), - ._ethRXD1: .altFunctionSpeed( - name: "_ETH_RXD1", port: .portC, pin: .pin5, alt: .altFunc11, outputType: .pushPull, speed: .max), - ._ethRXER: .altFunctionSpeed( - name: "_ETH_RXER", port: .portG, pin: .pin2, alt: .altFunc11, outputType: .pushPull, speed: .max), - ._ethCRSDV: .altFunctionSpeed( - name: "_ETH_CRS_DV", port: .portA, pin: .pin7, alt: .altFunc11, outputType: .pushPull, speed: .max), - ._ethMDC: .altFunctionSpeed( - name: "_ETH_MDC", port: .portC, pin: .pin1, alt: .altFunc11, outputType: .pushPull, speed: .max), - ._ethMDIO: .altFunctionSpeed( - name: "_ETH_MDIO", port: .portA, pin: .pin2, alt: .altFunc11, outputType: .pushPull, speed: .max), - ._ethREFCLK: .altFunctionSpeed( - name: "_ETH_REF_CLK", port: .portA, pin: .pin1, alt: .altFunc11, outputType: .pushPull, speed: .max), - - // USB HS - ._ulpiCK: .altFunctionSpeed( - name: "_ULPI_CK", port: .portA, pin: .pin5, alt: .altFunc10, outputType: .pushPull, speed: .max), - ._ulpiSTP: .altFunctionSpeed( - name: "_ULPI_STP", port: .portC, pin: .pin0, alt: .altFunc10, outputType: .pushPull, speed: .max), - ._ulpiDIR: .altFunctionSpeed( - name: "_ULPI_DIR", port: .portC, pin: .pin2, alt: .altFunc10, outputType: .pushPull, speed: .max), - ._ulpiNXT: .altFunctionSpeed( - name: "_ULPI_NXT", port: .portH, pin: .pin4, alt: .altFunc10, outputType: .pushPull, speed: .max), - ._ulpiD0: .altFunctionSpeed( - name: "_ULPI_D0", port: .portA, pin: .pin3, alt: .altFunc10, outputType: .pushPull, speed: .max), - ._ulpiD1: .altFunctionSpeed( - name: "_ULPI_D1", port: .portB, pin: .pin0, alt: .altFunc10, outputType: .pushPull, speed: .max), - ._ulpiD2: .altFunctionSpeed( - name: "_ULPI_D2", port: .portB, pin: .pin1, alt: .altFunc10, outputType: .pushPull, speed: .max), - ._ulpiD3: .altFunctionSpeed( - name: "_ULPI_D3", port: .portB, pin: .pin10, alt: .altFunc10, outputType: .pushPull, speed: .max), - ._ulpiD4: .altFunctionSpeed( - name: "_ULPI_D4", port: .portB, pin: .pin11, alt: .altFunc10, outputType: .pushPull, speed: .max), - ._ulpiD5: .altFunctionSpeed( - name: "_ULPI_D5", port: .portB, pin: .pin12, alt: .altFunc10, outputType: .pushPull, speed: .max), - ._ulpiD6: .altFunctionSpeed( - name: "_ULPI_D6", port: .portB, pin: .pin13, alt: .altFunc10, outputType: .pushPull, speed: .max), - ._ulpiD7: .altFunctionSpeed( - name: "_ULPI_D7", port: .portB, pin: .pin5, alt: .altFunc10, outputType: .pushPull, speed: .max), - - .otgHSOC: .gpioInput(name: "OTG_HS_OC", port: .portE, pin: .pin3), -] - -let GPIO_CHANNELS = 11 - -/// Initialize all GPIO pins -func initGpio() { - for (_, pin) in pinTable { - if pin.inUse { - gpioInitPin(pin: pin) - } - } -} - -/// Track which ports have been enabled -var gpioPortEnabled: [Bool] = Array(repeating: false, count: GPIO_CHANNELS) - -/// GPIO port base registers indexed by the port enum -let gpioPortBases: [GPIOA] = [ - gpioa, - gpiob, - gpioc, - gpiod, - gpioe, - gpiof, - gpiog, - gpioh, - gpioi, - gpioj, - gpiok, -] - -/// Map of GPIO pull values to hardware values -let gpioPullupMap: [UInt8] = [ - 0, // GPIO_PINPULL_NONE - See 7.4.4 in RM0390 - 1, // GPIO_PINPULL_UP - 2, // GPIO_PINPULL_DOWN -] - -extension Register { - func set(index: Int, value: GPIOA.PUPDR.PUPDR0Values) { - self.clear(index: index) - self.modify { $0.storage |= UInt32(value.rawValue) << (2 * index) } - } - func clear(index: Int) { - self.modify { $0.storage &= ~(0b11 << (2 * index)) } - } -} -extension Register { - func set(index: Int, value: GPIOA.MODER.MODER0Values) { - self.clear(index: index) - self.modify { $0.storage |= UInt32(value.rawValue) << (2 * index) } - } - func clear(index: Int) { - self.modify { $0.storage &= ~(0b11 << (2 * index)) } - } -} -extension Register { - func set(index: Int, value: GPIOA.OSPEEDR.OSPEEDR0Values) { - self.clear(index: index) - self.modify { $0.storage |= UInt32(value.rawValue) << (2 * index) } - } - func clear(index: Int) { - self.modify { $0.storage &= ~(0b11 << (2 * index)) } - } -} -extension Register { - func set(index: Int, value: Bool = true) { - guard value else { - self.clear(index: index) - return - } - self.modify { $0.storage |= 1 << (1 * index) } - } - func clear(index: Int) { - self.modify { $0.storage &= ~(1 << (1 * index)) } - } -} -extension Register { - func set(gpioPort index: Int) { - self.modify { $0.storage |= 1 << (1 * index) } - } - func clear(gpioPort index: Int) { - self.modify { $0.storage &= ~(1 << (1 * index)) } - } -} -extension Register { - func set(index: Int) { - self.write { $0.storage = UInt32(1) << Int(index) } - } - func clear(index: Int) { - self.write { $0.storage = UInt32(1) << (16 + Int(index)) } - } -} -extension GPIOA { - func afrSet(index: Int, value: GPIOA.AFRL.AFRL0Values) { - precondition(index >= 0 && index < 16) - let afrShift = (index % 8) * 4 - if index >= 8 { - self.afrh.modify { - $0.storage &= ~(0b1111 << afrShift) - $0.storage |= UInt32(value.rawValue) << afrShift - } - } else { - self.afrl.modify { - $0.storage &= ~(0b1111 << afrShift) - $0.storage |= UInt32(value.rawValue) << afrShift - } - } - } -} - -/// Disable a pin (effectively reset to POR-state) -private func gpioDisabled(pin: GPIOPin) { - let port = gpioPortBases[Int(pin.port.rawValue)] - let pinNumber = Int(pin.number.rawValue) - - port.moder.clear(index: pinNumber) // clear mode to INPUT - port.otyper.clear(index: pinNumber) // push-pull - - port.pupdr.clear(index: pinNumber) // set mode to no pulls - port.ospeedr.set(index: pinNumber, value: .init(rawValue: pin.speed.rawValue)) // set speed -} - -/// Disable a pin by its GPIO identifier -/// -/// - Parameter gpio: The GPIO identifier -func gpioDisabled(gpio: GPIO) { - if let pin = pinTable[GPIOPinID(rawValue: gpio) ?? .tableEnd] { - gpioDisabled(pin: pin) - } -} - -/// Enable clock for a specific GPIO port -/// -/// - Parameter port: The port number to enable -private func enableClockForPort(port: UInt32) { - // Enable each port at most once, and leave it enabled - precondition(port < UInt32(GPIO_CHANNELS)) - - withInterruptsDisabled { - - if !gpioPortEnabled[Int(port)] { - gpioPortEnabled[Int(port)] = true - - // Enable the clock for this port - rcc.ahb1enr.set(gpioPort: Int(port)) - - // Wait two peripheral clocks - delay(2) - } - - } -} - -/// Initialize a single GPIO pin from its configuration -/// -/// - Parameter pin: The pin configuration -func gpioInitPin(pin: GPIOPin) { - // Enable clocks to this port, and leave enabled at all times - enableClockForPort(port: pin.port.rawValue) - - // Handy pointers - let port = gpioPortBases[Int(pin.port.rawValue)] - let pinNumber = pin.number.rawValue - - // Default everything to the state at POR - gpioDisabled(pin: pin) - - // Set up the pin - switch pin.mode { - case .input: - // For a real input pin, set the pullup mode - port.pupdr.set(index: Int(pinNumber), value: .init(rawValue: gpioPullupMap[Int(pin.pull.rawValue)])) - - case .output: - port.moder.set(index: Int(pinNumber), value: .init(rawValue: 1)) // mode OUTPUT - - if pin.outputType == .pushPull { - port.otyper.clear(index: Int(pinNumber)) // push-pull - } else { - port.otyper.set(index: Int(pinNumber)) // open-drain - } - - // Set the default output value - if pin.defaultValue { - port.bsrr.set(index: Int(pinNumber)) - } else { - port.bsrr.clear(index: Int(pinNumber)) - } - - case .alternate: - port.moder.set(index: Int(pinNumber), value: .init(rawValue: 2)) // mode ALT FUNC - - // Set the alternate function - port.afrSet(index: Int(pinNumber), value: .init(rawValue: pin.altFunction.rawValue)) - - // push-pull or open-drain - port.otyper.set(index: Int(pinNumber), value: pin.outputType == .openDrain) - - case .analog: - port.moder.set(index: Int(pinNumber), value: .init(rawValue: 3)) // mode ANALOG - - case .disabled: - // Already handled by gpioDisabled - break - } -} diff --git a/stm32-lvgl/Sources/Application/Sdram.swift b/stm32-lvgl/Sources/Application/Sdram.swift deleted file mode 100644 index 392af049..00000000 --- a/stm32-lvgl/Sources/Application/Sdram.swift +++ /dev/null @@ -1,109 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2025 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -import MMIO -import Registers -import Support - -let dramBase = UnsafeMutableRawPointer(bitPattern: 0xC000_0000 as UInt)! -let dramBaseAsUInt32 = UnsafeMutablePointer(bitPattern: 0xC000_0000 as UInt)! -let dramSize = 0x0080_0000 // 8 MB - -// SDRAM part is a MT48LC4M32B2B5 (Micron) -// Geometry (bits): 12 row, 8 col, 2 bank -// Data width: 16 bits -// Clock frequency: 133Mhz -// Refresh rate: 4K/64ms. - -// The SDRAM clock can only be generated as 1/2 or 1/3 the core clock, -// so we'll run it at 168 / 2 = 84MHz. Kinda pokey. -// CAS Latency will be 3. - -// Initialize the SDRAM controller. This is somewhat specific to -// the chip populated on the discovery board. -func initSdram() { - // Enable clock to the FMC - rcc.ahb3enr.modify { $0.fmcen = .Enabled } - - // Program memory device features into FMC_SDCRx - fmc.sdcr[0].write { - $0.rpipe = .Clocks1 // One clock cycle pipe delay - $0.sdclk = .Div2 // SDCLK is 1/2 HCLK - $0.cas = .Clocks3 // CAS latency 3 - $0.nb = .NB4 // 4 banks - $0.mwid = .Bits16 // 16 bits wide - $0.nr = .Bits12 // 12 row bits - $0.nc = .Bits8 // 8 col bits - } - - // Program memory timing into FMC_SDTRx - fmc.sdtr[0].write { - $0.raw.tmrd = 1 // 1 cycle - $0.raw.txsr = 5 // 6 cycles, 72ns - $0.raw.tras = 3 // 4 cycles, 48ns - $0.raw.trc = 5 // 6 cycles, 72ns - $0.raw.twr = 1 // 2 cycles for CAS=3 - $0.raw.trp = 1 // 2 cycles, 24ns - $0.raw.trcd = 1 // 2 cycles, 24ns - } - - while fmc.sdsr.read().raw.busy != 0 { /* busy wait */ } - - // Set mode bits to '001' and configure FMC_SDCMR to start clock - fmc.sdcmr.write { - $0.raw.mode = 1 // Clock config enable - $0.raw.nrfs = 1 // Number of refresh cycles - $0.raw.ctb1 = 1 // Chip is on 1st csel - } - - delay(1000) // Wait - - // Set mode bits to '010' and configure FMC_SDCMR to issue "precharge all" - fmc.sdcmr.write { - $0.raw.mode = 2 // Precharge All - $0.raw.nrfs = 1 // Number of refresh cycles - $0.raw.ctb1 = 1 // Chip is on 1st csel - } - - while fmc.sdsr.read().raw.busy != 0 { /* busy wait */ } - - // Set mode bits to '011' and configure FMC_SDCMR to start auto-refresh - fmc.sdcmr.write { - $0.raw.mode = 3 // Start auto-refresh - $0.raw.nrfs = 4 // Number of refresh cycles - $0.raw.ctb1 = 1 // Chip is on 1st csel - } - - while fmc.sdsr.read().raw.busy != 0 { /* busy wait */ } - - // Configure MRD field for specific device (latency) and issue "Load Mode Register" - fmc.sdcmr.write { - $0.raw.mode = 4 // Load Mode Register - $0.raw.nrfs = 1 // Number of refresh cycles - $0.raw.mrd = 0x230 // Mode value (2<<4) - $0.raw.ctb1 = 1 // Chip is on 1st csel - } - - while fmc.sdsr.read().raw.busy != 0 { /* busy wait */ } - - // Program refresh rate into FMC_SDRTR. 64ms spread out over 4K rows, so 15.625us/row - // with 12ns per cycle, that's 1302 cycles/row. Subtract 20 so 1282. - fmc.sdrtr.write { - $0.raw.count = 683 // Refresh rate - } - - while fmc.sdsr.read().raw.busy != 0 { /* busy wait */ } - - // Clear out memory. - for i in 0.. TouchData { - // Read device registers 0x00 through 0x06: - // 0x00 DEVIDE_MODE Device Mode (bits 4...6) - // 0x01 GEST_ID Gesture ID - // 0x02 TD_STATUS Number of touch points (bits 0...3) - // 0x03 TOUCH1_XH 1st Event Flag (bits 6...7), 1st Touch X Position Hi Bits (bits 0...3) - // 0x04 TOUCH1_XL 1st Touch X Position Lo Bits - // 0x05 TOUCH1_YH 1st Touch ID (bits 4...7), 1st Touch Y Position Hi Bits (bits 0...3) - // 0x06 TOUCH1_YL 1st Touch Y Position Lo Bits - - guard touchPanel.write(data: [0x00]) else { - print("Send failed") - return TouchData(numberOfTouchPoints: 0, x: 0, y: 0) - } - - var buf = [UInt8](repeating: 0, count: 7) - guard touchPanel.read(buffer: &buf, length: 7) else { - print("Read failed") - return TouchData(numberOfTouchPoints: 0, x: 0, y: 0) - } - - let x = Int(buf[3] & 0b1111) << 8 | Int(buf[4]) - let y = Int(buf[5] & 0b1111) << 8 | Int(buf[6]) - - // On STM32F746G discovery board, the x and y are swapped. - return TouchData(numberOfTouchPoints: Int(buf[2] & 0b1111), x: y, y: x) - } - -} diff --git a/stm32-lvgl/Sources/Application/UIAppLogic.swift b/stm32-lvgl/Sources/Application/UIAppLogic.swift deleted file mode 100644 index 67dbfeca..00000000 --- a/stm32-lvgl/Sources/Application/UIAppLogic.swift +++ /dev/null @@ -1,139 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2025 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -import CLVGL - -// This is shared code (via a symlink) between the firmware build and the host -// SDL-based "simulator" app. No platform/firmware specific logic to stay -// portable. -enum UIAppLogic { - static var clickCount = 0 - static var button: OpaquePointer! = nil - static var buttonLabel: OpaquePointer! = nil - static var spinnerLabel: OpaquePointer! = nil - - static var frameCounter = 0 - - // Keep styles persistent for the lifetime of the application - static var style = lv_style_t() - static var labelStyle = lv_style_t() - static var gradient = lv_grad_dsc_t() - - static var widgetDemoScreen: OpaquePointer! = nil - - static func createUI() { - // Get the active screen - let screen = lv_screen_active() - - // Create a gradient background - lv_style_init(&style) - - // Create gradient colors (blue to red) - gradient.dir = LV_GRAD_DIR_VER - gradient.stops_count = 2 - gradient.stops.0.color = lv_color_make(0, 0, 0) // Black - gradient.stops.0.opa = UInt8(LV_OPA_COVER) - gradient.stops.0.frac = 0 - gradient.stops.1.color = lv_color_make(255, 0, 0) // Red - gradient.stops.1.opa = UInt8(LV_OPA_COVER) - gradient.stops.1.frac = 255 - - // Apply gradient to the style background - lv_style_set_bg_grad(&style, &gradient) - lv_style_set_bg_opa(&style, UInt8(LV_OPA_COVER)) - - // Apply the style to the screen - lv_obj_add_style(screen, &style, 0) - - // Create a button in the top right - button = lv_button_create(screen) - lv_obj_set_size(button, 120, 50) - lv_obj_align(button, LV_ALIGN_TOP_RIGHT, -10, 10) - buttonLabel = lv_label_create(button) - lv_label_set_text(buttonLabel, "Click me") - lv_obj_center(buttonLabel) - lv_obj_add_event_cb( - button, - { event in - Self.clickCount += 1 - lv_label_set_text(Self.buttonLabel, "Clicked \(Self.clickCount)") - }, LV_EVENT_CLICKED, nil) - - // Create a 'Demo' button in the bottom right - let demoButton = lv_button_create(screen) - lv_obj_set_size(demoButton, 120, 50) - lv_obj_align(demoButton, LV_ALIGN_BOTTOM_RIGHT, -10, -10) - let demoButtonLabel = lv_label_create(demoButton) - lv_label_set_text(demoButtonLabel, "Widget Demo") - lv_obj_center(demoButtonLabel) - lv_obj_add_event_cb( - demoButton, - { event in - lv_screen_load(Self.widgetDemoScreen) - }, LV_EVENT_CLICKED, nil) - - // Create a label - let label = lv_label_create(screen) - lv_label_set_text(label, "Hello LVGL!") - lv_obj_align(label, LV_ALIGN_TOP_MID, 0, 20) - - // Make the label white for better visibility - lv_style_init(&labelStyle) - lv_style_set_text_color(&labelStyle, lv_color_white()) - lv_obj_add_style(label, &labelStyle, 0) - - // Create a spinner - let spinner = lv_spinner_create(screen) - - // Set spinner size - lv_obj_set_size(spinner, 60, 60) - - // Center the spinner on screen - lv_obj_align(spinner, LV_ALIGN_CENTER, 0, 0) - - // Configure spinner animation - lv_spinner_set_anim_params(spinner, 2_000, 200) // anim time, angle - - // Create a dropdown menu - let dropdown = lv_dropdown_create(screen) - lv_dropdown_set_options(dropdown, "Option 1\nOption 2\nOption 3\nOption 4") - lv_obj_set_size(dropdown, 150, 40) - lv_obj_align(dropdown, LV_ALIGN_TOP_LEFT, 10, 10) - - // Add event handler for dropdown selection - lv_obj_add_event_cb( - dropdown, - { event in - let dropdown = lv_event_get_target_obj(event) - let selectedIndex = lv_dropdown_get_selected(dropdown) - print("Selected option \(selectedIndex)") - }, LV_EVENT_VALUE_CHANGED, nil) - - // Add a label under the spinner - spinnerLabel = lv_label_create(screen) - lv_label_set_text(spinnerLabel, "Loading...") - lv_obj_align(spinnerLabel, LV_ALIGN_BOTTOM_LEFT, 20, -20) - lv_obj_add_style(spinnerLabel, &labelStyle, 0) - - // Create a 2nd screen with the widgets demo app from LVGL, then switch back - // to the original screen. - widgetDemoScreen = lv_obj_create(nil) - lv_screen_load(widgetDemoScreen) - @_extern(c) func lv_demo_widgets() - lv_demo_widgets() - lv_screen_load(screen) - } - - static func updateFrame() { - frameCounter += 1 - lv_label_set_text(spinnerLabel, "Uptime (ms): \(uptimeInMs)\nFrames: \(frameCounter)") - } -} diff --git a/stm32-lvgl/Sources/CLVGL/include/CLVGL.h b/stm32-lvgl/Sources/CLVGL/include/CLVGL.h deleted file mode 100644 index 88980249..00000000 --- a/stm32-lvgl/Sources/CLVGL/include/CLVGL.h +++ /dev/null @@ -1,12 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2025 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -#include "../../../lvgl/lvgl.h" diff --git a/stm32-lvgl/Sources/CLVGL/include/lv_conf.h b/stm32-lvgl/Sources/CLVGL/include/lv_conf.h deleted file mode 100644 index ea619dcc..00000000 --- a/stm32-lvgl/Sources/CLVGL/include/lv_conf.h +++ /dev/null @@ -1,1273 +0,0 @@ -#ifndef LV_CONF_H -#define LV_CONF_H - -/*==================== - COLOR SETTINGS - *====================*/ - -/** Color depth: 1 (I1), 8 (L8), 16 (RGB565), 24 (RGB888), 32 (XRGB8888) */ -#define LV_COLOR_DEPTH 32 - -/********************* - * DEMO USAGE - *********************/ - -#define LV_USE_DEMO_WIDGETS 1 - -/*========================= - STDLIB WRAPPER SETTINGS - *=========================*/ - -/** Possible values - * - LV_STDLIB_BUILTIN: LVGL's built in implementation - * - LV_STDLIB_CLIB: Standard C functions, like malloc, strlen, etc - * - LV_STDLIB_MICROPYTHON: MicroPython implementation - * - LV_STDLIB_RTTHREAD: RT-Thread implementation - * - LV_STDLIB_CUSTOM: Implement the functions externally - */ -#define LV_USE_STDLIB_MALLOC LV_STDLIB_BUILTIN - -/** Possible values - * - LV_STDLIB_BUILTIN: LVGL's built in implementation - * - LV_STDLIB_CLIB: Standard C functions, like malloc, strlen, etc - * - LV_STDLIB_MICROPYTHON: MicroPython implementation - * - LV_STDLIB_RTTHREAD: RT-Thread implementation - * - LV_STDLIB_CUSTOM: Implement the functions externally - */ -#define LV_USE_STDLIB_STRING LV_STDLIB_BUILTIN - -/** Possible values - * - LV_STDLIB_BUILTIN: LVGL's built in implementation - * - LV_STDLIB_CLIB: Standard C functions, like malloc, strlen, etc - * - LV_STDLIB_MICROPYTHON: MicroPython implementation - * - LV_STDLIB_RTTHREAD: RT-Thread implementation - * - LV_STDLIB_CUSTOM: Implement the functions externally - */ -#define LV_USE_STDLIB_SPRINTF LV_STDLIB_BUILTIN - -#define LV_STDINT_INCLUDE -#define LV_STDDEF_INCLUDE -#define LV_STDBOOL_INCLUDE -#define LV_INTTYPES_INCLUDE -#define LV_LIMITS_INCLUDE -#define LV_STDARG_INCLUDE - -#if LV_USE_STDLIB_MALLOC == LV_STDLIB_BUILTIN - /** Size of memory available for `lv_malloc()` in bytes (>= 2kB) */ - #define LV_MEM_SIZE (96 * 1024U) /**< [bytes] */ - - /** Size of the memory expand for `lv_malloc()` in bytes */ - #define LV_MEM_POOL_EXPAND_SIZE 0 - - /** Set an address for the memory pool instead of allocating it as a normal array. Can be in external SRAM too. */ - #define LV_MEM_ADR 0 /**< 0: unused*/ - /* Instead of an address give a memory allocator that will be called to get a memory pool for LVGL. E.g. my_malloc */ - #if LV_MEM_ADR == 0 - #undef LV_MEM_POOL_INCLUDE - #undef LV_MEM_POOL_ALLOC - #endif -#endif /*LV_USE_STDLIB_MALLOC == LV_STDLIB_BUILTIN*/ - -/*==================== - HAL SETTINGS - *====================*/ - -/** Default display refresh, input device read and animation step period. */ -#define LV_DEF_REFR_PERIOD 33 /**< [ms] */ - -/** Default Dots Per Inch. Used to initialize default sizes such as widgets sized, style paddings. - * (Not so important, you can adjust it to modify default sizes and spaces.) */ -#define LV_DPI_DEF 130 /**< [px/inch] */ - -/*================= - * OPERATING SYSTEM - *=================*/ -/** Select operating system to use. Possible options: - * - LV_OS_NONE - * - LV_OS_PTHREAD - * - LV_OS_FREERTOS - * - LV_OS_CMSIS_RTOS2 - * - LV_OS_RTTHREAD - * - LV_OS_WINDOWS - * - LV_OS_MQX - * - LV_OS_SDL2 - * - LV_OS_CUSTOM */ -#define LV_USE_OS LV_OS_NONE - -#if LV_USE_OS == LV_OS_CUSTOM - #define LV_OS_CUSTOM_INCLUDE -#endif -#if LV_USE_OS == LV_OS_FREERTOS - /* - * Unblocking an RTOS task with a direct notification is 45% faster and uses less RAM - * than unblocking a task using an intermediary object such as a binary semaphore. - * RTOS task notifications can only be used when there is only one task that can be the recipient of the event. - */ - #define LV_USE_FREERTOS_TASK_NOTIFY 1 -#endif - -/*======================== - * RENDERING CONFIGURATION - *========================*/ - -/** Align stride of all layers and images to this bytes */ -#define LV_DRAW_BUF_STRIDE_ALIGN 1 - -/** Align start address of draw_buf addresses to this bytes*/ -#define LV_DRAW_BUF_ALIGN 4 - -/** Using matrix for transformations. - * Requirements: - * - `LV_USE_MATRIX = 1`. - * - Rendering engine needs to support 3x3 matrix transformations. */ -#define LV_DRAW_TRANSFORM_USE_MATRIX 0 - -/* If a widget has `style_opa < 255` (not `bg_opa`, `text_opa` etc) or not NORMAL blend mode - * it is buffered into a "simple" layer before rendering. The widget can be buffered in smaller chunks. - * "Transformed layers" (if `transform_angle/zoom` are set) use larger buffers - * and can't be drawn in chunks. */ - -/** The target buffer size for simple layer chunks. */ -#define LV_DRAW_LAYER_SIMPLE_BUF_SIZE (24 * 1024) /**< [bytes]*/ - -/* Limit the max allocated memory for simple and transformed layers. - * It should be at least `LV_DRAW_LAYER_SIMPLE_BUF_SIZE` sized but if transformed layers are also used - * it should be enough to store the largest widget too (width x height x 4 area). - * Set it to 0 to have no limit. */ -#define LV_DRAW_LAYER_MAX_MEMORY 0 /**< No limit by default [bytes]*/ - -/** Stack size of drawing thread. - * NOTE: If FreeType or ThorVG is enabled, it is recommended to set it to 32KB or more. - */ -#define LV_DRAW_THREAD_STACK_SIZE (8 * 1024) /**< [bytes]*/ - -#define LV_USE_DRAW_SW 1 -#if LV_USE_DRAW_SW == 1 - /* - * Selectively disable color format support in order to reduce code size. - * NOTE: some features use certain color formats internally, e.g. - * - gradients use RGB888 - * - bitmaps with transparency may use ARGB8888 - */ - #define LV_DRAW_SW_SUPPORT_RGB565 1 - #define LV_DRAW_SW_SUPPORT_RGB565A8 1 - #define LV_DRAW_SW_SUPPORT_RGB888 1 - #define LV_DRAW_SW_SUPPORT_XRGB8888 1 - #define LV_DRAW_SW_SUPPORT_ARGB8888 1 - #define LV_DRAW_SW_SUPPORT_L8 1 - #define LV_DRAW_SW_SUPPORT_AL88 1 - #define LV_DRAW_SW_SUPPORT_A8 1 - #define LV_DRAW_SW_SUPPORT_I1 1 - - /* The threshold of the luminance to consider a pixel as - * active in indexed color format */ - #define LV_DRAW_SW_I1_LUM_THRESHOLD 127 - - /** Set number of draw units. - * - > 1 requires operating system to be enabled in `LV_USE_OS`. - * - > 1 means multiple threads will render the screen in parallel. */ - #define LV_DRAW_SW_DRAW_UNIT_CNT 1 - - /** Use Arm-2D to accelerate software (sw) rendering. */ - #define LV_USE_DRAW_ARM2D_SYNC 0 - - /** Enable native helium assembly to be compiled. */ - #define LV_USE_NATIVE_HELIUM_ASM 0 - - /** - * - 0: Use a simple renderer capable of drawing only simple rectangles with gradient, images, text, and straight lines only. - * - 1: Use a complex renderer capable of drawing rounded corners, shadow, skew lines, and arcs too. */ - #define LV_DRAW_SW_COMPLEX 1 - - #if LV_DRAW_SW_COMPLEX == 1 - /** Allow buffering some shadow calculation. - * LV_DRAW_SW_SHADOW_CACHE_SIZE is the maximum shadow size to buffer, where shadow size is - * `shadow_width + radius`. Caching has LV_DRAW_SW_SHADOW_CACHE_SIZE^2 RAM cost. */ - #define LV_DRAW_SW_SHADOW_CACHE_SIZE 0 - - /** Set number of maximally-cached circle data. - * The circumference of 1/4 circle are saved for anti-aliasing. - * `radius * 4` bytes are used per circle (the most often used radiuses are saved). - * - 0: disables caching */ - #define LV_DRAW_SW_CIRCLE_CACHE_SIZE 4 - #endif - - #define LV_USE_DRAW_SW_ASM LV_DRAW_SW_ASM_NONE - - #if LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_CUSTOM - #define LV_DRAW_SW_ASM_CUSTOM_INCLUDE "" - #endif - - /** Enable drawing complex gradients in software: linear at an angle, radial or conical */ - #define LV_USE_DRAW_SW_COMPLEX_GRADIENTS 0 - -#endif - -/*Use TSi's aka (Think Silicon) NemaGFX */ -#define LV_USE_NEMA_GFX 0 - -#if LV_USE_NEMA_GFX - /** Select which NemaGFX HAL to use. Possible options: - * - LV_NEMA_HAL_CUSTOM - * - LV_NEMA_HAL_STM32 */ - #define LV_USE_NEMA_HAL LV_NEMA_HAL_CUSTOM - #if LV_USE_NEMA_HAL == LV_NEMA_HAL_STM32 - #define LV_NEMA_STM32_HAL_INCLUDE - #endif - - /*Enable Vector Graphics Operations. Available only if NemaVG library is present*/ - #define LV_USE_NEMA_VG 0 - #if LV_USE_NEMA_VG - /*Define application's resolution used for VG related buffer allocation */ - #define LV_NEMA_GFX_MAX_RESX 800 - #define LV_NEMA_GFX_MAX_RESY 600 - #endif -#endif - -/** Use NXP's VG-Lite GPU on iMX RTxxx platforms. */ -#define LV_USE_DRAW_VGLITE 0 - -#if LV_USE_DRAW_VGLITE - /** Enable blit quality degradation workaround recommended for screen's dimension > 352 pixels. */ - #define LV_USE_VGLITE_BLIT_SPLIT 0 - - #if LV_USE_OS - /** Use additional draw thread for VG-Lite processing. */ - #define LV_USE_VGLITE_DRAW_THREAD 1 - - #if LV_USE_VGLITE_DRAW_THREAD - /** Enable VGLite draw async. Queue multiple tasks and flash them once to the GPU. */ - #define LV_USE_VGLITE_DRAW_ASYNC 1 - #endif - #endif - - /** Enable VGLite asserts. */ - #define LV_USE_VGLITE_ASSERT 0 -#endif - -/** Use NXP's PXP on iMX RTxxx platforms. */ -#define LV_USE_PXP 0 - -#if LV_USE_PXP - /** Use PXP for drawing.*/ - #define LV_USE_DRAW_PXP 1 - - /** Use PXP to rotate display.*/ - #define LV_USE_ROTATE_PXP 0 - - #if LV_USE_DRAW_PXP && LV_USE_OS - /** Use additional draw thread for PXP processing.*/ - #define LV_USE_PXP_DRAW_THREAD 1 - #endif - - /** Enable PXP asserts. */ - #define LV_USE_PXP_ASSERT 0 -#endif - -/** Use NXP's G2D on MPU platforms. */ -#define LV_USE_DRAW_G2D 0 - -#if LV_USE_DRAW_G2D - /** Maximum number of buffers that can be stored for G2D draw unit. - * Includes the frame buffers and assets. */ - #define LV_G2D_HASH_TABLE_SIZE 50 - - #if LV_USE_OS - /** Use additional draw thread for G2D processing.*/ - #define LV_USE_G2D_DRAW_THREAD 1 - #endif - - /** Enable G2D asserts. */ - #define LV_USE_G2D_ASSERT 0 -#endif - -/** Use Renesas Dave2D on RA platforms. */ -#define LV_USE_DRAW_DAVE2D 0 - -/** Draw using cached SDL textures*/ -#define LV_USE_DRAW_SDL 0 - -/** Use VG-Lite GPU. */ -#define LV_USE_DRAW_VG_LITE 0 - -#if LV_USE_DRAW_VG_LITE - /** Enable VG-Lite custom external 'gpu_init()' function */ - #define LV_VG_LITE_USE_GPU_INIT 0 - - /** Enable VG-Lite assert. */ - #define LV_VG_LITE_USE_ASSERT 0 - - /** VG-Lite flush commit trigger threshold. GPU will try to batch these many draw tasks. */ - #define LV_VG_LITE_FLUSH_MAX_COUNT 8 - - /** Enable border to simulate shadow. - * NOTE: which usually improves performance, - * but does not guarantee the same rendering quality as the software. */ - #define LV_VG_LITE_USE_BOX_SHADOW 0 - - /** VG-Lite gradient maximum cache number. - * @note The memory usage of a single gradient image is 4K bytes. */ - #define LV_VG_LITE_GRAD_CACHE_CNT 32 - - /** VG-Lite stroke maximum cache number. */ - #define LV_VG_LITE_STROKE_CACHE_CNT 32 -#endif - -/** Accelerate blends, fills, etc. with STM32 DMA2D */ -#define LV_USE_DRAW_DMA2D 0 - -#if LV_USE_DRAW_DMA2D - #define LV_DRAW_DMA2D_HAL_INCLUDE "stm32h7xx_hal.h" - - /* if enabled, the user is required to call `lv_draw_dma2d_transfer_complete_interrupt_handler` - * upon receiving the DMA2D global interrupt - */ - #define LV_USE_DRAW_DMA2D_INTERRUPT 0 -#endif - -/** Draw using cached OpenGLES textures */ -#define LV_USE_DRAW_OPENGLES 0 - -/*======================= - * FEATURE CONFIGURATION - *=======================*/ - -/*------------- - * Logging - *-----------*/ - -/** Enable log module */ -#define LV_USE_LOG 1 -#if LV_USE_LOG - /** Set value to one of the following levels of logging detail: - * - LV_LOG_LEVEL_TRACE Log detailed information. - * - LV_LOG_LEVEL_INFO Log important events. - * - LV_LOG_LEVEL_WARN Log if something unwanted happened but didn't cause a problem. - * - LV_LOG_LEVEL_ERROR Log only critical issues, when system may fail. - * - LV_LOG_LEVEL_USER Log only custom log messages added by the user. - * - LV_LOG_LEVEL_NONE Do not log anything. */ - #define LV_LOG_LEVEL LV_LOG_LEVEL_WARN - - /** - 1: Print log with 'printf'; - * - 0: User needs to register a callback with `lv_log_register_print_cb()`. */ - #define LV_LOG_PRINTF 0 - - /** Set callback to print logs. - * E.g `my_print`. The prototype should be `void my_print(lv_log_level_t level, const char * buf)`. - * Can be overwritten by `lv_log_register_print_cb`. */ - //#define LV_LOG_PRINT_CB - - /** - 1: Enable printing timestamp; - * - 0: Disable printing timestamp. */ - #define LV_LOG_USE_TIMESTAMP 1 - - /** - 1: Print file and line number of the log; - * - 0: Do not print file and line number of the log. */ - #define LV_LOG_USE_FILE_LINE 1 - - /* Enable/disable LV_LOG_TRACE in modules that produces a huge number of logs. */ - #define LV_LOG_TRACE_MEM 1 /**< Enable/disable trace logs in memory operations. */ - #define LV_LOG_TRACE_TIMER 1 /**< Enable/disable trace logs in timer operations. */ - #define LV_LOG_TRACE_INDEV 1 /**< Enable/disable trace logs in input device operations. */ - #define LV_LOG_TRACE_DISP_REFR 1 /**< Enable/disable trace logs in display re-draw operations. */ - #define LV_LOG_TRACE_EVENT 1 /**< Enable/disable trace logs in event dispatch logic. */ - #define LV_LOG_TRACE_OBJ_CREATE 1 /**< Enable/disable trace logs in object creation (core `obj` creation plus every widget). */ - #define LV_LOG_TRACE_LAYOUT 1 /**< Enable/disable trace logs in flex- and grid-layout operations. */ - #define LV_LOG_TRACE_ANIM 1 /**< Enable/disable trace logs in animation logic. */ - #define LV_LOG_TRACE_CACHE 1 /**< Enable/disable trace logs in cache operations. */ -#endif /*LV_USE_LOG*/ - -/*------------- - * Asserts - *-----------*/ - -/* Enable assertion failures if an operation fails or invalid data is found. - * If LV_USE_LOG is enabled, an error message will be printed on failure. */ -#define LV_USE_ASSERT_NULL 1 /**< Check if the parameter is NULL. (Very fast, recommended) */ -#define LV_USE_ASSERT_MALLOC 1 /**< Checks is the memory is successfully allocated or no. (Very fast, recommended) */ -#define LV_USE_ASSERT_STYLE 0 /**< Check if the styles are properly initialized. (Very fast, recommended) */ -#define LV_USE_ASSERT_MEM_INTEGRITY 0 /**< Check the integrity of `lv_mem` after critical operations. (Slow) */ -#define LV_USE_ASSERT_OBJ 0 /**< Check the object's type and existence (e.g. not deleted). (Slow) */ - -/** Add a custom handler when assert happens e.g. to restart MCU. */ -#define LV_ASSERT_HANDLER_INCLUDE -#define LV_ASSERT_HANDLER while(1); /**< Halt by default */ - -/*------------- - * Debug - *-----------*/ - -/** 1: Draw random colored rectangles over the redrawn areas. */ -#define LV_USE_REFR_DEBUG 0 - -/** 1: Draw a red overlay for ARGB layers and a green overlay for RGB layers*/ -#define LV_USE_LAYER_DEBUG 0 - -/** 1: Adds the following behaviors for debugging: - * - Draw overlays with different colors for each draw_unit's tasks. - * - Draw index number of draw unit on white background. - * - For layers, draws index number of draw unit on black background. */ -#define LV_USE_PARALLEL_DRAW_DEBUG 0 - -/*------------- - * Others - *-----------*/ - -#define LV_ENABLE_GLOBAL_CUSTOM 0 -#if LV_ENABLE_GLOBAL_CUSTOM - /** Header to include for custom 'lv_global' function" */ - #define LV_GLOBAL_CUSTOM_INCLUDE -#endif - -/** Default cache size in bytes. - * Used by image decoders such as `lv_lodepng` to keep the decoded image in memory. - * If size is not set to 0, the decoder will fail to decode when the cache is full. - * If size is 0, the cache function is not enabled and the decoded memory will be - * released immediately after use. */ -#define LV_CACHE_DEF_SIZE 0 - -/** Default number of image header cache entries. The cache is used to store the headers of images - * The main logic is like `LV_CACHE_DEF_SIZE` but for image headers. */ -#define LV_IMAGE_HEADER_CACHE_DEF_CNT 0 - -/** Number of stops allowed per gradient. Increase this to allow more stops. - * This adds (sizeof(lv_color_t) + 1) bytes per additional stop. */ -#define LV_GRADIENT_MAX_STOPS 2 - -/** Adjust color mix functions rounding. GPUs might calculate color mix (blending) differently. - * - 0: round down, - * - 64: round up from x.75, - * - 128: round up from half, - * - 192: round up from x.25, - * - 254: round up */ -#define LV_COLOR_MIX_ROUND_OFS 0 - -/** Add 2 x 32-bit variables to each `lv_obj_t` to speed up getting style properties */ -#define LV_OBJ_STYLE_CACHE 0 - -/** Add `id` field to `lv_obj_t` */ -#define LV_USE_OBJ_ID 0 - -/** Enable support widget names*/ -#define LV_USE_OBJ_NAME 0 - -/** Automatically assign an ID when obj is created */ -#define LV_OBJ_ID_AUTO_ASSIGN LV_USE_OBJ_ID - -/** Use builtin obj ID handler functions: -* - lv_obj_assign_id: Called when a widget is created. Use a separate counter for each widget class as an ID. -* - lv_obj_id_compare: Compare the ID to decide if it matches with a requested value. -* - lv_obj_stringify_id: Return string-ified identifier, e.g. "button3". -* - lv_obj_free_id: Does nothing, as there is no memory allocation for the ID. -* When disabled these functions needs to be implemented by the user.*/ -#define LV_USE_OBJ_ID_BUILTIN 1 - -/** Use obj property set/get API. */ -#define LV_USE_OBJ_PROPERTY 0 - -/** Enable property name support. */ -#define LV_USE_OBJ_PROPERTY_NAME 1 - -/* Use VG-Lite Simulator. - * - Requires: LV_USE_THORVG_INTERNAL or LV_USE_THORVG_EXTERNAL */ -#define LV_USE_VG_LITE_THORVG 0 - -#if LV_USE_VG_LITE_THORVG - /** Enable LVGL's blend mode support */ - #define LV_VG_LITE_THORVG_LVGL_BLEND_SUPPORT 0 - - /** Enable YUV color format support */ - #define LV_VG_LITE_THORVG_YUV_SUPPORT 0 - - /** Enable Linear gradient extension support */ - #define LV_VG_LITE_THORVG_LINEAR_GRADIENT_EXT_SUPPORT 0 - - /** Enable alignment on 16 pixels */ - #define LV_VG_LITE_THORVG_16PIXELS_ALIGN 1 - - /** Buffer address alignment */ - #define LV_VG_LITE_THORVG_BUF_ADDR_ALIGN 64 - - /** Enable multi-thread render */ - #define LV_VG_LITE_THORVG_THREAD_RENDER 0 -#endif - -/* Enable the multi-touch gesture recognition feature */ -/* Gesture recognition requires the use of floats */ -#define LV_USE_GESTURE_RECOGNITION 0 - -/*===================== - * COMPILER SETTINGS - *====================*/ - -/** For big endian systems set to 1 */ -#define LV_BIG_ENDIAN_SYSTEM 0 - -/** Define a custom attribute for `lv_tick_inc` function */ -#define LV_ATTRIBUTE_TICK_INC - -/** Define a custom attribute for `lv_timer_handler` function */ -#define LV_ATTRIBUTE_TIMER_HANDLER - -/** Define a custom attribute for `lv_display_flush_ready` function */ -#define LV_ATTRIBUTE_FLUSH_READY - -/** Align VG_LITE buffers on this number of bytes. - * @note vglite_src_buf_aligned() uses this value to validate alignment of passed buffer pointers. */ -#define LV_ATTRIBUTE_MEM_ALIGN_SIZE 1 - -/** Will be added where memory needs to be aligned (with -Os data might not be aligned to boundary by default). - * E.g. __attribute__((aligned(4)))*/ -#define LV_ATTRIBUTE_MEM_ALIGN - -/** Attribute to mark large constant arrays, for example for font bitmaps */ -#define LV_ATTRIBUTE_LARGE_CONST - -/** Compiler prefix for a large array declaration in RAM */ -#define LV_ATTRIBUTE_LARGE_RAM_ARRAY - -/** Place performance critical functions into a faster memory (e.g RAM) */ -#define LV_ATTRIBUTE_FAST_MEM - -/** Export integer constant to binding. This macro is used with constants in the form of LV_ that - * should also appear on LVGL binding API such as MicroPython. */ -#define LV_EXPORT_CONST_INT(int_value) struct _silence_gcc_warning /**< The default value just prevents GCC warning */ - -/** Prefix all global extern data with this */ -#define LV_ATTRIBUTE_EXTERN_DATA - -/** Use `float` as `lv_value_precise_t` */ -#define LV_USE_FLOAT 0 - -/** Enable matrix support - * - Requires `LV_USE_FLOAT = 1` */ -#define LV_USE_MATRIX 0 - -/** Include `lvgl_private.h` in `lvgl.h` to access internal data and functions by default */ -#define LV_USE_PRIVATE_API 0 - -/*================== - * FONT USAGE - *===================*/ - -/* Montserrat fonts with ASCII range and some symbols using bpp = 4 - * https://fonts.google.com/specimen/Montserrat */ -#define LV_FONT_MONTSERRAT_8 0 -#define LV_FONT_MONTSERRAT_10 0 -#define LV_FONT_MONTSERRAT_12 0 -#define LV_FONT_MONTSERRAT_14 1 -#define LV_FONT_MONTSERRAT_16 0 -#define LV_FONT_MONTSERRAT_18 0 -#define LV_FONT_MONTSERRAT_20 0 -#define LV_FONT_MONTSERRAT_22 0 -#define LV_FONT_MONTSERRAT_24 0 -#define LV_FONT_MONTSERRAT_26 0 -#define LV_FONT_MONTSERRAT_28 0 -#define LV_FONT_MONTSERRAT_30 0 -#define LV_FONT_MONTSERRAT_32 0 -#define LV_FONT_MONTSERRAT_34 0 -#define LV_FONT_MONTSERRAT_36 0 -#define LV_FONT_MONTSERRAT_38 0 -#define LV_FONT_MONTSERRAT_40 0 -#define LV_FONT_MONTSERRAT_42 0 -#define LV_FONT_MONTSERRAT_44 0 -#define LV_FONT_MONTSERRAT_46 0 -#define LV_FONT_MONTSERRAT_48 0 - -/* Demonstrate special features */ -#define LV_FONT_MONTSERRAT_28_COMPRESSED 0 /**< bpp = 3 */ -#define LV_FONT_DEJAVU_16_PERSIAN_HEBREW 0 /**< Hebrew, Arabic, Persian letters and all their forms */ -#define LV_FONT_SIMSUN_14_CJK 0 /**< 1000 most common CJK radicals */ -#define LV_FONT_SIMSUN_16_CJK 0 /**< 1000 most common CJK radicals */ - -/** Pixel perfect monospaced fonts */ -#define LV_FONT_UNSCII_8 0 -#define LV_FONT_UNSCII_16 0 - -/** Optionally declare custom fonts here. - * - * You can use any of these fonts as the default font too and they will be available - * globally. Example: - * - * @code - * #define LV_FONT_CUSTOM_DECLARE LV_FONT_DECLARE(my_font_1) LV_FONT_DECLARE(my_font_2) - * @endcode - */ -#define LV_FONT_CUSTOM_DECLARE - -/** Always set a default font */ -#define LV_FONT_DEFAULT &lv_font_montserrat_14 - -/** Enable handling large font and/or fonts with a lot of characters. - * The limit depends on the font size, font face and bpp. - * A compiler error will be triggered if a font needs it. */ -#define LV_FONT_FMT_TXT_LARGE 0 - -/** Enables/disables support for compressed fonts. */ -#define LV_USE_FONT_COMPRESSED 0 - -/** Enable drawing placeholders when glyph dsc is not found. */ -#define LV_USE_FONT_PLACEHOLDER 1 - -/*================= - * TEXT SETTINGS - *=================*/ - -/** - * Select a character encoding for strings. - * Your IDE or editor should have the same character encoding. - * - LV_TXT_ENC_UTF8 - * - LV_TXT_ENC_ASCII - */ -#define LV_TXT_ENC LV_TXT_ENC_UTF8 - -/** While rendering text strings, break (wrap) text on these chars. */ -#define LV_TXT_BREAK_CHARS " ,.;:-_)]}" - -/** If a word is at least this long, will break wherever "prettiest". - * To disable, set to a value <= 0. */ -#define LV_TXT_LINE_BREAK_LONG_LEN 0 - -/** Minimum number of characters in a long word to put on a line before a break. - * Depends on LV_TXT_LINE_BREAK_LONG_LEN. */ -#define LV_TXT_LINE_BREAK_LONG_PRE_MIN_LEN 3 - -/** Minimum number of characters in a long word to put on a line after a break. - * Depends on LV_TXT_LINE_BREAK_LONG_LEN. */ -#define LV_TXT_LINE_BREAK_LONG_POST_MIN_LEN 3 - -/** Support bidirectional text. Allows mixing Left-to-Right and Right-to-Left text. - * The direction will be processed according to the Unicode Bidirectional Algorithm: - * https://www.w3.org/International/articles/inline-bidi-markup/uba-basics */ -#define LV_USE_BIDI 0 -#if LV_USE_BIDI - /*Set the default direction. Supported values: - *`LV_BASE_DIR_LTR` Left-to-Right - *`LV_BASE_DIR_RTL` Right-to-Left - *`LV_BASE_DIR_AUTO` detect text base direction*/ - #define LV_BIDI_BASE_DIR_DEF LV_BASE_DIR_AUTO -#endif - -/** Enable Arabic/Persian processing - * In these languages characters should be replaced with another form based on their position in the text */ -#define LV_USE_ARABIC_PERSIAN_CHARS 0 - -/*The control character to use for signaling text recoloring*/ -#define LV_TXT_COLOR_CMD "#" - -/*================== - * WIDGETS - *================*/ -/* Documentation for widgets can be found here: https://docs.lvgl.io/master/details/widgets/index.html . */ - -/** 1: Causes these widgets to be given default values at creation time. - * - lv_buttonmatrix_t: Get default maps: {"Btn1", "Btn2", "Btn3", "\n", "Btn4", "Btn5", ""}, else map not set. - * - lv_checkbox_t : String label set to "Check box", else set to empty string. - * - lv_dropdown_t : Options set to "Option 1", "Option 2", "Option 3", else no values are set. - * - lv_roller_t : Options set to "Option 1", "Option 2", "Option 3", "Option 4", "Option 5", else no values are set. - * - lv_label_t : Text set to "Text", else empty string. - * */ -#define LV_WIDGETS_HAS_DEFAULT_VALUE 1 - -#define LV_USE_ANIMIMG 1 - -#define LV_USE_ARC 1 - -#define LV_USE_BAR 1 - -#define LV_USE_BUTTON 1 - -#define LV_USE_BUTTONMATRIX 1 - -#define LV_USE_CALENDAR 1 -#if LV_USE_CALENDAR - #define LV_CALENDAR_WEEK_STARTS_MONDAY 0 - #if LV_CALENDAR_WEEK_STARTS_MONDAY - #define LV_CALENDAR_DEFAULT_DAY_NAMES {"Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"} - #else - #define LV_CALENDAR_DEFAULT_DAY_NAMES {"Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"} - #endif - - #define LV_CALENDAR_DEFAULT_MONTH_NAMES {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"} - #define LV_USE_CALENDAR_HEADER_ARROW 1 - #define LV_USE_CALENDAR_HEADER_DROPDOWN 1 - #define LV_USE_CALENDAR_CHINESE 0 -#endif /*LV_USE_CALENDAR*/ - -#define LV_USE_CANVAS 1 - -#define LV_USE_CHART 1 - -#define LV_USE_CHECKBOX 1 - -#define LV_USE_DROPDOWN 1 /**< Requires: lv_label */ - -#define LV_USE_IMAGE 1 /**< Requires: lv_label */ - -#define LV_USE_IMAGEBUTTON 1 - -#define LV_USE_KEYBOARD 1 - -#define LV_USE_LABEL 1 -#if LV_USE_LABEL - #define LV_LABEL_TEXT_SELECTION 1 /**< Enable selecting text of the label */ - #define LV_LABEL_LONG_TXT_HINT 1 /**< Store some extra info in labels to speed up drawing of very long text */ - #define LV_LABEL_WAIT_CHAR_COUNT 3 /**< The count of wait chart */ -#endif - -#define LV_USE_LED 1 - -#define LV_USE_LINE 1 - -#define LV_USE_LIST 1 - -#define LV_USE_LOTTIE 0 /**< Requires: lv_canvas, thorvg */ - -#define LV_USE_MENU 1 - -#define LV_USE_MSGBOX 1 - -#define LV_USE_ROLLER 1 /**< Requires: lv_label */ - -#define LV_USE_SCALE 1 - -#define LV_USE_SLIDER 1 /**< Requires: lv_bar */ - -#define LV_USE_SPAN 1 -#if LV_USE_SPAN - /** A line of text can contain this maximum number of span descriptors. */ - #define LV_SPAN_SNIPPET_STACK_SIZE 64 -#endif - -#define LV_USE_SPINBOX 1 - -#define LV_USE_SPINNER 1 - -#define LV_USE_SWITCH 1 - -#define LV_USE_TABLE 1 - -#define LV_USE_TABVIEW 1 - -#define LV_USE_TEXTAREA 1 /**< Requires: lv_label */ -#if LV_USE_TEXTAREA != 0 - #define LV_TEXTAREA_DEF_PWD_SHOW_TIME 1500 /**< [ms] */ -#endif - -#define LV_USE_TILEVIEW 1 - -#define LV_USE_WIN 1 - -/*================== - * THEMES - *==================*/ -/* Documentation for themes can be found here: https://docs.lvgl.io/master/details/common-widget-features/styles/style.html#themes . */ - -/** A simple, impressive and very complete theme */ -#define LV_USE_THEME_DEFAULT 1 -#if LV_USE_THEME_DEFAULT - /** 0: Light mode; 1: Dark mode */ - #define LV_THEME_DEFAULT_DARK 0 - - /** 1: Enable grow on press */ - #define LV_THEME_DEFAULT_GROW 1 - - /** Default transition time in ms. */ - #define LV_THEME_DEFAULT_TRANSITION_TIME 80 -#endif /*LV_USE_THEME_DEFAULT*/ - -/** A very simple theme that is a good starting point for a custom theme */ -#define LV_USE_THEME_SIMPLE 1 - -/** A theme designed for monochrome displays */ -#define LV_USE_THEME_MONO 1 - -/*================== - * LAYOUTS - *==================*/ -/* Documentation for layouts can be found here: https://docs.lvgl.io/master/details/common-widget-features/layouts/index.html . */ - -/** A layout similar to Flexbox in CSS. */ -#define LV_USE_FLEX 1 - -/** A layout similar to Grid in CSS. */ -#define LV_USE_GRID 1 - -/*==================== - * 3RD PARTS LIBRARIES - *====================*/ -/* Documentation for libraries can be found here: https://docs.lvgl.io/master/details/libs/index.html . */ - -/* File system interfaces for common APIs */ - -/** Setting a default driver letter allows skipping the driver prefix in filepaths. - * Documentation about how to use the below driver-identifier letters can be found at - * https://docs.lvgl.io/master/details/main-modules/fs.html#lv-fs-identifier-letters . */ -#define LV_FS_DEFAULT_DRIVER_LETTER '\0' - -/** API for fopen, fread, etc. */ -#define LV_USE_FS_STDIO 0 -#if LV_USE_FS_STDIO - #define LV_FS_STDIO_LETTER '\0' /**< Set an upper-case driver-identifier letter for this driver (e.g. 'A'). */ - #define LV_FS_STDIO_PATH "" /**< Set the working directory. File/directory paths will be appended to it. */ - #define LV_FS_STDIO_CACHE_SIZE 0 /**< >0 to cache this number of bytes in lv_fs_read() */ -#endif - -/** API for open, read, etc. */ -#define LV_USE_FS_POSIX 0 -#if LV_USE_FS_POSIX - #define LV_FS_POSIX_LETTER '\0' /**< Set an upper-case driver-identifier letter for this driver (e.g. 'A'). */ - #define LV_FS_POSIX_PATH "" /**< Set the working directory. File/directory paths will be appended to it. */ - #define LV_FS_POSIX_CACHE_SIZE 0 /**< >0 to cache this number of bytes in lv_fs_read() */ -#endif - -/** API for CreateFile, ReadFile, etc. */ -#define LV_USE_FS_WIN32 0 -#if LV_USE_FS_WIN32 - #define LV_FS_WIN32_LETTER '\0' /**< Set an upper-case driver-identifier letter for this driver (e.g. 'A'). */ - #define LV_FS_WIN32_PATH "" /**< Set the working directory. File/directory paths will be appended to it. */ - #define LV_FS_WIN32_CACHE_SIZE 0 /**< >0 to cache this number of bytes in lv_fs_read() */ -#endif - -/** API for FATFS (needs to be added separately). Uses f_open, f_read, etc. */ -#define LV_USE_FS_FATFS 0 -#if LV_USE_FS_FATFS - #define LV_FS_FATFS_LETTER '\0' /**< Set an upper-case driver-identifier letter for this driver (e.g. 'A'). */ - #define LV_FS_FATFS_PATH "" /**< Set the working directory. File/directory paths will be appended to it. */ - #define LV_FS_FATFS_CACHE_SIZE 0 /**< >0 to cache this number of bytes in lv_fs_read() */ -#endif - -/** API for memory-mapped file access. */ -#define LV_USE_FS_MEMFS 0 -#if LV_USE_FS_MEMFS - #define LV_FS_MEMFS_LETTER '\0' /**< Set an upper-case driver-identifier letter for this driver (e.g. 'A'). */ -#endif - -/** API for LittleFs. */ -#define LV_USE_FS_LITTLEFS 0 -#if LV_USE_FS_LITTLEFS - #define LV_FS_LITTLEFS_LETTER '\0' /**< Set an upper-case driver-identifier letter for this driver (e.g. 'A'). */ - #define LV_FS_LITTLEFS_PATH "" /**< Set the working directory. File/directory paths will be appended to it. */ -#endif - -/** API for Arduino LittleFs. */ -#define LV_USE_FS_ARDUINO_ESP_LITTLEFS 0 -#if LV_USE_FS_ARDUINO_ESP_LITTLEFS - #define LV_FS_ARDUINO_ESP_LITTLEFS_LETTER '\0' /**< Set an upper-case driver-identifier letter for this driver (e.g. 'A'). */ - #define LV_FS_ARDUINO_ESP_LITTLEFS_PATH "" /**< Set the working directory. File/directory paths will be appended to it. */ -#endif - -/** API for Arduino Sd. */ -#define LV_USE_FS_ARDUINO_SD 0 -#if LV_USE_FS_ARDUINO_SD - #define LV_FS_ARDUINO_SD_LETTER '\0' /**< Set an upper-case driver-identifier letter for this driver (e.g. 'A'). */ - #define LV_FS_ARDUINO_SD_PATH "" /**< Set the working directory. File/directory paths will be appended to it. */ -#endif - -/** API for UEFI */ -#define LV_USE_FS_UEFI 0 -#if LV_USE_FS_UEFI - #define LV_FS_UEFI_LETTER '\0' /**< Set an upper-case driver-identifier letter for this driver (e.g. 'A'). */ -#endif - -/** LODEPNG decoder library */ -#define LV_USE_LODEPNG 0 - -/** PNG decoder(libpng) library */ -#define LV_USE_LIBPNG 0 - -/** BMP decoder library */ -#define LV_USE_BMP 0 - -/** JPG + split JPG decoder library. - * Split JPG is a custom format optimized for embedded systems. */ -#define LV_USE_TJPGD 0 - -/** libjpeg-turbo decoder library. - * - Supports complete JPEG specifications and high-performance JPEG decoding. */ -#define LV_USE_LIBJPEG_TURBO 0 - -/** GIF decoder library */ -#define LV_USE_GIF 0 -#if LV_USE_GIF - /** GIF decoder accelerate */ - #define LV_GIF_CACHE_DECODE_DATA 0 -#endif - - -/** Decode bin images to RAM */ -#define LV_BIN_DECODER_RAM_LOAD 0 - -/** RLE decompress library */ -#define LV_USE_RLE 0 - -/** QR code library */ -#define LV_USE_QRCODE 0 - -/** Barcode code library */ -#define LV_USE_BARCODE 0 - -/** FreeType library */ -#define LV_USE_FREETYPE 0 -#if LV_USE_FREETYPE - /** Let FreeType use LVGL memory and file porting */ - #define LV_FREETYPE_USE_LVGL_PORT 0 - - /** Cache count of glyphs in FreeType, i.e. number of glyphs that can be cached. - * The higher the value, the more memory will be used. */ - #define LV_FREETYPE_CACHE_FT_GLYPH_CNT 256 -#endif - -/** Built-in TTF decoder */ -#define LV_USE_TINY_TTF 0 -#if LV_USE_TINY_TTF - /* Enable loading TTF data from files */ - #define LV_TINY_TTF_FILE_SUPPORT 0 - #define LV_TINY_TTF_CACHE_GLYPH_CNT 256 -#endif - -/** Rlottie library */ -#define LV_USE_RLOTTIE 0 - -/** Enable Vector Graphic APIs - * - Requires `LV_USE_MATRIX = 1` */ -#define LV_USE_VECTOR_GRAPHIC 0 - -/** Enable ThorVG (vector graphics library) from the src/libs folder */ -#define LV_USE_THORVG_INTERNAL 0 - -/** Enable ThorVG by assuming that its installed and linked to the project */ -#define LV_USE_THORVG_EXTERNAL 0 - -/** Use lvgl built-in LZ4 lib */ -#define LV_USE_LZ4_INTERNAL 0 - -/** Use external LZ4 library */ -#define LV_USE_LZ4_EXTERNAL 0 - -/*SVG library - * - Requires `LV_USE_VECTOR_GRAPHIC = 1` */ -#define LV_USE_SVG 0 -#define LV_USE_SVG_ANIMATION 0 -#define LV_USE_SVG_DEBUG 0 - -/** FFmpeg library for image decoding and playing videos. - * Supports all major image formats so do not enable other image decoder with it. */ -#define LV_USE_FFMPEG 0 -#if LV_USE_FFMPEG - /** Dump input information to stderr */ - #define LV_FFMPEG_DUMP_FORMAT 0 - /** Use lvgl file path in FFmpeg Player widget - * You won't be able to open URLs after enabling this feature. - * Note that FFmpeg image decoder will always use lvgl file system. */ - #define LV_FFMPEG_PLAYER_USE_LV_FS 0 -#endif - -/*================== - * OTHERS - *==================*/ -/* Documentation for several of the below items can be found here: https://docs.lvgl.io/master/details/auxiliary-modules/index.html . */ - -/** 1: Enable API to take snapshot for object */ -#define LV_USE_SNAPSHOT 0 - -/** 1: Enable system monitor component */ -#define LV_USE_SYSMON 0 -#if LV_USE_SYSMON - /** Get the idle percentage. E.g. uint32_t my_get_idle(void); */ - #define LV_SYSMON_GET_IDLE lv_os_get_idle_percent - - /** 1: Show CPU usage and FPS count. - * - Requires `LV_USE_SYSMON = 1` */ - #define LV_USE_PERF_MONITOR 0 - #if LV_USE_PERF_MONITOR - #define LV_USE_PERF_MONITOR_POS LV_ALIGN_BOTTOM_RIGHT - - /** 0: Displays performance data on the screen; 1: Prints performance data using log. */ - #define LV_USE_PERF_MONITOR_LOG_MODE 0 - #endif - - /** 1: Show used memory and memory fragmentation. - * - Requires `LV_USE_STDLIB_MALLOC = LV_STDLIB_BUILTIN` - * - Requires `LV_USE_SYSMON = 1`*/ - #define LV_USE_MEM_MONITOR 0 - #if LV_USE_MEM_MONITOR - #define LV_USE_MEM_MONITOR_POS LV_ALIGN_BOTTOM_LEFT - #endif -#endif /*LV_USE_SYSMON*/ - -/** 1: Enable runtime performance profiler */ -#define LV_USE_PROFILER 0 -#if LV_USE_PROFILER - /** 1: Enable the built-in profiler */ - #define LV_USE_PROFILER_BUILTIN 1 - #if LV_USE_PROFILER_BUILTIN - /** Default profiler trace buffer size */ - #define LV_PROFILER_BUILTIN_BUF_SIZE (16 * 1024) /**< [bytes] */ - #endif - - /** Header to include for profiler */ - #define LV_PROFILER_INCLUDE "lvgl/src/misc/lv_profiler_builtin.h" - - /** Profiler start point function */ - #define LV_PROFILER_BEGIN LV_PROFILER_BUILTIN_BEGIN - - /** Profiler end point function */ - #define LV_PROFILER_END LV_PROFILER_BUILTIN_END - - /** Profiler start point function with custom tag */ - #define LV_PROFILER_BEGIN_TAG LV_PROFILER_BUILTIN_BEGIN_TAG - - /** Profiler end point function with custom tag */ - #define LV_PROFILER_END_TAG LV_PROFILER_BUILTIN_END_TAG - - /*Enable layout profiler*/ - #define LV_PROFILER_LAYOUT 1 - - /*Enable disp refr profiler*/ - #define LV_PROFILER_REFR 1 - - /*Enable draw profiler*/ - #define LV_PROFILER_DRAW 1 - - /*Enable indev profiler*/ - #define LV_PROFILER_INDEV 1 - - /*Enable decoder profiler*/ - #define LV_PROFILER_DECODER 1 - - /*Enable font profiler*/ - #define LV_PROFILER_FONT 1 - - /*Enable fs profiler*/ - #define LV_PROFILER_FS 1 - - /*Enable style profiler*/ - #define LV_PROFILER_STYLE 0 - - /*Enable timer profiler*/ - #define LV_PROFILER_TIMER 1 - - /*Enable cache profiler*/ - #define LV_PROFILER_CACHE 1 - - /*Enable event profiler*/ - #define LV_PROFILER_EVENT 1 -#endif - -/** 1: Enable Monkey test */ -#define LV_USE_MONKEY 0 - -/** 1: Enable grid navigation */ -#define LV_USE_GRIDNAV 0 - -/** 1: Enable `lv_obj` fragment logic */ -#define LV_USE_FRAGMENT 0 - -/** 1: Support using images as font in label or span widgets */ -#define LV_USE_IMGFONT 0 - -/** 1: Enable an observer pattern implementation */ -#define LV_USE_OBSERVER 1 - -/** 1: Enable Pinyin input method - * - Requires: lv_keyboard */ -#define LV_USE_IME_PINYIN 0 -#if LV_USE_IME_PINYIN - /** 1: Use default thesaurus. - * @note If you do not use the default thesaurus, be sure to use `lv_ime_pinyin` after setting the thesaurus. */ - #define LV_IME_PINYIN_USE_DEFAULT_DICT 1 - /** Set maximum number of candidate panels that can be displayed. - * @note This needs to be adjusted according to size of screen. */ - #define LV_IME_PINYIN_CAND_TEXT_NUM 6 - - /** Use 9-key input (k9). */ - #define LV_IME_PINYIN_USE_K9_MODE 1 - #if LV_IME_PINYIN_USE_K9_MODE == 1 - #define LV_IME_PINYIN_K9_CAND_TEXT_NUM 3 - #endif /*LV_IME_PINYIN_USE_K9_MODE*/ -#endif - -/** 1: Enable file explorer. - * - Requires: lv_table */ -#define LV_USE_FILE_EXPLORER 0 -#if LV_USE_FILE_EXPLORER - /** Maximum length of path */ - #define LV_FILE_EXPLORER_PATH_MAX_LEN (128) - /** Quick access bar, 1:use, 0:do not use. - * - Requires: lv_list */ - #define LV_FILE_EXPLORER_QUICK_ACCESS 1 -#endif - -/** 1: Enable freetype font manager - * - Requires: LV_USE_FREETYPE */ -#define LV_USE_FONT_MANAGER 0 -#if LV_USE_FONT_MANAGER - -/**Font manager name max length*/ -#define LV_FONT_MANAGER_NAME_MAX_LEN 32 - -#endif - -/** Enable emulated input devices, time emulation, and screenshot compares. */ -#define LV_USE_TEST 0 -#if LV_USE_TEST - -/** Enable `lv_test_screenshot_compare`. - * Requires libpng and a few MB of extra RAM. */ -#define LV_USE_TEST_SCREENSHOT_COMPARE 0 -#endif /*LV_USE_TEST*/ - -/** Enable loading XML UIs runtime */ -#define LV_USE_XML 0 - -/*1: Enable color filter style*/ -#define LV_USE_COLOR_FILTER 0 -/*================== - * DEVICES - *==================*/ - -/** Use SDL to open window on PC and handle mouse and keyboard. */ -#define LV_USE_SDL 0 -#if LV_USE_SDL - #define LV_SDL_INCLUDE_PATH - #define LV_SDL_RENDER_MODE LV_DISPLAY_RENDER_MODE_DIRECT /**< LV_DISPLAY_RENDER_MODE_DIRECT is recommended for best performance */ - #define LV_SDL_BUF_COUNT 1 /**< 1 or 2 */ - #define LV_SDL_ACCELERATED 1 /**< 1: Use hardware acceleration*/ - #define LV_SDL_FULLSCREEN 0 /**< 1: Make the window full screen by default */ - #define LV_SDL_DIRECT_EXIT 1 /**< 1: Exit the application when all SDL windows are closed */ - #define LV_SDL_MOUSEWHEEL_MODE LV_SDL_MOUSEWHEEL_MODE_ENCODER /*LV_SDL_MOUSEWHEEL_MODE_ENCODER/CROWN*/ -#endif - -/** Use X11 to open window on Linux desktop and handle mouse and keyboard */ -#define LV_USE_X11 0 -#if LV_USE_X11 - #define LV_X11_DIRECT_EXIT 1 /**< Exit application when all X11 windows have been closed */ - #define LV_X11_DOUBLE_BUFFER 1 /**< Use double buffers for rendering */ - /* Select only 1 of the following render modes (LV_X11_RENDER_MODE_PARTIAL preferred!). */ - #define LV_X11_RENDER_MODE_PARTIAL 1 /**< Partial render mode (preferred) */ - #define LV_X11_RENDER_MODE_DIRECT 0 /**< Direct render mode */ - #define LV_X11_RENDER_MODE_FULL 0 /**< Full render mode */ -#endif - -/** Use Wayland to open a window and handle input on Linux or BSD desktops */ -#define LV_USE_WAYLAND 0 -#if LV_USE_WAYLAND - #define LV_WAYLAND_WINDOW_DECORATIONS 0 /**< Draw client side window decorations only necessary on Mutter/GNOME */ - #define LV_WAYLAND_WL_SHELL 0 /**< Use the legacy wl_shell protocol instead of the default XDG shell */ -#endif - -/** Driver for /dev/fb */ -#define LV_USE_LINUX_FBDEV 0 -#if LV_USE_LINUX_FBDEV - #define LV_LINUX_FBDEV_BSD 0 - #define LV_LINUX_FBDEV_RENDER_MODE LV_DISPLAY_RENDER_MODE_PARTIAL - #define LV_LINUX_FBDEV_BUFFER_COUNT 0 - #define LV_LINUX_FBDEV_BUFFER_SIZE 60 -#endif - -/** Use Nuttx to open window and handle touchscreen */ -#define LV_USE_NUTTX 0 - -#if LV_USE_NUTTX - #define LV_USE_NUTTX_INDEPENDENT_IMAGE_HEAP 0 - - /** Use independent image heap for default draw buffer */ - #define LV_NUTTX_DEFAULT_DRAW_BUF_USE_INDEPENDENT_IMAGE_HEAP 0 - - #define LV_USE_NUTTX_LIBUV 0 - - /** Use Nuttx custom init API to open window and handle touchscreen */ - #define LV_USE_NUTTX_CUSTOM_INIT 0 - - /** Driver for /dev/lcd */ - #define LV_USE_NUTTX_LCD 0 - #if LV_USE_NUTTX_LCD - #define LV_NUTTX_LCD_BUFFER_COUNT 0 - #define LV_NUTTX_LCD_BUFFER_SIZE 60 - #endif - - /** Driver for /dev/input */ - #define LV_USE_NUTTX_TOUCHSCREEN 0 - - /*Touchscreen cursor size in pixels(<=0: disable cursor)*/ - #define LV_NUTTX_TOUCHSCREEN_CURSOR_SIZE 0 -#endif - -/** Driver for /dev/dri/card */ -#define LV_USE_LINUX_DRM 0 - -#if LV_USE_LINUX_DRM - - /* Use the MESA GBM library to allocate DMA buffers that can be - * shared across sub-systems and libraries using the Linux DMA-BUF API. - * The GBM library aims to provide a platform independent memory management system - * it supports the major GPU vendors - This option requires linking with libgbm */ - #define LV_LINUX_DRM_GBM_BUFFERS 0 -#endif - -/** Interface for TFT_eSPI */ -#define LV_USE_TFT_ESPI 0 - -/** Driver for evdev input devices */ -#define LV_USE_EVDEV 0 - -/** Driver for libinput input devices */ -#define LV_USE_LIBINPUT 0 - -#if LV_USE_LIBINPUT - #define LV_LIBINPUT_BSD 0 - - /** Full keyboard support */ - #define LV_LIBINPUT_XKB 0 - #if LV_LIBINPUT_XKB - /** "setxkbmap -query" can help find the right values for your keyboard */ - #define LV_LIBINPUT_XKB_KEY_MAP { .rules = NULL, .model = "pc101", .layout = "us", .variant = NULL, .options = NULL } - #endif -#endif - -/* Drivers for LCD devices connected via SPI/parallel port */ -#define LV_USE_ST7735 0 -#define LV_USE_ST7789 0 -#define LV_USE_ST7796 0 -#define LV_USE_ILI9341 0 - -#if (LV_USE_ST7735 | LV_USE_ST7789 | LV_USE_ST7796 | LV_USE_ILI9341) - #define LV_USE_GENERIC_MIPI 1 -#else - #define LV_USE_GENERIC_MIPI 0 -#endif - -/** Driver for Renesas GLCD */ -#define LV_USE_RENESAS_GLCDC 0 - -/** Driver for ST LTDC */ -#define LV_USE_ST_LTDC 0 -#if LV_USE_ST_LTDC - /* Only used for partial. */ - #define LV_ST_LTDC_USE_DMA2D_FLUSH 0 -#endif - -/** LVGL Windows backend */ -#define LV_USE_WINDOWS 0 - -/** LVGL UEFI backend */ -#define LV_USE_UEFI 0 -#if LV_USE_UEFI - #define LV_USE_UEFI_INCLUDE "myefi.h" /**< Header that hides the actual framework (EDK2, gnu-efi, ...) */ - #define LV_UEFI_USE_MEMORY_SERVICES 0 /**< Use the memory functions from the boot services table */ -#endif - -/** Use OpenGL to open window on PC and handle mouse and keyboard */ -#define LV_USE_OPENGLES 0 -#if LV_USE_OPENGLES - #define LV_USE_OPENGLES_DEBUG 1 /**< Enable or disable debug for opengles */ -#endif - -/** QNX Screen display and input drivers */ -#define LV_USE_QNX 0 -#if LV_USE_QNX - #define LV_QNX_BUF_COUNT 1 /**< 1 or 2 */ -#endif - -#endif /*LV_CONF_H*/ diff --git a/stm32-lvgl/Sources/CLVGL/include/module.modulemap b/stm32-lvgl/Sources/CLVGL/include/module.modulemap deleted file mode 100644 index 0961fcc6..00000000 --- a/stm32-lvgl/Sources/CLVGL/include/module.modulemap +++ /dev/null @@ -1,15 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2025 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -module CLVGL [system] { - header "CLVGL.h" - export * -} diff --git a/stm32-lvgl/Sources/HostSDLApp/Main.swift b/stm32-lvgl/Sources/HostSDLApp/Main.swift deleted file mode 100644 index 58f2a203..00000000 --- a/stm32-lvgl/Sources/HostSDLApp/Main.swift +++ /dev/null @@ -1,127 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2025 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -import CLVGL -import Foundation -import SDL - -let drawSize: (width: Int32, height: Int32) = (width: 480, height: 272) -let windowScale: Int32 = 2 - -var clickCount = 0 -var button: OpaquePointer! = nil -var buttonLabel: OpaquePointer! = nil -var uptimeInMs: Int = 0 - -var texture: OpaquePointer! = nil -var mouseEvent = SDL_Event() - -@main -struct Main { - static func main() { - lv_init() - lv_log_register_print_cb({ level, buf in print(String(cString: buf!), terminator: "") }) - lv_tick_set_cb({ UInt32(uptimeInMs) }) - - let bufSize: UInt32 = UInt32(drawSize.width * drawSize.height * 4) - let buf1 = UnsafeMutableRawPointer.allocate(byteCount: Int(bufSize), alignment: 16) - let buf2 = UnsafeMutableRawPointer.allocate(byteCount: Int(bufSize), alignment: 16) - - let disp = lv_display_create(Int32(drawSize.width), Int32(drawSize.height))! - lv_display_set_color_format(disp, LV_COLOR_FORMAT_ARGB8888) - lv_display_set_buffers(disp, buf1, buf2, bufSize, LV_DISPLAY_RENDER_MODE_FULL) - lv_display_set_flush_cb( - disp, - { disp, _, bufferToShow in - _ = SDL_UpdateTexture(texture, nil, bufferToShow, Int32(drawSize.width * 4)) - lv_display_flush_ready(disp) - }) - - let touch = lv_indev_create() - lv_indev_set_type(touch, LV_INDEV_TYPE_POINTER) - lv_indev_set_read_cb( - touch, - { indev, data in - if mouseEvent.type == SDL_MOUSEBUTTONDOWN.rawValue { - data!.pointee.point.x = Int32(mouseEvent.button.x) / windowScale - data!.pointee.point.y = Int32(mouseEvent.button.y) / windowScale - data!.pointee.state = LV_INDEV_STATE_PRESSED - } else if mouseEvent.type == SDL_MOUSEMOTION.rawValue && mouseEvent.motion.state & 0x1 != 0 { - data!.pointee.point.x = Int32(mouseEvent.motion.x) / windowScale - data!.pointee.point.y = Int32(mouseEvent.motion.y) / windowScale - data!.pointee.state = LV_INDEV_STATE_PRESSED - } else { - data!.pointee.state = LV_INDEV_STATE_RELEASED - } - }) - - UIAppLogic.createUI() - - // Initialize SDL video systems - guard SDL_Init(SDL_INIT_VIDEO) == 0 else { - fatalError("SDL could not initialize! SDL_Error: \(String(cString: SDL_GetError()))") - } - - // Create a window at the center of the screen - let window = SDL_CreateWindow( - "SDL Window", Int32(SDL_WINDOWPOS_CENTERED_MASK), - Int32(SDL_WINDOWPOS_CENTERED_MASK), drawSize.width * windowScale, drawSize.height * windowScale, - SDL_WINDOW_SHOWN.rawValue) - - // Create renderer - guard let renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED.rawValue) else { - fatalError("Renderer could not be created! SDL_Error: \(String(cString: SDL_GetError()))") - } - - // Create texture - texture = SDL_CreateTexture( - renderer, SDL_PIXELFORMAT_ARGB8888.rawValue, - Int32(SDL_TEXTUREACCESS_STREAMING.rawValue), drawSize.width, drawSize.height) - guard texture != nil else { - fatalError("Texture could not be created! SDL_Error: \(String(cString: SDL_GetError()))") - } - - var event = SDL_Event() - var frameCounter = 0 - let startTime = Date() - mainLoop: while true { - uptimeInMs = Int(Date().timeIntervalSince(startTime) * 1000) - let delay = lv_timer_handler() - - // Clear renderer, copy texture to renderer, and present - SDL_RenderClear(renderer) - SDL_RenderCopy(renderer, texture, nil, nil) - SDL_RenderPresent(renderer) - - while SDL_PollEvent(&event) > 0 { - if event.type == SDL_MOUSEBUTTONDOWN.rawValue { - mouseEvent = event - } - if event.type == SDL_MOUSEBUTTONUP.rawValue { - mouseEvent = event - } - if event.type == SDL_MOUSEMOTION.rawValue { - mouseEvent = event - } - if event.type == SDL_QUIT.rawValue { - break mainLoop - } - } - - SDL_Delay(delay) - - UIAppLogic.updateFrame() - } - - SDL_DestroyWindow(window) - SDL_Quit() - } -} diff --git a/stm32-lvgl/Sources/HostSDLApp/UIAppLogic.swift b/stm32-lvgl/Sources/HostSDLApp/UIAppLogic.swift deleted file mode 120000 index a5ab2212..00000000 --- a/stm32-lvgl/Sources/HostSDLApp/UIAppLogic.swift +++ /dev/null @@ -1 +0,0 @@ -../Application/UIAppLogic.swift \ No newline at end of file diff --git a/stm32-lvgl/Sources/Registers/DBGMCU.swift b/stm32-lvgl/Sources/Registers/DBGMCU.swift deleted file mode 100644 index c1a7a0bf..00000000 --- a/stm32-lvgl/Sources/Registers/DBGMCU.swift +++ /dev/null @@ -1,153 +0,0 @@ -// Generated by svd2swift. - -import MMIO - -/// Debug support -@RegisterBlock -public struct DBGMCU { - /// IDCODE - @RegisterBlock(offset: 0x0) - public var idcode: Register - - /// Control Register - @RegisterBlock(offset: 0x4) - public var cr: Register - - /// Debug MCU APB1 Freeze registe - @RegisterBlock(offset: 0x8) - public var apb1_fz: Register - - /// Debug MCU APB2 Freeze registe - @RegisterBlock(offset: 0xc) - public var apb2_fz: Register -} - -extension DBGMCU { - /// IDCODE - @Register(bitWidth: 32) - public struct IDCODE { - /// DEV_ID - @ReadOnly(bits: 0..<12) - public var dev_id: DEV_ID - - /// REV_ID - @ReadOnly(bits: 16..<32) - public var rev_id: REV_ID - } - - /// Control Register - @Register(bitWidth: 32) - public struct CR { - /// DBG_SLEEP - @ReadWrite(bits: 0..<1) - public var dbg_sleep: DBG_SLEEP - - /// DBG_STOP - @ReadWrite(bits: 1..<2) - public var dbg_stop: DBG_STOP - - /// DBG_STANDBY - @ReadWrite(bits: 2..<3) - public var dbg_standby: DBG_STANDBY - - /// TRACE_IOEN - @ReadWrite(bits: 5..<6) - public var trace_ioen: TRACE_IOEN - - /// TRACE_MODE - @ReadWrite(bits: 6..<8) - public var trace_mode: TRACE_MODE - } - - /// Debug MCU APB1 Freeze registe - @Register(bitWidth: 32) - public struct APB1_FZ { - /// DBG_TIM2_STOP - @ReadWrite(bits: 0..<1) - public var dbg_tim2_stop: DBG_TIM2_STOP - - /// DBG_TIM3 _STOP - @ReadWrite(bits: 1..<2) - public var dbg_tim3_stop: DBG_TIM3_STOP - - /// DBG_TIM4_STOP - @ReadWrite(bits: 2..<3) - public var dbg_tim4_stop: DBG_TIM4_STOP - - /// DBG_TIM5_STOP - @ReadWrite(bits: 3..<4) - public var dbg_tim5_stop: DBG_TIM5_STOP - - /// DBG_TIM6_STOP - @ReadWrite(bits: 4..<5) - public var dbg_tim6_stop: DBG_TIM6_STOP - - /// DBG_TIM7_STOP - @ReadWrite(bits: 5..<6) - public var dbg_tim7_stop: DBG_TIM7_STOP - - /// DBG_TIM12_STOP - @ReadWrite(bits: 6..<7) - public var dbg_tim12_stop: DBG_TIM12_STOP - - /// DBG_TIM13_STOP - @ReadWrite(bits: 7..<8) - public var dbg_tim13_stop: DBG_TIM13_STOP - - /// DBG_TIM14_STOP - @ReadWrite(bits: 8..<9) - public var dbg_tim14_stop: DBG_TIM14_STOP - - /// DBG_WWDG_STOP - @ReadWrite(bits: 11..<12) - public var dbg_wwdg_stop: DBG_WWDG_STOP - - /// DBG_IWDEG_STOP - @ReadWrite(bits: 12..<13) - public var dbg_iwdg_stop: DBG_IWDG_STOP - - /// DBG_J2C1_SMBUS_TIMEOUT - @ReadWrite(bits: 21..<22) - public var dbg_j2c1_smbus_timeout: DBG_J2C1_SMBUS_TIMEOUT - - /// DBG_J2C2_SMBUS_TIMEOUT - @ReadWrite(bits: 22..<23) - public var dbg_j2c2_smbus_timeout: DBG_J2C2_SMBUS_TIMEOUT - - /// DBG_J2C3SMBUS_TIMEOUT - @ReadWrite(bits: 23..<24) - public var dbg_j2c3smbus_timeout: DBG_J2C3SMBUS_TIMEOUT - - /// DBG_CAN1_STOP - @ReadWrite(bits: 25..<26) - public var dbg_can1_stop: DBG_CAN1_STOP - - /// DBG_CAN2_STOP - @ReadWrite(bits: 26..<27) - public var dbg_can2_stop: DBG_CAN2_STOP - } - - /// Debug MCU APB2 Freeze registe - @Register(bitWidth: 32) - public struct APB2_FZ { - /// TIM1 counter stopped when core is halted - @ReadWrite(bits: 0..<1) - public var dbg_tim1_stop: DBG_TIM1_STOP - - /// TIM8 counter stopped when core is halted - @ReadWrite(bits: 1..<2) - public var dbg_tim8_stop: DBG_TIM8_STOP - - /// TIM9 counter stopped when core is halted - @ReadWrite(bits: 16..<17) - public var dbg_tim9_stop: DBG_TIM9_STOP - - /// TIM10 counter stopped when core is halted - @ReadWrite(bits: 17..<18) - public var dbg_tim10_stop: DBG_TIM10_STOP - - /// TIM11 counter stopped when core is halted - @ReadWrite(bits: 18..<19) - public var dbg_tim11_stop: DBG_TIM11_STOP - } -} diff --git a/stm32-lvgl/Sources/Registers/Device.swift b/stm32-lvgl/Sources/Registers/Device.swift deleted file mode 100644 index f62c96b4..00000000 --- a/stm32-lvgl/Sources/Registers/Device.swift +++ /dev/null @@ -1,81 +0,0 @@ -// Generated by svd2swift. - -import MMIO - -/// Debug support -public let dbgmcu = DBGMCU(unsafeAddress: 0xe0042000) - -/// FLASH -public let flash = FLASH(unsafeAddress: 0x40023c00) - -/// Flexible memory controller -public let fmc = FMC(unsafeAddress: 0xa0000000) - -/// General-purpose I/Os -public let gpioa = GPIOA(unsafeAddress: 0x40020000) - -/// General-purpose I/Os -public let gpiob = GPIOB(unsafeAddress: 0x40020400) - -/// General-purpose I/Os -public let gpioc = GPIOC(unsafeAddress: 0x40020800) - -/// General-purpose I/Os -public let gpiod = GPIOD(unsafeAddress: 0x40020c00) - -/// General-purpose I/Os -public let gpioe = GPIOE(unsafeAddress: 0x40021000) - -/// General-purpose I/Os -public let gpiof = GPIOF(unsafeAddress: 0x40021400) - -/// General-purpose I/Os -public let gpiog = GPIOG(unsafeAddress: 0x40021800) - -/// General-purpose I/Os -public let gpioh = GPIOH(unsafeAddress: 0x40021c00) - -/// General-purpose I/Os -public let gpioi = GPIOI(unsafeAddress: 0x40022000) - -/// General-purpose I/Os -public let gpioj = GPIOJ(unsafeAddress: 0x40022400) - -/// General-purpose I/Os -public let gpiok = GPIOK(unsafeAddress: 0x40022800) - -/// Inter-integrated circuit -public let i2c1 = I2C1(unsafeAddress: 0x40005400) - -/// Inter-integrated circuit -public let i2c2 = I2C2(unsafeAddress: 0x40005800) - -/// Inter-integrated circuit -public let i2c3 = I2C3(unsafeAddress: 0x40005c00) - -/// Inter-integrated circuit -public let i2c4 = I2C4(unsafeAddress: 0x40006000) - -/// LCD-TFT Controller -public let ltdc = LTDC(unsafeAddress: 0x40016800) - -/// Nested Vectored Interrupt Controller -public let nvic = NVIC(unsafeAddress: 0xe000e100) - -/// Power control -public let pwr = PWR(unsafeAddress: 0x40007000) - -/// Reset and clock control -public let rcc = RCC(unsafeAddress: 0x40023800) - -/// System control block -public let scb = SCB(unsafeAddress: 0xe000ed00) - -/// SysTick timer -public let stk = STK(unsafeAddress: 0xe000e010) - -/// System configuration controller -public let syscfg = SYSCFG(unsafeAddress: 0x40013800) - -/// Universal synchronous asynchronous receiver transmitter -public let usart1 = USART1(unsafeAddress: 0x40011000) diff --git a/stm32-lvgl/Sources/Registers/FLASH.swift b/stm32-lvgl/Sources/Registers/FLASH.swift deleted file mode 100644 index bfceb4f2..00000000 --- a/stm32-lvgl/Sources/Registers/FLASH.swift +++ /dev/null @@ -1,469 +0,0 @@ -// Generated by svd2swift. - -import MMIO - -/// FLASH -@RegisterBlock -public struct FLASH { - /// Flash access control register - @RegisterBlock(offset: 0x0) - public var acr: Register - - /// Flash key register - @RegisterBlock(offset: 0x4) - public var keyr: Register - - /// Flash option key register - @RegisterBlock(offset: 0x8) - public var optkeyr: Register - - /// Status register - @RegisterBlock(offset: 0xc) - public var sr: Register - - /// Control register - @RegisterBlock(offset: 0x10) - public var cr: Register - - /// Flash option control register - @RegisterBlock(offset: 0x14) - public var optcr: Register - - /// Flash option control register 1 - @RegisterBlock(offset: 0x18) - public var optcr1: Register -} - -extension FLASH { - /// Flash access control register - @Register(bitWidth: 32) - public struct ACR { - /// Latency - @ReadWrite(bits: 0..<4, as: LATENCYValues.self) - public var latency: LATENCY - - /// Prefetch enable - @ReadWrite(bits: 8..<9, as: PRFTENValues.self) - public var prften: PRFTEN - - /// ART Accelerator Enable - @ReadWrite(bits: 9..<10, as: ARTENValues.self) - public var arten: ARTEN - - /// ART Accelerator reset - @ReadWrite(bits: 11..<12, as: ARTRSTValues.self) - public var artrst: ARTRST - } - - /// Flash key register - @Register(bitWidth: 32) - public struct KEYR { - /// FPEC key - @WriteOnly(bits: 0..<32) - public var key: KEY - } - - /// Flash option key register - @Register(bitWidth: 32) - public struct OPTKEYR { - /// Option byte key - @WriteOnly(bits: 0..<32) - public var optkeyr_field: OPTKEYR_FIELD - } - - /// Status register - @Register(bitWidth: 32) - public struct SR { - /// End of operation - @ReadWrite(bits: 0..<1) - public var eop: EOP - - /// Operation error - @ReadWrite(bits: 1..<2) - public var operr: OPERR - - /// Write protection error - @ReadWrite(bits: 4..<5) - public var wrperr: WRPERR - - /// Programming alignment error - @ReadWrite(bits: 5..<6) - public var pgaerr: PGAERR - - /// Programming parallelism error - @ReadWrite(bits: 6..<7) - public var pgperr: PGPERR - - /// Programming sequence error - @ReadWrite(bits: 7..<8) - public var erserr: ERSERR - - /// Busy - @ReadOnly(bits: 16..<17) - public var bsy: BSY - } - - /// Control register - @Register(bitWidth: 32) - public struct CR { - /// Programming - @ReadWrite(bits: 0..<1, as: PGValues.self) - public var pg: PG - - /// Sector Erase - @ReadWrite(bits: 1..<2, as: SERValues.self) - public var ser: SER - - /// Mass Erase of sectors 0 to 11 - @ReadWrite(bits: 2..<3, as: MERValues.self) - public var mer: MER - - /// Sector number - @ReadWrite(bits: 3..<7) - public var snb: SNB - - /// Program size - @ReadWrite(bits: 8..<10, as: PSIZEValues.self) - public var psize: PSIZE - - /// Start - @ReadWrite(bits: 16..<17, as: STRTValues.self) - public var strt: STRT - - /// End of operation interrupt enable - @ReadWrite(bits: 24..<25, as: EOPIEValues.self) - public var eopie: EOPIE - - /// Error interrupt enable - @ReadWrite(bits: 25..<26, as: ERRIEValues.self) - public var errie: ERRIE - - /// Lock - @ReadWrite(bits: 31..<32, as: LOCKValues.self) - public var lock: LOCK - } - - /// Flash option control register - @Register(bitWidth: 32) - public struct OPTCR { - /// Option lock - @ReadWrite(bits: 0..<1) - public var optlock: OPTLOCK - - /// Option start - @ReadWrite(bits: 1..<2) - public var optstrt: OPTSTRT - - /// BOR reset Level - @ReadWrite(bits: 2..<4) - public var bor_lev: BOR_LEV - - /// User option bytes - @ReadWrite(bits: 4..<5) - public var wwdg_sw: WWDG_SW - - /// User option bytes - @ReadWrite(bits: 5..<6) - public var iwdg_sw: IWDG_SW - - /// User option bytes - @ReadWrite(bits: 6..<7) - public var nrst_stop: nRST_STOP - - /// User option bytes - @ReadWrite(bits: 7..<8) - public var nrst_stdby: nRST_STDBY - - /// Read protect - @ReadWrite(bits: 8..<16) - public var rdp: RDP - - /// Not write protect - @ReadWrite(bits: 16..<24) - public var nwrp: nWRP - - /// Independent watchdog counter freeze in standby mode - @ReadWrite(bits: 30..<31) - public var iwdg_stdby: IWDG_STDBY - - /// Independent watchdog counter freeze in Stop mode - @ReadWrite(bits: 31..<32) - public var iwdg_stop: IWDG_STOP - } - - /// Flash option control register 1 - @Register(bitWidth: 32) - public struct OPTCR1 { - /// Boot base address when Boot pin =0 - @ReadWrite(bits: 0..<16) - public var boot_add0: BOOT_ADD0 - - /// Boot base address when Boot pin =1 - @ReadWrite(bits: 16..<32) - public var boot_add1: BOOT_ADD1 - } -} - -extension FLASH.ACR { - public struct LATENCYValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 4 - - /// 0 wait states - public static let WS0 = Self(rawValue: 0x0) - - /// 1 wait states - public static let WS1 = Self(rawValue: 0x1) - - /// 2 wait states - public static let WS2 = Self(rawValue: 0x2) - - /// 3 wait states - public static let WS3 = Self(rawValue: 0x3) - - /// 4 wait states - public static let WS4 = Self(rawValue: 0x4) - - /// 5 wait states - public static let WS5 = Self(rawValue: 0x5) - - /// 6 wait states - public static let WS6 = Self(rawValue: 0x6) - - /// 7 wait states - public static let WS7 = Self(rawValue: 0x7) - - /// 8 wait states - public static let WS8 = Self(rawValue: 0x8) - - /// 9 wait states - public static let WS9 = Self(rawValue: 0x9) - - /// 10 wait states - public static let WS10 = Self(rawValue: 0xa) - - /// 11 wait states - public static let WS11 = Self(rawValue: 0xb) - - /// 12 wait states - public static let WS12 = Self(rawValue: 0xc) - - /// 13 wait states - public static let WS13 = Self(rawValue: 0xd) - - /// 14 wait states - public static let WS14 = Self(rawValue: 0xe) - - /// 15 wait states - public static let WS15 = Self(rawValue: 0xf) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension FLASH.ACR { - public struct PRFTENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Prefetch is disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Prefetch is enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension FLASH.ACR { - public struct ARTENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// ART Accelerator is disabled - public static let Disabled = Self(rawValue: 0x0) - - /// ART Accelerator is enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension FLASH.ACR { - public struct ARTRSTValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Accelerator is not reset - public static let NotReset = Self(rawValue: 0x0) - - /// Accelerator is reset - public static let Reset = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension FLASH.CR { - public struct PGValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Flash programming activated - public static let Program = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension FLASH.CR { - public struct SERValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Erase activated for selected sector - public static let SectorErase = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension FLASH.CR { - public struct MERValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Erase activated for all user sectors - public static let MassErase = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension FLASH.CR { - public struct PSIZEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// Program x8 - public static let PSIZE8 = Self(rawValue: 0x0) - - /// Program x16 - public static let PSIZE16 = Self(rawValue: 0x1) - - /// Program x32 - public static let PSIZE32 = Self(rawValue: 0x2) - - /// Program x64 - public static let PSIZE64 = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension FLASH.CR { - public struct STRTValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Trigger an erase operation - public static let Start = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension FLASH.CR { - public struct EOPIEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// End of operation interrupt disabled - public static let Disabled = Self(rawValue: 0x0) - - /// End of operation interrupt enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension FLASH.CR { - public struct ERRIEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Error interrupt generation disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Error interrupt generation enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension FLASH.CR { - public struct LOCKValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// FLASH_CR register is unlocked - public static let Unlocked = Self(rawValue: 0x0) - - /// FLASH_CR register is locked - public static let Locked = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} diff --git a/stm32-lvgl/Sources/Registers/FMC.swift b/stm32-lvgl/Sources/Registers/FMC.swift deleted file mode 100644 index 6e207f21..00000000 --- a/stm32-lvgl/Sources/Registers/FMC.swift +++ /dev/null @@ -1,1611 +0,0 @@ -// Generated by svd2swift. - -import MMIO - -/// Flexible memory controller -@RegisterBlock -public struct FMC { - /// SRAM/NOR-Flash chip-select control register 1 - @RegisterBlock(offset: 0x0) - public var bcr1: Register - - /// SRAM/NOR-Flash chip-select timing register 1 - @RegisterBlock(offset: 0x4, stride: 0x8, count: 4) - public var btr: RegisterArray - - /// SRAM/NOR-Flash chip-select control register 2 - @RegisterBlock(offset: 0x8, stride: 0x8, count: 3) - public var bcr: RegisterArray - - /// PC Card/NAND Flash control register - @RegisterBlock(offset: 0x80) - public var pcr: Register - - /// FIFO status and interrupt register - @RegisterBlock(offset: 0x84) - public var sr: Register - - /// Common memory space timing register - @RegisterBlock(offset: 0x88) - public var pmem: Register - - /// Attribute memory space timing register - @RegisterBlock(offset: 0x8c) - public var patt: Register - - /// ECC result register - @RegisterBlock(offset: 0x94) - public var eccr: Register - - /// SRAM/NOR-Flash write timing registers 1 - @RegisterBlock(offset: 0x104, stride: 0x8, count: 4) - public var bwtr: RegisterArray - - /// SDRAM Control Register 1 - @RegisterBlock(offset: 0x140, stride: 0x4, count: 2) - public var sdcr: RegisterArray - - /// SDRAM Timing register 1 - @RegisterBlock(offset: 0x148, stride: 0x4, count: 2) - public var sdtr: RegisterArray - - /// SDRAM Command Mode register - @RegisterBlock(offset: 0x150) - public var sdcmr: Register - - /// SDRAM Refresh Timer register - @RegisterBlock(offset: 0x154) - public var sdrtr: Register - - /// SDRAM Status register - @RegisterBlock(offset: 0x158) - public var sdsr: Register -} - -extension FMC { - /// SRAM/NOR-Flash chip-select control register 1 - @Register(bitWidth: 32) - public struct BCR1 { - /// CCLKEN - @ReadWrite(bits: 20..<21, as: CCLKENValues.self) - public var cclken: CCLKEN - - /// CBURSTRW - @ReadWrite(bits: 19..<20, as: CBURSTRWValues.self) - public var cburstrw: CBURSTRW - - /// ASYNCWAIT - @ReadWrite(bits: 15..<16, as: ASYNCWAITValues.self) - public var asyncwait: ASYNCWAIT - - /// EXTMOD - @ReadWrite(bits: 14..<15, as: EXTMODValues.self) - public var extmod: EXTMOD - - /// WAITEN - @ReadWrite(bits: 13..<14, as: WAITENValues.self) - public var waiten: WAITEN - - /// WREN - @ReadWrite(bits: 12..<13, as: WRENValues.self) - public var wren: WREN - - /// WAITCFG - @ReadWrite(bits: 11..<12, as: WAITCFGValues.self) - public var waitcfg: WAITCFG - - /// WAITPOL - @ReadWrite(bits: 9..<10, as: WAITPOLValues.self) - public var waitpol: WAITPOL - - /// BURSTEN - @ReadWrite(bits: 8..<9, as: BURSTENValues.self) - public var bursten: BURSTEN - - /// FACCEN - @ReadWrite(bits: 6..<7, as: FACCENValues.self) - public var faccen: FACCEN - - /// MWID - @ReadWrite(bits: 4..<6, as: MWIDValues.self) - public var mwid: MWID - - /// MTYP - @ReadWrite(bits: 2..<4, as: MTYPValues.self) - public var mtyp: MTYP - - /// MUXEN - @ReadWrite(bits: 1..<2, as: MUXENValues.self) - public var muxen: MUXEN - - /// MBKEN - @ReadWrite(bits: 0..<1, as: MBKENValues.self) - public var mbken: MBKEN - - /// WRAPMOD - @ReadWrite(bits: 10..<11) - public var wrapmod: WRAPMOD - - /// Write FIFO disable - @ReadWrite(bits: 21..<22, as: WFDISValues.self) - public var wfdis: WFDIS - - /// CRAM page size - @ReadWrite(bits: 16..<19, as: CPSIZEValues.self) - public var cpsize: CPSIZE - } - - /// SRAM/NOR-Flash chip-select timing register 1 - @Register(bitWidth: 32) - public struct BTR { - /// ACCMOD - @ReadWrite(bits: 28..<30, as: ACCMODValues.self) - public var accmod: ACCMOD - - /// DATLAT - @ReadWrite(bits: 24..<28) - public var datlat: DATLAT - - /// CLKDIV - @ReadWrite(bits: 20..<24) - public var clkdiv: CLKDIV - - /// BUSTURN - @ReadWrite(bits: 16..<20) - public var busturn: BUSTURN - - /// DATAST - @ReadWrite(bits: 8..<16) - public var datast: DATAST - - /// ADDHLD - @ReadWrite(bits: 4..<8) - public var addhld: ADDHLD - - /// ADDSET - @ReadWrite(bits: 0..<4) - public var addset: ADDSET - } - - /// SRAM/NOR-Flash chip-select control register 2 - @Register(bitWidth: 32) - public struct BCR { - /// CBURSTRW - @ReadWrite(bits: 19..<20, as: CBURSTRWValues.self) - public var cburstrw: CBURSTRW - - /// ASYNCWAIT - @ReadWrite(bits: 15..<16, as: ASYNCWAITValues.self) - public var asyncwait: ASYNCWAIT - - /// EXTMOD - @ReadWrite(bits: 14..<15, as: EXTMODValues.self) - public var extmod: EXTMOD - - /// WAITEN - @ReadWrite(bits: 13..<14, as: WAITENValues.self) - public var waiten: WAITEN - - /// WREN - @ReadWrite(bits: 12..<13, as: WRENValues.self) - public var wren: WREN - - /// WAITCFG - @ReadWrite(bits: 11..<12, as: WAITCFGValues.self) - public var waitcfg: WAITCFG - - /// WRAPMOD - @ReadWrite(bits: 10..<11) - public var wrapmod: WRAPMOD - - /// WAITPOL - @ReadWrite(bits: 9..<10, as: WAITPOLValues.self) - public var waitpol: WAITPOL - - /// BURSTEN - @ReadWrite(bits: 8..<9, as: BURSTENValues.self) - public var bursten: BURSTEN - - /// FACCEN - @ReadWrite(bits: 6..<7, as: FACCENValues.self) - public var faccen: FACCEN - - /// MWID - @ReadWrite(bits: 4..<6, as: MWIDValues.self) - public var mwid: MWID - - /// MTYP - @ReadWrite(bits: 2..<4, as: MTYPValues.self) - public var mtyp: MTYP - - /// MUXEN - @ReadWrite(bits: 1..<2, as: MUXENValues.self) - public var muxen: MUXEN - - /// MBKEN - @ReadWrite(bits: 0..<1, as: MBKENValues.self) - public var mbken: MBKEN - - /// CRAM page size - @ReadWrite(bits: 16..<19, as: CPSIZEValues.self) - public var cpsize: CPSIZE - } - - /// PC Card/NAND Flash control register - @Register(bitWidth: 32) - public struct PCR { - /// ECCPS - @ReadWrite(bits: 17..<20, as: ECCPSValues.self) - public var eccps: ECCPS - - /// TAR - @ReadWrite(bits: 13..<17) - public var tar: TAR - - /// TCLR - @ReadWrite(bits: 9..<13) - public var tclr: TCLR - - /// ECCEN - @ReadWrite(bits: 6..<7, as: ECCENValues.self) - public var eccen: ECCEN - - /// PWID - @ReadWrite(bits: 4..<6, as: PWIDValues.self) - public var pwid: PWID - - /// PTYP - @ReadWrite(bits: 3..<4, as: PTYPValues.self) - public var ptyp: PTYP - - /// PBKEN - @ReadWrite(bits: 2..<3, as: PBKENValues.self) - public var pbken: PBKEN - - /// PWAITEN - @ReadWrite(bits: 1..<2, as: PWAITENValues.self) - public var pwaiten: PWAITEN - } - - /// FIFO status and interrupt register - @Register(bitWidth: 32) - public struct SR { - /// FEMPT - @ReadOnly(bits: 6..<7) - public var fempt: FEMPT - - /// IFEN - @ReadWrite(bits: 5..<6, as: IFENValues.self) - public var ifen: IFEN - - /// ILEN - @ReadWrite(bits: 4..<5, as: ILENValues.self) - public var ilen: ILEN - - /// IREN - @ReadWrite(bits: 3..<4, as: IRENValues.self) - public var iren: IREN - - /// IFS - @ReadWrite(bits: 2..<3, as: IFSValues.self) - public var ifs: IFS - - /// ILS - @ReadWrite(bits: 1..<2, as: ILSValues.self) - public var ils: ILS - - /// IRS - @ReadWrite(bits: 0..<1, as: IRSValues.self) - public var irs: IRS - } - - /// Common memory space timing register - @Register(bitWidth: 32) - public struct PMEM { - /// MEMHIZx - @ReadWrite(bits: 24..<32) - public var memhiz: MEMHIZ - - /// MEMHOLDx - @ReadWrite(bits: 16..<24) - public var memhold: MEMHOLD - - /// MEMWAITx - @ReadWrite(bits: 8..<16) - public var memwait: MEMWAIT - - /// MEMSETx - @ReadWrite(bits: 0..<8) - public var memset: MEMSET - } - - /// Attribute memory space timing register - @Register(bitWidth: 32) - public struct PATT { - /// ATTHIZx - @ReadWrite(bits: 24..<32) - public var atthiz: ATTHIZ - - /// ATTHOLDx - @ReadWrite(bits: 16..<24) - public var atthold: ATTHOLD - - /// ATTWAITx - @ReadWrite(bits: 8..<16) - public var attwait: ATTWAIT - - /// ATTSETx - @ReadWrite(bits: 0..<8) - public var attset: ATTSET - } - - /// ECC result register - @Register(bitWidth: 32) - public struct ECCR { - /// ECCx - @ReadOnly(bits: 0..<32) - public var ecc: ECC - } - - /// SRAM/NOR-Flash write timing registers 1 - @Register(bitWidth: 32) - public struct BWTR { - /// ACCMOD - @ReadWrite(bits: 28..<30, as: ACCMODValues.self) - public var accmod: ACCMOD - - /// DATLAT - @ReadWrite(bits: 24..<28) - public var datlat: DATLAT - - /// CLKDIV - @ReadWrite(bits: 20..<24) - public var clkdiv: CLKDIV - - /// DATAST - @ReadWrite(bits: 8..<16) - public var datast: DATAST - - /// ADDHLD - @ReadWrite(bits: 4..<8) - public var addhld: ADDHLD - - /// ADDSET - @ReadWrite(bits: 0..<4) - public var addset: ADDSET - - /// Bus turnaround phase duration - @ReadWrite(bits: 16..<20) - public var busturn: BUSTURN - } - - /// SDRAM Control Register 1 - @Register(bitWidth: 32) - public struct SDCR { - /// Number of column address bits - @ReadWrite(bits: 0..<2, as: NCValues.self) - public var nc: NC - - /// Number of row address bits - @ReadWrite(bits: 2..<4, as: NRValues.self) - public var nr: NR - - /// Memory data bus width - @ReadWrite(bits: 4..<6, as: MWIDValues.self) - public var mwid: MWID - - /// Number of internal banks - @ReadWrite(bits: 6..<7, as: NBValues.self) - public var nb: NB - - /// CAS latency - @ReadWrite(bits: 7..<9, as: CASValues.self) - public var cas: CAS - - /// Write protection - @ReadWrite(bits: 9..<10, as: WPValues.self) - public var wp: WP - - /// SDRAM clock configuration - @ReadWrite(bits: 10..<12, as: SDCLKValues.self) - public var sdclk: SDCLK - - /// Burst read - @ReadWrite(bits: 12..<13, as: RBURSTValues.self) - public var rburst: RBURST - - /// Read pipe - @ReadWrite(bits: 13..<15, as: RPIPEValues.self) - public var rpipe: RPIPE - } - - /// SDRAM Timing register 1 - @Register(bitWidth: 32) - public struct SDTR { - /// Load Mode Register to Active - @ReadWrite(bits: 0..<4) - public var tmrd: TMRD - - /// Exit self-refresh delay - @ReadWrite(bits: 4..<8) - public var txsr: TXSR - - /// Self refresh time - @ReadWrite(bits: 8..<12) - public var tras: TRAS - - /// Row cycle delay - @ReadWrite(bits: 12..<16) - public var trc: TRC - - /// Recovery delay - @ReadWrite(bits: 16..<20) - public var twr: TWR - - /// Row precharge delay - @ReadWrite(bits: 20..<24) - public var trp: TRP - - /// Row to column delay - @ReadWrite(bits: 24..<28) - public var trcd: TRCD - } - - /// SDRAM Command Mode register - @Register(bitWidth: 32) - public struct SDCMR { - /// Command mode - @WriteOnly(bits: 0..<3) - public var mode: MODE - - /// Command target bank 2 - @WriteOnly(bits: 3..<4) - public var ctb2: CTB2 - - /// Command target bank 1 - @WriteOnly(bits: 4..<5) - public var ctb1: CTB1 - - /// Number of Auto-refresh - @ReadWrite(bits: 5..<9) - public var nrfs: NRFS - - /// Mode Register definition - @ReadWrite(bits: 9..<22) - public var mrd: MRD - } - - /// SDRAM Refresh Timer register - @Register(bitWidth: 32) - public struct SDRTR { - /// Clear Refresh error flag - @WriteOnly(bits: 0..<1) - public var cre: CRE - - /// Refresh Timer Count - @ReadWrite(bits: 1..<14) - public var count: COUNT - - /// RES Interrupt Enable - @ReadWrite(bits: 14..<15, as: REIEValues.self) - public var reie: REIE - } - - /// SDRAM Status register - @Register(bitWidth: 32) - public struct SDSR { - /// Refresh error flag - @ReadOnly(bits: 0..<1) - public var re: RE - - /// Status Mode for Bank 1 - @ReadOnly(bits: 1..<3) - public var modes1: MODES1 - - /// Status Mode for Bank 2 - @ReadOnly(bits: 3..<5) - public var modes2: MODES2 - - /// Busy status - @ReadOnly(bits: 5..<6) - public var busy: BUSY - } -} - -extension FMC.BCR1 { - public struct CCLKENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// The FMC_CLK is generated continuously during asynchronous and synchronous access. The FMC_CLK clock is activated when the CCLKEN is set - public static let Disabled = Self(rawValue: 0x0) - - /// The FMC_CLK is only generated during the synchronous memory access (read/write transaction) - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension FMC.BCR1 { - public struct CBURSTRWValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Write operations are always performed in asynchronous mode - public static let Disabled = Self(rawValue: 0x0) - - /// Write operations are performed in synchronous mode - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension FMC.BCR1 { - public struct ASYNCWAITValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Wait signal not used in asynchronous mode - public static let Disabled = Self(rawValue: 0x0) - - /// Wait signal used even in asynchronous mode - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension FMC.BCR1 { - public struct EXTMODValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Values inside the FMC_BWTR are not taken into account - public static let Disabled = Self(rawValue: 0x0) - - /// Values inside the FMC_BWTR are taken into account - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension FMC.BCR1 { - public struct WAITENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Values inside the FMC_BWTR are taken into account - public static let Disabled = Self(rawValue: 0x0) - - /// NWAIT signal enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension FMC.BCR1 { - public struct WRENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Write operations disabled for the bank by the FMC - public static let Disabled = Self(rawValue: 0x0) - - /// Write operations enabled for the bank by the FMC - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension FMC.BCR1 { - public struct WAITCFGValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// NWAIT signal is active one data cycle before wait state - public static let BeforeWaitState = Self(rawValue: 0x0) - - /// NWAIT signal is active during wait state - public static let DuringWaitState = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension FMC.BCR1 { - public struct WAITPOLValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// NWAIT active low - public static let ActiveLow = Self(rawValue: 0x0) - - /// NWAIT active high - public static let ActiveHigh = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension FMC.BCR1 { - public struct BURSTENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Burst mode disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Burst mode enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension FMC.BCR1 { - public struct FACCENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Corresponding NOR Flash memory access is disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Corresponding NOR Flash memory access is enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension FMC.BCR1 { - public struct MWIDValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// Memory data bus width 8 bits - public static let Bits8 = Self(rawValue: 0x0) - - /// Memory data bus width 16 bits - public static let Bits16 = Self(rawValue: 0x1) - - /// Memory data bus width 32 bits - public static let Bits32 = Self(rawValue: 0x2) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension FMC.BCR1 { - public struct MTYPValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// SRAM memory type - public static let SRAM = Self(rawValue: 0x0) - - /// PSRAM (CRAM) memory type - public static let PSRAM = Self(rawValue: 0x1) - - /// NOR Flash/OneNAND Flash - public static let Flash = Self(rawValue: 0x2) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension FMC.BCR1 { - public struct MUXENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Address/Data non-multiplexed - public static let Disabled = Self(rawValue: 0x0) - - /// Address/Data multiplexed on databus - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension FMC.BCR1 { - public struct MBKENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Corresponding memory bank is disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Corresponding memory bank is enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension FMC.BCR1 { - public struct WFDISValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Write FIFO enabled - public static let Enabled = Self(rawValue: 0x0) - - /// Write FIFO disabled - public static let Disabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension FMC.BCR1 { - public struct CPSIZEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 3 - - /// No burst split when crossing page boundary - public static let NoBurstSplit = Self(rawValue: 0x0) - - /// 128 bytes CRAM page size - public static let Bytes128 = Self(rawValue: 0x1) - - /// 256 bytes CRAM page size - public static let Bytes256 = Self(rawValue: 0x2) - - /// 512 bytes CRAM page size - public static let Bytes512 = Self(rawValue: 0x3) - - /// 1024 bytes CRAM page size - public static let Bytes1024 = Self(rawValue: 0x4) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension FMC.BTR { - public struct ACCMODValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// Access mode A - public static let A = Self(rawValue: 0x0) - - /// Access mode B - public static let B = Self(rawValue: 0x1) - - /// Access mode C - public static let C = Self(rawValue: 0x2) - - /// Access mode D - public static let D = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension FMC.BCR { - public struct CBURSTRWValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Write operations are always performed in asynchronous mode - public static let Disabled = Self(rawValue: 0x0) - - /// Write operations are performed in synchronous mode - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension FMC.BCR { - public struct ASYNCWAITValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Wait signal not used in asynchronous mode - public static let Disabled = Self(rawValue: 0x0) - - /// Wait signal used even in asynchronous mode - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension FMC.BCR { - public struct EXTMODValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Values inside the FMC_BWTR are not taken into account - public static let Disabled = Self(rawValue: 0x0) - - /// Values inside the FMC_BWTR are taken into account - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension FMC.BCR { - public struct WAITENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Values inside the FMC_BWTR are taken into account - public static let Disabled = Self(rawValue: 0x0) - - /// NWAIT signal enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension FMC.BCR { - public struct WRENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Write operations disabled for the bank by the FMC - public static let Disabled = Self(rawValue: 0x0) - - /// Write operations enabled for the bank by the FMC - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension FMC.BCR { - public struct WAITCFGValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// NWAIT signal is active one data cycle before wait state - public static let BeforeWaitState = Self(rawValue: 0x0) - - /// NWAIT signal is active during wait state - public static let DuringWaitState = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension FMC.BCR { - public struct WAITPOLValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// NWAIT active low - public static let ActiveLow = Self(rawValue: 0x0) - - /// NWAIT active high - public static let ActiveHigh = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension FMC.BCR { - public struct BURSTENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Burst mode disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Burst mode enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension FMC.BCR { - public struct FACCENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Corresponding NOR Flash memory access is disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Corresponding NOR Flash memory access is enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension FMC.BCR { - public struct MWIDValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// Memory data bus width 8 bits - public static let Bits8 = Self(rawValue: 0x0) - - /// Memory data bus width 16 bits - public static let Bits16 = Self(rawValue: 0x1) - - /// Memory data bus width 32 bits - public static let Bits32 = Self(rawValue: 0x2) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension FMC.BCR { - public struct MTYPValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// SRAM memory type - public static let SRAM = Self(rawValue: 0x0) - - /// PSRAM (CRAM) memory type - public static let PSRAM = Self(rawValue: 0x1) - - /// NOR Flash/OneNAND Flash - public static let Flash = Self(rawValue: 0x2) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension FMC.BCR { - public struct MUXENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Address/Data non-multiplexed - public static let Disabled = Self(rawValue: 0x0) - - /// Address/Data multiplexed on databus - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension FMC.BCR { - public struct MBKENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Corresponding memory bank is disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Corresponding memory bank is enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension FMC.BCR { - public struct CPSIZEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 3 - - /// No burst split when crossing page boundary - public static let NoBurstSplit = Self(rawValue: 0x0) - - /// 128 bytes CRAM page size - public static let Bytes128 = Self(rawValue: 0x1) - - /// 256 bytes CRAM page size - public static let Bytes256 = Self(rawValue: 0x2) - - /// 512 bytes CRAM page size - public static let Bytes512 = Self(rawValue: 0x3) - - /// 1024 bytes CRAM page size - public static let Bytes1024 = Self(rawValue: 0x4) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension FMC.PCR { - public struct ECCPSValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 3 - - /// ECC page size 256 bytes - public static let Bytes256 = Self(rawValue: 0x0) - - /// ECC page size 512 bytes - public static let Bytes512 = Self(rawValue: 0x1) - - /// ECC page size 1024 bytes - public static let Bytes1024 = Self(rawValue: 0x2) - - /// ECC page size 2048 bytes - public static let Bytes2048 = Self(rawValue: 0x3) - - /// ECC page size 4096 bytes - public static let Bytes4096 = Self(rawValue: 0x4) - - /// ECC page size 8192 bytes - public static let Bytes8192 = Self(rawValue: 0x5) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension FMC.PCR { - public struct ECCENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// ECC logic is disabled and reset - public static let Disabled = Self(rawValue: 0x0) - - /// ECC logic is enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension FMC.PCR { - public struct PWIDValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// External memory device width 8 bits - public static let Bits8 = Self(rawValue: 0x0) - - /// External memory device width 16 bits - public static let Bits16 = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension FMC.PCR { - public struct PTYPValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// NAND Flash - public static let NANDFlash = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension FMC.PCR { - public struct PBKENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Corresponding memory bank is disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Corresponding memory bank is enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension FMC.PCR { - public struct PWAITENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Wait feature disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Wait feature enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension FMC.SR { - public struct IFENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Interrupt falling edge detection request disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Interrupt falling edge detection request enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension FMC.SR { - public struct ILENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Interrupt high-level detection request disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Interrupt high-level detection request enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension FMC.SR { - public struct IRENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Interrupt rising edge detection request disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Interrupt rising edge detection request enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension FMC.SR { - public struct IFSValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Interrupt falling edge did not occur - public static let DidNotOccur = Self(rawValue: 0x0) - - /// Interrupt falling edge occurred - public static let Occurred = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension FMC.SR { - public struct ILSValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Interrupt high-level did not occur - public static let DidNotOccur = Self(rawValue: 0x0) - - /// Interrupt high-level occurred - public static let Occurred = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension FMC.SR { - public struct IRSValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Interrupt rising edge did not occur - public static let DidNotOccur = Self(rawValue: 0x0) - - /// Interrupt rising edge occurred - public static let Occurred = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension FMC.BWTR { - public struct ACCMODValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// Access mode A - public static let A = Self(rawValue: 0x0) - - /// Access mode B - public static let B = Self(rawValue: 0x1) - - /// Access mode C - public static let C = Self(rawValue: 0x2) - - /// Access mode D - public static let D = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension FMC.SDCR { - public struct NCValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// 8 bits - public static let Bits8 = Self(rawValue: 0x0) - - /// 9 bits - public static let Bits9 = Self(rawValue: 0x1) - - /// 10 bits - public static let Bits10 = Self(rawValue: 0x2) - - /// 11 bits - public static let Bits11 = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension FMC.SDCR { - public struct NRValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// 11 bits - public static let Bits11 = Self(rawValue: 0x0) - - /// 12 bits - public static let Bits12 = Self(rawValue: 0x1) - - /// 13 bits - public static let Bits13 = Self(rawValue: 0x2) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension FMC.SDCR { - public struct MWIDValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// Memory data bus width 8 bits - public static let Bits8 = Self(rawValue: 0x0) - - /// Memory data bus width 16 bits - public static let Bits16 = Self(rawValue: 0x1) - - /// Memory data bus width 32 bits - public static let Bits32 = Self(rawValue: 0x2) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension FMC.SDCR { - public struct NBValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Two internal Banks - public static let NB2 = Self(rawValue: 0x0) - - /// Four internal Banks - public static let NB4 = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension FMC.SDCR { - public struct CASValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// 1 cycle - public static let Clocks1 = Self(rawValue: 0x1) - - /// 2 cycles - public static let Clocks2 = Self(rawValue: 0x2) - - /// 3 cycles - public static let Clocks3 = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension FMC.SDCR { - public struct WPValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Write accesses allowed - public static let Disabled = Self(rawValue: 0x0) - - /// Write accesses ignored - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension FMC.SDCR { - public struct SDCLKValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// SDCLK clock disabled - public static let Disabled = Self(rawValue: 0x0) - - /// SDCLK period = 2 x HCLK period - public static let Div2 = Self(rawValue: 0x2) - - /// SDCLK period = 3 x HCLK period - public static let Div3 = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension FMC.SDCR { - public struct RBURSTValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Single read requests are not managed as bursts - public static let Disabled = Self(rawValue: 0x0) - - /// Single read requests are always managed as bursts - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension FMC.SDCR { - public struct RPIPEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// No clock cycle delay - public static let NoDelay = Self(rawValue: 0x0) - - /// One clock cycle delay - public static let Clocks1 = Self(rawValue: 0x1) - - /// Two clock cycles delay - public static let Clocks2 = Self(rawValue: 0x2) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension FMC.SDRTR { - public struct REIEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Interrupt is disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Interrupt is generated if RE = 1 - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} diff --git a/stm32-lvgl/Sources/Registers/GPIOA.swift b/stm32-lvgl/Sources/Registers/GPIOA.swift deleted file mode 100644 index 9513b88f..00000000 --- a/stm32-lvgl/Sources/Registers/GPIOA.swift +++ /dev/null @@ -1,1075 +0,0 @@ -// Generated by svd2swift. - -import MMIO - -/// General-purpose I/Os -@RegisterBlock -public struct GPIOA { - /// GPIO port mode register - @RegisterBlock(offset: 0x0) - public var moder: Register - - /// GPIO port output type register - @RegisterBlock(offset: 0x4) - public var otyper: Register - - /// GPIO port output speed register - @RegisterBlock(offset: 0x8) - public var ospeedr: Register - - /// GPIO port pull-up/pull-down register - @RegisterBlock(offset: 0xc) - public var pupdr: Register - - /// GPIO port input data register - @RegisterBlock(offset: 0x10) - public var idr: Register - - /// GPIO port output data register - @RegisterBlock(offset: 0x14) - public var odr: Register - - /// GPIO port bit set/reset register - @RegisterBlock(offset: 0x18) - public var bsrr: Register - - /// GPIO port configuration lock register - @RegisterBlock(offset: 0x1c) - public var lckr: Register - - /// GPIO alternate function low register - @RegisterBlock(offset: 0x20) - public var afrl: Register - - /// GPIO alternate function high register - @RegisterBlock(offset: 0x24) - public var afrh: Register - - /// GPIO port bit reset register - @RegisterBlock(offset: 0x28) - public var brr: Register -} - -extension GPIOA { - /// GPIO port mode register - @Register(bitWidth: 32) - public struct MODER { - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 30..<32) - public var moder15: MODER15 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 28..<30) - public var moder14: MODER14 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 26..<28) - public var moder13: MODER13 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 24..<26) - public var moder12: MODER12 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 22..<24) - public var moder11: MODER11 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 20..<22) - public var moder10: MODER10 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 18..<20) - public var moder9: MODER9 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 16..<18) - public var moder8: MODER8 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 14..<16) - public var moder7: MODER7 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 12..<14) - public var moder6: MODER6 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 10..<12) - public var moder5: MODER5 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 8..<10) - public var moder4: MODER4 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 6..<8) - public var moder3: MODER3 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 4..<6) - public var moder2: MODER2 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 2..<4) - public var moder1: MODER1 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 0..<2, as: MODER0Values.self) - public var moder0: MODER0 - } - - /// GPIO port output type register - @Register(bitWidth: 32) - public struct OTYPER { - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 15..<16) - public var ot15: OT15 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 14..<15) - public var ot14: OT14 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 13..<14) - public var ot13: OT13 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 12..<13) - public var ot12: OT12 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 11..<12) - public var ot11: OT11 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 10..<11) - public var ot10: OT10 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 9..<10) - public var ot9: OT9 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 8..<9) - public var ot8: OT8 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 7..<8) - public var ot7: OT7 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 6..<7) - public var ot6: OT6 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 5..<6) - public var ot5: OT5 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 4..<5) - public var ot4: OT4 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 3..<4) - public var ot3: OT3 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 2..<3) - public var ot2: OT2 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 1..<2) - public var ot1: OT1 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 0..<1, as: OT0Values.self) - public var ot0: OT0 - } - - /// GPIO port output speed register - @Register(bitWidth: 32) - public struct OSPEEDR { - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 30..<32) - public var ospeedr15: OSPEEDR15 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 28..<30) - public var ospeedr14: OSPEEDR14 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 26..<28) - public var ospeedr13: OSPEEDR13 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 24..<26) - public var ospeedr12: OSPEEDR12 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 22..<24) - public var ospeedr11: OSPEEDR11 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 20..<22) - public var ospeedr10: OSPEEDR10 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 18..<20) - public var ospeedr9: OSPEEDR9 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 16..<18) - public var ospeedr8: OSPEEDR8 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 14..<16) - public var ospeedr7: OSPEEDR7 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 12..<14) - public var ospeedr6: OSPEEDR6 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 10..<12) - public var ospeedr5: OSPEEDR5 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 8..<10) - public var ospeedr4: OSPEEDR4 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 6..<8) - public var ospeedr3: OSPEEDR3 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 4..<6) - public var ospeedr2: OSPEEDR2 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 2..<4) - public var ospeedr1: OSPEEDR1 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 0..<2, as: OSPEEDR0Values.self) - public var ospeedr0: OSPEEDR0 - } - - /// GPIO port pull-up/pull-down register - @Register(bitWidth: 32) - public struct PUPDR { - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 30..<32) - public var pupdr15: PUPDR15 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 28..<30) - public var pupdr14: PUPDR14 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 26..<28) - public var pupdr13: PUPDR13 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 24..<26) - public var pupdr12: PUPDR12 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 22..<24) - public var pupdr11: PUPDR11 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 20..<22) - public var pupdr10: PUPDR10 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 18..<20) - public var pupdr9: PUPDR9 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 16..<18) - public var pupdr8: PUPDR8 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 14..<16) - public var pupdr7: PUPDR7 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 12..<14) - public var pupdr6: PUPDR6 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 10..<12) - public var pupdr5: PUPDR5 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 8..<10) - public var pupdr4: PUPDR4 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 6..<8) - public var pupdr3: PUPDR3 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 4..<6) - public var pupdr2: PUPDR2 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 2..<4) - public var pupdr1: PUPDR1 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 0..<2, as: PUPDR0Values.self) - public var pupdr0: PUPDR0 - } - - /// GPIO port input data register - @Register(bitWidth: 32) - public struct IDR { - /// Port input data (y = 0..15) - @ReadOnly(bits: 15..<16) - public var idr15: IDR15 - - /// Port input data (y = 0..15) - @ReadOnly(bits: 14..<15) - public var idr14: IDR14 - - /// Port input data (y = 0..15) - @ReadOnly(bits: 13..<14) - public var idr13: IDR13 - - /// Port input data (y = 0..15) - @ReadOnly(bits: 12..<13) - public var idr12: IDR12 - - /// Port input data (y = 0..15) - @ReadOnly(bits: 11..<12) - public var idr11: IDR11 - - /// Port input data (y = 0..15) - @ReadOnly(bits: 10..<11) - public var idr10: IDR10 - - /// Port input data (y = 0..15) - @ReadOnly(bits: 9..<10) - public var idr9: IDR9 - - /// Port input data (y = 0..15) - @ReadOnly(bits: 8..<9) - public var idr8: IDR8 - - /// Port input data (y = 0..15) - @ReadOnly(bits: 7..<8) - public var idr7: IDR7 - - /// Port input data (y = 0..15) - @ReadOnly(bits: 6..<7) - public var idr6: IDR6 - - /// Port input data (y = 0..15) - @ReadOnly(bits: 5..<6) - public var idr5: IDR5 - - /// Port input data (y = 0..15) - @ReadOnly(bits: 4..<5) - public var idr4: IDR4 - - /// Port input data (y = 0..15) - @ReadOnly(bits: 3..<4) - public var idr3: IDR3 - - /// Port input data (y = 0..15) - @ReadOnly(bits: 2..<3) - public var idr2: IDR2 - - /// Port input data (y = 0..15) - @ReadOnly(bits: 1..<2) - public var idr1: IDR1 - - /// Port input data (y = 0..15) - @ReadOnly(bits: 0..<1) - public var idr0: IDR0 - } - - /// GPIO port output data register - @Register(bitWidth: 32) - public struct ODR { - /// Port output data (y = 0..15) - @ReadWrite(bits: 15..<16) - public var odr15: ODR15 - - /// Port output data (y = 0..15) - @ReadWrite(bits: 14..<15) - public var odr14: ODR14 - - /// Port output data (y = 0..15) - @ReadWrite(bits: 13..<14) - public var odr13: ODR13 - - /// Port output data (y = 0..15) - @ReadWrite(bits: 12..<13) - public var odr12: ODR12 - - /// Port output data (y = 0..15) - @ReadWrite(bits: 11..<12) - public var odr11: ODR11 - - /// Port output data (y = 0..15) - @ReadWrite(bits: 10..<11) - public var odr10: ODR10 - - /// Port output data (y = 0..15) - @ReadWrite(bits: 9..<10) - public var odr9: ODR9 - - /// Port output data (y = 0..15) - @ReadWrite(bits: 8..<9) - public var odr8: ODR8 - - /// Port output data (y = 0..15) - @ReadWrite(bits: 7..<8) - public var odr7: ODR7 - - /// Port output data (y = 0..15) - @ReadWrite(bits: 6..<7) - public var odr6: ODR6 - - /// Port output data (y = 0..15) - @ReadWrite(bits: 5..<6) - public var odr5: ODR5 - - /// Port output data (y = 0..15) - @ReadWrite(bits: 4..<5) - public var odr4: ODR4 - - /// Port output data (y = 0..15) - @ReadWrite(bits: 3..<4) - public var odr3: ODR3 - - /// Port output data (y = 0..15) - @ReadWrite(bits: 2..<3) - public var odr2: ODR2 - - /// Port output data (y = 0..15) - @ReadWrite(bits: 1..<2) - public var odr1: ODR1 - - /// Port output data (y = 0..15) - @ReadWrite(bits: 0..<1, as: ODR0Values.self) - public var odr0: ODR0 - } - - /// GPIO port bit set/reset register - @Register(bitWidth: 32) - public struct BSRR { - /// Port x reset bit y (y = 0..15) - @WriteOnly(bits: 31..<32) - public var br15: BR15 - - /// Port x reset bit y (y = 0..15) - @WriteOnly(bits: 30..<31) - public var br14: BR14 - - /// Port x reset bit y (y = 0..15) - @WriteOnly(bits: 29..<30) - public var br13: BR13 - - /// Port x reset bit y (y = 0..15) - @WriteOnly(bits: 28..<29) - public var br12: BR12 - - /// Port x reset bit y (y = 0..15) - @WriteOnly(bits: 27..<28) - public var br11: BR11 - - /// Port x reset bit y (y = 0..15) - @WriteOnly(bits: 26..<27) - public var br10: BR10 - - /// Port x reset bit y (y = 0..15) - @WriteOnly(bits: 25..<26) - public var br9: BR9 - - /// Port x reset bit y (y = 0..15) - @WriteOnly(bits: 24..<25) - public var br8: BR8 - - /// Port x reset bit y (y = 0..15) - @WriteOnly(bits: 23..<24) - public var br7: BR7 - - /// Port x reset bit y (y = 0..15) - @WriteOnly(bits: 22..<23) - public var br6: BR6 - - /// Port x reset bit y (y = 0..15) - @WriteOnly(bits: 21..<22) - public var br5: BR5 - - /// Port x reset bit y (y = 0..15) - @WriteOnly(bits: 20..<21) - public var br4: BR4 - - /// Port x reset bit y (y = 0..15) - @WriteOnly(bits: 19..<20) - public var br3: BR3 - - /// Port x reset bit y (y = 0..15) - @WriteOnly(bits: 18..<19) - public var br2: BR2 - - /// Port x reset bit y (y = 0..15) - @WriteOnly(bits: 17..<18) - public var br1: BR1 - - /// Port x set bit y (y= 0..15) - @WriteOnly(bits: 16..<17) - public var br0: BR0 - - /// Port x set bit y (y= 0..15) - @WriteOnly(bits: 15..<16) - public var bs15: BS15 - - /// Port x set bit y (y= 0..15) - @WriteOnly(bits: 14..<15) - public var bs14: BS14 - - /// Port x set bit y (y= 0..15) - @WriteOnly(bits: 13..<14) - public var bs13: BS13 - - /// Port x set bit y (y= 0..15) - @WriteOnly(bits: 12..<13) - public var bs12: BS12 - - /// Port x set bit y (y= 0..15) - @WriteOnly(bits: 11..<12) - public var bs11: BS11 - - /// Port x set bit y (y= 0..15) - @WriteOnly(bits: 10..<11) - public var bs10: BS10 - - /// Port x set bit y (y= 0..15) - @WriteOnly(bits: 9..<10) - public var bs9: BS9 - - /// Port x set bit y (y= 0..15) - @WriteOnly(bits: 8..<9) - public var bs8: BS8 - - /// Port x set bit y (y= 0..15) - @WriteOnly(bits: 7..<8) - public var bs7: BS7 - - /// Port x set bit y (y= 0..15) - @WriteOnly(bits: 6..<7) - public var bs6: BS6 - - /// Port x set bit y (y= 0..15) - @WriteOnly(bits: 5..<6) - public var bs5: BS5 - - /// Port x set bit y (y= 0..15) - @WriteOnly(bits: 4..<5) - public var bs4: BS4 - - /// Port x set bit y (y= 0..15) - @WriteOnly(bits: 3..<4) - public var bs3: BS3 - - /// Port x set bit y (y= 0..15) - @WriteOnly(bits: 2..<3) - public var bs2: BS2 - - /// Port x set bit y (y= 0..15) - @WriteOnly(bits: 1..<2) - public var bs1: BS1 - - /// Port x set bit y (y= 0..15) - @WriteOnly(bits: 0..<1) - public var bs0: BS0 - } - - /// GPIO port configuration lock register - @Register(bitWidth: 32) - public struct LCKR { - /// Port x lock bit y (y= 0..15) - @ReadWrite(bits: 16..<17, as: LCKKValues.self) - public var lckk: LCKK - - /// Port x lock bit y (y= 0..15) - @ReadWrite(bits: 15..<16) - public var lck15: LCK15 - - /// Port x lock bit y (y= 0..15) - @ReadWrite(bits: 14..<15) - public var lck14: LCK14 - - /// Port x lock bit y (y= 0..15) - @ReadWrite(bits: 13..<14) - public var lck13: LCK13 - - /// Port x lock bit y (y= 0..15) - @ReadWrite(bits: 12..<13) - public var lck12: LCK12 - - /// Port x lock bit y (y= 0..15) - @ReadWrite(bits: 11..<12) - public var lck11: LCK11 - - /// Port x lock bit y (y= 0..15) - @ReadWrite(bits: 10..<11) - public var lck10: LCK10 - - /// Port x lock bit y (y= 0..15) - @ReadWrite(bits: 9..<10) - public var lck9: LCK9 - - /// Port x lock bit y (y= 0..15) - @ReadWrite(bits: 8..<9) - public var lck8: LCK8 - - /// Port x lock bit y (y= 0..15) - @ReadWrite(bits: 7..<8) - public var lck7: LCK7 - - /// Port x lock bit y (y= 0..15) - @ReadWrite(bits: 6..<7) - public var lck6: LCK6 - - /// Port x lock bit y (y= 0..15) - @ReadWrite(bits: 5..<6) - public var lck5: LCK5 - - /// Port x lock bit y (y= 0..15) - @ReadWrite(bits: 4..<5) - public var lck4: LCK4 - - /// Port x lock bit y (y= 0..15) - @ReadWrite(bits: 3..<4) - public var lck3: LCK3 - - /// Port x lock bit y (y= 0..15) - @ReadWrite(bits: 2..<3) - public var lck2: LCK2 - - /// Port x lock bit y (y= 0..15) - @ReadWrite(bits: 1..<2) - public var lck1: LCK1 - - /// Port x lock bit y (y= 0..15) - @ReadWrite(bits: 0..<1, as: LCK0Values.self) - public var lck0: LCK0 - } - - /// GPIO alternate function low register - @Register(bitWidth: 32) - public struct AFRL { - /// Alternate function selection for port x bit y (y = 0..7) - @ReadWrite(bits: 28..<32) - public var afrl7: AFRL7 - - /// Alternate function selection for port x bit y (y = 0..7) - @ReadWrite(bits: 24..<28) - public var afrl6: AFRL6 - - /// Alternate function selection for port x bit y (y = 0..7) - @ReadWrite(bits: 20..<24) - public var afrl5: AFRL5 - - /// Alternate function selection for port x bit y (y = 0..7) - @ReadWrite(bits: 16..<20) - public var afrl4: AFRL4 - - /// Alternate function selection for port x bit y (y = 0..7) - @ReadWrite(bits: 12..<16) - public var afrl3: AFRL3 - - /// Alternate function selection for port x bit y (y = 0..7) - @ReadWrite(bits: 8..<12) - public var afrl2: AFRL2 - - /// Alternate function selection for port x bit y (y = 0..7) - @ReadWrite(bits: 4..<8) - public var afrl1: AFRL1 - - /// Alternate function selection for port x bit y (y = 0..7) - @ReadWrite(bits: 0..<4, as: AFRL0Values.self) - public var afrl0: AFRL0 - } - - /// GPIO alternate function high register - @Register(bitWidth: 32) - public struct AFRH { - /// Alternate function selection for port x bit y (y = 8..15) - @ReadWrite(bits: 28..<32) - public var afrh15: AFRH15 - - /// Alternate function selection for port x bit y (y = 8..15) - @ReadWrite(bits: 24..<28) - public var afrh14: AFRH14 - - /// Alternate function selection for port x bit y (y = 8..15) - @ReadWrite(bits: 20..<24) - public var afrh13: AFRH13 - - /// Alternate function selection for port x bit y (y = 8..15) - @ReadWrite(bits: 16..<20) - public var afrh12: AFRH12 - - /// Alternate function selection for port x bit y (y = 8..15) - @ReadWrite(bits: 12..<16) - public var afrh11: AFRH11 - - /// Alternate function selection for port x bit y (y = 8..15) - @ReadWrite(bits: 8..<12) - public var afrh10: AFRH10 - - /// Alternate function selection for port x bit y (y = 8..15) - @ReadWrite(bits: 4..<8) - public var afrh9: AFRH9 - - /// Alternate function selection for port x bit y (y = 8..15) - @ReadWrite(bits: 0..<4, as: AFRH8Values.self) - public var afrh8: AFRH8 - } - - /// GPIO port bit reset register - @Register(bitWidth: 32) - public struct BRR { - /// Port A Reset bit 0 - @ReadWrite(bits: 0..<1) - public var br0: BR0 - - /// Port A Reset bit 1 - @ReadWrite(bits: 1..<2) - public var br1: BR1 - - /// Port A Reset bit 2 - @ReadWrite(bits: 2..<3) - public var br2: BR2 - - /// Port A Reset bit 3 - @ReadWrite(bits: 3..<4) - public var br3: BR3 - - /// Port A Reset bit 4 - @ReadWrite(bits: 4..<5) - public var br4: BR4 - - /// Port A Reset bit 5 - @ReadWrite(bits: 5..<6) - public var br5: BR5 - - /// Port A Reset bit 6 - @ReadWrite(bits: 6..<7) - public var br6: BR6 - - /// Port A Reset bit 7 - @ReadWrite(bits: 7..<8) - public var br7: BR7 - - /// Port A Reset bit 8 - @ReadWrite(bits: 8..<9) - public var br8: BR8 - - /// Port A Reset bit 9 - @ReadWrite(bits: 9..<10) - public var br9: BR9 - - /// Port A Reset bit 10 - @ReadWrite(bits: 10..<11) - public var br10: BR10 - - /// Port A Reset bit 11 - @ReadWrite(bits: 11..<12) - public var br11: BR11 - - /// Port A Reset bit 12 - @ReadWrite(bits: 12..<13) - public var br12: BR12 - - /// Port A Reset bit 13 - @ReadWrite(bits: 13..<14) - public var br13: BR13 - - /// Port A Reset bit 14 - @ReadWrite(bits: 14..<15) - public var br14: BR14 - - /// Port A Reset bit 15 - @ReadWrite(bits: 15..<16) - public var br15: BR15 - } -} - -extension GPIOA.MODER { - public struct MODER0Values: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// Input mode (reset state) - public static let Input = Self(rawValue: 0x0) - - /// General purpose output mode - public static let Output = Self(rawValue: 0x1) - - /// Alternate function mode - public static let Alternate = Self(rawValue: 0x2) - - /// Analog mode - public static let Analog = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension GPIOA.OTYPER { - public struct OT0Values: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Output push-pull (reset state) - public static let PushPull = Self(rawValue: 0x0) - - /// Output open-drain - public static let OpenDrain = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension GPIOA.OSPEEDR { - public struct OSPEEDR0Values: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// Low speed - public static let LowSpeed = Self(rawValue: 0x0) - - /// Medium speed - public static let MediumSpeed = Self(rawValue: 0x1) - - /// High speed - public static let HighSpeed = Self(rawValue: 0x2) - - /// Very high speed - public static let VeryHighSpeed = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension GPIOA.PUPDR { - public struct PUPDR0Values: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// No pull-up, pull-down - public static let Floating = Self(rawValue: 0x0) - - /// Pull-up - public static let PullUp = Self(rawValue: 0x1) - - /// Pull-down - public static let PullDown = Self(rawValue: 0x2) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension GPIOA.ODR { - public struct ODR0Values: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Set output to logic low - public static let Low = Self(rawValue: 0x0) - - /// Set output to logic high - public static let High = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension GPIOA.LCKR { - public struct LCKKValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Port configuration lock key not active - public static let NotActive = Self(rawValue: 0x0) - - /// Port configuration lock key active - public static let Active = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension GPIOA.LCKR { - public struct LCK0Values: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Port configuration not locked - public static let Unlocked = Self(rawValue: 0x0) - - /// Port configuration locked - public static let Locked = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension GPIOA.AFRL { - public struct AFRL0Values: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 4 - - /// AF0 - public static let AF0 = Self(rawValue: 0x0) - - /// AF1 - public static let AF1 = Self(rawValue: 0x1) - - /// AF2 - public static let AF2 = Self(rawValue: 0x2) - - /// AF3 - public static let AF3 = Self(rawValue: 0x3) - - /// AF4 - public static let AF4 = Self(rawValue: 0x4) - - /// AF5 - public static let AF5 = Self(rawValue: 0x5) - - /// AF6 - public static let AF6 = Self(rawValue: 0x6) - - /// AF7 - public static let AF7 = Self(rawValue: 0x7) - - /// AF8 - public static let AF8 = Self(rawValue: 0x8) - - /// AF9 - public static let AF9 = Self(rawValue: 0x9) - - /// AF10 - public static let AF10 = Self(rawValue: 0xa) - - /// AF11 - public static let AF11 = Self(rawValue: 0xb) - - /// AF12 - public static let AF12 = Self(rawValue: 0xc) - - /// AF13 - public static let AF13 = Self(rawValue: 0xd) - - /// AF14 - public static let AF14 = Self(rawValue: 0xe) - - /// AF15 - public static let AF15 = Self(rawValue: 0xf) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension GPIOA.AFRH { - public struct AFRH8Values: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 4 - - /// AF0 - public static let AF0 = Self(rawValue: 0x0) - - /// AF1 - public static let AF1 = Self(rawValue: 0x1) - - /// AF2 - public static let AF2 = Self(rawValue: 0x2) - - /// AF3 - public static let AF3 = Self(rawValue: 0x3) - - /// AF4 - public static let AF4 = Self(rawValue: 0x4) - - /// AF5 - public static let AF5 = Self(rawValue: 0x5) - - /// AF6 - public static let AF6 = Self(rawValue: 0x6) - - /// AF7 - public static let AF7 = Self(rawValue: 0x7) - - /// AF8 - public static let AF8 = Self(rawValue: 0x8) - - /// AF9 - public static let AF9 = Self(rawValue: 0x9) - - /// AF10 - public static let AF10 = Self(rawValue: 0xa) - - /// AF11 - public static let AF11 = Self(rawValue: 0xb) - - /// AF12 - public static let AF12 = Self(rawValue: 0xc) - - /// AF13 - public static let AF13 = Self(rawValue: 0xd) - - /// AF14 - public static let AF14 = Self(rawValue: 0xe) - - /// AF15 - public static let AF15 = Self(rawValue: 0xf) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} diff --git a/stm32-lvgl/Sources/Registers/GPIOB.swift b/stm32-lvgl/Sources/Registers/GPIOB.swift deleted file mode 100644 index bd0a35ba..00000000 --- a/stm32-lvgl/Sources/Registers/GPIOB.swift +++ /dev/null @@ -1,7 +0,0 @@ -// Generated by svd2swift. - -import MMIO - -/// General-purpose I/Os -public typealias GPIOB = GPIOA - diff --git a/stm32-lvgl/Sources/Registers/GPIOC.swift b/stm32-lvgl/Sources/Registers/GPIOC.swift deleted file mode 100644 index c46e6690..00000000 --- a/stm32-lvgl/Sources/Registers/GPIOC.swift +++ /dev/null @@ -1,7 +0,0 @@ -// Generated by svd2swift. - -import MMIO - -/// General-purpose I/Os -public typealias GPIOC = GPIOA - diff --git a/stm32-lvgl/Sources/Registers/GPIOD.swift b/stm32-lvgl/Sources/Registers/GPIOD.swift deleted file mode 100644 index d51ac802..00000000 --- a/stm32-lvgl/Sources/Registers/GPIOD.swift +++ /dev/null @@ -1,7 +0,0 @@ -// Generated by svd2swift. - -import MMIO - -/// General-purpose I/Os -public typealias GPIOD = GPIOA - diff --git a/stm32-lvgl/Sources/Registers/GPIOE.swift b/stm32-lvgl/Sources/Registers/GPIOE.swift deleted file mode 100644 index c78fa87f..00000000 --- a/stm32-lvgl/Sources/Registers/GPIOE.swift +++ /dev/null @@ -1,7 +0,0 @@ -// Generated by svd2swift. - -import MMIO - -/// General-purpose I/Os -public typealias GPIOE = GPIOA - diff --git a/stm32-lvgl/Sources/Registers/GPIOF.swift b/stm32-lvgl/Sources/Registers/GPIOF.swift deleted file mode 100644 index f4dce7fb..00000000 --- a/stm32-lvgl/Sources/Registers/GPIOF.swift +++ /dev/null @@ -1,7 +0,0 @@ -// Generated by svd2swift. - -import MMIO - -/// General-purpose I/Os -public typealias GPIOF = GPIOA - diff --git a/stm32-lvgl/Sources/Registers/GPIOG.swift b/stm32-lvgl/Sources/Registers/GPIOG.swift deleted file mode 100644 index 88fb4c6a..00000000 --- a/stm32-lvgl/Sources/Registers/GPIOG.swift +++ /dev/null @@ -1,7 +0,0 @@ -// Generated by svd2swift. - -import MMIO - -/// General-purpose I/Os -public typealias GPIOG = GPIOA - diff --git a/stm32-lvgl/Sources/Registers/GPIOH.swift b/stm32-lvgl/Sources/Registers/GPIOH.swift deleted file mode 100644 index 5a558ef3..00000000 --- a/stm32-lvgl/Sources/Registers/GPIOH.swift +++ /dev/null @@ -1,7 +0,0 @@ -// Generated by svd2swift. - -import MMIO - -/// General-purpose I/Os -public typealias GPIOH = GPIOA - diff --git a/stm32-lvgl/Sources/Registers/GPIOI.swift b/stm32-lvgl/Sources/Registers/GPIOI.swift deleted file mode 100644 index 6b2b5182..00000000 --- a/stm32-lvgl/Sources/Registers/GPIOI.swift +++ /dev/null @@ -1,7 +0,0 @@ -// Generated by svd2swift. - -import MMIO - -/// General-purpose I/Os -public typealias GPIOI = GPIOA - diff --git a/stm32-lvgl/Sources/Registers/GPIOJ.swift b/stm32-lvgl/Sources/Registers/GPIOJ.swift deleted file mode 100644 index 98b3c09a..00000000 --- a/stm32-lvgl/Sources/Registers/GPIOJ.swift +++ /dev/null @@ -1,7 +0,0 @@ -// Generated by svd2swift. - -import MMIO - -/// General-purpose I/Os -public typealias GPIOJ = GPIOA - diff --git a/stm32-lvgl/Sources/Registers/GPIOK.swift b/stm32-lvgl/Sources/Registers/GPIOK.swift deleted file mode 100644 index c1f074b8..00000000 --- a/stm32-lvgl/Sources/Registers/GPIOK.swift +++ /dev/null @@ -1,7 +0,0 @@ -// Generated by svd2swift. - -import MMIO - -/// General-purpose I/Os -public typealias GPIOK = GPIOA - diff --git a/stm32-lvgl/Sources/Registers/I2C1.swift b/stm32-lvgl/Sources/Registers/I2C1.swift deleted file mode 100644 index c68ff9e9..00000000 --- a/stm32-lvgl/Sources/Registers/I2C1.swift +++ /dev/null @@ -1,1069 +0,0 @@ -// Generated by svd2swift. - -import MMIO - -/// Inter-integrated circuit -@RegisterBlock -public struct I2C1 { - /// Control register 1 - @RegisterBlock(offset: 0x0) - public var cr1: Register - - /// Control register 2 - @RegisterBlock(offset: 0x4) - public var cr2: Register - - /// Own address register 1 - @RegisterBlock(offset: 0x8) - public var oar1: Register - - /// Own address register 2 - @RegisterBlock(offset: 0xc) - public var oar2: Register - - /// Timing register - @RegisterBlock(offset: 0x10) - public var timingr: Register - - /// Status register 1 - @RegisterBlock(offset: 0x14) - public var timeoutr: Register - - /// Interrupt and Status register - @RegisterBlock(offset: 0x18) - public var isr: Register - - /// Interrupt clear register - @RegisterBlock(offset: 0x1c) - public var icr: Register - - /// PEC register - @RegisterBlock(offset: 0x20) - public var pecr: Register - - /// Receive data register - @RegisterBlock(offset: 0x24) - public var rxdr: Register - - /// Transmit data register - @RegisterBlock(offset: 0x28) - public var txdr: Register -} - -extension I2C1 { - /// Control register 1 - @Register(bitWidth: 32) - public struct CR1 { - /// Peripheral enable - @ReadWrite(bits: 0..<1, as: PEValues.self) - public var pe: PE - - /// TX Interrupt enable - @ReadWrite(bits: 1..<2, as: TXIEValues.self) - public var txie: TXIE - - /// RX Interrupt enable - @ReadWrite(bits: 2..<3, as: RXIEValues.self) - public var rxie: RXIE - - /// Address match interrupt enable (slave only) - @ReadWrite(bits: 3..<4, as: ADDRIEValues.self) - public var addrie: ADDRIE - - /// Not acknowledge received interrupt enable - @ReadWrite(bits: 4..<5, as: NACKIEValues.self) - public var nackie: NACKIE - - /// STOP detection Interrupt enable - @ReadWrite(bits: 5..<6, as: STOPIEValues.self) - public var stopie: STOPIE - - /// Transfer Complete interrupt enable - @ReadWrite(bits: 6..<7, as: TCIEValues.self) - public var tcie: TCIE - - /// Error interrupts enable - @ReadWrite(bits: 7..<8, as: ERRIEValues.self) - public var errie: ERRIE - - /// Digital noise filter - @ReadWrite(bits: 8..<12, as: DNFValues.self) - public var dnf: DNF - - /// Analog noise filter OFF - @ReadWrite(bits: 12..<13, as: ANFOFFValues.self) - public var anfoff: ANFOFF - - /// DMA transmission requests enable - @ReadWrite(bits: 14..<15, as: TXDMAENValues.self) - public var txdmaen: TXDMAEN - - /// DMA reception requests enable - @ReadWrite(bits: 15..<16, as: RXDMAENValues.self) - public var rxdmaen: RXDMAEN - - /// Slave byte control - @ReadWrite(bits: 16..<17, as: SBCValues.self) - public var sbc: SBC - - /// Clock stretching disable - @ReadWrite(bits: 17..<18, as: NOSTRETCHValues.self) - public var nostretch: NOSTRETCH - - /// Wakeup from STOP enable - @ReadWrite(bits: 18..<19, as: WUPENValues.self) - public var wupen: WUPEN - - /// General call enable - @ReadWrite(bits: 19..<20, as: GCENValues.self) - public var gcen: GCEN - - /// SMBus Host address enable - @ReadWrite(bits: 20..<21, as: SMBHENValues.self) - public var smbhen: SMBHEN - - /// SMBus Device Default address enable - @ReadWrite(bits: 21..<22, as: SMBDENValues.self) - public var smbden: SMBDEN - - /// SMBUS alert enable - @ReadWrite(bits: 22..<23, as: ALERTENValues.self) - public var alerten: ALERTEN - - /// PEC enable - @ReadWrite(bits: 23..<24, as: PECENValues.self) - public var pecen: PECEN - } - - /// Control register 2 - @Register(bitWidth: 32) - public struct CR2 { - /// Packet error checking byte - @ReadWrite(bits: 26..<27) - public var pecbyte: PECBYTE - - /// Automatic end mode (master mode) - @ReadWrite(bits: 25..<26, as: AUTOENDValues.self) - public var autoend: AUTOEND - - /// NBYTES reload mode - @ReadWrite(bits: 24..<25, as: RELOADValues.self) - public var reload: RELOAD - - /// Number of bytes - @ReadWrite(bits: 16..<24) - public var nbytes: NBYTES - - /// NACK generation (slave mode) - @ReadWrite(bits: 15..<16) - public var nack: NACK - - /// Stop generation (master mode) - @ReadWrite(bits: 14..<15) - public var stop: STOP - - /// Start generation - @ReadWrite(bits: 13..<14) - public var start: START - - /// 10-bit address header only read direction (master receiver mode) - @ReadWrite(bits: 12..<13, as: HEAD10RValues.self) - public var head10r: HEAD10R - - /// 10-bit addressing mode (master mode) - @ReadWrite(bits: 11..<12, as: ADD10Values.self) - public var add10: ADD10 - - /// Transfer direction (master mode) - @ReadWrite(bits: 10..<11, as: RD_WRNValues.self) - public var rd_wrn: RD_WRN - - /// Slave address bit (master mode) - @ReadWrite(bits: 0..<10) - public var sadd: SADD - } - - /// Own address register 1 - @Register(bitWidth: 32) - public struct OAR1 { - /// Interface address - @ReadWrite(bits: 0..<10) - public var oa1: OA1 - - /// Own Address 1 10-bit mode - @ReadWrite(bits: 10..<11, as: OA1MODEValues.self) - public var oa1mode: OA1MODE - - /// Own Address 1 enable - @ReadWrite(bits: 15..<16, as: OA1ENValues.self) - public var oa1en: OA1EN - } - - /// Own address register 2 - @Register(bitWidth: 32) - public struct OAR2 { - /// Interface address - @ReadWrite(bits: 1..<8) - public var oa2: OA2 - - /// Own Address 2 masks - @ReadWrite(bits: 8..<11, as: OA2MSKValues.self) - public var oa2msk: OA2MSK - - /// Own Address 2 enable - @ReadWrite(bits: 15..<16, as: OA2ENValues.self) - public var oa2en: OA2EN - } - - /// Timing register - @Register(bitWidth: 32) - public struct TIMINGR { - /// SCL low period (master mode) - @ReadWrite(bits: 0..<8) - public var scll: SCLL - - /// SCL high period (master mode) - @ReadWrite(bits: 8..<16) - public var sclh: SCLH - - /// Data hold time - @ReadWrite(bits: 16..<20) - public var sdadel: SDADEL - - /// Data setup time - @ReadWrite(bits: 20..<24) - public var scldel: SCLDEL - - /// Timing prescaler - @ReadWrite(bits: 28..<32) - public var presc: PRESC - } - - /// Status register 1 - @Register(bitWidth: 32) - public struct TIMEOUTR { - /// Bus timeout A - @ReadWrite(bits: 0..<12) - public var timeouta: TIMEOUTA - - /// Idle clock timeout detection - @ReadWrite(bits: 12..<13, as: TIDLEValues.self) - public var tidle: TIDLE - - /// Clock timeout enable - @ReadWrite(bits: 15..<16, as: TIMOUTENValues.self) - public var timouten: TIMOUTEN - - /// Bus timeout B - @ReadWrite(bits: 16..<28) - public var timeoutb: TIMEOUTB - - /// Extended clock timeout enable - @ReadWrite(bits: 31..<32, as: TEXTENValues.self) - public var texten: TEXTEN - } - - /// Interrupt and Status register - @Register(bitWidth: 32) - public struct ISR { - /// Address match code (Slave mode) - @ReadOnly(bits: 17..<24) - public var addcode: ADDCODE - - /// Transfer direction (Slave mode) - @ReadOnly(bits: 16..<17) - public var dir: DIR - - /// Bus busy - @ReadOnly(bits: 15..<16) - public var busy: BUSY - - /// SMBus alert - @ReadOnly(bits: 13..<14) - public var alert: ALERT - - /// Timeout or t_low detection flag - @ReadOnly(bits: 12..<13) - public var timeout: TIMEOUT - - /// PEC Error in reception - @ReadOnly(bits: 11..<12) - public var pecerr: PECERR - - /// Overrun/Underrun (slave mode) - @ReadOnly(bits: 10..<11) - public var ovr: OVR - - /// Arbitration lost - @ReadOnly(bits: 9..<10) - public var arlo: ARLO - - /// Bus error - @ReadOnly(bits: 8..<9) - public var berr: BERR - - /// Transfer Complete Reload - @ReadOnly(bits: 7..<8) - public var tcr: TCR - - /// Transfer Complete (master mode) - @ReadOnly(bits: 6..<7) - public var tc: TC - - /// Stop detection flag - @ReadOnly(bits: 5..<6) - public var stopf: STOPF - - /// Not acknowledge received flag - @ReadOnly(bits: 4..<5) - public var nackf: NACKF - - /// Address matched (slave mode) - @ReadOnly(bits: 3..<4) - public var addr: ADDR - - /// Receive data register not empty (receivers) - @ReadOnly(bits: 2..<3) - public var rxne: RXNE - - /// Transmit interrupt status (transmitters) - @ReadWrite(bits: 1..<2) - public var txis: TXIS - - /// Transmit data register empty (transmitters) - @ReadWrite(bits: 0..<1) - public var txe: TXE - } - - /// Interrupt clear register - @Register(bitWidth: 32) - public struct ICR { - /// Alert flag clear - @WriteOnly(bits: 13..<14) - public var alertcf: ALERTCF - - /// Timeout detection flag clear - @WriteOnly(bits: 12..<13) - public var timoutcf: TIMOUTCF - - /// PEC Error flag clear - @WriteOnly(bits: 11..<12) - public var peccf: PECCF - - /// Overrun/Underrun flag clear - @WriteOnly(bits: 10..<11) - public var ovrcf: OVRCF - - /// Arbitration lost flag clear - @WriteOnly(bits: 9..<10) - public var arlocf: ARLOCF - - /// Bus error flag clear - @WriteOnly(bits: 8..<9) - public var berrcf: BERRCF - - /// Stop detection flag clear - @WriteOnly(bits: 5..<6) - public var stopcf: STOPCF - - /// Not Acknowledge flag clear - @WriteOnly(bits: 4..<5) - public var nackcf: NACKCF - - /// Address Matched flag clear - @WriteOnly(bits: 3..<4) - public var addrcf: ADDRCF - } - - /// PEC register - @Register(bitWidth: 32) - public struct PECR { - /// Packet error checking register - @ReadOnly(bits: 0..<8) - public var pec: PEC - } - - /// Receive data register - @Register(bitWidth: 32) - public struct RXDR { - /// 8-bit receive data - @ReadOnly(bits: 0..<8) - public var rxdata: RXDATA - } - - /// Transmit data register - @Register(bitWidth: 32) - public struct TXDR { - /// 8-bit transmit data - @ReadWrite(bits: 0..<8) - public var txdata: TXDATA - } -} - -extension I2C1.CR1 { - public struct PEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Peripheral disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Peripheral enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension I2C1.CR1 { - public struct TXIEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Transmit (TXIS) interrupt disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Transmit (TXIS) interrupt enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension I2C1.CR1 { - public struct RXIEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Receive (RXNE) interrupt disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Receive (RXNE) interrupt enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension I2C1.CR1 { - public struct ADDRIEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Address match (ADDR) interrupts disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Address match (ADDR) interrupts enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension I2C1.CR1 { - public struct NACKIEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Not acknowledge (NACKF) received interrupts disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Not acknowledge (NACKF) received interrupts enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension I2C1.CR1 { - public struct STOPIEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Stop detection (STOPF) interrupt disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Stop detection (STOPF) interrupt enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension I2C1.CR1 { - public struct TCIEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Transfer Complete interrupt disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Transfer Complete interrupt enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension I2C1.CR1 { - public struct ERRIEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Error detection interrupts disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Error detection interrupts enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension I2C1.CR1 { - public struct DNFValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 4 - - /// Digital filter disabled - public static let NoFilter = Self(rawValue: 0x0) - - /// Digital filter enabled and filtering capability up to 1 tI2CCLK - public static let Filter1 = Self(rawValue: 0x1) - - /// Digital filter enabled and filtering capability up to 2 tI2CCLK - public static let Filter2 = Self(rawValue: 0x2) - - /// Digital filter enabled and filtering capability up to 3 tI2CCLK - public static let Filter3 = Self(rawValue: 0x3) - - /// Digital filter enabled and filtering capability up to 4 tI2CCLK - public static let Filter4 = Self(rawValue: 0x4) - - /// Digital filter enabled and filtering capability up to 5 tI2CCLK - public static let Filter5 = Self(rawValue: 0x5) - - /// Digital filter enabled and filtering capability up to 6 tI2CCLK - public static let Filter6 = Self(rawValue: 0x6) - - /// Digital filter enabled and filtering capability up to 7 tI2CCLK - public static let Filter7 = Self(rawValue: 0x7) - - /// Digital filter enabled and filtering capability up to 8 tI2CCLK - public static let Filter8 = Self(rawValue: 0x8) - - /// Digital filter enabled and filtering capability up to 9 tI2CCLK - public static let Filter9 = Self(rawValue: 0x9) - - /// Digital filter enabled and filtering capability up to 10 tI2CCLK - public static let Filter10 = Self(rawValue: 0xa) - - /// Digital filter enabled and filtering capability up to 11 tI2CCLK - public static let Filter11 = Self(rawValue: 0xb) - - /// Digital filter enabled and filtering capability up to 12 tI2CCLK - public static let Filter12 = Self(rawValue: 0xc) - - /// Digital filter enabled and filtering capability up to 13 tI2CCLK - public static let Filter13 = Self(rawValue: 0xd) - - /// Digital filter enabled and filtering capability up to 14 tI2CCLK - public static let Filter14 = Self(rawValue: 0xe) - - /// Digital filter enabled and filtering capability up to 15 tI2CCLK - public static let Filter15 = Self(rawValue: 0xf) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension I2C1.CR1 { - public struct ANFOFFValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Analog noise filter enabled - public static let Enabled = Self(rawValue: 0x0) - - /// Analog noise filter disabled - public static let Disabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension I2C1.CR1 { - public struct TXDMAENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// DMA mode disabled for transmission - public static let Disabled = Self(rawValue: 0x0) - - /// DMA mode enabled for transmission - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension I2C1.CR1 { - public struct RXDMAENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// DMA mode disabled for reception - public static let Disabled = Self(rawValue: 0x0) - - /// DMA mode enabled for reception - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension I2C1.CR1 { - public struct SBCValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Slave byte control disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Slave byte control enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension I2C1.CR1 { - public struct NOSTRETCHValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Clock stretching enabled - public static let Enabled = Self(rawValue: 0x0) - - /// Clock stretching disabled - public static let Disabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension I2C1.CR1 { - public struct WUPENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Wakeup from Stop mode disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Wakeup from Stop mode enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension I2C1.CR1 { - public struct GCENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// General call disabled. Address 0b00000000 is NACKed - public static let Disabled = Self(rawValue: 0x0) - - /// General call enabled. Address 0b00000000 is ACKed - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension I2C1.CR1 { - public struct SMBHENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Host address disabled. Address 0b0001000x is NACKed - public static let Disabled = Self(rawValue: 0x0) - - /// Host address enabled. Address 0b0001000x is ACKed - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension I2C1.CR1 { - public struct SMBDENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Device default address disabled. Address 0b1100001x is NACKed - public static let Disabled = Self(rawValue: 0x0) - - /// Device default address enabled. Address 0b1100001x is ACKed - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension I2C1.CR1 { - public struct ALERTENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// In device mode (SMBHEN=Disabled) Releases SMBA pin high and Alert Response Address Header disabled (0001100x) followed by NACK. In host mode (SMBHEN=Enabled) SMBus Alert pin (SMBA) not supported - public static let Disabled = Self(rawValue: 0x0) - - /// In device mode (SMBHEN=Disabled) Drives SMBA pin low and Alert Response Address Header enabled (0001100x) followed by ACK.In host mode (SMBHEN=Enabled) SMBus Alert pin (SMBA) supported - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension I2C1.CR1 { - public struct PECENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// PEC calculation disabled - public static let Disabled = Self(rawValue: 0x0) - - /// PEC calculation enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension I2C1.CR2 { - public struct AUTOENDValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Software end mode: TC flag is set when NBYTES data are transferred, stretching SCL low - public static let Software = Self(rawValue: 0x0) - - /// Automatic end mode: a STOP condition is automatically sent when NBYTES data are transferred - public static let Automatic = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension I2C1.CR2 { - public struct RELOADValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// The transfer is completed after the NBYTES data transfer (STOP or RESTART will follow) - public static let Completed = Self(rawValue: 0x0) - - /// The transfer is not completed after the NBYTES data transfer (NBYTES will be reloaded) - public static let NotCompleted = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension I2C1.CR2 { - public struct HEAD10RValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// The master sends the complete 10 bit slave address read sequence - public static let Complete = Self(rawValue: 0x0) - - /// The master only sends the 1st 7 bits of the 10 bit address, followed by Read direction - public static let Partial = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension I2C1.CR2 { - public struct ADD10Values: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// The master operates in 7-bit addressing mode - public static let Bit7 = Self(rawValue: 0x0) - - /// The master operates in 10-bit addressing mode - public static let Bit10 = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension I2C1.CR2 { - public struct RD_WRNValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Master requests a write transfer - public static let Write = Self(rawValue: 0x0) - - /// Master requests a read transfer - public static let Read = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension I2C1.OAR1 { - public struct OA1MODEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Own address 1 is a 7-bit address - public static let Bit7 = Self(rawValue: 0x0) - - /// Own address 1 is a 10-bit address - public static let Bit10 = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension I2C1.OAR1 { - public struct OA1ENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Own address 1 disabled. The received slave address OA1 is NACKed - public static let Disabled = Self(rawValue: 0x0) - - /// Own address 1 enabled. The received slave address OA1 is ACKed - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension I2C1.OAR2 { - public struct OA2MSKValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 3 - - /// No mask - public static let NoMask = Self(rawValue: 0x0) - - /// OA2[1] is masked and don’t care. Only OA2[7:2] are compared - public static let Mask1 = Self(rawValue: 0x1) - - /// OA2[2:1] are masked and don’t care. Only OA2[7:3] are compared - public static let Mask2 = Self(rawValue: 0x2) - - /// OA2[3:1] are masked and don’t care. Only OA2[7:4] are compared - public static let Mask3 = Self(rawValue: 0x3) - - /// OA2[4:1] are masked and don’t care. Only OA2[7:5] are compared - public static let Mask4 = Self(rawValue: 0x4) - - /// OA2[5:1] are masked and don’t care. Only OA2[7:6] are compared - public static let Mask5 = Self(rawValue: 0x5) - - /// OA2[6:1] are masked and don’t care. Only OA2[7] is compared. - public static let Mask6 = Self(rawValue: 0x6) - - /// OA2[7:1] are masked and don’t care. No comparison is done, and all (except reserved) 7-bit received addresses are acknowledged - public static let Mask7 = Self(rawValue: 0x7) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension I2C1.OAR2 { - public struct OA2ENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Own address 2 disabled. The received slave address OA2 is NACKed - public static let Disabled = Self(rawValue: 0x0) - - /// Own address 2 enabled. The received slave address OA2 is ACKed - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension I2C1.TIMEOUTR { - public struct TIDLEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// TIMEOUTA is used to detect SCL low timeout - public static let Disabled = Self(rawValue: 0x0) - - /// TIMEOUTA is used to detect both SCL and SDA high timeout (bus idle condition) - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension I2C1.TIMEOUTR { - public struct TIMOUTENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// SCL timeout detection is disabled - public static let Disabled = Self(rawValue: 0x0) - - /// SCL timeout detection is enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension I2C1.TIMEOUTR { - public struct TEXTENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Extended clock timeout detection is disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Extended clock timeout detection is enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} diff --git a/stm32-lvgl/Sources/Registers/I2C2.swift b/stm32-lvgl/Sources/Registers/I2C2.swift deleted file mode 100644 index a10d2091..00000000 --- a/stm32-lvgl/Sources/Registers/I2C2.swift +++ /dev/null @@ -1,7 +0,0 @@ -// Generated by svd2swift. - -import MMIO - -/// Inter-integrated circuit -public typealias I2C2 = I2C1 - diff --git a/stm32-lvgl/Sources/Registers/I2C3.swift b/stm32-lvgl/Sources/Registers/I2C3.swift deleted file mode 100644 index e05597b2..00000000 --- a/stm32-lvgl/Sources/Registers/I2C3.swift +++ /dev/null @@ -1,7 +0,0 @@ -// Generated by svd2swift. - -import MMIO - -/// Inter-integrated circuit -public typealias I2C3 = I2C1 - diff --git a/stm32-lvgl/Sources/Registers/I2C4.swift b/stm32-lvgl/Sources/Registers/I2C4.swift deleted file mode 100644 index bbfbd90b..00000000 --- a/stm32-lvgl/Sources/Registers/I2C4.swift +++ /dev/null @@ -1,7 +0,0 @@ -// Generated by svd2swift. - -import MMIO - -/// Inter-integrated circuit -public typealias I2C4 = I2C1 - diff --git a/stm32-lvgl/Sources/Registers/LTDC.swift b/stm32-lvgl/Sources/Registers/LTDC.swift deleted file mode 100644 index d5d46141..00000000 --- a/stm32-lvgl/Sources/Registers/LTDC.swift +++ /dev/null @@ -1,847 +0,0 @@ -// Generated by svd2swift. - -import MMIO - -/// LCD-TFT Controller -@RegisterBlock -public struct LTDC { - /// Synchronization Size Configuration Register - @RegisterBlock(offset: 0x8) - public var sscr: Register - - /// Back Porch Configuration Register - @RegisterBlock(offset: 0xc) - public var bpcr: Register - - /// Active Width Configuration Register - @RegisterBlock(offset: 0x10) - public var awcr: Register - - /// Total Width Configuration Register - @RegisterBlock(offset: 0x14) - public var twcr: Register - - /// Global Control Register - @RegisterBlock(offset: 0x18) - public var gcr: Register - - /// Shadow Reload Configuration Register - @RegisterBlock(offset: 0x24) - public var srcr: Register - - /// Background Color Configuration Register - @RegisterBlock(offset: 0x2c) - public var bccr: Register - - /// Interrupt Enable Register - @RegisterBlock(offset: 0x34) - public var ier: Register - - /// Interrupt Status Register - @RegisterBlock(offset: 0x38) - public var isr: Register - - /// Interrupt Clear Register - @RegisterBlock(offset: 0x3c) - public var icr: Register - - /// Line Interrupt Position Configuration Register - @RegisterBlock(offset: 0x40) - public var lipcr: Register - - /// Current Position Status Register - @RegisterBlock(offset: 0x44) - public var cpsr: Register - - /// Current Display Status Register - @RegisterBlock(offset: 0x48) - public var cdsr: Register - - /// Cluster LAYER%s, containing L?CR, L?WHPCR, L?WVPCR, L?CKCR, L?PFCR, L?CACR, L?DCCR, L?BFCR, L?CFBAR, L?CFBLR, L?CFBLNR, L?CLUTWR - @RegisterBlock(offset: 0x84, stride: 0x80, count: 2) - public var layer: RegisterArray -} - -extension LTDC { - /// Synchronization Size Configuration Register - @Register(bitWidth: 32) - public struct SSCR { - /// Horizontal Synchronization Width (in units of pixel clock period) - @ReadWrite(bits: 16..<28) - public var hsw: HSW - - /// Vertical Synchronization Height (in units of horizontal scan line) - @ReadWrite(bits: 0..<11) - public var vsh: VSH - } - - /// Back Porch Configuration Register - @Register(bitWidth: 32) - public struct BPCR { - /// Accumulated Horizontal back porch (in units of pixel clock period) - @ReadWrite(bits: 16..<28) - public var ahbp: AHBP - - /// Accumulated Vertical back porch (in units of horizontal scan line) - @ReadWrite(bits: 0..<11) - public var avbp: AVBP - } - - /// Active Width Configuration Register - @Register(bitWidth: 32) - public struct AWCR { - /// Accumulated Active Width (in units of pixel clock period) - @ReadWrite(bits: 16..<28) - public var aaw: AAW - - /// Accumulated Active Height (in units of horizontal scan line) - @ReadWrite(bits: 0..<11) - public var aah: AAH - } - - /// Total Width Configuration Register - @Register(bitWidth: 32) - public struct TWCR { - /// Total Width (in units of pixel clock period) - @ReadWrite(bits: 16..<28) - public var totalw: TOTALW - - /// Total Height (in units of horizontal scan line) - @ReadWrite(bits: 0..<11) - public var totalh: TOTALH - } - - /// Global Control Register - @Register(bitWidth: 32) - public struct GCR { - /// Horizontal Synchronization Polarity - @ReadWrite(bits: 31..<32, as: HSPOLValues.self) - public var hspol: HSPOL - - /// Vertical Synchronization Polarity - @ReadWrite(bits: 30..<31, as: VSPOLValues.self) - public var vspol: VSPOL - - /// Data Enable Polarity - @ReadWrite(bits: 29..<30, as: DEPOLValues.self) - public var depol: DEPOL - - /// Pixel Clock Polarity - @ReadWrite(bits: 28..<29, as: PCPOLValues.self) - public var pcpol: PCPOL - - /// Dither Enable - @ReadWrite(bits: 16..<17, as: DENValues.self) - public var den: DEN - - /// Dither Red Width - @ReadOnly(bits: 12..<15) - public var drw: DRW - - /// Dither Green Width - @ReadOnly(bits: 8..<11) - public var dgw: DGW - - /// Dither Blue Width - @ReadOnly(bits: 4..<7) - public var dbw: DBW - - /// LCD-TFT controller enable bit - @ReadWrite(bits: 0..<1, as: LTDCENValues.self) - public var ltdcen: LTDCEN - } - - /// Shadow Reload Configuration Register - @Register(bitWidth: 32) - public struct SRCR { - /// Vertical Blanking Reload - @ReadWrite(bits: 1..<2, as: VBRValues.self) - public var vbr: VBR - - /// Immediate Reload - @ReadWrite(bits: 0..<1, as: IMRValues.self) - public var imr: IMR - } - - /// Background Color Configuration Register - @Register(bitWidth: 32) - public struct BCCR { - /// Background color blue value - @ReadWrite(bits: 0..<8) - public var bcblue: BCBLUE - - /// Background color green value - @ReadWrite(bits: 8..<16) - public var bcgreen: BCGREEN - - /// Background color red value - @ReadWrite(bits: 16..<24) - public var bcred: BCRED - } - - /// Interrupt Enable Register - @Register(bitWidth: 32) - public struct IER { - /// Register Reload interrupt enable - @ReadWrite(bits: 3..<4, as: RRIEValues.self) - public var rrie: RRIE - - /// Transfer Error Interrupt Enable - @ReadWrite(bits: 2..<3, as: TERRIEValues.self) - public var terrie: TERRIE - - /// FIFO Underrun Interrupt Enable - @ReadWrite(bits: 1..<2, as: FUIEValues.self) - public var fuie: FUIE - - /// Line Interrupt Enable - @ReadWrite(bits: 0..<1, as: LIEValues.self) - public var lie: LIE - } - - /// Interrupt Status Register - @Register(bitWidth: 32) - public struct ISR { - /// Register Reload Interrupt Flag - @ReadOnly(bits: 3..<4) - public var rrif: RRIF - - /// Transfer Error interrupt flag - @ReadOnly(bits: 2..<3) - public var terrif: TERRIF - - /// FIFO Underrun Interrupt flag - @ReadOnly(bits: 1..<2) - public var fuif: FUIF - - /// Line Interrupt flag - @ReadOnly(bits: 0..<1) - public var lif: LIF - } - - /// Interrupt Clear Register - @Register(bitWidth: 32) - public struct ICR { - /// Clears Register Reload Interrupt Flag - @WriteOnly(bits: 3..<4) - public var crrif: CRRIF - - /// Clears the Transfer Error Interrupt Flag - @WriteOnly(bits: 2..<3) - public var cterrif: CTERRIF - - /// Clears the FIFO Underrun Interrupt flag - @WriteOnly(bits: 1..<2) - public var cfuif: CFUIF - - /// Clears the Line Interrupt Flag - @WriteOnly(bits: 0..<1) - public var clif: CLIF - } - - /// Line Interrupt Position Configuration Register - @Register(bitWidth: 32) - public struct LIPCR { - /// Line Interrupt Position - @ReadWrite(bits: 0..<11) - public var lipos: LIPOS - } - - /// Current Position Status Register - @Register(bitWidth: 32) - public struct CPSR { - /// Current X Position - @ReadOnly(bits: 16..<32) - public var cxpos: CXPOS - - /// Current Y Position - @ReadOnly(bits: 0..<16) - public var cypos: CYPOS - } - - /// Current Display Status Register - @Register(bitWidth: 32) - public struct CDSR { - /// Horizontal Synchronization display Status - @ReadOnly(bits: 3..<4) - public var hsyncs: HSYNCS - - /// Vertical Synchronization display Status - @ReadOnly(bits: 2..<3) - public var vsyncs: VSYNCS - - /// Horizontal Data Enable display Status - @ReadOnly(bits: 1..<2) - public var hdes: HDES - - /// Vertical Data Enable display Status - @ReadOnly(bits: 0..<1) - public var vdes: VDES - } - - /// Cluster LAYER%s, containing L?CR, L?WHPCR, L?WVPCR, L?CKCR, L?PFCR, L?CACR, L?DCCR, L?BFCR, L?CFBAR, L?CFBLR, L?CFBLNR, L?CLUTWR - @RegisterBlock - public struct LAYER { - /// Layerx Control Register - @RegisterBlock(offset: 0x0) - public var cr: Register - - /// Layerx Window Horizontal Position Configuration Register - @RegisterBlock(offset: 0x4) - public var whpcr: Register - - /// Layerx Window Vertical Position Configuration Register - @RegisterBlock(offset: 0x8) - public var wvpcr: Register - - /// Layerx Color Keying Configuration Register - @RegisterBlock(offset: 0xc) - public var ckcr: Register - - /// Layerx Pixel Format Configuration Register - @RegisterBlock(offset: 0x10) - public var pfcr: Register - - /// Layerx Constant Alpha Configuration Register - @RegisterBlock(offset: 0x14) - public var cacr: Register - - /// Layerx Default Color Configuration Register - @RegisterBlock(offset: 0x18) - public var dccr: Register - - /// Layerx Blending Factors Configuration Register - @RegisterBlock(offset: 0x1c) - public var bfcr: Register - - /// Layerx Color Frame Buffer Address Register - @RegisterBlock(offset: 0x28) - public var cfbar: Register - - /// Layerx Color Frame Buffer Length Register - @RegisterBlock(offset: 0x2c) - public var cfblr: Register - - /// Layerx ColorFrame Buffer Line Number Register - @RegisterBlock(offset: 0x30) - public var cfblnr: Register - - /// Layerx CLUT Write Register - @RegisterBlock(offset: 0x40) - public var clutwr: Register - } -} - -extension LTDC.LAYER { - /// Layerx Control Register - @Register(bitWidth: 32) - public struct CR { - /// Color Look-Up Table Enable - @ReadWrite(bits: 4..<5, as: CLUTENValues.self) - public var cluten: CLUTEN - - /// Color Keying Enable - @ReadWrite(bits: 1..<2, as: COLKENValues.self) - public var colken: COLKEN - - /// Layer Enable - @ReadWrite(bits: 0..<1, as: LENValues.self) - public var len: LEN - } - - /// Layerx Window Horizontal Position Configuration Register - @Register(bitWidth: 32) - public struct WHPCR { - /// Window Horizontal Stop Position - @ReadWrite(bits: 16..<28) - public var whsppos: WHSPPOS - - /// Window Horizontal Start Position - @ReadWrite(bits: 0..<12) - public var whstpos: WHSTPOS - } - - /// Layerx Window Vertical Position Configuration Register - @Register(bitWidth: 32) - public struct WVPCR { - /// Window Vertical Stop Position - @ReadWrite(bits: 16..<27) - public var wvsppos: WVSPPOS - - /// Window Vertical Start Position - @ReadWrite(bits: 0..<11) - public var wvstpos: WVSTPOS - } - - /// Layerx Color Keying Configuration Register - @Register(bitWidth: 32) - public struct CKCR { - /// Color Key Red value - @ReadWrite(bits: 16..<24) - public var ckred: CKRED - - /// Color Key Green value - @ReadWrite(bits: 8..<16) - public var ckgreen: CKGREEN - - /// Color Key Blue value - @ReadWrite(bits: 0..<8) - public var ckblue: CKBLUE - } - - /// Layerx Pixel Format Configuration Register - @Register(bitWidth: 32) - public struct PFCR { - /// Pixel Format - @ReadWrite(bits: 0..<3, as: PFValues.self) - public var pf: PF - } - - /// Layerx Constant Alpha Configuration Register - @Register(bitWidth: 32) - public struct CACR { - /// Constant Alpha - @ReadWrite(bits: 0..<8) - public var consta: CONSTA - } - - /// Layerx Default Color Configuration Register - @Register(bitWidth: 32) - public struct DCCR { - /// Default Color Alpha - @ReadWrite(bits: 24..<32) - public var dcalpha: DCALPHA - - /// Default Color Red - @ReadWrite(bits: 16..<24) - public var dcred: DCRED - - /// Default Color Green - @ReadWrite(bits: 8..<16) - public var dcgreen: DCGREEN - - /// Default Color Blue - @ReadWrite(bits: 0..<8) - public var dcblue: DCBLUE - } - - /// Layerx Blending Factors Configuration Register - @Register(bitWidth: 32) - public struct BFCR { - /// Blending Factor 1 - @ReadWrite(bits: 8..<11, as: BF1Values.self) - public var bf1: BF1 - - /// Blending Factor 2 - @ReadWrite(bits: 0..<3, as: BF2Values.self) - public var bf2: BF2 - } - - /// Layerx Color Frame Buffer Address Register - @Register(bitWidth: 32) - public struct CFBAR { - /// Color Frame Buffer Start Address - @ReadWrite(bits: 0..<32) - public var cfbadd: CFBADD - } - - /// Layerx Color Frame Buffer Length Register - @Register(bitWidth: 32) - public struct CFBLR { - /// Color Frame Buffer Pitch in bytes - @ReadWrite(bits: 16..<29) - public var cfbp: CFBP - - /// Color Frame Buffer Line Length - @ReadWrite(bits: 0..<13) - public var cfbll: CFBLL - } - - /// Layerx ColorFrame Buffer Line Number Register - @Register(bitWidth: 32) - public struct CFBLNR { - /// Frame Buffer Line Number - @ReadWrite(bits: 0..<11) - public var cfblnbr: CFBLNBR - } - - /// Layerx CLUT Write Register - @Register(bitWidth: 32) - public struct CLUTWR { - /// CLUT Address - @WriteOnly(bits: 24..<32) - public var clutadd: CLUTADD - - /// Red value - @WriteOnly(bits: 16..<24) - public var red: RED - - /// Green value - @WriteOnly(bits: 8..<16) - public var green: GREEN - - /// Blue value - @WriteOnly(bits: 0..<8) - public var blue: BLUE - } -} - -extension LTDC.GCR { - public struct HSPOLValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Horizontal synchronization polarity is active low - public static let ActiveLow = Self(rawValue: 0x0) - - /// Horizontal synchronization polarity is active high - public static let ActiveHigh = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension LTDC.GCR { - public struct VSPOLValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Vertical synchronization polarity is active low - public static let ActiveLow = Self(rawValue: 0x0) - - /// Vertical synchronization polarity is active high - public static let ActiveHigh = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension LTDC.GCR { - public struct DEPOLValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Data enable polarity is active low - public static let ActiveLow = Self(rawValue: 0x0) - - /// Data enable polarity is active high - public static let ActiveHigh = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension LTDC.GCR { - public struct PCPOLValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Pixel clock on rising edge - public static let RisingEdge = Self(rawValue: 0x0) - - /// Pixel clock on falling edge - public static let FallingEdge = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension LTDC.GCR { - public struct DENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Dither disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Dither enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension LTDC.GCR { - public struct LTDCENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// LCD-TFT controller disabled - public static let Disabled = Self(rawValue: 0x0) - - /// LCD-TFT controller enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension LTDC.SRCR { - public struct VBRValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// This bit is set by software and cleared only by hardware after reload (it cannot be cleared through register write once it is set) - public static let NoEffect = Self(rawValue: 0x0) - - /// The shadow registers are reloaded during the vertical blanking period (at the beginning of the first line after the active display area). - public static let Reload = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension LTDC.SRCR { - public struct IMRValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// This bit is set by software and cleared only by hardware after reload (it cannot be cleared through register write once it is set) - public static let NoEffect = Self(rawValue: 0x0) - - /// The shadow registers are reloaded immediately. This bit is set by software and cleared only by hardware after reload - public static let Reload = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension LTDC.IER { - public struct RRIEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Register reload interrupt disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Register reload interrupt enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension LTDC.IER { - public struct TERRIEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Transfer error interrupt disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Transfer error interrupt enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension LTDC.IER { - public struct FUIEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// FIFO underrun interrupt disabled - public static let Disabled = Self(rawValue: 0x0) - - /// FIFO underrun interrupt enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension LTDC.IER { - public struct LIEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Line interrupt disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Line interrupt enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension LTDC.LAYER.CR { - public struct CLUTENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Color look-up table disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Color look-up table enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension LTDC.LAYER.CR { - public struct COLKENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Color keying disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Color keying enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension LTDC.LAYER.CR { - public struct LENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Layer disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Layer enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension LTDC.LAYER.PFCR { - public struct PFValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 3 - - /// ARGB8888 - public static let ARGB8888 = Self(rawValue: 0x0) - - /// RGB888 - public static let RGB888 = Self(rawValue: 0x1) - - /// RGB565 - public static let RGB565 = Self(rawValue: 0x2) - - /// ARGB1555 - public static let ARGB1555 = Self(rawValue: 0x3) - - /// ARGB4444 - public static let ARGB4444 = Self(rawValue: 0x4) - - /// L8 (8-bit luminance) - public static let L8 = Self(rawValue: 0x5) - - /// AL44 (4-bit alpha, 4-bit luminance) - public static let AL44 = Self(rawValue: 0x6) - - /// AL88 (8-bit alpha, 8-bit luminance) - public static let AL88 = Self(rawValue: 0x7) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension LTDC.LAYER.BFCR { - public struct BF1Values: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 3 - - /// BF1 = constant alpha - public static let Constant = Self(rawValue: 0x4) - - /// BF1 = pixel alpha * constant alpha - public static let Pixel = Self(rawValue: 0x6) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension LTDC.LAYER.BFCR { - public struct BF2Values: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 3 - - /// BF2 = 1 - constant alpha - public static let Constant = Self(rawValue: 0x5) - - /// BF2 = 1 - pixel alpha * constant alpha - public static let Pixel = Self(rawValue: 0x7) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} diff --git a/stm32-lvgl/Sources/Registers/NVIC.swift b/stm32-lvgl/Sources/Registers/NVIC.swift deleted file mode 100644 index 9876eeac..00000000 --- a/stm32-lvgl/Sources/Registers/NVIC.swift +++ /dev/null @@ -1,813 +0,0 @@ -// Generated by svd2swift. - -import MMIO - -/// Nested Vectored Interrupt Controller -@RegisterBlock -public struct NVIC { - /// Interrupt Set-Enable Register - @RegisterBlock(offset: 0x0) - public var iser0: Register - - /// Interrupt Set-Enable Register - @RegisterBlock(offset: 0x4) - public var iser1: Register - - /// Interrupt Set-Enable Register - @RegisterBlock(offset: 0x8) - public var iser2: Register - - /// Interrupt Clear-Enable Register - @RegisterBlock(offset: 0x80) - public var icer0: Register - - /// Interrupt Clear-Enable Register - @RegisterBlock(offset: 0x84) - public var icer1: Register - - /// Interrupt Clear-Enable Register - @RegisterBlock(offset: 0x88) - public var icer2: Register - - /// Interrupt Set-Pending Register - @RegisterBlock(offset: 0x100) - public var ispr0: Register - - /// Interrupt Set-Pending Register - @RegisterBlock(offset: 0x104) - public var ispr1: Register - - /// Interrupt Set-Pending Register - @RegisterBlock(offset: 0x108) - public var ispr2: Register - - /// Interrupt Clear-Pending Register - @RegisterBlock(offset: 0x180) - public var icpr0: Register - - /// Interrupt Clear-Pending Register - @RegisterBlock(offset: 0x184) - public var icpr1: Register - - /// Interrupt Clear-Pending Register - @RegisterBlock(offset: 0x188) - public var icpr2: Register - - /// Interrupt Active Bit Register - @RegisterBlock(offset: 0x200) - public var iabr0: Register - - /// Interrupt Active Bit Register - @RegisterBlock(offset: 0x204) - public var iabr1: Register - - /// Interrupt Active Bit Register - @RegisterBlock(offset: 0x208) - public var iabr2: Register - - /// Interrupt Priority Register - @RegisterBlock(offset: 0x300) - public var ipr0: Register - - /// Interrupt Priority Register - @RegisterBlock(offset: 0x304) - public var ipr1: Register - - /// Interrupt Priority Register - @RegisterBlock(offset: 0x308) - public var ipr2: Register - - /// Interrupt Priority Register - @RegisterBlock(offset: 0x30c) - public var ipr3: Register - - /// Interrupt Priority Register - @RegisterBlock(offset: 0x310) - public var ipr4: Register - - /// Interrupt Priority Register - @RegisterBlock(offset: 0x314) - public var ipr5: Register - - /// Interrupt Priority Register - @RegisterBlock(offset: 0x318) - public var ipr6: Register - - /// Interrupt Priority Register - @RegisterBlock(offset: 0x31c) - public var ipr7: Register - - /// Interrupt Priority Register - @RegisterBlock(offset: 0x320) - public var ipr8: Register - - /// Interrupt Priority Register - @RegisterBlock(offset: 0x324) - public var ipr9: Register - - /// Interrupt Priority Register - @RegisterBlock(offset: 0x328) - public var ipr10: Register - - /// Interrupt Priority Register - @RegisterBlock(offset: 0x32c) - public var ipr11: Register - - /// Interrupt Priority Register - @RegisterBlock(offset: 0x330) - public var ipr12: Register - - /// Interrupt Priority Register - @RegisterBlock(offset: 0x334) - public var ipr13: Register - - /// Interrupt Priority Register - @RegisterBlock(offset: 0x338) - public var ipr14: Register - - /// Interrupt Priority Register - @RegisterBlock(offset: 0x33c) - public var ipr15: Register - - /// Interrupt Priority Register - @RegisterBlock(offset: 0x340) - public var ipr16: Register - - /// Interrupt Priority Register - @RegisterBlock(offset: 0x344) - public var ipr17: Register - - /// Interrupt Priority Register - @RegisterBlock(offset: 0x348) - public var ipr18: Register - - /// Interrupt Priority Register - @RegisterBlock(offset: 0x34c) - public var ipr19: Register - - /// Interrupt Priority Register - @RegisterBlock(offset: 0x350) - public var ipr20: Register - - /// Interrupt Priority Register - @RegisterBlock(offset: 0x354) - public var ipr21: Register - - /// Interrupt Priority Register - @RegisterBlock(offset: 0x358) - public var ipr22: Register - - /// Interrupt Priority Register - @RegisterBlock(offset: 0x35c) - public var ipr23: Register - - /// Interrupt Priority Register - @RegisterBlock(offset: 0x360) - public var ipr24: Register - - /// Interrupt Priority Register - @RegisterBlock(offset: 0x364) - public var ipr25: Register -} - -extension NVIC { - /// Interrupt Set-Enable Register - @Register(bitWidth: 32) - public struct ISER0 { - /// SETENA - @ReadWrite(bits: 0..<32) - public var setena: SETENA - } - - /// Interrupt Set-Enable Register - @Register(bitWidth: 32) - public struct ISER1 { - /// SETENA - @ReadWrite(bits: 0..<32) - public var setena: SETENA - } - - /// Interrupt Set-Enable Register - @Register(bitWidth: 32) - public struct ISER2 { - /// SETENA - @ReadWrite(bits: 0..<32) - public var setena: SETENA - } - - /// Interrupt Clear-Enable Register - @Register(bitWidth: 32) - public struct ICER0 { - /// CLRENA - @ReadWrite(bits: 0..<32) - public var clrena: CLRENA - } - - /// Interrupt Clear-Enable Register - @Register(bitWidth: 32) - public struct ICER1 { - /// CLRENA - @ReadWrite(bits: 0..<32) - public var clrena: CLRENA - } - - /// Interrupt Clear-Enable Register - @Register(bitWidth: 32) - public struct ICER2 { - /// CLRENA - @ReadWrite(bits: 0..<32) - public var clrena: CLRENA - } - - /// Interrupt Set-Pending Register - @Register(bitWidth: 32) - public struct ISPR0 { - /// SETPEND - @ReadWrite(bits: 0..<32) - public var setpend: SETPEND - } - - /// Interrupt Set-Pending Register - @Register(bitWidth: 32) - public struct ISPR1 { - /// SETPEND - @ReadWrite(bits: 0..<32) - public var setpend: SETPEND - } - - /// Interrupt Set-Pending Register - @Register(bitWidth: 32) - public struct ISPR2 { - /// SETPEND - @ReadWrite(bits: 0..<32) - public var setpend: SETPEND - } - - /// Interrupt Clear-Pending Register - @Register(bitWidth: 32) - public struct ICPR0 { - /// CLRPEND - @ReadWrite(bits: 0..<32) - public var clrpend: CLRPEND - } - - /// Interrupt Clear-Pending Register - @Register(bitWidth: 32) - public struct ICPR1 { - /// CLRPEND - @ReadWrite(bits: 0..<32) - public var clrpend: CLRPEND - } - - /// Interrupt Clear-Pending Register - @Register(bitWidth: 32) - public struct ICPR2 { - /// CLRPEND - @ReadWrite(bits: 0..<32) - public var clrpend: CLRPEND - } - - /// Interrupt Active Bit Register - @Register(bitWidth: 32) - public struct IABR0 { - /// ACTIVE - @ReadOnly(bits: 0..<32) - public var active: ACTIVE - } - - /// Interrupt Active Bit Register - @Register(bitWidth: 32) - public struct IABR1 { - /// ACTIVE - @ReadOnly(bits: 0..<32) - public var active: ACTIVE - } - - /// Interrupt Active Bit Register - @Register(bitWidth: 32) - public struct IABR2 { - /// ACTIVE - @ReadOnly(bits: 0..<32) - public var active: ACTIVE - } - - /// Interrupt Priority Register - @Register(bitWidth: 32) - public struct IPR0 { - /// IPR_N0 - @ReadWrite(bits: 0..<8) - public var ipr_n0: IPR_N0 - - /// IPR_N1 - @ReadWrite(bits: 8..<16) - public var ipr_n1: IPR_N1 - - /// IPR_N2 - @ReadWrite(bits: 16..<24) - public var ipr_n2: IPR_N2 - - /// IPR_N3 - @ReadWrite(bits: 24..<32) - public var ipr_n3: IPR_N3 - } - - /// Interrupt Priority Register - @Register(bitWidth: 32) - public struct IPR1 { - /// IPR_N0 - @ReadWrite(bits: 0..<8) - public var ipr_n0: IPR_N0 - - /// IPR_N1 - @ReadWrite(bits: 8..<16) - public var ipr_n1: IPR_N1 - - /// IPR_N2 - @ReadWrite(bits: 16..<24) - public var ipr_n2: IPR_N2 - - /// IPR_N3 - @ReadWrite(bits: 24..<32) - public var ipr_n3: IPR_N3 - } - - /// Interrupt Priority Register - @Register(bitWidth: 32) - public struct IPR2 { - /// IPR_N0 - @ReadWrite(bits: 0..<8) - public var ipr_n0: IPR_N0 - - /// IPR_N1 - @ReadWrite(bits: 8..<16) - public var ipr_n1: IPR_N1 - - /// IPR_N2 - @ReadWrite(bits: 16..<24) - public var ipr_n2: IPR_N2 - - /// IPR_N3 - @ReadWrite(bits: 24..<32) - public var ipr_n3: IPR_N3 - } - - /// Interrupt Priority Register - @Register(bitWidth: 32) - public struct IPR3 { - /// IPR_N0 - @ReadWrite(bits: 0..<8) - public var ipr_n0: IPR_N0 - - /// IPR_N1 - @ReadWrite(bits: 8..<16) - public var ipr_n1: IPR_N1 - - /// IPR_N2 - @ReadWrite(bits: 16..<24) - public var ipr_n2: IPR_N2 - - /// IPR_N3 - @ReadWrite(bits: 24..<32) - public var ipr_n3: IPR_N3 - } - - /// Interrupt Priority Register - @Register(bitWidth: 32) - public struct IPR4 { - /// IPR_N0 - @ReadWrite(bits: 0..<8) - public var ipr_n0: IPR_N0 - - /// IPR_N1 - @ReadWrite(bits: 8..<16) - public var ipr_n1: IPR_N1 - - /// IPR_N2 - @ReadWrite(bits: 16..<24) - public var ipr_n2: IPR_N2 - - /// IPR_N3 - @ReadWrite(bits: 24..<32) - public var ipr_n3: IPR_N3 - } - - /// Interrupt Priority Register - @Register(bitWidth: 32) - public struct IPR5 { - /// IPR_N0 - @ReadWrite(bits: 0..<8) - public var ipr_n0: IPR_N0 - - /// IPR_N1 - @ReadWrite(bits: 8..<16) - public var ipr_n1: IPR_N1 - - /// IPR_N2 - @ReadWrite(bits: 16..<24) - public var ipr_n2: IPR_N2 - - /// IPR_N3 - @ReadWrite(bits: 24..<32) - public var ipr_n3: IPR_N3 - } - - /// Interrupt Priority Register - @Register(bitWidth: 32) - public struct IPR6 { - /// IPR_N0 - @ReadWrite(bits: 0..<8) - public var ipr_n0: IPR_N0 - - /// IPR_N1 - @ReadWrite(bits: 8..<16) - public var ipr_n1: IPR_N1 - - /// IPR_N2 - @ReadWrite(bits: 16..<24) - public var ipr_n2: IPR_N2 - - /// IPR_N3 - @ReadWrite(bits: 24..<32) - public var ipr_n3: IPR_N3 - } - - /// Interrupt Priority Register - @Register(bitWidth: 32) - public struct IPR7 { - /// IPR_N0 - @ReadWrite(bits: 0..<8) - public var ipr_n0: IPR_N0 - - /// IPR_N1 - @ReadWrite(bits: 8..<16) - public var ipr_n1: IPR_N1 - - /// IPR_N2 - @ReadWrite(bits: 16..<24) - public var ipr_n2: IPR_N2 - - /// IPR_N3 - @ReadWrite(bits: 24..<32) - public var ipr_n3: IPR_N3 - } - - /// Interrupt Priority Register - @Register(bitWidth: 32) - public struct IPR8 { - /// IPR_N0 - @ReadWrite(bits: 0..<8) - public var ipr_n0: IPR_N0 - - /// IPR_N1 - @ReadWrite(bits: 8..<16) - public var ipr_n1: IPR_N1 - - /// IPR_N2 - @ReadWrite(bits: 16..<24) - public var ipr_n2: IPR_N2 - - /// IPR_N3 - @ReadWrite(bits: 24..<32) - public var ipr_n3: IPR_N3 - } - - /// Interrupt Priority Register - @Register(bitWidth: 32) - public struct IPR9 { - /// IPR_N0 - @ReadWrite(bits: 0..<8) - public var ipr_n0: IPR_N0 - - /// IPR_N1 - @ReadWrite(bits: 8..<16) - public var ipr_n1: IPR_N1 - - /// IPR_N2 - @ReadWrite(bits: 16..<24) - public var ipr_n2: IPR_N2 - - /// IPR_N3 - @ReadWrite(bits: 24..<32) - public var ipr_n3: IPR_N3 - } - - /// Interrupt Priority Register - @Register(bitWidth: 32) - public struct IPR10 { - /// IPR_N0 - @ReadWrite(bits: 0..<8) - public var ipr_n0: IPR_N0 - - /// IPR_N1 - @ReadWrite(bits: 8..<16) - public var ipr_n1: IPR_N1 - - /// IPR_N2 - @ReadWrite(bits: 16..<24) - public var ipr_n2: IPR_N2 - - /// IPR_N3 - @ReadWrite(bits: 24..<32) - public var ipr_n3: IPR_N3 - } - - /// Interrupt Priority Register - @Register(bitWidth: 32) - public struct IPR11 { - /// IPR_N0 - @ReadWrite(bits: 0..<8) - public var ipr_n0: IPR_N0 - - /// IPR_N1 - @ReadWrite(bits: 8..<16) - public var ipr_n1: IPR_N1 - - /// IPR_N2 - @ReadWrite(bits: 16..<24) - public var ipr_n2: IPR_N2 - - /// IPR_N3 - @ReadWrite(bits: 24..<32) - public var ipr_n3: IPR_N3 - } - - /// Interrupt Priority Register - @Register(bitWidth: 32) - public struct IPR12 { - /// IPR_N0 - @ReadWrite(bits: 0..<8) - public var ipr_n0: IPR_N0 - - /// IPR_N1 - @ReadWrite(bits: 8..<16) - public var ipr_n1: IPR_N1 - - /// IPR_N2 - @ReadWrite(bits: 16..<24) - public var ipr_n2: IPR_N2 - - /// IPR_N3 - @ReadWrite(bits: 24..<32) - public var ipr_n3: IPR_N3 - } - - /// Interrupt Priority Register - @Register(bitWidth: 32) - public struct IPR13 { - /// IPR_N0 - @ReadWrite(bits: 0..<8) - public var ipr_n0: IPR_N0 - - /// IPR_N1 - @ReadWrite(bits: 8..<16) - public var ipr_n1: IPR_N1 - - /// IPR_N2 - @ReadWrite(bits: 16..<24) - public var ipr_n2: IPR_N2 - - /// IPR_N3 - @ReadWrite(bits: 24..<32) - public var ipr_n3: IPR_N3 - } - - /// Interrupt Priority Register - @Register(bitWidth: 32) - public struct IPR14 { - /// IPR_N0 - @ReadWrite(bits: 0..<8) - public var ipr_n0: IPR_N0 - - /// IPR_N1 - @ReadWrite(bits: 8..<16) - public var ipr_n1: IPR_N1 - - /// IPR_N2 - @ReadWrite(bits: 16..<24) - public var ipr_n2: IPR_N2 - - /// IPR_N3 - @ReadWrite(bits: 24..<32) - public var ipr_n3: IPR_N3 - } - - /// Interrupt Priority Register - @Register(bitWidth: 32) - public struct IPR15 { - /// IPR_N0 - @ReadWrite(bits: 0..<8) - public var ipr_n0: IPR_N0 - - /// IPR_N1 - @ReadWrite(bits: 8..<16) - public var ipr_n1: IPR_N1 - - /// IPR_N2 - @ReadWrite(bits: 16..<24) - public var ipr_n2: IPR_N2 - - /// IPR_N3 - @ReadWrite(bits: 24..<32) - public var ipr_n3: IPR_N3 - } - - /// Interrupt Priority Register - @Register(bitWidth: 32) - public struct IPR16 { - /// IPR_N0 - @ReadWrite(bits: 0..<8) - public var ipr_n0: IPR_N0 - - /// IPR_N1 - @ReadWrite(bits: 8..<16) - public var ipr_n1: IPR_N1 - - /// IPR_N2 - @ReadWrite(bits: 16..<24) - public var ipr_n2: IPR_N2 - - /// IPR_N3 - @ReadWrite(bits: 24..<32) - public var ipr_n3: IPR_N3 - } - - /// Interrupt Priority Register - @Register(bitWidth: 32) - public struct IPR17 { - /// IPR_N0 - @ReadWrite(bits: 0..<8) - public var ipr_n0: IPR_N0 - - /// IPR_N1 - @ReadWrite(bits: 8..<16) - public var ipr_n1: IPR_N1 - - /// IPR_N2 - @ReadWrite(bits: 16..<24) - public var ipr_n2: IPR_N2 - - /// IPR_N3 - @ReadWrite(bits: 24..<32) - public var ipr_n3: IPR_N3 - } - - /// Interrupt Priority Register - @Register(bitWidth: 32) - public struct IPR18 { - /// IPR_N0 - @ReadWrite(bits: 0..<8) - public var ipr_n0: IPR_N0 - - /// IPR_N1 - @ReadWrite(bits: 8..<16) - public var ipr_n1: IPR_N1 - - /// IPR_N2 - @ReadWrite(bits: 16..<24) - public var ipr_n2: IPR_N2 - - /// IPR_N3 - @ReadWrite(bits: 24..<32) - public var ipr_n3: IPR_N3 - } - - /// Interrupt Priority Register - @Register(bitWidth: 32) - public struct IPR19 { - /// IPR_N0 - @ReadWrite(bits: 0..<8) - public var ipr_n0: IPR_N0 - - /// IPR_N1 - @ReadWrite(bits: 8..<16) - public var ipr_n1: IPR_N1 - - /// IPR_N2 - @ReadWrite(bits: 16..<24) - public var ipr_n2: IPR_N2 - - /// IPR_N3 - @ReadWrite(bits: 24..<32) - public var ipr_n3: IPR_N3 - } - - /// Interrupt Priority Register - @Register(bitWidth: 32) - public struct IPR20 { - /// IPR_N0 - @ReadWrite(bits: 0..<8) - public var ipr_n0: IPR_N0 - - /// IPR_N1 - @ReadWrite(bits: 8..<16) - public var ipr_n1: IPR_N1 - - /// IPR_N2 - @ReadWrite(bits: 16..<24) - public var ipr_n2: IPR_N2 - - /// IPR_N3 - @ReadWrite(bits: 24..<32) - public var ipr_n3: IPR_N3 - } - - /// Interrupt Priority Register - @Register(bitWidth: 32) - public struct IPR21 { - /// IPR_N0 - @ReadWrite(bits: 0..<8) - public var ipr_n0: IPR_N0 - - /// IPR_N1 - @ReadWrite(bits: 8..<16) - public var ipr_n1: IPR_N1 - - /// IPR_N2 - @ReadWrite(bits: 16..<24) - public var ipr_n2: IPR_N2 - - /// IPR_N3 - @ReadWrite(bits: 24..<32) - public var ipr_n3: IPR_N3 - } - - /// Interrupt Priority Register - @Register(bitWidth: 32) - public struct IPR22 { - /// IPR_N0 - @ReadWrite(bits: 0..<8) - public var ipr_n0: IPR_N0 - - /// IPR_N1 - @ReadWrite(bits: 8..<16) - public var ipr_n1: IPR_N1 - - /// IPR_N2 - @ReadWrite(bits: 16..<24) - public var ipr_n2: IPR_N2 - - /// IPR_N3 - @ReadWrite(bits: 24..<32) - public var ipr_n3: IPR_N3 - } - - /// Interrupt Priority Register - @Register(bitWidth: 32) - public struct IPR23 { - /// IPR_N0 - @ReadWrite(bits: 0..<8) - public var ipr_n0: IPR_N0 - - /// IPR_N1 - @ReadWrite(bits: 8..<16) - public var ipr_n1: IPR_N1 - - /// IPR_N2 - @ReadWrite(bits: 16..<24) - public var ipr_n2: IPR_N2 - - /// IPR_N3 - @ReadWrite(bits: 24..<32) - public var ipr_n3: IPR_N3 - } - - /// Interrupt Priority Register - @Register(bitWidth: 32) - public struct IPR24 { - /// IPR_N0 - @ReadWrite(bits: 0..<8) - public var ipr_n0: IPR_N0 - - /// IPR_N1 - @ReadWrite(bits: 8..<16) - public var ipr_n1: IPR_N1 - - /// IPR_N2 - @ReadWrite(bits: 16..<24) - public var ipr_n2: IPR_N2 - - /// IPR_N3 - @ReadWrite(bits: 24..<32) - public var ipr_n3: IPR_N3 - } - - /// Interrupt Priority Register - @Register(bitWidth: 32) - public struct IPR25 { - /// IPR_N0 - @ReadWrite(bits: 0..<8) - public var ipr_n0: IPR_N0 - - /// IPR_N1 - @ReadWrite(bits: 8..<16) - public var ipr_n1: IPR_N1 - - /// IPR_N2 - @ReadWrite(bits: 16..<24) - public var ipr_n2: IPR_N2 - - /// IPR_N3 - @ReadWrite(bits: 24..<32) - public var ipr_n3: IPR_N3 - } -} diff --git a/stm32-lvgl/Sources/Registers/PWR.swift b/stm32-lvgl/Sources/Registers/PWR.swift deleted file mode 100644 index eb8cdcae..00000000 --- a/stm32-lvgl/Sources/Registers/PWR.swift +++ /dev/null @@ -1,270 +0,0 @@ -// Generated by svd2swift. - -import MMIO - -/// Power control -@RegisterBlock -public struct PWR { - /// power control register - @RegisterBlock(offset: 0x0) - public var cr1: Register - - /// power control/status register - @RegisterBlock(offset: 0x4) - public var csr1: Register - - /// power control register - @RegisterBlock(offset: 0x8) - public var cr2: Register - - /// power control/status register - @RegisterBlock(offset: 0xc) - public var csr2: Register -} - -extension PWR { - /// power control register - @Register(bitWidth: 32) - public struct CR1 { - /// Low-power deep sleep - @ReadWrite(bits: 0..<1) - public var lpds: LPDS - - /// Power down deepsleep - @ReadWrite(bits: 1..<2, as: PDDSValues.self) - public var pdds: PDDS - - /// Clear standby flag - @ReadWrite(bits: 3..<4) - public var csbf: CSBF - - /// Power voltage detector enable - @ReadWrite(bits: 4..<5) - public var pvde: PVDE - - /// PVD level selection - @ReadWrite(bits: 5..<8) - public var pls: PLS - - /// Disable backup domain write protection - @ReadWrite(bits: 8..<9) - public var dbp: DBP - - /// Flash power down in Stop mode - @ReadWrite(bits: 9..<10) - public var fpds: FPDS - - /// Low-power regulator in deepsleep under-drive mode - @ReadWrite(bits: 10..<11) - public var lpuds: LPUDS - - /// Main regulator in deepsleep under-drive mode - @ReadWrite(bits: 11..<12) - public var mruds: MRUDS - - /// ADCDC1 - @ReadWrite(bits: 13..<14) - public var adcdc1: ADCDC1 - - /// Regulator voltage scaling output selection - @ReadWrite(bits: 14..<16, as: VOSValues.self) - public var vos: VOS - - /// Over-drive enable - @ReadWrite(bits: 16..<17) - public var oden: ODEN - - /// Over-drive switching enabled - @ReadWrite(bits: 17..<18) - public var odswen: ODSWEN - - /// Under-drive enable in stop mode - @ReadWrite(bits: 18..<20) - public var uden: UDEN - } - - /// power control/status register - @Register(bitWidth: 32) - public struct CSR1 { - /// Wakeup internal flag - @ReadOnly(bits: 0..<1) - public var wuif: WUIF - - /// Standby flag - @ReadOnly(bits: 1..<2) - public var sbf: SBF - - /// PVD output - @ReadOnly(bits: 2..<3) - public var pvdo: PVDO - - /// Backup regulator ready - @ReadOnly(bits: 3..<4) - public var brr: BRR - - /// Backup regulator enable - @ReadWrite(bits: 9..<10) - public var bre: BRE - - /// Regulator voltage scaling output selection ready bit - @ReadWrite(bits: 14..<15) - public var vosrdy: VOSRDY - - /// Over-drive mode ready - @ReadWrite(bits: 16..<17) - public var odrdy: ODRDY - - /// Over-drive mode switching ready - @ReadWrite(bits: 17..<18) - public var odswrdy: ODSWRDY - - /// Under-drive ready flag - @ReadWrite(bits: 18..<20) - public var udrdy: UDRDY - } - - /// power control register - @Register(bitWidth: 32) - public struct CR2 { - /// Clear Wakeup Pin flag for PA0 - @ReadOnly(bits: 0..<1) - public var cwupf1: CWUPF1 - - /// Clear Wakeup Pin flag for PA2 - @ReadOnly(bits: 1..<2) - public var cwupf2: CWUPF2 - - /// Clear Wakeup Pin flag for PC1 - @ReadOnly(bits: 2..<3) - public var cwupf3: CWUPF3 - - /// Clear Wakeup Pin flag for PC13 - @ReadOnly(bits: 3..<4) - public var cwupf4: CWUPF4 - - /// Clear Wakeup Pin flag for PI8 - @ReadOnly(bits: 4..<5) - public var cwupf5: CWUPF5 - - /// Clear Wakeup Pin flag for PI11 - @ReadOnly(bits: 5..<6) - public var cwupf6: CWUPF6 - - /// Wakeup pin polarity bit for PA0 - @ReadWrite(bits: 8..<9) - public var wupp1: WUPP1 - - /// Wakeup pin polarity bit for PA2 - @ReadWrite(bits: 9..<10) - public var wupp2: WUPP2 - - /// Wakeup pin polarity bit for PC1 - @ReadWrite(bits: 10..<11) - public var wupp3: WUPP3 - - /// Wakeup pin polarity bit for PC13 - @ReadWrite(bits: 11..<12) - public var wupp4: WUPP4 - - /// Wakeup pin polarity bit for PI8 - @ReadWrite(bits: 12..<13) - public var wupp5: WUPP5 - - /// Wakeup pin polarity bit for PI11 - @ReadWrite(bits: 13..<14) - public var wupp6: WUPP6 - } - - /// power control/status register - @Register(bitWidth: 32) - public struct CSR2 { - /// Wakeup Pin flag for PA0 - @ReadOnly(bits: 0..<1) - public var wupf1: WUPF1 - - /// Wakeup Pin flag for PA2 - @ReadOnly(bits: 1..<2) - public var wupf2: WUPF2 - - /// Wakeup Pin flag for PC1 - @ReadOnly(bits: 2..<3) - public var wupf3: WUPF3 - - /// Wakeup Pin flag for PC13 - @ReadOnly(bits: 3..<4) - public var wupf4: WUPF4 - - /// Wakeup Pin flag for PI8 - @ReadOnly(bits: 4..<5) - public var wupf5: WUPF5 - - /// Wakeup Pin flag for PI11 - @ReadOnly(bits: 5..<6) - public var wupf6: WUPF6 - - /// Enable Wakeup pin for PA0 - @ReadWrite(bits: 8..<9) - public var ewup1: EWUP1 - - /// Enable Wakeup pin for PA2 - @ReadWrite(bits: 9..<10) - public var ewup2: EWUP2 - - /// Enable Wakeup pin for PC1 - @ReadWrite(bits: 10..<11) - public var ewup3: EWUP3 - - /// Enable Wakeup pin for PC13 - @ReadWrite(bits: 11..<12) - public var ewup4: EWUP4 - - /// Enable Wakeup pin for PI8 - @ReadWrite(bits: 12..<13) - public var ewup5: EWUP5 - - /// Enable Wakeup pin for PI11 - @ReadWrite(bits: 13..<14) - public var ewup6: EWUP6 - } -} - -extension PWR.CR1 { - public struct PDDSValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Enter Stop mode when the CPU enters deepsleep - public static let STOP_MODE = Self(rawValue: 0x0) - - /// Enter Standby mode when the CPU enters deepsleep - public static let STANDBY_MODE = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension PWR.CR1 { - public struct VOSValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// Scale 3 mode - public static let SCALE3 = Self(rawValue: 0x1) - - /// Scale 2 mode - public static let SCALE2 = Self(rawValue: 0x2) - - /// Scale 1 mode (reset value) - public static let SCALE1 = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} diff --git a/stm32-lvgl/Sources/Registers/RCC.swift b/stm32-lvgl/Sources/Registers/RCC.swift deleted file mode 100644 index 57d1fdc3..00000000 --- a/stm32-lvgl/Sources/Registers/RCC.swift +++ /dev/null @@ -1,2833 +0,0 @@ -// Generated by svd2swift. - -import MMIO - -/// Reset and clock control -@RegisterBlock -public struct RCC { - /// clock control register - @RegisterBlock(offset: 0x0) - public var cr: Register - - /// PLL configuration register - @RegisterBlock(offset: 0x4) - public var pllcfgr: Register - - /// clock configuration register - @RegisterBlock(offset: 0x8) - public var cfgr: Register - - /// clock interrupt register - @RegisterBlock(offset: 0xc) - public var cir: Register - - /// AHB1 peripheral reset register - @RegisterBlock(offset: 0x10) - public var ahb1rstr: Register - - /// AHB2 peripheral reset register - @RegisterBlock(offset: 0x14) - public var ahb2rstr: Register - - /// AHB3 peripheral reset register - @RegisterBlock(offset: 0x18) - public var ahb3rstr: Register - - /// APB1 peripheral reset register - @RegisterBlock(offset: 0x20) - public var apb1rstr: Register - - /// APB2 peripheral reset register - @RegisterBlock(offset: 0x24) - public var apb2rstr: Register - - /// AHB1 peripheral clock register - @RegisterBlock(offset: 0x30) - public var ahb1enr: Register - - /// AHB2 peripheral clock enable register - @RegisterBlock(offset: 0x34) - public var ahb2enr: Register - - /// AHB3 peripheral clock enable register - @RegisterBlock(offset: 0x38) - public var ahb3enr: Register - - /// APB1 peripheral clock enable register - @RegisterBlock(offset: 0x40) - public var apb1enr: Register - - /// APB2 peripheral clock enable register - @RegisterBlock(offset: 0x44) - public var apb2enr: Register - - /// AHB1 peripheral clock enable in low power mode register - @RegisterBlock(offset: 0x50) - public var ahb1lpenr: Register - - /// AHB2 peripheral clock enable in low power mode register - @RegisterBlock(offset: 0x54) - public var ahb2lpenr: Register - - /// AHB3 peripheral clock enable in low power mode register - @RegisterBlock(offset: 0x58) - public var ahb3lpenr: Register - - /// APB1 peripheral clock enable in low power mode register - @RegisterBlock(offset: 0x60) - public var apb1lpenr: Register - - /// APB2 peripheral clock enabled in low power mode register - @RegisterBlock(offset: 0x64) - public var apb2lpenr: Register - - /// Backup domain control register - @RegisterBlock(offset: 0x70) - public var bdcr: Register - - /// clock control & status register - @RegisterBlock(offset: 0x74) - public var csr: Register - - /// spread spectrum clock generation register - @RegisterBlock(offset: 0x80) - public var sscgr: Register - - /// PLLI2S configuration register - @RegisterBlock(offset: 0x84) - public var plli2scfgr: Register - - /// PLL configuration register - @RegisterBlock(offset: 0x88) - public var pllsaicfgr: Register - - /// dedicated clocks configuration register - @RegisterBlock(offset: 0x8c) - public var dckcfgr1: Register - - /// dedicated clocks configuration register - @RegisterBlock(offset: 0x90) - public var dckcfgr2: Register -} - -extension RCC { - /// clock control register - @Register(bitWidth: 32) - public struct CR { - /// PLLI2S clock ready flag - @ReadOnly(bits: 27..<28) - public var plli2srdy: PLLI2SRDY - - /// PLLI2S enable - @ReadWrite(bits: 26..<27) - public var plli2son: PLLI2SON - - /// Main PLL (PLL) clock ready flag - @ReadOnly(bits: 25..<26) - public var pllrdy: PLLRDY - - /// Main PLL (PLL) enable - @ReadWrite(bits: 24..<25) - public var pllon: PLLON - - /// Clock security system enable - @ReadWrite(bits: 19..<20, as: CSSONValues.self) - public var csson: CSSON - - /// HSE clock bypass - @ReadWrite(bits: 18..<19, as: HSEBYPValues.self) - public var hsebyp: HSEBYP - - /// HSE clock ready flag - @ReadOnly(bits: 17..<18) - public var hserdy: HSERDY - - /// HSE clock enable - @ReadWrite(bits: 16..<17) - public var hseon: HSEON - - /// Internal high-speed clock calibration - @ReadOnly(bits: 8..<16) - public var hsical: HSICAL - - /// Internal high-speed clock trimming - @ReadWrite(bits: 3..<8) - public var hsitrim: HSITRIM - - /// Internal high-speed clock ready flag - @ReadOnly(bits: 1..<2) - public var hsirdy: HSIRDY - - /// Internal high-speed clock enable - @ReadWrite(bits: 0..<1, as: HSIONValues.self) - public var hsion: HSION - - /// PLLSAI clock ready flag - @ReadOnly(bits: 29..<30) - public var pllsairdy: PLLSAIRDY - - /// PLLSAI enable - @ReadWrite(bits: 28..<29) - public var pllsaion: PLLSAION - } - - /// PLL configuration register - @Register(bitWidth: 32) - public struct PLLCFGR { - /// Main PLL(PLL) and audio PLL (PLLI2S) entry clock source - @ReadWrite(bits: 22..<23, as: PLLSRCValues.self) - public var pllsrc: PLLSRC - - /// Division factor for the main PLL (PLL) and audio PLL (PLLI2S) input clock - @ReadWrite(bits: 0..<6) - public var pllm: PLLM - - /// Main PLL (PLL) multiplication factor for VCO - @ReadWrite(bits: 6..<15) - public var plln: PLLN - - /// Main PLL (PLL) division factor for main system clock - @ReadWrite(bits: 16..<18, as: PLLPValues.self) - public var pllp: PLLP - - /// Main PLL (PLL) division factor for USB OTG FS, SDIO and random number generator clocks - @ReadWrite(bits: 24..<28) - public var pllq: PLLQ - } - - /// clock configuration register - @Register(bitWidth: 32) - public struct CFGR { - /// Microcontroller clock output 2 - @ReadWrite(bits: 30..<32, as: MCO2Values.self) - public var mco2: MCO2 - - /// MCO2 prescaler - @ReadWrite(bits: 27..<30) - public var mco2pre: MCO2PRE - - /// MCO1 prescaler - @ReadWrite(bits: 24..<27, as: MCO1PREValues.self) - public var mco1pre: MCO1PRE - - /// I2S clock selection - @ReadWrite(bits: 23..<24, as: I2SSRCValues.self) - public var i2ssrc: I2SSRC - - /// Microcontroller clock output 1 - @ReadWrite(bits: 21..<23, as: MCO1Values.self) - public var mco1: MCO1 - - /// HSE division factor for RTC clock - @ReadWrite(bits: 16..<21) - public var rtcpre: RTCPRE - - /// APB high-speed prescaler (APB2) - @ReadWrite(bits: 13..<16) - public var ppre2: PPRE2 - - /// APB Low speed prescaler (APB1) - @ReadWrite(bits: 10..<13, as: PPRE1Values.self) - public var ppre1: PPRE1 - - /// AHB prescaler - @ReadWrite(bits: 4..<8, as: HPREValues.self) - public var hpre: HPRE - - /// System clock switch - @Reserved(bits: 0..<2, as: SWValues.self) - public var sw: SW - - /// System clock switch status - @Reserved(bits: 2..<4) - public var sws: SWS - } - - /// clock interrupt register - @Register(bitWidth: 32) - public struct CIR { - /// Clock security system interrupt clear - @WriteOnly(bits: 23..<24) - public var cssc: CSSC - - /// PLLSAI Ready Interrupt Clear - @WriteOnly(bits: 22..<23) - public var pllsairdyc: PLLSAIRDYC - - /// PLLI2S ready interrupt clear - @WriteOnly(bits: 21..<22) - public var plli2srdyc: PLLI2SRDYC - - /// Main PLL(PLL) ready interrupt clear - @WriteOnly(bits: 20..<21) - public var pllrdyc: PLLRDYC - - /// HSE ready interrupt clear - @WriteOnly(bits: 19..<20) - public var hserdyc: HSERDYC - - /// HSI ready interrupt clear - @WriteOnly(bits: 18..<19) - public var hsirdyc: HSIRDYC - - /// LSE ready interrupt clear - @WriteOnly(bits: 17..<18) - public var lserdyc: LSERDYC - - /// LSI ready interrupt clear - @WriteOnly(bits: 16..<17) - public var lsirdyc: LSIRDYC - - /// PLLSAI Ready Interrupt Enable - @ReadWrite(bits: 14..<15) - public var pllsairdyie: PLLSAIRDYIE - - /// PLLI2S ready interrupt enable - @ReadWrite(bits: 13..<14) - public var plli2srdyie: PLLI2SRDYIE - - /// Main PLL (PLL) ready interrupt enable - @ReadWrite(bits: 12..<13) - public var pllrdyie: PLLRDYIE - - /// HSE ready interrupt enable - @ReadWrite(bits: 11..<12) - public var hserdyie: HSERDYIE - - /// HSI ready interrupt enable - @ReadWrite(bits: 10..<11) - public var hsirdyie: HSIRDYIE - - /// LSE ready interrupt enable - @ReadWrite(bits: 9..<10) - public var lserdyie: LSERDYIE - - /// LSI ready interrupt enable - @ReadWrite(bits: 8..<9, as: LSIRDYIEValues.self) - public var lsirdyie: LSIRDYIE - - /// Clock security system interrupt flag - @ReadOnly(bits: 7..<8) - public var cssf: CSSF - - /// PLLSAI ready interrupt flag - @ReadOnly(bits: 6..<7) - public var pllsairdyf: PLLSAIRDYF - - /// PLLI2S ready interrupt flag - @ReadOnly(bits: 5..<6) - public var plli2srdyf: PLLI2SRDYF - - /// Main PLL (PLL) ready interrupt flag - @ReadOnly(bits: 4..<5) - public var pllrdyf: PLLRDYF - - /// HSE ready interrupt flag - @ReadOnly(bits: 3..<4) - public var hserdyf: HSERDYF - - /// HSI ready interrupt flag - @ReadOnly(bits: 2..<3) - public var hsirdyf: HSIRDYF - - /// LSE ready interrupt flag - @ReadOnly(bits: 1..<2) - public var lserdyf: LSERDYF - - /// LSI ready interrupt flag - @ReadOnly(bits: 0..<1) - public var lsirdyf: LSIRDYF - } - - /// AHB1 peripheral reset register - @Register(bitWidth: 32) - public struct AHB1RSTR { - /// USB OTG HS module reset - @ReadWrite(bits: 29..<30) - public var otghsrst: OTGHSRST - - /// Ethernet MAC reset - @ReadWrite(bits: 25..<26) - public var ethmacrst: ETHMACRST - - /// DMA2D reset - @ReadWrite(bits: 23..<24) - public var dma2drst: DMA2DRST - - /// DMA2 reset - @ReadWrite(bits: 22..<23) - public var dma2rst: DMA2RST - - /// DMA2 reset - @ReadWrite(bits: 21..<22) - public var dma1rst: DMA1RST - - /// CRC reset - @ReadWrite(bits: 12..<13) - public var crcrst: CRCRST - - /// IO port K reset - @ReadWrite(bits: 10..<11) - public var gpiokrst: GPIOKRST - - /// IO port J reset - @ReadWrite(bits: 9..<10) - public var gpiojrst: GPIOJRST - - /// IO port I reset - @ReadWrite(bits: 8..<9) - public var gpioirst: GPIOIRST - - /// IO port H reset - @ReadWrite(bits: 7..<8) - public var gpiohrst: GPIOHRST - - /// IO port G reset - @ReadWrite(bits: 6..<7) - public var gpiogrst: GPIOGRST - - /// IO port F reset - @ReadWrite(bits: 5..<6) - public var gpiofrst: GPIOFRST - - /// IO port E reset - @ReadWrite(bits: 4..<5) - public var gpioerst: GPIOERST - - /// IO port D reset - @ReadWrite(bits: 3..<4) - public var gpiodrst: GPIODRST - - /// IO port C reset - @ReadWrite(bits: 2..<3) - public var gpiocrst: GPIOCRST - - /// IO port B reset - @ReadWrite(bits: 1..<2) - public var gpiobrst: GPIOBRST - - /// IO port A reset - @ReadWrite(bits: 0..<1, as: GPIOARSTValues.self) - public var gpioarst: GPIOARST - } - - /// AHB2 peripheral reset register - @Register(bitWidth: 32) - public struct AHB2RSTR { - /// USB OTG FS module reset - @ReadWrite(bits: 7..<8) - public var otgfsrst: OTGFSRST - - /// Random number generator module reset - @ReadWrite(bits: 6..<7) - public var rngrst: RNGRST - - /// Hash module reset - @ReadWrite(bits: 5..<6) - public var hsahrst: HSAHRST - - /// Cryptographic module reset - @ReadWrite(bits: 4..<5) - public var cryprst: CRYPRST - - /// Camera interface reset - @ReadWrite(bits: 0..<1, as: DCMIRSTValues.self) - public var dcmirst: DCMIRST - } - - /// AHB3 peripheral reset register - @Register(bitWidth: 32) - public struct AHB3RSTR { - /// Flexible memory controller module reset - @ReadWrite(bits: 0..<1, as: FMCRSTValues.self) - public var fmcrst: FMCRST - - /// Quad SPI memory controller reset - @ReadWrite(bits: 1..<2) - public var qspirst: QSPIRST - } - - /// APB1 peripheral reset register - @Register(bitWidth: 32) - public struct APB1RSTR { - /// TIM2 reset - @ReadWrite(bits: 0..<1, as: TIM2RSTValues.self) - public var tim2rst: TIM2RST - - /// TIM3 reset - @ReadWrite(bits: 1..<2) - public var tim3rst: TIM3RST - - /// TIM4 reset - @ReadWrite(bits: 2..<3) - public var tim4rst: TIM4RST - - /// TIM5 reset - @ReadWrite(bits: 3..<4) - public var tim5rst: TIM5RST - - /// TIM6 reset - @ReadWrite(bits: 4..<5) - public var tim6rst: TIM6RST - - /// TIM7 reset - @ReadWrite(bits: 5..<6) - public var tim7rst: TIM7RST - - /// TIM12 reset - @ReadWrite(bits: 6..<7) - public var tim12rst: TIM12RST - - /// TIM13 reset - @ReadWrite(bits: 7..<8) - public var tim13rst: TIM13RST - - /// TIM14 reset - @ReadWrite(bits: 8..<9) - public var tim14rst: TIM14RST - - /// Window watchdog reset - @ReadWrite(bits: 11..<12) - public var wwdgrst: WWDGRST - - /// SPI 2 reset - @ReadWrite(bits: 14..<15) - public var spi2rst: SPI2RST - - /// SPI 3 reset - @ReadWrite(bits: 15..<16) - public var spi3rst: SPI3RST - - /// USART 2 reset - @ReadWrite(bits: 17..<18) - public var usart2rst: USART2RST - - /// USART 3 reset - @ReadWrite(bits: 18..<19) - public var usart3rst: USART3RST - - /// USART 4 reset - @ReadWrite(bits: 19..<20) - public var uart4rst: UART4RST - - /// USART 5 reset - @ReadWrite(bits: 20..<21) - public var uart5rst: UART5RST - - /// I2C 1 reset - @ReadWrite(bits: 21..<22) - public var i2c1rst: I2C1RST - - /// I2C 2 reset - @ReadWrite(bits: 22..<23) - public var i2c2rst: I2C2RST - - /// I2C3 reset - @ReadWrite(bits: 23..<24) - public var i2c3rst: I2C3RST - - /// CAN1 reset - @ReadWrite(bits: 25..<26) - public var can1rst: CAN1RST - - /// CAN2 reset - @ReadWrite(bits: 26..<27) - public var can2rst: CAN2RST - - /// Power interface reset - @ReadWrite(bits: 28..<29) - public var pwrrst: PWRRST - - /// DAC reset - @ReadWrite(bits: 29..<30) - public var dacrst: DACRST - - /// UART7 reset - @ReadWrite(bits: 30..<31) - public var uart7rst: UART7RST - - /// UART8 reset - @ReadWrite(bits: 31..<32) - public var uart8rst: UART8RST - - /// SPDIF-RX reset - @ReadWrite(bits: 16..<17) - public var spdifrxrst: SPDIFRXRST - - /// HDMI-CEC reset - @ReadWrite(bits: 27..<28) - public var cecrst: CECRST - - /// Low power timer 1 reset - @ReadWrite(bits: 9..<10) - public var lptim1rst: LPTIM1RST - - /// I2C 4 reset - @ReadWrite(bits: 24..<25) - public var i2c4rst: I2C4RST - } - - /// APB2 peripheral reset register - @Register(bitWidth: 32) - public struct APB2RSTR { - /// TIM1 reset - @ReadWrite(bits: 0..<1, as: TIM1RSTValues.self) - public var tim1rst: TIM1RST - - /// TIM8 reset - @ReadWrite(bits: 1..<2) - public var tim8rst: TIM8RST - - /// USART1 reset - @ReadWrite(bits: 4..<5) - public var usart1rst: USART1RST - - /// USART6 reset - @ReadWrite(bits: 5..<6) - public var usart6rst: USART6RST - - /// ADC interface reset (common to all ADCs) - @ReadWrite(bits: 8..<9) - public var adcrst: ADCRST - - /// SPI 1 reset - @ReadWrite(bits: 12..<13) - public var spi1rst: SPI1RST - - /// SPI4 reset - @ReadWrite(bits: 13..<14) - public var spi4rst: SPI4RST - - /// System configuration controller reset - @ReadWrite(bits: 14..<15) - public var syscfgrst: SYSCFGRST - - /// TIM9 reset - @ReadWrite(bits: 16..<17) - public var tim9rst: TIM9RST - - /// TIM10 reset - @ReadWrite(bits: 17..<18) - public var tim10rst: TIM10RST - - /// TIM11 reset - @ReadWrite(bits: 18..<19) - public var tim11rst: TIM11RST - - /// SPI5 reset - @ReadWrite(bits: 20..<21) - public var spi5rst: SPI5RST - - /// SPI6 reset - @ReadWrite(bits: 21..<22) - public var spi6rst: SPI6RST - - /// SAI1 reset - @ReadWrite(bits: 22..<23) - public var sai1rst: SAI1RST - - /// LTDC reset - @ReadWrite(bits: 26..<27) - public var ltdcrst: LTDCRST - - /// SAI2 reset - @ReadWrite(bits: 23..<24) - public var sai2rst: SAI2RST - - /// SDMMC1 reset - @ReadWrite(bits: 11..<12) - public var sdmmc1rst: SDMMC1RST - } - - /// AHB1 peripheral clock register - @Register(bitWidth: 32) - public struct AHB1ENR { - /// USB OTG HSULPI clock enable - @ReadWrite(bits: 30..<31) - public var otghsulpien: OTGHSULPIEN - - /// USB OTG HS clock enable - @ReadWrite(bits: 29..<30) - public var otghsen: OTGHSEN - - /// Ethernet PTP clock enable - @ReadWrite(bits: 28..<29) - public var ethmacptpen: ETHMACPTPEN - - /// Ethernet Reception clock enable - @ReadWrite(bits: 27..<28) - public var ethmacrxen: ETHMACRXEN - - /// Ethernet Transmission clock enable - @ReadWrite(bits: 26..<27) - public var ethmactxen: ETHMACTXEN - - /// Ethernet MAC clock enable - @ReadWrite(bits: 25..<26) - public var ethmacen: ETHMACEN - - /// DMA2D clock enable - @ReadWrite(bits: 23..<24) - public var dma2den: DMA2DEN - - /// DMA2 clock enable - @ReadWrite(bits: 22..<23) - public var dma2en: DMA2EN - - /// DMA1 clock enable - @ReadWrite(bits: 21..<22) - public var dma1en: DMA1EN - - /// CCM data RAM clock enable - @ReadWrite(bits: 20..<21) - public var dtcmramen: DTCMRAMEN - - /// Backup SRAM interface clock enable - @ReadWrite(bits: 18..<19) - public var bkpsramen: BKPSRAMEN - - /// CRC clock enable - @ReadWrite(bits: 12..<13) - public var crcen: CRCEN - - /// IO port K clock enable - @ReadWrite(bits: 10..<11) - public var gpioken: GPIOKEN - - /// IO port J clock enable - @ReadWrite(bits: 9..<10) - public var gpiojen: GPIOJEN - - /// IO port I clock enable - @ReadWrite(bits: 8..<9) - public var gpioien: GPIOIEN - - /// IO port H clock enable - @ReadWrite(bits: 7..<8) - public var gpiohen: GPIOHEN - - /// IO port G clock enable - @ReadWrite(bits: 6..<7) - public var gpiogen: GPIOGEN - - /// IO port F clock enable - @ReadWrite(bits: 5..<6) - public var gpiofen: GPIOFEN - - /// IO port E clock enable - @ReadWrite(bits: 4..<5) - public var gpioeen: GPIOEEN - - /// IO port D clock enable - @ReadWrite(bits: 3..<4) - public var gpioden: GPIODEN - - /// IO port C clock enable - @ReadWrite(bits: 2..<3) - public var gpiocen: GPIOCEN - - /// IO port B clock enable - @ReadWrite(bits: 1..<2) - public var gpioben: GPIOBEN - - /// IO port A clock enable - @ReadWrite(bits: 0..<1, as: GPIOAENValues.self) - public var gpioaen: GPIOAEN - } - - /// AHB2 peripheral clock enable register - @Register(bitWidth: 32) - public struct AHB2ENR { - /// USB OTG FS clock enable - @ReadWrite(bits: 7..<8) - public var otgfsen: OTGFSEN - - /// Random number generator clock enable - @ReadWrite(bits: 6..<7) - public var rngen: RNGEN - - /// Hash modules clock enable - @ReadWrite(bits: 5..<6) - public var hashen: HASHEN - - /// Cryptographic modules clock enable - @ReadWrite(bits: 4..<5) - public var crypen: CRYPEN - - /// Camera interface enable - @ReadWrite(bits: 0..<1, as: DCMIENValues.self) - public var dcmien: DCMIEN - } - - /// AHB3 peripheral clock enable register - @Register(bitWidth: 32) - public struct AHB3ENR { - /// Flexible memory controller module clock enable - @ReadWrite(bits: 0..<1, as: FMCENValues.self) - public var fmcen: FMCEN - - /// Quad SPI memory controller clock enable - @ReadWrite(bits: 1..<2) - public var qspien: QSPIEN - } - - /// APB1 peripheral clock enable register - @Register(bitWidth: 32) - public struct APB1ENR { - /// TIM2 clock enable - @ReadWrite(bits: 0..<1, as: TIM2ENValues.self) - public var tim2en: TIM2EN - - /// TIM3 clock enable - @ReadWrite(bits: 1..<2) - public var tim3en: TIM3EN - - /// TIM4 clock enable - @ReadWrite(bits: 2..<3) - public var tim4en: TIM4EN - - /// TIM5 clock enable - @ReadWrite(bits: 3..<4) - public var tim5en: TIM5EN - - /// TIM6 clock enable - @ReadWrite(bits: 4..<5) - public var tim6en: TIM6EN - - /// TIM7 clock enable - @ReadWrite(bits: 5..<6) - public var tim7en: TIM7EN - - /// TIM12 clock enable - @ReadWrite(bits: 6..<7) - public var tim12en: TIM12EN - - /// TIM13 clock enable - @ReadWrite(bits: 7..<8) - public var tim13en: TIM13EN - - /// TIM14 clock enable - @ReadWrite(bits: 8..<9) - public var tim14en: TIM14EN - - /// Window watchdog clock enable - @ReadWrite(bits: 11..<12) - public var wwdgen: WWDGEN - - /// SPI2 clock enable - @ReadWrite(bits: 14..<15) - public var spi2en: SPI2EN - - /// SPI3 clock enable - @ReadWrite(bits: 15..<16) - public var spi3en: SPI3EN - - /// USART 2 clock enable - @ReadWrite(bits: 17..<18) - public var usart2en: USART2EN - - /// USART3 clock enable - @ReadWrite(bits: 18..<19) - public var usart3en: USART3EN - - /// UART4 clock enable - @ReadWrite(bits: 19..<20) - public var uart4en: UART4EN - - /// UART5 clock enable - @ReadWrite(bits: 20..<21) - public var uart5en: UART5EN - - /// I2C1 clock enable - @ReadWrite(bits: 21..<22) - public var i2c1en: I2C1EN - - /// I2C2 clock enable - @ReadWrite(bits: 22..<23) - public var i2c2en: I2C2EN - - /// I2C3 clock enable - @ReadWrite(bits: 23..<24) - public var i2c3en: I2C3EN - - /// CAN 1 clock enable - @ReadWrite(bits: 25..<26) - public var can1en: CAN1EN - - /// CAN 2 clock enable - @ReadWrite(bits: 26..<27) - public var can2en: CAN2EN - - /// Power interface clock enable - @ReadWrite(bits: 28..<29) - public var pwren: PWREN - - /// DAC interface clock enable - @ReadWrite(bits: 29..<30) - public var dacen: DACEN - - /// UART7 clock enable - @ReadWrite(bits: 30..<31) - public var uart7en: UART7EN - - /// UART8 clock enable - @ReadWrite(bits: 31..<32) - public var uart8en: UART8EN - - /// SPDIF-RX clock enable - @ReadWrite(bits: 16..<17) - public var spdifrxen: SPDIFRXEN - - /// HDMI-CEN clock enable - @ReadWrite(bits: 27..<28) - public var cecen: CECEN - - /// Low power timer 1 clock enable - @ReadWrite(bits: 9..<10) - public var lptim1en: LPTIM1EN - - /// I2C4 clock enable - @ReadWrite(bits: 24..<25) - public var i2c4en: I2C4EN - } - - /// APB2 peripheral clock enable register - @Register(bitWidth: 32) - public struct APB2ENR { - /// TIM1 clock enable - @ReadWrite(bits: 0..<1, as: TIM1ENValues.self) - public var tim1en: TIM1EN - - /// TIM8 clock enable - @ReadWrite(bits: 1..<2) - public var tim8en: TIM8EN - - /// USART1 clock enable - @ReadWrite(bits: 4..<5) - public var usart1en: USART1EN - - /// USART6 clock enable - @ReadWrite(bits: 5..<6) - public var usart6en: USART6EN - - /// ADC1 clock enable - @ReadWrite(bits: 8..<9) - public var adc1en: ADC1EN - - /// ADC2 clock enable - @ReadWrite(bits: 9..<10) - public var adc2en: ADC2EN - - /// ADC3 clock enable - @ReadWrite(bits: 10..<11) - public var adc3en: ADC3EN - - /// SPI1 clock enable - @ReadWrite(bits: 12..<13) - public var spi1en: SPI1EN - - /// SPI4 clock enable - @ReadWrite(bits: 13..<14) - public var spi4en: SPI4EN - - /// System configuration controller clock enable - @ReadWrite(bits: 14..<15) - public var syscfgen: SYSCFGEN - - /// TIM9 clock enable - @ReadWrite(bits: 16..<17) - public var tim9en: TIM9EN - - /// TIM10 clock enable - @ReadWrite(bits: 17..<18) - public var tim10en: TIM10EN - - /// TIM11 clock enable - @ReadWrite(bits: 18..<19) - public var tim11en: TIM11EN - - /// SPI5 clock enable - @ReadWrite(bits: 20..<21) - public var spi5en: SPI5EN - - /// SPI6 clock enable - @ReadWrite(bits: 21..<22) - public var spi6en: SPI6EN - - /// SAI1 clock enable - @ReadWrite(bits: 22..<23) - public var sai1en: SAI1EN - - /// LTDC clock enable - @ReadWrite(bits: 26..<27) - public var ltdcen: LTDCEN - - /// SAI2 clock enable - @ReadWrite(bits: 23..<24) - public var sai2en: SAI2EN - - /// SDMMC1 clock enable - @ReadWrite(bits: 11..<12) - public var sdmmc1en: SDMMC1EN - } - - /// AHB1 peripheral clock enable in low power mode register - @Register(bitWidth: 32) - public struct AHB1LPENR { - /// IO port A clock enable during sleep mode - @ReadWrite(bits: 0..<1, as: GPIOALPENValues.self) - public var gpioalpen: GPIOALPEN - - /// IO port B clock enable during Sleep mode - @ReadWrite(bits: 1..<2) - public var gpioblpen: GPIOBLPEN - - /// IO port C clock enable during Sleep mode - @ReadWrite(bits: 2..<3) - public var gpioclpen: GPIOCLPEN - - /// IO port D clock enable during Sleep mode - @ReadWrite(bits: 3..<4) - public var gpiodlpen: GPIODLPEN - - /// IO port E clock enable during Sleep mode - @ReadWrite(bits: 4..<5) - public var gpioelpen: GPIOELPEN - - /// IO port F clock enable during Sleep mode - @ReadWrite(bits: 5..<6) - public var gpioflpen: GPIOFLPEN - - /// IO port G clock enable during Sleep mode - @ReadWrite(bits: 6..<7) - public var gpioglpen: GPIOGLPEN - - /// IO port H clock enable during Sleep mode - @ReadWrite(bits: 7..<8) - public var gpiohlpen: GPIOHLPEN - - /// IO port I clock enable during Sleep mode - @ReadWrite(bits: 8..<9) - public var gpioilpen: GPIOILPEN - - /// IO port J clock enable during Sleep mode - @ReadWrite(bits: 9..<10) - public var gpiojlpen: GPIOJLPEN - - /// IO port K clock enable during Sleep mode - @ReadWrite(bits: 10..<11) - public var gpioklpen: GPIOKLPEN - - /// CRC clock enable during Sleep mode - @ReadWrite(bits: 12..<13) - public var crclpen: CRCLPEN - - /// Flash interface clock enable during Sleep mode - @ReadWrite(bits: 15..<16) - public var flitflpen: FLITFLPEN - - /// SRAM 1interface clock enable during Sleep mode - @ReadWrite(bits: 16..<17) - public var sram1lpen: SRAM1LPEN - - /// SRAM 2 interface clock enable during Sleep mode - @ReadWrite(bits: 17..<18) - public var sram2lpen: SRAM2LPEN - - /// Backup SRAM interface clock enable during Sleep mode - @ReadWrite(bits: 18..<19) - public var bkpsramlpen: BKPSRAMLPEN - - /// SRAM 3 interface clock enable during Sleep mode - @ReadWrite(bits: 19..<20) - public var sram3lpen: SRAM3LPEN - - /// DMA1 clock enable during Sleep mode - @ReadWrite(bits: 21..<22) - public var dma1lpen: DMA1LPEN - - /// DMA2 clock enable during Sleep mode - @ReadWrite(bits: 22..<23) - public var dma2lpen: DMA2LPEN - - /// DMA2D clock enable during Sleep mode - @ReadWrite(bits: 23..<24) - public var dma2dlpen: DMA2DLPEN - - /// Ethernet MAC clock enable during Sleep mode - @ReadWrite(bits: 25..<26) - public var ethmaclpen: ETHMACLPEN - - /// Ethernet transmission clock enable during Sleep mode - @ReadWrite(bits: 26..<27) - public var ethmactxlpen: ETHMACTXLPEN - - /// Ethernet reception clock enable during Sleep mode - @ReadWrite(bits: 27..<28) - public var ethmacrxlpen: ETHMACRXLPEN - - /// Ethernet PTP clock enable during Sleep mode - @ReadWrite(bits: 28..<29) - public var ethmacptplpen: ETHMACPTPLPEN - - /// USB OTG HS clock enable during Sleep mode - @ReadWrite(bits: 29..<30) - public var otghslpen: OTGHSLPEN - - /// USB OTG HS ULPI clock enable during Sleep mode - @ReadWrite(bits: 30..<31) - public var otghsulpilpen: OTGHSULPILPEN - - /// AXI to AHB bridge clock enable during Sleep mode - @ReadWrite(bits: 13..<14) - public var axilpen: AXILPEN - - /// DTCM RAM interface clock enable during Sleep mode - @ReadWrite(bits: 20..<21) - public var dtcmlpen: DTCMLPEN - } - - /// AHB2 peripheral clock enable in low power mode register - @Register(bitWidth: 32) - public struct AHB2LPENR { - /// USB OTG FS clock enable during Sleep mode - @ReadWrite(bits: 7..<8) - public var otgfslpen: OTGFSLPEN - - /// Random number generator clock enable during Sleep mode - @ReadWrite(bits: 6..<7) - public var rnglpen: RNGLPEN - - /// Hash modules clock enable during Sleep mode - @ReadWrite(bits: 5..<6) - public var hashlpen: HASHLPEN - - /// Cryptography modules clock enable during Sleep mode - @ReadWrite(bits: 4..<5) - public var cryplpen: CRYPLPEN - - /// Camera interface enable during Sleep mode - @ReadWrite(bits: 0..<1, as: DCMILPENValues.self) - public var dcmilpen: DCMILPEN - } - - /// AHB3 peripheral clock enable in low power mode register - @Register(bitWidth: 32) - public struct AHB3LPENR { - /// Flexible memory controller module clock enable during Sleep mode - @ReadWrite(bits: 0..<1, as: FMCLPENValues.self) - public var fmclpen: FMCLPEN - - /// Quand SPI memory controller clock enable during Sleep mode - @ReadWrite(bits: 1..<2) - public var qspilpen: QSPILPEN - } - - /// APB1 peripheral clock enable in low power mode register - @Register(bitWidth: 32) - public struct APB1LPENR { - /// TIM2 clock enable during Sleep mode - @ReadWrite(bits: 0..<1, as: TIM2LPENValues.self) - public var tim2lpen: TIM2LPEN - - /// TIM3 clock enable during Sleep mode - @ReadWrite(bits: 1..<2) - public var tim3lpen: TIM3LPEN - - /// TIM4 clock enable during Sleep mode - @ReadWrite(bits: 2..<3) - public var tim4lpen: TIM4LPEN - - /// TIM5 clock enable during Sleep mode - @ReadWrite(bits: 3..<4) - public var tim5lpen: TIM5LPEN - - /// TIM6 clock enable during Sleep mode - @ReadWrite(bits: 4..<5) - public var tim6lpen: TIM6LPEN - - /// TIM7 clock enable during Sleep mode - @ReadWrite(bits: 5..<6) - public var tim7lpen: TIM7LPEN - - /// TIM12 clock enable during Sleep mode - @ReadWrite(bits: 6..<7) - public var tim12lpen: TIM12LPEN - - /// TIM13 clock enable during Sleep mode - @ReadWrite(bits: 7..<8) - public var tim13lpen: TIM13LPEN - - /// TIM14 clock enable during Sleep mode - @ReadWrite(bits: 8..<9) - public var tim14lpen: TIM14LPEN - - /// Window watchdog clock enable during Sleep mode - @ReadWrite(bits: 11..<12) - public var wwdglpen: WWDGLPEN - - /// SPI2 clock enable during Sleep mode - @ReadWrite(bits: 14..<15) - public var spi2lpen: SPI2LPEN - - /// SPI3 clock enable during Sleep mode - @ReadWrite(bits: 15..<16) - public var spi3lpen: SPI3LPEN - - /// USART2 clock enable during Sleep mode - @ReadWrite(bits: 17..<18) - public var usart2lpen: USART2LPEN - - /// USART3 clock enable during Sleep mode - @ReadWrite(bits: 18..<19) - public var usart3lpen: USART3LPEN - - /// UART4 clock enable during Sleep mode - @ReadWrite(bits: 19..<20) - public var uart4lpen: UART4LPEN - - /// UART5 clock enable during Sleep mode - @ReadWrite(bits: 20..<21) - public var uart5lpen: UART5LPEN - - /// I2C1 clock enable during Sleep mode - @ReadWrite(bits: 21..<22) - public var i2c1lpen: I2C1LPEN - - /// I2C2 clock enable during Sleep mode - @ReadWrite(bits: 22..<23) - public var i2c2lpen: I2C2LPEN - - /// I2C3 clock enable during Sleep mode - @ReadWrite(bits: 23..<24) - public var i2c3lpen: I2C3LPEN - - /// CAN 1 clock enable during Sleep mode - @ReadWrite(bits: 25..<26) - public var can1lpen: CAN1LPEN - - /// CAN 2 clock enable during Sleep mode - @ReadWrite(bits: 26..<27) - public var can2lpen: CAN2LPEN - - /// Power interface clock enable during Sleep mode - @ReadWrite(bits: 28..<29) - public var pwrlpen: PWRLPEN - - /// DAC interface clock enable during Sleep mode - @ReadWrite(bits: 29..<30) - public var daclpen: DACLPEN - - /// UART7 clock enable during Sleep mode - @ReadWrite(bits: 30..<31) - public var uart7lpen: UART7LPEN - - /// UART8 clock enable during Sleep mode - @ReadWrite(bits: 31..<32) - public var uart8lpen: UART8LPEN - - /// SPDIF-RX clock enable during sleep mode - @ReadWrite(bits: 16..<17) - public var spdifrxlpen: SPDIFRXLPEN - - /// HDMI-CEN clock enable during Sleep mode - @ReadWrite(bits: 27..<28) - public var ceclpen: CECLPEN - - /// low power timer 1 clock enable during Sleep mode - @ReadWrite(bits: 9..<10) - public var lptim1lpen: LPTIM1LPEN - - /// I2C4 clock enable during Sleep mode - @ReadWrite(bits: 24..<25) - public var i2c4lpen: I2C4LPEN - } - - /// APB2 peripheral clock enabled in low power mode register - @Register(bitWidth: 32) - public struct APB2LPENR { - /// TIM1 clock enable during Sleep mode - @ReadWrite(bits: 0..<1, as: TIM1LPENValues.self) - public var tim1lpen: TIM1LPEN - - /// TIM8 clock enable during Sleep mode - @ReadWrite(bits: 1..<2) - public var tim8lpen: TIM8LPEN - - /// USART1 clock enable during Sleep mode - @ReadWrite(bits: 4..<5) - public var usart1lpen: USART1LPEN - - /// USART6 clock enable during Sleep mode - @ReadWrite(bits: 5..<6) - public var usart6lpen: USART6LPEN - - /// ADC1 clock enable during Sleep mode - @ReadWrite(bits: 8..<9) - public var adc1lpen: ADC1LPEN - - /// ADC2 clock enable during Sleep mode - @ReadWrite(bits: 9..<10) - public var adc2lpen: ADC2LPEN - - /// ADC 3 clock enable during Sleep mode - @ReadWrite(bits: 10..<11) - public var adc3lpen: ADC3LPEN - - /// SPI 1 clock enable during Sleep mode - @ReadWrite(bits: 12..<13) - public var spi1lpen: SPI1LPEN - - /// SPI 4 clock enable during Sleep mode - @ReadWrite(bits: 13..<14) - public var spi4lpen: SPI4LPEN - - /// System configuration controller clock enable during Sleep mode - @ReadWrite(bits: 14..<15) - public var syscfglpen: SYSCFGLPEN - - /// TIM9 clock enable during sleep mode - @ReadWrite(bits: 16..<17) - public var tim9lpen: TIM9LPEN - - /// TIM10 clock enable during Sleep mode - @ReadWrite(bits: 17..<18) - public var tim10lpen: TIM10LPEN - - /// TIM11 clock enable during Sleep mode - @ReadWrite(bits: 18..<19) - public var tim11lpen: TIM11LPEN - - /// SPI 5 clock enable during Sleep mode - @ReadWrite(bits: 20..<21) - public var spi5lpen: SPI5LPEN - - /// SPI 6 clock enable during Sleep mode - @ReadWrite(bits: 21..<22) - public var spi6lpen: SPI6LPEN - - /// SAI1 clock enable during sleep mode - @ReadWrite(bits: 22..<23) - public var sai1lpen: SAI1LPEN - - /// LTDC clock enable during sleep mode - @ReadWrite(bits: 26..<27) - public var ltdclpen: LTDCLPEN - - /// SAI2 clock enable during sleep mode - @ReadWrite(bits: 23..<24) - public var sai2lpen: SAI2LPEN - - /// SDMMC1 clock enable during Sleep mode - @ReadWrite(bits: 11..<12) - public var sdmmc1lpen: SDMMC1LPEN - } - - /// Backup domain control register - @Register(bitWidth: 32) - public struct BDCR { - /// Backup domain software reset - @ReadWrite(bits: 16..<17, as: BDRSTValues.self) - public var bdrst: BDRST - - /// RTC clock enable - @ReadWrite(bits: 15..<16, as: RTCENValues.self) - public var rtcen: RTCEN - - /// External low-speed oscillator bypass - @ReadWrite(bits: 2..<3, as: LSEBYPValues.self) - public var lsebyp: LSEBYP - - /// External low-speed oscillator ready - @ReadOnly(bits: 1..<2) - public var lserdy: LSERDY - - /// External low-speed oscillator enable - @ReadWrite(bits: 0..<1, as: LSEONValues.self) - public var lseon: LSEON - - /// LSE oscillator drive capability - @ReadWrite(bits: 3..<5, as: LSEDRVValues.self) - public var lsedrv: LSEDRV - - /// RTC clock source selection - @Reserved(bits: 8..<10, as: RTCSELValues.self) - public var rtcsel: RTCSEL - } - - /// clock control & status register - @Register(bitWidth: 32) - public struct CSR { - /// Low-power reset flag - @ReadWrite(bits: 31..<32) - public var lpwrrstf: LPWRRSTF - - /// Window watchdog reset flag - @ReadWrite(bits: 30..<31) - public var wwdgrstf: WWDGRSTF - - /// Independent watchdog reset flag - @ReadWrite(bits: 29..<30) - public var wdgrstf: WDGRSTF - - /// Software reset flag - @ReadWrite(bits: 28..<29) - public var sftrstf: SFTRSTF - - /// POR/PDR reset flag - @ReadWrite(bits: 27..<28) - public var porrstf: PORRSTF - - /// PIN reset flag - @ReadWrite(bits: 26..<27) - public var padrstf: PADRSTF - - /// BOR reset flag - @ReadWrite(bits: 25..<26) - public var borrstf: BORRSTF - - /// Remove reset flag - @ReadWrite(bits: 24..<25) - public var rmvf: RMVF - - /// Internal low-speed oscillator ready - @ReadOnly(bits: 1..<2) - public var lsirdy: LSIRDY - - /// Internal low-speed oscillator enable - @ReadWrite(bits: 0..<1, as: LSIONValues.self) - public var lsion: LSION - } - - /// spread spectrum clock generation register - @Register(bitWidth: 32) - public struct SSCGR { - /// Spread spectrum modulation enable - @ReadWrite(bits: 31..<32, as: SSCGENValues.self) - public var sscgen: SSCGEN - - /// Spread Select - @ReadWrite(bits: 30..<31, as: SPREADSELValues.self) - public var spreadsel: SPREADSEL - - /// Incrementation step - @ReadWrite(bits: 13..<28) - public var incstep: INCSTEP - - /// Modulation period - @ReadWrite(bits: 0..<13) - public var modper: MODPER - } - - /// PLLI2S configuration register - @Register(bitWidth: 32) - public struct PLLI2SCFGR { - /// PLLI2S division factor for I2S clocks - @ReadWrite(bits: 28..<31) - public var plli2sr: PLLI2SR - - /// PLLI2S division factor for SAI1 clock - @ReadWrite(bits: 24..<28) - public var plli2sq: PLLI2SQ - - /// PLLI2S multiplication factor for VCO - @ReadWrite(bits: 6..<15) - public var plli2sn: PLLI2SN - - /// PLLI2S division factor for SPDIFRX clock - @ReadWrite(bits: 16..<18, as: PLLI2SPValues.self) - public var plli2sp: PLLI2SP - } - - /// PLL configuration register - @Register(bitWidth: 32) - public struct PLLSAICFGR { - /// PLLSAI division factor for VCO - @ReadWrite(bits: 6..<15) - public var pllsain: PLLSAIN - - /// PLLSAI division factor for 48MHz clock - @ReadWrite(bits: 16..<18, as: PLLSAIPValues.self) - public var pllsaip: PLLSAIP - - /// PLLSAI division factor for SAI clock - @ReadWrite(bits: 24..<28) - public var pllsaiq: PLLSAIQ - - /// PLLSAI division factor for LCD clock - @ReadWrite(bits: 28..<31) - public var pllsair: PLLSAIR - } - - /// dedicated clocks configuration register - @Register(bitWidth: 32) - public struct DCKCFGR1 { - /// PLLI2S division factor for SAI1 clock - @ReadWrite(bits: 0..<5, as: PLLI2SDIVQValues.self) - public var plli2sdivq: PLLI2SDIVQ - - /// PLLSAI division factor for SAI1 clock - @ReadWrite(bits: 8..<13, as: PLLSAIDIVQValues.self) - public var pllsaidivq: PLLSAIDIVQ - - /// division factor for LCD_CLK - @ReadWrite(bits: 16..<18, as: PLLSAIDIVRValues.self) - public var pllsaidivr: PLLSAIDIVR - - /// SAI1 clock source selection - @ReadWrite(bits: 20..<22, as: SAI1SELValues.self) - public var sai1sel: SAI1SEL - - /// SAI2 clock source selection - @ReadWrite(bits: 22..<24, as: SAI2SELValues.self) - public var sai2sel: SAI2SEL - - /// Timers clocks prescalers selection - @ReadWrite(bits: 24..<25, as: TIMPREValues.self) - public var timpre: TIMPRE - } - - /// dedicated clocks configuration register - @Register(bitWidth: 32) - public struct DCKCFGR2 { - /// USART 1 clock source selection - @ReadWrite(bits: 0..<2, as: USART1SELValues.self) - public var usart1sel: USART1SEL - - /// USART 2 clock source selection - @ReadWrite(bits: 2..<4, as: USART2SELValues.self) - public var usart2sel: USART2SEL - - /// USART 3 clock source selection - @ReadWrite(bits: 4..<6) - public var usart3sel: USART3SEL - - /// UART 4 clock source selection - @ReadWrite(bits: 6..<8) - public var uart4sel: UART4SEL - - /// UART 5 clock source selection - @ReadWrite(bits: 8..<10) - public var uart5sel: UART5SEL - - /// USART 6 clock source selection - @ReadWrite(bits: 10..<12) - public var usart6sel: USART6SEL - - /// UART 7 clock source selection - @ReadWrite(bits: 12..<14) - public var uart7sel: UART7SEL - - /// UART 8 clock source selection - @ReadWrite(bits: 14..<16) - public var uart8sel: UART8SEL - - /// I2C1 clock source selection - @ReadWrite(bits: 16..<18, as: I2C1SELValues.self) - public var i2c1sel: I2C1SEL - - /// I2C2 clock source selection - @ReadWrite(bits: 18..<20) - public var i2c2sel: I2C2SEL - - /// I2C3 clock source selection - @ReadWrite(bits: 20..<22) - public var i2c3sel: I2C3SEL - - /// I2C4 clock source selection - @ReadWrite(bits: 22..<24) - public var i2c4sel: I2C4SEL - - /// Low power timer 1 clock source selection - @ReadWrite(bits: 24..<26, as: LPTIM1SELValues.self) - public var lptim1sel: LPTIM1SEL - - /// HDMI-CEC clock source selection - @ReadWrite(bits: 26..<27, as: CECSELValues.self) - public var cecsel: CECSEL - - /// 48MHz clock source selection - @ReadWrite(bits: 27..<28, as: CK48MSELValues.self) - public var ck48msel: CK48MSEL - - /// SDMMC clock source selection - @ReadWrite(bits: 28..<29, as: SDMMC1SELValues.self) - public var sdmmc1sel: SDMMC1SEL - } -} - -extension RCC.CR { - public struct CSSONValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Clock security system disabled (clock detector OFF) - public static let Off = Self(rawValue: 0x0) - - /// Clock security system enable (clock detector ON if the HSE is ready, OFF if not) - public static let On = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.CR { - public struct HSEBYPValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// HSE crystal oscillator not bypassed - public static let NotBypassed = Self(rawValue: 0x0) - - /// HSE crystal oscillator bypassed with external clock - public static let Bypassed = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.CR { - public struct HSIONValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Clock Off - public static let Off = Self(rawValue: 0x0) - - /// Clock On - public static let On = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.PLLCFGR { - public struct PLLSRCValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// HSI clock selected as PLL and PLLI2S clock entry - public static let HSI = Self(rawValue: 0x0) - - /// HSE oscillator clock selected as PLL and PLLI2S clock entry - public static let HSE = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.PLLCFGR { - public struct PLLPValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// PLLP=2 - public static let Div2 = Self(rawValue: 0x0) - - /// PLLP=4 - public static let Div4 = Self(rawValue: 0x1) - - /// PLLP=6 - public static let Div6 = Self(rawValue: 0x2) - - /// PLLP=8 - public static let Div8 = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.CFGR { - public struct MCO2Values: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// System clock (SYSCLK) selected - public static let SYSCLK = Self(rawValue: 0x0) - - /// PLLI2S clock selected - public static let PLLI2S = Self(rawValue: 0x1) - - /// HSE oscillator clock selected - public static let HSE = Self(rawValue: 0x2) - - /// PLL clock selected - public static let PLL = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.CFGR { - public struct MCO1PREValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 3 - - /// No division - public static let Div1 = Self(rawValue: 0x0) - - /// Division by 2 - public static let Div2 = Self(rawValue: 0x4) - - /// Division by 3 - public static let Div3 = Self(rawValue: 0x5) - - /// Division by 4 - public static let Div4 = Self(rawValue: 0x6) - - /// Division by 5 - public static let Div5 = Self(rawValue: 0x7) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.CFGR { - public struct I2SSRCValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// PLLI2S clock used as I2S clock source - public static let PLLI2S = Self(rawValue: 0x0) - - /// External clock mapped on the I2S_CKIN pin used as I2S clock source - public static let CKIN = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.CFGR { - public struct MCO1Values: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// HSI clock selected - public static let HSI = Self(rawValue: 0x0) - - /// LSE oscillator selected - public static let LSE = Self(rawValue: 0x1) - - /// HSE oscillator clock selected - public static let HSE = Self(rawValue: 0x2) - - /// PLL clock selected - public static let PLL = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.CFGR { - public struct PPRE1Values: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 3 - - /// HCLK not divided - public static let Div1 = Self(rawValue: 0x0) - - /// HCLK divided by 2 - public static let Div2 = Self(rawValue: 0x4) - - /// HCLK divided by 4 - public static let Div4 = Self(rawValue: 0x5) - - /// HCLK divided by 8 - public static let Div8 = Self(rawValue: 0x6) - - /// HCLK divided by 16 - public static let Div16 = Self(rawValue: 0x7) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.CFGR { - public struct HPREValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 4 - - /// SYSCLK not divided - public static let Div1 = Self(rawValue: 0x0) - - /// SYSCLK divided by 2 - public static let Div2 = Self(rawValue: 0x8) - - /// SYSCLK divided by 4 - public static let Div4 = Self(rawValue: 0x9) - - /// SYSCLK divided by 8 - public static let Div8 = Self(rawValue: 0xa) - - /// SYSCLK divided by 16 - public static let Div16 = Self(rawValue: 0xb) - - /// SYSCLK divided by 64 - public static let Div64 = Self(rawValue: 0xc) - - /// SYSCLK divided by 128 - public static let Div128 = Self(rawValue: 0xd) - - /// SYSCLK divided by 256 - public static let Div256 = Self(rawValue: 0xe) - - /// SYSCLK divided by 512 - public static let Div512 = Self(rawValue: 0xf) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.CFGR { - public struct SWValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// HSI selected as system clock - public static let HSI = Self(rawValue: 0x0) - - /// HSE selected as system clock - public static let HSE = Self(rawValue: 0x1) - - /// PLL selected as system clock - public static let PLL = Self(rawValue: 0x2) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.CIR { - public struct LSIRDYIEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Interrupt disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Interrupt enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.AHB1RSTR { - public struct GPIOARSTValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Reset the selected module - public static let Reset = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.AHB2RSTR { - public struct DCMIRSTValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Reset the selected module - public static let Reset = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.AHB3RSTR { - public struct FMCRSTValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Reset the selected module - public static let Reset = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.APB1RSTR { - public struct TIM2RSTValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Reset the selected module - public static let Reset = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.APB2RSTR { - public struct TIM1RSTValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Reset the selected module - public static let Reset = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.AHB1ENR { - public struct GPIOAENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// The selected clock is disabled - public static let Disabled = Self(rawValue: 0x0) - - /// The selected clock is enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.AHB2ENR { - public struct DCMIENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// The selected clock is disabled - public static let Disabled = Self(rawValue: 0x0) - - /// The selected clock is enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.AHB3ENR { - public struct FMCENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// The selected clock is disabled - public static let Disabled = Self(rawValue: 0x0) - - /// The selected clock is enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.APB1ENR { - public struct TIM2ENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// The selected clock is disabled - public static let Disabled = Self(rawValue: 0x0) - - /// The selected clock is enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.APB2ENR { - public struct TIM1ENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// The selected clock is disabled - public static let Disabled = Self(rawValue: 0x0) - - /// The selected clock is enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.AHB1LPENR { - public struct GPIOALPENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Selected module is disabled during Sleep mode - public static let DisabledInSleep = Self(rawValue: 0x0) - - /// Selected module is enabled during Sleep mode - public static let EnabledInSleep = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.AHB2LPENR { - public struct DCMILPENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Selected module is disabled during Sleep mode - public static let DisabledInSleep = Self(rawValue: 0x0) - - /// Selected module is enabled during Sleep mode - public static let EnabledInSleep = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.AHB3LPENR { - public struct FMCLPENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Selected module is disabled during Sleep mode - public static let DisabledInSleep = Self(rawValue: 0x0) - - /// Selected module is enabled during Sleep mode - public static let EnabledInSleep = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.APB1LPENR { - public struct TIM2LPENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Selected module is disabled during Sleep mode - public static let DisabledInSleep = Self(rawValue: 0x0) - - /// Selected module is enabled during Sleep mode - public static let EnabledInSleep = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.APB2LPENR { - public struct TIM1LPENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Selected module is disabled during Sleep mode - public static let DisabledInSleep = Self(rawValue: 0x0) - - /// Selected module is enabled during Sleep mode - public static let EnabledInSleep = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.BDCR { - public struct BDRSTValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Reset not activated - public static let Disabled = Self(rawValue: 0x0) - - /// Reset the entire RTC domain - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.BDCR { - public struct RTCENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// RTC clock disabled - public static let Disabled = Self(rawValue: 0x0) - - /// RTC clock enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.BDCR { - public struct LSEBYPValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// LSE crystal oscillator not bypassed - public static let NotBypassed = Self(rawValue: 0x0) - - /// LSE crystal oscillator bypassed with external clock - public static let Bypassed = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.BDCR { - public struct LSEONValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// LSE oscillator Off - public static let Off = Self(rawValue: 0x0) - - /// LSE oscillator On - public static let On = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.BDCR { - public struct LSEDRVValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// Low drive capacity - public static let Low = Self(rawValue: 0x0) - - /// Medium-high drive capacity - public static let MediumHigh = Self(rawValue: 0x1) - - /// Medium-low drive capacity - public static let MediumLow = Self(rawValue: 0x2) - - /// High drive capacity - public static let High = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.BDCR { - public struct RTCSELValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// No clock - public static let NoClock = Self(rawValue: 0x0) - - /// LSE oscillator clock used as RTC clock - public static let LSE = Self(rawValue: 0x1) - - /// LSI oscillator clock used as RTC clock - public static let LSI = Self(rawValue: 0x2) - - /// HSE oscillator clock divided by a prescaler used as RTC clock - public static let HSE = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.CSR { - public struct LSIONValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// LSI oscillator Off - public static let Off = Self(rawValue: 0x0) - - /// LSI oscillator On - public static let On = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.SSCGR { - public struct SSCGENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Spread spectrum modulation disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Spread spectrum modulation enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.SSCGR { - public struct SPREADSELValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Center spread - public static let Center = Self(rawValue: 0x0) - - /// Down spread - public static let Down = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.PLLI2SCFGR { - public struct PLLI2SPValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// PLL*P=2 - public static let Div2 = Self(rawValue: 0x0) - - /// PLL*P=4 - public static let Div4 = Self(rawValue: 0x1) - - /// PLL*P=6 - public static let Div6 = Self(rawValue: 0x2) - - /// PLL*P=8 - public static let Div8 = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.PLLSAICFGR { - public struct PLLSAIPValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// PLL*P=2 - public static let Div2 = Self(rawValue: 0x0) - - /// PLL*P=4 - public static let Div4 = Self(rawValue: 0x1) - - /// PLL*P=6 - public static let Div6 = Self(rawValue: 0x2) - - /// PLL*P=8 - public static let Div8 = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.DCKCFGR1 { - public struct PLLI2SDIVQValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 5 - - /// PLLI2SDIVQ = /1 - public static let Div1 = Self(rawValue: 0x0) - - /// PLLI2SDIVQ = /2 - public static let Div2 = Self(rawValue: 0x1) - - /// PLLI2SDIVQ = /3 - public static let Div3 = Self(rawValue: 0x2) - - /// PLLI2SDIVQ = /4 - public static let Div4 = Self(rawValue: 0x3) - - /// PLLI2SDIVQ = /5 - public static let Div5 = Self(rawValue: 0x4) - - /// PLLI2SDIVQ = /6 - public static let Div6 = Self(rawValue: 0x5) - - /// PLLI2SDIVQ = /7 - public static let Div7 = Self(rawValue: 0x6) - - /// PLLI2SDIVQ = /8 - public static let Div8 = Self(rawValue: 0x7) - - /// PLLI2SDIVQ = /9 - public static let Div9 = Self(rawValue: 0x8) - - /// PLLI2SDIVQ = /10 - public static let Div10 = Self(rawValue: 0x9) - - /// PLLI2SDIVQ = /11 - public static let Div11 = Self(rawValue: 0xa) - - /// PLLI2SDIVQ = /12 - public static let Div12 = Self(rawValue: 0xb) - - /// PLLI2SDIVQ = /13 - public static let Div13 = Self(rawValue: 0xc) - - /// PLLI2SDIVQ = /14 - public static let Div14 = Self(rawValue: 0xd) - - /// PLLI2SDIVQ = /15 - public static let Div15 = Self(rawValue: 0xe) - - /// PLLI2SDIVQ = /16 - public static let Div16 = Self(rawValue: 0xf) - - /// PLLI2SDIVQ = /17 - public static let Div17 = Self(rawValue: 0x10) - - /// PLLI2SDIVQ = /18 - public static let Div18 = Self(rawValue: 0x11) - - /// PLLI2SDIVQ = /19 - public static let Div19 = Self(rawValue: 0x12) - - /// PLLI2SDIVQ = /20 - public static let Div20 = Self(rawValue: 0x13) - - /// PLLI2SDIVQ = /21 - public static let Div21 = Self(rawValue: 0x14) - - /// PLLI2SDIVQ = /22 - public static let Div22 = Self(rawValue: 0x15) - - /// PLLI2SDIVQ = /23 - public static let Div23 = Self(rawValue: 0x16) - - /// PLLI2SDIVQ = /24 - public static let Div24 = Self(rawValue: 0x17) - - /// PLLI2SDIVQ = /25 - public static let Div25 = Self(rawValue: 0x18) - - /// PLLI2SDIVQ = /26 - public static let Div26 = Self(rawValue: 0x19) - - /// PLLI2SDIVQ = /27 - public static let Div27 = Self(rawValue: 0x1a) - - /// PLLI2SDIVQ = /28 - public static let Div28 = Self(rawValue: 0x1b) - - /// PLLI2SDIVQ = /29 - public static let Div29 = Self(rawValue: 0x1c) - - /// PLLI2SDIVQ = /30 - public static let Div30 = Self(rawValue: 0x1d) - - /// PLLI2SDIVQ = /31 - public static let Div31 = Self(rawValue: 0x1e) - - /// PLLI2SDIVQ = /32 - public static let Div32 = Self(rawValue: 0x1f) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.DCKCFGR1 { - public struct PLLSAIDIVQValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 5 - - /// PLLSAIDIVQ = /1 - public static let Div1 = Self(rawValue: 0x0) - - /// PLLSAIDIVQ = /2 - public static let Div2 = Self(rawValue: 0x1) - - /// PLLSAIDIVQ = /3 - public static let Div3 = Self(rawValue: 0x2) - - /// PLLSAIDIVQ = /4 - public static let Div4 = Self(rawValue: 0x3) - - /// PLLSAIDIVQ = /5 - public static let Div5 = Self(rawValue: 0x4) - - /// PLLSAIDIVQ = /6 - public static let Div6 = Self(rawValue: 0x5) - - /// PLLSAIDIVQ = /7 - public static let Div7 = Self(rawValue: 0x6) - - /// PLLSAIDIVQ = /8 - public static let Div8 = Self(rawValue: 0x7) - - /// PLLSAIDIVQ = /9 - public static let Div9 = Self(rawValue: 0x8) - - /// PLLSAIDIVQ = /10 - public static let Div10 = Self(rawValue: 0x9) - - /// PLLSAIDIVQ = /11 - public static let Div11 = Self(rawValue: 0xa) - - /// PLLSAIDIVQ = /12 - public static let Div12 = Self(rawValue: 0xb) - - /// PLLSAIDIVQ = /13 - public static let Div13 = Self(rawValue: 0xc) - - /// PLLSAIDIVQ = /14 - public static let Div14 = Self(rawValue: 0xd) - - /// PLLSAIDIVQ = /15 - public static let Div15 = Self(rawValue: 0xe) - - /// PLLSAIDIVQ = /16 - public static let Div16 = Self(rawValue: 0xf) - - /// PLLSAIDIVQ = /17 - public static let Div17 = Self(rawValue: 0x10) - - /// PLLSAIDIVQ = /18 - public static let Div18 = Self(rawValue: 0x11) - - /// PLLSAIDIVQ = /19 - public static let Div19 = Self(rawValue: 0x12) - - /// PLLSAIDIVQ = /20 - public static let Div20 = Self(rawValue: 0x13) - - /// PLLSAIDIVQ = /21 - public static let Div21 = Self(rawValue: 0x14) - - /// PLLSAIDIVQ = /22 - public static let Div22 = Self(rawValue: 0x15) - - /// PLLSAIDIVQ = /23 - public static let Div23 = Self(rawValue: 0x16) - - /// PLLSAIDIVQ = /24 - public static let Div24 = Self(rawValue: 0x17) - - /// PLLSAIDIVQ = /25 - public static let Div25 = Self(rawValue: 0x18) - - /// PLLSAIDIVQ = /26 - public static let Div26 = Self(rawValue: 0x19) - - /// PLLSAIDIVQ = /27 - public static let Div27 = Self(rawValue: 0x1a) - - /// PLLSAIDIVQ = /28 - public static let Div28 = Self(rawValue: 0x1b) - - /// PLLSAIDIVQ = /29 - public static let Div29 = Self(rawValue: 0x1c) - - /// PLLSAIDIVQ = /30 - public static let Div30 = Self(rawValue: 0x1d) - - /// PLLSAIDIVQ = /31 - public static let Div31 = Self(rawValue: 0x1e) - - /// PLLSAIDIVQ = /32 - public static let Div32 = Self(rawValue: 0x1f) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.DCKCFGR1 { - public struct PLLSAIDIVRValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// PLLSAIDIVR = /2 - public static let Div2 = Self(rawValue: 0x0) - - /// PLLSAIDIVR = /4 - public static let Div4 = Self(rawValue: 0x1) - - /// PLLSAIDIVR = /8 - public static let Div8 = Self(rawValue: 0x2) - - /// PLLSAIDIVR = /16 - public static let Div16 = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.DCKCFGR1 { - public struct SAI1SELValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// SAI1 clock frequency = f(PLLSAI_Q) / PLLSAIDIVQ - public static let PLLSAI = Self(rawValue: 0x0) - - /// SAI1 clock frequency = f(PLLI2S_Q) / PLLI2SDIVQ - public static let PLLI2S = Self(rawValue: 0x1) - - /// SAI1 clock frequency = Alternate function input frequency - public static let AFIF = Self(rawValue: 0x2) - - /// SAI1 clock frequency = HSI or HSE - public static let HSI_HSE = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.DCKCFGR1 { - public struct SAI2SELValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// SAI2 clock frequency = f(PLLSAI_Q) / PLLSAIDIVQ - public static let PLLSAI = Self(rawValue: 0x0) - - /// SAI2 clock frequency = f(PLLI2S_Q) / PLLI2SDIVQ - public static let PLLI2S = Self(rawValue: 0x1) - - /// SAI2 clock frequency = Alternate function input frequency - public static let AFIF = Self(rawValue: 0x2) - - /// SAI2 clock frequency = HSI or HSE - public static let HSI_HSE = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.DCKCFGR1 { - public struct TIMPREValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// If the APB prescaler is configured 1, TIMxCLK = PCLKx. Otherwise, TIMxCLK = 2xPCLKx - public static let Mul1Or2 = Self(rawValue: 0x0) - - /// If the APB prescaler is configured 1, 2 or 4, TIMxCLK = HCLK. Otherwise, TIMxCLK = 4xPCLKx - public static let Mul1Or4 = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.DCKCFGR2 { - public struct USART1SELValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// APB2 clock (PCLK2) is selected as USART clock - public static let APB2 = Self(rawValue: 0x0) - - /// System clock is selected as USART clock - public static let SYSCLK = Self(rawValue: 0x1) - - /// HSI clock is selected as USART clock - public static let HSI = Self(rawValue: 0x2) - - /// LSE clock is selected as USART clock - public static let LSE = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.DCKCFGR2 { - public struct USART2SELValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// APB1 clock (PCLK1) is selected as USART clock - public static let APB1 = Self(rawValue: 0x0) - - /// System clock is selected as USART clock - public static let SYSCLK = Self(rawValue: 0x1) - - /// HSI clock is selected as USART clock - public static let HSI = Self(rawValue: 0x2) - - /// LSE clock is selected as USART clock - public static let LSE = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.DCKCFGR2 { - public struct I2C1SELValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// APB clock selected as I2C clock - public static let APB = Self(rawValue: 0x0) - - /// System clock selected as I2C clock - public static let SYSCLK = Self(rawValue: 0x1) - - /// HSI clock selected as I2C clock - public static let HSI = Self(rawValue: 0x2) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.DCKCFGR2 { - public struct LPTIM1SELValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// APB1 clock (PCLK1) selected as LPTILM1 clock - public static let APB1 = Self(rawValue: 0x0) - - /// LSI clock is selected as LPTILM1 clock - public static let LSI = Self(rawValue: 0x1) - - /// HSI clock is selected as LPTILM1 clock - public static let HSI = Self(rawValue: 0x2) - - /// LSE clock is selected as LPTILM1 clock - public static let LSE = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.DCKCFGR2 { - public struct CECSELValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// LSE clock is selected as HDMI-CEC clock - public static let LSE = Self(rawValue: 0x0) - - /// HSI divided by 488 clock is selected as HDMI-CEC clock - public static let HSI_Div488 = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.DCKCFGR2 { - public struct CK48MSELValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// 48MHz clock from PLL is selected - public static let PLL = Self(rawValue: 0x0) - - /// 48MHz clock from PLLSAI is selected - public static let PLLSAI = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.DCKCFGR2 { - public struct SDMMC1SELValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// 48 MHz clock is selected as SD clock - public static let CK48M = Self(rawValue: 0x0) - - /// System clock is selected as SD clock - public static let SYSCLK = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} diff --git a/stm32-lvgl/Sources/Registers/SCB.swift b/stm32-lvgl/Sources/Registers/SCB.swift deleted file mode 100644 index 08a12aeb..00000000 --- a/stm32-lvgl/Sources/Registers/SCB.swift +++ /dev/null @@ -1,429 +0,0 @@ -// Generated by svd2swift. - -import MMIO - -/// System control block -@RegisterBlock -public struct SCB { - /// CPUID base register - @RegisterBlock(offset: 0x0) - public var cpuid: Register - - /// Interrupt control and state register - @RegisterBlock(offset: 0x4) - public var icsr: Register - - /// Vector table offset register - @RegisterBlock(offset: 0x8) - public var vtor: Register - - /// Application interrupt and reset control register - @RegisterBlock(offset: 0xc) - public var aircr: Register - - /// System control register - @RegisterBlock(offset: 0x10) - public var scr: Register - - /// Configuration and control register - @RegisterBlock(offset: 0x14) - public var ccr: Register - - /// System handler priority registers - @RegisterBlock(offset: 0x18) - public var shpr1: Register - - /// System handler priority registers - @RegisterBlock(offset: 0x1c) - public var shpr2: Register - - /// System handler priority registers - @RegisterBlock(offset: 0x20) - public var shpr3: Register - - /// System handler control and state register - @RegisterBlock(offset: 0x24) - public var shcrs: Register - - /// Configurable fault status register - @RegisterBlock(offset: 0x28) - public var cfsr_ufsr_bfsr_mmfsr: Register - - /// Hard fault status register - @RegisterBlock(offset: 0x2c) - public var hfsr: Register - - /// Memory management fault address register - @RegisterBlock(offset: 0x34) - public var mmfar: Register - - /// Bus fault address register - @RegisterBlock(offset: 0x38) - public var bfar: Register -} - -extension SCB { - /// CPUID base register - @Register(bitWidth: 32) - public struct CPUID { - /// Revision number - @ReadOnly(bits: 0..<4) - public var revision: Revision - - /// Part number of the processor - @ReadOnly(bits: 4..<16) - public var partno: PartNo - - /// Reads as 0xF - @ReadOnly(bits: 16..<20) - public var constant: Constant - - /// Variant number - @ReadOnly(bits: 20..<24) - public var variant: Variant - - /// Implementer code - @ReadOnly(bits: 24..<32) - public var implementer: Implementer - } - - /// Interrupt control and state register - @Register(bitWidth: 32) - public struct ICSR { - /// Active vector - @ReadWrite(bits: 0..<9) - public var vectactive: VECTACTIVE - - /// Return to base level - @ReadWrite(bits: 11..<12) - public var rettobase: RETTOBASE - - /// Pending vector - @ReadWrite(bits: 12..<19) - public var vectpending: VECTPENDING - - /// Interrupt pending flag - @ReadWrite(bits: 22..<23) - public var isrpending: ISRPENDING - - /// SysTick exception clear-pending bit - @ReadWrite(bits: 25..<26) - public var pendstclr: PENDSTCLR - - /// SysTick exception set-pending bit - @ReadWrite(bits: 26..<27) - public var pendstset: PENDSTSET - - /// PendSV clear-pending bit - @ReadWrite(bits: 27..<28) - public var pendsvclr: PENDSVCLR - - /// PendSV set-pending bit - @ReadWrite(bits: 28..<29) - public var pendsvset: PENDSVSET - - /// NMI set-pending bit. - @ReadWrite(bits: 31..<32) - public var nmipendset: NMIPENDSET - } - - /// Vector table offset register - @Register(bitWidth: 32) - public struct VTOR { - /// Vector table base offset field - @ReadWrite(bits: 9..<30) - public var tbloff: TBLOFF - } - - /// Application interrupt and reset control register - @Register(bitWidth: 32) - public struct AIRCR { - /// VECTRESET - @ReadWrite(bits: 0..<1) - public var vectreset: VECTRESET - - /// VECTCLRACTIVE - @ReadWrite(bits: 1..<2) - public var vectclractive: VECTCLRACTIVE - - /// SYSRESETREQ - @ReadWrite(bits: 2..<3) - public var sysresetreq: SYSRESETREQ - - /// PRIGROUP - @ReadWrite(bits: 8..<11) - public var prigroup: PRIGROUP - - /// ENDIANESS - @ReadWrite(bits: 15..<16) - public var endianess: ENDIANESS - - /// Register key - @ReadWrite(bits: 16..<32) - public var vectkeystat: VECTKEYSTAT - } - - /// System control register - @Register(bitWidth: 32) - public struct SCR { - /// SLEEPONEXIT - @ReadWrite(bits: 1..<2) - public var sleeponexit: SLEEPONEXIT - - /// SLEEPDEEP - @ReadWrite(bits: 2..<3) - public var sleepdeep: SLEEPDEEP - - /// Send Event on Pending bit - @ReadWrite(bits: 4..<5) - public var seveonpend: SEVEONPEND - } - - /// Configuration and control register - @Register(bitWidth: 32) - public struct CCR { - /// Configures how the processor enters Thread mode - @ReadWrite(bits: 0..<1) - public var nonbasethrdena: NONBASETHRDENA - - /// USERSETMPEND - @ReadWrite(bits: 1..<2) - public var usersetmpend: USERSETMPEND - - /// UNALIGN_ TRP - @ReadWrite(bits: 3..<4) - public var unalign__trp: UNALIGN__TRP - - /// DIV_0_TRP - @ReadWrite(bits: 4..<5) - public var div_0_trp: DIV_0_TRP - - /// BFHFNMIGN - @ReadWrite(bits: 8..<9) - public var bfhfnmign: BFHFNMIGN - - /// STKALIGN - @ReadWrite(bits: 9..<10) - public var stkalign: STKALIGN - - /// DC - @ReadWrite(bits: 16..<17) - public var dc: DC - - /// IC - @ReadWrite(bits: 17..<18) - public var ic: IC - - /// BP - @ReadWrite(bits: 18..<19) - public var bp: BP - } - - /// System handler priority registers - @Register(bitWidth: 32) - public struct SHPR1 { - /// Priority of system handler 4 - @ReadWrite(bits: 0..<8) - public var pri_4: PRI_4 - - /// Priority of system handler 5 - @ReadWrite(bits: 8..<16) - public var pri_5: PRI_5 - - /// Priority of system handler 6 - @ReadWrite(bits: 16..<24) - public var pri_6: PRI_6 - } - - /// System handler priority registers - @Register(bitWidth: 32) - public struct SHPR2 { - /// Priority of system handler 11 - @ReadWrite(bits: 24..<32) - public var pri_11: PRI_11 - } - - /// System handler priority registers - @Register(bitWidth: 32) - public struct SHPR3 { - /// Priority of system handler 14 - @ReadWrite(bits: 16..<24) - public var pri_14: PRI_14 - - /// Priority of system handler 15 - @ReadWrite(bits: 24..<32) - public var pri_15: PRI_15 - } - - /// System handler control and state register - @Register(bitWidth: 32) - public struct SHCRS { - /// Memory management fault exception active bit - @ReadWrite(bits: 0..<1) - public var memfaultact: MEMFAULTACT - - /// Bus fault exception active bit - @ReadWrite(bits: 1..<2) - public var busfaultact: BUSFAULTACT - - /// Usage fault exception active bit - @ReadWrite(bits: 3..<4) - public var usgfaultact: USGFAULTACT - - /// SVC call active bit - @ReadWrite(bits: 7..<8) - public var svcallact: SVCALLACT - - /// Debug monitor active bit - @ReadWrite(bits: 8..<9) - public var monitoract: MONITORACT - - /// PendSV exception active bit - @ReadWrite(bits: 10..<11) - public var pendsvact: PENDSVACT - - /// SysTick exception active bit - @ReadWrite(bits: 11..<12) - public var systickact: SYSTICKACT - - /// Usage fault exception pending bit - @ReadWrite(bits: 12..<13) - public var usgfaultpended: USGFAULTPENDED - - /// Memory management fault exception pending bit - @ReadWrite(bits: 13..<14) - public var memfaultpended: MEMFAULTPENDED - - /// Bus fault exception pending bit - @ReadWrite(bits: 14..<15) - public var busfaultpended: BUSFAULTPENDED - - /// SVC call pending bit - @ReadWrite(bits: 15..<16) - public var svcallpended: SVCALLPENDED - - /// Memory management fault enable bit - @ReadWrite(bits: 16..<17) - public var memfaultena: MEMFAULTENA - - /// Bus fault enable bit - @ReadWrite(bits: 17..<18) - public var busfaultena: BUSFAULTENA - - /// Usage fault enable bit - @ReadWrite(bits: 18..<19) - public var usgfaultena: USGFAULTENA - } - - /// Configurable fault status register - @Register(bitWidth: 32) - public struct CFSR_UFSR_BFSR_MMFSR { - /// IACCVIOL - @ReadWrite(bits: 0..<1) - public var iaccviol: IACCVIOL - - /// DACCVIOL - @ReadWrite(bits: 1..<2) - public var daccviol: DACCVIOL - - /// MUNSTKERR - @ReadWrite(bits: 3..<4) - public var munstkerr: MUNSTKERR - - /// MSTKERR - @ReadWrite(bits: 4..<5) - public var mstkerr: MSTKERR - - /// MLSPERR - @ReadWrite(bits: 5..<6) - public var mlsperr: MLSPERR - - /// MMARVALID - @ReadWrite(bits: 7..<8) - public var mmarvalid: MMARVALID - - /// Instruction bus error - @ReadWrite(bits: 8..<9) - public var ibuserr: IBUSERR - - /// Precise data bus error - @ReadWrite(bits: 9..<10) - public var preciserr: PRECISERR - - /// Imprecise data bus error - @ReadWrite(bits: 10..<11) - public var impreciserr: IMPRECISERR - - /// Bus fault on unstacking for a return from exception - @ReadWrite(bits: 11..<12) - public var unstkerr: UNSTKERR - - /// Bus fault on stacking for exception entry - @ReadWrite(bits: 12..<13) - public var stkerr: STKERR - - /// Bus fault on floating-point lazy state preservation - @ReadWrite(bits: 13..<14) - public var lsperr: LSPERR - - /// Bus Fault Address Register (BFAR) valid flag - @ReadWrite(bits: 15..<16) - public var bfarvalid: BFARVALID - - /// Undefined instruction usage fault - @ReadWrite(bits: 16..<17) - public var undefinstr: UNDEFINSTR - - /// Invalid state usage fault - @ReadWrite(bits: 17..<18) - public var invstate: INVSTATE - - /// Invalid PC load usage fault - @ReadWrite(bits: 18..<19) - public var invpc: INVPC - - /// No coprocessor usage fault. - @ReadWrite(bits: 19..<20) - public var nocp: NOCP - - /// Unaligned access usage fault - @ReadWrite(bits: 24..<25) - public var unaligned: UNALIGNED - - /// Divide by zero usage fault - @ReadWrite(bits: 25..<26) - public var divbyzero: DIVBYZERO - } - - /// Hard fault status register - @Register(bitWidth: 32) - public struct HFSR { - /// Vector table hard fault - @ReadWrite(bits: 1..<2) - public var vecttbl: VECTTBL - - /// Forced hard fault - @ReadWrite(bits: 30..<31) - public var forced: FORCED - - /// Reserved for Debug use - @ReadWrite(bits: 31..<32) - public var debug_vt: DEBUG_VT - } - - /// Memory management fault address register - @Register(bitWidth: 32) - public struct MMFAR { - /// Memory management fault address - @ReadWrite(bits: 0..<32) - public var address: ADDRESS - } - - /// Bus fault address register - @Register(bitWidth: 32) - public struct BFAR { - /// Bus fault address - @ReadWrite(bits: 0..<32) - public var address: ADDRESS - } -} diff --git a/stm32-lvgl/Sources/Registers/STK.swift b/stm32-lvgl/Sources/Registers/STK.swift deleted file mode 100644 index e5b20c57..00000000 --- a/stm32-lvgl/Sources/Registers/STK.swift +++ /dev/null @@ -1,77 +0,0 @@ -// Generated by svd2swift. - -import MMIO - -/// SysTick timer -@RegisterBlock -public struct STK { - /// SysTick control and status register - @RegisterBlock(offset: 0x0) - public var csr: Register - - /// SysTick reload value register - @RegisterBlock(offset: 0x4) - public var rvr: Register - - /// SysTick current value register - @RegisterBlock(offset: 0x8) - public var cvr: Register - - /// SysTick calibration value register - @RegisterBlock(offset: 0xc) - public var calib: Register -} - -extension STK { - /// SysTick control and status register - @Register(bitWidth: 32) - public struct CSR { - /// Counter enable - @ReadWrite(bits: 0..<1) - public var enable: ENABLE - - /// SysTick exception request enable - @ReadWrite(bits: 1..<2) - public var tickint: TICKINT - - /// Clock source selection - @ReadWrite(bits: 2..<3) - public var clksource: CLKSOURCE - - /// COUNTFLAG - @ReadWrite(bits: 16..<17) - public var countflag: COUNTFLAG - } - - /// SysTick reload value register - @Register(bitWidth: 32) - public struct RVR { - /// RELOAD value - @ReadWrite(bits: 0..<24) - public var reload: RELOAD - } - - /// SysTick current value register - @Register(bitWidth: 32) - public struct CVR { - /// Current counter value - @ReadWrite(bits: 0..<24) - public var current: CURRENT - } - - /// SysTick calibration value register - @Register(bitWidth: 32) - public struct CALIB { - /// Calibration value - @ReadWrite(bits: 0..<24) - public var tenms: TENMS - - /// SKEW flag: Indicates whether the TENMS value is exact - @ReadWrite(bits: 30..<31) - public var skew: SKEW - - /// NOREF flag. Reads as zero - @ReadWrite(bits: 31..<32) - public var noref: NOREF - } -} diff --git a/stm32-lvgl/Sources/Registers/SYSCFG.swift b/stm32-lvgl/Sources/Registers/SYSCFG.swift deleted file mode 100644 index cacf50b2..00000000 --- a/stm32-lvgl/Sources/Registers/SYSCFG.swift +++ /dev/null @@ -1,161 +0,0 @@ -// Generated by svd2swift. - -import MMIO - -/// System configuration controller -@RegisterBlock -public struct SYSCFG { - /// memory remap register - @RegisterBlock(offset: 0x0) - public var memrmp: Register - - /// peripheral mode configuration register - @RegisterBlock(offset: 0x4) - public var pmc: Register - - /// external interrupt configuration register 1 - @RegisterBlock(offset: 0x8) - public var exticr1: Register - - /// external interrupt configuration register 2 - @RegisterBlock(offset: 0xc) - public var exticr2: Register - - /// external interrupt configuration register 3 - @RegisterBlock(offset: 0x10) - public var exticr3: Register - - /// external interrupt configuration register 4 - @RegisterBlock(offset: 0x14) - public var exticr4: Register - - /// Compensation cell control register - @RegisterBlock(offset: 0x20) - public var cmpcr: Register -} - -extension SYSCFG { - /// memory remap register - @Register(bitWidth: 32) - public struct MEMRMP { - /// Memory mapping selection - @ReadWrite(bits: 0..<1) - public var mem_boot: MEM_BOOT - - /// FMC memory mapping swap - @ReadWrite(bits: 10..<12) - public var swp_fmc: SWP_FMC - } - - /// peripheral mode configuration register - @Register(bitWidth: 32) - public struct PMC { - /// Ethernet PHY interface selection - @ReadWrite(bits: 23..<24) - public var mii_rmii_sel: MII_RMII_SEL - - /// ADC1DC2 - @ReadWrite(bits: 16..<17) - public var adc1dc2: ADC1DC2 - - /// ADC2DC2 - @ReadWrite(bits: 17..<18) - public var adc2dc2: ADC2DC2 - - /// ADC3DC2 - @ReadWrite(bits: 18..<19) - public var adc3dc2: ADC3DC2 - } - - /// external interrupt configuration register 1 - @Register(bitWidth: 32) - public struct EXTICR1 { - /// EXTI x configuration (x = 0 to 3) - @ReadWrite(bits: 12..<16) - public var exti3: EXTI3 - - /// EXTI x configuration (x = 0 to 3) - @ReadWrite(bits: 8..<12) - public var exti2: EXTI2 - - /// EXTI x configuration (x = 0 to 3) - @ReadWrite(bits: 4..<8) - public var exti1: EXTI1 - - /// EXTI x configuration (x = 0 to 3) - @ReadWrite(bits: 0..<4) - public var exti0: EXTI0 - } - - /// external interrupt configuration register 2 - @Register(bitWidth: 32) - public struct EXTICR2 { - /// EXTI x configuration (x = 4 to 7) - @ReadWrite(bits: 12..<16) - public var exti7: EXTI7 - - /// EXTI x configuration (x = 4 to 7) - @ReadWrite(bits: 8..<12) - public var exti6: EXTI6 - - /// EXTI x configuration (x = 4 to 7) - @ReadWrite(bits: 4..<8) - public var exti5: EXTI5 - - /// EXTI x configuration (x = 4 to 7) - @ReadWrite(bits: 0..<4) - public var exti4: EXTI4 - } - - /// external interrupt configuration register 3 - @Register(bitWidth: 32) - public struct EXTICR3 { - /// EXTI x configuration (x = 8 to 11) - @ReadWrite(bits: 12..<16) - public var exti11: EXTI11 - - /// EXTI10 - @ReadWrite(bits: 8..<12) - public var exti10: EXTI10 - - /// EXTI x configuration (x = 8 to 11) - @ReadWrite(bits: 4..<8) - public var exti9: EXTI9 - - /// EXTI x configuration (x = 8 to 11) - @ReadWrite(bits: 0..<4) - public var exti8: EXTI8 - } - - /// external interrupt configuration register 4 - @Register(bitWidth: 32) - public struct EXTICR4 { - /// EXTI x configuration (x = 12 to 15) - @ReadWrite(bits: 12..<16) - public var exti15: EXTI15 - - /// EXTI x configuration (x = 12 to 15) - @ReadWrite(bits: 8..<12) - public var exti14: EXTI14 - - /// EXTI x configuration (x = 12 to 15) - @ReadWrite(bits: 4..<8) - public var exti13: EXTI13 - - /// EXTI x configuration (x = 12 to 15) - @ReadWrite(bits: 0..<4) - public var exti12: EXTI12 - } - - /// Compensation cell control register - @Register(bitWidth: 32) - public struct CMPCR { - /// READY - @ReadOnly(bits: 8..<9) - public var ready: READY - - /// Compensation cell power-down - @ReadOnly(bits: 0..<1) - public var cmp_pd: CMP_PD - } -} diff --git a/stm32-lvgl/Sources/Registers/USART1.swift b/stm32-lvgl/Sources/Registers/USART1.swift deleted file mode 100644 index 04d26f6a..00000000 --- a/stm32-lvgl/Sources/Registers/USART1.swift +++ /dev/null @@ -1,1554 +0,0 @@ -// Generated by svd2swift. - -import MMIO - -/// Universal synchronous asynchronous receiver transmitter -@RegisterBlock -public struct USART1 { - /// Control register 1 - @RegisterBlock(offset: 0x0) - public var cr1: Register - - /// Control register 2 - @RegisterBlock(offset: 0x4) - public var cr2: Register - - /// Control register 3 - @RegisterBlock(offset: 0x8) - public var cr3: Register - - /// Baud rate register - @RegisterBlock(offset: 0xc) - public var brr: Register - - /// Guard time and prescaler register - @RegisterBlock(offset: 0x10) - public var gtpr: Register - - /// Receiver timeout register - @RegisterBlock(offset: 0x14) - public var rtor: Register - - /// Request register - @RegisterBlock(offset: 0x18) - public var rqr: Register - - /// Interrupt & status register - @RegisterBlock(offset: 0x1c) - public var isr: Register - - /// Interrupt flag clear register - @RegisterBlock(offset: 0x20) - public var icr: Register - - /// Receive data register - @RegisterBlock(offset: 0x24) - public var rdr: Register - - /// Transmit data register - @RegisterBlock(offset: 0x28) - public var tdr: Register -} - -extension USART1 { - /// Control register 1 - @Register(bitWidth: 32) - public struct CR1 { - /// Word length - @ReadWrite(bits: 28..<29, as: M1Values.self) - public var m1: M1 - - /// End of Block interrupt enable - @ReadWrite(bits: 27..<28, as: EOBIEValues.self) - public var eobie: EOBIE - - /// Receiver timeout interrupt enable - @ReadWrite(bits: 26..<27, as: RTOIEValues.self) - public var rtoie: RTOIE - - /// Oversampling mode - @ReadWrite(bits: 15..<16, as: OVER8Values.self) - public var over8: OVER8 - - /// Character match interrupt enable - @ReadWrite(bits: 14..<15, as: CMIEValues.self) - public var cmie: CMIE - - /// Mute mode enable - @ReadWrite(bits: 13..<14, as: MMEValues.self) - public var mme: MME - - /// Word length - @ReadWrite(bits: 12..<13, as: M0Values.self) - public var m0: M0 - - /// Receiver wakeup method - @ReadWrite(bits: 11..<12, as: WAKEValues.self) - public var wake: WAKE - - /// Parity control enable - @ReadWrite(bits: 10..<11, as: PCEValues.self) - public var pce: PCE - - /// Parity selection - @ReadWrite(bits: 9..<10, as: PSValues.self) - public var ps: PS - - /// PE interrupt enable - @ReadWrite(bits: 8..<9, as: PEIEValues.self) - public var peie: PEIE - - /// interrupt enable - @ReadWrite(bits: 7..<8, as: TXEIEValues.self) - public var txeie: TXEIE - - /// Transmission complete interrupt enable - @ReadWrite(bits: 6..<7, as: TCIEValues.self) - public var tcie: TCIE - - /// RXNE interrupt enable - @ReadWrite(bits: 5..<6, as: RXNEIEValues.self) - public var rxneie: RXNEIE - - /// IDLE interrupt enable - @ReadWrite(bits: 4..<5, as: IDLEIEValues.self) - public var idleie: IDLEIE - - /// Transmitter enable - @ReadWrite(bits: 3..<4, as: TEValues.self) - public var te: TE - - /// Receiver enable - @ReadWrite(bits: 2..<3, as: REValues.self) - public var re: RE - - /// USART enable in Stop mode - @ReadWrite(bits: 1..<2, as: UESMValues.self) - public var uesm: UESM - - /// USART enable - @ReadWrite(bits: 0..<1, as: UEValues.self) - public var ue: UE - - /// Driver Enable assertion time - @ReadWrite(bits: 21..<26) - public var deat: DEAT - - /// Driver Enable de-assertion time - @ReadWrite(bits: 16..<21) - public var dedt: DEDT - } - - /// Control register 2 - @Register(bitWidth: 32) - public struct CR2 { - /// Receiver timeout enable - @ReadWrite(bits: 23..<24, as: RTOENValues.self) - public var rtoen: RTOEN - - /// Auto baud rate enable - @ReadWrite(bits: 20..<21, as: ABRENValues.self) - public var abren: ABREN - - /// Most significant bit first - @ReadWrite(bits: 19..<20, as: MSBFIRSTValues.self) - public var msbfirst: MSBFIRST - - /// Binary data inversion - @ReadWrite(bits: 18..<19, as: DATAINVValues.self) - public var datainv: DATAINV - - /// TX pin active level inversion - @ReadWrite(bits: 17..<18, as: TXINVValues.self) - public var txinv: TXINV - - /// RX pin active level inversion - @ReadWrite(bits: 16..<17, as: RXINVValues.self) - public var rxinv: RXINV - - /// Swap TX/RX pins - @ReadWrite(bits: 15..<16, as: SWAPValues.self) - public var swap: SWAP - - /// LIN mode enable - @ReadWrite(bits: 14..<15, as: LINENValues.self) - public var linen: LINEN - - /// STOP bits - @ReadWrite(bits: 12..<14, as: STOPValues.self) - public var stop: STOP - - /// Clock enable - @ReadWrite(bits: 11..<12, as: CLKENValues.self) - public var clken: CLKEN - - /// Clock polarity - @ReadWrite(bits: 10..<11, as: CPOLValues.self) - public var cpol: CPOL - - /// Clock phase - @ReadWrite(bits: 9..<10, as: CPHAValues.self) - public var cpha: CPHA - - /// Last bit clock pulse - @ReadWrite(bits: 8..<9, as: LBCLValues.self) - public var lbcl: LBCL - - /// LIN break detection interrupt enable - @ReadWrite(bits: 6..<7, as: LBDIEValues.self) - public var lbdie: LBDIE - - /// LIN break detection length - @ReadWrite(bits: 5..<6, as: LBDLValues.self) - public var lbdl: LBDL - - /// 7-bit Address Detection/4-bit Address Detection - @ReadWrite(bits: 4..<5, as: ADDM7Values.self) - public var addm7: ADDM7 - - /// Auto baud rate mode - @ReadWrite(bits: 21..<23, as: ABRMODValues.self) - public var abrmod: ABRMOD - - /// Address of the USART node - @ReadWrite(bits: 24..<32) - public var add: ADD - } - - /// Control register 3 - @Register(bitWidth: 32) - public struct CR3 { - /// Wakeup from Stop mode interrupt enable - @ReadWrite(bits: 22..<23, as: WUFIEValues.self) - public var wufie: WUFIE - - /// Wakeup from Stop mode interrupt flag selection - @ReadWrite(bits: 20..<22, as: WUSValues.self) - public var wus: WUS - - /// Smartcard auto-retry count - @ReadWrite(bits: 17..<20) - public var scarcnt: SCARCNT - - /// Driver enable polarity selection - @ReadWrite(bits: 15..<16, as: DEPValues.self) - public var dep: DEP - - /// Driver enable mode - @ReadWrite(bits: 14..<15, as: DEMValues.self) - public var dem: DEM - - /// DMA Disable on Reception Error - @ReadWrite(bits: 13..<14, as: DDREValues.self) - public var ddre: DDRE - - /// Overrun Disable - @ReadWrite(bits: 12..<13, as: OVRDISValues.self) - public var ovrdis: OVRDIS - - /// One sample bit method enable - @ReadWrite(bits: 11..<12, as: ONEBITValues.self) - public var onebit: ONEBIT - - /// CTS interrupt enable - @ReadWrite(bits: 10..<11, as: CTSIEValues.self) - public var ctsie: CTSIE - - /// CTS enable - @ReadWrite(bits: 9..<10, as: CTSEValues.self) - public var ctse: CTSE - - /// RTS enable - @ReadWrite(bits: 8..<9, as: RTSEValues.self) - public var rtse: RTSE - - /// DMA enable transmitter - @ReadWrite(bits: 7..<8, as: DMATValues.self) - public var dmat: DMAT - - /// DMA enable receiver - @ReadWrite(bits: 6..<7, as: DMARValues.self) - public var dmar: DMAR - - /// Smartcard mode enable - @ReadWrite(bits: 5..<6, as: SCENValues.self) - public var scen: SCEN - - /// Smartcard NACK enable - @ReadWrite(bits: 4..<5, as: NACKValues.self) - public var nack: NACK - - /// Half-duplex selection - @ReadWrite(bits: 3..<4, as: HDSELValues.self) - public var hdsel: HDSEL - - /// Ir low-power - @ReadWrite(bits: 2..<3, as: IRLPValues.self) - public var irlp: IRLP - - /// Ir mode enable - @ReadWrite(bits: 1..<2, as: IRENValues.self) - public var iren: IREN - - /// Error interrupt enable - @ReadWrite(bits: 0..<1, as: EIEValues.self) - public var eie: EIE - } - - /// Baud rate register - @Register(bitWidth: 32) - public struct BRR { - /// DIV_Mantissa - @ReadWrite(bits: 0..<16) - public var brr_field: BRR_FIELD - } - - /// Guard time and prescaler register - @Register(bitWidth: 32) - public struct GTPR { - /// Guard time value - @ReadWrite(bits: 8..<16) - public var gt: GT - - /// Prescaler value - @ReadWrite(bits: 0..<8) - public var psc: PSC - } - - /// Receiver timeout register - @Register(bitWidth: 32) - public struct RTOR { - /// Block Length - @ReadWrite(bits: 24..<32) - public var blen: BLEN - - /// Receiver timeout value - @ReadWrite(bits: 0..<24) - public var rto: RTO - } - - /// Request register - @Register(bitWidth: 32) - public struct RQR { - /// Transmit data flush request - @WriteOnly(bits: 4..<5) - public var txfrq: TXFRQ - - /// Receive data flush request - @WriteOnly(bits: 3..<4) - public var rxfrq: RXFRQ - - /// Mute mode request - @WriteOnly(bits: 2..<3) - public var mmrq: MMRQ - - /// Send break request - @WriteOnly(bits: 1..<2) - public var sbkrq: SBKRQ - - /// Auto baud rate request - @WriteOnly(bits: 0..<1) - public var abrrq: ABRRQ - } - - /// Interrupt & status register - @Register(bitWidth: 32) - public struct ISR { - /// REACK - @ReadOnly(bits: 22..<23) - public var reack: REACK - - /// TEACK - @ReadOnly(bits: 21..<22) - public var teack: TEACK - - /// WUF - @ReadOnly(bits: 20..<21) - public var wuf: WUF - - /// RWU - @ReadOnly(bits: 19..<20) - public var rwu: RWU - - /// SBKF - @ReadOnly(bits: 18..<19) - public var sbkf: SBKF - - /// CMF - @ReadOnly(bits: 17..<18) - public var cmf: CMF - - /// BUSY - @ReadOnly(bits: 16..<17) - public var busy: BUSY - - /// ABRF - @ReadOnly(bits: 15..<16) - public var abrf: ABRF - - /// ABRE - @ReadOnly(bits: 14..<15) - public var abre: ABRE - - /// EOBF - @ReadOnly(bits: 12..<13) - public var eobf: EOBF - - /// RTOF - @ReadOnly(bits: 11..<12) - public var rtof: RTOF - - /// CTS - @ReadOnly(bits: 10..<11) - public var cts: CTS - - /// CTSIF - @ReadOnly(bits: 9..<10) - public var ctsif: CTSIF - - /// LBDF - @ReadOnly(bits: 8..<9) - public var lbdf: LBDF - - /// TXE - @ReadOnly(bits: 7..<8) - public var txe: TXE - - /// TC - @ReadOnly(bits: 6..<7) - public var tc: TC - - /// RXNE - @ReadOnly(bits: 5..<6) - public var rxne: RXNE - - /// IDLE - @ReadOnly(bits: 4..<5) - public var idle: IDLE - - /// ORE - @ReadOnly(bits: 3..<4) - public var ore: ORE - - /// NF - @ReadOnly(bits: 2..<3) - public var nf: NF - - /// FE - @ReadOnly(bits: 1..<2) - public var fe: FE - - /// PE - @ReadOnly(bits: 0..<1) - public var pe: PE - } - - /// Interrupt flag clear register - @Register(bitWidth: 32) - public struct ICR { - /// Wakeup from Stop mode clear flag - @WriteOnly(bits: 20..<21) - public var wucf: WUCF - - /// Character match clear flag - @WriteOnly(bits: 17..<18) - public var cmcf: CMCF - - /// End of block clear flag - @WriteOnly(bits: 12..<13) - public var eobcf: EOBCF - - /// Receiver timeout clear flag - @WriteOnly(bits: 11..<12) - public var rtocf: RTOCF - - /// CTS clear flag - @WriteOnly(bits: 9..<10) - public var ctscf: CTSCF - - /// LIN break detection clear flag - @WriteOnly(bits: 8..<9) - public var lbdcf: LBDCF - - /// Transmission complete clear flag - @WriteOnly(bits: 6..<7) - public var tccf: TCCF - - /// Idle line detected clear flag - @WriteOnly(bits: 4..<5) - public var idlecf: IDLECF - - /// Overrun error clear flag - @WriteOnly(bits: 3..<4) - public var orecf: ORECF - - /// Noise detected clear flag - @WriteOnly(bits: 2..<3) - public var ncf: NCF - - /// Framing error clear flag - @WriteOnly(bits: 1..<2) - public var fecf: FECF - - /// Parity error clear flag - @WriteOnly(bits: 0..<1) - public var pecf: PECF - } - - /// Receive data register - @Register(bitWidth: 32) - public struct RDR { - /// Receive data value - @ReadOnly(bits: 0..<9) - public var rdr_field: RDR_FIELD - } - - /// Transmit data register - @Register(bitWidth: 32) - public struct TDR { - /// Transmit data value - @ReadWrite(bits: 0..<9) - public var tdr_field: TDR_FIELD - } -} - -extension USART1.CR1 { - public struct M1Values: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Use M0 to set the data bits - public static let M0 = Self(rawValue: 0x0) - - /// 1 start bit, 7 data bits, n stop bits - public static let Bit7 = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR1 { - public struct EOBIEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Interrupt is inhibited - public static let Disabled = Self(rawValue: 0x0) - - /// A USART interrupt is generated when the EOBF flag is set in the ISR register - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR1 { - public struct RTOIEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Interrupt is inhibited - public static let Disabled = Self(rawValue: 0x0) - - /// An USART interrupt is generated when the RTOF bit is set in the ISR register - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR1 { - public struct OVER8Values: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Oversampling by 16 - public static let Oversampling16 = Self(rawValue: 0x0) - - /// Oversampling by 8 - public static let Oversampling8 = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR1 { - public struct CMIEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Interrupt is disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Interrupt is generated when the CMF bit is set in the ISR register - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR1 { - public struct MMEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Receiver in active mode permanently - public static let Disabled = Self(rawValue: 0x0) - - /// Receiver can switch between mute mode and active mode - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR1 { - public struct M0Values: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// 1 start bit, 8 data bits, n stop bits - public static let Bit8 = Self(rawValue: 0x0) - - /// 1 start bit, 9 data bits, n stop bits - public static let Bit9 = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR1 { - public struct WAKEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Idle line - public static let Idle = Self(rawValue: 0x0) - - /// Address mask - public static let Address = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR1 { - public struct PCEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Parity control disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Parity control enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR1 { - public struct PSValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Even parity - public static let Even = Self(rawValue: 0x0) - - /// Odd parity - public static let Odd = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR1 { - public struct PEIEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Interrupt is disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Interrupt is generated whenever PE=1 in the ISR register - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR1 { - public struct TXEIEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Interrupt is disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Interrupt is generated whenever TXE=1 in the ISR register - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR1 { - public struct TCIEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Interrupt is disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Interrupt is generated whenever TC=1 in the ISR register - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR1 { - public struct RXNEIEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Interrupt is disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Interrupt is generated whenever ORE=1 or RXNE=1 in the ISR register - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR1 { - public struct IDLEIEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Interrupt is disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Interrupt is generated whenever IDLE=1 in the ISR register - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR1 { - public struct TEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Transmitter is disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Transmitter is enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR1 { - public struct REValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Receiver is disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Receiver is enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR1 { - public struct UESMValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// USART not able to wake up the MCU from Stop mode - public static let Disabled = Self(rawValue: 0x0) - - /// USART able to wake up the MCU from Stop mode - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR1 { - public struct UEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// UART is disabled - public static let Disabled = Self(rawValue: 0x0) - - /// UART is enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR2 { - public struct RTOENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Receiver timeout feature disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Receiver timeout feature enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR2 { - public struct ABRENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Auto baud rate detection is disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Auto baud rate detection is enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR2 { - public struct MSBFIRSTValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// data is transmitted/received with data bit 0 first, following the start bit - public static let LSB = Self(rawValue: 0x0) - - /// data is transmitted/received with MSB (bit 7/8/9) first, following the start bit - public static let MSB = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR2 { - public struct DATAINVValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Logical data from the data register are send/received in positive/direct logic - public static let Positive = Self(rawValue: 0x0) - - /// Logical data from the data register are send/received in negative/inverse logic - public static let Negative = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR2 { - public struct TXINVValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// TX pin signal works using the standard logic levels - public static let Standard = Self(rawValue: 0x0) - - /// TX pin signal values are inverted - public static let Inverted = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR2 { - public struct RXINVValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// RX pin signal works using the standard logic levels - public static let Standard = Self(rawValue: 0x0) - - /// RX pin signal values are inverted - public static let Inverted = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR2 { - public struct SWAPValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// TX/RX pins are used as defined in standard pinout - public static let Standard = Self(rawValue: 0x0) - - /// The TX and RX pins functions are swapped - public static let Swapped = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR2 { - public struct LINENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// LIN mode disabled - public static let Disabled = Self(rawValue: 0x0) - - /// LIN mode enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR2 { - public struct STOPValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// 1 stop bit - public static let Stop1 = Self(rawValue: 0x0) - - /// 0.5 stop bit - public static let Stop0p5 = Self(rawValue: 0x1) - - /// 2 stop bit - public static let Stop2 = Self(rawValue: 0x2) - - /// 1.5 stop bit - public static let Stop1p5 = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR2 { - public struct CLKENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// CK pin disabled - public static let Disabled = Self(rawValue: 0x0) - - /// CK pin enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR2 { - public struct CPOLValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Steady low value on CK pin outside transmission window - public static let Low = Self(rawValue: 0x0) - - /// Steady high value on CK pin outside transmission window - public static let High = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR2 { - public struct CPHAValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// The first clock transition is the first data capture edge - public static let First = Self(rawValue: 0x0) - - /// The second clock transition is the first data capture edge - public static let Second = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR2 { - public struct LBCLValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// The clock pulse of the last data bit is not output to the CK pin - public static let NotOutput = Self(rawValue: 0x0) - - /// The clock pulse of the last data bit is output to the CK pin - public static let Output = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR2 { - public struct LBDIEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Interrupt is inhibited - public static let Disabled = Self(rawValue: 0x0) - - /// An interrupt is generated whenever LBDF=1 in the ISR register - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR2 { - public struct LBDLValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// 10-bit break detection - public static let Bit10 = Self(rawValue: 0x0) - - /// 11-bit break detection - public static let Bit11 = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR2 { - public struct ADDM7Values: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// 4-bit address detection - public static let Bit4 = Self(rawValue: 0x0) - - /// 7-bit address detection - public static let Bit7 = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR2 { - public struct ABRMODValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// Measurement of the start bit is used to detect the baud rate - public static let Start = Self(rawValue: 0x0) - - /// Falling edge to falling edge measurement - public static let Edge = Self(rawValue: 0x1) - - /// 0x7F frame detection - public static let Frame7F = Self(rawValue: 0x2) - - /// 0x55 frame detection - public static let Frame55 = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR3 { - public struct WUFIEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Interrupt is inhibited - public static let Disabled = Self(rawValue: 0x0) - - /// An USART interrupt is generated whenever WUF=1 in the ISR register - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR3 { - public struct WUSValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// WUF active on address match - public static let Address = Self(rawValue: 0x0) - - /// WuF active on Start bit detection - public static let Start = Self(rawValue: 0x2) - - /// WUF active on RXNE - public static let RXNE = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR3 { - public struct DEPValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// DE signal is active high - public static let High = Self(rawValue: 0x0) - - /// DE signal is active low - public static let Low = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR3 { - public struct DEMValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// DE function is disabled - public static let Disabled = Self(rawValue: 0x0) - - /// The DE signal is output on the RTS pin - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR3 { - public struct DDREValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// DMA is not disabled in case of reception error - public static let NotDisabled = Self(rawValue: 0x0) - - /// DMA is disabled following a reception error - public static let Disabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR3 { - public struct OVRDISValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Overrun Error Flag, ORE, is set when received data is not read before receiving new data - public static let Enabled = Self(rawValue: 0x0) - - /// Overrun functionality is disabled. If new data is received while the RXNE flag is still set the ORE flag is not set and the new received data overwrites the previous content of the RDR register - public static let Disabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR3 { - public struct ONEBITValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Three sample bit method - public static let Sample3 = Self(rawValue: 0x0) - - /// One sample bit method - public static let Sample1 = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR3 { - public struct CTSIEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Interrupt is inhibited - public static let Disabled = Self(rawValue: 0x0) - - /// An interrupt is generated whenever CTSIF=1 in the ISR register - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR3 { - public struct CTSEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// CTS hardware flow control disabled - public static let Disabled = Self(rawValue: 0x0) - - /// CTS mode enabled, data is only transmitted when the CTS input is asserted - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR3 { - public struct RTSEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// RTS hardware flow control disabled - public static let Disabled = Self(rawValue: 0x0) - - /// RTS output enabled, data is only requested when there is space in the receive buffer - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR3 { - public struct DMATValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// DMA mode is disabled for transmission - public static let Disabled = Self(rawValue: 0x0) - - /// DMA mode is enabled for transmission - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR3 { - public struct DMARValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// DMA mode is disabled for reception - public static let Disabled = Self(rawValue: 0x0) - - /// DMA mode is enabled for reception - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR3 { - public struct SCENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Smartcard Mode disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Smartcard Mode enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR3 { - public struct NACKValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// NACK transmission in case of parity error is disabled - public static let Disabled = Self(rawValue: 0x0) - - /// NACK transmission during parity error is enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR3 { - public struct HDSELValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Half duplex mode is not selected - public static let NotSelected = Self(rawValue: 0x0) - - /// Half duplex mode is selected - public static let Selected = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR3 { - public struct IRLPValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Normal mode - public static let Normal = Self(rawValue: 0x0) - - /// Low-power mode - public static let LowPower = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR3 { - public struct IRENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// IrDA disabled - public static let Disabled = Self(rawValue: 0x0) - - /// IrDA enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR3 { - public struct EIEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Interrupt is inhibited - public static let Disabled = Self(rawValue: 0x0) - - /// An interrupt is generated when FE=1 or ORE=1 or NF=1 in the ISR register - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} diff --git a/stm32-lvgl/Sources/Support/Startup.c b/stm32-lvgl/Sources/Support/Startup.c deleted file mode 100644 index 1c70ffae..00000000 --- a/stm32-lvgl/Sources/Support/Startup.c +++ /dev/null @@ -1,163 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2025 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -#include -#include - -void enable_fpu(void) { - *(volatile uint32_t *)0xE000ED88 |= (0xF << 20); // set CP10 and CP11 Full Access -} - -// Reset entrypoint. Enables FPU, relocates the data sections from FLASH to DRAM -// and jumps to main (implemented in Application/Main.swift). -// -// See linkerscript.ld for a detailed explanation. -__attribute__((naked)) __attribute__((noreturn)) void ResetISR(void) { - asm volatile("bl enable_fpu"); - asm volatile("ldr r0, =__data_start // dst"); - asm volatile("ldr r1, =__flash_data_start // src"); - asm volatile("ldr r2, =__flash_data_len // size"); - asm volatile("bl memcpy"); - asm volatile("bl main"); - - // If main returns, spin. - asm volatile("b ."); -} - -// Implemented in Application/Interrupts.swift -void SystickTimerISR(void); -void LtdcIntHandlerISR(void); - -void IntDefaultHandlerISR() { __builtin_trap(); } - -// These are provided by the linker script -extern void *__stack_start; -extern void *__stack_end; - -// Primary interrupt vector table -__attribute__((section(".vectors"))) const void *Vectors[] = { - (void *)(((uintptr_t)&__stack_end) - 4), // initial SP - ResetISR, // 1 0x04 The reset handler - IntDefaultHandlerISR, // 2 0x08 The NMI handler - IntDefaultHandlerISR, // 3 0x0C The hard fault handler - IntDefaultHandlerISR, // 4 0x10 The MPU fault handler - IntDefaultHandlerISR, // 5 0x14 The bus fault handler - IntDefaultHandlerISR, // 6 0x18 The usage fault handler - 0, // 7 0x1c Reserved - 0, // 8 0x20 Reserved - 0, // 9 0x24 Reserved - 0, // 10 0x28 Reserved - IntDefaultHandlerISR, // 11 0x2c SVCall handler - IntDefaultHandlerISR, // 12 0x30 Debug monitor handler - IntDefaultHandlerISR, // 13 0x34 Reserved - IntDefaultHandlerISR, // 14 0x38 The PendSV handler - SystickTimerISR, // 15 0x3c The SysTick handler - IntDefaultHandlerISR, // 16 0x40 - IntDefaultHandlerISR, // 17 0x44 - IntDefaultHandlerISR, // 18 0x48 - IntDefaultHandlerISR, // 19 0x4C - IntDefaultHandlerISR, // 20 0x50 - IntDefaultHandlerISR, // 21 0x54 - IntDefaultHandlerISR, // 22 0x58 - IntDefaultHandlerISR, // 23 0x5C - IntDefaultHandlerISR, // 24 0x60 - IntDefaultHandlerISR, // 25 0x64 - IntDefaultHandlerISR, // 26 0x68 - IntDefaultHandlerISR, // 27 0x6C - IntDefaultHandlerISR, // 28 0x70 - IntDefaultHandlerISR, // 29 0x74 - IntDefaultHandlerISR, // 30 0x78 - IntDefaultHandlerISR, // 31 0x7C - IntDefaultHandlerISR, // 32 0x80 - IntDefaultHandlerISR, // 33 0x84 - IntDefaultHandlerISR, // 34 0x88 - IntDefaultHandlerISR, // 35 0x8c - IntDefaultHandlerISR, // 36 0x90 - IntDefaultHandlerISR, // 37 0x94 - IntDefaultHandlerISR, // 38 0x98 - IntDefaultHandlerISR, // 39 0x9c - IntDefaultHandlerISR, // 40 0xA0 - IntDefaultHandlerISR, // 41 0xA4 - IntDefaultHandlerISR, // 42 0xA8 - IntDefaultHandlerISR, // 43 0xAC - IntDefaultHandlerISR, // 44 0xB0 - IntDefaultHandlerISR, // 45 0xB4 - IntDefaultHandlerISR, // 46 0xB8 - IntDefaultHandlerISR, // 47 0xBC - IntDefaultHandlerISR, // 48 0xC0 - IntDefaultHandlerISR, // 49 0xC4 - IntDefaultHandlerISR, // 50 0xC8 - IntDefaultHandlerISR, // 51 0xCC - IntDefaultHandlerISR, // 52 0xD0 - IntDefaultHandlerISR, // 53 0xD4 - IntDefaultHandlerISR, // 54 0xD8 - IntDefaultHandlerISR, // 55 0xDC - IntDefaultHandlerISR, // 56 0xE0 - IntDefaultHandlerISR, // 57 0xE4 - IntDefaultHandlerISR, // 58 0xE8 - IntDefaultHandlerISR, // 59 0xEC - IntDefaultHandlerISR, // 60 0xF0 - IntDefaultHandlerISR, // 61 0xF4 - IntDefaultHandlerISR, // 62 0xF8 - IntDefaultHandlerISR, // 63 0xFC - IntDefaultHandlerISR, // 64 0x100 - IntDefaultHandlerISR, // 65 0x104 - IntDefaultHandlerISR, // 66 0x108 - IntDefaultHandlerISR, // 67 0x10C - IntDefaultHandlerISR, // 68 0x110 - IntDefaultHandlerISR, // 69 0x114 - IntDefaultHandlerISR, // 70 0x118 - IntDefaultHandlerISR, // 71 0x11C - IntDefaultHandlerISR, // 72 0x120 - IntDefaultHandlerISR, // 73 0x124 - IntDefaultHandlerISR, // 74 0x128 - IntDefaultHandlerISR, // 75 0x12C - IntDefaultHandlerISR, // 76 0x130 - IntDefaultHandlerISR, // 77 0x134 - 0, // 78 0x138 - IntDefaultHandlerISR, // 79 0x13C - IntDefaultHandlerISR, // 80 0x140 - IntDefaultHandlerISR, // 81 0x144 - IntDefaultHandlerISR, // 82 0x148 - IntDefaultHandlerISR, // 83 0x14C - IntDefaultHandlerISR, // 84 0x150 - IntDefaultHandlerISR, // 85 0x154 - IntDefaultHandlerISR, // 86 0x158 - IntDefaultHandlerISR, // 87 0x15C - IntDefaultHandlerISR, // 88 0x160 - IntDefaultHandlerISR, // 89 0x164 - IntDefaultHandlerISR, // 90 0x168 - IntDefaultHandlerISR, // 91 0x16C - IntDefaultHandlerISR, // 92 0x170 - IntDefaultHandlerISR, // 93 0x174 - IntDefaultHandlerISR, // 94 0x178 - 0, // 95 0x17C - 0, // 96 0x180 - IntDefaultHandlerISR, // 97 0x184 - 0, // 98 0x188 - 0, // 99 0x18C - IntDefaultHandlerISR, // 100 0x190 - 0, // 101 0x194 - IntDefaultHandlerISR, // 102 0x198 - IntDefaultHandlerISR, // 103 0x19C - LtdcIntHandlerISR, // 104 0x1A0 - 0, // 105 0x1A4 - 0, // 106 0x1A8 - IntDefaultHandlerISR, // 107 0x1AC - IntDefaultHandlerISR, // 108 0x1B0 - IntDefaultHandlerISR, // 109 0x1B4 - IntDefaultHandlerISR, // 110 0x1B8 - IntDefaultHandlerISR, // 111 0x1BC - IntDefaultHandlerISR, // 112 0x1C0 -}; - -// ELF entrypoint, not actually called at runtime, but it's a GC root -void *_start_elf(void) { return (void *)&Vectors; } diff --git a/stm32-lvgl/Sources/Support/Stubs.c b/stm32-lvgl/Sources/Support/Stubs.c deleted file mode 100644 index c67b280a..00000000 --- a/stm32-lvgl/Sources/Support/Stubs.c +++ /dev/null @@ -1,27 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2025 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -#include -#include - -// This is NOT real entropy. This implementation is a stub that generates -// predictable, sequential values for testing purposes only. Do not use this -// in production code where actual cryptographic randomness is required. -int getentropy(char *buffer, size_t length) { - for (size_t i = 0; i < length; i++) { - buffer[i] = i % 256; - } - return 0; -} - -void _exit(int status) { - __builtin_trap(); -} diff --git a/stm32-lvgl/Sources/Support/include/Support.h b/stm32-lvgl/Sources/Support/include/Support.h deleted file mode 100644 index 63765c25..00000000 --- a/stm32-lvgl/Sources/Support/include/Support.h +++ /dev/null @@ -1,43 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2025 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -#pragma once - -#include - -static inline void nop() { - asm volatile("nop"); -} - -static inline uint32_t primask_get(void) { - uint32_t r; - asm volatile("mrs %0, primask" : "=r" (r)); - return r; -} - -static inline void primask_set(uint32_t m) { - asm volatile("msr primask, %0" : : "r" (m)); -} - -static inline void cpsid_i(void) { - asm volatile("cpsid i"); -} - -static inline void delay(uint32_t i) { - __asm__ volatile( - " .align 2 \n" - "1: subs %0, #1\n" - " bhi 1b\n" - : "=r"(i) - : "0" (i) - : "cc" - ); -} diff --git a/stm32-lvgl/Sources/Support/linkerscript.ld b/stm32-lvgl/Sources/Support/linkerscript.ld deleted file mode 100644 index f3c07fdc..00000000 --- a/stm32-lvgl/Sources/Support/linkerscript.ld +++ /dev/null @@ -1,103 +0,0 @@ -/*===----------------------------------------------------------------------===*/ -/* */ -/* This source file is part of the Swift open source project */ -/* */ -/* Copyright (c) 2025 Apple Inc. and the Swift project authors. */ -/* Licensed under Apache License v2.0 with Runtime Library Exception */ -/* */ -/* See https://swift.org/LICENSE.txt for license information */ -/* */ -/*===----------------------------------------------------------------------===*/ - -/* - * This application uses ELF for linking, and uses the elf2hex.py post-processing tool for package the result into a - * form suitable for flashing. The entire memory layout scheme (which this linker script participates in) is: - * - * - At normal application runtime, the expected memory layout is: - * - * - 0x08000000-0x08100000 (flash) ... code + read-only globals - * - 0x20000000-0x20008000 (SRAM) ... stack - * - 0x20008000-0x20030000 (SRAM) ... read-write globals, and bss (zero initialized globals) - * - 0x20030000-0x20050000 (SRAM) ... heap - * - * - However, this layout cannot be flashed as is (because it uses the SRAM too), so a few more steps are needed. - * - * - In a linked ELF file, the memory locations of the sections match the expected runtime layout. The ELF file does not - * contain the stack and the heap, so we don't have to worry about those (there is also no expectation that the memory - * for those is zeroed out at program start). - * - * - The ELF file is given to the elf2hex.py tool, which will produce a .hex output, and we use the - * --relocate-data-segment flag to relocate the read-write globals region (0x20008000-0x20030000) into the flash - * region, concretely the region is appended at a 4-byte-aligned location after the other contents of the flash. - * - * - This is concretely achieved using the __flash_data_start+__flash_data_len and __data_start+__data_end symbols - * defined in this linker script. The elf2hex.py script finds the addresses of these symbols and performs the - * relocation of those bytes. - * - Note that after the relocation, the segments in ELF headers (PT_LOAD commands) don't match the actual physical - * layout. However, this relocation is reversed at early startup time, so that at "normal" runtime, the layout is - * as expected. See below. - * - * - The ARM core loads the initial stack pointer, and initial program counter from the vector table which is placed at - * a well-known location, concretely the very beginning of flash, 0x08000000. The linker script places the .vectors - * section as the very first section into the flash to satisfy this. See Startup.c for the concrete content of the - * vector table, and how the initial SP and PC are set up. - * - * - The initial startup code (ResetISR in Startup.c) only does one setup step (enabling the FPU) before performing the - * reverse relocation of the data segment. The runtime back-relocation is simply a memcpy from __flash_data_start back - * into __data_start (in the SRAM region). - * - * - During this and before this (e.g. when doing the FPU enablement), read-write globals cannot be used. Reading - * a read-write global won't read the correct initial value of that global. - * - That's why the ResetISR code is written as attribute((naked)) asm implementation. The implementation is also - * very simple and it's easy to see that it indeed does not touch any globals. - * - We expect that the implementation of memcpy is also not accessing any globals. This is a reasonable expectation - * on any embedded-friendly memcpy implementation. - * - * - After that, the normal runtime memory layout is matched, and the application continues to initialize itself and - * run. - */ - -MEMORY -{ - flash (rx) : ORIGIN = 0x08000000, LENGTH = 1024K /* end: 0x08100000 */ - sram_stack (rw) : ORIGIN = 0x20000000, LENGTH = 32K /* end: 0x20008000 */ - sram_data (rw) : ORIGIN = 0x20008000, LENGTH = 160K /* end: 0x20030000 */ - sram_heap (rw) : ORIGIN = 0x20030000, LENGTH = 128K /* end: 0x20050000 */ -} - -SECTIONS -{ - .text : { *(.vectors*) ; *(.text*) } > flash - .rodata : { *(.rodata*) ; *(.got*) } > flash - - __flash_data_start = (. + 3) & ~ 3; /* 4-byte aligned end of text is where data is going to be placed (by elf2hex) */ - - .bss : { *(.bss*) } > sram_data - .tbss : { *(.tbss*) } > sram_data - .data : { *(.data*) } > sram_data - - __flash_data_len = . - ORIGIN(sram_data); - - /* TODO: Add a safeguard to detect when adding data to flash would overflow the flash memory */ - - /DISCARD/ : { *(.swift_modhash*) } - - /* ARM metadata sections */ - /DISCARD/ : { *(.ARM.attributes*) *(.ARM.exidx) } - - /* ELF metadata sections */ - .symtab : { *(.symtab) } - .strtab : { *(.strtab) } - .shstrtab : { *(.shstrtab) } - .debug : { *(.debug*) } - .comment : { *(.comment) } -} - -__stack_start = ORIGIN(sram_stack); -__stack_end = ORIGIN(sram_stack) + LENGTH(sram_stack); - -__data_start = ORIGIN(sram_data); -__data_end = ORIGIN(sram_data) + LENGTH(sram_data); - -__heap_start = ORIGIN(sram_heap); -__heap_end = ORIGIN(sram_heap) + LENGTH(sram_heap); diff --git a/stm32-lvgl/clang-arm-toolchain.cmake b/stm32-lvgl/clang-arm-toolchain.cmake deleted file mode 100644 index db28d2de..00000000 --- a/stm32-lvgl/clang-arm-toolchain.cmake +++ /dev/null @@ -1,21 +0,0 @@ -set(CMAKE_SYSTEM_NAME Generic) -set(CMAKE_SYSTEM_PROCESSOR arm) -set(CMAKE_CROSSCOMPILING TRUE) - -# Specify the compilers -set(CMAKE_C_COMPILER "${TOOLCHAIN_PATH}/bin/clang") -set(CMAKE_CXX_COMPILER "${TOOLCHAIN_PATH}/bin/clang++") -set(CMAKE_ASM_COMPILER "${TOOLCHAIN_PATH}/bin/clang") - -# Target flags -set(CMAKE_C_FLAGS "-target arm-none-eabi -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -ffunction-sections -fdata-sections") -set(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS} -std=c++11 -fno-exceptions -fno-rtti") -set(CMAKE_ASM_FLAGS "${CMAKE_C_FLAGS}") - -# Search paths for libraries -set(CMAKE_FIND_ROOT_PATH "${TOOLCHAIN_PATH}") -set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) -set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) -set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) - -set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) diff --git a/stm32-lvgl/fetch-dependencies.sh b/stm32-lvgl/fetch-dependencies.sh deleted file mode 100755 index 02e2eedc..00000000 --- a/stm32-lvgl/fetch-dependencies.sh +++ /dev/null @@ -1,63 +0,0 @@ -#!/bin/bash - -set -vex - -### -### LLVM Embedded Toolchain for ARM -### - -VER=19.1.5 - -if [[ "$(uname -s)" == "Darwin" ]]; then - FILE=LLVM-ET-Arm-${VER}-Darwin-universal - EXT=dmg - SHA=0451e67dc9a9066c17f746c26654962fa3889d4df468db1245d1bae69438eaf5 -elif [[ "$(uname -s)" == "Linux" && "$(uname -m)" == "aarch64" ]]; then - FILE=LLVM-ET-Arm-${VER}-Linux-AArch64 - EXT=tar.xz - SHA=5e2f6b8c77464371ae2d7445114b4bdc19f56138e8aa864495181b52f57d0b85 -elif [[ "$(uname -s)" == "Linux" && "$(uname -m)" == "x86_64" ]]; then - FILE=LLVM-ET-Arm-${VER}-Linux-x86_64 - EXT=tar.xz - SHA=34ee877aadc78c5e9f067e603a1bc9745ed93ca7ae5dbfc9b4406508dc153920 -else - echo "No LLVM toolchain for this OS/arch ($(uname -s), $(uname -m))" - exit 1 -fi - -FOUND=no -SHA_MATCHES=no -if [[ -f /tmp/${FILE}.${EXT} ]]; then - FOUND=yes - if sha256 -c $SHA /tmp/${FILE}.${EXT}; then - SHA_MATCHES=yes - fi -fi - -if [[ "$FOUND" = "no" || "$SHA_MATCHES" = "no" ]]; then - curl https://github.com/ARM-software/LLVM-embedded-toolchain-for-Arm/releases/download/release-${VER}/${FILE}.${EXT} \ - -L -O --output-dir /tmp -fi - -if [[ "$EXT" = "dmg" ]]; then - hdiutil attach /tmp/${FILE}.${EXT} - ls -al /Volumes/${FILE} - rm -r ./llvm-toolchain || true - cp -a /Volumes/${FILE}/${FILE} ./llvm-toolchain - diskutil eject /Volumes/${FILE} -elif [[ "$EXT" = "tar.xz" ]]; then - rm -r ./llvm-toolchain || true - mkdir -p ./llvm-toolchain - tar -xvf /tmp/${FILE}.${EXT} -C ./llvm-toolchain --strip-components 1 -else - exit 1 -fi - - - -### -### LVGL -### - -rm -rf ./lvgl || true -git clone https://github.com/lvgl/lvgl.git --branch release/v9.2 diff --git a/stm32-lvgl/toolset.json b/stm32-lvgl/toolset.json deleted file mode 100644 index ba5ab791..00000000 --- a/stm32-lvgl/toolset.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "schemaVersion": "1.0", - "swiftCompiler": { - "extraCLIOptions": [ - "-Xfrontend", "-disable-stack-protector", - "-enable-experimental-feature", "Embedded", - "-enable-experimental-feature", "Extern", - "-Xclang-linker", "-nostdlib", - "-Xfrontend", "-function-sections", - "-Xfrontend", "-mergeable-symbols", - "-Xfrontend", "-enable-single-module-llvm-emission", - "-assert-config", "Debug", - "-Xclang-linker", "-fuse-ld=lld" - ] - }, - "cCompiler": { - "extraCLIOptions": [ - "-nostdlib", - "-ffunction-sections", - "-Illvm-toolchain/lib/clang-runtimes/arm-none-eabi/armv7m_soft_fpv4_sp_d16_exn_rtti/include", - "-mthumb", - "-Werror", - "-Wall", - "-static", - "-fno-stack-protector", - "-fno-common" - ] - }, - "linker": { - "extraCLIOptions": [ - "-nostdlib", - "-t", "-v", - "-T", "Sources/Support/linkerscript.ld", - "-Lllvm-toolchain/lib/clang-runtimes/arm-none-eabi/armv7m_soft_fpv4_sp_d16_exn_rtti/lib", - "-lc", - "-lclang_rt.builtins", - "-L.build/lvgl/lib", - "-llvgl", "-llvgl_demos", - "-static", - "-e", "_start_elf", - "--orphan-handling=error" - ] - } -} diff --git a/stm32-neopixel/Makefile b/stm32-neopixel/Makefile deleted file mode 100755 index 6b0125c0..00000000 --- a/stm32-neopixel/Makefile +++ /dev/null @@ -1,57 +0,0 @@ -##===----------------------------------------------------------------------===## -## -## This source file is part of the Swift open source project -## -## Copyright (c) 2025 Apple Inc. and the Swift project authors. -## Licensed under Apache License v2.0 with Runtime Library Exception -## -## See https://swift.org/LICENSE.txt for license information -## -##===----------------------------------------------------------------------===## - -# Paths -REPOROOT := $(shell git rev-parse --show-toplevel) -TOOLSROOT := $(REPOROOT)/Tools -TOOLSET := $(TOOLSROOT)/Toolsets/stm32f74x.json -MACHO2BIN := $(TOOLSROOT)/macho2bin.py -SWIFT_BUILD := swift build - -# Flags -ARCH := armv7em -TARGET := $(ARCH)-apple-none-macho -SWIFT_BUILD_ARGS := \ - --configuration release \ - --triple $(TARGET) \ - --toolset $(TOOLSET) -BUILDROOT := $(shell $(SWIFT_BUILD) $(SWIFT_BUILD_ARGS) --show-bin-path) - -.PHONY: build -build: - @echo "building..." - $(SWIFT_BUILD) \ - $(SWIFT_BUILD_ARGS) \ - -Xlinker -map -Xlinker $(BUILDROOT)/Application.mangled.map \ - --verbose - - @echo "demangling linker map..." - cat $(BUILDROOT)/Application.mangled.map \ - | c++filt | swift demangle > $(BUILDROOT)/Application.map - - @echo "disassembling..." - otool \ - -arch $(ARCH) -v -V -d -t \ - $(BUILDROOT)/Application \ - | c++filt | swift demangle > $(BUILDROOT)/Application.disassembly - - @echo "extracting binary..." - $(MACHO2BIN) \ - $(BUILDROOT)/Application \ - $(BUILDROOT)/Application.bin \ - --base-address 0x20010000 \ - --segments '__TEXT,__DATA,__VECTORS' - -.PHONY: clean -clean: - @echo "cleaning..." - @swift package clean - @rm -rf .build diff --git a/stm32-neopixel/Package.resolved b/stm32-neopixel/Package.resolved deleted file mode 100644 index e9d315fa..00000000 --- a/stm32-neopixel/Package.resolved +++ /dev/null @@ -1,33 +0,0 @@ -{ - "originHash" : "fec1335f7424378925c47a261a19ffe2160476fc1e6fd88c5e270ddff078da9d", - "pins" : [ - { - "identity" : "swift-argument-parser", - "kind" : "remoteSourceControl", - "location" : "https://github.com/apple/swift-argument-parser.git", - "state" : { - "revision" : "41982a3656a71c768319979febd796c6fd111d5c", - "version" : "1.5.0" - } - }, - { - "identity" : "swift-mmio", - "kind" : "remoteSourceControl", - "location" : "https://github.com/apple/swift-mmio", - "state" : { - "branch" : "main", - "revision" : "5232c5129a8c70beafc3d6acfbae2716c1b6822a" - } - }, - { - "identity" : "swift-syntax", - "kind" : "remoteSourceControl", - "location" : "https://github.com/swiftlang/swift-syntax.git", - "state" : { - "revision" : "0687f71944021d616d34d922343dcef086855920", - "version" : "600.0.1" - } - } - ], - "version" : 3 -} diff --git a/stm32-neopixel/Package.swift b/stm32-neopixel/Package.swift deleted file mode 100644 index 972f744c..00000000 --- a/stm32-neopixel/Package.swift +++ /dev/null @@ -1,34 +0,0 @@ -// swift-tools-version: 6.0 - -import PackageDescription - -let package = Package( - name: "stm32-neopixel", - products: [ - .executable(name: "Application", targets: ["Application"]) - ], - dependencies: [ - .package(url: "https://github.com/apple/swift-mmio", branch: "main") - ], - targets: [ - .executableTarget( - name: "Application", - dependencies: ["STM32F7X6", "Support"]), - // SVD2Swift \ - // --input Sources/STM32F7X6/stm32f7x6.patched.svd \ - // --output Sources/STM32F7X6 \ - // --access-level public \ - // --indentation-width 2 \ - // --peripherals DMA1 DMA2 GPIOA GPIOB GPIOI RCC SPI1 SPI2 USART1 - .target( - name: "STM32F7X6", - dependencies: [ - .product(name: "MMIO", package: "swift-mmio") - ], - plugins: [ - // Plugin disabled because SwiftPM is slow. - // .plugin(name: "SVD2SwiftPlugin", package: "swift-mmio") - ]), - .target(name: "Support"), - ], - swiftLanguageModes: [.v5]) diff --git a/stm32-neopixel/README.md b/stm32-neopixel/README.md deleted file mode 100644 index d006b5da..00000000 --- a/stm32-neopixel/README.md +++ /dev/null @@ -1,30 +0,0 @@ -# stm32-neopixel - - - -This demo is designed to run on an STM32 microcontroller and some additional hardware, detailed below: - -1. An [STM32F746G Discovery kit](https://www.st.com/en/evaluation-tools/32f746gdiscovery.html) -2. A 3.3V to 5V level shifter such as [Texas Instrument's TXB0104](https://www.ti.com/lit/ds/symlink/txb0104.pdf) which can be found on a breakout board for easier use, such as: [SparkFun Voltage-Level Translator Breakout](https://www.sparkfun.com/products/11771) -3. A NeoPixel WS2812 or compatible LED Strip; such as: [SparkFun LED RGB Strip](https://www.sparkfun.com/products/15205) -4. A breadboard, such as: [SparkFun Translucent Breadboard](https://www.sparkfun.com/products/9567) -5. A 5V power supply - -Connect the components as shown in the schematic below: - -![schematic](./schematic.png) - -We recommend including a capacitor across the LED strip power supply. - -## How to build and run this example: - -- Connect the STM32F746G-DISCO board via the ST-LINK USB port to your Mac. -- Make sure you have a recent nightly Swift toolchain that has Embedded Swift support. -- Install the `stlink` (https://github.com/stlink-org/stlink) command line tools, e.g. via `brew install stlink`. -- Build and upload the program to flash memory of the STM: -```console -$ cd stm32-neopixel -$ make -$ st-flash --reset write .build/release/Application.bin 0x08000000 -``` -- The LED strip should light up and slowly animate a color gradient. diff --git a/stm32-neopixel/Sources/Application/Application.swift b/stm32-neopixel/Sources/Application/Application.swift deleted file mode 100644 index 2daab9a9..00000000 --- a/stm32-neopixel/Sources/Application/Application.swift +++ /dev/null @@ -1,139 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2024 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -import STM32F7X6 -import Support - -@main -public struct Application { - public static func main() { - #if arch(arm) - enableFaults() - enableFPU() - #endif - - // MARK: Clock configuration - // Disable PLL. - rcc.cr.modify { $1.raw.pllon = 0 } - - // Configure UART to always use HSI. - rcc.dckcfgr2.modify { $0.usart1sel = .HSI } - - // Configure PLL to convert the 16MHz HSI to a 12.8MHz SYSCLK. - // HSI is measured to be closer to 16.6Mhz on my device. - // The SPI bus must run at 6.4MHz which is achieved with a /2 prescalar. - // M = 10 - // N = 64 - // P = 8 - // ((16MHz / M ) * N) / P = 12.8MHz - - rcc.pllcfgr.modify { rw in - // Clear all non-reserved registers. - rw.raw.storage &= 0b1111_0000_1011_1100__1000_0000_0000_0000 - rw.raw.pllm = 10 // Set M constant - rw.raw.plln = 64 // Set N constant - rw.pllp = .Div8 // Set P constant - rw.pllsrc = .HSI // Select HSI PLL Source - } - - // Enable the PLL clock and wait for ready. - rcc.cr.modify { $1.raw.pllon = 1 } - while rcc.cr.read().raw.pllrdy != 1 {} - - // Change the SYSCLK mux to select the PLL clock and wait for ready. - rcc.cfgr.modify { rw in - rw.raw.sw = 0b10 // Select PLL clock. - rw.raw.hpre = 0 // system clock not divided - rw.raw.ppre1 = 0 // AHB clock not divided - rw.raw.ppre2 = 0 // AHB clock not divided - } - while rcc.cfgr.read().raw.sws != 0b10 {} - - // DMA - rcc.ahb1enr.modify { $0.raw.dma1en = 1 } - // GPIO - rcc.ahb1enr.modify { rw in - rw.raw.gpioaen = 1 - rw.raw.gpioben = 1 - rw.raw.gpioien = 1 - } - // SPI - rcc.apb1enr.modify { $0.raw.spi2en = 1 } - // UART - rcc.apb2enr.modify { $0.raw.usart1en = 1 } - - // MARK: Peripheral Configuration - // GPIO - SPI pin configuration - gpiob.configure( - pin: 15, - as: .init( - mode: .alternateFunction, - outputType: .pushPull, - outputSpeed: .max, - pull: .none, - alternateFunction: 5)) - gpioi.configure( - pin: 1, - as: .init( - mode: .alternateFunction, - outputType: .pushPull, - outputSpeed: .max, - pull: .none, - alternateFunction: 5)) - - // GPIO - UART pin configuration - gpioa.configure( - pin: 9, - as: .init( - mode: .alternateFunction, - outputType: .pushPull, - outputSpeed: .low, - pull: .none, - alternateFunction: 7)) - gpiob.configure( - pin: 7, - as: .init( - mode: .alternateFunction, - outputType: .pushPull, - outputSpeed: .low, - pull: .none, - alternateFunction: 7)) - - // UART configuration - usart1.brr.modify { $0.raw.brr_field = 16_000_000 / 115200 } - usart1.cr1.modify { rw in - rw.ue = .Enabled - rw.re = .Enabled - rw.te = .Enabled - } - - // MARK: Main loop - print("Hello Swift!") - var neoPixel = SPINeoPixel(dma: dma1, spi: spi2, pixelCount: 60) - while true { - neoPixel.rainbow() - neoPixel.draw() - } - } -} - -@_cdecl("Default_Handler") -public func defaultHandler() { - while true {} -} - -@_cdecl("putchar") -public func putchar(_ value: CInt) -> CInt { - while usart1.isr.read().raw.txe == 0 {} - usart1.tdr.modify { $0.raw.tdr_field = UInt32(value) } - while usart1.isr.read().raw.txe == 0 {} - return 0 -} diff --git a/stm32-neopixel/Sources/Application/GPIO.swift b/stm32-neopixel/Sources/Application/GPIO.swift deleted file mode 100644 index 8e24b427..00000000 --- a/stm32-neopixel/Sources/Application/GPIO.swift +++ /dev/null @@ -1,111 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2024 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -import STM32F7X6 - -extension GPIOA { - enum Mode: UInt32 { - case input = 0x0 - case output = 0x1 - case alternateFunction = 0x2 - case analog = 0x3 - } - - enum OutputType: UInt32 { - case pushPull = 0x0 - case openDrain = 0x1 - } - - enum OutputSpeed: UInt32 { - case low = 0x0 - case medium = 0x1 - case high = 0x2 - case max = 0x3 - } - - enum Pull: UInt32 { - case `none` = 0x0 - case up = 0x1 - case down = 0x2 - } - - struct Configuration { - var mode: Mode - var outputType: OutputType - var outputSpeed: OutputSpeed - var pull: Pull - var alternateFunction: UInt32 - } - - func configure(pin: Int, as configuration: Configuration) { - self.moder.modify { rw in - rw.raw.storage.set( - value: configuration.mode.rawValue, - mask: 0b11, - offset: pin * 2) - } - - // Comprised of 16 x 1 bit fields. - self.otyper.modify { rw in - rw.raw.storage.set( - value: configuration.outputType.rawValue, - mask: 0b1, - offset: pin) - } - - // Comprised of 16 x 2 bit fields. - self.ospeedr.modify { rw in - rw.raw.storage.set( - value: configuration.outputSpeed.rawValue, - mask: 0b11, - offset: pin * 2) - } - - // Comprised of 16 x 2 bit fields. - self.pupdr.modify { rw in - rw.raw.storage.set( - value: configuration.pull.rawValue, - mask: 0b11, - offset: pin * 2) - } - - // Comprised of 16 x 4 bit fields, split across 2 registers. - if pin < 8 { - self.afrl.modify { rw in - rw.raw.storage.set( - value: configuration.alternateFunction, - mask: 0b1111, - offset: pin * 4) - } - } else { - self.afrh.modify { rw in - rw.raw.storage.set( - value: configuration.alternateFunction, - mask: 0b1111, - offset: (pin - 8) * 4) - } - } - } -} - -extension UInt32 { - fileprivate func get(mask: Self, offset: UInt8) -> Self { - let mask = mask &<< offset - return (self & mask) &>> offset - } - - fileprivate mutating func set(value: Self, mask: Self, offset: Int) { - let mask = mask &<< offset - let oldValue: UInt32 = self & ~mask - let newValue: UInt32 = (value &<< offset) & mask - self = oldValue | newValue - } -} diff --git a/stm32-neopixel/Sources/Application/Neopixel/HSV8Pixel.swift b/stm32-neopixel/Sources/Application/Neopixel/HSV8Pixel.swift deleted file mode 100644 index e13190e4..00000000 --- a/stm32-neopixel/Sources/Application/Neopixel/HSV8Pixel.swift +++ /dev/null @@ -1,16 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2024 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -struct HSV8Pixel { - var hue: UInt8 - var saturation: UInt8 - var value: UInt8 -} diff --git a/stm32-neopixel/Sources/Application/Neopixel/RGB8Pixel.swift b/stm32-neopixel/Sources/Application/Neopixel/RGB8Pixel.swift deleted file mode 100644 index 9188c2af..00000000 --- a/stm32-neopixel/Sources/Application/Neopixel/RGB8Pixel.swift +++ /dev/null @@ -1,118 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2024 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -struct RGB8Pixel { - var red: UInt8 - var green: UInt8 - var blue: UInt8 -} - -extension RGB8Pixel { - init(_ pixel: SPINeoPixelGRB64Pixel) { - self.red = .rawChannel(neoPixelChannel: pixel.red) - self.green = .rawChannel(neoPixelChannel: pixel.green) - self.blue = .rawChannel(neoPixelChannel: pixel.blue) - } -} - -extension RGB8Pixel { - @inline(never) - init(_ pixel: HSV8Pixel) { - // Fast path: gray scale. - guard pixel.saturation != 0 else { - self.red = pixel.value - self.green = pixel.value - self.blue = pixel.value - return - } - - // Slow path: compute each color component. - var hue = Float32(pixel.hue) / Float32(UInt8.max) - let saturation = Float32(pixel.saturation) / Float32(UInt8.max) - let value = Float32(pixel.value) / Float32(UInt8.max) - - let clampedHue = max(0, min(1 - .ulpOfOne, hue)) - let scaledHue = clampedHue * 6 - let sector = UInt8(scaledHue) - hue = scaledHue - Float32(sector) - - let fractionalChannel1 = value * (1.0 - (saturation * (1.0 - 0.0))) - let fractionalChannel2 = value * (1.0 - (saturation * (hue - 0.0))) - let fractionalChannel3 = value * (1.0 - (saturation * (1.0 - hue))) - - let channel1 = UInt8(fractionalChannel1 * Float32(UInt8.max)) - let channel2 = UInt8(fractionalChannel2 * Float32(UInt8.max)) - let channel3 = UInt8(fractionalChannel3 * Float32(UInt8.max)) - - switch sector { - case 0: - self.red = pixel.value - self.green = channel3 - self.blue = channel1 - case 1: - self.red = channel2 - self.green = pixel.value - self.blue = channel1 - case 2: - self.red = channel1 - self.green = pixel.value - self.blue = channel3 - case 3: - self.red = channel1 - self.green = channel2 - self.blue = pixel.value - case 4: - self.red = channel3 - self.green = channel1 - self.blue = pixel.value - case 5: - self.red = pixel.value - self.green = channel1 - self.blue = channel2 - default: - fatalError("Unreachable") - } - } -} - -extension RGB8Pixel { - static let gammaCorrection: [UInt8] = [ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, - 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, - 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, - 10, 10, 11, 11, 11, 12, 12, 13, 13, 13, 14, 14, 15, 15, 16, 16, - 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 24, 24, 25, - 25, 26, 27, 27, 28, 29, 29, 30, 31, 32, 32, 33, 34, 35, 35, 36, - 37, 38, 39, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 50, - 51, 52, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 66, 67, 68, - 69, 70, 72, 73, 74, 75, 77, 78, 79, 81, 82, 83, 85, 86, 87, 89, - 90, 92, 93, 95, 96, 98, 99, 101, 102, 104, 105, 107, 109, 110, 112, 114, - 115, 117, 119, 120, 122, 124, 126, 127, 129, 131, 133, 135, 137, 138, 140, - 142, - 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 167, 169, 171, 173, - 175, - 177, 180, 182, 184, 186, 189, 191, 193, 196, 198, 200, 203, 205, 208, 210, - 213, - 215, 218, 220, 223, 225, 228, 231, 233, 236, 239, 241, 244, 247, 249, 252, - 255, - ] - - var gammaCorrected: Self { - RGB8Pixel( - red: Self.gammaCorrection[Int(self.red)], - green: Self.gammaCorrection[Int(self.green)], - blue: Self.gammaCorrection[Int(self.blue)]) - } -} - -extension RGB8Pixel: Equatable {} diff --git a/stm32-neopixel/Sources/Application/Neopixel/SPINeoPixel.swift b/stm32-neopixel/Sources/Application/Neopixel/SPINeoPixel.swift deleted file mode 100644 index c130ce5e..00000000 --- a/stm32-neopixel/Sources/Application/Neopixel/SPINeoPixel.swift +++ /dev/null @@ -1,204 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2024 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -import STM32F7X6 - -class PixelBuffer { - let buffer: UnsafeMutableBufferPointer - - init(count: Int) { - self.buffer = .allocate(capacity: count) - self.buffer.initialize(repeating: .reset) - } - - deinit { - self.buffer.deallocate() - } -} - -struct SPINeoPixel { - var dma: DMA1 - var spi: SPI2 - var pixels: PixelBuffer - var base: UInt8 = 0 - - init( - dma: DMA1, - spi: SPI2, - pixelCount: Int - ) { - precondition(MemoryLayout.size == 24) - precondition(MemoryLayout.stride == 24) - self.dma = dma - self.spi = spi - self.pixels = PixelBuffer(count: pixelCount) - } -} - -extension SPINeoPixel { - @inline(never) - mutating func clear() { - let rgb = RGB8Pixel(red: 0, green: 0, blue: 0) - let pixel = SPINeoPixelGRB64Pixel(rgb) - for index in self.pixels.buffer.indices { - self.pixels.buffer[index] = pixel - } - } - - @inline(never) - mutating func rainbow() { - var hsv = HSV8Pixel(hue: self.base, saturation: 255, value: 255) - for index in self.pixels.buffer.indices { - hsv.hue &+= 1 - let rgb = RGB8Pixel(hsv) - self.pixels.buffer[index] = SPINeoPixelGRB64Pixel(rgb.gammaCorrected) - } - self.base &+= 1 - } - - @inline(never) - mutating func draw() { - // swift-format-ignore: NeverForceUnwrap - let memory = UInt32(UInt(bitPattern: self.pixels.buffer.baseAddress!)) - let peripheral = UInt32(spi.dr.unsafeAddress) - let count = UInt32( - self.pixels.buffer.count * MemoryLayout.size) - - let index = 4 - self.dma.st[index].cr.modify { rw in - rw.raw.chsel = 0 // Set the DMA channel to 0 (spi tx). - rw.raw.mburst = 0b00 // Set memory to single transaction mode. - rw.pburst = .Single // Set peripheral to single transaction mode. - // ct - rw.dbm = .Disabled // Disable double buffer mode. - rw.pl = .VeryHigh // Set the stream priority to very high. - // pincos - rw.raw.msize = 0b00 // Set memory data width to 8 bit. - rw.psize = .Bits8 // Set peripheral data width to 8 bit. - rw.raw.minc = 1 // Set memory to incremented mode. - rw.pinc = .Fixed // Set peripheral to fixed (no-increment) mode. - rw.circ = .Disabled // Disable circular mode. - rw.dir = .MemoryToPeripheral // Set transfer direction. - rw.pfctrl = .DMA // Set the DMA as the flow controller. - rw.tcie = .Enabled // Enable transfer complete interrupt. - rw.htie = .Enabled // Enable half transfer interrupt. - rw.teie = .Enabled // Enable transfer error interrupt. - rw.dmeie = .Enabled // Enable direct mode error interrupt. - } - - // Set the total number of data items to the buffer size. - self.dma.st[index].ndtr.modify { $0.raw.ndt = UInt32(count) } - - // Set the destination peripheral port address to the spi data port. - self.dma.st[index].par.modify { $0.raw.pa = peripheral } - - // Set the source memory address to the buffer's base. - self.dma.st[index].m0ar.modify { $0.raw.m0a = memory } - - // Clear the second memory address as double buffering mode is disabled. - self.dma.st[index].m1ar.modify { $0.raw.m1a = 0 } - - self.dma.st[index].fcr.modify { _, w in - w.feie = .Enabled // Enable FIFO error interrupt. - w.dmdis = .Disabled // Enable direct mode (double negative). - w.fth = .Quarter // Reset FIFO threshold (no effect in direct mode). - } - - self.dma.hifcr.modify { _, w in - w.raw.ctcif4 = 1 // Clear transfer complete interrupt flag. - w.raw.chtif4 = 1 // Clear half transfer interrupt flag. - w.raw.cteif4 = 1 // Clear transfer error interrupt flag. - w.raw.cdmeif4 = 1 // Clear direct mode error interrupt flag. - w.raw.cfeif4 = 1 // Clear FIFO error interrupt flag. - } - - self.spi.cr1.modify { rw in - rw.bidimode = .Unidirectional // Set full duplex. - rw.bidioe = .OutputDisabled - rw.crcen = .Disabled // Disable hardware crc. - rw.crcnext = .TxBuffer - rw.crcl = .EightBit - rw.rxonly = .FullDuplex // Set full duplex. - // FIXME: understand this Disable software slave management and select. - rw.ssm = .Enabled - rw.ssi = .SlaveNotSelected - rw.lsbfirst = .MSBFirst // Set data MSB first. - // spe - rw.br = .Div2 // Set Baud Rate as Fpclk/2. - rw.mstr = .Master // Set Master mode. - rw.cpol = .IdleLow // Set active high logic. - // FIXME: understand this Set trailing edge logic. - rw.cpha = .SecondEdge - } - - // Write to SPI_CR2 register: - // a) Configure the DS[3:0] bits to select the data length for the transfer. - // b) Configure SSOE (Notes: 1 & 2 & 3). - // c) Set the FRF bit if the TI protocol is required (keep NSSP bit cleared - // in TI mode). - // d) Set the NSSP bit if the NSS pulse mode between two data units is - // required (keep CHPA and TI bits cleared in NSSP mode). - // e) Configure the FRXTH bit. The RXFIFO threshold must be aligned to the - // read access size for the SPIx_DR register. - // f) Initialize LDMA_TX and LDMA_RX bits if DMA is used in packed mode. - - self.spi.cr2.modify { rw in - rw.rxdmaen = .Disabled // Disable rx dma. - rw.txdmaen = .Enabled // Enable tx dma. - // FIXME: understand this Disable slave select. - // rw.ssoe = 0 - // FIXME: understand this Disable NSS pulse management. - // rw.nssp = 0 - rw.frf = .Motorola // Reset frame format (i2s). - rw.errie = .NotMasked // Enable error interrupt. - rw.rxneie = .NotMasked // Enable rx not buffer empty interrupt. - rw.txeie = .NotMasked // Enable tx buffer empty interrupt. - rw.ds = .EightBit // Set Data size to 8 bit. - rw.frxth = .Quarter // Set RXNE if FIFO <8 bits. - rw.ldma_rx = .Even // Reset dma reception length. - rw.ldma_tx = .Even // Reset dma transmission length. - } - - // Activate the stream. - self.dma.st[index].cr.modify { $0.en = .Enabled } - - // Activate the SPI peripheral - self.spi.cr1.modify { $0.spe = .Enabled } - - func wait() -> Bool { - while true { - let hisr = self.dma.hisr.read().raw - if hisr.tcif4 == 1 { return true } - if hisr.teif4 == 1 { return false } - if hisr.dmeif4 == 1 { return false } - if hisr.feif4 == 1 { return false } - } - } - - _ = wait() - - // Wait until no more data to transmit. - while self.spi.sr.read().raw.ftlvl != 0b00 {} - // Wait until the last data frame is processed. - while self.spi.sr.read().raw.bsy != 0 {} - // Disable the SPI peripheral. - self.spi.cr1.modify { $0.spe = .Disabled } - // Don't wait until the read data is received since the NeoPixel is not - // a real SPI device. This will lead to overrun errors but they can be - // safely ignored. - // while self.spi.sr.read().raw.frlvl != 0b00 { } - - // Disable any existing DMA transfer on stream 0. - self.dma.st[index].cr.modify { $0.en = .Disabled } - // Wait for the DMA stream to actually shutdown. - while self.dma.st[index].cr.read().en != .Disabled {} - } -} diff --git a/stm32-neopixel/Sources/Application/Neopixel/SPINeoPixelBit.swift b/stm32-neopixel/Sources/Application/Neopixel/SPINeoPixelBit.swift deleted file mode 100644 index daa239aa..00000000 --- a/stm32-neopixel/Sources/Application/Neopixel/SPINeoPixelBit.swift +++ /dev/null @@ -1,16 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2024 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -enum SPINeoPixelBit: UInt8 { - case reset = 0b0000_0000 - case zero = 0b1100_0000 - case one = 0b1111_1000 -} diff --git a/stm32-neopixel/Sources/Application/Neopixel/SPINeoPixelGRB64Pixel.swift b/stm32-neopixel/Sources/Application/Neopixel/SPINeoPixelGRB64Pixel.swift deleted file mode 100644 index 5cd09488..00000000 --- a/stm32-neopixel/Sources/Application/Neopixel/SPINeoPixelGRB64Pixel.swift +++ /dev/null @@ -1,63 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2024 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -struct SPINeoPixelGRB64Pixel { - var green: UInt64 - var red: UInt64 - var blue: UInt64 -} - -extension SPINeoPixelGRB64Pixel { - static let reset = Self(green: 0, red: 0, blue: 0) -} - -extension SPINeoPixelGRB64Pixel { - init(_ pixel: RGB8Pixel) { - self.green = .neoPixelChannel(rawChannel: pixel.green) - self.red = .neoPixelChannel(rawChannel: pixel.red) - self.blue = .neoPixelChannel(rawChannel: pixel.blue) - } -} - -extension UInt64 { - static func neoPixelChannel(rawChannel: UInt8) -> Self { - var rawChannel = rawChannel - var neoPixelChannel: Self = 0 - for _ in 0..>= 1 - neoPixelChannel <<= 8 - neoPixelChannel |= Self(bit.rawValue) - } - return neoPixelChannel - } -} - -extension UInt8 { - static func rawChannel(neoPixelChannel: UInt64) -> Self { - var neoPixelChannel = neoPixelChannel - var rawChannel: Self = 0 - for _ in 0..>= 8 - rawChannel <<= 1 - rawChannel |= UInt8(bit) - } - return rawChannel - } -} diff --git a/stm32-neopixel/Sources/STM32F7X6/DMA1.swift b/stm32-neopixel/Sources/STM32F7X6/DMA1.swift deleted file mode 100644 index a8ad2dab..00000000 --- a/stm32-neopixel/Sources/STM32F7X6/DMA1.swift +++ /dev/null @@ -1,7 +0,0 @@ -// Generated by svd2swift. - -import MMIO - -/// DMA controller -public typealias DMA1 = DMA2 - diff --git a/stm32-neopixel/Sources/STM32F7X6/DMA2.swift b/stm32-neopixel/Sources/STM32F7X6/DMA2.swift deleted file mode 100644 index 8b61636f..00000000 --- a/stm32-neopixel/Sources/STM32F7X6/DMA2.swift +++ /dev/null @@ -1,893 +0,0 @@ -// Generated by svd2swift. - -import MMIO - -/// DMA controller -@RegisterBlock -public struct DMA2 { - /// low interrupt status register - @RegisterBlock(offset: 0x0) - public var lisr: Register - - /// high interrupt status register - @RegisterBlock(offset: 0x4) - public var hisr: Register - - /// low interrupt flag clear register - @RegisterBlock(offset: 0x8) - public var lifcr: Register - - /// high interrupt flag clear register - @RegisterBlock(offset: 0xc) - public var hifcr: Register - - /// Stream cluster: S?CR, S?NDTR, S?M0AR, S?M1AR and S?FCR registers - @RegisterBlock(offset: 0x10, stride: 0x18, count: 8) - public var st: RegisterArray -} - -extension DMA2 { - /// low interrupt status register - @Register(bitWidth: 32) - public struct LISR { - /// Stream x transfer complete interrupt flag (x = 3..0) - @ReadOnly(bits: 27..<28) - public var tcif3: TCIF3 - - /// Stream x half transfer interrupt flag (x=3..0) - @ReadOnly(bits: 26..<27) - public var htif3: HTIF3 - - /// Stream x transfer error interrupt flag (x=3..0) - @ReadOnly(bits: 25..<26) - public var teif3: TEIF3 - - /// Stream x direct mode error interrupt flag (x=3..0) - @ReadOnly(bits: 24..<25) - public var dmeif3: DMEIF3 - - /// Stream x FIFO error interrupt flag (x=3..0) - @ReadOnly(bits: 22..<23) - public var feif3: FEIF3 - - /// Stream x transfer complete interrupt flag (x = 3..0) - @ReadOnly(bits: 21..<22) - public var tcif2: TCIF2 - - /// Stream x half transfer interrupt flag (x=3..0) - @ReadOnly(bits: 20..<21) - public var htif2: HTIF2 - - /// Stream x transfer error interrupt flag (x=3..0) - @ReadOnly(bits: 19..<20) - public var teif2: TEIF2 - - /// Stream x direct mode error interrupt flag (x=3..0) - @ReadOnly(bits: 18..<19) - public var dmeif2: DMEIF2 - - /// Stream x FIFO error interrupt flag (x=3..0) - @ReadOnly(bits: 16..<17) - public var feif2: FEIF2 - - /// Stream x transfer complete interrupt flag (x = 3..0) - @ReadOnly(bits: 11..<12) - public var tcif1: TCIF1 - - /// Stream x half transfer interrupt flag (x=3..0) - @ReadOnly(bits: 10..<11) - public var htif1: HTIF1 - - /// Stream x transfer error interrupt flag (x=3..0) - @ReadOnly(bits: 9..<10) - public var teif1: TEIF1 - - /// Stream x direct mode error interrupt flag (x=3..0) - @ReadOnly(bits: 8..<9) - public var dmeif1: DMEIF1 - - /// Stream x FIFO error interrupt flag (x=3..0) - @ReadOnly(bits: 6..<7) - public var feif1: FEIF1 - - /// Stream x transfer complete interrupt flag (x = 3..0) - @ReadOnly(bits: 5..<6) - public var tcif0: TCIF0 - - /// Stream x half transfer interrupt flag (x=3..0) - @ReadOnly(bits: 4..<5) - public var htif0: HTIF0 - - /// Stream x transfer error interrupt flag (x=3..0) - @ReadOnly(bits: 3..<4) - public var teif0: TEIF0 - - /// Stream x direct mode error interrupt flag (x=3..0) - @ReadOnly(bits: 2..<3) - public var dmeif0: DMEIF0 - - /// Stream x FIFO error interrupt flag (x=3..0) - @ReadOnly(bits: 0..<1) - public var feif0: FEIF0 - } - - /// high interrupt status register - @Register(bitWidth: 32) - public struct HISR { - /// Stream x transfer complete interrupt flag (x=7..4) - @ReadOnly(bits: 27..<28) - public var tcif7: TCIF7 - - /// Stream x half transfer interrupt flag (x=7..4) - @ReadOnly(bits: 26..<27) - public var htif7: HTIF7 - - /// Stream x transfer error interrupt flag (x=7..4) - @ReadOnly(bits: 25..<26) - public var teif7: TEIF7 - - /// Stream x direct mode error interrupt flag (x=7..4) - @ReadOnly(bits: 24..<25) - public var dmeif7: DMEIF7 - - /// Stream x FIFO error interrupt flag (x=7..4) - @ReadOnly(bits: 22..<23) - public var feif7: FEIF7 - - /// Stream x transfer complete interrupt flag (x=7..4) - @ReadOnly(bits: 21..<22) - public var tcif6: TCIF6 - - /// Stream x half transfer interrupt flag (x=7..4) - @ReadOnly(bits: 20..<21) - public var htif6: HTIF6 - - /// Stream x transfer error interrupt flag (x=7..4) - @ReadOnly(bits: 19..<20) - public var teif6: TEIF6 - - /// Stream x direct mode error interrupt flag (x=7..4) - @ReadOnly(bits: 18..<19) - public var dmeif6: DMEIF6 - - /// Stream x FIFO error interrupt flag (x=7..4) - @ReadOnly(bits: 16..<17) - public var feif6: FEIF6 - - /// Stream x transfer complete interrupt flag (x=7..4) - @ReadOnly(bits: 11..<12) - public var tcif5: TCIF5 - - /// Stream x half transfer interrupt flag (x=7..4) - @ReadOnly(bits: 10..<11) - public var htif5: HTIF5 - - /// Stream x transfer error interrupt flag (x=7..4) - @ReadOnly(bits: 9..<10) - public var teif5: TEIF5 - - /// Stream x direct mode error interrupt flag (x=7..4) - @ReadOnly(bits: 8..<9) - public var dmeif5: DMEIF5 - - /// Stream x FIFO error interrupt flag (x=7..4) - @ReadOnly(bits: 6..<7) - public var feif5: FEIF5 - - /// Stream x transfer complete interrupt flag (x=7..4) - @ReadOnly(bits: 5..<6) - public var tcif4: TCIF4 - - /// Stream x half transfer interrupt flag (x=7..4) - @ReadOnly(bits: 4..<5) - public var htif4: HTIF4 - - /// Stream x transfer error interrupt flag (x=7..4) - @ReadOnly(bits: 3..<4) - public var teif4: TEIF4 - - /// Stream x direct mode error interrupt flag (x=7..4) - @ReadOnly(bits: 2..<3) - public var dmeif4: DMEIF4 - - /// Stream x FIFO error interrupt flag (x=7..4) - @ReadOnly(bits: 0..<1) - public var feif4: FEIF4 - } - - /// low interrupt flag clear register - @Register(bitWidth: 32) - public struct LIFCR { - /// Stream x clear transfer complete interrupt flag (x = 3..0) - @WriteOnly(bits: 27..<28) - public var ctcif3: CTCIF3 - - /// Stream x clear half transfer interrupt flag (x = 3..0) - @WriteOnly(bits: 26..<27) - public var chtif3: CHTIF3 - - /// Stream x clear transfer error interrupt flag (x = 3..0) - @WriteOnly(bits: 25..<26) - public var cteif3: CTEIF3 - - /// Stream x clear direct mode error interrupt flag (x = 3..0) - @WriteOnly(bits: 24..<25) - public var cdmeif3: CDMEIF3 - - /// Stream x clear FIFO error interrupt flag (x = 3..0) - @WriteOnly(bits: 22..<23) - public var cfeif3: CFEIF3 - - /// Stream x clear transfer complete interrupt flag (x = 3..0) - @WriteOnly(bits: 21..<22) - public var ctcif2: CTCIF2 - - /// Stream x clear half transfer interrupt flag (x = 3..0) - @WriteOnly(bits: 20..<21) - public var chtif2: CHTIF2 - - /// Stream x clear transfer error interrupt flag (x = 3..0) - @WriteOnly(bits: 19..<20) - public var cteif2: CTEIF2 - - /// Stream x clear direct mode error interrupt flag (x = 3..0) - @WriteOnly(bits: 18..<19) - public var cdmeif2: CDMEIF2 - - /// Stream x clear FIFO error interrupt flag (x = 3..0) - @WriteOnly(bits: 16..<17) - public var cfeif2: CFEIF2 - - /// Stream x clear transfer complete interrupt flag (x = 3..0) - @WriteOnly(bits: 11..<12) - public var ctcif1: CTCIF1 - - /// Stream x clear half transfer interrupt flag (x = 3..0) - @WriteOnly(bits: 10..<11) - public var chtif1: CHTIF1 - - /// Stream x clear transfer error interrupt flag (x = 3..0) - @WriteOnly(bits: 9..<10) - public var cteif1: CTEIF1 - - /// Stream x clear direct mode error interrupt flag (x = 3..0) - @WriteOnly(bits: 8..<9) - public var cdmeif1: CDMEIF1 - - /// Stream x clear FIFO error interrupt flag (x = 3..0) - @WriteOnly(bits: 6..<7) - public var cfeif1: CFEIF1 - - /// Stream x clear transfer complete interrupt flag (x = 3..0) - @WriteOnly(bits: 5..<6) - public var ctcif0: CTCIF0 - - /// Stream x clear half transfer interrupt flag (x = 3..0) - @WriteOnly(bits: 4..<5) - public var chtif0: CHTIF0 - - /// Stream x clear transfer error interrupt flag (x = 3..0) - @WriteOnly(bits: 3..<4) - public var cteif0: CTEIF0 - - /// Stream x clear direct mode error interrupt flag (x = 3..0) - @WriteOnly(bits: 2..<3) - public var cdmeif0: CDMEIF0 - - /// Stream x clear FIFO error interrupt flag (x = 3..0) - @WriteOnly(bits: 0..<1) - public var cfeif0: CFEIF0 - } - - /// high interrupt flag clear register - @Register(bitWidth: 32) - public struct HIFCR { - /// Stream x clear transfer complete interrupt flag (x = 7..4) - @WriteOnly(bits: 27..<28) - public var ctcif7: CTCIF7 - - /// Stream x clear half transfer interrupt flag (x = 7..4) - @WriteOnly(bits: 26..<27) - public var chtif7: CHTIF7 - - /// Stream x clear transfer error interrupt flag (x = 7..4) - @WriteOnly(bits: 25..<26) - public var cteif7: CTEIF7 - - /// Stream x clear direct mode error interrupt flag (x = 7..4) - @WriteOnly(bits: 24..<25) - public var cdmeif7: CDMEIF7 - - /// Stream x clear FIFO error interrupt flag (x = 7..4) - @WriteOnly(bits: 22..<23) - public var cfeif7: CFEIF7 - - /// Stream x clear transfer complete interrupt flag (x = 7..4) - @WriteOnly(bits: 21..<22) - public var ctcif6: CTCIF6 - - /// Stream x clear half transfer interrupt flag (x = 7..4) - @WriteOnly(bits: 20..<21) - public var chtif6: CHTIF6 - - /// Stream x clear transfer error interrupt flag (x = 7..4) - @WriteOnly(bits: 19..<20) - public var cteif6: CTEIF6 - - /// Stream x clear direct mode error interrupt flag (x = 7..4) - @WriteOnly(bits: 18..<19) - public var cdmeif6: CDMEIF6 - - /// Stream x clear FIFO error interrupt flag (x = 7..4) - @WriteOnly(bits: 16..<17) - public var cfeif6: CFEIF6 - - /// Stream x clear transfer complete interrupt flag (x = 7..4) - @WriteOnly(bits: 11..<12) - public var ctcif5: CTCIF5 - - /// Stream x clear half transfer interrupt flag (x = 7..4) - @WriteOnly(bits: 10..<11) - public var chtif5: CHTIF5 - - /// Stream x clear transfer error interrupt flag (x = 7..4) - @WriteOnly(bits: 9..<10) - public var cteif5: CTEIF5 - - /// Stream x clear direct mode error interrupt flag (x = 7..4) - @WriteOnly(bits: 8..<9) - public var cdmeif5: CDMEIF5 - - /// Stream x clear FIFO error interrupt flag (x = 7..4) - @WriteOnly(bits: 6..<7) - public var cfeif5: CFEIF5 - - /// Stream x clear transfer complete interrupt flag (x = 7..4) - @WriteOnly(bits: 5..<6) - public var ctcif4: CTCIF4 - - /// Stream x clear half transfer interrupt flag (x = 7..4) - @WriteOnly(bits: 4..<5) - public var chtif4: CHTIF4 - - /// Stream x clear transfer error interrupt flag (x = 7..4) - @WriteOnly(bits: 3..<4) - public var cteif4: CTEIF4 - - /// Stream x clear direct mode error interrupt flag (x = 7..4) - @WriteOnly(bits: 2..<3) - public var cdmeif4: CDMEIF4 - - /// Stream x clear FIFO error interrupt flag (x = 7..4) - @WriteOnly(bits: 0..<1) - public var cfeif4: CFEIF4 - } - - /// Stream cluster: S?CR, S?NDTR, S?M0AR, S?M1AR and S?FCR registers - @RegisterBlock - public struct ST { - /// stream x configuration register - @RegisterBlock(offset: 0x0) - public var cr: Register - - /// stream x number of data register - @RegisterBlock(offset: 0x4) - public var ndtr: Register - - /// stream x peripheral address register - @RegisterBlock(offset: 0x8) - public var par: Register - - /// stream x memory 0 address register - @RegisterBlock(offset: 0xc) - public var m0ar: Register - - /// stream x memory 1 address register - @RegisterBlock(offset: 0x10) - public var m1ar: Register - - /// stream x FIFO control register - @RegisterBlock(offset: 0x14) - public var fcr: Register - } -} - -extension DMA2.ST { - /// stream x configuration register - @Register(bitWidth: 32) - public struct CR { - /// Channel selection - @ReadWrite(bits: 25..<28) - public var chsel: CHSEL - - /// Memory burst transfer configuration - @ReadWrite(bits: 23..<25) - public var mburst: MBURST - - /// Peripheral burst transfer configuration - @ReadWrite(bits: 21..<23, as: PBURSTValues.self) - public var pburst: PBURST - - /// Current target (only in double buffer mode) - @ReadWrite(bits: 19..<20, as: CTValues.self) - public var ct: CT - - /// Double buffer mode - @ReadWrite(bits: 18..<19, as: DBMValues.self) - public var dbm: DBM - - /// Priority level - @ReadWrite(bits: 16..<18, as: PLValues.self) - public var pl: PL - - /// Peripheral increment offset size - @ReadWrite(bits: 15..<16, as: PINCOSValues.self) - public var pincos: PINCOS - - /// Memory data size - @ReadWrite(bits: 13..<15) - public var msize: MSIZE - - /// Peripheral data size - @ReadWrite(bits: 11..<13, as: PSIZEValues.self) - public var psize: PSIZE - - /// Memory increment mode - @ReadWrite(bits: 10..<11) - public var minc: MINC - - /// Peripheral increment mode - @ReadWrite(bits: 9..<10, as: PINCValues.self) - public var pinc: PINC - - /// Circular mode - @ReadWrite(bits: 8..<9, as: CIRCValues.self) - public var circ: CIRC - - /// Data transfer direction - @ReadWrite(bits: 6..<8, as: DIRValues.self) - public var dir: DIR - - /// Peripheral flow controller - @ReadWrite(bits: 5..<6, as: PFCTRLValues.self) - public var pfctrl: PFCTRL - - /// Transfer complete interrupt enable - @ReadWrite(bits: 4..<5, as: TCIEValues.self) - public var tcie: TCIE - - /// Half transfer interrupt enable - @ReadWrite(bits: 3..<4, as: HTIEValues.self) - public var htie: HTIE - - /// Transfer error interrupt enable - @ReadWrite(bits: 2..<3, as: TEIEValues.self) - public var teie: TEIE - - /// Direct mode error interrupt enable - @ReadWrite(bits: 1..<2, as: DMEIEValues.self) - public var dmeie: DMEIE - - /// Stream enable / flag stream ready when read low - @ReadWrite(bits: 0..<1, as: ENValues.self) - public var en: EN - } - - /// stream x number of data register - @Register(bitWidth: 32) - public struct NDTR { - /// Number of data items to transfer - @ReadWrite(bits: 0..<16) - public var ndt: NDT - } - - /// stream x peripheral address register - @Register(bitWidth: 32) - public struct PAR { - /// Peripheral address - @ReadWrite(bits: 0..<32) - public var pa: PA - } - - /// stream x memory 0 address register - @Register(bitWidth: 32) - public struct M0AR { - /// Memory 0 address - @ReadWrite(bits: 0..<32) - public var m0a: M0A - } - - /// stream x memory 1 address register - @Register(bitWidth: 32) - public struct M1AR { - /// Memory 1 address (used in case of Double buffer mode) - @ReadWrite(bits: 0..<32) - public var m1a: M1A - } - - /// stream x FIFO control register - @Register(bitWidth: 32) - public struct FCR { - /// FIFO error interrupt enable - @ReadWrite(bits: 7..<8, as: FEIEValues.self) - public var feie: FEIE - - /// FIFO status - @ReadOnly(bits: 3..<6) - public var fs: FS - - /// Direct mode disable - @ReadWrite(bits: 2..<3, as: DMDISValues.self) - public var dmdis: DMDIS - - /// FIFO threshold selection - @ReadWrite(bits: 0..<2, as: FTHValues.self) - public var fth: FTH - } -} - -extension DMA2.ST.CR { - public struct PBURSTValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// Single transfer - public static let Single = Self(rawValue: 0x0) - - /// Incremental burst of 4 beats - public static let INCR4 = Self(rawValue: 0x1) - - /// Incremental burst of 8 beats - public static let INCR8 = Self(rawValue: 0x2) - - /// Incremental burst of 16 beats - public static let INCR16 = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension DMA2.ST.CR { - public struct CTValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// The current target memory is Memory 0 - public static let Memory0 = Self(rawValue: 0x0) - - /// The current target memory is Memory 1 - public static let Memory1 = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension DMA2.ST.CR { - public struct DBMValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// No buffer switching at the end of transfer - public static let Disabled = Self(rawValue: 0x0) - - /// Memory target switched at the end of the DMA transfer - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension DMA2.ST.CR { - public struct PLValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// Low - public static let Low = Self(rawValue: 0x0) - - /// Medium - public static let Medium = Self(rawValue: 0x1) - - /// High - public static let High = Self(rawValue: 0x2) - - /// Very high - public static let VeryHigh = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension DMA2.ST.CR { - public struct PINCOSValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// The offset size for the peripheral address calculation is linked to the PSIZE - public static let PSIZE = Self(rawValue: 0x0) - - /// The offset size for the peripheral address calculation is fixed to 4 (32-bit alignment) - public static let Fixed4 = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension DMA2.ST.CR { - public struct PSIZEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// Byte (8-bit) - public static let Bits8 = Self(rawValue: 0x0) - - /// Half-word (16-bit) - public static let Bits16 = Self(rawValue: 0x1) - - /// Word (32-bit) - public static let Bits32 = Self(rawValue: 0x2) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension DMA2.ST.CR { - public struct PINCValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Address pointer is fixed - public static let Fixed = Self(rawValue: 0x0) - - /// Address pointer is incremented after each data transfer - public static let Incremented = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension DMA2.ST.CR { - public struct CIRCValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Circular mode disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Circular mode enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension DMA2.ST.CR { - public struct DIRValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// Peripheral-to-memory - public static let PeripheralToMemory = Self(rawValue: 0x0) - - /// Memory-to-peripheral - public static let MemoryToPeripheral = Self(rawValue: 0x1) - - /// Memory-to-memory - public static let MemoryToMemory = Self(rawValue: 0x2) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension DMA2.ST.CR { - public struct PFCTRLValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// The DMA is the flow controller - public static let DMA = Self(rawValue: 0x0) - - /// The peripheral is the flow controller - public static let Peripheral = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension DMA2.ST.CR { - public struct TCIEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// TC interrupt disabled - public static let Disabled = Self(rawValue: 0x0) - - /// TC interrupt enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension DMA2.ST.CR { - public struct HTIEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// HT interrupt disabled - public static let Disabled = Self(rawValue: 0x0) - - /// HT interrupt enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension DMA2.ST.CR { - public struct TEIEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// TE interrupt disabled - public static let Disabled = Self(rawValue: 0x0) - - /// TE interrupt enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension DMA2.ST.CR { - public struct DMEIEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// DME interrupt disabled - public static let Disabled = Self(rawValue: 0x0) - - /// DME interrupt enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension DMA2.ST.CR { - public struct ENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Stream disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Stream enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension DMA2.ST.FCR { - public struct FEIEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// FE interrupt disabled - public static let Disabled = Self(rawValue: 0x0) - - /// FE interrupt enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension DMA2.ST.FCR { - public struct DMDISValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Direct mode is enabled - public static let Enabled = Self(rawValue: 0x0) - - /// Direct mode is disabled - public static let Disabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension DMA2.ST.FCR { - public struct FTHValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// 1/4 full FIFO - public static let Quarter = Self(rawValue: 0x0) - - /// 1/2 full FIFO - public static let Half = Self(rawValue: 0x1) - - /// 3/4 full FIFO - public static let ThreeQuarters = Self(rawValue: 0x2) - - /// Full FIFO - public static let Full = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} diff --git a/stm32-neopixel/Sources/STM32F7X6/Device.swift b/stm32-neopixel/Sources/STM32F7X6/Device.swift deleted file mode 100644 index 58cb586c..00000000 --- a/stm32-neopixel/Sources/STM32F7X6/Device.swift +++ /dev/null @@ -1,30 +0,0 @@ -// Generated by svd2swift. - -import MMIO - -/// DMA controller -public let dma1 = DMA1(unsafeAddress: 0x40026000) - -/// DMA controller -public let dma2 = DMA2(unsafeAddress: 0x40026400) - -/// General-purpose I/Os -public let gpioa = GPIOA(unsafeAddress: 0x40020000) - -/// General-purpose I/Os -public let gpiob = GPIOB(unsafeAddress: 0x40020400) - -/// General-purpose I/Os -public let gpioi = GPIOI(unsafeAddress: 0x40022000) - -/// Reset and clock control -public let rcc = RCC(unsafeAddress: 0x40023800) - -/// Serial peripheral interface -public let spi1 = SPI1(unsafeAddress: 0x40013000) - -/// Serial peripheral interface -public let spi2 = SPI2(unsafeAddress: 0x40003800) - -/// Universal synchronous asynchronous receiver transmitter -public let usart1 = USART1(unsafeAddress: 0x40011000) diff --git a/stm32-neopixel/Sources/STM32F7X6/Empty.swift b/stm32-neopixel/Sources/STM32F7X6/Empty.swift deleted file mode 100644 index 934a795a..00000000 --- a/stm32-neopixel/Sources/STM32F7X6/Empty.swift +++ /dev/null @@ -1,13 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2024 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -// This file is intentionally left empty for SwiftPM to recognize the target as -// a Swift source module. diff --git a/stm32-neopixel/Sources/STM32F7X6/GPIOA.swift b/stm32-neopixel/Sources/STM32F7X6/GPIOA.swift deleted file mode 100644 index a70e68c7..00000000 --- a/stm32-neopixel/Sources/STM32F7X6/GPIOA.swift +++ /dev/null @@ -1,1075 +0,0 @@ -// Generated by svd2swift. - -import MMIO - -/// General-purpose I/Os -@RegisterBlock -public struct GPIOA { - /// GPIO port mode register - @RegisterBlock(offset: 0x0) - public var moder: Register - - /// GPIO port output type register - @RegisterBlock(offset: 0x4) - public var otyper: Register - - /// GPIO port output speed register - @RegisterBlock(offset: 0x8) - public var ospeedr: Register - - /// GPIO port pull-up/pull-down register - @RegisterBlock(offset: 0xc) - public var pupdr: Register - - /// GPIO port input data register - @RegisterBlock(offset: 0x10) - public var idr: Register - - /// GPIO port output data register - @RegisterBlock(offset: 0x14) - public var odr: Register - - /// GPIO port bit set/reset register - @RegisterBlock(offset: 0x18) - public var bsrr: Register - - /// GPIO port configuration lock register - @RegisterBlock(offset: 0x1c) - public var lckr: Register - - /// GPIO alternate function low register - @RegisterBlock(offset: 0x20) - public var afrl: Register - - /// GPIO alternate function high register - @RegisterBlock(offset: 0x24) - public var afrh: Register - - /// GPIO port bit reset register - @RegisterBlock(offset: 0x28) - public var brr: Register -} - -extension GPIOA { - /// GPIO port mode register - @Register(bitWidth: 32) - public struct MODER { - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 30..<32) - public var moder15: MODER15 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 28..<30) - public var moder14: MODER14 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 26..<28) - public var moder13: MODER13 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 24..<26) - public var moder12: MODER12 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 22..<24) - public var moder11: MODER11 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 20..<22) - public var moder10: MODER10 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 18..<20) - public var moder9: MODER9 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 16..<18) - public var moder8: MODER8 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 14..<16) - public var moder7: MODER7 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 12..<14) - public var moder6: MODER6 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 10..<12) - public var moder5: MODER5 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 8..<10) - public var moder4: MODER4 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 6..<8) - public var moder3: MODER3 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 4..<6) - public var moder2: MODER2 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 2..<4) - public var moder1: MODER1 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 0..<2, as: MODER0Values.self) - public var moder0: MODER0 - } - - /// GPIO port output type register - @Register(bitWidth: 32) - public struct OTYPER { - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 15..<16) - public var ot15: OT15 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 14..<15) - public var ot14: OT14 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 13..<14) - public var ot13: OT13 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 12..<13) - public var ot12: OT12 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 11..<12) - public var ot11: OT11 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 10..<11) - public var ot10: OT10 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 9..<10) - public var ot9: OT9 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 8..<9) - public var ot8: OT8 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 7..<8) - public var ot7: OT7 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 6..<7) - public var ot6: OT6 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 5..<6) - public var ot5: OT5 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 4..<5) - public var ot4: OT4 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 3..<4) - public var ot3: OT3 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 2..<3) - public var ot2: OT2 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 1..<2) - public var ot1: OT1 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 0..<1, as: OT0Values.self) - public var ot0: OT0 - } - - /// GPIO port output speed register - @Register(bitWidth: 32) - public struct OSPEEDR { - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 30..<32) - public var ospeedr15: OSPEEDR15 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 28..<30) - public var ospeedr14: OSPEEDR14 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 26..<28) - public var ospeedr13: OSPEEDR13 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 24..<26) - public var ospeedr12: OSPEEDR12 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 22..<24) - public var ospeedr11: OSPEEDR11 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 20..<22) - public var ospeedr10: OSPEEDR10 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 18..<20) - public var ospeedr9: OSPEEDR9 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 16..<18) - public var ospeedr8: OSPEEDR8 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 14..<16) - public var ospeedr7: OSPEEDR7 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 12..<14) - public var ospeedr6: OSPEEDR6 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 10..<12) - public var ospeedr5: OSPEEDR5 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 8..<10) - public var ospeedr4: OSPEEDR4 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 6..<8) - public var ospeedr3: OSPEEDR3 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 4..<6) - public var ospeedr2: OSPEEDR2 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 2..<4) - public var ospeedr1: OSPEEDR1 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 0..<2, as: OSPEEDR0Values.self) - public var ospeedr0: OSPEEDR0 - } - - /// GPIO port pull-up/pull-down register - @Register(bitWidth: 32) - public struct PUPDR { - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 30..<32) - public var pupdr15: PUPDR15 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 28..<30) - public var pupdr14: PUPDR14 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 26..<28) - public var pupdr13: PUPDR13 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 24..<26) - public var pupdr12: PUPDR12 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 22..<24) - public var pupdr11: PUPDR11 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 20..<22) - public var pupdr10: PUPDR10 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 18..<20) - public var pupdr9: PUPDR9 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 16..<18) - public var pupdr8: PUPDR8 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 14..<16) - public var pupdr7: PUPDR7 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 12..<14) - public var pupdr6: PUPDR6 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 10..<12) - public var pupdr5: PUPDR5 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 8..<10) - public var pupdr4: PUPDR4 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 6..<8) - public var pupdr3: PUPDR3 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 4..<6) - public var pupdr2: PUPDR2 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 2..<4) - public var pupdr1: PUPDR1 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 0..<2, as: PUPDR0Values.self) - public var pupdr0: PUPDR0 - } - - /// GPIO port input data register - @Register(bitWidth: 32) - public struct IDR { - /// Port input data (y = 0..15) - @ReadOnly(bits: 15..<16) - public var idr15: IDR15 - - /// Port input data (y = 0..15) - @ReadOnly(bits: 14..<15) - public var idr14: IDR14 - - /// Port input data (y = 0..15) - @ReadOnly(bits: 13..<14) - public var idr13: IDR13 - - /// Port input data (y = 0..15) - @ReadOnly(bits: 12..<13) - public var idr12: IDR12 - - /// Port input data (y = 0..15) - @ReadOnly(bits: 11..<12) - public var idr11: IDR11 - - /// Port input data (y = 0..15) - @ReadOnly(bits: 10..<11) - public var idr10: IDR10 - - /// Port input data (y = 0..15) - @ReadOnly(bits: 9..<10) - public var idr9: IDR9 - - /// Port input data (y = 0..15) - @ReadOnly(bits: 8..<9) - public var idr8: IDR8 - - /// Port input data (y = 0..15) - @ReadOnly(bits: 7..<8) - public var idr7: IDR7 - - /// Port input data (y = 0..15) - @ReadOnly(bits: 6..<7) - public var idr6: IDR6 - - /// Port input data (y = 0..15) - @ReadOnly(bits: 5..<6) - public var idr5: IDR5 - - /// Port input data (y = 0..15) - @ReadOnly(bits: 4..<5) - public var idr4: IDR4 - - /// Port input data (y = 0..15) - @ReadOnly(bits: 3..<4) - public var idr3: IDR3 - - /// Port input data (y = 0..15) - @ReadOnly(bits: 2..<3) - public var idr2: IDR2 - - /// Port input data (y = 0..15) - @ReadOnly(bits: 1..<2) - public var idr1: IDR1 - - /// Port input data (y = 0..15) - @ReadOnly(bits: 0..<1) - public var idr0: IDR0 - } - - /// GPIO port output data register - @Register(bitWidth: 32) - public struct ODR { - /// Port output data (y = 0..15) - @ReadWrite(bits: 15..<16) - public var odr15: ODR15 - - /// Port output data (y = 0..15) - @ReadWrite(bits: 14..<15) - public var odr14: ODR14 - - /// Port output data (y = 0..15) - @ReadWrite(bits: 13..<14) - public var odr13: ODR13 - - /// Port output data (y = 0..15) - @ReadWrite(bits: 12..<13) - public var odr12: ODR12 - - /// Port output data (y = 0..15) - @ReadWrite(bits: 11..<12) - public var odr11: ODR11 - - /// Port output data (y = 0..15) - @ReadWrite(bits: 10..<11) - public var odr10: ODR10 - - /// Port output data (y = 0..15) - @ReadWrite(bits: 9..<10) - public var odr9: ODR9 - - /// Port output data (y = 0..15) - @ReadWrite(bits: 8..<9) - public var odr8: ODR8 - - /// Port output data (y = 0..15) - @ReadWrite(bits: 7..<8) - public var odr7: ODR7 - - /// Port output data (y = 0..15) - @ReadWrite(bits: 6..<7) - public var odr6: ODR6 - - /// Port output data (y = 0..15) - @ReadWrite(bits: 5..<6) - public var odr5: ODR5 - - /// Port output data (y = 0..15) - @ReadWrite(bits: 4..<5) - public var odr4: ODR4 - - /// Port output data (y = 0..15) - @ReadWrite(bits: 3..<4) - public var odr3: ODR3 - - /// Port output data (y = 0..15) - @ReadWrite(bits: 2..<3) - public var odr2: ODR2 - - /// Port output data (y = 0..15) - @ReadWrite(bits: 1..<2) - public var odr1: ODR1 - - /// Port output data (y = 0..15) - @ReadWrite(bits: 0..<1, as: ODR0Values.self) - public var odr0: ODR0 - } - - /// GPIO port bit set/reset register - @Register(bitWidth: 32) - public struct BSRR { - /// Port x reset bit y (y = 0..15) - @WriteOnly(bits: 31..<32) - public var br15: BR15 - - /// Port x reset bit y (y = 0..15) - @WriteOnly(bits: 30..<31) - public var br14: BR14 - - /// Port x reset bit y (y = 0..15) - @WriteOnly(bits: 29..<30) - public var br13: BR13 - - /// Port x reset bit y (y = 0..15) - @WriteOnly(bits: 28..<29) - public var br12: BR12 - - /// Port x reset bit y (y = 0..15) - @WriteOnly(bits: 27..<28) - public var br11: BR11 - - /// Port x reset bit y (y = 0..15) - @WriteOnly(bits: 26..<27) - public var br10: BR10 - - /// Port x reset bit y (y = 0..15) - @WriteOnly(bits: 25..<26) - public var br9: BR9 - - /// Port x reset bit y (y = 0..15) - @WriteOnly(bits: 24..<25) - public var br8: BR8 - - /// Port x reset bit y (y = 0..15) - @WriteOnly(bits: 23..<24) - public var br7: BR7 - - /// Port x reset bit y (y = 0..15) - @WriteOnly(bits: 22..<23) - public var br6: BR6 - - /// Port x reset bit y (y = 0..15) - @WriteOnly(bits: 21..<22) - public var br5: BR5 - - /// Port x reset bit y (y = 0..15) - @WriteOnly(bits: 20..<21) - public var br4: BR4 - - /// Port x reset bit y (y = 0..15) - @WriteOnly(bits: 19..<20) - public var br3: BR3 - - /// Port x reset bit y (y = 0..15) - @WriteOnly(bits: 18..<19) - public var br2: BR2 - - /// Port x reset bit y (y = 0..15) - @WriteOnly(bits: 17..<18) - public var br1: BR1 - - /// Port x set bit y (y= 0..15) - @WriteOnly(bits: 16..<17) - public var br0: BR0 - - /// Port x set bit y (y= 0..15) - @WriteOnly(bits: 15..<16) - public var bs15: BS15 - - /// Port x set bit y (y= 0..15) - @WriteOnly(bits: 14..<15) - public var bs14: BS14 - - /// Port x set bit y (y= 0..15) - @WriteOnly(bits: 13..<14) - public var bs13: BS13 - - /// Port x set bit y (y= 0..15) - @WriteOnly(bits: 12..<13) - public var bs12: BS12 - - /// Port x set bit y (y= 0..15) - @WriteOnly(bits: 11..<12) - public var bs11: BS11 - - /// Port x set bit y (y= 0..15) - @WriteOnly(bits: 10..<11) - public var bs10: BS10 - - /// Port x set bit y (y= 0..15) - @WriteOnly(bits: 9..<10) - public var bs9: BS9 - - /// Port x set bit y (y= 0..15) - @WriteOnly(bits: 8..<9) - public var bs8: BS8 - - /// Port x set bit y (y= 0..15) - @WriteOnly(bits: 7..<8) - public var bs7: BS7 - - /// Port x set bit y (y= 0..15) - @WriteOnly(bits: 6..<7) - public var bs6: BS6 - - /// Port x set bit y (y= 0..15) - @WriteOnly(bits: 5..<6) - public var bs5: BS5 - - /// Port x set bit y (y= 0..15) - @WriteOnly(bits: 4..<5) - public var bs4: BS4 - - /// Port x set bit y (y= 0..15) - @WriteOnly(bits: 3..<4) - public var bs3: BS3 - - /// Port x set bit y (y= 0..15) - @WriteOnly(bits: 2..<3) - public var bs2: BS2 - - /// Port x set bit y (y= 0..15) - @WriteOnly(bits: 1..<2) - public var bs1: BS1 - - /// Port x set bit y (y= 0..15) - @WriteOnly(bits: 0..<1) - public var bs0: BS0 - } - - /// GPIO port configuration lock register - @Register(bitWidth: 32) - public struct LCKR { - /// Port x lock bit y (y= 0..15) - @ReadWrite(bits: 16..<17, as: LCKKValues.self) - public var lckk: LCKK - - /// Port x lock bit y (y= 0..15) - @ReadWrite(bits: 15..<16) - public var lck15: LCK15 - - /// Port x lock bit y (y= 0..15) - @ReadWrite(bits: 14..<15) - public var lck14: LCK14 - - /// Port x lock bit y (y= 0..15) - @ReadWrite(bits: 13..<14) - public var lck13: LCK13 - - /// Port x lock bit y (y= 0..15) - @ReadWrite(bits: 12..<13) - public var lck12: LCK12 - - /// Port x lock bit y (y= 0..15) - @ReadWrite(bits: 11..<12) - public var lck11: LCK11 - - /// Port x lock bit y (y= 0..15) - @ReadWrite(bits: 10..<11) - public var lck10: LCK10 - - /// Port x lock bit y (y= 0..15) - @ReadWrite(bits: 9..<10) - public var lck9: LCK9 - - /// Port x lock bit y (y= 0..15) - @ReadWrite(bits: 8..<9) - public var lck8: LCK8 - - /// Port x lock bit y (y= 0..15) - @ReadWrite(bits: 7..<8) - public var lck7: LCK7 - - /// Port x lock bit y (y= 0..15) - @ReadWrite(bits: 6..<7) - public var lck6: LCK6 - - /// Port x lock bit y (y= 0..15) - @ReadWrite(bits: 5..<6) - public var lck5: LCK5 - - /// Port x lock bit y (y= 0..15) - @ReadWrite(bits: 4..<5) - public var lck4: LCK4 - - /// Port x lock bit y (y= 0..15) - @ReadWrite(bits: 3..<4) - public var lck3: LCK3 - - /// Port x lock bit y (y= 0..15) - @ReadWrite(bits: 2..<3) - public var lck2: LCK2 - - /// Port x lock bit y (y= 0..15) - @ReadWrite(bits: 1..<2) - public var lck1: LCK1 - - /// Port x lock bit y (y= 0..15) - @ReadWrite(bits: 0..<1, as: LCK0Values.self) - public var lck0: LCK0 - } - - /// GPIO alternate function low register - @Register(bitWidth: 32) - public struct AFRL { - /// Alternate function selection for port x bit y (y = 0..7) - @ReadWrite(bits: 28..<32) - public var afrl7: AFRL7 - - /// Alternate function selection for port x bit y (y = 0..7) - @ReadWrite(bits: 24..<28) - public var afrl6: AFRL6 - - /// Alternate function selection for port x bit y (y = 0..7) - @ReadWrite(bits: 20..<24) - public var afrl5: AFRL5 - - /// Alternate function selection for port x bit y (y = 0..7) - @ReadWrite(bits: 16..<20) - public var afrl4: AFRL4 - - /// Alternate function selection for port x bit y (y = 0..7) - @ReadWrite(bits: 12..<16) - public var afrl3: AFRL3 - - /// Alternate function selection for port x bit y (y = 0..7) - @ReadWrite(bits: 8..<12) - public var afrl2: AFRL2 - - /// Alternate function selection for port x bit y (y = 0..7) - @ReadWrite(bits: 4..<8) - public var afrl1: AFRL1 - - /// Alternate function selection for port x bit y (y = 0..7) - @ReadWrite(bits: 0..<4, as: AFRL0Values.self) - public var afrl0: AFRL0 - } - - /// GPIO alternate function high register - @Register(bitWidth: 32) - public struct AFRH { - /// Alternate function selection for port x bit y (y = 8..15) - @ReadWrite(bits: 28..<32) - public var afrh15: AFRH15 - - /// Alternate function selection for port x bit y (y = 8..15) - @ReadWrite(bits: 24..<28) - public var afrh14: AFRH14 - - /// Alternate function selection for port x bit y (y = 8..15) - @ReadWrite(bits: 20..<24) - public var afrh13: AFRH13 - - /// Alternate function selection for port x bit y (y = 8..15) - @ReadWrite(bits: 16..<20) - public var afrh12: AFRH12 - - /// Alternate function selection for port x bit y (y = 8..15) - @ReadWrite(bits: 12..<16) - public var afrh11: AFRH11 - - /// Alternate function selection for port x bit y (y = 8..15) - @ReadWrite(bits: 8..<12) - public var afrh10: AFRH10 - - /// Alternate function selection for port x bit y (y = 8..15) - @ReadWrite(bits: 4..<8) - public var afrh9: AFRH9 - - /// Alternate function selection for port x bit y (y = 8..15) - @ReadWrite(bits: 0..<4, as: AFRH8Values.self) - public var afrh8: AFRH8 - } - - /// GPIO port bit reset register - @Register(bitWidth: 32) - public struct BRR { - /// Port A Reset bit 0 - @ReadWrite(bits: 0..<1) - public var br0: BR0 - - /// Port A Reset bit 1 - @ReadWrite(bits: 1..<2) - public var br1: BR1 - - /// Port A Reset bit 2 - @ReadWrite(bits: 2..<3) - public var br2: BR2 - - /// Port A Reset bit 3 - @ReadWrite(bits: 3..<4) - public var br3: BR3 - - /// Port A Reset bit 4 - @ReadWrite(bits: 4..<5) - public var br4: BR4 - - /// Port A Reset bit 5 - @ReadWrite(bits: 5..<6) - public var br5: BR5 - - /// Port A Reset bit 6 - @ReadWrite(bits: 6..<7) - public var br6: BR6 - - /// Port A Reset bit 7 - @ReadWrite(bits: 7..<8) - public var br7: BR7 - - /// Port A Reset bit 8 - @ReadWrite(bits: 8..<9) - public var br8: BR8 - - /// Port A Reset bit 9 - @ReadWrite(bits: 9..<10) - public var br9: BR9 - - /// Port A Reset bit 10 - @ReadWrite(bits: 10..<11) - public var br10: BR10 - - /// Port A Reset bit 11 - @ReadWrite(bits: 11..<12) - public var br11: BR11 - - /// Port A Reset bit 12 - @ReadWrite(bits: 12..<13) - public var br12: BR12 - - /// Port A Reset bit 13 - @ReadWrite(bits: 13..<14) - public var br13: BR13 - - /// Port A Reset bit 14 - @ReadWrite(bits: 14..<15) - public var br14: BR14 - - /// Port A Reset bit 15 - @ReadWrite(bits: 15..<16) - public var br15: BR15 - } -} - -extension GPIOA.MODER { - public struct MODER0Values: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// Input mode (reset state) - public static let Input = Self(rawValue: 0x0) - - /// General purpose output mode - public static let Output = Self(rawValue: 0x1) - - /// Alternate function mode - public static let Alternate = Self(rawValue: 0x2) - - /// Analog mode - public static let Analog = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension GPIOA.OTYPER { - public struct OT0Values: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Output push-pull (reset state) - public static let PushPull = Self(rawValue: 0x0) - - /// Output open-drain - public static let OpenDrain = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension GPIOA.OSPEEDR { - public struct OSPEEDR0Values: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// Low speed - public static let LowSpeed = Self(rawValue: 0x0) - - /// Medium speed - public static let MediumSpeed = Self(rawValue: 0x1) - - /// High speed - public static let HighSpeed = Self(rawValue: 0x2) - - /// Very high speed - public static let VeryHighSpeed = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension GPIOA.PUPDR { - public struct PUPDR0Values: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// No pull-up, pull-down - public static let Floating = Self(rawValue: 0x0) - - /// Pull-up - public static let PullUp = Self(rawValue: 0x1) - - /// Pull-down - public static let PullDown = Self(rawValue: 0x2) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension GPIOA.ODR { - public struct ODR0Values: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Set output to logic low - public static let Low = Self(rawValue: 0x0) - - /// Set output to logic high - public static let High = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension GPIOA.LCKR { - public struct LCKKValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Port configuration lock key not active - public static let NotActive = Self(rawValue: 0x0) - - /// Port configuration lock key active - public static let Active = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension GPIOA.LCKR { - public struct LCK0Values: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Port configuration not locked - public static let Unlocked = Self(rawValue: 0x0) - - /// Port configuration locked - public static let Locked = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension GPIOA.AFRL { - public struct AFRL0Values: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 4 - - /// AF0 - public static let AF0 = Self(rawValue: 0x0) - - /// AF1 - public static let AF1 = Self(rawValue: 0x1) - - /// AF2 - public static let AF2 = Self(rawValue: 0x2) - - /// AF3 - public static let AF3 = Self(rawValue: 0x3) - - /// AF4 - public static let AF4 = Self(rawValue: 0x4) - - /// AF5 - public static let AF5 = Self(rawValue: 0x5) - - /// AF6 - public static let AF6 = Self(rawValue: 0x6) - - /// AF7 - public static let AF7 = Self(rawValue: 0x7) - - /// AF8 - public static let AF8 = Self(rawValue: 0x8) - - /// AF9 - public static let AF9 = Self(rawValue: 0x9) - - /// AF10 - public static let AF10 = Self(rawValue: 0xa) - - /// AF11 - public static let AF11 = Self(rawValue: 0xb) - - /// AF12 - public static let AF12 = Self(rawValue: 0xc) - - /// AF13 - public static let AF13 = Self(rawValue: 0xd) - - /// AF14 - public static let AF14 = Self(rawValue: 0xe) - - /// AF15 - public static let AF15 = Self(rawValue: 0xf) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension GPIOA.AFRH { - public struct AFRH8Values: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 4 - - /// AF0 - public static let AF0 = Self(rawValue: 0x0) - - /// AF1 - public static let AF1 = Self(rawValue: 0x1) - - /// AF2 - public static let AF2 = Self(rawValue: 0x2) - - /// AF3 - public static let AF3 = Self(rawValue: 0x3) - - /// AF4 - public static let AF4 = Self(rawValue: 0x4) - - /// AF5 - public static let AF5 = Self(rawValue: 0x5) - - /// AF6 - public static let AF6 = Self(rawValue: 0x6) - - /// AF7 - public static let AF7 = Self(rawValue: 0x7) - - /// AF8 - public static let AF8 = Self(rawValue: 0x8) - - /// AF9 - public static let AF9 = Self(rawValue: 0x9) - - /// AF10 - public static let AF10 = Self(rawValue: 0xa) - - /// AF11 - public static let AF11 = Self(rawValue: 0xb) - - /// AF12 - public static let AF12 = Self(rawValue: 0xc) - - /// AF13 - public static let AF13 = Self(rawValue: 0xd) - - /// AF14 - public static let AF14 = Self(rawValue: 0xe) - - /// AF15 - public static let AF15 = Self(rawValue: 0xf) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} diff --git a/stm32-neopixel/Sources/STM32F7X6/GPIOB.swift b/stm32-neopixel/Sources/STM32F7X6/GPIOB.swift deleted file mode 100644 index bd0a35ba..00000000 --- a/stm32-neopixel/Sources/STM32F7X6/GPIOB.swift +++ /dev/null @@ -1,7 +0,0 @@ -// Generated by svd2swift. - -import MMIO - -/// General-purpose I/Os -public typealias GPIOB = GPIOA - diff --git a/stm32-neopixel/Sources/STM32F7X6/GPIOI.swift b/stm32-neopixel/Sources/STM32F7X6/GPIOI.swift deleted file mode 100644 index 6b2b5182..00000000 --- a/stm32-neopixel/Sources/STM32F7X6/GPIOI.swift +++ /dev/null @@ -1,7 +0,0 @@ -// Generated by svd2swift. - -import MMIO - -/// General-purpose I/Os -public typealias GPIOI = GPIOA - diff --git a/stm32-neopixel/Sources/STM32F7X6/RCC.swift b/stm32-neopixel/Sources/STM32F7X6/RCC.swift deleted file mode 100644 index 4a36aea8..00000000 --- a/stm32-neopixel/Sources/STM32F7X6/RCC.swift +++ /dev/null @@ -1,2833 +0,0 @@ -// Generated by svd2swift. - -import MMIO - -/// Reset and clock control -@RegisterBlock -public struct RCC { - /// clock control register - @RegisterBlock(offset: 0x0) - public var cr: Register - - /// PLL configuration register - @RegisterBlock(offset: 0x4) - public var pllcfgr: Register - - /// clock configuration register - @RegisterBlock(offset: 0x8) - public var cfgr: Register - - /// clock interrupt register - @RegisterBlock(offset: 0xc) - public var cir: Register - - /// AHB1 peripheral reset register - @RegisterBlock(offset: 0x10) - public var ahb1rstr: Register - - /// AHB2 peripheral reset register - @RegisterBlock(offset: 0x14) - public var ahb2rstr: Register - - /// AHB3 peripheral reset register - @RegisterBlock(offset: 0x18) - public var ahb3rstr: Register - - /// APB1 peripheral reset register - @RegisterBlock(offset: 0x20) - public var apb1rstr: Register - - /// APB2 peripheral reset register - @RegisterBlock(offset: 0x24) - public var apb2rstr: Register - - /// AHB1 peripheral clock register - @RegisterBlock(offset: 0x30) - public var ahb1enr: Register - - /// AHB2 peripheral clock enable register - @RegisterBlock(offset: 0x34) - public var ahb2enr: Register - - /// AHB3 peripheral clock enable register - @RegisterBlock(offset: 0x38) - public var ahb3enr: Register - - /// APB1 peripheral clock enable register - @RegisterBlock(offset: 0x40) - public var apb1enr: Register - - /// APB2 peripheral clock enable register - @RegisterBlock(offset: 0x44) - public var apb2enr: Register - - /// AHB1 peripheral clock enable in low power mode register - @RegisterBlock(offset: 0x50) - public var ahb1lpenr: Register - - /// AHB2 peripheral clock enable in low power mode register - @RegisterBlock(offset: 0x54) - public var ahb2lpenr: Register - - /// AHB3 peripheral clock enable in low power mode register - @RegisterBlock(offset: 0x58) - public var ahb3lpenr: Register - - /// APB1 peripheral clock enable in low power mode register - @RegisterBlock(offset: 0x60) - public var apb1lpenr: Register - - /// APB2 peripheral clock enabled in low power mode register - @RegisterBlock(offset: 0x64) - public var apb2lpenr: Register - - /// Backup domain control register - @RegisterBlock(offset: 0x70) - public var bdcr: Register - - /// clock control & status register - @RegisterBlock(offset: 0x74) - public var csr: Register - - /// spread spectrum clock generation register - @RegisterBlock(offset: 0x80) - public var sscgr: Register - - /// PLLI2S configuration register - @RegisterBlock(offset: 0x84) - public var plli2scfgr: Register - - /// PLL configuration register - @RegisterBlock(offset: 0x88) - public var pllsaicfgr: Register - - /// dedicated clocks configuration register - @RegisterBlock(offset: 0x8c) - public var dckcfgr1: Register - - /// dedicated clocks configuration register - @RegisterBlock(offset: 0x90) - public var dckcfgr2: Register -} - -extension RCC { - /// clock control register - @Register(bitWidth: 32) - public struct CR { - /// PLLI2S clock ready flag - @ReadOnly(bits: 27..<28) - public var plli2srdy: PLLI2SRDY - - /// PLLI2S enable - @ReadWrite(bits: 26..<27) - public var plli2son: PLLI2SON - - /// Main PLL (PLL) clock ready flag - @ReadOnly(bits: 25..<26) - public var pllrdy: PLLRDY - - /// Main PLL (PLL) enable - @ReadWrite(bits: 24..<25) - public var pllon: PLLON - - /// Clock security system enable - @ReadWrite(bits: 19..<20, as: CSSONValues.self) - public var csson: CSSON - - /// HSE clock bypass - @ReadWrite(bits: 18..<19, as: HSEBYPValues.self) - public var hsebyp: HSEBYP - - /// HSE clock ready flag - @ReadOnly(bits: 17..<18) - public var hserdy: HSERDY - - /// HSE clock enable - @ReadWrite(bits: 16..<17) - public var hseon: HSEON - - /// Internal high-speed clock calibration - @ReadOnly(bits: 8..<16) - public var hsical: HSICAL - - /// Internal high-speed clock trimming - @ReadWrite(bits: 3..<8) - public var hsitrim: HSITRIM - - /// Internal high-speed clock ready flag - @ReadOnly(bits: 1..<2) - public var hsirdy: HSIRDY - - /// Internal high-speed clock enable - @ReadWrite(bits: 0..<1, as: HSIONValues.self) - public var hsion: HSION - - /// PLLSAI clock ready flag - @ReadOnly(bits: 29..<30) - public var pllsairdy: PLLSAIRDY - - /// PLLSAI enable - @ReadWrite(bits: 28..<29) - public var pllsaion: PLLSAION - } - - /// PLL configuration register - @Register(bitWidth: 32) - public struct PLLCFGR { - /// Main PLL(PLL) and audio PLL (PLLI2S) entry clock source - @ReadWrite(bits: 22..<23, as: PLLSRCValues.self) - public var pllsrc: PLLSRC - - /// Division factor for the main PLL (PLL) and audio PLL (PLLI2S) input clock - @ReadWrite(bits: 0..<6) - public var pllm: PLLM - - /// Main PLL (PLL) multiplication factor for VCO - @ReadWrite(bits: 6..<15) - public var plln: PLLN - - /// Main PLL (PLL) division factor for main system clock - @ReadWrite(bits: 16..<18, as: PLLPValues.self) - public var pllp: PLLP - - /// Main PLL (PLL) division factor for USB OTG FS, SDIO and random number generator clocks - @ReadWrite(bits: 24..<28) - public var pllq: PLLQ - } - - /// clock configuration register - @Register(bitWidth: 32) - public struct CFGR { - /// Microcontroller clock output 2 - @ReadWrite(bits: 30..<32, as: MCO2Values.self) - public var mco2: MCO2 - - /// MCO2 prescaler - @ReadWrite(bits: 27..<30) - public var mco2pre: MCO2PRE - - /// MCO1 prescaler - @ReadWrite(bits: 24..<27, as: MCO1PREValues.self) - public var mco1pre: MCO1PRE - - /// I2S clock selection - @ReadWrite(bits: 23..<24, as: I2SSRCValues.self) - public var i2ssrc: I2SSRC - - /// Microcontroller clock output 1 - @ReadWrite(bits: 21..<23, as: MCO1Values.self) - public var mco1: MCO1 - - /// HSE division factor for RTC clock - @ReadWrite(bits: 16..<21) - public var rtcpre: RTCPRE - - /// APB high-speed prescaler (APB2) - @ReadWrite(bits: 13..<16) - public var ppre2: PPRE2 - - /// APB Low speed prescaler (APB1) - @ReadWrite(bits: 10..<13, as: PPRE1Values.self) - public var ppre1: PPRE1 - - /// AHB prescaler - @ReadWrite(bits: 4..<8, as: HPREValues.self) - public var hpre: HPRE - - /// System clock switch - @Reserved(bits: 0..<2, as: SWValues.self) - public var sw: SW - - /// System clock switch status - @Reserved(bits: 2..<4) - public var sws: SWS - } - - /// clock interrupt register - @Register(bitWidth: 32) - public struct CIR { - /// Clock security system interrupt clear - @WriteOnly(bits: 23..<24) - public var cssc: CSSC - - /// PLLSAI Ready Interrupt Clear - @WriteOnly(bits: 22..<23) - public var pllsairdyc: PLLSAIRDYC - - /// PLLI2S ready interrupt clear - @WriteOnly(bits: 21..<22) - public var plli2srdyc: PLLI2SRDYC - - /// Main PLL(PLL) ready interrupt clear - @WriteOnly(bits: 20..<21) - public var pllrdyc: PLLRDYC - - /// HSE ready interrupt clear - @WriteOnly(bits: 19..<20) - public var hserdyc: HSERDYC - - /// HSI ready interrupt clear - @WriteOnly(bits: 18..<19) - public var hsirdyc: HSIRDYC - - /// LSE ready interrupt clear - @WriteOnly(bits: 17..<18) - public var lserdyc: LSERDYC - - /// LSI ready interrupt clear - @WriteOnly(bits: 16..<17) - public var lsirdyc: LSIRDYC - - /// PLLSAI Ready Interrupt Enable - @ReadWrite(bits: 14..<15) - public var pllsairdyie: PLLSAIRDYIE - - /// PLLI2S ready interrupt enable - @ReadWrite(bits: 13..<14) - public var plli2srdyie: PLLI2SRDYIE - - /// Main PLL (PLL) ready interrupt enable - @ReadWrite(bits: 12..<13) - public var pllrdyie: PLLRDYIE - - /// HSE ready interrupt enable - @ReadWrite(bits: 11..<12) - public var hserdyie: HSERDYIE - - /// HSI ready interrupt enable - @ReadWrite(bits: 10..<11) - public var hsirdyie: HSIRDYIE - - /// LSE ready interrupt enable - @ReadWrite(bits: 9..<10) - public var lserdyie: LSERDYIE - - /// LSI ready interrupt enable - @ReadWrite(bits: 8..<9, as: LSIRDYIEValues.self) - public var lsirdyie: LSIRDYIE - - /// Clock security system interrupt flag - @ReadOnly(bits: 7..<8) - public var cssf: CSSF - - /// PLLSAI ready interrupt flag - @ReadOnly(bits: 6..<7) - public var pllsairdyf: PLLSAIRDYF - - /// PLLI2S ready interrupt flag - @ReadOnly(bits: 5..<6) - public var plli2srdyf: PLLI2SRDYF - - /// Main PLL (PLL) ready interrupt flag - @ReadOnly(bits: 4..<5) - public var pllrdyf: PLLRDYF - - /// HSE ready interrupt flag - @ReadOnly(bits: 3..<4) - public var hserdyf: HSERDYF - - /// HSI ready interrupt flag - @ReadOnly(bits: 2..<3) - public var hsirdyf: HSIRDYF - - /// LSE ready interrupt flag - @ReadOnly(bits: 1..<2) - public var lserdyf: LSERDYF - - /// LSI ready interrupt flag - @ReadOnly(bits: 0..<1) - public var lsirdyf: LSIRDYF - } - - /// AHB1 peripheral reset register - @Register(bitWidth: 32) - public struct AHB1RSTR { - /// USB OTG HS module reset - @ReadWrite(bits: 29..<30) - public var otghsrst: OTGHSRST - - /// Ethernet MAC reset - @ReadWrite(bits: 25..<26) - public var ethmacrst: ETHMACRST - - /// DMA2D reset - @ReadWrite(bits: 23..<24) - public var dma2drst: DMA2DRST - - /// DMA2 reset - @ReadWrite(bits: 22..<23) - public var dma2rst: DMA2RST - - /// DMA2 reset - @ReadWrite(bits: 21..<22) - public var dma1rst: DMA1RST - - /// CRC reset - @ReadWrite(bits: 12..<13) - public var crcrst: CRCRST - - /// IO port K reset - @ReadWrite(bits: 10..<11) - public var gpiokrst: GPIOKRST - - /// IO port J reset - @ReadWrite(bits: 9..<10) - public var gpiojrst: GPIOJRST - - /// IO port I reset - @ReadWrite(bits: 8..<9) - public var gpioirst: GPIOIRST - - /// IO port H reset - @ReadWrite(bits: 7..<8) - public var gpiohrst: GPIOHRST - - /// IO port G reset - @ReadWrite(bits: 6..<7) - public var gpiogrst: GPIOGRST - - /// IO port F reset - @ReadWrite(bits: 5..<6) - public var gpiofrst: GPIOFRST - - /// IO port E reset - @ReadWrite(bits: 4..<5) - public var gpioerst: GPIOERST - - /// IO port D reset - @ReadWrite(bits: 3..<4) - public var gpiodrst: GPIODRST - - /// IO port C reset - @ReadWrite(bits: 2..<3) - public var gpiocrst: GPIOCRST - - /// IO port B reset - @ReadWrite(bits: 1..<2) - public var gpiobrst: GPIOBRST - - /// IO port A reset - @ReadWrite(bits: 0..<1, as: GPIOARSTValues.self) - public var gpioarst: GPIOARST - } - - /// AHB2 peripheral reset register - @Register(bitWidth: 32) - public struct AHB2RSTR { - /// USB OTG FS module reset - @ReadWrite(bits: 7..<8) - public var otgfsrst: OTGFSRST - - /// Random number generator module reset - @ReadWrite(bits: 6..<7) - public var rngrst: RNGRST - - /// Hash module reset - @ReadWrite(bits: 5..<6) - public var hsahrst: HSAHRST - - /// Cryptographic module reset - @ReadWrite(bits: 4..<5) - public var cryprst: CRYPRST - - /// Camera interface reset - @ReadWrite(bits: 0..<1, as: DCMIRSTValues.self) - public var dcmirst: DCMIRST - } - - /// AHB3 peripheral reset register - @Register(bitWidth: 32) - public struct AHB3RSTR { - /// Flexible memory controller module reset - @ReadWrite(bits: 0..<1, as: FMCRSTValues.self) - public var fmcrst: FMCRST - - /// Quad SPI memory controller reset - @ReadWrite(bits: 1..<2) - public var qspirst: QSPIRST - } - - /// APB1 peripheral reset register - @Register(bitWidth: 32) - public struct APB1RSTR { - /// TIM2 reset - @ReadWrite(bits: 0..<1, as: TIM2RSTValues.self) - public var tim2rst: TIM2RST - - /// TIM3 reset - @ReadWrite(bits: 1..<2) - public var tim3rst: TIM3RST - - /// TIM4 reset - @ReadWrite(bits: 2..<3) - public var tim4rst: TIM4RST - - /// TIM5 reset - @ReadWrite(bits: 3..<4) - public var tim5rst: TIM5RST - - /// TIM6 reset - @ReadWrite(bits: 4..<5) - public var tim6rst: TIM6RST - - /// TIM7 reset - @ReadWrite(bits: 5..<6) - public var tim7rst: TIM7RST - - /// TIM12 reset - @ReadWrite(bits: 6..<7) - public var tim12rst: TIM12RST - - /// TIM13 reset - @ReadWrite(bits: 7..<8) - public var tim13rst: TIM13RST - - /// TIM14 reset - @ReadWrite(bits: 8..<9) - public var tim14rst: TIM14RST - - /// Window watchdog reset - @ReadWrite(bits: 11..<12) - public var wwdgrst: WWDGRST - - /// SPI 2 reset - @ReadWrite(bits: 14..<15) - public var spi2rst: SPI2RST - - /// SPI 3 reset - @ReadWrite(bits: 15..<16) - public var spi3rst: SPI3RST - - /// USART 2 reset - @ReadWrite(bits: 17..<18) - public var usart2rst: USART2RST - - /// USART 3 reset - @ReadWrite(bits: 18..<19) - public var usart3rst: USART3RST - - /// USART 4 reset - @ReadWrite(bits: 19..<20) - public var uart4rst: UART4RST - - /// USART 5 reset - @ReadWrite(bits: 20..<21) - public var uart5rst: UART5RST - - /// I2C 1 reset - @ReadWrite(bits: 21..<22) - public var i2c1rst: I2C1RST - - /// I2C 2 reset - @ReadWrite(bits: 22..<23) - public var i2c2rst: I2C2RST - - /// I2C3 reset - @ReadWrite(bits: 23..<24) - public var i2c3rst: I2C3RST - - /// CAN1 reset - @ReadWrite(bits: 25..<26) - public var can1rst: CAN1RST - - /// CAN2 reset - @ReadWrite(bits: 26..<27) - public var can2rst: CAN2RST - - /// Power interface reset - @ReadWrite(bits: 28..<29) - public var pwrrst: PWRRST - - /// DAC reset - @ReadWrite(bits: 29..<30) - public var dacrst: DACRST - - /// UART7 reset - @ReadWrite(bits: 30..<31) - public var uart7rst: UART7RST - - /// UART8 reset - @ReadWrite(bits: 31..<32) - public var uart8rst: UART8RST - - /// SPDIF-RX reset - @ReadWrite(bits: 16..<17) - public var spdifrxrst: SPDIFRXRST - - /// HDMI-CEC reset - @ReadWrite(bits: 27..<28) - public var cecrst: CECRST - - /// Low power timer 1 reset - @ReadWrite(bits: 9..<10) - public var lptim1rst: LPTIM1RST - - /// I2C 4 reset - @ReadWrite(bits: 24..<25) - public var i2c4rst: I2C4RST - } - - /// APB2 peripheral reset register - @Register(bitWidth: 32) - public struct APB2RSTR { - /// TIM1 reset - @ReadWrite(bits: 0..<1, as: TIM1RSTValues.self) - public var tim1rst: TIM1RST - - /// TIM8 reset - @ReadWrite(bits: 1..<2) - public var tim8rst: TIM8RST - - /// USART1 reset - @ReadWrite(bits: 4..<5) - public var usart1rst: USART1RST - - /// USART6 reset - @ReadWrite(bits: 5..<6) - public var usart6rst: USART6RST - - /// ADC interface reset (common to all ADCs) - @ReadWrite(bits: 8..<9) - public var adcrst: ADCRST - - /// SPI 1 reset - @ReadWrite(bits: 12..<13) - public var spi1rst: SPI1RST - - /// SPI4 reset - @ReadWrite(bits: 13..<14) - public var spi4rst: SPI4RST - - /// System configuration controller reset - @ReadWrite(bits: 14..<15) - public var syscfgrst: SYSCFGRST - - /// TIM9 reset - @ReadWrite(bits: 16..<17) - public var tim9rst: TIM9RST - - /// TIM10 reset - @ReadWrite(bits: 17..<18) - public var tim10rst: TIM10RST - - /// TIM11 reset - @ReadWrite(bits: 18..<19) - public var tim11rst: TIM11RST - - /// SPI5 reset - @ReadWrite(bits: 20..<21) - public var spi5rst: SPI5RST - - /// SPI6 reset - @ReadWrite(bits: 21..<22) - public var spi6rst: SPI6RST - - /// SAI1 reset - @ReadWrite(bits: 22..<23) - public var sai1rst: SAI1RST - - /// LTDC reset - @ReadWrite(bits: 26..<27) - public var ltdcrst: LTDCRST - - /// SAI2 reset - @ReadWrite(bits: 23..<24) - public var sai2rst: SAI2RST - - /// SDMMC1 reset - @ReadWrite(bits: 11..<12) - public var sdmmc1rst: SDMMC1RST - } - - /// AHB1 peripheral clock register - @Register(bitWidth: 32) - public struct AHB1ENR { - /// USB OTG HSULPI clock enable - @ReadWrite(bits: 30..<31) - public var otghsulpien: OTGHSULPIEN - - /// USB OTG HS clock enable - @ReadWrite(bits: 29..<30) - public var otghsen: OTGHSEN - - /// Ethernet PTP clock enable - @ReadWrite(bits: 28..<29) - public var ethmacptpen: ETHMACPTPEN - - /// Ethernet Reception clock enable - @ReadWrite(bits: 27..<28) - public var ethmacrxen: ETHMACRXEN - - /// Ethernet Transmission clock enable - @ReadWrite(bits: 26..<27) - public var ethmactxen: ETHMACTXEN - - /// Ethernet MAC clock enable - @ReadWrite(bits: 25..<26) - public var ethmacen: ETHMACEN - - /// DMA2D clock enable - @ReadWrite(bits: 23..<24) - public var dma2den: DMA2DEN - - /// DMA2 clock enable - @ReadWrite(bits: 22..<23) - public var dma2en: DMA2EN - - /// DMA1 clock enable - @ReadWrite(bits: 21..<22) - public var dma1en: DMA1EN - - /// CCM data RAM clock enable - @ReadWrite(bits: 20..<21) - public var dtcmramen: DTCMRAMEN - - /// Backup SRAM interface clock enable - @ReadWrite(bits: 18..<19) - public var bkpsramen: BKPSRAMEN - - /// CRC clock enable - @ReadWrite(bits: 12..<13) - public var crcen: CRCEN - - /// IO port K clock enable - @ReadWrite(bits: 10..<11) - public var gpioken: GPIOKEN - - /// IO port J clock enable - @ReadWrite(bits: 9..<10) - public var gpiojen: GPIOJEN - - /// IO port I clock enable - @ReadWrite(bits: 8..<9) - public var gpioien: GPIOIEN - - /// IO port H clock enable - @ReadWrite(bits: 7..<8) - public var gpiohen: GPIOHEN - - /// IO port G clock enable - @ReadWrite(bits: 6..<7) - public var gpiogen: GPIOGEN - - /// IO port F clock enable - @ReadWrite(bits: 5..<6) - public var gpiofen: GPIOFEN - - /// IO port E clock enable - @ReadWrite(bits: 4..<5) - public var gpioeen: GPIOEEN - - /// IO port D clock enable - @ReadWrite(bits: 3..<4) - public var gpioden: GPIODEN - - /// IO port C clock enable - @ReadWrite(bits: 2..<3) - public var gpiocen: GPIOCEN - - /// IO port B clock enable - @ReadWrite(bits: 1..<2) - public var gpioben: GPIOBEN - - /// IO port A clock enable - @ReadWrite(bits: 0..<1, as: GPIOAENValues.self) - public var gpioaen: GPIOAEN - } - - /// AHB2 peripheral clock enable register - @Register(bitWidth: 32) - public struct AHB2ENR { - /// USB OTG FS clock enable - @ReadWrite(bits: 7..<8) - public var otgfsen: OTGFSEN - - /// Random number generator clock enable - @ReadWrite(bits: 6..<7) - public var rngen: RNGEN - - /// Hash modules clock enable - @ReadWrite(bits: 5..<6) - public var hashen: HASHEN - - /// Cryptographic modules clock enable - @ReadWrite(bits: 4..<5) - public var crypen: CRYPEN - - /// Camera interface enable - @ReadWrite(bits: 0..<1, as: DCMIENValues.self) - public var dcmien: DCMIEN - } - - /// AHB3 peripheral clock enable register - @Register(bitWidth: 32) - public struct AHB3ENR { - /// Flexible memory controller module clock enable - @ReadWrite(bits: 0..<1, as: FMCENValues.self) - public var fmcen: FMCEN - - /// Quad SPI memory controller clock enable - @ReadWrite(bits: 1..<2) - public var qspien: QSPIEN - } - - /// APB1 peripheral clock enable register - @Register(bitWidth: 32) - public struct APB1ENR { - /// TIM2 clock enable - @ReadWrite(bits: 0..<1, as: TIM2ENValues.self) - public var tim2en: TIM2EN - - /// TIM3 clock enable - @ReadWrite(bits: 1..<2) - public var tim3en: TIM3EN - - /// TIM4 clock enable - @ReadWrite(bits: 2..<3) - public var tim4en: TIM4EN - - /// TIM5 clock enable - @ReadWrite(bits: 3..<4) - public var tim5en: TIM5EN - - /// TIM6 clock enable - @ReadWrite(bits: 4..<5) - public var tim6en: TIM6EN - - /// TIM7 clock enable - @ReadWrite(bits: 5..<6) - public var tim7en: TIM7EN - - /// TIM12 clock enable - @ReadWrite(bits: 6..<7) - public var tim12en: TIM12EN - - /// TIM13 clock enable - @ReadWrite(bits: 7..<8) - public var tim13en: TIM13EN - - /// TIM14 clock enable - @ReadWrite(bits: 8..<9) - public var tim14en: TIM14EN - - /// Window watchdog clock enable - @ReadWrite(bits: 11..<12) - public var wwdgen: WWDGEN - - /// SPI2 clock enable - @ReadWrite(bits: 14..<15) - public var spi2en: SPI2EN - - /// SPI3 clock enable - @ReadWrite(bits: 15..<16) - public var spi3en: SPI3EN - - /// USART 2 clock enable - @ReadWrite(bits: 17..<18) - public var usart2en: USART2EN - - /// USART3 clock enable - @ReadWrite(bits: 18..<19) - public var usart3en: USART3EN - - /// UART4 clock enable - @ReadWrite(bits: 19..<20) - public var uart4en: UART4EN - - /// UART5 clock enable - @ReadWrite(bits: 20..<21) - public var uart5en: UART5EN - - /// I2C1 clock enable - @ReadWrite(bits: 21..<22) - public var i2c1en: I2C1EN - - /// I2C2 clock enable - @ReadWrite(bits: 22..<23) - public var i2c2en: I2C2EN - - /// I2C3 clock enable - @ReadWrite(bits: 23..<24) - public var i2c3en: I2C3EN - - /// CAN 1 clock enable - @ReadWrite(bits: 25..<26) - public var can1en: CAN1EN - - /// CAN 2 clock enable - @ReadWrite(bits: 26..<27) - public var can2en: CAN2EN - - /// Power interface clock enable - @ReadWrite(bits: 28..<29) - public var pwren: PWREN - - /// DAC interface clock enable - @ReadWrite(bits: 29..<30) - public var dacen: DACEN - - /// UART7 clock enable - @ReadWrite(bits: 30..<31) - public var uart7en: UART7EN - - /// UART8 clock enable - @ReadWrite(bits: 31..<32) - public var uart8en: UART8EN - - /// SPDIF-RX clock enable - @ReadWrite(bits: 16..<17) - public var spdifrxen: SPDIFRXEN - - /// HDMI-CEN clock enable - @ReadWrite(bits: 27..<28) - public var cecen: CECEN - - /// Low power timer 1 clock enable - @ReadWrite(bits: 9..<10) - public var lptim1en: LPTIM1EN - - /// I2C4 clock enable - @ReadWrite(bits: 24..<25) - public var i2c4en: I2C4EN - } - - /// APB2 peripheral clock enable register - @Register(bitWidth: 32) - public struct APB2ENR { - /// TIM1 clock enable - @ReadWrite(bits: 0..<1, as: TIM1ENValues.self) - public var tim1en: TIM1EN - - /// TIM8 clock enable - @ReadWrite(bits: 1..<2) - public var tim8en: TIM8EN - - /// USART1 clock enable - @ReadWrite(bits: 4..<5) - public var usart1en: USART1EN - - /// USART6 clock enable - @ReadWrite(bits: 5..<6) - public var usart6en: USART6EN - - /// ADC1 clock enable - @ReadWrite(bits: 8..<9) - public var adc1en: ADC1EN - - /// ADC2 clock enable - @ReadWrite(bits: 9..<10) - public var adc2en: ADC2EN - - /// ADC3 clock enable - @ReadWrite(bits: 10..<11) - public var adc3en: ADC3EN - - /// SPI1 clock enable - @ReadWrite(bits: 12..<13) - public var spi1en: SPI1EN - - /// SPI4 clock enable - @ReadWrite(bits: 13..<14) - public var spi4en: SPI4EN - - /// System configuration controller clock enable - @ReadWrite(bits: 14..<15) - public var syscfgen: SYSCFGEN - - /// TIM9 clock enable - @ReadWrite(bits: 16..<17) - public var tim9en: TIM9EN - - /// TIM10 clock enable - @ReadWrite(bits: 17..<18) - public var tim10en: TIM10EN - - /// TIM11 clock enable - @ReadWrite(bits: 18..<19) - public var tim11en: TIM11EN - - /// SPI5 clock enable - @ReadWrite(bits: 20..<21) - public var spi5en: SPI5EN - - /// SPI6 clock enable - @ReadWrite(bits: 21..<22) - public var spi6en: SPI6EN - - /// SAI1 clock enable - @ReadWrite(bits: 22..<23) - public var sai1en: SAI1EN - - /// LTDC clock enable - @ReadWrite(bits: 26..<27) - public var ltdcen: LTDCEN - - /// SAI2 clock enable - @ReadWrite(bits: 23..<24) - public var sai2en: SAI2EN - - /// SDMMC1 clock enable - @ReadWrite(bits: 11..<12) - public var sdmmc1en: SDMMC1EN - } - - /// AHB1 peripheral clock enable in low power mode register - @Register(bitWidth: 32) - public struct AHB1LPENR { - /// IO port A clock enable during sleep mode - @ReadWrite(bits: 0..<1, as: GPIOALPENValues.self) - public var gpioalpen: GPIOALPEN - - /// IO port B clock enable during Sleep mode - @ReadWrite(bits: 1..<2) - public var gpioblpen: GPIOBLPEN - - /// IO port C clock enable during Sleep mode - @ReadWrite(bits: 2..<3) - public var gpioclpen: GPIOCLPEN - - /// IO port D clock enable during Sleep mode - @ReadWrite(bits: 3..<4) - public var gpiodlpen: GPIODLPEN - - /// IO port E clock enable during Sleep mode - @ReadWrite(bits: 4..<5) - public var gpioelpen: GPIOELPEN - - /// IO port F clock enable during Sleep mode - @ReadWrite(bits: 5..<6) - public var gpioflpen: GPIOFLPEN - - /// IO port G clock enable during Sleep mode - @ReadWrite(bits: 6..<7) - public var gpioglpen: GPIOGLPEN - - /// IO port H clock enable during Sleep mode - @ReadWrite(bits: 7..<8) - public var gpiohlpen: GPIOHLPEN - - /// IO port I clock enable during Sleep mode - @ReadWrite(bits: 8..<9) - public var gpioilpen: GPIOILPEN - - /// IO port J clock enable during Sleep mode - @ReadWrite(bits: 9..<10) - public var gpiojlpen: GPIOJLPEN - - /// IO port K clock enable during Sleep mode - @ReadWrite(bits: 10..<11) - public var gpioklpen: GPIOKLPEN - - /// CRC clock enable during Sleep mode - @ReadWrite(bits: 12..<13) - public var crclpen: CRCLPEN - - /// Flash interface clock enable during Sleep mode - @ReadWrite(bits: 15..<16) - public var flitflpen: FLITFLPEN - - /// SRAM 1interface clock enable during Sleep mode - @ReadWrite(bits: 16..<17) - public var sram1lpen: SRAM1LPEN - - /// SRAM 2 interface clock enable during Sleep mode - @ReadWrite(bits: 17..<18) - public var sram2lpen: SRAM2LPEN - - /// Backup SRAM interface clock enable during Sleep mode - @ReadWrite(bits: 18..<19) - public var bkpsramlpen: BKPSRAMLPEN - - /// SRAM 3 interface clock enable during Sleep mode - @ReadWrite(bits: 19..<20) - public var sram3lpen: SRAM3LPEN - - /// DMA1 clock enable during Sleep mode - @ReadWrite(bits: 21..<22) - public var dma1lpen: DMA1LPEN - - /// DMA2 clock enable during Sleep mode - @ReadWrite(bits: 22..<23) - public var dma2lpen: DMA2LPEN - - /// DMA2D clock enable during Sleep mode - @ReadWrite(bits: 23..<24) - public var dma2dlpen: DMA2DLPEN - - /// Ethernet MAC clock enable during Sleep mode - @ReadWrite(bits: 25..<26) - public var ethmaclpen: ETHMACLPEN - - /// Ethernet transmission clock enable during Sleep mode - @ReadWrite(bits: 26..<27) - public var ethmactxlpen: ETHMACTXLPEN - - /// Ethernet reception clock enable during Sleep mode - @ReadWrite(bits: 27..<28) - public var ethmacrxlpen: ETHMACRXLPEN - - /// Ethernet PTP clock enable during Sleep mode - @ReadWrite(bits: 28..<29) - public var ethmacptplpen: ETHMACPTPLPEN - - /// USB OTG HS clock enable during Sleep mode - @ReadWrite(bits: 29..<30) - public var otghslpen: OTGHSLPEN - - /// USB OTG HS ULPI clock enable during Sleep mode - @ReadWrite(bits: 30..<31) - public var otghsulpilpen: OTGHSULPILPEN - - /// AXI to AHB bridge clock enable during Sleep mode - @ReadWrite(bits: 13..<14) - public var axilpen: AXILPEN - - /// DTCM RAM interface clock enable during Sleep mode - @ReadWrite(bits: 20..<21) - public var dtcmlpen: DTCMLPEN - } - - /// AHB2 peripheral clock enable in low power mode register - @Register(bitWidth: 32) - public struct AHB2LPENR { - /// USB OTG FS clock enable during Sleep mode - @ReadWrite(bits: 7..<8) - public var otgfslpen: OTGFSLPEN - - /// Random number generator clock enable during Sleep mode - @ReadWrite(bits: 6..<7) - public var rnglpen: RNGLPEN - - /// Hash modules clock enable during Sleep mode - @ReadWrite(bits: 5..<6) - public var hashlpen: HASHLPEN - - /// Cryptography modules clock enable during Sleep mode - @ReadWrite(bits: 4..<5) - public var cryplpen: CRYPLPEN - - /// Camera interface enable during Sleep mode - @ReadWrite(bits: 0..<1, as: DCMILPENValues.self) - public var dcmilpen: DCMILPEN - } - - /// AHB3 peripheral clock enable in low power mode register - @Register(bitWidth: 32) - public struct AHB3LPENR { - /// Flexible memory controller module clock enable during Sleep mode - @ReadWrite(bits: 0..<1, as: FMCLPENValues.self) - public var fmclpen: FMCLPEN - - /// Quand SPI memory controller clock enable during Sleep mode - @ReadWrite(bits: 1..<2) - public var qspilpen: QSPILPEN - } - - /// APB1 peripheral clock enable in low power mode register - @Register(bitWidth: 32) - public struct APB1LPENR { - /// TIM2 clock enable during Sleep mode - @ReadWrite(bits: 0..<1, as: TIM2LPENValues.self) - public var tim2lpen: TIM2LPEN - - /// TIM3 clock enable during Sleep mode - @ReadWrite(bits: 1..<2) - public var tim3lpen: TIM3LPEN - - /// TIM4 clock enable during Sleep mode - @ReadWrite(bits: 2..<3) - public var tim4lpen: TIM4LPEN - - /// TIM5 clock enable during Sleep mode - @ReadWrite(bits: 3..<4) - public var tim5lpen: TIM5LPEN - - /// TIM6 clock enable during Sleep mode - @ReadWrite(bits: 4..<5) - public var tim6lpen: TIM6LPEN - - /// TIM7 clock enable during Sleep mode - @ReadWrite(bits: 5..<6) - public var tim7lpen: TIM7LPEN - - /// TIM12 clock enable during Sleep mode - @ReadWrite(bits: 6..<7) - public var tim12lpen: TIM12LPEN - - /// TIM13 clock enable during Sleep mode - @ReadWrite(bits: 7..<8) - public var tim13lpen: TIM13LPEN - - /// TIM14 clock enable during Sleep mode - @ReadWrite(bits: 8..<9) - public var tim14lpen: TIM14LPEN - - /// Window watchdog clock enable during Sleep mode - @ReadWrite(bits: 11..<12) - public var wwdglpen: WWDGLPEN - - /// SPI2 clock enable during Sleep mode - @ReadWrite(bits: 14..<15) - public var spi2lpen: SPI2LPEN - - /// SPI3 clock enable during Sleep mode - @ReadWrite(bits: 15..<16) - public var spi3lpen: SPI3LPEN - - /// USART2 clock enable during Sleep mode - @ReadWrite(bits: 17..<18) - public var usart2lpen: USART2LPEN - - /// USART3 clock enable during Sleep mode - @ReadWrite(bits: 18..<19) - public var usart3lpen: USART3LPEN - - /// UART4 clock enable during Sleep mode - @ReadWrite(bits: 19..<20) - public var uart4lpen: UART4LPEN - - /// UART5 clock enable during Sleep mode - @ReadWrite(bits: 20..<21) - public var uart5lpen: UART5LPEN - - /// I2C1 clock enable during Sleep mode - @ReadWrite(bits: 21..<22) - public var i2c1lpen: I2C1LPEN - - /// I2C2 clock enable during Sleep mode - @ReadWrite(bits: 22..<23) - public var i2c2lpen: I2C2LPEN - - /// I2C3 clock enable during Sleep mode - @ReadWrite(bits: 23..<24) - public var i2c3lpen: I2C3LPEN - - /// CAN 1 clock enable during Sleep mode - @ReadWrite(bits: 25..<26) - public var can1lpen: CAN1LPEN - - /// CAN 2 clock enable during Sleep mode - @ReadWrite(bits: 26..<27) - public var can2lpen: CAN2LPEN - - /// Power interface clock enable during Sleep mode - @ReadWrite(bits: 28..<29) - public var pwrlpen: PWRLPEN - - /// DAC interface clock enable during Sleep mode - @ReadWrite(bits: 29..<30) - public var daclpen: DACLPEN - - /// UART7 clock enable during Sleep mode - @ReadWrite(bits: 30..<31) - public var uart7lpen: UART7LPEN - - /// UART8 clock enable during Sleep mode - @ReadWrite(bits: 31..<32) - public var uart8lpen: UART8LPEN - - /// SPDIF-RX clock enable during sleep mode - @ReadWrite(bits: 16..<17) - public var spdifrxlpen: SPDIFRXLPEN - - /// HDMI-CEN clock enable during Sleep mode - @ReadWrite(bits: 27..<28) - public var ceclpen: CECLPEN - - /// low power timer 1 clock enable during Sleep mode - @ReadWrite(bits: 9..<10) - public var lptim1lpen: LPTIM1LPEN - - /// I2C4 clock enable during Sleep mode - @ReadWrite(bits: 24..<25) - public var i2c4lpen: I2C4LPEN - } - - /// APB2 peripheral clock enabled in low power mode register - @Register(bitWidth: 32) - public struct APB2LPENR { - /// TIM1 clock enable during Sleep mode - @ReadWrite(bits: 0..<1, as: TIM1LPENValues.self) - public var tim1lpen: TIM1LPEN - - /// TIM8 clock enable during Sleep mode - @ReadWrite(bits: 1..<2) - public var tim8lpen: TIM8LPEN - - /// USART1 clock enable during Sleep mode - @ReadWrite(bits: 4..<5) - public var usart1lpen: USART1LPEN - - /// USART6 clock enable during Sleep mode - @ReadWrite(bits: 5..<6) - public var usart6lpen: USART6LPEN - - /// ADC1 clock enable during Sleep mode - @ReadWrite(bits: 8..<9) - public var adc1lpen: ADC1LPEN - - /// ADC2 clock enable during Sleep mode - @ReadWrite(bits: 9..<10) - public var adc2lpen: ADC2LPEN - - /// ADC 3 clock enable during Sleep mode - @ReadWrite(bits: 10..<11) - public var adc3lpen: ADC3LPEN - - /// SPI 1 clock enable during Sleep mode - @ReadWrite(bits: 12..<13) - public var spi1lpen: SPI1LPEN - - /// SPI 4 clock enable during Sleep mode - @ReadWrite(bits: 13..<14) - public var spi4lpen: SPI4LPEN - - /// System configuration controller clock enable during Sleep mode - @ReadWrite(bits: 14..<15) - public var syscfglpen: SYSCFGLPEN - - /// TIM9 clock enable during sleep mode - @ReadWrite(bits: 16..<17) - public var tim9lpen: TIM9LPEN - - /// TIM10 clock enable during Sleep mode - @ReadWrite(bits: 17..<18) - public var tim10lpen: TIM10LPEN - - /// TIM11 clock enable during Sleep mode - @ReadWrite(bits: 18..<19) - public var tim11lpen: TIM11LPEN - - /// SPI 5 clock enable during Sleep mode - @ReadWrite(bits: 20..<21) - public var spi5lpen: SPI5LPEN - - /// SPI 6 clock enable during Sleep mode - @ReadWrite(bits: 21..<22) - public var spi6lpen: SPI6LPEN - - /// SAI1 clock enable during sleep mode - @ReadWrite(bits: 22..<23) - public var sai1lpen: SAI1LPEN - - /// LTDC clock enable during sleep mode - @ReadWrite(bits: 26..<27) - public var ltdclpen: LTDCLPEN - - /// SAI2 clock enable during sleep mode - @ReadWrite(bits: 23..<24) - public var sai2lpen: SAI2LPEN - - /// SDMMC1 clock enable during Sleep mode - @ReadWrite(bits: 11..<12) - public var sdmmc1lpen: SDMMC1LPEN - } - - /// Backup domain control register - @Register(bitWidth: 32) - public struct BDCR { - /// Backup domain software reset - @ReadWrite(bits: 16..<17, as: BDRSTValues.self) - public var bdrst: BDRST - - /// RTC clock enable - @ReadWrite(bits: 15..<16, as: RTCENValues.self) - public var rtcen: RTCEN - - /// External low-speed oscillator bypass - @ReadWrite(bits: 2..<3, as: LSEBYPValues.self) - public var lsebyp: LSEBYP - - /// External low-speed oscillator ready - @ReadOnly(bits: 1..<2) - public var lserdy: LSERDY - - /// External low-speed oscillator enable - @ReadWrite(bits: 0..<1, as: LSEONValues.self) - public var lseon: LSEON - - /// LSE oscillator drive capability - @ReadWrite(bits: 3..<5, as: LSEDRVValues.self) - public var lsedrv: LSEDRV - - /// RTC clock source selection - @Reserved(bits: 8..<10, as: RTCSELValues.self) - public var rtcsel: RTCSEL - } - - /// clock control & status register - @Register(bitWidth: 32) - public struct CSR { - /// Low-power reset flag - @ReadWrite(bits: 31..<32) - public var lpwrrstf: LPWRRSTF - - /// Window watchdog reset flag - @ReadWrite(bits: 30..<31) - public var wwdgrstf: WWDGRSTF - - /// Independent watchdog reset flag - @ReadWrite(bits: 29..<30) - public var wdgrstf: WDGRSTF - - /// Software reset flag - @ReadWrite(bits: 28..<29) - public var sftrstf: SFTRSTF - - /// POR/PDR reset flag - @ReadWrite(bits: 27..<28) - public var porrstf: PORRSTF - - /// PIN reset flag - @ReadWrite(bits: 26..<27) - public var padrstf: PADRSTF - - /// BOR reset flag - @ReadWrite(bits: 25..<26) - public var borrstf: BORRSTF - - /// Remove reset flag - @ReadWrite(bits: 24..<25) - public var rmvf: RMVF - - /// Internal low-speed oscillator ready - @ReadOnly(bits: 1..<2) - public var lsirdy: LSIRDY - - /// Internal low-speed oscillator enable - @ReadWrite(bits: 0..<1, as: LSIONValues.self) - public var lsion: LSION - } - - /// spread spectrum clock generation register - @Register(bitWidth: 32) - public struct SSCGR { - /// Spread spectrum modulation enable - @ReadWrite(bits: 31..<32, as: SSCGENValues.self) - public var sscgen: SSCGEN - - /// Spread Select - @ReadWrite(bits: 30..<31, as: SPREADSELValues.self) - public var spreadsel: SPREADSEL - - /// Incrementation step - @ReadWrite(bits: 13..<28) - public var incstep: INCSTEP - - /// Modulation period - @ReadWrite(bits: 0..<13) - public var modper: MODPER - } - - /// PLLI2S configuration register - @Register(bitWidth: 32) - public struct PLLI2SCFGR { - /// PLLI2S division factor for I2S clocks - @ReadWrite(bits: 28..<31) - public var plli2sr: PLLI2SR - - /// PLLI2S division factor for SAI1 clock - @ReadWrite(bits: 24..<28) - public var plli2sq: PLLI2SQ - - /// PLLI2S multiplication factor for VCO - @ReadWrite(bits: 6..<15) - public var plli2sn: PLLI2SN - - /// PLLI2S division factor for SPDIFRX clock - @ReadWrite(bits: 16..<18, as: PLLI2SPValues.self) - public var plli2sp: PLLI2SP - } - - /// PLL configuration register - @Register(bitWidth: 32) - public struct PLLSAICFGR { - /// PLLSAI division factor for VCO - @ReadWrite(bits: 6..<15) - public var pllsain: PLLSAIN - - /// PLLSAI division factor for 48MHz clock - @ReadWrite(bits: 16..<18, as: PLLSAIPValues.self) - public var pllsaip: PLLSAIP - - /// PLLSAI division factor for SAI clock - @ReadWrite(bits: 24..<28) - public var pllsaiq: PLLSAIQ - - /// PLLSAI division factor for LCD clock - @ReadWrite(bits: 28..<31) - public var pllsair: PLLSAIR - } - - /// dedicated clocks configuration register - @Register(bitWidth: 32) - public struct DCKCFGR1 { - /// PLLI2S division factor for SAI1 clock - @ReadWrite(bits: 0..<5, as: PLLI2SDIVQValues.self) - public var plli2sdivq: PLLI2SDIVQ - - /// PLLSAI division factor for SAI1 clock - @ReadWrite(bits: 8..<13, as: PLLSAIDIVQValues.self) - public var pllsaidivq: PLLSAIDIVQ - - /// division factor for LCD_CLK - @ReadWrite(bits: 16..<18, as: PLLSAIDIVRValues.self) - public var pllsaidivr: PLLSAIDIVR - - /// SAI1 clock source selection - @ReadWrite(bits: 20..<22, as: SAI1SELValues.self) - public var sai1sel: SAI1SEL - - /// SAI2 clock source selection - @ReadWrite(bits: 22..<24, as: SAI2SELValues.self) - public var sai2sel: SAI2SEL - - /// Timers clocks prescalers selection - @ReadWrite(bits: 24..<25, as: TIMPREValues.self) - public var timpre: TIMPRE - } - - /// dedicated clocks configuration register - @Register(bitWidth: 32) - public struct DCKCFGR2 { - /// USART 1 clock source selection - @ReadWrite(bits: 0..<2, as: USART1SELValues.self) - public var usart1sel: USART1SEL - - /// USART 2 clock source selection - @ReadWrite(bits: 2..<4, as: USART2SELValues.self) - public var usart2sel: USART2SEL - - /// USART 3 clock source selection - @ReadWrite(bits: 4..<6) - public var usart3sel: USART3SEL - - /// UART 4 clock source selection - @ReadWrite(bits: 6..<8) - public var uart4sel: UART4SEL - - /// UART 5 clock source selection - @ReadWrite(bits: 8..<10) - public var uart5sel: UART5SEL - - /// USART 6 clock source selection - @ReadWrite(bits: 10..<12) - public var usart6sel: USART6SEL - - /// UART 7 clock source selection - @ReadWrite(bits: 12..<14) - public var uart7sel: UART7SEL - - /// UART 8 clock source selection - @ReadWrite(bits: 14..<16) - public var uart8sel: UART8SEL - - /// I2C1 clock source selection - @ReadWrite(bits: 16..<18, as: I2C1SELValues.self) - public var i2c1sel: I2C1SEL - - /// I2C2 clock source selection - @ReadWrite(bits: 18..<20) - public var i2c2sel: I2C2SEL - - /// I2C3 clock source selection - @ReadWrite(bits: 20..<22) - public var i2c3sel: I2C3SEL - - /// I2C4 clock source selection - @ReadWrite(bits: 22..<24) - public var i2c4sel: I2C4SEL - - /// Low power timer 1 clock source selection - @ReadWrite(bits: 24..<26, as: LPTIM1SELValues.self) - public var lptim1sel: LPTIM1SEL - - /// HDMI-CEC clock source selection - @ReadWrite(bits: 26..<27, as: CECSELValues.self) - public var cecsel: CECSEL - - /// 48MHz clock source selection - @ReadWrite(bits: 27..<28, as: CK48MSELValues.self) - public var ck48msel: CK48MSEL - - /// SDMMC clock source selection - @ReadWrite(bits: 28..<29, as: SDMMC1SELValues.self) - public var sdmmc1sel: SDMMC1SEL - } -} - -extension RCC.CR { - public struct CSSONValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Clock security system disabled (clock detector OFF) - public static let Off = Self(rawValue: 0x0) - - /// Clock security system enable (clock detector ON if the HSE is ready, OFF if not) - public static let On = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.CR { - public struct HSEBYPValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// HSE crystal oscillator not bypassed - public static let NotBypassed = Self(rawValue: 0x0) - - /// HSE crystal oscillator bypassed with external clock - public static let Bypassed = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.CR { - public struct HSIONValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Clock Off - public static let Off = Self(rawValue: 0x0) - - /// Clock On - public static let On = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.PLLCFGR { - public struct PLLSRCValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// HSI clock selected as PLL and PLLI2S clock entry - public static let HSI = Self(rawValue: 0x0) - - /// HSE oscillator clock selected as PLL and PLLI2S clock entry - public static let HSE = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.PLLCFGR { - public struct PLLPValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// PLLP=2 - public static let Div2 = Self(rawValue: 0x0) - - /// PLLP=4 - public static let Div4 = Self(rawValue: 0x1) - - /// PLLP=6 - public static let Div6 = Self(rawValue: 0x2) - - /// PLLP=8 - public static let Div8 = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.CFGR { - public struct MCO2Values: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// System clock (SYSCLK) selected - public static let SYSCLK = Self(rawValue: 0x0) - - /// PLLI2S clock selected - public static let PLLI2S = Self(rawValue: 0x1) - - /// HSE oscillator clock selected - public static let HSE = Self(rawValue: 0x2) - - /// PLL clock selected - public static let PLL = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.CFGR { - public struct MCO1PREValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 3 - - /// No division - public static let Div1 = Self(rawValue: 0x0) - - /// Division by 2 - public static let Div2 = Self(rawValue: 0x4) - - /// Division by 3 - public static let Div3 = Self(rawValue: 0x5) - - /// Division by 4 - public static let Div4 = Self(rawValue: 0x6) - - /// Division by 5 - public static let Div5 = Self(rawValue: 0x7) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.CFGR { - public struct I2SSRCValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// PLLI2S clock used as I2S clock source - public static let PLLI2S = Self(rawValue: 0x0) - - /// External clock mapped on the I2S_CKIN pin used as I2S clock source - public static let CKIN = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.CFGR { - public struct MCO1Values: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// HSI clock selected - public static let HSI = Self(rawValue: 0x0) - - /// LSE oscillator selected - public static let LSE = Self(rawValue: 0x1) - - /// HSE oscillator clock selected - public static let HSE = Self(rawValue: 0x2) - - /// PLL clock selected - public static let PLL = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.CFGR { - public struct PPRE1Values: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 3 - - /// HCLK not divided - public static let Div1 = Self(rawValue: 0x0) - - /// HCLK divided by 2 - public static let Div2 = Self(rawValue: 0x4) - - /// HCLK divided by 4 - public static let Div4 = Self(rawValue: 0x5) - - /// HCLK divided by 8 - public static let Div8 = Self(rawValue: 0x6) - - /// HCLK divided by 16 - public static let Div16 = Self(rawValue: 0x7) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.CFGR { - public struct HPREValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 4 - - /// SYSCLK not divided - public static let Div1 = Self(rawValue: 0x0) - - /// SYSCLK divided by 2 - public static let Div2 = Self(rawValue: 0x8) - - /// SYSCLK divided by 4 - public static let Div4 = Self(rawValue: 0x9) - - /// SYSCLK divided by 8 - public static let Div8 = Self(rawValue: 0xa) - - /// SYSCLK divided by 16 - public static let Div16 = Self(rawValue: 0xb) - - /// SYSCLK divided by 64 - public static let Div64 = Self(rawValue: 0xc) - - /// SYSCLK divided by 128 - public static let Div128 = Self(rawValue: 0xd) - - /// SYSCLK divided by 256 - public static let Div256 = Self(rawValue: 0xe) - - /// SYSCLK divided by 512 - public static let Div512 = Self(rawValue: 0xf) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.CFGR { - public struct SWValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// HSI selected as system clock - public static let HSI = Self(rawValue: 0x0) - - /// HSE selected as system clock - public static let HSE = Self(rawValue: 0x1) - - /// PLL selected as system clock - public static let PLL = Self(rawValue: 0x2) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.CIR { - public struct LSIRDYIEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Interrupt disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Interrupt enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.AHB1RSTR { - public struct GPIOARSTValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Reset the selected module - public static let Reset = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.AHB2RSTR { - public struct DCMIRSTValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Reset the selected module - public static let Reset = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.AHB3RSTR { - public struct FMCRSTValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Reset the selected module - public static let Reset = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.APB1RSTR { - public struct TIM2RSTValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Reset the selected module - public static let Reset = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.APB2RSTR { - public struct TIM1RSTValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Reset the selected module - public static let Reset = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.AHB1ENR { - public struct GPIOAENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// The selected clock is disabled - public static let Disabled = Self(rawValue: 0x0) - - /// The selected clock is enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.AHB2ENR { - public struct DCMIENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// The selected clock is disabled - public static let Disabled = Self(rawValue: 0x0) - - /// The selected clock is enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.AHB3ENR { - public struct FMCENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// The selected clock is disabled - public static let Disabled = Self(rawValue: 0x0) - - /// The selected clock is enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.APB1ENR { - public struct TIM2ENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// The selected clock is disabled - public static let Disabled = Self(rawValue: 0x0) - - /// The selected clock is enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.APB2ENR { - public struct TIM1ENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// The selected clock is disabled - public static let Disabled = Self(rawValue: 0x0) - - /// The selected clock is enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.AHB1LPENR { - public struct GPIOALPENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Selected module is disabled during Sleep mode - public static let DisabledInSleep = Self(rawValue: 0x0) - - /// Selected module is enabled during Sleep mode - public static let EnabledInSleep = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.AHB2LPENR { - public struct DCMILPENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Selected module is disabled during Sleep mode - public static let DisabledInSleep = Self(rawValue: 0x0) - - /// Selected module is enabled during Sleep mode - public static let EnabledInSleep = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.AHB3LPENR { - public struct FMCLPENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Selected module is disabled during Sleep mode - public static let DisabledInSleep = Self(rawValue: 0x0) - - /// Selected module is enabled during Sleep mode - public static let EnabledInSleep = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.APB1LPENR { - public struct TIM2LPENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Selected module is disabled during Sleep mode - public static let DisabledInSleep = Self(rawValue: 0x0) - - /// Selected module is enabled during Sleep mode - public static let EnabledInSleep = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.APB2LPENR { - public struct TIM1LPENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Selected module is disabled during Sleep mode - public static let DisabledInSleep = Self(rawValue: 0x0) - - /// Selected module is enabled during Sleep mode - public static let EnabledInSleep = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.BDCR { - public struct BDRSTValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Reset not activated - public static let Disabled = Self(rawValue: 0x0) - - /// Reset the entire RTC domain - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.BDCR { - public struct RTCENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// RTC clock disabled - public static let Disabled = Self(rawValue: 0x0) - - /// RTC clock enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.BDCR { - public struct LSEBYPValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// LSE crystal oscillator not bypassed - public static let NotBypassed = Self(rawValue: 0x0) - - /// LSE crystal oscillator bypassed with external clock - public static let Bypassed = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.BDCR { - public struct LSEONValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// LSE oscillator Off - public static let Off = Self(rawValue: 0x0) - - /// LSE oscillator On - public static let On = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.BDCR { - public struct LSEDRVValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// Low drive capacity - public static let Low = Self(rawValue: 0x0) - - /// Medium-high drive capacity - public static let MediumHigh = Self(rawValue: 0x1) - - /// Medium-low drive capacity - public static let MediumLow = Self(rawValue: 0x2) - - /// High drive capacity - public static let High = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.BDCR { - public struct RTCSELValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// No clock - public static let NoClock = Self(rawValue: 0x0) - - /// LSE oscillator clock used as RTC clock - public static let LSE = Self(rawValue: 0x1) - - /// LSI oscillator clock used as RTC clock - public static let LSI = Self(rawValue: 0x2) - - /// HSE oscillator clock divided by a prescaler used as RTC clock - public static let HSE = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.CSR { - public struct LSIONValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// LSI oscillator Off - public static let Off = Self(rawValue: 0x0) - - /// LSI oscillator On - public static let On = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.SSCGR { - public struct SSCGENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Spread spectrum modulation disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Spread spectrum modulation enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.SSCGR { - public struct SPREADSELValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Center spread - public static let Center = Self(rawValue: 0x0) - - /// Down spread - public static let Down = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.PLLI2SCFGR { - public struct PLLI2SPValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// PLL*P=2 - public static let Div2 = Self(rawValue: 0x0) - - /// PLL*P=4 - public static let Div4 = Self(rawValue: 0x1) - - /// PLL*P=6 - public static let Div6 = Self(rawValue: 0x2) - - /// PLL*P=8 - public static let Div8 = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.PLLSAICFGR { - public struct PLLSAIPValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// PLL*P=2 - public static let Div2 = Self(rawValue: 0x0) - - /// PLL*P=4 - public static let Div4 = Self(rawValue: 0x1) - - /// PLL*P=6 - public static let Div6 = Self(rawValue: 0x2) - - /// PLL*P=8 - public static let Div8 = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.DCKCFGR1 { - public struct PLLI2SDIVQValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 5 - - /// PLLI2SDIVQ = /1 - public static let Div1 = Self(rawValue: 0x0) - - /// PLLI2SDIVQ = /2 - public static let Div2 = Self(rawValue: 0x1) - - /// PLLI2SDIVQ = /3 - public static let Div3 = Self(rawValue: 0x2) - - /// PLLI2SDIVQ = /4 - public static let Div4 = Self(rawValue: 0x3) - - /// PLLI2SDIVQ = /5 - public static let Div5 = Self(rawValue: 0x4) - - /// PLLI2SDIVQ = /6 - public static let Div6 = Self(rawValue: 0x5) - - /// PLLI2SDIVQ = /7 - public static let Div7 = Self(rawValue: 0x6) - - /// PLLI2SDIVQ = /8 - public static let Div8 = Self(rawValue: 0x7) - - /// PLLI2SDIVQ = /9 - public static let Div9 = Self(rawValue: 0x8) - - /// PLLI2SDIVQ = /10 - public static let Div10 = Self(rawValue: 0x9) - - /// PLLI2SDIVQ = /11 - public static let Div11 = Self(rawValue: 0xa) - - /// PLLI2SDIVQ = /12 - public static let Div12 = Self(rawValue: 0xb) - - /// PLLI2SDIVQ = /13 - public static let Div13 = Self(rawValue: 0xc) - - /// PLLI2SDIVQ = /14 - public static let Div14 = Self(rawValue: 0xd) - - /// PLLI2SDIVQ = /15 - public static let Div15 = Self(rawValue: 0xe) - - /// PLLI2SDIVQ = /16 - public static let Div16 = Self(rawValue: 0xf) - - /// PLLI2SDIVQ = /17 - public static let Div17 = Self(rawValue: 0x10) - - /// PLLI2SDIVQ = /18 - public static let Div18 = Self(rawValue: 0x11) - - /// PLLI2SDIVQ = /19 - public static let Div19 = Self(rawValue: 0x12) - - /// PLLI2SDIVQ = /20 - public static let Div20 = Self(rawValue: 0x13) - - /// PLLI2SDIVQ = /21 - public static let Div21 = Self(rawValue: 0x14) - - /// PLLI2SDIVQ = /22 - public static let Div22 = Self(rawValue: 0x15) - - /// PLLI2SDIVQ = /23 - public static let Div23 = Self(rawValue: 0x16) - - /// PLLI2SDIVQ = /24 - public static let Div24 = Self(rawValue: 0x17) - - /// PLLI2SDIVQ = /25 - public static let Div25 = Self(rawValue: 0x18) - - /// PLLI2SDIVQ = /26 - public static let Div26 = Self(rawValue: 0x19) - - /// PLLI2SDIVQ = /27 - public static let Div27 = Self(rawValue: 0x1a) - - /// PLLI2SDIVQ = /28 - public static let Div28 = Self(rawValue: 0x1b) - - /// PLLI2SDIVQ = /29 - public static let Div29 = Self(rawValue: 0x1c) - - /// PLLI2SDIVQ = /30 - public static let Div30 = Self(rawValue: 0x1d) - - /// PLLI2SDIVQ = /31 - public static let Div31 = Self(rawValue: 0x1e) - - /// PLLI2SDIVQ = /32 - public static let Div32 = Self(rawValue: 0x1f) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.DCKCFGR1 { - public struct PLLSAIDIVQValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 5 - - /// PLLSAIDIVQ = /1 - public static let Div1 = Self(rawValue: 0x0) - - /// PLLSAIDIVQ = /2 - public static let Div2 = Self(rawValue: 0x1) - - /// PLLSAIDIVQ = /3 - public static let Div3 = Self(rawValue: 0x2) - - /// PLLSAIDIVQ = /4 - public static let Div4 = Self(rawValue: 0x3) - - /// PLLSAIDIVQ = /5 - public static let Div5 = Self(rawValue: 0x4) - - /// PLLSAIDIVQ = /6 - public static let Div6 = Self(rawValue: 0x5) - - /// PLLSAIDIVQ = /7 - public static let Div7 = Self(rawValue: 0x6) - - /// PLLSAIDIVQ = /8 - public static let Div8 = Self(rawValue: 0x7) - - /// PLLSAIDIVQ = /9 - public static let Div9 = Self(rawValue: 0x8) - - /// PLLSAIDIVQ = /10 - public static let Div10 = Self(rawValue: 0x9) - - /// PLLSAIDIVQ = /11 - public static let Div11 = Self(rawValue: 0xa) - - /// PLLSAIDIVQ = /12 - public static let Div12 = Self(rawValue: 0xb) - - /// PLLSAIDIVQ = /13 - public static let Div13 = Self(rawValue: 0xc) - - /// PLLSAIDIVQ = /14 - public static let Div14 = Self(rawValue: 0xd) - - /// PLLSAIDIVQ = /15 - public static let Div15 = Self(rawValue: 0xe) - - /// PLLSAIDIVQ = /16 - public static let Div16 = Self(rawValue: 0xf) - - /// PLLSAIDIVQ = /17 - public static let Div17 = Self(rawValue: 0x10) - - /// PLLSAIDIVQ = /18 - public static let Div18 = Self(rawValue: 0x11) - - /// PLLSAIDIVQ = /19 - public static let Div19 = Self(rawValue: 0x12) - - /// PLLSAIDIVQ = /20 - public static let Div20 = Self(rawValue: 0x13) - - /// PLLSAIDIVQ = /21 - public static let Div21 = Self(rawValue: 0x14) - - /// PLLSAIDIVQ = /22 - public static let Div22 = Self(rawValue: 0x15) - - /// PLLSAIDIVQ = /23 - public static let Div23 = Self(rawValue: 0x16) - - /// PLLSAIDIVQ = /24 - public static let Div24 = Self(rawValue: 0x17) - - /// PLLSAIDIVQ = /25 - public static let Div25 = Self(rawValue: 0x18) - - /// PLLSAIDIVQ = /26 - public static let Div26 = Self(rawValue: 0x19) - - /// PLLSAIDIVQ = /27 - public static let Div27 = Self(rawValue: 0x1a) - - /// PLLSAIDIVQ = /28 - public static let Div28 = Self(rawValue: 0x1b) - - /// PLLSAIDIVQ = /29 - public static let Div29 = Self(rawValue: 0x1c) - - /// PLLSAIDIVQ = /30 - public static let Div30 = Self(rawValue: 0x1d) - - /// PLLSAIDIVQ = /31 - public static let Div31 = Self(rawValue: 0x1e) - - /// PLLSAIDIVQ = /32 - public static let Div32 = Self(rawValue: 0x1f) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.DCKCFGR1 { - public struct PLLSAIDIVRValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// PLLSAIDIVR = /2 - public static let Div2 = Self(rawValue: 0x0) - - /// PLLSAIDIVR = /4 - public static let Div4 = Self(rawValue: 0x1) - - /// PLLSAIDIVR = /8 - public static let Div8 = Self(rawValue: 0x2) - - /// PLLSAIDIVR = /16 - public static let Div16 = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.DCKCFGR1 { - public struct SAI1SELValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// SAI1 clock frequency = f(PLLSAI_Q) / PLLSAIDIVQ - public static let PLLSAI = Self(rawValue: 0x0) - - /// SAI1 clock frequency = f(PLLI2S_Q) / PLLI2SDIVQ - public static let PLLI2S = Self(rawValue: 0x1) - - /// SAI1 clock frequency = Alternate function input frequency - public static let AFIF = Self(rawValue: 0x2) - - /// SAI1 clock frequency = HSI or HSE - public static let HSI_HSE = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.DCKCFGR1 { - public struct SAI2SELValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// SAI2 clock frequency = f(PLLSAI_Q) / PLLSAIDIVQ - public static let PLLSAI = Self(rawValue: 0x0) - - /// SAI2 clock frequency = f(PLLI2S_Q) / PLLI2SDIVQ - public static let PLLI2S = Self(rawValue: 0x1) - - /// SAI2 clock frequency = Alternate function input frequency - public static let AFIF = Self(rawValue: 0x2) - - /// SAI2 clock frequency = HSI or HSE - public static let HSI_HSE = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.DCKCFGR1 { - public struct TIMPREValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// If the APB prescaler is configured 1, TIMxCLK = PCLKx. Otherwise, TIMxCLK = 2xPCLKx - public static let Mul1Or2 = Self(rawValue: 0x0) - - /// If the APB prescaler is configured 1, 2 or 4, TIMxCLK = HCLK. Otherwise, TIMxCLK = 4xPCLKx - public static let Mul1Or4 = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.DCKCFGR2 { - public struct USART1SELValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// APB2 clock (PCLK2) is selected as USART clock - public static let APB2 = Self(rawValue: 0x0) - - /// System clock is selected as USART clock - public static let SYSCLK = Self(rawValue: 0x1) - - /// HSI clock is selected as USART clock - public static let HSI = Self(rawValue: 0x2) - - /// LSE clock is selected as USART clock - public static let LSE = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.DCKCFGR2 { - public struct USART2SELValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// APB1 clock (PCLK1) is selected as USART clock - public static let APB1 = Self(rawValue: 0x0) - - /// System clock is selected as USART clock - public static let SYSCLK = Self(rawValue: 0x1) - - /// HSI clock is selected as USART clock - public static let HSI = Self(rawValue: 0x2) - - /// LSE clock is selected as USART clock - public static let LSE = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.DCKCFGR2 { - public struct I2C1SELValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// APB clock selected as I2C clock - public static let APB = Self(rawValue: 0x0) - - /// System clock selected as I2C clock - public static let SYSCLK = Self(rawValue: 0x1) - - /// HSI clock selected as I2C clock - public static let HSI = Self(rawValue: 0x2) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.DCKCFGR2 { - public struct LPTIM1SELValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// APB1 clock (PCLK1) selected as LPTILM1 clock - public static let APB1 = Self(rawValue: 0x0) - - /// LSI clock is selected as LPTILM1 clock - public static let LSI = Self(rawValue: 0x1) - - /// HSI clock is selected as LPTILM1 clock - public static let HSI = Self(rawValue: 0x2) - - /// LSE clock is selected as LPTILM1 clock - public static let LSE = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.DCKCFGR2 { - public struct CECSELValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// LSE clock is selected as HDMI-CEC clock - public static let LSE = Self(rawValue: 0x0) - - /// HSI divided by 488 clock is selected as HDMI-CEC clock - public static let HSI_Div488 = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.DCKCFGR2 { - public struct CK48MSELValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// 48MHz clock from PLL is selected - public static let PLL = Self(rawValue: 0x0) - - /// 48MHz clock from PLLSAI is selected - public static let PLLSAI = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.DCKCFGR2 { - public struct SDMMC1SELValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// 48 MHz clock is selected as SD clock - public static let CK48M = Self(rawValue: 0x0) - - /// System clock is selected as SD clock - public static let SYSCLK = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} diff --git a/stm32-neopixel/Sources/STM32F7X6/SPI1.swift b/stm32-neopixel/Sources/STM32F7X6/SPI1.swift deleted file mode 100644 index c08d7a60..00000000 --- a/stm32-neopixel/Sources/STM32F7X6/SPI1.swift +++ /dev/null @@ -1,1043 +0,0 @@ -// Generated by svd2swift. - -import MMIO - -/// Serial peripheral interface -@RegisterBlock -public struct SPI1 { - /// control register 1 - @RegisterBlock(offset: 0x0) - public var cr1: Register - - /// control register 2 - @RegisterBlock(offset: 0x4) - public var cr2: Register - - /// status register - @RegisterBlock(offset: 0x8) - public var sr: Register - - /// data register - @RegisterBlock(offset: 0xc) - public var dr: Register - - /// CRC polynomial register - @RegisterBlock(offset: 0x10) - public var crcpr: Register - - /// RX CRC register - @RegisterBlock(offset: 0x14) - public var rxcrcr: Register - - /// TX CRC register - @RegisterBlock(offset: 0x18) - public var txcrcr: Register - - /// I2S configuration register - @RegisterBlock(offset: 0x1c) - public var i2scfgr: Register - - /// I2S prescaler register - @RegisterBlock(offset: 0x20) - public var i2spr: Register -} - -extension SPI1 { - /// control register 1 - @Register(bitWidth: 32) - public struct CR1 { - /// Bidirectional data mode enable - @ReadWrite(bits: 15..<16, as: BIDIMODEValues.self) - public var bidimode: BIDIMODE - - /// Output enable in bidirectional mode - @ReadWrite(bits: 14..<15, as: BIDIOEValues.self) - public var bidioe: BIDIOE - - /// Hardware CRC calculation enable - @ReadWrite(bits: 13..<14, as: CRCENValues.self) - public var crcen: CRCEN - - /// CRC transfer next - @ReadWrite(bits: 12..<13, as: CRCNEXTValues.self) - public var crcnext: CRCNEXT - - /// CRC length - @ReadWrite(bits: 11..<12, as: CRCLValues.self) - public var crcl: CRCL - - /// Receive only - @ReadWrite(bits: 10..<11, as: RXONLYValues.self) - public var rxonly: RXONLY - - /// Software slave management - @ReadWrite(bits: 9..<10, as: SSMValues.self) - public var ssm: SSM - - /// Internal slave select - @ReadWrite(bits: 8..<9, as: SSIValues.self) - public var ssi: SSI - - /// Frame format - @ReadWrite(bits: 7..<8, as: LSBFIRSTValues.self) - public var lsbfirst: LSBFIRST - - /// SPI enable - @ReadWrite(bits: 6..<7, as: SPEValues.self) - public var spe: SPE - - /// Baud rate control - @ReadWrite(bits: 3..<6, as: BRValues.self) - public var br: BR - - /// Master selection - @ReadWrite(bits: 2..<3, as: MSTRValues.self) - public var mstr: MSTR - - /// Clock polarity - @ReadWrite(bits: 1..<2, as: CPOLValues.self) - public var cpol: CPOL - - /// Clock phase - @ReadWrite(bits: 0..<1, as: CPHAValues.self) - public var cpha: CPHA - } - - /// control register 2 - @Register(bitWidth: 32) - public struct CR2 { - /// Rx buffer DMA enable - @ReadWrite(bits: 0..<1, as: RXDMAENValues.self) - public var rxdmaen: RXDMAEN - - /// Tx buffer DMA enable - @ReadWrite(bits: 1..<2, as: TXDMAENValues.self) - public var txdmaen: TXDMAEN - - /// SS output enable - @ReadWrite(bits: 2..<3, as: SSOEValues.self) - public var ssoe: SSOE - - /// NSS pulse management - @ReadWrite(bits: 3..<4, as: NSSPValues.self) - public var nssp: NSSP - - /// Frame format - @ReadWrite(bits: 4..<5, as: FRFValues.self) - public var frf: FRF - - /// Error interrupt enable - @ReadWrite(bits: 5..<6, as: ERRIEValues.self) - public var errie: ERRIE - - /// RX buffer not empty interrupt enable - @ReadWrite(bits: 6..<7, as: RXNEIEValues.self) - public var rxneie: RXNEIE - - /// Tx buffer empty interrupt enable - @ReadWrite(bits: 7..<8, as: TXEIEValues.self) - public var txeie: TXEIE - - /// Data size - @ReadWrite(bits: 8..<12, as: DSValues.self) - public var ds: DS - - /// FIFO reception threshold - @ReadWrite(bits: 12..<13, as: FRXTHValues.self) - public var frxth: FRXTH - - /// Last DMA transfer for reception - @ReadWrite(bits: 13..<14, as: LDMA_RXValues.self) - public var ldma_rx: LDMA_RX - - /// Last DMA transfer for transmission - @ReadWrite(bits: 14..<15, as: LDMA_TXValues.self) - public var ldma_tx: LDMA_TX - } - - /// status register - @Register(bitWidth: 32) - public struct SR { - /// Frame format error - @ReadOnly(bits: 8..<9) - public var fre: FRE - - /// Busy flag - @ReadOnly(bits: 7..<8) - public var bsy: BSY - - /// Overrun flag - @ReadOnly(bits: 6..<7) - public var ovr: OVR - - /// Mode fault - @ReadOnly(bits: 5..<6) - public var modf: MODF - - /// CRC error flag - @ReadWrite(bits: 4..<5) - public var crcerr: CRCERR - - /// Underrun flag - @ReadOnly(bits: 3..<4) - public var udr: UDR - - /// Channel side - @ReadOnly(bits: 2..<3) - public var chside: CHSIDE - - /// Transmit buffer empty - @ReadOnly(bits: 1..<2) - public var txe: TXE - - /// Receive buffer not empty - @ReadOnly(bits: 0..<1) - public var rxne: RXNE - - /// FIFO reception level - @ReadOnly(bits: 9..<11) - public var frlvl: FRLVL - - /// FIFO Transmission Level - @ReadOnly(bits: 11..<13) - public var ftlvl: FTLVL - } - - /// data register - @Register(bitWidth: 32) - public struct DR { - /// Data register - @ReadWrite(bits: 0..<16) - public var dr_field: DR_FIELD - } - - /// CRC polynomial register - @Register(bitWidth: 32) - public struct CRCPR { - /// CRC polynomial register - @ReadWrite(bits: 0..<16) - public var crcpoly: CRCPOLY - } - - /// RX CRC register - @Register(bitWidth: 32) - public struct RXCRCR { - /// Rx CRC register - @ReadOnly(bits: 0..<16) - public var rxcrc: RxCRC - } - - /// TX CRC register - @Register(bitWidth: 32) - public struct TXCRCR { - /// Tx CRC register - @ReadOnly(bits: 0..<16) - public var txcrc: TxCRC - } - - /// I2S configuration register - @Register(bitWidth: 32) - public struct I2SCFGR { - /// I2S mode selection - @ReadWrite(bits: 11..<12, as: I2SMODValues.self) - public var i2smod: I2SMOD - - /// I2S Enable - @ReadWrite(bits: 10..<11, as: I2SEValues.self) - public var i2se: I2SE - - /// I2S configuration mode - @ReadWrite(bits: 8..<10, as: I2SCFGValues.self) - public var i2scfg: I2SCFG - - /// PCM frame synchronization - @ReadWrite(bits: 7..<8, as: PCMSYNCValues.self) - public var pcmsync: PCMSYNC - - /// I2S standard selection - @ReadWrite(bits: 4..<6, as: I2SSTDValues.self) - public var i2sstd: I2SSTD - - /// Steady state clock polarity - @ReadWrite(bits: 3..<4, as: CKPOLValues.self) - public var ckpol: CKPOL - - /// Data length to be transferred - @ReadWrite(bits: 1..<3, as: DATLENValues.self) - public var datlen: DATLEN - - /// Channel length (number of bits per audio channel) - @ReadWrite(bits: 0..<1, as: CHLENValues.self) - public var chlen: CHLEN - - /// Asynchronous start enable - @ReadWrite(bits: 12..<13) - public var astrten: ASTRTEN - } - - /// I2S prescaler register - @Register(bitWidth: 32) - public struct I2SPR { - /// Master clock output enable - @ReadWrite(bits: 9..<10, as: MCKOEValues.self) - public var mckoe: MCKOE - - /// Odd factor for the prescaler - @ReadWrite(bits: 8..<9, as: ODDValues.self) - public var odd: ODD - - /// I2S Linear prescaler - @ReadWrite(bits: 0..<8) - public var i2sdiv: I2SDIV - } -} - -extension SPI1.CR1 { - public struct BIDIMODEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// 2-line unidirectional data mode selected - public static let Unidirectional = Self(rawValue: 0x0) - - /// 1-line bidirectional data mode selected - public static let Bidirectional = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension SPI1.CR1 { - public struct BIDIOEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Output disabled (receive-only mode) - public static let OutputDisabled = Self(rawValue: 0x0) - - /// Output enabled (transmit-only mode) - public static let OutputEnabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension SPI1.CR1 { - public struct CRCENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// CRC calculation disabled - public static let Disabled = Self(rawValue: 0x0) - - /// CRC calculation enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension SPI1.CR1 { - public struct CRCNEXTValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Next transmit value is from Tx buffer - public static let TxBuffer = Self(rawValue: 0x0) - - /// Next transmit value is from Tx CRC register - public static let CRC = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension SPI1.CR1 { - public struct CRCLValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// 8-bit CRC length - public static let EightBit = Self(rawValue: 0x0) - - /// 16-bit CRC length - public static let SixteenBit = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension SPI1.CR1 { - public struct RXONLYValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Full duplex (Transmit and receive) - public static let FullDuplex = Self(rawValue: 0x0) - - /// Output disabled (Receive-only mode) - public static let OutputDisabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension SPI1.CR1 { - public struct SSMValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Software slave management disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Software slave management enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension SPI1.CR1 { - public struct SSIValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// 0 is forced onto the NSS pin and the I/O value of the NSS pin is ignored - public static let SlaveSelected = Self(rawValue: 0x0) - - /// 1 is forced onto the NSS pin and the I/O value of the NSS pin is ignored - public static let SlaveNotSelected = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension SPI1.CR1 { - public struct LSBFIRSTValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Data is transmitted/received with the MSB first - public static let MSBFirst = Self(rawValue: 0x0) - - /// Data is transmitted/received with the LSB first - public static let LSBFirst = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension SPI1.CR1 { - public struct SPEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Peripheral disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Peripheral enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension SPI1.CR1 { - public struct BRValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 3 - - /// f_PCLK / 2 - public static let Div2 = Self(rawValue: 0x0) - - /// f_PCLK / 4 - public static let Div4 = Self(rawValue: 0x1) - - /// f_PCLK / 8 - public static let Div8 = Self(rawValue: 0x2) - - /// f_PCLK / 16 - public static let Div16 = Self(rawValue: 0x3) - - /// f_PCLK / 32 - public static let Div32 = Self(rawValue: 0x4) - - /// f_PCLK / 64 - public static let Div64 = Self(rawValue: 0x5) - - /// f_PCLK / 128 - public static let Div128 = Self(rawValue: 0x6) - - /// f_PCLK / 256 - public static let Div256 = Self(rawValue: 0x7) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension SPI1.CR1 { - public struct MSTRValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Slave configuration - public static let Slave = Self(rawValue: 0x0) - - /// Master configuration - public static let Master = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension SPI1.CR1 { - public struct CPOLValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// CK to 0 when idle - public static let IdleLow = Self(rawValue: 0x0) - - /// CK to 1 when idle - public static let IdleHigh = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension SPI1.CR1 { - public struct CPHAValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// The first clock transition is the first data capture edge - public static let FirstEdge = Self(rawValue: 0x0) - - /// The second clock transition is the first data capture edge - public static let SecondEdge = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension SPI1.CR2 { - public struct RXDMAENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Rx buffer DMA disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Rx buffer DMA enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension SPI1.CR2 { - public struct TXDMAENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Tx buffer DMA disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Tx buffer DMA enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension SPI1.CR2 { - public struct SSOEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// SS output is disabled in master mode - public static let Disabled = Self(rawValue: 0x0) - - /// SS output is enabled in master mode - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension SPI1.CR2 { - public struct NSSPValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// No NSS pulse - public static let NoPulse = Self(rawValue: 0x0) - - /// NSS pulse generated - public static let PulseGenerated = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension SPI1.CR2 { - public struct FRFValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// SPI Motorola mode - public static let Motorola = Self(rawValue: 0x0) - - /// SPI TI mode - public static let TI = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension SPI1.CR2 { - public struct ERRIEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Error interrupt masked - public static let Masked = Self(rawValue: 0x0) - - /// Error interrupt not masked - public static let NotMasked = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension SPI1.CR2 { - public struct RXNEIEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// RXE interrupt masked - public static let Masked = Self(rawValue: 0x0) - - /// RXE interrupt not masked - public static let NotMasked = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension SPI1.CR2 { - public struct TXEIEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// TXE interrupt masked - public static let Masked = Self(rawValue: 0x0) - - /// TXE interrupt not masked - public static let NotMasked = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension SPI1.CR2 { - public struct DSValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 4 - - /// 4-bit - public static let FourBit = Self(rawValue: 0x3) - - /// 5-bit - public static let FiveBit = Self(rawValue: 0x4) - - /// 6-bit - public static let SixBit = Self(rawValue: 0x5) - - /// 7-bit - public static let SevenBit = Self(rawValue: 0x6) - - /// 8-bit - public static let EightBit = Self(rawValue: 0x7) - - /// 9-bit - public static let NineBit = Self(rawValue: 0x8) - - /// 10-bit - public static let TenBit = Self(rawValue: 0x9) - - /// 11-bit - public static let ElevenBit = Self(rawValue: 0xa) - - /// 12-bit - public static let TwelveBit = Self(rawValue: 0xb) - - /// 13-bit - public static let ThirteenBit = Self(rawValue: 0xc) - - /// 14-bit - public static let FourteenBit = Self(rawValue: 0xd) - - /// 15-bit - public static let FifteenBit = Self(rawValue: 0xe) - - /// 16-bit - public static let SixteenBit = Self(rawValue: 0xf) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension SPI1.CR2 { - public struct FRXTHValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// RXNE event is generated if the FIFO level is greater than or equal to 1/2 (16-bit) - public static let Half = Self(rawValue: 0x0) - - /// RXNE event is generated if the FIFO level is greater than or equal to 1/4 (8-bit) - public static let Quarter = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension SPI1.CR2 { - public struct LDMA_RXValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Number of data to transfer for receive is even - public static let Even = Self(rawValue: 0x0) - - /// Number of data to transfer for receive is odd - public static let Odd = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension SPI1.CR2 { - public struct LDMA_TXValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Number of data to transfer for transmit is even - public static let Even = Self(rawValue: 0x0) - - /// Number of data to transfer for transmit is odd - public static let Odd = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension SPI1.I2SCFGR { - public struct I2SMODValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// SPI mode is selected - public static let SPIMode = Self(rawValue: 0x0) - - /// I2S mode is selected - public static let I2SMode = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension SPI1.I2SCFGR { - public struct I2SEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// I2S peripheral is disabled - public static let Disabled = Self(rawValue: 0x0) - - /// I2S peripheral is enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension SPI1.I2SCFGR { - public struct I2SCFGValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// Slave - transmit - public static let SlaveTx = Self(rawValue: 0x0) - - /// Slave - receive - public static let SlaveRx = Self(rawValue: 0x1) - - /// Master - transmit - public static let MasterTx = Self(rawValue: 0x2) - - /// Master - receive - public static let MasterRx = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension SPI1.I2SCFGR { - public struct PCMSYNCValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Short frame synchronisation - public static let Short = Self(rawValue: 0x0) - - /// Long frame synchronisation - public static let Long = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension SPI1.I2SCFGR { - public struct I2SSTDValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// I2S Philips standard - public static let Philips = Self(rawValue: 0x0) - - /// MSB justified standard - public static let MSB = Self(rawValue: 0x1) - - /// LSB justified standard - public static let LSB = Self(rawValue: 0x2) - - /// PCM standard - public static let PCM = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension SPI1.I2SCFGR { - public struct CKPOLValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// I2S clock inactive state is low level - public static let IdleLow = Self(rawValue: 0x0) - - /// I2S clock inactive state is high level - public static let IdleHigh = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension SPI1.I2SCFGR { - public struct DATLENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// 16-bit data length - public static let SixteenBit = Self(rawValue: 0x0) - - /// 24-bit data length - public static let TwentyFourBit = Self(rawValue: 0x1) - - /// 32-bit data length - public static let ThirtyTwoBit = Self(rawValue: 0x2) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension SPI1.I2SCFGR { - public struct CHLENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// 16-bit wide - public static let SixteenBit = Self(rawValue: 0x0) - - /// 32-bit wide - public static let ThirtyTwoBit = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension SPI1.I2SPR { - public struct MCKOEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Master clock output is disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Master clock output is enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension SPI1.I2SPR { - public struct ODDValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Real divider value is I2SDIV * 2 - public static let Even = Self(rawValue: 0x0) - - /// Real divider value is (I2SDIV * 2) + 1 - public static let Odd = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} diff --git a/stm32-neopixel/Sources/STM32F7X6/SPI2.swift b/stm32-neopixel/Sources/STM32F7X6/SPI2.swift deleted file mode 100644 index a653238f..00000000 --- a/stm32-neopixel/Sources/STM32F7X6/SPI2.swift +++ /dev/null @@ -1,7 +0,0 @@ -// Generated by svd2swift. - -import MMIO - -/// Serial peripheral interface -public typealias SPI2 = SPI1 - diff --git a/stm32-neopixel/Sources/STM32F7X6/USART1.swift b/stm32-neopixel/Sources/STM32F7X6/USART1.swift deleted file mode 100644 index 508d05a1..00000000 --- a/stm32-neopixel/Sources/STM32F7X6/USART1.swift +++ /dev/null @@ -1,1554 +0,0 @@ -// Generated by svd2swift. - -import MMIO - -/// Universal synchronous asynchronous receiver transmitter -@RegisterBlock -public struct USART1 { - /// Control register 1 - @RegisterBlock(offset: 0x0) - public var cr1: Register - - /// Control register 2 - @RegisterBlock(offset: 0x4) - public var cr2: Register - - /// Control register 3 - @RegisterBlock(offset: 0x8) - public var cr3: Register - - /// Baud rate register - @RegisterBlock(offset: 0xc) - public var brr: Register - - /// Guard time and prescaler register - @RegisterBlock(offset: 0x10) - public var gtpr: Register - - /// Receiver timeout register - @RegisterBlock(offset: 0x14) - public var rtor: Register - - /// Request register - @RegisterBlock(offset: 0x18) - public var rqr: Register - - /// Interrupt & status register - @RegisterBlock(offset: 0x1c) - public var isr: Register - - /// Interrupt flag clear register - @RegisterBlock(offset: 0x20) - public var icr: Register - - /// Receive data register - @RegisterBlock(offset: 0x24) - public var rdr: Register - - /// Transmit data register - @RegisterBlock(offset: 0x28) - public var tdr: Register -} - -extension USART1 { - /// Control register 1 - @Register(bitWidth: 32) - public struct CR1 { - /// Word length - @ReadWrite(bits: 28..<29, as: M1Values.self) - public var m1: M1 - - /// End of Block interrupt enable - @ReadWrite(bits: 27..<28, as: EOBIEValues.self) - public var eobie: EOBIE - - /// Receiver timeout interrupt enable - @ReadWrite(bits: 26..<27, as: RTOIEValues.self) - public var rtoie: RTOIE - - /// Oversampling mode - @ReadWrite(bits: 15..<16, as: OVER8Values.self) - public var over8: OVER8 - - /// Character match interrupt enable - @ReadWrite(bits: 14..<15, as: CMIEValues.self) - public var cmie: CMIE - - /// Mute mode enable - @ReadWrite(bits: 13..<14, as: MMEValues.self) - public var mme: MME - - /// Word length - @ReadWrite(bits: 12..<13, as: M0Values.self) - public var m0: M0 - - /// Receiver wakeup method - @ReadWrite(bits: 11..<12, as: WAKEValues.self) - public var wake: WAKE - - /// Parity control enable - @ReadWrite(bits: 10..<11, as: PCEValues.self) - public var pce: PCE - - /// Parity selection - @ReadWrite(bits: 9..<10, as: PSValues.self) - public var ps: PS - - /// PE interrupt enable - @ReadWrite(bits: 8..<9, as: PEIEValues.self) - public var peie: PEIE - - /// interrupt enable - @ReadWrite(bits: 7..<8, as: TXEIEValues.self) - public var txeie: TXEIE - - /// Transmission complete interrupt enable - @ReadWrite(bits: 6..<7, as: TCIEValues.self) - public var tcie: TCIE - - /// RXNE interrupt enable - @ReadWrite(bits: 5..<6, as: RXNEIEValues.self) - public var rxneie: RXNEIE - - /// IDLE interrupt enable - @ReadWrite(bits: 4..<5, as: IDLEIEValues.self) - public var idleie: IDLEIE - - /// Transmitter enable - @ReadWrite(bits: 3..<4, as: TEValues.self) - public var te: TE - - /// Receiver enable - @ReadWrite(bits: 2..<3, as: REValues.self) - public var re: RE - - /// USART enable in Stop mode - @ReadWrite(bits: 1..<2, as: UESMValues.self) - public var uesm: UESM - - /// USART enable - @ReadWrite(bits: 0..<1, as: UEValues.self) - public var ue: UE - - /// Driver Enable assertion time - @ReadWrite(bits: 21..<26) - public var deat: DEAT - - /// Driver Enable de-assertion time - @ReadWrite(bits: 16..<21) - public var dedt: DEDT - } - - /// Control register 2 - @Register(bitWidth: 32) - public struct CR2 { - /// Receiver timeout enable - @ReadWrite(bits: 23..<24, as: RTOENValues.self) - public var rtoen: RTOEN - - /// Auto baud rate enable - @ReadWrite(bits: 20..<21, as: ABRENValues.self) - public var abren: ABREN - - /// Most significant bit first - @ReadWrite(bits: 19..<20, as: MSBFIRSTValues.self) - public var msbfirst: MSBFIRST - - /// Binary data inversion - @ReadWrite(bits: 18..<19, as: DATAINVValues.self) - public var datainv: DATAINV - - /// TX pin active level inversion - @ReadWrite(bits: 17..<18, as: TXINVValues.self) - public var txinv: TXINV - - /// RX pin active level inversion - @ReadWrite(bits: 16..<17, as: RXINVValues.self) - public var rxinv: RXINV - - /// Swap TX/RX pins - @ReadWrite(bits: 15..<16, as: SWAPValues.self) - public var swap: SWAP - - /// LIN mode enable - @ReadWrite(bits: 14..<15, as: LINENValues.self) - public var linen: LINEN - - /// STOP bits - @ReadWrite(bits: 12..<14, as: STOPValues.self) - public var stop: STOP - - /// Clock enable - @ReadWrite(bits: 11..<12, as: CLKENValues.self) - public var clken: CLKEN - - /// Clock polarity - @ReadWrite(bits: 10..<11, as: CPOLValues.self) - public var cpol: CPOL - - /// Clock phase - @ReadWrite(bits: 9..<10, as: CPHAValues.self) - public var cpha: CPHA - - /// Last bit clock pulse - @ReadWrite(bits: 8..<9, as: LBCLValues.self) - public var lbcl: LBCL - - /// LIN break detection interrupt enable - @ReadWrite(bits: 6..<7, as: LBDIEValues.self) - public var lbdie: LBDIE - - /// LIN break detection length - @ReadWrite(bits: 5..<6, as: LBDLValues.self) - public var lbdl: LBDL - - /// 7-bit Address Detection/4-bit Address Detection - @ReadWrite(bits: 4..<5, as: ADDM7Values.self) - public var addm7: ADDM7 - - /// Auto baud rate mode - @ReadWrite(bits: 21..<23, as: ABRMODValues.self) - public var abrmod: ABRMOD - - /// Address of the USART node - @ReadWrite(bits: 24..<32) - public var add: ADD - } - - /// Control register 3 - @Register(bitWidth: 32) - public struct CR3 { - /// Wakeup from Stop mode interrupt enable - @ReadWrite(bits: 22..<23, as: WUFIEValues.self) - public var wufie: WUFIE - - /// Wakeup from Stop mode interrupt flag selection - @ReadWrite(bits: 20..<22, as: WUSValues.self) - public var wus: WUS - - /// Smartcard auto-retry count - @ReadWrite(bits: 17..<20) - public var scarcnt: SCARCNT - - /// Driver enable polarity selection - @ReadWrite(bits: 15..<16, as: DEPValues.self) - public var dep: DEP - - /// Driver enable mode - @ReadWrite(bits: 14..<15, as: DEMValues.self) - public var dem: DEM - - /// DMA Disable on Reception Error - @ReadWrite(bits: 13..<14, as: DDREValues.self) - public var ddre: DDRE - - /// Overrun Disable - @ReadWrite(bits: 12..<13, as: OVRDISValues.self) - public var ovrdis: OVRDIS - - /// One sample bit method enable - @ReadWrite(bits: 11..<12, as: ONEBITValues.self) - public var onebit: ONEBIT - - /// CTS interrupt enable - @ReadWrite(bits: 10..<11, as: CTSIEValues.self) - public var ctsie: CTSIE - - /// CTS enable - @ReadWrite(bits: 9..<10, as: CTSEValues.self) - public var ctse: CTSE - - /// RTS enable - @ReadWrite(bits: 8..<9, as: RTSEValues.self) - public var rtse: RTSE - - /// DMA enable transmitter - @ReadWrite(bits: 7..<8, as: DMATValues.self) - public var dmat: DMAT - - /// DMA enable receiver - @ReadWrite(bits: 6..<7, as: DMARValues.self) - public var dmar: DMAR - - /// Smartcard mode enable - @ReadWrite(bits: 5..<6, as: SCENValues.self) - public var scen: SCEN - - /// Smartcard NACK enable - @ReadWrite(bits: 4..<5, as: NACKValues.self) - public var nack: NACK - - /// Half-duplex selection - @ReadWrite(bits: 3..<4, as: HDSELValues.self) - public var hdsel: HDSEL - - /// Ir low-power - @ReadWrite(bits: 2..<3, as: IRLPValues.self) - public var irlp: IRLP - - /// Ir mode enable - @ReadWrite(bits: 1..<2, as: IRENValues.self) - public var iren: IREN - - /// Error interrupt enable - @ReadWrite(bits: 0..<1, as: EIEValues.self) - public var eie: EIE - } - - /// Baud rate register - @Register(bitWidth: 32) - public struct BRR { - /// DIV_Mantissa - @ReadWrite(bits: 0..<16) - public var brr_field: BRR_FIELD - } - - /// Guard time and prescaler register - @Register(bitWidth: 32) - public struct GTPR { - /// Guard time value - @ReadWrite(bits: 8..<16) - public var gt: GT - - /// Prescaler value - @ReadWrite(bits: 0..<8) - public var psc: PSC - } - - /// Receiver timeout register - @Register(bitWidth: 32) - public struct RTOR { - /// Block Length - @ReadWrite(bits: 24..<32) - public var blen: BLEN - - /// Receiver timeout value - @ReadWrite(bits: 0..<24) - public var rto: RTO - } - - /// Request register - @Register(bitWidth: 32) - public struct RQR { - /// Transmit data flush request - @WriteOnly(bits: 4..<5) - public var txfrq: TXFRQ - - /// Receive data flush request - @WriteOnly(bits: 3..<4) - public var rxfrq: RXFRQ - - /// Mute mode request - @WriteOnly(bits: 2..<3) - public var mmrq: MMRQ - - /// Send break request - @WriteOnly(bits: 1..<2) - public var sbkrq: SBKRQ - - /// Auto baud rate request - @WriteOnly(bits: 0..<1) - public var abrrq: ABRRQ - } - - /// Interrupt & status register - @Register(bitWidth: 32) - public struct ISR { - /// REACK - @ReadOnly(bits: 22..<23) - public var reack: REACK - - /// TEACK - @ReadOnly(bits: 21..<22) - public var teack: TEACK - - /// WUF - @ReadOnly(bits: 20..<21) - public var wuf: WUF - - /// RWU - @ReadOnly(bits: 19..<20) - public var rwu: RWU - - /// SBKF - @ReadOnly(bits: 18..<19) - public var sbkf: SBKF - - /// CMF - @ReadOnly(bits: 17..<18) - public var cmf: CMF - - /// BUSY - @ReadOnly(bits: 16..<17) - public var busy: BUSY - - /// ABRF - @ReadOnly(bits: 15..<16) - public var abrf: ABRF - - /// ABRE - @ReadOnly(bits: 14..<15) - public var abre: ABRE - - /// EOBF - @ReadOnly(bits: 12..<13) - public var eobf: EOBF - - /// RTOF - @ReadOnly(bits: 11..<12) - public var rtof: RTOF - - /// CTS - @ReadOnly(bits: 10..<11) - public var cts: CTS - - /// CTSIF - @ReadOnly(bits: 9..<10) - public var ctsif: CTSIF - - /// LBDF - @ReadOnly(bits: 8..<9) - public var lbdf: LBDF - - /// TXE - @ReadOnly(bits: 7..<8) - public var txe: TXE - - /// TC - @ReadOnly(bits: 6..<7) - public var tc: TC - - /// RXNE - @ReadOnly(bits: 5..<6) - public var rxne: RXNE - - /// IDLE - @ReadOnly(bits: 4..<5) - public var idle: IDLE - - /// ORE - @ReadOnly(bits: 3..<4) - public var ore: ORE - - /// NF - @ReadOnly(bits: 2..<3) - public var nf: NF - - /// FE - @ReadOnly(bits: 1..<2) - public var fe: FE - - /// PE - @ReadOnly(bits: 0..<1) - public var pe: PE - } - - /// Interrupt flag clear register - @Register(bitWidth: 32) - public struct ICR { - /// Wakeup from Stop mode clear flag - @WriteOnly(bits: 20..<21) - public var wucf: WUCF - - /// Character match clear flag - @WriteOnly(bits: 17..<18) - public var cmcf: CMCF - - /// End of block clear flag - @WriteOnly(bits: 12..<13) - public var eobcf: EOBCF - - /// Receiver timeout clear flag - @WriteOnly(bits: 11..<12) - public var rtocf: RTOCF - - /// CTS clear flag - @WriteOnly(bits: 9..<10) - public var ctscf: CTSCF - - /// LIN break detection clear flag - @WriteOnly(bits: 8..<9) - public var lbdcf: LBDCF - - /// Transmission complete clear flag - @WriteOnly(bits: 6..<7) - public var tccf: TCCF - - /// Idle line detected clear flag - @WriteOnly(bits: 4..<5) - public var idlecf: IDLECF - - /// Overrun error clear flag - @WriteOnly(bits: 3..<4) - public var orecf: ORECF - - /// Noise detected clear flag - @WriteOnly(bits: 2..<3) - public var ncf: NCF - - /// Framing error clear flag - @WriteOnly(bits: 1..<2) - public var fecf: FECF - - /// Parity error clear flag - @WriteOnly(bits: 0..<1) - public var pecf: PECF - } - - /// Receive data register - @Register(bitWidth: 32) - public struct RDR { - /// Receive data value - @ReadOnly(bits: 0..<9) - public var rdr_field: RDR_FIELD - } - - /// Transmit data register - @Register(bitWidth: 32) - public struct TDR { - /// Transmit data value - @ReadWrite(bits: 0..<9) - public var tdr_field: TDR_FIELD - } -} - -extension USART1.CR1 { - public struct M1Values: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Use M0 to set the data bits - public static let M0 = Self(rawValue: 0x0) - - /// 1 start bit, 7 data bits, n stop bits - public static let Bit7 = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR1 { - public struct EOBIEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Interrupt is inhibited - public static let Disabled = Self(rawValue: 0x0) - - /// A USART interrupt is generated when the EOBF flag is set in the ISR register - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR1 { - public struct RTOIEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Interrupt is inhibited - public static let Disabled = Self(rawValue: 0x0) - - /// An USART interrupt is generated when the RTOF bit is set in the ISR register - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR1 { - public struct OVER8Values: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Oversampling by 16 - public static let Oversampling16 = Self(rawValue: 0x0) - - /// Oversampling by 8 - public static let Oversampling8 = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR1 { - public struct CMIEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Interrupt is disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Interrupt is generated when the CMF bit is set in the ISR register - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR1 { - public struct MMEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Receiver in active mode permanently - public static let Disabled = Self(rawValue: 0x0) - - /// Receiver can switch between mute mode and active mode - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR1 { - public struct M0Values: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// 1 start bit, 8 data bits, n stop bits - public static let Bit8 = Self(rawValue: 0x0) - - /// 1 start bit, 9 data bits, n stop bits - public static let Bit9 = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR1 { - public struct WAKEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Idle line - public static let Idle = Self(rawValue: 0x0) - - /// Address mask - public static let Address = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR1 { - public struct PCEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Parity control disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Parity control enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR1 { - public struct PSValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Even parity - public static let Even = Self(rawValue: 0x0) - - /// Odd parity - public static let Odd = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR1 { - public struct PEIEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Interrupt is disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Interrupt is generated whenever PE=1 in the ISR register - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR1 { - public struct TXEIEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Interrupt is disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Interrupt is generated whenever TXE=1 in the ISR register - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR1 { - public struct TCIEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Interrupt is disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Interrupt is generated whenever TC=1 in the ISR register - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR1 { - public struct RXNEIEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Interrupt is disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Interrupt is generated whenever ORE=1 or RXNE=1 in the ISR register - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR1 { - public struct IDLEIEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Interrupt is disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Interrupt is generated whenever IDLE=1 in the ISR register - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR1 { - public struct TEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Transmitter is disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Transmitter is enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR1 { - public struct REValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Receiver is disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Receiver is enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR1 { - public struct UESMValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// USART not able to wake up the MCU from Stop mode - public static let Disabled = Self(rawValue: 0x0) - - /// USART able to wake up the MCU from Stop mode - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR1 { - public struct UEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// UART is disabled - public static let Disabled = Self(rawValue: 0x0) - - /// UART is enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR2 { - public struct RTOENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Receiver timeout feature disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Receiver timeout feature enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR2 { - public struct ABRENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Auto baud rate detection is disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Auto baud rate detection is enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR2 { - public struct MSBFIRSTValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// data is transmitted/received with data bit 0 first, following the start bit - public static let LSB = Self(rawValue: 0x0) - - /// data is transmitted/received with MSB (bit 7/8/9) first, following the start bit - public static let MSB = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR2 { - public struct DATAINVValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Logical data from the data register are send/received in positive/direct logic - public static let Positive = Self(rawValue: 0x0) - - /// Logical data from the data register are send/received in negative/inverse logic - public static let Negative = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR2 { - public struct TXINVValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// TX pin signal works using the standard logic levels - public static let Standard = Self(rawValue: 0x0) - - /// TX pin signal values are inverted - public static let Inverted = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR2 { - public struct RXINVValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// RX pin signal works using the standard logic levels - public static let Standard = Self(rawValue: 0x0) - - /// RX pin signal values are inverted - public static let Inverted = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR2 { - public struct SWAPValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// TX/RX pins are used as defined in standard pinout - public static let Standard = Self(rawValue: 0x0) - - /// The TX and RX pins functions are swapped - public static let Swapped = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR2 { - public struct LINENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// LIN mode disabled - public static let Disabled = Self(rawValue: 0x0) - - /// LIN mode enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR2 { - public struct STOPValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// 1 stop bit - public static let Stop1 = Self(rawValue: 0x0) - - /// 0.5 stop bit - public static let Stop0p5 = Self(rawValue: 0x1) - - /// 2 stop bit - public static let Stop2 = Self(rawValue: 0x2) - - /// 1.5 stop bit - public static let Stop1p5 = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR2 { - public struct CLKENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// CK pin disabled - public static let Disabled = Self(rawValue: 0x0) - - /// CK pin enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR2 { - public struct CPOLValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Steady low value on CK pin outside transmission window - public static let Low = Self(rawValue: 0x0) - - /// Steady high value on CK pin outside transmission window - public static let High = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR2 { - public struct CPHAValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// The first clock transition is the first data capture edge - public static let First = Self(rawValue: 0x0) - - /// The second clock transition is the first data capture edge - public static let Second = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR2 { - public struct LBCLValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// The clock pulse of the last data bit is not output to the CK pin - public static let NotOutput = Self(rawValue: 0x0) - - /// The clock pulse of the last data bit is output to the CK pin - public static let Output = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR2 { - public struct LBDIEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Interrupt is inhibited - public static let Disabled = Self(rawValue: 0x0) - - /// An interrupt is generated whenever LBDF=1 in the ISR register - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR2 { - public struct LBDLValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// 10-bit break detection - public static let Bit10 = Self(rawValue: 0x0) - - /// 11-bit break detection - public static let Bit11 = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR2 { - public struct ADDM7Values: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// 4-bit address detection - public static let Bit4 = Self(rawValue: 0x0) - - /// 7-bit address detection - public static let Bit7 = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR2 { - public struct ABRMODValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// Measurement of the start bit is used to detect the baud rate - public static let Start = Self(rawValue: 0x0) - - /// Falling edge to falling edge measurement - public static let Edge = Self(rawValue: 0x1) - - /// 0x7F frame detection - public static let Frame7F = Self(rawValue: 0x2) - - /// 0x55 frame detection - public static let Frame55 = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR3 { - public struct WUFIEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Interrupt is inhibited - public static let Disabled = Self(rawValue: 0x0) - - /// An USART interrupt is generated whenever WUF=1 in the ISR register - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR3 { - public struct WUSValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// WUF active on address match - public static let Address = Self(rawValue: 0x0) - - /// WuF active on Start bit detection - public static let Start = Self(rawValue: 0x2) - - /// WUF active on RXNE - public static let RXNE = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR3 { - public struct DEPValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// DE signal is active high - public static let High = Self(rawValue: 0x0) - - /// DE signal is active low - public static let Low = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR3 { - public struct DEMValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// DE function is disabled - public static let Disabled = Self(rawValue: 0x0) - - /// The DE signal is output on the RTS pin - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR3 { - public struct DDREValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// DMA is not disabled in case of reception error - public static let NotDisabled = Self(rawValue: 0x0) - - /// DMA is disabled following a reception error - public static let Disabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR3 { - public struct OVRDISValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Overrun Error Flag, ORE, is set when received data is not read before receiving new data - public static let Enabled = Self(rawValue: 0x0) - - /// Overrun functionality is disabled. If new data is received while the RXNE flag is still set the ORE flag is not set and the new received data overwrites the previous content of the RDR register - public static let Disabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR3 { - public struct ONEBITValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Three sample bit method - public static let Sample3 = Self(rawValue: 0x0) - - /// One sample bit method - public static let Sample1 = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR3 { - public struct CTSIEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Interrupt is inhibited - public static let Disabled = Self(rawValue: 0x0) - - /// An interrupt is generated whenever CTSIF=1 in the ISR register - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR3 { - public struct CTSEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// CTS hardware flow control disabled - public static let Disabled = Self(rawValue: 0x0) - - /// CTS mode enabled, data is only transmitted when the CTS input is asserted - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR3 { - public struct RTSEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// RTS hardware flow control disabled - public static let Disabled = Self(rawValue: 0x0) - - /// RTS output enabled, data is only requested when there is space in the receive buffer - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR3 { - public struct DMATValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// DMA mode is disabled for transmission - public static let Disabled = Self(rawValue: 0x0) - - /// DMA mode is enabled for transmission - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR3 { - public struct DMARValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// DMA mode is disabled for reception - public static let Disabled = Self(rawValue: 0x0) - - /// DMA mode is enabled for reception - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR3 { - public struct SCENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Smartcard Mode disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Smartcard Mode enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR3 { - public struct NACKValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// NACK transmission in case of parity error is disabled - public static let Disabled = Self(rawValue: 0x0) - - /// NACK transmission during parity error is enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR3 { - public struct HDSELValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Half duplex mode is not selected - public static let NotSelected = Self(rawValue: 0x0) - - /// Half duplex mode is selected - public static let Selected = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR3 { - public struct IRLPValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Normal mode - public static let Normal = Self(rawValue: 0x0) - - /// Low-power mode - public static let LowPower = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR3 { - public struct IRENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// IrDA disabled - public static let Disabled = Self(rawValue: 0x0) - - /// IrDA enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR3 { - public struct EIEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Interrupt is inhibited - public static let Disabled = Self(rawValue: 0x0) - - /// An interrupt is generated when FE=1 or ORE=1 or NF=1 in the ISR register - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} diff --git a/stm32-neopixel/Sources/STM32F7X6/stm32f7x6.patched.svd b/stm32-neopixel/Sources/STM32F7X6/stm32f7x6.patched.svd deleted file mode 120000 index a6442b50..00000000 --- a/stm32-neopixel/Sources/STM32F7X6/stm32f7x6.patched.svd +++ /dev/null @@ -1 +0,0 @@ -../../../Tools/SVDs/stm32f7x6.patched.svd \ No newline at end of file diff --git a/stm32-neopixel/Sources/STM32F7X6/svd2swift.json b/stm32-neopixel/Sources/STM32F7X6/svd2swift.json deleted file mode 100644 index cfe41520..00000000 --- a/stm32-neopixel/Sources/STM32F7X6/svd2swift.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "peripherals": [ - "DMA1", - "DMA2", - "GPIOA", - "GPIOB", - "GPIOI", - "RCC", - "SPI1", - "SPI2", - "USART1" - ], - "access-level": "public" -} diff --git a/stm32-neopixel/Sources/Support/Support.c b/stm32-neopixel/Sources/Support/Support.c deleted file mode 100644 index ec20d61c..00000000 --- a/stm32-neopixel/Sources/Support/Support.c +++ /dev/null @@ -1,96 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2024 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -#if defined(__arm__) - -#include -#include - -#define HEAP_SIZE (2 * 1024) - -__attribute__((aligned(8))) -__attribute__((section("__DATA,__heap"))) -char heap[HEAP_SIZE] = {}; -size_t next_heap_index = 0; - -void *calloc(size_t count, size_t size) { - if (next_heap_index + count * size > HEAP_SIZE) __builtin_trap(); - void *p = &heap[next_heap_index]; - next_heap_index += count * size; - return p; -} - -int posix_memalign(void **memptr, size_t alignment, size_t size) { - *memptr = calloc(size + alignment, 1); - if (((uintptr_t)*memptr) % alignment == 0) return 0; - *(uintptr_t *)memptr += alignment - ((uintptr_t)*memptr % alignment); - return 0; -} - -void free(void *ptr) { - __builtin_trap(); - // never free -} - -void *memset(void *b, int c, size_t len) { - for (int i = 0; i < len; i++) { - ((char *)b)[i] = c; - } - return b; -} - -void *memcpy(void *restrict dst, const void *restrict src, size_t n) { - for (int i = 0; i < n; i++) { - ((char *)dst)[i] = ((char *)src)[i]; - } - return dst; -} - -void enableFaults() { - uint32_t* shcsr = (uint32_t*)0xE000ED24; - // Read SHCSR. - // Set bits 16-18 to enable Memory, Bus, and Usage faults. - // Write back the modified value to the SHCSR. - *shcsr |= 0x7 << 16; -} - -void enableFPU() { - uint32_t* cpacr = (uint32_t*)0xE000ED88; - // Read CPACR. - // Set bits 20-23 to enable CP10 and CP11 coprocessors. - // Write back the modified value to the CPACR. - *cpacr |= 0xF << 20; - // Wait for the coprocessors to become active. - asm volatile("dsb"); - asm volatile("isb"); -} - -extern void reset(void); - -void interrupt(void) { - while (1) {} -} - -__attribute((used)) __attribute((section("__VECTORS,__text"))) -void *vector_table[114] = { - (void *)0x2000fffc, // initial SP - (void *)((uintptr_t)reset - (0x20010000 - 0x08000000)), // Reset - - (void *)((uintptr_t)interrupt - (0x20010000 - 0x08000000)), // NMI - (void *)((uintptr_t)interrupt - (0x20010000 - 0x08000000)), // HardFault - (void *)((uintptr_t)interrupt - (0x20010000 - 0x08000000)), // MemManage - (void *)((uintptr_t)interrupt - (0x20010000 - 0x08000000)), // BusFault - (void *)((uintptr_t)interrupt - (0x20010000 - 0x08000000)), // UsageFault - - 0 // NULL for all the other handlers -}; - -#endif diff --git a/stm32-neopixel/Sources/Support/include/Support.h b/stm32-neopixel/Sources/Support/include/Support.h deleted file mode 100644 index 310665b0..00000000 --- a/stm32-neopixel/Sources/Support/include/Support.h +++ /dev/null @@ -1,15 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2024 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -#pragma once - -void enableFaults(); -void enableFPU(); diff --git a/stm32-neopixel/Sources/Support/startup.S b/stm32-neopixel/Sources/Support/startup.S deleted file mode 100644 index 6e8c7c27..00000000 --- a/stm32-neopixel/Sources/Support/startup.S +++ /dev/null @@ -1,45 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2023 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - - .extern _memcpy - .extern _main - - .text - .thumb - .section __TEXT,__text,regular,pure_instructions - .syntax unified - -// reset handler, main entry point - .balign 4 - .global _reset - .thumb_func -_reset: - ldr r0, =0x20010000 // dst - ldr r1, =0x08000000 // src - ldr r2, =segment$start$__VECTORS - ldr r3, =segment$end$__DATA - subs r2, r3, r2 // size = segment$end$__DATA - segment$start$__TEXT - - // memcpy (r0: dst = 0x20010000, r1: src = 0x08000000, r2: size = ...) - // Relocate ourselves: copy the entire image (VECTORS, TEXT, DATA segments) - // from flash memory (non-writable) to RAM (writable), so that globals can be - // written to. - bl _memcpy - - // Cannot jump to main normally, because that would call main using a relative - // offset, which would result in a call to the pre-relocation address. - // Loading address of main into a register will give us the post-relocation - // address. - ldr r0, =_main - blx r0 - - // Loop forever if main returns. - b . diff --git a/stm32-neopixel/schematic.png b/stm32-neopixel/schematic.png deleted file mode 100644 index d385f7803127294638807a261d5bdf868424d095..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 168913 zcmeFZWmuG3`v(dbw4hQ72o_3%NT(v9%cmlL`*hF zlmGJkl`A-;F@4@qB+l4(lWhiN>-TpKj#O1jg*b7sZqtlC&WV2GzsmWzY6ef@0+!;| z^AVR95BNTh;AOseiE}#D)s{n`b*y!TvFe z$fFHAq|MjnxAHR_;uMT>WK=KAKC;c~N;>7mo%xz<(A_#CzpwD*-CYiocl?GX<9F=` zt3R(-#Ux+tj;q}<{W>A7(b?U4@jybZ@V1~*0<%Q@V_7cH-8bs*&R;J{UDH_KJ!9T! z*B#dqP8@GyC#kX;LZWO<`SAMG*2ZaU5iZxmsVdVKM_ufRHxbMagU`L)X-`N`yrth- zPuA38IkE0>XyRcwiMszHTqufzOM4mCLi7^eQ1;h))rCp_xIt<*?|`|*q*e2?e~ICI zd`h@WPu=m9{e6QN-W_b}Nf{T{*DnI12Wvgfi*n1|H=@54DrJPv2Prf==X5R%OEwOk z-ak(3xGr?RCzA_OOpN71Lq|s^%4tMcj$Jc$1M4{}7f-N1)@>4O+r1l7OwI8H$+y_3 zCWDhs_dKQOz-_F-8NkB*Ml|fhyL###J<$W-(|LHdVwb<*T+2Jnaw_xQ`P?4cslji(7b-K^G2Ur zgM`P|w9X+K8@H}=^*$eYyAR>F`!3hD@%umHepB0}@gS}~)$%QB^)^8gnWD~nj=TUjCNyjt;^uweqmd^x4c(~m9~wJ;-`GKE$ z4fQwLRn+c-N-XGEJs(84XejgrU2XXJxA>n<^WLZOk@<4#?S*Yp0la>EUq8nSg*mk|2lRJb{P5DnSH6AQ>C;CbI`a`s*xd*)E*dZ;M_P zg*!w#ByNVuGQ_^B`ugHAzU%ceACCm2AM)X=_hy-2lqQ*SRI=2pR4dbWwO%AW&Zt+^ z`lynmlI)-|SKh^J{H!46j&e+P<^3|Pz0xO%>uCfM4Z1gFZ^{_^HhV=dGr?5tGE6eO zGPHZ|_l{)DsN&wf9mMJXa7?jJX1=PF#k2)Wu|x5NVqXhki|g|l^Y%SPy&FB5 zy$b0qX}2>jMM$)Lj8qC&Tv39W&6;!Eb-BF2{qC-{g-1_M=VsreIfW&UjESW20F|m(jzJ56^<2-Qd^r_ zIGcWM@U8ZRs;<;|_l4AjsD;EnI-Vpdm&>cf&BX0gl}YK{R7J8{Hi4zcD@b5dOP zg?xpMCSVg-8+V)L^qJ|<>2Q`W6uK1r6pj=ntoe}+EkrHxk-S;@%(pV{W?Ez}^yL*7 zawFVQ9amUdS^71fX*w3}TS@Z}#cIb&#(IG=z|WU1!+GHSg>ojh+DC;dEVrEnZ&k=v z2s@E1sV@00_76A@Kppd*eB)CQ9Co@PxG$LFVCC$=)#P^0ragy$C+@cVMqD4iqkyNq zlN|*=FF#2|bm@(-z3JZeN7V6CNgrx;Ix6RSoDm>MB%)R+WvqR|QfrRxEf7HL#|DZyj#!ofUJv?B!Tj-O-rRz@~7ly9S{!EMgsVSZN6b4pd%l-mN~eH(wI%4Si_vteXa9` ztde#Y>SOLAhZC*)-I$2V>#lxvlU5UzlWz7cWpzR%x|eKjH(XC)nR3mLnvd)myPI1S zRHW{~01Y}~5ay_2I5d*fXsixdYb|Y^X7Nx{>a+97pcl8j3KA7$uTVE*Wx3G&WcUeW zI^_8?3HOGVF3F`j?*oXWN0bQXNV-tku;KY(1sTIAnl|OH7bhKOKvTIeI;K_jU1LT! zMpN^dJ9WmHQCsY$EV(+^+0we5WnC`DW6hscu`}n@FRGhnp&Ua;-W71K^fzWN-R@!5 zR^?k2uOSJQ2$FdJzS?nl!NTjo(U+rq)2fO6r3EOZeQ<8%K!nO$kCB=|+pSv%iA>&? z5zz(tsXb*5{S1o?pFdT^R`K*lrN1SAOKcTWl2RO}rmKzeS{Tn(XPQ>&vAS;k#`=wF zfC|Khcd*+0pg*H1L$Ft*w@uK&ISa97cguOEO=q;?oyDfbBa3Qe>(QPrSPX0#uc^~u zy|_F)0^6=%p4<0F$<*mCRo!%lE?r!F(<{}dXJ%_|HjrBZEjn-gmggLuhV8e;dkEhp zIUc#>m+--nYxX&85_Olr5*O1 zyW>+bsHk>l&hmEc?NX2RAb7-t`kXpEhhNWf$!XqtuXnCL^2$s?-vV1d+@^GNb~YaF zzW=Ge&A!CLMyI^3+;d5OHh#2%(|Ki!b@t83#HhQM=mshlw~VCmN{*YKs|r$M&#vL( z$Sp^xCaRCcJ~DoOXKBUj^48`Umg%>tm2m|09EHer(M+m4R2DAFtH{Z`qt#H#4Lzc2 zvT7Q4)y=?WIze4frO0;bPU6V*wd=k%4{RC{)-I`A)`$cC6+x*wsYH)2`yAW(yKnkZ z_hFkb9lh~tqEObopaZSFwsla`&bO8D#=^!Xf2;HEPsqfs63Rcs{P|A3m*^CYr%In;Gfb1DEp~@O35E(|Bbr+QTE@c+aG2BZpHrvC4Z3pzZmizoc|#E zud)6QvVYf*|MFIU!kGVJ$ag6I6UO`|YW@?({0U>Qu>ZvDzfKhYB&ff^(?1F7Z}9X_ zg8Cag{Zozk9*g`}7WDsjHD>nyx2K}jX+=E)vu4p|G$U2cHUnF0Evav1W{OcFDIIV0 zOq3wANG5L?Fk?nx7IZEyV_)FSe$dby@2_=!Ru3rqp=bqJZ~d6Y__&hs?JljfKC_gF zVj*;ED6m8vC9l50E%A?K)25Rb+1HdvHHD72^@rD)t6SrlCc50;MY`s)vGVHSy3MV) zCLSr3E^iB#FE4PBXrAZMd17Y}^;$}3;A>7Ej_8G7<^^JUgm{pxtyOa&3>|EZs#%xJ z16S%xLgf4Pj;3<`*pVwoZ~TW0#WJmelOa^o88Xi^qfnnXw1`$6yZaGG3Q!6jp# zL-dB})wKjj>HiYi|G5iKR{DXy{<_pP44CB5!!g%v4HS8zsnMn3Rs?7DuS&QBxnXs< zic6^A?%?6fw>~aYV6@{kdw4Zc=gU$87+$wAy7M`UHeYyTy9Dk-{JmqB1dpw59#sDX!PETa{E@T89ZcCiiky zj=omZ&Xc#K>g-s?R#UbgF7}RP6*mP~>K>JwH<@mTvo9scxf_a(@8#3wi)MpF?mEL# zyw#}2W%^->AT_<}5YHcX`H$D6q5+iP^CcN!j5?tY+v#)GER2^+_%?=QA-Xt*=_q-F z+@eL3K_Zj%1YHsLIU5U@Ue$8(n7Vp43(-VG@y#|xb%=)2L29+IvexZ}K~;2e&H620Fx;I8GR4l@r*X}GZT5Yh^;EO%*Gs9!W0}ac zA_UuFL|9wzlh~?FURLsVLv*4QOO{@jI^QSh5@eIp2KRq;N6TwmVJy$NQn23mVN3g0 zf<2OxoiP?fZ=dSJ#fVee|HBVJLB($Q=$h)v%s6I~dYY&pMbZ?XbZTWvNl@vEP+p9#Gz=**C=h(URQtZEsZj z+QVNd05*>AE&2f-7o!X*3^nYKOo~cU&&rvtq(WUbrwK01PMI(+3`()>88uK{L&PLT9~!Qe&B2Uv`w- zK&7Yq+`)_c zYv52FHpI&u>2uSy9K74DvA|-Su1#P%6`q=;Zi&Sb&(#fk@#2Nmr{Y5j_5`8gw2^$+ z(mpke|DgV2?SYmJUSUF3l{oc&*Z5Xv_(oP)P%N>_ej#e+>i7$Yvj5=aA_y+<1dy6W?5XWrbnU zak3%macatxv~q_fq~+zO>c(cHw51oq?pm?Dd%|v$tZs8QLPvo1Fo$rPWWZ6cS{N4E zS3X{vS9-~w&^>hIu~(WXH11_tp+u+bnI97RYxi(gT`Ui5+oT5jG2`dx!C}PX*82>J z@v9ooGJ@ut$Wd$#jcBwNS)DDk#^u=Jj!X>K2WdZZ+=C-xxO2ImMh?Y2^RkQSqnbRJ zj&}~Aa$*L|>ls}#b#K!u^uCwjb@3v@1y!r~(@o^S}Q*(5lOrz3GRITguE z2G6FLT-eqs_Hf{{iHdvj%z9i0#)bq9hS}8%v)CK65v5}1-%psAyeUCG!BdV zF`n+vsn$>+>QTLPwzZ^9n(gS?Nwr@wF>(aEyQ9L^SF%+{cbk}|F=^Cb z#l@K=lGR24uDM+hgbe((4p=Y(ov#*y&f6F&8_n!v9ofNB?j*Fbcu@gw204$9HrZAa zli<(!!tOi%p&*E#={{8-QK-QKHs6$66=C z+V&5Md?V!+EUiEl`XHfEId5gf9O`hD#3|_yIlop;UuFPyN{up2F?gd$-yze%toEjz zIqgZaLi{t`y(#{gCzrZ<(t4KVmmW<`mfwg&EMy}l3q=92Z@dVEF%%W z)CsX97=R-C9$4Io7<@8eczGWbkE1D3+^ErN=I`^>&rovd_;t3TLS&K)wl7 z!PmW>J#!$Bp@Ju8-J%5AZbww+SAVTIKPdCxND=__y1;1xAk$wT?x#%@y#XZJ4}V4R zYe>al0U8|i(|{IcfJLceZ^IVXJk|3QT` z^7P>f%cC?2dm*Y@lwGyS7i{&;_1f;JnvTSJa%+osYwS#Q5IO2O_IM7e*KywsJw%Z# zx9;y(&g5KrCqnW>N)+PY+E-PwJUqHH61Q|@dhWFZf@B)YQ6I81h4t6$qtMgCQQVh_ zh{s9IMRdk^TaB&TuOE67W3gKhN`@wxKD**&a;61iYG% zGhS{BqW+c&qRfITanw+XFoC@@TscOH^7@>&ucy=flBH?rK*Y02vgOA(NGyo~N07(H z+;6CzXpPIdMJ=0XX4u7ZTk{Qr+Gxm{=RqyWmBC9WW4QR39z>LeCrgm6qLD*OB`otk zhATaZZDwx+`P?gMOjW0H^5Ihk#ig)78!o}eTfx3XDI9Pxi4{q#lhB22d0AN}_A~H+ z2E&30Ck*0FP*?vRfXozrBN7;lNYXpK-eL`bxROTRU?nUJ4GZxrZaGK9&X4S{ZS6W$ zkV8@~v9P=U8}CC1g!~ZO?Ht*YUC;|pdd0iqnifu?u%Yb_@fEea%ii=L>$?H)bx>S9 zYkMC>9e59{$hz)Xq=50g6P9n00#2=o&+H5a3wjjk+Y}*Iz0I~mraXRBi$S2c^rcU{ zStJ1Sziu1VWYaYFUiV; zqMARq)V^y}`VhFxOVMY8EXg8N=XnMWwl6Fuel4NXBwg_vxnuxon+gd6^Ib89mysi~ zEuqV_bR_Cod_scT)8L)J&is6q0SePQGRE`LQMDF(ki#`jU<6P||A+%();S5Yo9iUB zM!fY5mw7c^axeeO&ez`slpr9W9G&>!c*1k^qQh5=$iCsymvPz0M|&@)#-bZ%WFbJF zEOd)a@LlBP!-1|TO>Uc!GT{Rj<|x{%uiin=z|4)2e(KpmcZ7CoQr?U~UP!th&3?TE zU;hj#5ZV49As6s~3-e^(xt&A^L>6o>$uLuO)CDtQ`v!fu%sEkqM=vvV!nI6q%NT>| zwAXeD3g+SjJQ`D^Z9MfsrIs@v#y&T;+MCO?yb|$l_&m1PLh?>KXtS#rb}sO)$;V)j z=FxudwXKm`7)o>!5cT|;10Mhmcut^jYd_J3`<1qu3@g1{_$VF~6)@aIWDJA`UV1pj$g}5Ey*ArBw(A?|e-H9y zr~h}NPyj^XW%OPGLllb1HM`ZGW4PgqL?yy`o&YOuPxdi>R3ozrmIG5_W#%zQs7F{C zVsV_s-hjV8SSD;bLI6q4BJn$k>Xlz-Gh+H&&y;D2ThFaCBaqX1 zN3_mLF3wuWTmyNF#+!X9Cb36+94Dl}AL4AD+DsWl!yI32^oP$T*N6VW+ z=xfE9@}c^Kw-}3>XMmlt;#CA=M36Q22|vCBz00=hY>yv{g7ICqR3m!gxe0|jX3bSIv7qO*IjYi<-!up0wG${NSlY9BiUIN%Tp^-P&$3bR>3#RZ*# z3*tzYp@7ft(-2#SG-ogw39+- zO1M+wUVC~jv@h)?rY<>OoDRC>2(lhJGyN@)%BsbNvj>3tTeRhs9Fu)ucqUtv&4=F< z@92N(TKM>oeF+@oS#r6t7#|(IICIs=Xlyn`0Uzo)dETI5;PqF8;F1IN^t=kpgYM`r zBa?Cv-2lb%(4Lu#t%t|@`iJY+4VDT{6}|)^Ll6}s`@QesC`QcM&xy?u0$C&^50!)I z=2=$FZg^5v5u8fj%y>-n*wc zoBQT3DCi^S)^CbrTV#N1n<+IT$57$c`}Akw=SFN;vNYYqb|ZYF$l1yUWwv}Nrsqx6 zD&COjoDVbSgIN2TbPkFBCN0%BKpS@-q8HP>ho3&n-x_h>T5s@)%>Yle`%s#dhV$@S z#Mwc^M^c^`T6RK_&lx}oL8MNUH!)Pxi;QZML!GGP@NvJ<*o5f*TG7~ft60f#++P|E zX|y6o z+b>68eX4=TU?JF`OB!R(G_7w^g3kUn!$)Gfb4KBTO*>1(QcF;87l)P6)grwicI5Ue zDL--}nNK=TUOoe-ABnm=Hhn$@DWWahe9F?gJ$x!EAYUT53)U@y`_)iu2KnQ;e;}Wb z4N#JA;z`&iYJ*-V7T4^D9!07SmV1~W?clr1wp$~h`$SF=V9uUxpJG^yQz@V?K(IhH z+p;5icEIpuwv`jaoHUeff8>3d!tan^A03{UvK0AYSRd1c(r?>xnsVy#rB07Rfel^> zt~A$zIV-m_BBXdsEDlmuH=3FXHCqzQTD7-DSE|?rQQov`J+|w~%%56^`*IC(fFP+; z=>uSrLWIS|vGHJn@i%&aZKSdPmJ&1$*vJ-P;(!UG?bw^o5N6ObFkRI~)1a&|K+QI{ zlmdQsip+GKjh$wDNw%w+z};JgZ;NAftk-J`2Oe%UF-b~E)(#ot2I$sV?U|_1TFET2 zyfbF^);Yjn>WKt6Xn-1A9cR1Sj|SzFeBn0X!>XyU6=SZ#hCD5z>=LF7?wY`m_Wn#&J@XV^t=3jtAra9gXI(_RMa^iXmZ-ERX!piI|muU!;` z!FiLbiWFACTxCl!(O+sUmLf-KY*-#%7Pk$i=8Bs#^~@A#C9lxnsTgJ{7iCXX19#@0 z+jzEg?U#q5x(}GfRT>8!hLdB8J*`P1e0v7owZfT2A#Q05B7&wQsd|~WW&okje!AS= z!rS6Zd8j)2x{jAGf`4hbHS~a_h`Y?@34c)9(|C_@jIXBeSnV4CuqdQmzCAehGCyA_ zTZ17o)Yx#aNR@m#=yMrWCN;`Cc(ffAF6?jy`%EgjxuouNDR)dDK|V0h|E`7Mu~G1{?E zsoZl-bVXT3xAJ9Ks9Wj_%mu#@wiJ%&K%v41vi%Q%W)QzR7bJy;qBk+j(Zad2%-;Af zhiv&J`#22YoP?NXfoKZ6+NctK@(Qrv*u>eZ=^J=2F;<4lMhw%lvmNku_^WhYbom@Q zd@af47dWtL7~-iG^q6d~xR3OJzcZDK$5TST5ar&In~eYLEyh>80`Zs!d~x?qL&zl zFuDB_M{`Nu{d<^_ElrSlj8FrS>>ZbN=H`;%`l zc0OU&zBmw!iZ(uE#`Ge%K05B(JSMu-Bu9t|1;5bHm|m~_feC}ZjI;`}6+%pl$=l9R zh}&^)Zm*|`g0=XvxmzRNk@Fn+5dbieOl1;}L6HyB=^_6zr9&=av$i6Sa`}=(<1MIZH%XmusIeBi&cUMXmjMj} z$2Aug%J8Nqd)aR!1|2sXCwEM>M7(o;6M9hz0Xu!BRu;zWH}PMXC7XWtp`|@z$U~o{ z{Ub#bZs^apyL$O#FFMxsrIOzz^+1y}b7$9#76UbUq?73Cv>68|E;UiG62OFQ&0SDI zzICV%!L_PKcFuezbJ$~G%LLUlWT&7v&G>o-uvZjfzw;Wx>o*QV(FQn+TX=XMMzmf- z19bWN100(i9V5Jm>{CS8tXq2^shmcj1*cgrqp`y#c^#9x5oMF^qC_M@oL5BbYV$R3 zvmIU$J^25!m$vP}r>yNvd2M*F>OOZX`6)2T$|x;5G%cO!Y^wF0m>3&vx9Q!EK~B%i0F25ic&zw6D=jscrL(*w-)aG{XE{b5JPKuj zNz9PvMDoAB-Gw6&hjFs^@(`0{9lc+fQlb%^vP*UvbS_#S^eXJXDskT}PCo~*gJ~^| zLkvyj;K1=EwUY7eEN?Xf z4*(t1<1FBK$i3p(9-Af%#Xa$c`d)xHoNgLa#o(Gg*6Fj{t;MP5ttwW(>cb;K_2Gt} zA=srLN1yL!Ik^IQaflutLQJG?VIC|T$M>>Tu%Cp?E64}h$H7jAP9eYi`srz)ISuxT z)A7f6`>dG$%R236;8V7~^EepV@m)4&rGf7~J*%vaNxe0|=6BV;R-KC}!oOBljoX0E z`@eS9!FYRC(C6Mc`BNt9|P+XvTDQtZ6)4Zou|Q|M}?8&3oyhWkRP2My^g_y z6By#S2<#YR#wdfqIB{0`)?ON~e~Vt&kERn=&_M!R#pko;^2i z@u%Ifx?&QPyzK6glNcS1ci^;g z4(OP8rm;FCU??wIW0M5X`pMG!04TO<;dvPDDHlfJ7n_Ahl1BT85f#TD9eT%qz7%wf z13r6{0BpP~G}9tl&?PF?ao>-*>NRvBaI^jUZvo&v@R5)KvRSJm{$Jf%9|6>pRBO{N z00!G5^(}}zFtBQ30u|xm8Sp^n(dltdfqYY&Qk#iJ+ivPUQ}zemhwn=QCs1%#6KiJ9 z4KDPdSt`+HN(6)h0e0*GgI=psP<({z5pJPr38kKwCZE;PP@dIRhQTD&kVup1{;OB7 zSUM<7Ny52Gs$AiR;tR?Q7aiz`80H`kM6+VTXO!~VTKwF?!qti?cXupvh!Gxe3C-mGVW;32(II>O zeE+DhEnKHg>wO4qi$ zsSHb5*=TJ7Mhq_PE$`3SbS}re#Yhj2cbrB0DtG3aK!DOgiKEM~*}!4`7}uw?NR_Bm z_z)ULChxW*=nofg;Xm#XZ`=aTQ)B|1C!mVTqGG9w#GjQH@%jwF$~H-Q_HQtBJ zs6fgKq#%kaxWJYcH@+F)4?Qcc>_+jt@ToRn27^}gwP0Z`fn(<|Ee8067tQa@IcMGX z6yXJ`%+!U&IyPT-@6l~u*`KlLywVYO|GPX+{Cfuw;AgXj`vQ6~E9%3f$DpFA&imTl zv5M+-`IZ9eu4V1ll>=q=F|D)L%Sw68G4gSu*fKEK%lNSNMas6W|$H+P(6#6Z3a;rk8&OB7TQTfE0;4h z<6$BP{hq{^$;h&59vX%3e*!vTxu2df^hwVs}N4e$0OmO#Vj5SM__-7I> z>aLE;xVgO=8sh!Cfg#3@v$Hr%ld#h}QK$?(3R(&1l~LbPY7>jAGo%m5H@an*wiGEd zO1+GPLk}7*tc89XXjax8SgU-GV+@OvFm8GF*PKoKd;4`Lc|2kXad{-NMbD;s2d)Vr zgtTpKxL;1ZcC^Ry_muzOm?SA(XOfJ5EyX|Q4Ew+sZ?<=nd<*cF;%&u- z7QbD?$u|mm!u-MN9`~M%!B$u+bt6R8I=7kNTr7?^cXn|&tECs6WY{U;BXo1RL5|gP zraKPWS{aK&oWt8Yxh|?yh_b>7B0FQp-S}ho)++g}@8F0L`8j)`ZdwOaV4+5vcL&+< zmAdw8AnY&;QfR)T9oJ&Wrm~=J>ed&0uOP~6|BW!LC(^BNE{02oy`4`DIK0xAoPKYX zS2+kqhhA`5PwpNnq$SsDd0?V&W`5U0Cv|409NxC0QTB7XU$Y3L4<tW9+< zP!B6OxIQ8ymFOzzGRUp>j(h>CXAj<;hO;%#yR?BzG+sNXy^}{L89vr$3}3PWt{^(o zEci2o$~O33$vuPy(LNsU0c8~Z;rK(S#*cUt-wUMzl_}{~zock*2 z3i&H@!*4Fj@H9+u%@`fjucw+sF=~~kk8BAJ776m6rJrai1~}-=t~&P8Wc@i;VC8lq z^kQQq8@OMn={Q!e$vPunF_+b)2+9x&fLjZIm!rT6{h%}j3c{PB(EiY52;kJYKomv& zgPlQI!+>s}e4~np%sLULyuG)}#%}R?30FGQMT`yfSAUwl0QO#RICOYYGNrUP=&`+y zOi0LumG0XQBJ{YbP}(9;Sn7!EK{n5@ZbWU@WxRS!N70qFpON2B+`7X9)mm$ITFrJ&zbCcCR7YU`Gf0 z%HqShAm!$cne(a5^fh0&ZHcqe7Q|4 zv!kS4P!z;k)#~0}HseQGx$`>bexRzhI_+_g;(=oq3EUer4~$bo?&(IpmEd*0cNFyk zR$QXJK59FIKu&sThNTO5KJHemx#Uv=; zFZL}fi_pWpw8z}?59sQ8Wmoo2LB!M1X@tswnebLa)E&D>|I&!6tY#RB)O6Sln6&4{ zQ3uK zFym+;)maLu5Y<{qk>7H5uk1wvH%(cVq%!@Tl?o6b9r|Ilz6wHAUaK9@K+%fBF48E( zq6zh;CcHc*o0Y%8Sd;x|tEJYir628JQW8D4eQIVBc9_vFH)c1EIyZNdj`X8xd!K3Z zE|JKcJ9qYWY6^NY3yhaRWlFP5s8KB`%fa_6#{D*|aBx}QhTGm~OYyq5bA%38nBE}Q zI-p!TU5N!E|A&9yiyOyEE(SFF?dgD*^lMI=Y}~n8Jvp!%@yhgC!_Tbq6bQH^WQFxGO|-mlx6dzSHC~_u&DcJrgeKGu-}t=c(r_^&Rv8X z{x0tCa#Y57m*(-qx;{ij$-8C?jTQrM&&MtfFe7fO7zR~V+c`S_j)gl>OGB>{_~8*R znz}^u7@7LDnq~(y)C-B4%Dc*py-7YUID*(B65CAK`yb8JL(}`J%srpqt7$k8y}9VR z*a-y9>bva+Y;CnKpkAHuI=iE#%39lTZDD9C#PLo-XpH^Ot|>qUC5d=P**Rs?72xvW=1HqN#;+VMat1-oyUe0;9_s z)t(YF)8Tr%8}7FbXuZR+vj>*VE`%3bFYS}HFjN$5fEHrE?!1uP&ARz@O~SF=ut8IgE3AUhZZ4aQH29Nrq^u~& zG%a`rHn}GZSs65iUW-Fki?TX2!>r@HMPMcNISGiFAvOf=FFG1^SAn}5XeP3vfYFIp zHCDO|AF-4dSnx>@p3b{1#kb@ME2lKO9YMYZdw0wS;|lJihZRr?E`^l<2G+5(#%og{ zT2E!Qt9F?P zXBtExZ0aB<_TmcplBRX`g>hN(K*ZzpLhGfs=q`azJ5Cjwgc}gl)N-eKrEi?sFRDie zJFCU4ybir?GOwH(ioW@8%PkTLIW+nUqNCnMuS`Ol>T0R>(SMqGnk+!g$(LHZ!xu}b6<$xH=d zZo={gdY#TikCCE^tk&;|Qgl^OTrg#hasSpaSwyKd**izdd`q7S%jc1Dsh+HH9=n9) zOz?1jjm?R)w#v3OI#Q2433mK&>ydYDXSchE)%_#b1&pW3$>Uxn7$6D`XRe|=|Jv$f zY>mi4%*9l~pKzIbXB5WTX8^_aVzYixB`)Aov-^1sn$zhmWov!^f2Cf_AMY zXZ_^Cv2AOEanuLH%Sheun=MW=sduV8)QZW>Q!Sk@w#%?zFdA4)Nkly^T@H!zFK|!k z-f9kOqRiIwo`^km{t8FzxBT@yTh3f;^^gVwTPb00Vwog8n(>to@em6NOtq z97eGmn`sFg?m&AhRo!yt=XS#;6v&;A!jrF{;WS7rm;EB(c$Ar#cP~VJ&;}4r{O~WxTC5Sbksbh0NWPq?OX=%G=F`N#>Uw?Ripvccqbp4kFYOp80-|u zN2Y6TsluLh%F%TN*Lxgg#AUMv3|W^=R*kho4=WbWECA^hUzX66|6a@B-z^~fYk98y zk*l~RIqbwG4T^BRxXP>bQ@psIMx3+PhZptYZtg%xv?KlD3HHnUV`o;XZp41h)-;@U zUrIhI+-WTZz>IAg8;czV`-0^d(weIoXdOpF~J-fgLlhSA{f}aGrM%aOP=($HUVV z%o!>N5VJh$Ae4k|Z=t?Jcc9B*rUJ5f(O7@cNLzPaPPD>Q3#*_XmHN#%E?q7yTV3K< z05w*p$FtBq{5l=G;Cm1%GwR7Hsg_EOw_l0+R`zT`ZX`J-f1`2n3uZW9NY{dY9%D5%FC?1%9_8|k!)+a z!)DzW6E^QKoq>SyZrsX9wOv=uiMqtnbdY~- z$7K{9>T2x0SFZKKrK1UR9n>^Hj8++Z@|2#qxR7<{OH_#e(EF_8TgfPt=+BmqKZ&yo zmI*&+l*YPOD1E{AFovY0ZQB*nZ`vzgo9%t^ZQI+p1jeXrtxH{qYx!0}-k)Gq@k2dJ zYr3-Qu;rHUy{SbdbZC494q+AA{^o0dd?i(mqW(BPv!lD;ogMK6Ey9yR!||dHxRZ`2 zZX%~2!1O#ZcJ_*Qu6u}}ZNaUpq9TQ!YcV-= z;y!vpbN&WEIWul;52opL_wz2gp9+lmp&kEN9#rH`#WoNS@Cq5Pp$NOe1hn5u&`KJ3 z4UyJ?y^n&_{aKXKhNptmjWmi;Evo%!1BQ+o1HSQm2GEa25q}D+YvE&{$Cwc zjtz9FrT$x2eSLk=lp+YG(EkwHL}?X#`DnqxS|E2Z<*$kfAWd;Agq6?7euIw`0{kSh8HFS_I?A`Ho#jw6f2d=Y+u?B?&Ai z|B!npFkiyR-mOYNz5RXr2W3w<>hPUq9WTP^FSRwB!!62!7%x+|h(VECpEiPXsE;D4 zG=(mYw;HE@rPG%OfUhXfdU1Q`xGB=vvZ;x~OtV&IbA2#j4)de-kVs8o^ z0m!;KWkU9uxa5Zlv|{De;NW@~xb{5*2BtiHKn1H&runNz9Eq&bh3>{JbI+z?w=t;My@j^C!TVoz2&EY0flYmvNYf<-@3_=ppM+ zRmAI`O=tx0_Kq_j$$+i*B>@&yUt%H#pZ^j#G#=d5EqX9>AIvIQjjo&503B+3?xv>z z<7Nw)Ax z@tA8aYQ(^(13`i99SnK;i{dbcCAuDcF#}zk+`0hNYjr1*xu0#kZbwZ_2m$^sO4Uk3`<_J_xMD2=@LFr#==KY z&Ctj~_s_XrKNpGVIqZS6#l-Ua0%t2m&jD?%nrR2u z07(VflEO4f*y6Thh_AM98~hzxI8p%h=&*DDsJrqEEbhrX`%`M4qy%jFh+h@+hlzcU z<)ibb_jlrw{=fD9EEsKT==6FZI>C~XwXXs9P@f?DX3EJEx&HM~UNC+>d?uWGKGDo$ zd9;FeazTD(+MBszRJJ*?w{u|ynE2uUcLES&J)=aQ1#gV^9LFEqn5imDh|VJyZsmHzDkK^ZoVrS-I}l+ilDCj{(~*%Wn}_@QNI0`z3ff@n(7xX@-|-F zsts$RBY`^!U-sJW5FcBF?s^wOaJd_V?Wh_zOfNbEEko9S*Y{6aIn85(xFTO+DE>TA;&b7k(`xF4LUROh`Yu6>-pF22c2xacWXv?1Hd z^@2fsRUv@{Z{pXO@}TM;zI=R@9a<1iVEe{2i_1 z?Y9RHHsFK9^Qb5CrQ52xM3iw(7N!@om)xC~&WUbpYdEgzY&k#LSH;F$90yWrxn)V`^Ti-qy(aCY4nM3*F zR)|<^##uuAsk|1P`%4;pWX;5*nLiguQ$YT6j*|lc3wm_+w?wZaI~zn1r(=0Xf-2ZGek zy9J9PcHE)DZ<<~# z=n!7#UJKSc)N(l>=Jns*?NCR~&W(X7f%4w!AP3m#%0;-S?W*Dc(2m{hB|(X1Z%5(w z2TcSwy}H6#!Zr-ZoBixS^D0%>fRsVbdnK0Feyl%=^gk3u`vK9;4V7Yyy9ruxHa0f0 z1v6+NPD_R@BhSEV?IxULJoC%}L+xd5AjIlm8n|ggz}FIigh3BVKN%h=R3fvlR_h&P zs0R?r3l=-dUb-TFS@7CGYMRqxe|iNVu@_P>F*PqP9t< zaLx{jQw9x|J%VM#1c~HJ;p{DLn|0}`M$JVd__f+`7Bx&_MSmqjetIHhSa=+=E&jOW@dI6apwBlfyw9a~M8N9}3 zUFd;tf7A2dnb2d(=)MoqMooeEiJ@FI*RuMV2PoidSA^XrEWKEf`+7*#h0Ziyy>jk2 z$91m8vdw`R0{ffy|J@$4+WJSe@vsEsKs>CvYE>HM;#{bm`yB{3hk_(MW!v3RXd z3*p{-b1*`7fhpWN#wHW9|neer<%w`ND_;T^F;J>tixIqNJl$Is@e0hW4O&3)S}M^e$ubA|s(n*frTi6MvUiC(uocDG^YdP@rBy(CNby0XIs zA%&q-uMfKQQ2q@@0z0f;14c&CNm?@#(nflQi6)1D1jzMYu~_|F?Lix?m=_SiAwOyT zn6cEToK^#-5}iTrGq+GY!-wB^>ki$kFFFbDOAl;)`Czb>p=xkw5a>^=;Bw!kdH;Hy zeV8CmHvgkNkHI=d=Yd4;Mku@~?0U8;2X1VtnLp{I8^k ze*}sAQmdgAnwiHGcQkr1UTK#PV37=@b}kg``iwgiw0kA8{Rr z8h^y~LtymBx{h_?*qHQ9a6l#AA~c=@+I+@`uf_rsE3XR8yjZ9kp6}&aP#9rjX^miN z{#W4O6N6u`51Ij@C&SXEkPo~BWsbEWrL3(H-!%S}33Dj>u&;RD7~ap;8Dn;*BPLmb zmkdO4XR7&k^9b2}dPCUgEX`0$|nu*I3(x!s=j1Sg@8Pu89BWd6Bd} z5%$ItBB4}ym73wW+qsQWWE|{Le)dBT&a}3?Shw(a;KS}Ux7-&ax*4Y|X=Sk4eXbQ2 z7`U@yb7mN_;>9)c$#{+#Vd8D)`^ zjzjm>*qmwn;8LEXhgvE}f2pNOJj-QHSLQok>}HH50@7p2{~z|=JF3ZTYafLelp;-} zh)5AB(ve<-C<0c>rb%yGKp+$;p#~yNsa8OWfGE8w5PA^=l&;c4s8U1kE$~~xecXHB z@BFbj-@Rkpd&l`p2aq@KT5HZ{KC`Sj=|qJ2bqj)Bdn@g)r|?VOUj1M}VyA&slpm+Dt&|8BH1)Pxq&SA=f zi562|BR|W6+*R7QEz~x%oHs!B==RZQ1MEIYs9dq2AInUfPIle>v#*(uD}AYqY{~=k z4)BKBIImtw^E`{=fwf1I^KWE6o`8lqvTf;ZeM4*nGdb{^bQt;l&fmI`z>`PqlC8(c zCOni2ub;d#ny?9{5dFbm3id{-#>=j+(9+sY?)YHb8X!U4R!1_Uu#3>pioyn%;Yl=o zK9dr{-5B4Tpr*jE2QTE7rmz}Rl`&xs=e`z zJsdIfSghBgo6%P_<6&?i^4`%TOhgRDWbeJ-$P+Zhw*CW!u)_6xnLya_N9wcMhb3*w zqNUR#L8vM->u3Zb<1NgY5ltB{6%^)B&hcq;tXr@TZQax!G<4kLhq+@@y?O}*>J z0IrV6)Lzmto&F66%8>)+7=yD}>S)d}Oy0bH#P>_6O>PR^AV)W#sANkXF!{;?e0Mq` zE{maZF^X)jYnE?}-s6!MWRWOwxSo zu~Q!N^N7Fz;J9mG?9>!4viNP$F?g@!Rn#z7S8hISND7N!vJD$WFDfj0avaB?;hqlf z?Ut)d3j|raUR0pTTm;n~A5q_5kr|cK*vl2r*oP6YZ8gc={?KMl*H2!pj5pkyo02@o zriNMiRAAMer7;LURD73%&BYLW(>X@uRFSpff`engL%6s5oDpeBBHNgE;^F{z>&rCB zqcMFeZkl>Kyosaq#F^1o6jw^d+{XEZ$q>F_tqD4Y)^IAhDOCxeA1NOS4M zV~dOORgxGW&@YZAFtM*-wDw_9boePObx4%&_;6jG?=Iu6OZTc8B>*_#{Yv=)hK{J+ zap%PRi6$_hbC7kTwB04E2-y3qhNI!>E3(rc(TdXeqMlS0(8cz$X&KMpCU&uS$F;3) z%8rrs$^ef3kFP2}(IeY5;AjZk)qUL#MV{GJlBF;5XQ?5yX}JZR+6bic#k0Vo}b2dv}{#nGI<*4t(YW|%3~ zA-eq~{>@-E&u_s?IG&`^-%mb-!>K_34#6X{t+!1 z0xqvJ991G}r9t11YA3y|p3Tjm?AHj}Si>r>FHBI(085?GeS;$($T+AfOyuwD5y}K_ zGjO!G$w&l|&5F0+du@+q(vsalIBp(*&%4aFqn$XRFH-R>zN4!x-^BvAT`;FrO5tMV zTwr=o>ST}L8Kng?!%AHrIABg(y%%?>fr?%|;ugHEwR5cDWJySJ48jO)quOpYK9TEV z$fq~;bK1FoD^F{K4KT2vqe+d%4b+&B?Q$OcIThM?=Wf9~Gf1bkzwEpJ5#1cE_CK?T z1nAZv0QJomH+cT)h>LilZYYMX)z)E0bOldZwq@z0kbd<%J@W%6o5@d#zH?LeFq8eK zNAj=R8H8e{)?xbVN?y_2V9rU^f`VHZi`mi9|9`9sDDUd`bhI>Tux3(p}J_b@ypm(^wZopq- zyD$^f1V@_j?ncOP%`QJjbyM%ba;tSy&C9*N%>>TUd7 z4gyBM2ArtpJVAxdqbW(+2&}KuS7oDrUAF%@Pj8;yVyDR%)OO*kcfpO9u&L_N7uK$q zYgX$4$G=5_k-foJhP6}EejpsWbD3#)qTuOu7n+DZ~)!Y4w zOs`8p4BoPZjjg=YvR|d7B4eFG)R(}rjS+qlELBUq--Z>|^;-;Z`<5q18uUu++!Rw; zk~Um;RjJc^DHy&Nx^w+`(tp_raZPad;jxaC)n9&V%TKcy$guc`!L-9`Y-j0v)8*pz z{d|hi!h=neV^GKC%5-|K-7l7rRO+wdDVo^!1DCpjUlvrituQ&fuUn3>XWd$>pj?kP^yLw zOQ&3n-EfN1=z0?V>fH)kozls*@6jyhKXpxxJV_%tD&5h5Vk|@ik9Y06jedQTgtS3y z9Wd-a&L3NKI43Wn$R<>UkL<~V8@{giLBo+Ic_QRLu#xBcdd}Pqi{ixhN$m^ntuBNp zO-*5C`{(yO5@@sx!<6DAj)uyBIOUrSh@A7X0bbGeIYdx;Yg-T^VIzktom8|~M*8jj zk4G~*ugJpb>~{x2qKplc3@&l156~d-Kj>n@ul$DxN1z!M3;VWPD?_SvXVt)6m&qN@ z|J~#0O-uQGaJ##8IvsKnt+^&uzn{E%8%{;_ACrPlT|yT_#EXyS+iA!VbELW7ka_zb zSa#9kTg@DI;78N1E;ZPrOyl3E{sRtj_4fR;2iLXYj~29l$JkenU(Hn@#9LB!_&#-6 zjXg=DIGR@76kZy@EZVFuQ>!V$GpYf!ypn!9Q+G6>{6=B)2RWecz8TB!e6(~I2p_R3 z%NjfmEPHnLs4ovv%Ky;^c?uRgQ$$L<)-7tvNiflDg&s?F!9c?Ul;Y@*rs2F1Fj}*) zbD`kcmkDmepxO}=JtZV_`#;jg7b+ly;dl{j1kVvSf~R0lG*x*dceUNVC2EEx@IPBh zaqY+L?LXx~Fh{@G*32&`cHkPzH*NEyg{Lw}s05%GAzy($_qMAA@LV%Y=Q@aTX&-TS zt6(LnPd9KyU_l{Daa>3JG|2PYaDlIN_<#Ecfd@mQRq>YPTh|f8fb-D6*a5DICx1i_ z*5I1C|LO(s7q7Nmpe_t*1|67mImt?34X*rB{ zKV|c*7Gz`#Z0F;g2BQTJ^U)ytZ~JX2;w6xem!}A92Shp0|A;P6^E-7nTGplDcXwGW zc~IQspENLBrh75mRM=P$<^+LY;D8g{$$wNif~tn-vANkxmpYo3+Al6tH}&60UVtng zP)|~`oZJNE?+(cIo&u0XU9xoavh-Lu*l1Z8)ZH9A%LZQjG~vY~l;W!Y;frg?hpw$x zu$|2A&Bb}=BtqlP(2Y?1uLoDicP4q)>p>p!D9(;lpym{|KrMTz+^v$6d z`OqTa=ZTc`rK zvcO;EDp%pc{TnCDzlWJzKWylDlbzroKtjaN{G%95C!xiRa8x4H03zDQaLj?HawOcT z(Xmp$w5^g*(@93~S(HbfaC816H+P57o@3(ubJ#7jj>tp`1YAz>6Jk{IIbmkc1Px*T zP)c!8|8W1Fi1kGm=2j;z^vPt}H4=T#t=UF9^@b=i3t=iM#zWhN1S-8R<`@)m=a_6+ zBasR$12ujP?&C$K339iqbRXD@_DJ(6yk9RipW;#MCNIIasvhvQ=9-$$Z5&RG&|(1Z z6X0^4F6tk}a(qct$hKVVmTFUnDHml%Kk3HKyot}FR#(KeI)vOin9GW2DjM*?FPtbu z`-1H5{h$Hed_%?uC5gqUS`Im}!u3WQ`oc9L37e=*YM1FT(ea`Kp7cak*6OL(PBQ_U zLB*;p)qRsI5nI>4ZrOb0Np$^f>!qB7X?4XS2>Z9fN72J&ALt#tH~59ft*h5V3(Qy3 zs;Bx6>*BXb7O)kZd!4F&Z@ZTmh4+l4o$-@n4Cw%+adj9=tymwQvwI8ohLFQ(;DS{2u<(mJaINuumXL@`7 zx~t0;%R<)q+l^Jei*em0TKs*lvJYB>XEfioC?7vyY0Hz_+@l%haqg|YGS7&xz%fd; zxLJP$bxb%4KOxX`2XWr=T+TcxJSf}5l zHWiuhoGpc4TZg^9&9utRu5bBsdk>8yTNx-x*2gf*Nf8R5e#Qzk6p3r%yYtgjt|jL| zda}!PdrC>WZq*v-dQX0ld@*priw4gJ%Ext}>5d#!6kK$_Nh(^i7(^2n? zikBXBdRUjT;1}H!xqaM$?J=k)=tdK(gL6rd^oa+T9~KpA)uY+iLe5TE=9}H4jcjpK zEo(>O#}tv=KuL%D;TS02MW^;Q#Xt0WRswr@)I&0R8e3oNnfFhb?K(#0RdAKjnIhAX9l0-oUx!V>k;C! zm)Y+8=*JFx%QO6P$i&pAj^h#V1Uz=9W>u>sPt;)%e1+LQ-A$7c9LfaCGP~NY8d$y87!{I!`Cwarx8~VKSh9YJ*@Otf z^{j1e3l-nwL7}O$ru1sAUa1S_5}Ts#E%u>zg8Rh7BKb`At9QSdzh!x@1Wq!SxAmp{ zA1A3qI7v;_RQ66NI7zxJ`*3KMFgQshWyH^P?Tae__fP6{f>!p-Tq3-K5~Q5LLFh!+ z2agtG6g*7%JH@B-^xwC6loT*o;Cve73IwUq^mv?n9>%={TtAk37ExGZcp$e+AE2|m z;I>R<)nYmxe&5q@e9vetH6D9&plbPLOkjlqD9YFBVRiQ4AL+H*3p+to_P!GDu=>`9 zuf5(bQl?shx@2heB^Pl8kY1i7KNDP}LxaqCHRAZ9MV0XO*myw9xJmssl=~tG0#`eY zbbc(rr_AT7K510FbaFK`>b&oF>Kf6652GjQokQ5pM#|1*^eEOR;FutIC{-I9x%cKG zrT2y(kNg@wq%Nk~*V|lOkbKVZmq-0jLpsfr2Y++{8Vuud)NPKRxvREe)b^e^I>IdfyMtl_B zYyVz8^;tTi_OiM{Gpx;B1*l&63|P^*nXd-nVb*I&EpH zc{lxGR3J;u5;_1VLM=How6ikb9jryT#begT}zAQFr|s{Ng$-FN3! zohou{;ET!IYq^Z(LVnT=SIsrwtW1;t53dqdPtucX!dUIQ96+fj;saR+LzJ@B1tS89 zP@$yZbPl2BDPy8tkr=YoA98 zn>Z%m8_KXdI`UM7deZP%7s~^$b-9JJ>-5Jg5=RUB)E023QS~O{Y{iQWp2}PKVx_us zVT%p>?PkW#)*su6tfpkf?S=hL&%BrN-s_Nl-JV!oD;@Pa$e_>kW|Qf$Y-+w`w3ih& z^4>k^G)J~(-5uq-yplQz zri1#p6uHHde#>=9)7#SRW97?vzl#!e<0Pg_E&QDE?e07CVNC!Dq)QABQa_5IDm2^Y zS%wQR%BCTg6?!ZIC;Q}YAk}+i{v`83^6H6s;fDcvWRJzf_>8*bHuW+f80OqV zs@h#t`-KJ~quy0br-3$7o98ujP=;(v0(^H?>4CgO3}csZRU;gfJj_P&2V*JjPpjv z?4Vk`c}Z9`mG@rhN3=)cSX^pr_7%LqLl^u4X|HEfEnSC#T;)_Conf1Md{{tUucMzc zqLj(Xds!}jZpWqzIfYS84ks||gXH{Se$alfpe?Lc94usE;2|7q>_b43a?-6$Q)9mS zEYMkDv#Kn=h=?b!bI=?ew~RNUG#QbwN*7EcH7jPez|7EXHZ2``oX|n()Ca;?>sKU= zWbDQ+t;-xk=j=MOG2_=msuq&RcjgyMgf~1B@P)F7C+o?0a7S`R^(mF5Tt*UpW3ddO z>T!^%_)Ye$o>QKf)5bGJAN8#zPhoga`;s{*?7$2u(MOhyr~2%qzm1+>QIKs!n0Cnu@E)Uz0^MfY%Mf)0441S|Qa%Wz6 zBVr)GT_Ljk9GjR|cjLxgAZG3hY9 z_NFJuaj}x1c$0NIj$q6KwBcH}9O@G3rwVj~zv14onypYmN1fHJua~sb`+Y^EVtR(z zA_do%=zti_@{J7px#i|K(`F?3uV*18B+f(JP8aBQzt3vCmYe|DpUX>d`^pa)2Q8f= zQm2f-)`YWb1m={J)bB{>1%{Oe^@OfkWK73ds@VjEMThtWS2@tC;oN&mJQ9)ft_qPW zKUO>V%e%dVci8-o?t7H_ z?QS@&W|yEB(A~JfEzcT-4UE+EV7ut$gActSl<|_6^GpM-8ZI-BS09f^G2E4^UU{a= zF4)5v$2wS|D8KrSv1s9&l;6n6DU69F@4zEaAyiV@uJ>LTeLx6VNY8yyH?gl-74lzB zxZ;wZ;U|yQGaajbSt$#81Vj;>n-2fsn*(kFs1M}wULzHwnSRbb+1|r@QJX=)x|;Ol z&Fa-dTidjq{G_7~?@NOC$Ua_gll&|jYKQc0{!f-|O>C!=m~CedZRQ;5SZLOwxXkec z^wkrLc}tiHEb_LNcQmbUEh)j>%VX=ccilVcA;uoouX58Gfnl#*zug$sTPXE?uUBs( zHH764?zE7@n-K0oZ;i>0Ctz~t-(VefW%DucgJjVLni0U!C6{Zvl0{v`&US5%B_J(% z>+C3IJ~{Ox-09PchAek`6TSB>rk%dD-&1rgoR@#Q>ijm~s#D_B`aq=b?x*~kG`Dm# zor#l*^k&on?vq_twy*+^h#<;0WFshoO&;x5hGkTwnbf65Ae!#4ceuszn>nNn{O^QB zg-og;P49t8iDiXvPkxJNpF6?7!J6*(>VAfI$4O8i%na!!r=|>}Wak+lgiblsOjc1K z=;b=exz3f`yVd8j5mu*UT3(177YReI;Vf%>>vujOvG}J^L6_waLL0d7mf>$+mG{1e z+^D8zR;saMOv|3?3G%~lt>+r#7*udy!(6d^MEu?)>U>0R`0l}SV$DIR0W}6`UDI^N z(pv7ldWq3;k8YJkhG3-V5WXV}MhEp-cDVX7TSmpD&{&G9JE6u4RM(+2Npf~mn`NSi zQ1>bB=BEiRcmW7FZEby=MlPy=s`4bzk5)%_BrQXjV$N0ui$}>OGhVKlOP) zpx9q{=$(*ys+_e0x}_uK>w%-$67ZfhYRiXf-<-XK3MIdr&u1Ww0RYylt?fhY;kz!Eh9biPG-?>0NxC)Fp&rSJ_-RlnI;M2Hr0F&K*-HRX8)*s_qEJ)X5NH~oSydcgNf_vM^v1u~_L_7$_+JrN zkPY97QyJl4758qwOC{JE;Lr%Y6ptK)9EMBM^za5?WF)xNp&*aX5pyxU>J8=N7zsmg zHFtehi;JKC;9~P*jZoOfEMSIpbXulNgf&2O^yv9x7f#t^0N#`mBxMiLI$h9yn-=qq z^!5$l`rhmmBB0k*@KsNi)Y!>bzg8R27bE`I4+?Z^Po-Ltyc^|^*=c^s)VqUc>;s-Rk^PwU*L8RCyWn}p z8EbwhNl9Ty#xzzQXL%Di3lN}=lUXu=PjUlcWy%dE13bnoxA{@#MF_N<{H}HRhpi{D zcOVGCXRMI;Ybq6(P9QwwmTlwPXz75q`;wyIGH{)M`{Dj>eoS0VAeem|u%6rWOl(CKV~=RMJ{El)b5 z?E<=|->&tN5H+BrV}GJqYw(g*OAAWsN?*|KdT*Hnb(1h4rrbyN*AyfTDPq$~obK11 z@TNig-e*d_lSNO#y>>GuV%)yS%}C%~oCNOiCG9J0U`sCmEW7YKm@qjGmfJ}0s(@Mn z2mLai+Y1cK`00Cfnt|t?HQIYdjUBXSe5CY+Cu;$0EqkHAo1$38Bq>d7tpB>LMG-SM zj6K!An2$3p4Yc>?GfSLl9#ew6B($M&-TrebN3sJD$llyH>t~{XKyrobwBF|g{y?n= zkVx|vEK2^cGeDj1Wjs^>TY4Q};q}i*04!j+;r!D+kO@L@v+13+U&YPI9|=lSy2Zs- zUe+%}6Y@-58wW#)+{4OK^*7{nd9BFvtL94$axE=amU20_5^;ezOLNFWAy20NI{A z0h6l2`OOl~=yh&Gn|Z+Vs^g|2>ze80f4M;6W=|7HXZgRK$VkijTx7O_E^gU zOA^g8E0zvCUt&l->D|o`%?Ds4_dS{dlb0#vJ77!MiS4@CId*|f(W{je%S&D*dqEh2 z?j!M)^Vjo^Qvk~}G8W@A4W0*Mxv8M(MrcU=3K+guS0q&ZYd?Y0piAu*A%>hG$+)?;8hl~Dw6{9Q}>>K|`M3~{3acEN!@x5J~g&0SEY%UbO$8Q6+o+JXh@ z)E`U`XfwN66`vCQ8j1*Y1uXZ<)eSm!kvw1*jIK=4@g{-iZQH(4{q;Ob2JpO(4Z_=< zz|NqgU--P4B{ZYIL~(ahEWkFB2=y2^&D<*4=HO=lzb;wWh7zGbi1t;UfWifh`-FQE zG3rylZUoG71E9k486+*o#?Ko($mmFrBn)af$!UgVJ9K1TTmf(x%r||E7!m+{xPZVp z9+;UCz{657mQF(f^@;>j?cNc&bc_csl=O&I!l1U&-gW!dWe=Cau8I5hQ>`tH(bZkY z^6M+t8Y;T9?BBNgF5g0wwC|=&C0zQpeNX1gpuOH3H7d8eVl68NY&%cYYb#r=GvCQW z+zd8XAKAPUfb_I{(0(J2=dJg;XA*6#F#Y8>Vi%XpCILUbdIO1;WrPW)a;~eum;oi* zdJA`3-%6_**=24r`Q66qmKX(E;yEVc*K$eM7{T_{L{$~iiAZ5KSgfQ@7!$5&6aq8d zaTO~8BtscMOK6-6&|)+Y=7F(1)nreweUsgTk8p%(eh18FIey7<5J5LI-ZS^;09kgT zqKw}PzU2=a2eJ~81R)~TRsoy$>bDtQlnQVon2nJEJR}@U{OyDOmDVf}zW}ONq+@I3OJoe8;Dr3zobL^sG^xmnR~Mb~tyorcvcr3nC2;fT7@Wd9YhIz|aJxdhY7c zQ|z4{0Hem!iHIOC!NYXYv}JE5e+5dR5;HtPc3T-sXe-2GV?SrLm zZoWsjLnf^-uj}U~llg)1G-Cj3)z7HlCWfQ}j8f5b0R-hcLxJuc!@+e@adiNBm2qdC z@!%k4O)WWp^?S*90_+bxpKg7*EwDfBDdu#;PGmGTmHuuu%UVQ4sAljmJ}tg;T%9%m zKT}&Am!N6q0cRvH45Nw70-RC1%=pilbud4$)ZN`aIXPmNLU@O{yG!RwAdn&y!2Aew z89xW48X!t)hD^vIsm?wm)p0y#iT6#~B1-qcL9FM$r~TE!O8Yvn-Q@Jy=Ef4hc29K{ zJa#Mvgw_NQ+O3O3{;+%CVJ|Pfj67vi1i0VV2`LYV7A@d@LH)|4w{-yb%Ni8=^U_js z4OlAPcP=r}zpNiUB~l?X-3$aWHVBw*hS|Iu{BRpfS7z|KwO5j(G|3d z=TE8_`GJGj>Fp!^rC)p(0GtGcb{FIUV*1d@ZUE(@+3XcnawL)dt(UdH^~<%81*KofRU6 zL@*XCNFm9I2pM;r&LIb92J&m`x=r~Sbp6Q@(=vCbg=m4+sPTvF{a+WTriH;${n)&% zK^6x+FVpHkRZbxMRvc#7q@Z%UQ|uz4fCZeEm;y%)2X?2Z!8i)G3ZB=NT}Imr8pq`B zOGsY*Wp>C3W-P@*A}1S|oe>sh$z{qIB2*)Q^|Oj3L^QxbSkJoj?wckg0?4mK`QCAL z(Eq6CRi;PH#?6X3Y~->`$~nOdvh&FRkLjFOGz5#`>!z#ljMg z8TTqO3{;ps>NH6_$1Uk8PQX5LiY;tTUBh=b2qj?55;-Hmx02t0qb9f$WIz>UwNfl* z_&^v2boLE=@E1h54;;+Pl=pg>l#?A$c>&;Rc#h225<|m^nc*O#X~TXGbrfD5%Ocxk zMesYJtimIR!lw8w5Hx=PJi=yu#;Wr$vrJ$C4p;bD*evl2pY?hijGbVWa571BICq@MEPBmNK z;Ops6FIDK1gr&7WnSpC*Ycon2PjLKn4jsRYWPrR6mA~JE90Tn7I8pzfSL4j$09dMP zVTyInYs8otidsdT7ranO@HJqBr0)9n_rSZq1Xx6~Hl;5h$1wm#V!}IsE5HRdfh+SI z1Qd|i^Q#N45qQ=go3PY?xxkwZ17Vw>RZyH$A8|J7KHg(!;Y9tc8!pt?co;X^=~kd{ z2(dNsuZ}?pwh{5=?>VV|h6TwtQF&XXUpdueFUn6eb&xk1FMS`KF6^MPi7v zt&31ShZ#T&fnE@^Wo3Cy^lZ9cQl<+LgqLM9u3fZB#mE5IodE}(hMTtqc9k2j{Lh_C+9a4mx>)^Zi#~uKxC<_}UXE=+t_w}TRR=H;*#J%WYj*N2Y^yxb765PAS=u)h$;1KI>7Ls;dl_|~ zU@KDQn4xLF)t5AO)ccFA&;z!jTHaml%1C2sB;0tS(wJJH%-|e&?lHcr4x6S2Qllw` z4wO+tF6v;O`sojc3ZV%OXcEj2)*;Z1cfal2AjAQ(4&wl~mB8r$0AUv~23Bsys{#b2 z{@5^3Yz64X#CsQVh@1E6`wkz+7R3XK=&*3v3$1j&{=*!uN>hK;jlzP?jtMh zJq>R zx8pQo`KVUSqUqvKpYn9 z1<76Vpp8X?$&&aG^?kVXSf+a7#yjJmbAGgMf`hyHGW$g$y?wmBJ`}@^%XR}h{o)Qd zn|s-h_75XGUfqNU59x~=z^J6zPE(+~fO|fxua|0z21~7<^#ko+f&+Fpg3^ZXrI_DK z`rnLTEu#y4`J94|)&PPcqi75HBr>q zotdTnpy7|z6-#n=eelys2PIB@qD_JIk(ar1_eXyIsx`C zd4+H&K4g^sFiUVK5f_V51V^wq>(EbqNmJ0S{pPmp4Krmx<@m?4_CGe5)>R@m1I*XU z-MZPH&}v_04<6WGQC2*|il3CKCli+DOjtha$l#EDZNl{#K|QTNyl+#W3+LI!WV_p1 zHdRswSC_%HIyK(urDn0ItXPepKzK$9N1dlkDcvND4OF z&_J0vfStJZit-t30#Lb^!YRZwyj4IX*SNl2f$#&%W+Sj_$7`ff_ydjj_))}4c^SnZDlGTxd)#zp^229 zdAmf17*uc?31L_$_a3h^em$No)=KXuRDDbQVy9cZB}dIF<9>beSogIMi@717`kmK+ z`H^@(+ju)U4(PsZ&z*cS@jF2Gi$c!|14IG3@3;^OafWt$0y?^;G%_QYmw;WUcsz}E%#N+cn5JPo- zOxl%k(;DGe0=C8R0s!UK1*N3gTEKH_E1!`-rGa=_oUZdYmxwR$+}7HRp8}KvQYvWl zVFS-~`wRKE+6C8O%p5Y;9v5_vy*hb#>;KOfpwx23wUQ^Mbmwj=NE`+e=;)U! z`mcFPs1YJCxStUi5S6j}8I`HEg!G)zLc#FBa?k30ujX8d5%Kk$OLzveE)@htPql4- z^k%dH{vw?Fg-){VFjuI?KpZEP<5O0jwF=Jf?h4Vxwp5(d1CI%i)p=^E;?-kd-*td^ z>SVq^p0WYHZC3xflovQT;2S9QOOW0M1(fjeA+Z{R$eO_Io!lfU48i0~oG1^b^?XCN zP|FjZ^iAttQKRUZ>ZPf=ED5{1h7#az`ZG<>nuvk6{8|G@iAA- zc0nhaO~Ji|_;IejXeG_F;14s>{D<4J^rfn}foy^Dp=^g%XciC1+nThk#lpG)8P~~< z-9N=703@m}LsvC?H%7BzJ3vGB;DcSK3?A~E9$Y?+-s7yRUOp4LVquV?4zQUz973`5 zt#?3P&5w~Fw%6+`6!o5L9tY2&EP3b3T{=K3jOe-PEsh~K`*-Grk>A-$^uzJaa;&>% z0C6dzmMhJtVRzRat6{^vj8je7cDi%*yjv7&e$~}R9pFv(^!wJ{FbXMt>iD@@XRunS zydN*mI4yg-O)c)+Ti8P|B0~;Z>lT-mFITshE{~5sdag!p*TZ(EM}BlkWAIDvFjHtn zH5qzc>jMF2*BJl^RN?Ggp|cl&UDA?>2!iREZC$E&p3LM{kF?yuCEQ50uQ@1RaXQ$TA2r?IQui976<{r~?atCIun8X}7*-9Ti}(&fU4jpo+_%jFZ8(AkSX(Y<=QGf2BMfuc8MG1H-TfTGXpX>p#{kOU!>e!e$~&_)nbIXhhN zn_&2AjHYSXXyekd-dLierg`?K`<8ZdFPKQ|GW=>n<9K(Tl>3Lv1!(y*PPvX`_hBvS{I= z;<{?x04EjoVW}rhyGU-h(#iGZ;AJLa|v`xWh0DGy4ztfB9KBT^066J|vpi<^FaBRGK@~(k| zOV6t`-Jwz(PyyYkS@$y-X}>c%fl-Z=4h?cq4RWXky~+xM%7DB1dS8c2YkIMrp-6go z&JW=Mi)mbd^_~Z=E2(@3JNhEYSO05k=x~_7aXvDy=%dA4Rd{fjiF{gVh2hkCh$!E~ za6(y}$4oKXto-F&ck3;+QbD==;{?W+YyreuFUO2>)?s;fMx^FebOcv0#(i%lDJ0)- zTDX3h;^1R*Gx?bhM$jsy~1vTC8b9n@^lkDqakZn zSd^-72N_SW2V?1&#GGl7TX1H(;Z|6#hbr3H{Ki1!`qrm9%Qx;q^4xsE802KCAN^!c z{-RqcaHj|k7aXv@JotTn#e%WT7IS2bz_{7C<&B!Pct?s&!NK=st5o**9lpLE^(F;C ziNuuvC2Gqk)I60z$oEj`h#!ZnGlKFALS)UX2OOooUhO*B&))I|vkXn!Eg9)F^@g_8Xp=~_sX&A4KCHRsVZ{y=duZ8SIEUJ?t96$Qi#F9^5;0f zby?O#YLbLljS3??dS}MezTa`r(ATFV6muz&ZDH+sxlhotYd`>ulZ7Tz08b6%%_uKC z0Kc{*WNM(UvZzxa4)U^q_xap6X+JV8`JD%Z{)Y{Vm6sAcHu}xyX+xsAu;#m(EC@oG zdX%w;<|E(fN;^Ymz4zz0805rm)8HEQOinErlxit~CZdz=p2O&;5495!ez-YP>s@}V zP@_pW&;GrEJygKx{ye50zPMEtt!(eohjUYaplu3Glg7p^#$~W3%fjn_aP51)gVA-3 z9SfBk>4yz}Y3}B);?ST%ZB>~ek=67MStjLF zWV~`2f$HCV1q_+)gpM1Pp|qpr037TwRf?6C56%pYn)#PpBx$W$)pgLfDBRd$OZiqD;S}nukd? zi5ejB36`MhEv24Gp>nUPfrr56U}mQv*?PHDINf}TVZ|+c!zA1GJ8T$6(uxz1S^Gh6 z<8^S;K)`d(H-8+Yi@!jY<@$kT?fV^K2?|yl36$E|nKA;_1~`iZf5s@GHFa@TT9AYQ zgp1(kWH6OqWhW&6xj$!#7d|u7$`@^b=}(=jA9EHRbZwk)ykE5`o4>khzWaW!v|X-< zP>Gr=(*I>DiLw1)^?+gQT;rHsY^UzmnD&Zf`guz46GeS0CySNC5|hf`xgp+zguD4$ zxoUd+j1K_nZT*t@m-5VL8yBWj4||^%Gii)fBKAI$)IvRyak&P?S@ibdO`j?@8sugt ze8|ufhxu`6FykYR5=T>kSdq%U-y_!=yf5XYq6Zd*(5dJdkl>(u1lk!Lh(2Q^SR?}V zl-2EyCG8?m&yI3tdXU-z7D-ogoI^taSfs-=P$OYPlU{+vRQ`oNaT^=a5i~w-GdSOO z%ulE+tf3$!vu{7yGG?=+^p>IZa47r0iltoC8LJ8#?>@OFZova;9v{z)4l3^F_g{s- zufaBc7ktFX)+=M5oM#wc-{&ef*}0GB82Wf&)6~LEp+_QezArxiWCzy6fN&AR0lP$~ zH3TJJPB!}*eSS86()MlUVb)E;-Y(fwbqir6bPUGx;}iet1)ynFG#a)UKH_bJ-ojs8 z*pJv&Uzcufg2r(=ISubO?JLC;k0NxdoSa7js=-wv8^VwtdV>GlK%Q1XsAj0LJ*;L3 zf`Wk`L(sX<+2&1?#p_I`Y3Z+>IYoDeB~SeRw+K2a&BvYXXzusjJvMKvM3b=8CEc+! zRYfcE^1k@44x9ME9&zS*=~Ky?`PWWQRICJ_NMP|c*WJx@w(q}<*agn_09@8 zF)54)vP_!s86HKlE1jqxD$ZJe!P|K}@j}}U{1uL;*!9lThh{f@JG{z!B4P^CHFvj` zJM>#pS2VDm9`*;L|jpX^HdN9=tedgd&34o=P_9{#1X36voa2&Crp#0d;`YT0pwa zggw7y^N!2EAour7DaF=z%c%jh7lLT@gVyV_6JP1y(VAlT>RBA|%!IRxJPsv5p&7pe zAN$JX+r^XLRzO<8lJWkP_WpCU^_Zq6=KbnqsE}C8@xynYp_`tYe?d#3p#SZxx#3P_ zfXYat+#?NiQ`>rEq}O_TI$!U-iv559`^y&Mq(1`u+Xp2Pon-j-3vN+g9iK?i_!B`N zT=lmrOt=7%VkbhuAYIw8YvP2T!u$a4ZzSE$-o<86IblrGjO7`yT%2Vq*hZY8snBlf2Bsv+SdXfmD?NqM_LZWqXvU8k{vq_wU` z##vna2KBe7=Y9f!~?anu&SqGobeB7&50!m65$Z#t2JpR&VpSN!XQz}{;D zk-Fw=aS~F-?q49tc>i-d*=l`4l2bOTdU(P7_wQ=YzO(rxr)3r(1L5fb%J*>-gNqEp zPlKkA#_nv2YC@h94aRY$%5d4#z8i?4*IO&83s>qttv1&PKH;%Kw)9$;T=r#av~pvs z=`auUNBU-O@?+i&Z>43Fwq2$$b(2#7Z${$}^MaQ4--?23xBNKI_udr~kK;KYF7#XI=aM#r8=OmIP)fO1xg>g%1_Dv8U~IMqIP*;rFUtY2q8$O%aKm})$aSH}k?CU4Qjm~xy=^6YuX4!v{t8%6=FVy@*P?G++O#i@}2 zdp+(spaUy6{JmawRF2R?*+rfZ72C2?D}X=vLYLfrq2qKIjg2^QAUvWS);J!|HaSL$ zDat2Lq>`Ny=-=&BO4P6Ol9hXxnRz1)Gq4kM&)jN|oUpRculcz`QCWpwGBf7;JY7y~ z4fSF<7jsMmqf8~g(-z;4cZn8aW%t)2?k^lp6wJT8_UL(TVT{0w(eWm^<@8qy`5rG2 zOi5Uz=LGNVee58&v8WbRtf+DDf}B^(a#f)J!m?czB5a_tuXnaZ^iUA5M*~6pvXaxp zT$T}Hvf|q&@ybA@FIwJIfFT~Bl*JVFA_o!530f*i(ezjsob@=FMm}@WF?pam56LvL zAD;ON0pc7*@^_oI zhCo0*OkkJ3wo@tq%|L^Am8GXX>b!LXDtA&07V#apdOlk7x_A zdp`_3AIxLgtr0hy&)XXgzrR!MdqA-=)+qR4rhfk0z@Wf$p70mmLJBt}$smn@PmJEnVK_Ga)?Hd=$G87rlz4QxTR+(V4^wHjK zVyaj0_AffgdS0+TxVbb;=*d%#1CHS3IwM8g)CY3R!%y~F)GS=RNs^jt-O+8Nz2)9J z2~W@qbF+-OGw(B3qeH889r^lwR&P-0c!~0b!s^HqlQox*FiG z46H8$*K-Y!8U?l>f%|v~yT%CsJZ`o87J94oEOqGfR{2{BxKnQ_(tJMrn2vF*(x;Ng zg^!(3h7#06fTOm}1bOO)(Ad-)>s_ktDBniu<5u?Au}TNO)jQkMFN?nwy2V#|)wA?# zma%F&V_v)qyGr?cUQ+S<`8xDOK0KQ3@~)xg6-;?#F5XAG$n6uccMFLs3wx8U)xF); zp^6*d-zhprB8EJxIcH}bjh3YNY%8oM7JuKcv|}+J7%Z%wzUI2FRKp^o6dyVm-4Q1V ztDI!`G&AR>-XU8yBK{Do+Q-oPhyffSz-PGb9?L0WXfr_>qi@skKtl=2IJY-?85#=n zm(>as807>e1=hz9p*Ly>aF+&64~DN%jO0$~HGgyT(b67tSDOg=f#(!Drd#Uo%tWwW zA4#1GW0C@&hHaJgReC(mk=?{q*GU+^alLnMvM-t=V1j?qfn4HA8M3EQk^&R1(MGA< zU|5o{$tANq;(PD9x7`6pVpT4Fg`|Bd5s@G~pWB9S3f-UV^Nb23-^&WJbNCw9nDIs; z|D9fO{(y!F#^J!=t21;bsz8v2mXe*ow!pDoIR%QkxPV>cyYYsM4no2M%jNTcII}@W z0LWZ~J#(Uk&;k_;Bh8s^I~3B;*Iz8Q4=}2X&0z@qbxDQQ98Mc8^Rs86;EAL^!VabM zMA@UHux>`<^YN@cce$~6%QG$;uPT@>iIq!~l(bx2bR3!}?WJ6KPbITf#!C@OZXZbd?z9!9|t&_xv-S(mJ z_a|V)Dxd=Y93wdF?L7E$5XtFC=IpSrk(EF9qfR9@BA=phq?~U z$Lhp+`w4eJLnr&u0>x<(pwcSOP6 zs0s z!h=~Snf;_BCwC0@&?T|2o@Bjsp*`W0n7-Km!`WX)Wz{`z;4mQSjX{G_l7b>7NGc^Q zEiDMrd4qr`f|Mc%(jr{~A|VYo9nz92os!bhDE*s*KF{;{zU%j{^{)3n*TKcvXZFlB z*UVgdvr&8CpVy)I;uma3He{_r-ol2H*n23I++*faD~;2`N>zAAfw1KQ@T}@}FMdMV z=aAu}Alm%v;y!_>^&X25&Vkv3m7$%nQPN$PG&wmh=00VF!M84xG^PlfH zU%+LxdzE{~%k@Q!VDo5ymnjjZ>{FD^i27XG^OA)QzBSE|E9`Tn>v-L1F~+K*j5gP- zeyl=5euZ%GD@7J(u~9d|u(mQoH!0vLO5XDxSp?}aq?=OQbRPT9U!jonn>EWc30@B?uVVRvv{HO7Ee-^KodBmBD^gUy*$m^(u@*&fS zrjyOKm!Tx%bWqr$a_p7edz;z!!qe;*6`aa%WO20Ja~o;MDlFsWbt`z3WkA*4m!{>7 z<}-bx4G|=YqZhjqYA6c+#}B1Kr75llJmmx%az|-VUjQ4s__R(QB}orPJi|V88=>jP3zP?v8=2S;_J6>xIEbw4bE_p!s%guE zoz{xj+vmOWviX=99V#~FzqcG@^~rs0)RP`aD=eB%Tay|b(v5wet4y75@Kwj#52~?? zcZz@x`zyiLCYuu;(W_hnldVt3$kMBr;PhlNm=k=bS2+ji$!Hpnlb-M;c-S@pXI2Oeo+7P9~5BUwk+in#T|9}D#fiA0#EMusf7)L?W0A}|Cu zAsFJE4zo0BKpa9<=8_){4u&L2b1=bh@&&?G&5yaN*f$8(%Zj9~f31KLOY(%8rA_%; zi`2eex`kq+wGdToXRBt_*5k*m;8cPY9e3aNqBFsBvzY75QTu+dXwm#}8eF;uoKOZY zb+Ctu*Ye@?TpQ-TbBi$V4OVe$XC*Ni?z$v!iVrs9XK}+2+fxK-gK7Rc#!F`8JHN^N z^PPL&UJ$g1bStgjD6$wpnR~?4VYX<7r-y&l&~e(1FvNJh13+Hi}6SDqTX^cCdOiL|L_k0G3xBvDkp-K+lB0KWikE4T9A1IsaonaoH>7)eH&z zNSa0dmg&P;i4>o?;Zp}A+%UAyXvW=SRaL-eDDT69LGR&ysnku*Zv`TJ$XZ3d5 z1z9cS70)Tlv%@1s<>|?S-TYQH*x2juLSPrjxX}XVu~CwMu{x3uZuny1Qc8Qe^m1*U zI|ompwDre&od#K%4g5uWU=G(yk3?)BVsUev`rjqC_`nheAL8?zDMLwouIR{gtl@~g zz!@4ULvvLvf@A1?=%sGH7tO(MNc5lD!?F3B$xuNWVG=*?$3I)i=M8$e9I;W&l+CW_ zFe08}+FOoa_VDnG%xYRPW~MN0$A9=#haO%0Xw@XS|GW*F)mGk`$EbXRSve$8|FJ@< zA%5vL(bK7_;F)(iotE`{d_l{^KwqaxbpGGmnpt{pdTBJ z4Ogpfyw83=m?by47ZAk}B(NM-kr=ttRrT}L(7w@~kqOfCRtY)obCC{5nNBAfUW!Xt zjj3N0`1O%<*Pr}_4e7E#9VXfIoChQT0mvz@B?3iYYZxJ^P>RQ2ho|X4KUMv{UIJvl z<0(Y)_Tn;qhzEj*iHx@(lm2!53=&8lP7Uu)(_MI{`jk%((%r0kp_;j4taCpNxATa0 zVb%|8ZNu0zL+S%*y6pB*mi(zz8ko^T-md(>JoGHhth}o=UmYJ$+HPvK)F3!^qkhUT zrI%69;9|8)KTpuboCu5julbjSMd~oAente)tYU;HU5_Gr_8beh64qOpo`*c8g34u# z`?)A#9#pJN)p5i`;F9+Ee}M>DE(++qAYO~qLD`q+;jz-?)9YW`INS2NF43{S@Re=L zd&m7V`D~o&oslCp74hV><@izVP5(XWPcdiuEBP3?9XX{IdO1G3nY9ZTl^-1} zmdrF9ZJBgLg>CXG>Pn|xDAM~FN$`_m$I6eYYM0!J7Hn*WUjx>>g4p=>YYbvzq|BB} z%!j9WU}HnMulQhNd9ZOL^#T0ZK*YweRJR}%{k3s45!jfg$LmDsYca`aKGZcEwS1^F zp5rQlD<`+PFZ^K9<6+>bnX<%6H&?jtqaMi^&*czRDfp}X#z(wGfm#jeLO@^T`)Q)<8OHsFmVzAww#KP6OkTIsa%iT?3xHQ+SJ$<|5oT-rQh)(C^ zZk%)tMG427M$Q9$^7~IK6+~^0S|ltCir)c^{Qr{=^QZi`G`(ZCXnDP?C0Hi#mr3V$ z-m%kL<2T*9ehU#xT_o@6qvn5Mdex@;x)Vi5meMV4rCZJhU!$8V`QoE({^FR<_xz6e z6mTiK58n^ZKDFtPHvb_Q@5Ql@21`6&*#FXx=D&wZ!dFJUA`||HPlX2j3f^w zDsvgHBV)6qZs*9Z81k#kGUNPq8H}5ShTG*_mXiMwAFh5gXelPh?fZHjz|L>aMxp2* zoWQnvdtQg>6lyvaeDV9vr<m#^?*13rP(Bx$L;1{d9Y-~i!Rhta{Wvb3f}LXC z=9??Gz7s|649Z!16xVjxQNtg++wEo+s^hESlN#|@s%)mQPxK$Q6$*0mTOxK)l_oVXWq zjD)W_B!F5=^Fo5o|zCM}}q{2ATolUdP`^GN!L}av;4|1pQb_sCas1cLU(5 z_hqr{GxGkAA+Yoy8JAAao%Y%XFNpX)GEVUi>=3pDKr)VgXO@IRG&jE#uKSC+cg3FF za2RHlw=d}ys$Qy^6c9vD4jhW;+tr;J-uJfC=NpV9`U;&eL zw)SW(5H!YFXQ#f*j zupV3~n}2uN>pA3_+;O~ygC3OkeSdXx{_e|cPER{On8)jN(|V(M*QOVeICwHAF&=I| zou1lHk(+CZIH{O_<0J3ruCE!S5@Wpce zOpob8Xc6RpbN1GMwDLS7U~K&to`;=yfMu2!rSsBOoS^FcoK^f@F6gF3(Z_rJ^o6v# zj6#L6gZsD-n}YU!cmBLY(KBRJzJA6_4>95E8{@d}Zf;nH+Npr2(2c(i%VMa z=Os{m&7r>EqEdfMX&Ad#>OZ7DV#Zf8*Rhl}t8q}Z`_7;hsWH@to4%(XEUZOV?;z6* z+NZT=VIB8z^jJQ$U04J!bbxsOoZmnU3%vw++{GpzDC4u+o>K(FV4E9HO$e7$fP6EQ$$BDm?HjR4MZ z%VmqzV5b%kp*9xaGxn@2a}a@&P^0^y0)7x)!2%9&QkIzG z-!j;%2q}Z1^?Tv1*q}FB)$9t7;Qjq?E2d4^Z6>>hdu_?rg83`X?qu?GWt5^JaTPr4 zyD`gaL$`Pn^BIbs#;3(5+vQ0EM3|FAlTbTB0?K)VZeh4CmP8FpnQ7rsy$yLGT|=si z?hxTc={!4KM3-*UvBFCJ@a4b#0&Q8(SmCp8?#TKPUWv_H?kF>F^$x9P$ajUrEqJhP z&|*o_+?t|AeIdhcjB>FZ?hCp)rh@0`5Eb%jX zPC8n{{N8AcdDL%k@XNJM+_TuQDpCNEWRo+Z^eVQnEe^AZbMzr6q5dHcr#OK#h~yG> zJL&&8Y#9?E8AtbXH9Llp(lnl2sr%2n+g12_!`|};)~+;PprOA&yEE8gKE6Mz zA1VLSeJpxQ$-Jh}O=7^z)yEGwz6w~v@e%-&6q1eaq^*+R%plqL$)VpR933!(iFovN zx)65QiNSTV8~?SJw6FAV$%3c{@R-0ufbJMUNF8;93FKDs(vtVWQ6Su=0 z9fhEciU;2#>B665`p6Usu&!?2xZVa$nMCxvk!&G)aM4CPqF8i-cZ|*^3)@!$*b*-! z5e)NNT+kl@wg0Gm9s73e8Nl~z-((31TX?}JIo&TD313M;#IV^sg0kf=QalD?-<9)> zSkVC&W;bd^tX698Vmj-{ofh{dPO4T+7gR-iDaF4gQ9~N-lLb<97s8pm(c<0$Q1TCm zc`lkz708|=ymA`)0D|iZ;e=O&06V|(ygDLm5rwxNI(qv;@dj^IH!6Zm^Y^Xfz(l+1 zQi<;};I=Z^@YJf0IDJ2QD&Y=y^sR6E-b^(fR+=9u@1~B}?lZGQ+eUmQk#61kphy}& z+Md?&s{00WAo~^R8Q#5o-V?Z9_LBBeCa?0cU+L7tpbCN@=S|9S>G0(WIEZwpxgI<{ z1IzluK_+378s16MB5bY>^KAC?%738AjF3)To)@GcViYgYCl%BtIkL1n*a|b7G{ztI z`kii@FqUbFnvmFyG;%sS^a!sXhFYyc?+n;WQNvcp3HHHRBvwB&*^AY>1L56sRPZLu z^8&>7VIw|)yN=9+R`#LMGYNU|PucTNGB<^H7qY$cesd9g$L}3m+`B9Cg_*00QqUy0 z*6ov*tuV-}i3*Q|oG{ZN94e7y0a$QcL?y)m7RZ0I-8-HJlLe&z}F5*n(ue zrv|%4an7sN+^JQ?9JY@*kV(=XFk3=M?jD8MKH(L7@FaVOmmdhP@W7Tu7b-6iLPy4l z8Tl43Hlzy`#%KIrO%sRIG#~svW&4m^c>}FkTNrYw;SVbxZntzXIPj=AZ!vl1b&#C> zJK>7A`Tu#sm2&MLZzaro3H$?N5+)GFj39>tkGw4h^iby)=ABd+9OQQc3feB!@l~wL z-GET!2M4Gs%ew&m03eqdhYrtWAeZKV-72^Z34mR&L0lBv%0K0G3*kn-Y~v^XeUSwh zz$IlImQNQu9B~^~AjUj--1f%$dqixa-r}p#cK7=UkAPM<99WW=E_kK1+h*xI$@O(D zRmD>4`mOZ%8As=H&{d#@aj=l#Q{HpfK+V)pIyx1=f~>o#(RB1G&H$BlA40I`LR`UD zMn0fU(*wP#!~Dr=e|=>MNM8a_uw)Zdxaz+#@f^BFi;r|2u(zu86Jss zZ7Q#C4hq3z^erQZJOs!22B*qB#jc_r#_RdtAYsD&NGDcRzz~RwjlfdYF)RV!P3JkU zjEyfwXAfkPSjJ!c9}lHdxdk9e#%b;xciyYu?C?2Lvf}J}{S)nznpNuaM5mX~y==B- zP2~u;wr|d4YyarP=fA6vlTyj>xAYNH1@fTR(>}qE+bRQ7yy`fT>$v{F>@^xbPVnIR zOTiTH%V`9r>!R#qGY`HKa1NLnggz;i zvh6MGqjw+?AJCjGr22l`J}Fhg|5L`K0P<4CV>bcJ)e$CX{;l7jTOI8(_w@qK4mcuv z;?qyp{{7q#Bsp?7c04%A;F*VhP|)6vzR+nv4=mvPE$tnX*t`y!B)^0IiO>UIr_Xoe z%W`aZ%IIwtMNc9mOj`j!7>PB)ya24N)&g&0d}w)#Wf$DY_de-GO_bC*eTAYF2Resz zHu5MYv;V*@6j+MZ^wNZD3}kJ;(v$byRoTJMluSeKI0AB9y;Kf2H z>kkG^l{Gs3ZzGa43c~56(xsdacaj3?_{h-c-G>z)e=k?8k8}3F)@}ch5WTdT&u9Y0 zX~ue2g+1B9TT>m)Ts=CQjpRBJV8DEkgoh(kC%rtY0GPIaM6}R7Ab}!Xagd1|HT?$A z;@HkTK&5qsH|Jm+^w+PEd33^MKc;{Nyl}Yz%zkmldWyNnB5Fw6toulPJ@!-QtHahC zt~7OgM;qRZ@QuRAH?l-Z;$RQM?%H&5t%=v-!#Cbsmn9`^;el^VD12c@_zFrE-CMSs z|K(LpB(G*ZB35{g@{eHwpo61q`5$K5DdUoh&UQX{hejOq_YeR=0Xr21NlpFIj{@ z)=3%vvte`(SRh80+OMhhDuam+&b>By=OWja@s?t#wY=RTs*>L3?4PROD-!ve=O#sQ zTO}a!6ZA;nufZ!oI<9J@N?DM3@&3R@y#CLW{cuGlc@iU`cGRTOiGv7QFfU zl$SGnMB|h+=YJnT1|RY94$CJdB=tV$x^7AXzqIdtxFB%frDF#TscIQ-W`epM+n> z0hy?K=Cu>hA3^xd)7nOOP;UoAy)BH!PC*3_UqbB7}PehCdofCKIfSYfCQ|H-z z09vVu#)SlBKG%{#2?k>g4P>lwth2oL_KoEDDO@&YP*e((d28N-Uw0?g1?NA0>A_Ij zF_x&kijQLpKO4DG@YF+XZw(}0%jY12W%L^a)Us1;hRTQ!ki%Dkxp9ccg~~kT>P=DM z;V|+{^<%L?kp{rX^8sG{eH3X3j69Ejii>y;)~ot|E6${I;62wQBK%+m=8d*b@9j7L znM9KMq0ris2-o(+!|5L<>M$dzI5O}OQgG2Y20aBRa{WNzdfA`E80>imqWh{>BO5N= z7iCYO?%?PAgn2$tgj?U0qx<(YbRytElZ7ef)u=}wot6HX9LRSy>ze+m$A6mx0xm;? z-<1J^Q#S?|OQ&GgI{rn8(dKL*Yrc;(+g5zFxykZ@^5=rABPkKRqab5iFI}T3lItc8 z@0)Ul%1tlCg52ogcE_rK=IB6C_SniV!2rdYYNR3(^IkF%I*!MF?7G}Hj`D; zjaB%*Zkyz&dg$I9=a!~WzSr!(p z)x7!f{9w7FewAU+(m>wzqA$`C5M*u)f!YfT@yc@YuDUfRSZ#DgT-|GGkLkKvD3z`; zDoSsD&ekyYFkV;`UB2HDy!(p!SwWDMti*P>~=j=4Jj6c4asFLfkjSoH%SWblxXL6NAz9$P`kWV~zS z!lhf4L3)NK|F>rdeea*NeeCB$^X|wdy)U?>qh|d&AmN6bQuQMKV7zG~n`>L3z{}z+m*f-vomZ$Z z*U0X@J4IrG~PfXAD7(4428UtTES5lDV6_R`aTh(l*DG0%b! zHk1-K!I0;2p4-7GoyRQ`ol%A_`B1~$ilIDFMDj0TxI~~aj#;gvnyKGf5vb5k?g^1w z>7BkKqhdImY{+QR4l?Eow!f>3R*JQzDTqfCC`020o4Heu8Jt)ju$#^pfvG<+oO>L@ zbRn0a?usa)IEym_Ev~EPV}3&jh%R+PE=aVU9X^QnnrQ(HRL=FAK{mcvfK)p zF`cS=muhU%o~i3pFUc1kisSDMpN%fd#>V>rny)Vu+>SWN5M2Yb;irOWSy(F9jndbM zFfZ%EEf^Ui{8??(Sk!ycCi%$9qG9~-Vazf69Ifck(j+fE4zre3&MqZy=Q%&y5_Kl6 zD(IOlob8fd%roruMaYX79WR9c2On}kWwAO4f4mcoFwPG_N`6-D>u@@u6#ArkT+U~) z<&icnQ>ZsKP#)#l{k+3v_LV!1y0Hh?B!(HN^z`KqYRVzYD^)Cev`(pUg^yG-Cc7l^ zpm9Tg_IC&~xXbE}Ww(@pjH0L%v*<&+^ojOgxqLy4MQ3 zGFk%J1(CJq1A^@Z2(Ux24K-I~2y_yC;@mGoG>@|@Pih>yLc6*Sa|%Z?D%c?cp{Xk6 zxj0?aVg&W0Yz#P%W%2;Du)YD!xbuRQ5B>+lU_k7t75WEA`TTe~^a_LtF(H@eM}wV1 zGfPW5PVokBZ9W{T1bq%s(UoWOBjvqBn2g#$_L~S4H^+n)u&f?#T$|AXr9Gp+UwPcS zokNY>MWTDAv`+cbOY=)%X=!Qx&NUhV+N^kEy*T`2n1e zPS}n59>>B+dK;hCaEK6ho>}I3=N~$Qzc$ro#;Il{W9C0UJId^qLuGTH7is)7@;t4` zM=s{ckVr{UiJXB!A{;u2{Gn&hvsEsg{iF%A;Fx9H=vd$|bk353Tf2JwXWByjGayBX z-@wv8`K!XxPr}kklZ=RAFXCY7_Nf;gBOsKbBS^4X};+^8R3-89K3W zQ~K4t*5E$TtbL2Bz0!P#Z!|~20r4&hI=AgC;zpK`vCap{@nsNKmRGn>zZ!y@xBZ@s z63O+X*+#DzxFr^Sxq~Kms>nESmZ^Q4b|km)_;ud5OVg7Ol(F!uhq9Y z%wMQw?07r)S~;WLs2w?LKzA0x!5nErVtFw^Wfqq7>O4F}LpChJGlp!K)cFu!toDD7 z9Yhd=`?wxhSXj1rYZ&1`FnSFmV)v`x%P8%2PtD?h?pw_4l>**eyVBA3GJ_{g`x~c! zl96E=2O$8q74KP)H78bXM&F#n{W>G@#we`sZYph#hYY#CbIM#;YWaCu(R)heGp&-5 z4B6ZF&21}OX4Rg`X=J*au-hyyFNI%r4RSDw$#;^^%r~Tll;Q~>T0s8^8ZaSGUYG|Wq9Ig? zN=)C}vfVD2XumQ~GN774Wz7+LmDR?YN<=RxgU$L@DfbDJk&b6aR!3JDa?<2ICeIE2 zsz1v>a9{a*%ZtXP2e^ttJkgyh5j|;b&I>jV%cUlkd8_>gkFjdBNiqHk0#%H*8&(D@ z)l6=`HX7roe*9kjv|O+^&Npa1KqqL@erY{0MU+L2U|;gL=}?c$ebC4MBZ?uO)#IJ@ z3Yu^VjM)r85BJ-JnEFz4{1q4FYg$kv-RqEx;E*H|e)O=3reKb6Y-5;V%EA<#l_=mM zq-rbJ(H_rwdK4)PZ!pJ)z_7g5iT>>A#kbO7n7W|&z9`mb_tvUbZrV~i)&Gj0xmLd$ zUh-J=qLgJ8Ph!>KM&r8bO!K&t@~x|i+3egd-V(p z1_cQ`fYu%VE1Cux?Uhxz`av8V3BIUk1lQ8ACqxZ~fkWhk19b`Op}I@?y^VnbHMo+w=75y3}Rq*!$b z3P#OQzRz89zb{QI@6DWz+h9$N*>@0!!@^!TH;aY4#0V|LV|5Q5%s2kT zz3T0sW7QJ2-|Z>^XFdzcU)VVlmOOB-dpm+?PoSf^YG#zHL!v~-;p^q~*weI+hiD&d zM?18RisFy*+ns-_8daIDq8PbgV{859-mT)%Rzd!)*IzTIG*n~#hxa8dhx8jw&3+Uu z9QGzwb#}OH9QJKoGo2CbaB4s&ivFS&bl83(;kTCQHsy%MSuC*)c|j{OVp+7^e!+A< z&%XHPLsA?;rX(ZG_wT>db`;9MVcAP*kewH71nr+4uH(idsj)O}xT}hGWxtupQ z)kA1|iP7O;yOa9;QS(V4oj3o)PrzV9fEv<^e+8N1E9kY8P|?uPhal%?9AYVtgNZ8y z$uavD0;?9km20xvALZw9cfYh{wYY1qOFo?K>R!Os_jbi&{e|^i;~^#+HEH3uw01An zlOd&N&wsRZztypm9M?PMWgbso5lnN2IpJMx;zE8#!lZC$WpHj!=pZAY; zs12Cse)Rn-aQ&$P9oLnE^*wW~7T?9bt)rynPBih;C$EQ}50p0laC63a&Bqby=&>eu z-+8>$)wF3qt?o(MWjIs#z)5PZaz6O>EEh+|K>1|_9{c|8yxZ4G9>|*4?T+_tz|eSk zMrbsdZ%R8#r$k}+qd{QORkk-*4jc31w+d3+*BaJFyCVAC3rRCNe|(sY=ubmG$9-#N zCidh=U^doIYk98No2Z~{x%@l7R?huhR{zTCR?)olL#lHN)=TM0iZ9WB;)0$7+O$W^$qs&%}{SC&(F-0!dT zxmX4YzE%vkf3sfWqCjRah#}2rn&Xd6h|cbKxO$VeeaX(fS<&MS93!c)jNGV=yT)pD z(|mqXo98{np1Au(k9~cOk?px?5B7N7lHG!}#kRvCTumEyB@Q@>#%D7;cY~V$(Z~JO z^qbS^sxo~)TU1fg0iHySQPG1gtUTd;Lzz;%?r24t?kPh_y`QGCfgLir0!m7;b2XcV z{zHdrAQd=~)fdgtX-)m^E7pmt?p)8)xD=Ahi5efLM9^%#zUsf?&S$mEU&j~Up=_>` zHHOUY1;>YEsOe`g!!??213Mp+F~}L42)f?rQT10Dx^WvF4Os_U6=VA}3+B1(IeF;S z!#%mZmQe1cvx$*i9xFoT8HSvDi0Ydz5^q0>CL#WGxwdM`vqeCK6iCp;WKa>H!oOPF&DhwX|Q9% z_U?Z8nvGr7Z2;JeybfzMP*H*kzv+}0Hwl-M0);n`eYB};b1*gQFTH2sjFe|$gcq}( z2s8fDl0^R$5z?oA7rNbM#B*%LU6Q89W4LJMCa&sOxUnKIuVZB->S$!q;qz!$+h+ZC zq?FdBnl{3;8o{K=5|Ap)KHDs`9CE3Oao*A<{=TJej7Tg!#ZvHAQ)E+kYJbDOL6MjB zXI2Gr|KdM#e;{D-S7j3X3iP0>_4e9#N$CEPMnTY5CD5Ml;7%1f(GSP^=vl4SNmMR- z-HGhAv9faT){y(1=&k$|V|bB*Hp?8nLCm}xPtX*>p^+&cv5Pi4C6K!@{!jagCPu7BXQ7)NZeUEMA z#QYH%VqVf3Tk*^)rq1vW?2Nr7{v%;aYS6Vr+zBtRpf!x>#!Exu-VgUMqR^pXt6Y^< zHH@{bZw`)7TPf27u5r;RN`0t*UDyvhkgG%9`-gs~ra7u78Yhe2G3UPfl6a@XduZ8n zTl~QJ5FOcpBn!pL^6x7#spSNTNNGVDh$ZSz%5MDotk*ge({K5IN#c7kz|j-3tGd6> zco`8x7naA)`MlRXFkNqQ{qY%2L52tJ+PSkb5@L?3#y7HC2;QyF)qfY7|7JUj=*G$Gep9}QXx^Q+RxGURDsqzI>STo(>57f$@{FkC z22NYsk6G8dhZ<*x-L-UFHs6cw1PR-nm}_f(`RiwOmu0!{@r2i>|LN z%qCgmcl&A~OjL>y!1B*vwi2q*Kf_vC$V*bKBn{lsytv-ad~g; z24+8q>iZ*2;rkf%jm*M|vXWpvn~$iawAa-!I)^vLuIOruCJ%hvUJNTfqImB*KeWBQ z)!LVny{_8d{4Kvw!u{Y=mcv2rk5?R0lxE%UWz7#tJVH)9Iby>p;i|PTromQgzL7^q z6shC$2lkwH}S8x8BeNXTGo)yhmS3Tp00~%(riy5y*M&wg>8&`rXzmf68m$Jk? zO5Sw()p9dSt8FT>m(O|1bxm@4ap4x}k1u+hzyq&}tTPpVz>%r|s60;*aICK}G_sCE0*9)#} zOJGE#@wIU^Z8EsxMwbiEWw=tv##gboJEZXk(&iP z#S&0G*9f@_-DtQDNWW4HJ?f_T{5*n@cj}a1Nq}4KVFqq^PNknCRgvHu^RtZS#XApqoz>vmh`sMMV_vd$14mvA>RvfJ{ zk~U>sY1SRZ;lc$r|=O2*_hcy4EnolY+)YB>lm>X)~fu*sKpO zr?wQnopLBn@~pdm_?luz2idy{BA*g}q8sn&$GI`1^wai(swEyjs@8Lc)^&`1_7FNhTr!2Xtx?myfX&k^7o0(`(ZdX_*ACwlu$Tz6UXRaz!L&7I(h9c$%tF_~usfZd$lA2$jAd`c+8|o%yKnLR(cHe-h4->D!XjGuRQBlsw3tPO z=fz9mGZ*DUBQAG0M3Vy=^tiL9J*&1l}U!2R{kW@Kj3+x{WZPJC~)`gC!&$k?~B?dF-W3O6^N zS?SsMStt=5i~SC}hLohxmI-!3Q8)E#ti9YnI2*Hjb&e@nX6`GWMDMO@o7)aM9M)d` znGKg_-x06XJF7B#C)D=2x7a%<9nQpy#QBO@f~oJkvBG&NRu5f5>x(X@e4x=xhy+2^}8kDG!h zYRWybr;39z;$4FJ7pO?pLb!5-nv%NotD|(_wgy)-fn1F3o_Mq3@IRM*Y<%V9Ps@I) zA)d(5SnklNcu-hM@hRTYSigSPaLD&5ufn6JBXC2*g$kt4;)~bn(N@D+p2 z@UfzD0U9?8^KaoWmcZ;FP+z`U(Od%iF8<<~pb{4|z1;i(bAIgm&mST8!H5@-W{j3` z=svO>=?)L1Ujv=wAPj*`>!Vcxz<0sy3sW+70LxK8Y9B}!d5V374Y+o%X%%{)SJ=H= zY<~w3rjy^gpS#Za$fWkNNjWA>qaFhxZ1ZY-anL6uFJIok1cbLCKZ zGoFy`5arjYpHt1BFXvWTJeG0k%^yj=`D8ZFy>zd~#m*Tz5^x8GRHT{dYZ>VAvp&p% zdp?fqoh#R{86WVi^%L8lubLG3IwSi6^QTM@z?c=fcuVu1Z@v|^bvO0;=;o3py9H06 zy5wWHBBs5$K|kO&+7k-YNH^(oeaZ zd&`VTJSBnJtDo0Pko!OEq8ab(CZx5q`O!dgClZFpnov<8N1yfw zAL8OjAy?p}N7sYVlHkU~vI!n}t5f1Px4c}R5S@8R(_f@!AMT%;$?rH~r(b%<2il@uJhGtFMx}J3Ry}G19m$nmJ?pA6W-!8h@MJ=An zp`}}Oaz|&hy3ZUo@>6(9Jo7&n%~=anu_Lc{paVSmI&~Z8=~B77+n7tRx6E8yZ(OmV+c(!1M zw#A1hMGTa3a4AD-2k4w()l~p*Dqfm)(IC#E;_${A00i|wOQrLCvZUh*mdSR zc?$_o&E>>|$6;}Y<0mQ}Wi>vDY~p=fxwU^sXE)H!-+y>=7yepv2EqJCG(nE5B%h|Y zZFyieYOpim;i#N7 zX372~9Dko1E+h(iD#~mbNMrH~hCwZLXYG~@9Mp#w9nz2lW!~nY&^5hp zx?jrjtBqq7;!D&wdFO8NRG%EYv0SOISm|=^lkbIh>&sIU_B#&xKCe0ugPt3NGq9ww zFc}}%sdq(%zl3UwEt**gbt4F?i&Ks|xYJz9-8t2y-`}~qD zdB{XHt-)3ID_;531yvj~`x$JPRGExT#n zX^aeZp7Yqa*LI=1sq$1YZ}nnW{4Cpjw%vuXkwe$US=+^5W9a%|@sLD!%;=s*4+cQ9 zU@h9*t&8)C>lmU%mkslTCS$j9gA-`)O`)xL;-w^Va7mRYE)pxp#f+b(3-YzHU1HG< ztu*(x&t|xa?h2F>X`SEFkQvT=+H*uKuvAIu@r``ueMh6bH)g5#iAh7qk@F;3wUS*9NU66K6ofHb_EY5KK4*HUWyxS zZ;5VeypF32T1+@-yS2J9zeLT&7-z)QoEaK*$XdJGW_{?pggH9wRB$-H)+e}kfoj?q z$wU;1BgRkczSAQ&{xorlPG~zlGZg7xe_!sQqFXYj;I_Y!Rn7jlsU=i&B-A8so_N*x z!zIQS+XE6JPZrLZN7Pie22U7L;O^+qXl1e0O>BrU;*6X)%z<{(K^rIEVX=*1>Xe zfc4P!lWk|U#bzwVx{bLXOY4i)O@WTLYz#OP)p4EI?>|}Mri#%T=GuGy%zhZvt=WiX zt?eFhLH~0TQT1W$^~&8CH}P`;=W9kT-qg=sID$K+Cfa*2--*;rhJp_p`?Ycp|1^Yf z5&jgB_^R#I%jc3}R`prggCCl!_`K2j>J2)!kB(Dx&?&s305Zm=^|lX|7iM`ChZmH$ z%D(C8+;uNeF8=)U#jr`P;fv{z>#i+v-AC~MbJG3Kb1|mN>2a9 z0{rx^?vai#Ol*Xz`pQA&kjrw`Oo4y8=J)LrPgiClXHvGP;?mfcm%sJ*&$2n)1N)J2 z3kxqUw0?Xr8Wd%@nJUNqvozz|+M?DBKY_^7-V4i+;NqZuA+yPzD1FyCq8*E=Cij{& zy(fW%Y-yHn8muoGvF#^~PL z-SaghY*Z$RtzIZwU3y}Eb3~&j&3N9%@lSV?`N2X|P^=Fj>!NcQWfv-j@)Og-Idt#! z5A&`un5?OmdUKN8-MfpFoCMXA5`4JMpiecI{v6?1MxNAZ+7|y65N{4b`D^r75Nfm} zKv&fDM*s?`O$Q|hxs@tS;lxq)@jU`!pvoUv)d`h;j*_cwAM;ITXX1*1v3dp(*Y_GB zF-A$fjFXxl3>ht2!{q*^!Uf@e|IQwAQ+XsNWc;pYVVL!42tLVZ_G}2_69jL>(^kHg zIo_|ywG>1}Mgtn1#~&#`>-9<*ZoWvQ5r)3_LvVSbAd+l46(-m&|8VwaFoeCM=t)(5 z_d|{Pr$sh3P|l|f*Ztw1Cp+uh0r)2>lq(~ zr7ZaUnS)`{bz`bOSl+aX(<$O#ThK;{6woCcT?Z>2QBN46aS&w@W&1$+`r`Uu9jn0&Q?Kvygl&avCfRj((@+ANepoJu!CSB?iG$HT98EI;QZLrl2Fub&|r#_{t|xUO+qKf{PNGx60IuM zHuJ8P#P{rY;;|FD%dY*~q5{4{KF?Zj_-$s2@bmH_x+(SHAd_^@K*h=hq36Lk%v>iU zpE}3ks4JM=d4Nb-)|8%lI3AV$xaTRGwVBk!0lUD~)mwt9oS51a9hJcB2NZpmis^?r!x-OyELxGOVK zP)_n3e^{p0&wKA}r{C$@>o*C|&xPS(cXrH0p>s68TBdft*x;tg(asL`JU?qn+{L_* zBD<1`H}FuOxg*tPo08e)8kNN)fCJ(H8xJ$}Z*KZR7f z@f}Duai;^BLVAL8DPQQa86g1|*v?@rQOkiN*L&?r_TAe(*D5+mlD(kmuafmQ#Y`g3 zs^_rzLd+dG3}R=yiu6xmxquO{9zr-mu`v}=?vq5)qHZ@AF%9FQ-;E|ZD zmgZMupJb0VMV45N5`RCOgEmmoUIi!KZB$l1&=lcR2 zRtXRM7|y4#qk6=laYM5@_vg0Mf0jI;Si3KfstOWun;eY+%(Lx%cduj6B6r&6V{Bqb z+?wsqQBY+^(89T z-({!&ou2sNJh`*8jRg6!pWzIg7jH)!cZ#UN^$?_zfBko)2bo1LvOdR^Iwu`EX=I5+c>Dd`Z8N__-Nf8IR+KNd7n2pUGCYVm7SMtl zBnwK|GEIO&JY`h?paEU|FvcKRundh_4uI1mpEi6UZ*OMGm_XP*b7#@TFJ>y2N( z(VhHqT)Z~0U_&dF4*0}LIa1r(Nz+goTo%Pf(c(}L!Z)7^p}@hRKyIzM{?G@R8vggu z{t~sf9%=*=-JZE=$NCVF)vizMKB1O5h`7RQ#I~;EA#z^6*n2$1J%LYqd?FvNH1M&) zIsQ^bpDys#F_<~7M-c4;`opCrS${4ykqrZX2ut;2hkI|qAD&HPbNdU@>mmiNoZ$!Y$o7T-A9S8Y8@eb#b+fQgY5z(s$k!Z}^+geYB zfwB8f{+aO&B|^l`8efc_-C!%e_B{9^7W-0Ny)kka_84j6&LLlnP}>CheXwIVRF z$sFix;g!q*ZYUGv#KCqu1=0V(mn$gjjarRSDU?P?YT3v~^3pQ=P-Xsrs1?v2;hNj? zU%I3lH$vh%9rO1#3cr?gUciVR1`{(HR4JbD!#b z_zxl=Am%A%kBT~-vv3`zywll3YMfqFJ0H_X4|wV@bL}=OpX!Z=dGtDegTK^a9DXFG z(*vvP$zm`)Ye27psGiqq8S0VF^LT>l-{SC}27BaX1(DWip&Ml?>xH&OoQ_~3<2 zB#0N1z@4~Vr!T<;h2W_(j09t=s{#Z%wZ2TpbU{t+&5e>`zcO+N9$X#dRtGsaVE*Ug zE-^}Ym!(Q0GcMh@3`DfM$pC@ZB*>gKM@A+D|2N8zdki*=G58>DHXVrKqz2Qzl-F6n z-&hrJYKX=kKg4f;^x#w*yH~{a%s;^ zLg|taL8Maz2}Mc}K|;VwNP~bN-AH$XlF~?XFPG-hAt@l;T_WAx-?`4b?>poAzV*%G zk6CMU_?>h1+56dhKl?f0*Ody^?COJ>kdTG*ru}+KhD2PLzK`f*)MUM%oyYvD+rN0w zDaFBx2sZr4qu)XTd1Kn7O(7;q)Pk=~A@APVd5Y2kYec65M|=x8EH$s>59qr8wGUwN zDoC&otTh-pBSTmkThJ>cBp+uvGIEOdBf&|yef>8xmC?lF1L>N(u$rFUu8Z%Q}=R(G^}YPcfAZm!A~Vd3!-4drnM@1 z1h>E0+Pql3vs6%e{&Xjy$1uEz#Zi9YwGsNqn(C$Oqs8;~8q@XItK(WPq;L|9Qd-2r zKpD0dM=W#(NO-|K-+)Z$Qua3&EP4fCIUPK$bm){oL5h&@1%i8sq@>>m3}0V!mZnzTf8CAOW@tjLoDNqz!dhrTfeLY!gz){H z%0Tt~FgS|s5{Lh7Sol#fTm1?NK*FS-YSvI83-TD)R z3}`_AEn%|+ly^FZZb#Ebx8sr`kX%Z1i!k}%-V>p~V^rmZY2awsP7TlS-hBS4J|S);0kW8i9kf5gofjI=h%6zlsylEv42wYc@s zzpc#*&G6$%Qrw$vYCCU`5aL=%{dacYW23t;01fyHR9zww8NfM5s0VE;tJmL14i3xk+-B}t~BLqQML&blfmZ|=84OOd60w( zgXL#H*X~WOLzlD8Elty*4`iM7G}^k8EJd$`G*vgfeX0Nd*trs&43}!&&Ya@WnDgd% zeMWX3#r?QUmci!bgvLig@9%A0bq`i_?v3voHt#*|SwVs+Ft%g#CDik)Y(ZH(;Ftf} zezY;0II*g>n^bEJRKPQU3OJBZM5P)qjJ_0yRRxYdD111 z&^wi2Yjwf{9#&~Qwf2CDdnDcIBw-3^YosUu)lNP|s2#DHG%|qv))oH8HRU6Ih?elM z3Be6&$WdEY*35SeoloxGdhsIcNAvV`@g}wj)gFt~*e|lmVj+_kL0H_O9Wi`xGDM!J zImj9YhDI0%D{86Un}hVK!w+&D5czJ?b zlI`I$SJ>HX#LDGs?u>X3vCxIEqQ9z`jQuSvBDL`~J%X94oE0foN=uCfPV{gnu^>fT zs$~*XqMvR9NYE1>2*HX*0*%hk#_8;LfW`gRJV4^Hznys68+3<@D~{EV*KXsxBN`=Z zNrg|mzc4p_DG_q*8I;y@=WPJg_JM(!k?n+@ssGO9oU5gj(a1H=e9_FiG2FyQTAo)a zXRP^j>9X5PxS)Q8X#8NVxo39e>;A7!i-3EqsS}Q6zj-6KJva+z9!kBr;M>c6VAwez z>2>rTP+Ek9EO3s?UT`!!&h@cv5o;B2ZH0a?Qi%kFr;^R1!mOC!sWCX@*mjXVJUSeC zvW&y*iTV2Yq;3-9Ku{4m$+t?t{0a_To{(v+VO<#JSlftReaE2%(^Sm@Vn|DjprC=2 zQ`rQ8qWib-=szJpn7Ly0cXpq!lOoCRCMRw4o$lP*5oC{GpNJ2rnO$`;iktsUkB?=V zzA5+I0gS=TfkpF#q~E&@XsC$MagqkB=Hq9^?_kT@YHqq+{-85bI-fMm{QE3vFSpuw zeu8!Z8O0`2HXl>-Jn+FIJ)_UxPgYR8B#@`d!u-H2ANOn|iQFYA=D2l}r8V^3bK-%;qgK36sVuH8<}=5e|&b$9ZDNeAf; z3SEcR`S3%v7 zxS*AG-2i;}L-65%L~0kLqy>FbVXe&6nRl$o23U@Ka!ztyo*gj>Dtd`7g8fHzN0HZK z#-Ti>N==BcYlNtF(kTbUIsbCkyyH}?xWt$IIOI7nd?~yF=a8?;3}l|z-Q4Ja>K~9W zvp-vq3;OK=o~-Ao4nc`7#RyC-0C@9Oeh$B7B!Sfax(fiQ@1g`77NC&>A$w%<^iK=% z>O=prp_uIxJaP17OF+uxL#{4B!%)xY2aFLvw@?RyU?7s@lbo>ZAF!z~f zPl~9jnCX#MFIi?bRwZgepo$M?g-FCbFzliMJ*s6crbDL|N8M)!8ygz1tw{=QMN*&< z1I1GB9Fa1GAZjT%?gF$YAa7_Y31?MC1U>$Mgha?mJz6&ai3W^+VExx8{Z1EeV6AK@ zR_CR`9gTAi4i5xUAp|^GbfMU#yE}q7S??yl1k@<{nYZ1JWqM3M;PJR>;4{?Eyt?-S zcZAK%He@3G;u4B)HV(?x)`;4{dtuv+W!QIm-Cs|0X-hbn{iS~>%ZFhK0lFozIN;MB z-8C-}hnKJ4+2RPCg1{U`%pT%v=Z@X@(c$V6md2zbd=6m9(5Q3MF^PRS^Ei6rsf$Ch}L z-N3An=e?C*-p-L90scex9l87XJJf35%d*z&UQa97TZKMv3;?$aQ#Qy^877l-aW_C7 z-f3+^`IE97DmF)fAVHVyKK!TxxrKs`4cO@*r+Jv?`#(W9q>I~-Ndw*L*w8VlgvrUJ z=wtrviAIA6XM*&AHPW}vUyMg-umQ}F{wt9TcCJiBw=7(eR;XT*p|C$O&T^}`Kk%ed z3zX`Eg<9x!ZL+58?vXLxH`4$@yU4NaBO(3Zi}8r7n~EAgG!2Jw^)ys6ODO`j8_fjn zm_(;l>tw3!3?S_;MSHwGGvV9pO{S9k_X|1&;_(x#%P-!lK$OL-S|n!k{mZj= zJ*ysMP6hcuFpQt`RAIaXuKWbCX(wwwKC^mo-PWHPm51s62=@ZI(K$-Z8g_zI^SAJN-r4G>|921$t)_Yw@U#b)Ac) z_zF416CL&taa!&hK*}QfmksqCYJe62Gc$lszZszaas>TYW;zXGvDDycE0*r8mlZ(X z2vFj=fYaUsgvlEo2L)to5GgQ71GKVl-in2uXPu4S*!h=a@@cgx8~Y5x@AYf` zuQ&Pxh|9Rb5mC|G!w%D_lUzD;Nvd0JTgQMq5X|>`?rW_A%qVT(-})u=S_AkMP=o?} zr9?q~>2{vpPVnH!yPt|uXH}h7cR}4HwmEZXKJt`XRBlK)YTfF7X@TBaMk)HaDmDi}Q}jlRd#b^x}lMvQCA6XEY1YLoOqs?K zNZ|g?DD{38X-yrTh2uTYpKX0D=7>Ig>Fw_~d6VgN_FKa%FYjQHT*ws@CqPoTQj}6@ z?Bz1p>-mxGJuX5c_JAc$!x(qZO}F4mPv@;MZaFJQ$(WyKU|yAWFLVycla2z;NdFgZ z;lFkt^^VuyPnnDnmQ(-Z5slN8thg-mh-dHC3w2^tEx$ZqO`>>wNfLk2SXVG}W!ddR zU{0v=J`3OKP^`ehoTGd18+;kk^8Bha0Zb1hg?n5?xM0K!U0PY(YxFl<2xnPw)13UH zFAXg%gR~Qk9)r?#YIoIu^YUp=)sn@XUz+__%W^5Sw!LTR%lJ3-%qrV?ch`jXi;5~r zOZR&B6Ippq%cV(x!i4$N-&zU+&t=t1is;0txt_C%4}s}maqQ5SA2%$YKx5tJ1kY5<}zhJF~I)0fW)^x8zq#8`q~yznBE`DKbfMP;{T`J^}Hej~7TOP#&vf&bxXyH*~ufa} zs2pAOeo?uv)n^{K5F7_50vSBB?+4RzW#Xsx2M-IJzSh1@>*k`<%(DFa2t)39J>tFWolOy)8dgPVbtBE0!dMcQFn09=wZpk$f zhll381DPUrD>$Rry{6Q@z;%T@*)mj%H%D{ch3r`@8D5C*soY^T>D9XP?%balfwv8b z-`3}S_yTRg);a$cD!M2w6?!Kq{J)S&C#6L}``^!}n`kbxE)njR<*QlQ(W)vA*m@I_ zt7SAjIWw5lZ-NI?i*n5uL*ozT+royfj;DvNBI@3dKTM$1u#YmEw7RM$^l1e~2gfv>1rsI_%q@R>H}S)GT9#M!%5lSM21g@X*o4Wc>M`|T#J zWuGld10uCCbdw)ifAG{AmnJEbrrI=%v(t`nXyU6<%}%l-nReU_N`ZcUlr&{Ipk2TW z{U&}y+;G}ZF;IL*XUw1#QF-CZ)JM^cuBU-`GP23@Fbp0?`pF4GP$5oeQ7GH^gz!er z=ZKkK0vGi&7_Jzo&%A_ASS?CxF%#fZu;p}j|3W1b@X*G>{ZDsvmX@c3TWi=CmUNE{ z3YT2=E0Fs7>MoS=!3M6QaLqRVX{hvQ~2~L(;ZkuelIVwX^ zx6=7KI@4ngXA>2edg|pl{oJFy2nxQ-x3m(!z*M-d;_Kib{#pBxs&L_#@lz$ju3d+0 zO?e`3oW=?6U45AP_(w5~hH5XnUkmERW`d?8oII1=12uJ=#0hJ(*9jsGa*u~^el$Ek zx4RsOd*9XbECrEEq%noupdPAW-TB+L7FqMNNfxV2Dq1!-lZ$_fnGl5&5&>8)K1TRv z=@$jLm*Ceo_t|Lk+=t~PTc>04F7_~sN&>0gzr2lxO8niYQ2*VFZ7+GnCRITOKRa52 zdq}Hk*j90O)pDx4Bi~_tAwn(x>NP7CeT3)9RBjtIQVNC4OY{f}fR#F7$&i2Uizsaj zx{B+PKIQe!Wh|ofL=K(JyxXO`EM~ZlWB()w>%*2YH5{-4~aE^3+ zPaqXdeA_*l2 z#ehQZ!bc5H32vaxUCL`R(Y6;kSOinbjYmTQ)%9Wm62Ae^|b*si5@?O z0DGWaz9IKYWiTP$kvL>hpePNl*Ap!PAIL^1mTT4B8>*6hKM~VD`DxD~)51IMTyA1L z`(A?ygr+fFg|HIp6Z27Lp+f$rqdX{*Eawk=QgXu!nBR_SY|PWK*N16XCq+GqihXf- z4xN=tNG<}EnY}q!rIgQ}>JH@e%ss8V<35VcQUTW-Y-(5BlmNwR3%zA|!6SA{a|auJ zKo%ev-s5{_n5YCO|NZg8A$+Z>zhKls>pLL<8A{iVSeP7CDI&2)LeF|kU)bM0_E4*G4g7-3rSC2$?F8fK}Ltp zH>VUv`;U9hLl@8GHetUlzwter(&MlcLg9c{VChz;FSM#t>ZR(`CcTj6p7XQ*aFT zUyG)A(5N3>d^{}&af9M&j7&_)u3M%e9beBw;gt|-INVOE`+k-_obk|*YCuWfCkh&D zQ!*L;hLoZ>*SyD9&u)zggEHF4Lzw#W!9xgR`$3@ zTf+5cBdkYjvZM_blzn>f(D8xUWQ7&cZsB;C_~M7Bf!pnC;tZQr>u4GDSsx;<^=@CT zjH^B-WUzFsaq7fsPv_&5FyDSGw@p%|64Qyd{?kveVqnKozT$uwmaQpf%+{cn=N6TOHb&*2p^+!=(6yf2Qy9>NW?t)%!d(nDnKv>Sd_YQ>B`s1E{h|Q<0c|hc`(% zh05Hn{*cD!kGz8q6SeyogVZGWY-deR$;T8ivf*2#A~7Ao<|V9Yis}tl+ZFE*JcKf^ zXVp-Q$<$EVCx6<^ok#kaTlkd4?aNJ;`>@`+Ss_^|pUNvTUyVx93tS}Pi5laLN{HTR zxfx-X`-e9T5z^@!$Bu8`V(G-hrUduMpFmgCG8mV^@{>wCU&)+6YY%uQC@=wpI7wx| zJIf_TZ@LfuKLVPHtpE0eo|tItZ%+?Lv*T=HRaHzUc^nWGgC-(LH1WA|H~>0anepW{ zI4@f~(f`F&#{Tgep{3MYl@}9;&+Ib#yPx_UGNHNf0tEi$0gTC6J5SCGfBn0L;fxA- z9;sy;eSURvEbLC%A&lzfgJmtTTB0PJdjWbi(cQ3byHG1JOr|D;WP@`uXVvvhXyN87 zkL2UldyG2{Sy6Z356BRQg`9oXGGDkzKdcd>NEPjMd&3W_G04ShwUQ}js%5k zZBn2M1v4n_TY-sOh9RiwLni8NdvaDU<`0uNK7XytiurX&nKf?IM$g$SGPcLZkt$SC zw!}QiU8zT&T;)VoT*+akn1Um_Z)#P`s@eBVeyr_S3B;Gch}uWAg)P|_k5jhGLxlN# zEm$oa*B`%h5fs6=U8nRzMHuwDhg0QKyi6>)&xar2Uyfm zf4I8f8zxcJcKI7O@hVb9;SD5uFz7knhy>_TL!~eF)i%P{ zuo`GcO@{x^7MXHOzc_MgpYN=f8RAG1xwgR)Cz=B z{d`t|Y-Viq1x9djrk;78iTxX461@_|5FZoeAsqdrt}u|eeU*GPW$(4b%2j*#AY{(T z@C*O16nOb**KvLp15MDx4_Xq|uAmCurL@_#A$EnaQA3oGQ0cKl*wT6h^<$#4yw&Ei zXFp1+aL=&i%C&6Vw{q53T$bIk6LZ5BH^AeP3n^9XD`TT0oRZ@+NMz~xt%(SsnF=5t ze9LhU=ZAPmqQ=Dg%U{X7*YR>?dkWVX@B-FNZ!3wHcGUC7HT#V@?+Ct!6zWf0T%(^u z<0>Ba|4OcTMV%IGQ@lq{=n7dKX_WQ`e)IFub@qiPO8u>RRxurgFOgy(f7^ekQoa?& zzuIFws-z)>33t1+f1=k%Tdg-mPRafAW&5+q<#nF2G8cENnnj_PSZIpG0Nk1`Pw^mnwrxO~LcL1W*8R%BCEgf&pTin_mqYltOA(-CVKU9zm!-fd=2-0Yv_Vt;Wy zh6=IM-DZ7~Te&d79dMkZ(etD}Ah(;ju-=UTu^Kd23Z_31&R=7vgus>PD4$6*gnr+Q zm$M}Fh(-BK#i+Za-N>zuzPAE9k>V0^Hlgo?NLn~+IV;U{oXU4M`#O}=e=ceZ1-{~# zh5$s2y3UOn?{!)Nbl^7C-SNjJh9u&imHDcT8Ih=sIc#SJ@m6NHF<0A#?MGDE>M6Qv zifwy%XsYU>ng?#w3?S5nuQt2WQV0pf4Q1X$r94`7dg6qAQZny_ou zTqa?^QP-AdqOm8bt29q!bTXKqtZK*4XpL&nzZE+es$TTzM2-2@WCE=jkD*`S2{x!b zdeAhY{jnHdBIIJY@Ca4Ki=z?8L6Je)eItbyv`Ck>JCb4Hjr8s=UkqzZ4BnVz)oJR) zV&2YJi1+&l_C}toU}f?Uwy|52C`9FFJm+q=w)PVE`3#Py$I*1ot)EAZ@Fq7CUr{Kz zqBW#0^t{Sl-GO{_3=Nz*sFyLdDd{ZBlv^jPXN5nD)2x|?d2dslu;!1EU1<3ciRp@< zp6c+y3?L<)lpzx-DSYMaP&4*7HF~EqA1|_S-y!O9Sxt#;j7%8rNf87_0nlVUAT|BJ z0>tlPL=YqGjr(Tr$i;Id_-C2~z)5*`U~0@{FGVdA-JYZ``VuB-&Te5#)r7pI(+Hm6 z1Cal+!F>D_t$rv`g9wtr?^tk-d+D&@1T84c`Ans=XGW6Z^{juFej|I6rf)|hb&U|a z_$5Alnd3U&gn$8~Tc!1b&FPYI4evd1kQK4zUSl)$6}gZpZGZErZe4tSgv5TM?K=>r zxVb0JQhtT3^G!jhs3)v9n8DmMNO*3osEBjZ_W5{TaIOD*mL~O!MDx?|L`wZf*4@|) ziyI*m1v*zG&vpm8rc1=fMsP8O=|jQVvDXQ{-1rw@r2TXk?GZr}ndJQi8Tl?a2cekq zn5^25wsbzS3Ts_4jpihl0#y@b4dU!gy;wNnKFjieHi8K(U0N@h>?t_h7YfC>VN80M zS^`1g8csRJ89O)|;!JG8KRk?x^E57YWz3oI1iuv3rJiyeEwsk<9kqMtrOah~nIL59 zUsiz^$pxT~)1l~)nt3#-ZZ5ALQIpo2iabp^q({*ijtWX;+ku>~epB5v_TnMHN&u@( zY%OM0hr^+j_A5t|7TIg!F&|u`?ug{Wf3>mIPd_!GD}Eh*!`Hk(k?y%KxR@aXd{DIi zCPBad<>ehz5ZGYNWY$?hp*W2g-I*Y0Kbe?Vg&%rkw~dF$z{+mke@|ThaZ)4k`l}=a zLPIO9Nj?6nq~sB6AvDx5L`Ag?BS}rorda(hI}W)jXE5M;URhXJ&b(@X(uljh`$}-z zzt&$!gC3k()bM)qsSN{xf%g&2N(Xice>XxQSW4=1cjT(C1yKcwNo5*(RaR;44uW)vwbI?YaINFf_hZ%*Xo{;f!z}twk8$>J zNQbHUV#G85dvyo;3e?lUeXmR{2K09uhiCYl9c1}5JbuN7*~F(H@R@}U_*hAF%Hcn2 zr4gPuzC}x7A(aDC1`VxiC>vL>`J|iO&u&fnAO!E0T)l#*8(A0iiG00?0Ri;Ft$r~t zrtIpX@V)p~E;IM%Pd}EkTK0+tj&E#7r(L>BePDy<3;H@~3|QAVj8S=##3QrYLbg_& zZf%5@8atg=E24S*gKc?aW|`JAj7?aj*?2e+n=CZ5)B_Lv!H9WS{^>VW^?fmRtdsk+ z*Ih=|`N5L!yIX0-KTi9<=`GKyOE#_NR<6O(OH9ENW(oo~L3#~$4DFAbz>K^JFP0?p ze`ekoLRDj0z0AZ;a8X03lEhtYZ){|Sk07R|*jT&R@yO1qEcX-cG$Br0v=LoT4i2n& zFZu)AD5B$x)ADKc%evodt3G{HW9@x(UTZVii5g%!95y@sPKBeu7`W@03VFWLR3 zI<4jP#~Zc>I>t$1q>Rb-Vn#~eRGrslPFRhn0GhWJXC>GX7rlz>UQidnGO)WX$U zH9n^Rw+*2A%A^d1Q0&z~4QZaGkCLWm(ND&A)(3(2Gt~;@YShg;=h|CxY*d7Ct^j1uoV`3$g^(`UEqwB^tr^ax{`Syy z7=cNX9+#sn7Z7@h=619zwF%017)X;|mpEZvMlP~cT!z5v)nAK@3G7R#7m2t4#F2H_jho9c8vaw zta~m;+~h4nfqCx7!pnYrSuBH22XZEl1@m?=0PBQXj_JtV)m9)DaX}Be_fgH-53d%8 z=i*GLT0avjm@+itFJKBm9`%)Hp-m5NeWxH>COT@x-#0J_%X~1bG}l6O6n|`LuRjO5 z)WN84%k+c*JW1D~YW$I?5=kQQCNtLL!YU;h0_5Lsh$@SVK*@=u7mc4nD5c8s@$S)A ztQl;qSDg1leEeoQe)5AyBX*DKhBIr-js+}6@!DT3P^^$cEQl~Rk0p8gYAhaxeOy|a zvijljd>*#vj_EslmF70wW8cv4Yi@Q5JaZcG(0;R6Lj+GzPoQHpwEGy1s)qF;{f*?< z->*y5@4_fQ4r)%6z=Du|gwkV!+v~M|5eGpiGyOYYl72Yktv-KrSmMBWS=|Ocxq?Q0 zj;!S<^N~~N)xm6PQ{=181>LV6;-_q=;7XlM0h>c~b~!{iVYH2=O2Y+THZ*{^`B86U zwWa;J0*zENjhjGTx4#xDk!Rs80>aYjt&XYe#?9$ZNw=0Tufzg{>S?DxI%{&%-lw3R5Uw-Vq-o!+JqN^a#`m#4$n_ z{($=fNVs2llR&(6HbTryfz_vdMdA9Ag}o{h=?a*l8;HQ73VRKg*buru+v0Mo>+2J_ z2@v+pUikO0(U*=L>vl9gt`4yADr$iEzS06wAfzGu<4Xt3Z@5CL&$&28npLy1a&(Pf zqYJYGy`Cxxp4I6vs?}x=4Iuq@WCIEWtg!qvFQz0>gDv%!nEn?Y-PQavncR+?LlfOi zd}NiUxCDq(hQJF&0$@zHI&*LQfy85wc-5%lbUft^M#O!y{n-j|0NzF2BE9U<;HJ6O zF;5y6-&}O$H}SV4@hH~5=%_vduS85PtS7P$-}Rj}R-A-YOucwIDy$HYY|n_B>~dSe zT)kS_YywTk@CH`D7XdgGbc2H1UWJ|Z$5JCsC(!S&Gt$usbQLEJT89%(zbrMTBld$u zCa^W8+K^v-v)q&l$R5?Rl@0>+@{+;0_t<}UvqogUh5UVEt21F`#~e3!a^vZ9H5+NL z(B*i)-@AWj^sbB0W6PP1F%-fEb;CxUzF>Lb#f!7cidfE^?&Avy;_}^C_vT+~y7NL|~me0y7m^v>zV&~2TVDa1hqP922ZN<-M0b5|wnE(SkN2G5<|ba(q3htkr>vsm|PJG`maL2=*AHjFEZ0%=tm zhLU_aU?k;NG|507`o+m*a%)ijZ0a>Bys}s5>|t>c?tKqX`q>*@wk{*DXT@6^hZ5Jb zYFx$-jez=Cxv{P)IeLn~qS?gRhOHh+a^)k;)Q`84_q&*$SG+>dQ)?hT0bR$g1*yE52{0oaglPPHYlY6Q3ncY3%JL#Jj`y zV;Y}hwT?t1Fz&E+m7^ZcAC{Ma0wEN(Irtz<^V3E0u{M2NHMOAo!p_G8$DSOwm_hjK zRGJneH}0ve9{F^TIXwChk;T~-NVwl<|}TT0s|QWa=0$V zbbaKUKah=?vfm4Gi&+$-S=-WWMEp$+hpn$4VlTqAXGSCv9k)0cY}eLX@lK#bPm(gf zhz_`sW|W`zjJG~zd9cDsk~n0Od`8}}II1dWUNHteHnGv#=%?v+<(h#VWbO!dp}Rjm zH2t{rEudtoMQJj;%8JNMZ$3GzS1%=ywmTPZCi`GUnmEYM@=P}-VvsCYzha@GqV?Kx zk{W)J%|(+cMhj+D5q@H%hTi}7obS8=Vp&~(0o#;Tzc^|><1z^Y_tj(eBSqk`4x7wN zq}z%de+tUGWhK7|x+|^awqH9#Vjeu-O!4w#qZ#nkH1aFXg|IQZxnW{AvWB}7J(0<#9E+!&N13sHTF)$KPF;c2>eCP_V8o~y8W7g~d zFtbBLc1`1yf8v2kQ+gMV{i@e?2AUHXp?FifYV-e6j?mXjR0qVrP@Dp$cqGExq8`Ke zH^L)eL#>g%R115)6pJ2;V0z|!)OyhOz3{^+Ap5l}GZQuONqw=2!2*Wqz+d>V#6~o( z&vdGQ`i(ZTz@wopim?xC&xZyO9)6F6m%kkxCOQuMlw7Z7q~wq=NlI<5_XEC+C3O%G zhbLm1PknCbM^!6fR@CHI2E2kuRw0yvlL;b_AVs-L_k1dPv8-EV_294=_haHo0_D_+ z8(Hb)=4Xb3wQk#TI^hZ%!NUSr##;3^)6W8!UPK@S6Wy9+5<6ohi<#oyEw!6UqXcDB z*ePpH{Y)ojURaq7rcPF5lQR(({je%G6>K}QW#6$=hTTZ@MW0*aVX@pEUemI?8_p!% zHpJaErf5E6+$B$o@`RPq7X@tuU2W)S3bfg`+QJUzW8ot~$|M?!7uVJKCEge*R%l^W z#(J6Q2ogQ-JleTLu($Pu=_r5P{d}UL#Gzi(n$iKz%cD%w8d@`D6Q`$+53F`nZrEgn zfxpzTSxo9ygP@^ksOc#F?9eN!p6sovX`mQK`3_R@ce~&*)Q^r|&H4mmLab|kTdLbf%;YLe=)DGqjk>Tsgsw~_k zL7NM6ZQBh_y9{NQyE=A;yr*4sT|Eo;3X)qPH>al(8C&OVFt8*xVM8(QweGV&UD{4c zf59r{j5G!0T@&I9@9>!%L#9+t*s?uo(IZ!2V|+E+NiDW-c{~_QHtH)hUl53`@qDZ( z+22$^?xGUTZQPkHc8N19Bg760S(R z8|~C#%%{h)n$Jj=h0`FF*Ol9?iI6QykRuD(F$aB#GSHup>lR!uFg6+YH?L<(Zq;Vv zt8EIbeiBm81$i)i;#Rdhba7@YTfYV>X;b_bzTpnr>wC|3&gx<=jAkDM#m#g@7CzcH z98eh^rGnegoBbG*7L*@oU4@OwpRlcR+>I9{awDBIJl2YIlJENVT}PU-X4_m9`|4W8 z?S=5$L+%&bQG41;qpH?yEqE}8r_wicmabDovHvc-=t=+t{(!aekNXM4QPCWT4Lzed z(b%odny$_7MUDwB`&(m;o#OX4^!1&&N_tzP4Ar5 zB4^rBdciN~Gp+2vn42Z?2w-O$Gfc_#s^h1u7Ctf51233Nl44s|7Y-o*;kOL%vKHoV zyp^n|OO`*McU^Pq6U!1v`a7o)1@AeJ#rkS{;{I8hqSxg=NqU)~M}j3GLEGbX5||KZ zstE`L-3&#(OcgE|6LMRpTK2M?%N$SJr;Fce;BstXs}*;cmW)EDYadZ66xbxHNf?kx zyl;l(_|@Ganw-njO2TtbWuc`H^VHE{@Ww2hI(q&pnm+|^$44};Wfnvn|2 z54JABw7=N0;a>l;gRTu~4KW^-R+8c5hx4HTGp`9?OS;ZnEv24F)?MuCD{8*?h znu=wV;;ef4q_jKBAS)b_^mEyuZ*}e%QY{b>CHkp8cvA0Bt2mga^R`a;bx)B26N`^L zrVhh9>(E5eXz*W6kvEobY+q%2qjU%|Ngo!|$o8_p;ZPDR&Nq3G*J1!H%w2F-T%&&? zxKLAek)}R1(dR#utsq*EAkbB#zW6g0N1l-M2I*Kd3G&dGvM!4c^L>($S@{9Fs?aEcPg}L>M^0@UtQRPNQKcT6c(y|wKtUfDw>>} zJk&oSGYGPs(UV@~sCtxFFkD9G`tp=&m8tc zT*emQ*AR2xa-7i|fZw$n(dt!lGuJs=ujM-OG~oYiLc&E{WMA%<3y|1ChGO--n45Or zq_tEw9U^rAJNN@B)9ER>-IL*M*r9|oo}NZ@S@LL%kxnbT?5seoHGavjaIM;LW6VCQ zj1X4W14Iz10x$_maW|#Dv>&=mO+EXG7_5ud8^o(Lo0KvtC+Zs`1QNs#X`$ zQDftPzt1-bYceT+t<7BWZ+eJVF7Q5NpilN^ZTJbmqge%Ax>mmELtai;lXU12P*GY5 zG%<^K2I4GYf86ve)#Qn0(;94vQYV(U3i>*aPHDTAA3E<1rMOW)7)4D86!+#%N2dC@ z3ptyS@oi6;k8`rL7j%o|_{{RJb8AK}{+Shd3(vk8NhM z%TvV_+R(kVjeIc?^5E~2lMn-k!_1t4_Xl!$gQR1{Ok-p`pd%O+b(QFT{+RaD2eex1 ze(J{o(d16!!AO*m@hg@O$?DYC3lJWYJBx3%9IpzXw9t`sz3BZQpW#unIQq685E;CV0*ARw<87=)5{Zk=hlPU7#nvooWY$=I3p-8v+ql(;Y?c-H^jfa z$%qMGFtjHu?_*}vg`4SXNPKD&7bZJcyHqaBKk~Vy&GC6H~v6qkutzkGLLXJWYAFUY40^5 z=nt^WP`q@p$DV(v1bl3x=DCF%Ndd?!wI$q~|+AMoeJ5 z@o=Ra`Mc-R4~VNA%#B>STb{7u!yNLE&YDs{;TEb$eJ5D%*16uDR0o}Sz9DmadqpGtkw~sh#}er;yR%OJ}jW zhkO*}2$Vhs1qUqbWX8P6A)76f26LkQbyKvGaLl%z;L3-Wq))+j5Q zv)5PgDonX|{_mXt?TKe!ujO5KAxao=7R$y0VW08+3-upi(e_Cq0Z94xYR1A=9s5em74?oKPH|6LQ+4ERM;PYiUol0 zlcY$aMp*(Zpo4_>RaX+ovyr2Ld?X%)_t6(7vSnHFY`KS&t^1EVEcq2p$a)QPVIgW+ zi)CWy#pC(x7RL)L4+5DayU`TxmO9CiUat;5VQKFnV;RK0!_vjcaZ&%e6=2CZ*vBJ( z*BqBNJ1y%40|AC}7Q#u&n5DK+swLIJ@lzUkw#|}Pw?WR<>a2w23wj#K4zq+cPLNR3 z<7c;nVPo&!q!80IpKiF4HpK0oQ^XmQ%*>NaStcl3Z+w-$^yQVa;f^|o;6)Eg+AxCtErqEMgg_uexZqIYYWE!g<%LCzfMYG|lmCe9&2 z1ucOPDp~n6z9YK@gILg7?a?@VlevHZ6<2z)FA!2cbwCA3c~HyFTC?$$;jOS61{ng` zh{P?(>z9fV#{BH@!`rWAiQKQq*YL7|Tba0kVi;R5kuc_+7HAx*U!s2a!}}0PG+OKk zie($MMNi&(ke5*|_W}R*Bp4X*YUKD@ciZc^_)`ocFHuqS9UL62cmBa%v%Rm4jdEFb zAQWpqJQL7#NC{q&5Ho|CfvB}n`oj~btlb03`A>}o2JM5hBbRM@Yj#ZMCxKDH3kcHB zyxup>+07OkoAMb0n)nEti=8$niZe`J%X!F=x9jthB^Fn1uEKIC5nhXu(Z3#F_l{h9 zS!kb@F{Uh@iFgbVJV|#z=?FH}tVoPm#KC=BsisVVDA$$byYXnX5-`D^oMEf{QO&BP zFG{x@05q{aH{YY*G5rSB(2X=lo`3sn;)RJ z{bm*Hj}4LaMkFP0rC+oXp3VWz8l5XiP^a7fZ6XroHw2K9hz0+OT}c5ur5s3h7US@@C^&~ zFgTw4YLY(i^K+zZL3a$g`L3io;VqO{Z!%U(j`twDs%4>^qvA(@xDrOl^jbkGJZOe* zS|DT%<6tU$NS37CaBOM$q`9z8Y!dGc7j*H0F4UlZ9CX*WjHuerap}w!V>X@qp8DD$ zyHi@1H$VK*9=QuD`&1#57^IlQ;rrZQJii%Z7Tu7i^Qjp{^FFR97U|l4S^i*nJ#)S`fCMIBW0s9V8rmJ}7`f@#*K4 zcg$?>v%4sPVSub-wnD7I4fviljHBTEm#WWksql3S18?5pk(p}-<2%L3@f}bsyepJj ziMy)Y(q7~pSX$|-J-*>@Z6GuG`3WHcK6Y{|`8w*{80q-CVZPF{!^5gm_KhSf8)eRc7taAMcrTDa_6LLv#46+8&e9pi zzc1`=F?-tqdx1$}fLE1Ja<~v0jPPHKZEg*Jf1MBCNjH<@k9j&E=rqV81Q9!{vZH#-~ zo;sl9>WxHX4F=ChXeQhu$CX+V@VK@c+OPk?$sEN@64`Dz& z{G(CKY=H&;AyqlVj3;=pWOG3fSKJ1f2~E{|8U7Jz?_q5?nKHmduG!uwPAAqEo#Jk; zd?n|&jgeXxxu4Q&@kx!#s`)5$M*X~-#jSNIuu+UOOZs#X7r_!EaJdW5>M|M3Uw^Ea z)Kb;KDN|efG06D4}OiTyN04LJNct+lw<@O~px#Phf=%N>g z#{|NJ$AX&k_a=wC?bX5ExS}aPyj*ZdKhq^`H`z2BjSJ`nu|-d#RA>8a!f3*)U2{ z{y&Vp1yt2pA2uq7gMcU@0#bscv{FikGy+oRPy#9q2PCCal#mdl1yn-d00-#~X^?IX zEl5ju-F=*S-*?9Qee2$}W;x7SGsA!H{oB8Mo@YO$vXiKs-OiqrK^R01oKCVgW773$ zaQ?etckkhRUlmX)3WPu0Bi;3$R?}@GfJgyQ=amqX(*=M8o5n4m7X|h(`!%f6ky!zk$|J?nJj_8bi=L1#RyG zqBlNxN(hPB(RuFfjZ}8@91(+H=+EqHZd@SxgHz?SWWXE=5^2KL#ix7Ne1zpGoM4gd zD?}2*K@ona?S~|8(Mn+An=STZiu;iL;Cm!C^fOaEM;U-@XTcVVpNIsNUFmWsZipp) z8XH{K%r4qL8nu^)?qugo&OLa>LKq&^&tT|4)4{=2~Y(%&PPz))Z?Zk_M4{`<=#tY*xLM)slvG&&z#4l9h()h2g+ zvS0K{?WVq=$v1UoxA{@+9H$Bf?3^0T(bM1M3_$m5QxzEX##&UY=BYpvgW@XXDCz%~ zEl-dTrzXYG{RlD!Gc?NauxBj|*H~Y^q|uQ7zf`zD>jd$zay!jvHH_n2ug4NV`BXPv z@{U?2yQwXjN5*5O63^cyLCMQ8a6W(wxfA!|YLM?P8O0Ym&b2$|(y&@b)mI4j=+mDV z(+3;$3x9@kDMeSqF{p0;gqv{zyv*(`k&SrsWQ_F^7^RAn(_v%&Cab&;;I-pD4D05b z+Ljwqqp7$UNa?mjD0M?@`lQnj&K&CAlB!^LHJh;^nTK|X$S1tlgA~2f9(0?;7;PsG zA>vYhWL!-<&YK&o-k>Pc$z!*b3W?;#v?Y*r#(yw-eDSf62nC@~8|NiC6GrUYAEq~; z1aW@GYV<);&%jWE6OfdsLnny+8R@;6nW?UkyB~FD4fA4Cs&k4Dh}>s$V1eVF5PK$i>HI{?>#WXgPnQu;j&y~|23 zexK)}XcWIvOM_GI`PLYSFOLA$N-nIw8*bwn*nQD{mbes#V{r^BRc-I8$_j4eDUF?W zo%V;svg|uHKe!Y~`Z4?%r#*^XoPWdC?%oED#bLKCj7Qzs%d70Yp$sp8E8!d^U;Slv zRosb@xP|^6{38Xxg{=FiU0kPipHSC2)Dh6$=YFichc#)_fV&7?gAy9nI$EuJ?;uTQ zX`qtzVt&=4*qz)Sk^uv58?v#HR7Pm2ozyWI#Cr1X8q#iH^H?vD@99ke8m}xKPvkYMOkIQcCn+E$H8l-*A z;VjV{f5yBY#qVI!M-|$d6Dnag?$AlIe#gG6S-WmEKUKxkq>nmudbh!9NTBLe<9?i_ zR_znf#pvU`Z^B5f$3k?t_dirR%-BU?W)JC8zFdEJz7+gip?z1Ysp>I%Z^o@8@uI7* zHupXT!j3EZcaKWHDImz=?ji^i%Y-TEGAFAS&?Q{f-*Or5nIa#BT_!lYGI07+?dqMI z5C|J{r6aZ}qKPWyvk`c-l&pA*$C; zYxN|$rRdo)#If&%BZJ&e(Z46MHK@v^rrZ3kl5{yacfNqmOkZrW2V_UvCW6|>bkERk z-eV&34QlR|l!7pZTFD9sxq}NsOsiHWyUL*{jocA)w~c^MzWmDl zqU3@2ytbdON#g<{Ie`abMoJi8`@1*!cM<_ey$t>U{+SokJ5@bW$OPz5TRL*xAo3^O zElYGNm1%i8| zDtwerX}^^;o%P578?fe7C0Vc^$Ui=xa$E09UvnJl38|B_OA~wf#JF-j=235A9?dso zc)?6qGr}99RxQ|F8&N8Ha{b!zXMBaFXjA?7QkfH5MU-OV`h4>rQx@p>2GNVb~x~oZdF!L08(79v>tIAIR>Fm zURqLIrm6cCox{#m#&PVSvW2x~^s->OXWWa^cpQR~=Z}y6 zE>L3%7me=WqKP@y)j`Rpq_Uw^Jg9Y2+x(I9iS*Fmd!M#ZRZppy?5Fk zTWSla6kY0Uuwm%DV-!DP@(kS$t)Lbe#OJzS9kw!~=<^%;g00q@THzY|NumBu9okxI z+!j`L?!7!xC5gMA|2g1z|MPRg4YfG$^VCOhn*PP15p_dYX5P|QR9?*u)0cJaUiFl3 z0qe(eQ7MK(?er(S^P3Q!udfHhFxBsubqEhG%D1UUCq;B&F;Bb=%7LQ!Hg{h<#}7_D zt1X{H5TjR3wfNIOVr%^F;`JPnJ=aDCFzMMv-k>x!#u6mx7b@6H#2JN2y>gT@MIU(~ z9Y}B?Pf0LTW0!4i^L=lYXV(oE6gH4L^_^SZV8}b$Y($A~TEPi;h}rxvQe-itf0qqd zr=U$*(Jyz{j{HXVg+>`2c@S#u{Qi!!>c+K0_Alv?gwR68zpl!-J|{9fp(O3`jY?;7 zM*Yxl_xb!NLI-r3S{Uwm%?$PbO6LEHR0j^cum!@@ z{GB{&-{qhcX$mlqNrlth%R=-0RSxZzQgEcppG3^)kX(`$4y5 zxiltGT#Yz2pkT6_aICPIJGqa^H_0Qc^Q8mkgqHu~=CO1zao`W0`H#0PO;L)P~}w?cz34&)a{ z!Vo+e6?)MAPZ&Sq;JBwq3ZdZo%cAjpg4sxd;L2?|2W? zd<4#U;p}K@ap^$9T?5UXFpWyif5my; z@#rpcoLyXQgJX!_lh7!G)xXD*9_Su0Z@}bgL*SJQLySij`?d>BaC@JmBLYD92l?}% zV1pcS0mv~aK#Ex;eT7&7JYJ0M@7F9K{Wrw3o&t-9ftnI;He{Ver|H4iB zFyfbXtSPo|f%3;=h+&GK9~H6G(`qtuyI@nM-N?Mc(W_Ih-&3HI!iO{*@t3&W?4hFj3I-Vz$Pf0MmfXdG1 zf9&J}l>{%-D@?Gi)(6giLVIp??G@r_t$qWXd0rWtPqH4vHU?l^-=JLj$h(-_CikH+ z;lFa5`GoqZgQ+wlAA~!;l$)vP$Q8Bqb*FKnMa_)>LiT1^dj{;=2602s&{2kHInf{t zO?(canCBhFc{G^D&Of(`(PwcQ|3au4-Q@ktq`w{cPPIcd@uSN4N|TG?>Vn1nwz@wg zP4b8Qa#vYzbFxtrt$v#hNK+4 zc5{1XpE7>fEYz-~aN5Qp1`b;wgRRRf&GFRjkE9N~K~J%T6mATZ?ojU@`FwgU6!&;C zyH#J?j*1mRR7YB1E6Zy0_`Ub^jY|xY9~CauT3sNB(@~!b=VDW@4FokK){y6W)TGNx z_>BATpWBa4V`7Nmo*82oPd2r=KQX#}#sew;J*TRd9DGI@KTDJvmz#`U?b+fOHNPj3 zq_6o);>vq|~yt4~ky*5-WosE^2nU2){y_5;-qX{Y-?b1psXj~_U+y{`? ztgc5+jL-Ae#H_1!7AUcjLgfNZbLjhR7wEGe`k*LdI4r}$`whcGtqSf2dw&bMmhUG? zj#ut=IkTdxiwjW@w+cQeXSp%hO5QqEU0TGxqO}dTc(I?yI`*50#Z{y%QpRZ7FeDw1O<3 z&YMBzy5oY^5N?5*b4xySF|rgT`%hV5VApBMoCIXn0{ z5L|?cR{lh1O8<(3H_4cU(N*I^pbgCw5Zy__lK^nMV7R?wkrg%3JWTt&b@Yk>IqH1) z!Sh^~`5r|)muOXQ8-9)?-1s=P6r{?W<59Knwb1cun>X{V;>c>VQvC&c(l2!LK56B9 zOR49JUgKvGuuAV`T^5eGN!J7#U4%{Y54aJo)E_d_+sX;?hJ=l|A68W z_>mb^#J5Oz)|pOndXqLN>F*eFAxxd^Iz_!1!2WgKO*B^Tj72C64HX{3JE}wUoj*lQ zC0{UiY8wp}nk>YFQm%rWBYWYMGj~9n%cJT+9@CvzhO-r1E2Id2w_!SMg(#4!_?{3I zuRT5}7_$EK#jN|=R~A-hp0($d1Iv8PLy+Xxv89CL=TdxmC!Hes&Gr~pCr~x2A4X zBC~KXbZk!ukptu3w^^=Lncl4xuReOkBtKADx$hqL8nr$Ar7eaASZu?7;2{B z5wn&()NdC<$iL9-N53hcf$oBi#Q=uP`!_!4uSO7niHHg;Bb|;PN^lKv1rTQtG)Jek zM0^>6=RW3rSiBe&Z%f6DM`3GJx0nz zgvGn#r{8jk<1Zfk@k5GH#c`LxEW}fX*<%0 z9XyG;vnEYTA1Mm~(k)kgQf1A|5WG8aWP$7}f05&CA?{PpoVvbOSq?-EP39-XY&b)P zxl?P!OK5YZhrTqL69+|M1{B3ZfOwIUfSTjCJ&TEvR9P93aGXI7PSv~V0op4L+HsC& zP-7OUMFo)0o}|C`W!sDH;~wCN0y&Ih(!9Sw4gUcz4PM6x+sL&6VH^6tgl!BY8a@wa zUm2Z>_YkCY+iX?pGc0A~GUZOmLe^qLNd(xVcDlm}**SQ=?8m~`IXKe5lqyQfgoDK} zEV^*$RB^&Zt3<84dH-(t3t9%7=Y4wWxaw;}p9OrpldN(Gc02YDmRWl)WUGuGtUL0x zSm@7eS0v5+^p4)IWSh3r8^VppNAK1)*(J9Tfro28ioa>xwsw1J{gWq*#aNeV+qjWm zg_GB5?vC)uyRq=QZX}^P3-@xg5V$PCZ}DdJXn^tfr{#OM4rzpWlC^ql!C?#n*+v)N z{ZJYn*o&5cenw`~6I}OL8Q=ggidow#Kn&;Hy#2t-ci21>T(_|mwc^YF@>m+m^}#n~ zRTw!0n4fZJjJ+Xm#;kg(k9vg#? zw8{L_c{)w(HM(B*hhBX8FKD5!0G%!}Xn(2IC;@+{sWq#I<}k z-*1~3b44Jv)&cSrNbc5?J_{?Nh$$6V&|b_(=#t9xO?GTHPK1H(NjRqy|CPLT zTCMW!+bRmnrhjjdb>b9T{!h56iN?o~|KLiMCBFU*-NMeJ2=tS@h2Lg!sZ0!9y&IVf zRHg1M+pw+?&Ldh35CTB!@{VRY=BzS7Jh$9>Pof1!x4v|Aohz~5_bOf(i?irmya;3w zb**`>o}~3lj`LY8tbez`q#DJDN0N+$fR?eJj;xk@os{t1n^*Qmu9H&(lJE)<+b}d z|5hhTU@SPOImp^VkMw2X?05vh^bYt3R*+u+I@m4)2>#trM5FcfEE;?tDm!PBa%O}! zlR8st>{a$v#Az41Le7E`>OLNi*Y1wE8S%3V4qB_*$x@j--}M({OOiDKeXrOEKiV*s z9}tdeoybWj*2vyq>bcwxirh~F7e_yepN%Vw3{_Q3r`H&?gTYYN=f^Leq@u4X?vUE9 z%exaRkYXiVHBRaR0xMP#@A3-Iw*T%FP&4=C>*9~rh@$t%mSq{PIdXrh)QlKmEjr^Q zEjS*UYBExmP!cAOG&-DspdFa~-Z!S+Q)JS50T8#hJjwWe(s93-iSg+2k3r3eo~FH7 zkOFtKlo>jqjVlP| z2WPKzBTJRWs;OvDS16obFxc#P)RnjMtS`98{X>=q-x;LPT0%e&<2e+F@(fIwBIEH4-O2I1145m&~D{0!j8f^v`{$A*WdA)LSSTh!F92VrRh)A zlahwiGidTTl>wn3ke_l_`$7Va3Ru2V2^Pun5?y#{U{59@l3b667HIm_228 z{$L)6DOjRkB7sADbmI3hmm!<({!^^{xS`esLv=4Ql>h1;F1Eof&zQ#m57;mJ+lMN` z>l*Zk3qYVr0u9PPU`_LhfWUeenqb_A{mxIn%7{!^*jYL_P^nt!dsELXDIhx22Q&S# z?Pgq-m&RD2=vdR`EnZeu++S^&R?P4{{*Y~2Z3+;uRR9s23nA2Dy7lTT0W?C;6@gqG z(d`cmuZ6<{350I~dH&(S++c}mbWMce*tz(Vx?Sdn?*b>Rzj$xoJ#MPUUM}#iS*FWd zAK!PQ`-NbxI+a7b+jpS3Ob~`Q3+`T$Z?w5_rM?0aDH4Xf*}j8TsAiGAUiI=4pQ@B< zwGu5aR%fbgIm>xsD*8I=$}|&dQoUo=Y4gOTn3#?XqseGyxqB;%mv8`3nSH!Zg^tf6 zQU*(vVbdsW>WP$9+0wb^pcfk@bIgwsl_~TnnoRy}e z#~w9tSayX!tp;^sLSKtBu>$vBqEr=L&`!yEE|6MJTz}~PN0u{zkxj8JNC>iS%Vk{# zHM4D%Ug#rlBsv+>vM4q=Gt*BoWc`jH*pHV?cG}jFnHh8aoPrr){-`Il1yVy!`oS!} zrG`wT2MAO8&gOOve-wsoQxCDNFFd$PPDS!ffLP%^7HdzvQ(1vE4ikCw&ODpi=am4_ zsxFwp!g`wRH{RdaJqU6Z1Zzh{GuIy^^}~53xoQ%$F$olIHCl z-n+ceJM?00ie&k%Q21Sa3fnZ0QB0rXUND_e^WLV%{&VxL{v1)eTj2l69-EK6xm}W(xU&Wu`w@5fo>c2W86pD^e)klV3uwth5unUo_3lFY(hOu-GqPu zQbx0;oCSw<_LhAL^)-f8Qz9bXzgnMN3cZ=*Sg$jtd1;?b+>`y#~Ya3Uj)3&iw74{B?R?J}7$}@m(eeyaK8LTF7tFs=Pz( zqIOMPtaclb7YV*4`nocun?Lh%gkG^({n$2z#P+bBFCJL5*Lg*&DKDPpnmkQHU#i=P zz1c4>g=vZk{cef|!;LcXUwcYk)H*G{mK|qrliEk(*#k|O^pL_RP;TcS;cHWQYo5uw zh(S!xOd6=ZC}5fsH<3#6J`F%>KpHTQSl>tfJ3W%5kHg3lQQNWDbTZyd7!8jO2C_uE zn(?J?bW2B5(}Cs`;+yf)DEG^yzLIyLVE!ixG|~8Z(8 zLs3V7CvY9*luks`Ga@u~N5PxXhjm%oNY+$_Nbu1B?4g;_9%?#XL0;|VZAEO69BBiu zPn+7HwEAH7mkzJ#Jkk}ZZulfB!fXSk>Pa?@n^PAuHwo07x~9cPQ{+Kab`KWQIwhY} zguyrG?sJXA&Vh^WYYgrvgj#LEE2=km!!W5 zadW+#;yhB+r2mW(U(5u_nOU)zPf)xrw`by3qMcG-ay|ORt*yA|;Zxs~I=8PZR;%#) zk==*OC7*)E%Tk(#L%v5TE0Dlpx1p2?$7mb1`1=BCHbcs;1Lyn&J!YyTQNng*oxCS6OU`NS)Wi@$qSjq(SPSG?jdN`Q*FOy}AclUx@W$BK(!nV3pOs}BEoS|%<=N(xge`#a|5yCTilYaQg1iU_{NSP{ zU*AO#71@-nzh$T?j#~w{;YO1>E}o1sJr6)mOO|}L7OXg4@EGoo+DlStX41$6RWj9I zRdTjb&ByDjUhz$0FHB6sCE=CZz`ONgd*7PTGuo`ChAo*DJTWX_c*&I-|Vb6REp0~UGJ5Ngg(qqhq zHws{iUE#!kia0o6L>zAVrnblAV!fA|FG$#ANBl;F;QnqC%(=%1#`yfc@Z+!3f&Uu2 zb(NeY0}g~$pz`!;J@tV9p;za|Dz^EJy4ZQ-mK9>- znEHU(?f(mU@#*lw(>~AuIkPy~@tsv?2-nC|7Sp5p|IuN&1fe4Vk@Wm#X%L4>uj%G} z3zouf-}P579$`uom?eR9FN^11X_?@~!_b@@amlE1VX8BC5ex48t06#EV4nS+&duAd zS~w6Al6tdS=9nW-i%#jT^X9RHhhZR(8CQC#G4`_9a?;sUI`@ zQj=mb)D{zgCsrGZ|6vM z&2A6^2zemY{yz$5fEW?h6ROj$D4$J=R_#AgB;`LSu(^LiR+<2b-sWETkv4=fU!%LV=jjPk5 z%697KE`V0#om%S;0}j7wS>=Rhq_7atX)U#b0yPW3)fg}5Ogj$MEqM`-Trnc!^mreO z_}x!JQ3Gs^9by7#h#Oa3%J7r?jQ?8!HTW0HOodBB-S{`OP;U{;PKox29K|oW!Gw}i2U8-$WS(0u!rm=2d3ujxQF#`cTJQf z>SWCcWR*5-cw_{5O8pkPHd8<1;F|{M_1)yq?QJ}TL9oFb=Z+M=)ra5fjin1*olu&oww3wp@6WvWd1ySX&cPuyE#bAB*U~9CNAV6kE-wu@>X)Rs z*$eg)05fIXqipytEY;qM*eCDG)S&B^MGe9)Z>C==U0eRfg24e@-8&DFEeFLrHpN0t zZS!~dS1|^5Kh!fSJbGh{rp+iF@q;~Wq7>ddCaWI@d5m&iiBprslpEUnWtS3#&Rj@5K4#OCy^W`KAe293}$E4q1N+jbif58a+a z#yo9)Adp+pHa6iv)T<6(`*PR2z{XQ zp5~C9CrFgM<)y8xk6YsGbTh<3dp0O8hIPTib^%#V#5`HHe;SgLLv(i?rr5dw>Z51U zGK9b>IbUE&Y1Jypl)G@0Ho_NXl!I7)hJa>D#fmMzAS>t#cPh%KCHyaA`<=S|!k@R_ z923j1a9qN%<+O1u63Z4grp;RzL#pUFbke_QGragLOCNb){*m2*;F&Yikon36H%Vc8 z4ugv{Nw=N$EzqI=cKE>*;s$gN%KoD?IVZBy_hx+R3anPvlZ=94c?~8N>m*0!vyPJZ z;=PBhtR4m1XjH$>*xTds*hxY{db#`^T9;dW4du_6G=oR}{8w`3&ARBiFj zRH)L(TUD*p?1(t?{b0^S=jI&G?8+8 zz>1(Kc&4-ho5`db4R2q2q{YEmaW9_#yG-0?68hdSKz5jXVL|75-DO~($l@?hZ7;}) zoqV=^7>H2zW5g)gRyRI1itn^*=td+9gks=vT3=f+i6CMcZm6wT9Tp4SYT#Ax90|); zJf;uV5Rb#Dql2oyC&9ppQ*JcwYa65;VsA-pC;ZUzVIC1m_NF$gxfHl_nIv76n*fCH z&vzK{KqL`kyF82B70;T@RJLfk7Ofl;ED=e@u)xRai(-HJ4Ij@W9GGLmss=wE6z`iL zphy3=did)HV`*@rEXLPe6L4%9ZW!-;FTE4vXG3{O%~(_8c~pT(z&*?OMB9K*_lTEv z_9!Q;V^w-I5^i$2^E8LR>LB~VRi00OwLR__kOtD6jl6Sxt z15g6{740Vdb46mhT=AZ_|JrGo6!=DD^rKL+g;sdBTUTO}H?rvF z*!a|~(JFFJZHo1eUSy%?x*uCM)J|_@P<%h%4C3j-O`86-pN3WX>g-iA%KbdEx!6U} zQybnh%Y&DWY3VPo@aPagR54Nf)%E^=^#Cv7%|~6joH{VHUVVHm6zwXh4)4$XColnPStGrDt`4EUuZN9~6MO|ckd+Te?gXQD% zgT(~0)f4xWR6m#K{QpLH>5S*yb9}lVT1c}Qo;_Db2Zj+8FKSuuNGy4rwK}6)A~+(e zSBg591zIl)E8KB*&^YwMt=EWe>M;6>DkS|ejxPrUW~PhGagO7JE6*>YP(1}g=*pJxLed8RO_Ch?KNBa4o}RimiIwxAc*O;M!)SrGn;lInWqPqSgbCZv4xfBRL>$be^i# z=0!Rm?e{-N)raAJmG7?df2~S0gmB=>TUQR5jOTx(q*foEPMXDb1+6Epx0MFa(EH@9 z7e*7MVSp*ezttf}qjPtAcSsYF#QU>5FhjIDQ2{(fU;6z63*N);nZsP-nlkh>tjN&K zo#i!oGwXKH2JPZlv@&Esq0K_6Xe}zVF0m%}uv`B|siN`Mb%5h;yRI!Hm^r4Ujn4$>4R8MSL07 zOIEb=it`5%R$s-3i@A}!(@+!t_i*?Rd`*D@zy-U-X;U;F`+lIXK;;_4Ep-%*a|%XQ z)5WB?D=Tg&{QF^Ok5;OL=vbxM&q+{UcR1JXBdy7M!{dxbO1tNVCUuD0k+&78@*j3Y zAAj#x^u#PINYYfOBPKTbaWJW5*Z70S_G3GdXm0Qr(EYa;10odq<+yvcpz#u4 z)aSf6X?3ul3^i&_Czhl~V`8<-#b@UuCNQ-WKcUUL{O_v!g(SUNKo8-Ibiv?v^(x7^ z%815if(9(tMz7-0Jo|N3E7bzRd(?qMZn0Y*)B6i>e0pPe2|Ve_xD{0EiAn`pm7G;; zezvaFwv!`ykym|ur+Z#3dJpn*_zdY8^aYh&JeMe)t+dme^rae+Y?{`lz)9Nhewn{| zDo2TVOJp*qE++>MM*plyplf6X*+1dYZBw?bZQy@Mg?!23rIK?v{HyiyakZ*Apr50^ zP2vv}fAK>pc@TX&XTqde?KRkF$$Dx`nq~ix`(N#ZOMW!OZJjfYgq0fB3-=tc|H%X5t%LwJi6Bw38QWGuS4@|+G!?h}W~y=Bp0t}A$YudQJ^F~f_WL$m)_ z=;thDoAkTCc{NyXfkoB7X2pBuop z*Q|X$ZAnzVX(2qjA!dJcW8^4|_xI#r>>q-iSNwwdYUshjU&**cz-mMEyEb5_`SV&b z$dK^|7cJEJ8H`rAo0i5{wd{A_C$QnwvhzI&e$5mKJTd;-jd&a87NG+ybmO6SiRoCLyiaC^xI}|S$c~SL1mGTql#;Q9q6h1bdVs**6Tvx0J<(8Q zs}LlM{oU)SS#D<^eo!vGF%;bSwqagmGz1$1P*9_c*yk?i^%weTnsi4MEFsVB4T!;q z;f0K`V`HTLEC;DX0CG^N`Wq7}-kO4i$2#bZmp+=1oSdt4*zVblP7+d?)8Q?#q>acc?53isn6& z{>InK(_k}i$CK}_34_T2c~xj#YM6M5RbaB6{VH;>a**uZTi6$^fl8q_D2Im}RhF~J zLUfrNSJ964hgL-@HvRq%bD_&@F9J~4bB@Hn!56A7`i_@CXd|b!9)v>FF*y`_e-;1_ z{!?|I-WhuL@B=_4Hh}k&>TgSrX0Z=JO$rCC9JK!TZJMcm-ks9tYb5ctRcsz%(xEni z^tN6x^xCor#@962h$>Ed?+6TQ(o6&>O9-Bfw0lHG^Rv?$F68C9e#$BDNSa?*pFWbu zm4agUgl1)cPq?G&0lo+_h5u3_B%j*RIz?Z3It-yUTz_eiST=7~$~= zNpW2^r2?{yYHCS2v;howMr1eIZDIkPs>{0s5J9Y1Ex#|lt#JHQn#gUJAPQ{$dsIaw zkU_oz|8*Ty4EddXGm*eJ$$5=$5JB!?((cPkS=ayAOIqk)gE_#C_L&#(VnkkKTd4#x zz~Cr&h^s2mVoAlZxL0FmaW5Wyrd#3E|qm_3sT@{Tk@)c;r2 zW~X1sc)91ESF!}7FF<$fZ(xZ4V9!*fqP#t#DY2fKq@Ijs} zSy<4|n70)Mo7Cz47-3l9Wd-zrxSWYLwvYk47>dWAqbP>ON{ZwVtd(B8nD@@1e*7@W z_Jb+fjMa3U+#i|={hwZv(q~G%ibwXh86HB{JVW)3nCFPeOC~q%o-fV&P(|I=Yqz*^ zs?B?h1(Q*(?}mRBQ0}6g?OCNf|tv zq56lHYs2iakb_n{MkPBVtH{_Y7y98*Zbyh*^(2{{hbhH}_m=R>bL;q<9VRaaX+ASo z1IZVaC9_llHVl*xd>-i7=trKfzFgG&^x6MbyeR(X(nvdkLu4dY+Mx_d!44R4#%WRC zL30;fSRJ2>3S3zf2LPEPXwVu6u;G|o5Rde_pJWdBDK_Vq|JOglt~y58Mrk~Y1A$qA zeni7mIo_yBE%-p2=>fPJ^VEI^_h^h|9Nkto-sTDe!DX5p=9E%v+^tx3Jo-qGgwzJY z@8(o_3vTsw!)rEw8ZA$F_~d-5+)-Za6>6o6Gqnk}pgz^c=t0TI)OWzY;@iUG29ws| zH^1-@r5^ld{z1&aN6lhxv}oxaO6VL0!ecP6&hy8i&tcjZhur>tpbcEWC3l!5tPNdb zF){_yx#F)nO^O8^1B#RiKi>LQ6Bu)7m{&)#PeOA&L-Ax?t!n|Z{kAw24mjr1RJDQe zy6UGKzI+`K)>HWPMsDVBJ}fgBFCbk@+I|bS0`xV~uI5nWi+fN*~4t+2#hBC7+=}j4i~hwmJLptAQt5Me+jbNz`9$E3=tf-4BuT zyEvTqalQ#Cz2j}V4vNZM$vGWfj3YTs}p=r0P6>+5Ti`&T9vNfn}KL$yY z1zx`rMuqtLzU4X-!}hp_%qJ=i>1%=hhMQM#xU=x21|ym;-@yy&_H(?MXu6hw*oI>&mK@1S4A(C<@8~l2_yYdKDv2~6c;5WHH zOVq|a@Fmm`y#CDx8ANtJaD4xZAblt&?cl_#VsnY{d4M%RtP#iki3`cispi(|hx^I* z7_&4VGBWlL+#HuQGTNl0UAi++o9b-zt?SlfoumNd1f3fw4& zMs>ZeJs+T8two%yA};tRGH;hHecrG%R*f@5$R7M~uJrYypdXF3Z6^Okpi>h}9c<{g z9zq%(dM#vWpPW1xJu-Yv5W<)iM$s5{3BRO6E5sw+kjz|Bd5GNN3oH;NnINdNqLujA zdP5Vb=lGllO56s{hO3H9pJ68CQiCAeEX14PpJ&sG1J1_X*dLKRTlZoUQE2J<{KegC zrCnl+CJ@`?Pd#2Y{1FxHqn|P%ebFeYwWW>K7;Lld_Zd5j!LMZ#x%$o;(fj+mZJFv} z!8V2u@T(}ul9lTW)w zi|!6;7OotXG+f#lu3pJ5A7HeK5pk4NBYC0iYn+7SldmIDAP4(l(jQ@Y?3urq>+;(k{=nto8;kl9f_e`XX87burv7BSG(7+aXJHMvW8OPN5N`boO={6jaWFkYn4(Awj^KhUn{XJ z4?{=C2Bj8RCUH!1ac@4Ah|u+!THEB2sL;D*==u6>xXpWk15bTJpVJeQmU|oTm)}%3 z3(k@N%UX&DrVxa5q+NyL0#q}U7w<8Om;Nh01kdS-uinre+ed6XS8(0BPT0(R1#Zxf z!WtFL+y1djhwLv_i$~g)Heal47G6exa~`K}DAgL47Az&rr8bA|JNyHXPMdAhE}eEuKX0D`^Iv69(=<=8|6sKCumQ^i?k{ z^a?Rp-6aNZ#P)u_D&ev>6urGtQd$$3(e1jRx=c-T z(@q98;j-gTFdwL0M>uTn(QluaF9sG%D1%K$Wi@aq__f?mi3_Jp@fF1hBZHSUr-u^+ z{x8~7l*QQxE|!QBDm%HK!F@b-*2|buzIQnh3xeaY!{MCB|5W-AHo>OpGWztJPG0yU z9ZL64C$#%*7q5ojij{0Y`h@RWK7?UDni3~*2w5CiNBiykBD`i;ennd+U=fH}6reQ!LmI#))&4^znZKKra7;E znT-mtt8@Mq6TK!TCiHn$kQ^90J-hL&%agh@x}KPkx&yH=eagD~qu=uxvUze@EQ!6H zegx&}S7_XFz4$z%^v+JlvvTb;j(}y5?)RZeHJ$=VNIdX}Z64f%^IT-i``4%K)0cIu z5k5bS=9l&D2v&O6LV2R{%zI+tH7>00Qc`9vrbl1qmV<-O32Zl}fC7agiwu}-oqqG# z#eFMn1|d6O3{qeVuK1@@LfM(X{gjTDg8$F!5=(w`2Al_{X^-$Y+K6}_T<@dtVd^XE zmS8Ki?WK^tnW9_@_1`qQss%<{))fgLc4?GJ90+M_I`=@5Yi}%knW}Yyn5wyt4N&>6 zC#z;SW!J++)U7|=s3}>V4V$q-!k@mq6*q!MKNH~_C}tyrjkaMt@&2jV&?zr*9{f?R zIoV+7+BdjDi0$)f9K6y5&WPU!T5O1TxtV18rg4hBC-1N{w_*`3mBmH1UG`j%;6xMk zC|Dj!d`J3YvYzS1h028w`ojBXHvZ%%n99ry4g~K#Jy<7HD^ccSCs=x=C>G7Fe@2=R zl7eVaT+d~t1pBqBE0%-jGdW=b1bSo+cd789oSZSuNxu3oCHMv5;{?|{b48bLxUIZK zU1oj07t43dm#rLYoP?v9<`?zRZ~E-H#1ATip-UVDz_^IXL15BzEG8G*eODJfOJRs- zcimu1ef7~qloMna6L>>4pVNZ#WiZ}TYCLsmZhIkOf7{1HA{(}RGRUDh2mDnCF$h4* zKIOX?hI|j*adA!0chuCD2urLWxIEyfpunn`KlU?0o{%r;6|9>}_-MFHnl5q^r8Y9& zRrl>#kRdYEmiO&3bN=a{VnaUTSTW{rK14F(sGD4|B&W6;k$K#zNzk|C_+-4IF#4=P z8{K}rxPM(|oV1`o>z3WM@?|ciJy=HNn&``Lnv&B;V`i`)r7D~m_@f5PSp1uxSjG9Z zDo0o)ZU><4=svXd9;}&bq_T36>vcLXl<6LFWqS=*G1hN5y!@GCB~}uR+8Gfioyb>1 zeRJ8EXq=BRPo>?+F}%mL>><^UuX6%oD&oUCRx*;0hA*avG2=g2E% zooQT*GS>G<^<)3F-ndv8lFz-DZQURk7rDgo4+ns!Wh8lFk>ev8reErMwrcX?*lElP zb-#mJ!W;HNHoJWN^D6N4mEvl>?Bj%}A_5&9c2wExaZILh{|WzK=B(hgim&e(jU6-c zLB2X-Fo6BK+Lx_!1RqWN=`5)Lb%xgKFHs z;gG&y8shqW>pwkl1B^+$`RhT$$i=!7F*gVB_Omv!7<&+DFi_tDoIFFXDtG}G;p2~B z>#YvE1PR3Ca39`ZCRwTk;W%Fni}t@s6u8)a4A8ZROiRQ<#dvfwO~2sI<-GpmhLbG_ zd92k?5<0r2D)#H}PbG9Xf#+zC$*zo?fe~kXBD2%=mm*2!g1T=mLH4dISFSf;o7Z2fjtWV|55ouylwQNm70r#0;S$H zJs}yL;CwxuoF{g+YI^5R;|9y`<{)(TtkO~LG0x~*G&Aj+J>XDKk|cXl=+S4x-43Hf zbTn@YHz4-Tww{bBm|rLa9nXeS!^GI8$Ia^$OO%MzYC7)W+kluq7BER<2eU1|}OapqPg4&_9_#zGzNiZxLwwR?gU z8)B_$Ioj^7E85|T#+ty>lim3YTb9Br&CtLs;sz)1dB%?uAAW>j7I7Ef3G2U$uv+B* z@*gb#@c--p3*u*TuX_08vyYC7a3!#kgHSv@X4=-0y;(_3T`!*Tsx|S0YlLk}OIbEl zQ#wgKN~8STo9`B7f)FRAE!t6;g88vG%0|hQc58Aa8tvB$2(h52HwuLNmAnePw10M$ zO*6Qo9rV|#Bn^^_5Uw)dmu}Q} z)hunx?dph2ko7CXHrDXSGm@+nVBjlV_+psU?LR@wFABPS{&W}|!X%rpg?2x&NdH=3 zfE@wE!1PwG#l{Of5Y91!p@%xEcfo? z!o4KadUMQYhoqv@;2+`#o#u{R_El_(XYO++I>axnKirAuUzOG^WAJil#x9&&L(0%O zkGcJ#5n3vKN#V}XZ!x{sfiSOjFfW=dJx%cv%=JT1m1%hGkz*I0!8A=$DbXEn@*6xw znRb?TU&Qr1@;p^bwip5s?#f)(@|U%vcCRqmcODQ*XbexBB#-LbH6wb2FK|jv(ajC? zBRLdHKI=?eR#&=j872De(5ZjiCk zu!^W9#g?OLx8}!73J+V7S|Y>_u6eXo#u>%dxQwfJi_dKip5@si%$K{$+OHi*(Cd1A zZtdo?V@kD#Q0#s~wG)fZezew!wyxTMHlZ!1iDstC!$?F$?9dUuA@a8jQ zEgBT2e*VQe=GKTo9#JhQfQa@w%wk$$&^7b4CB32UgHV@!fq- zWk<1|Woyw7P2?kgkTposW9q6(5`FraL{Q3&n7uv!S1G3q$(v~D1sO0_(d%--tBCgq zwHm|M@`CM?p^NSR4}0$w7gg4Miz=dmh=K?xh#;saNhL}~k)Q}D2uMcBp$L*g5fv2) zB1u7lNRphYij0XMNX`^cAUPvBbLYnXTE2VFdARrgav#oH|GJynYp*rKm}8DLcaLb5 zrAK693;S7DjqTN6!b1fI9D^tOJWRs1i*f@FMlRMExID{^rzs6c)*)AjNbj?$3Ov+} zeTNBwZ2FT4Ms=VmC;cW|^U998&qemzhUEwNcB^uTi6|Fjyl99-AIlfF@d^^Tp+uf; zYAqj8plP01$~aXmj-h&so_RK($JbDsw`1pZ7xnZ`9tS<$haLtom!v5nw6L?&_#4vV zu^%nZIl-vm)DytO;qW?_E?X)NPU#4O>$=2v;6l z%2dVVWnn*U2&AbL1#sC^opm){D5tyE;u1FMs?wd)Vs-&zmM7kTWUvx&pn1O>QKB}e z;#Ic<VbRRG$YALh;|5eT;Zd|&SKXiSqZPB7li)9KVTJkl z6%KS%?ik(a?t`bQh38+JR4#wwQHFe?OUMlhf~Ov#-&{KVPfkzV7bq?bHdGAsPmH(LSX z;V<*%K1%~=-Qv2ms+E?IC>L*)15}Qib@8NC7}}=6m6hc~RvDIBd^5_9ebGhb7=2dV zC5%q5KFU{5vv@1Eodo+yd37keYz782DiUeFzNkpjRM|2uvzzFPdIbV!eI=SOHAF>1 z>thXC8X3*#snMoo@{R&k^R^GJQWd6klZ3>==?x;CvGpZSOJd!`ZHyT&6Z|^GPMCfdv4YmqZh~b>{STFD|DY+r7qj5!ieaLx!J|xYy7x7%v z!?}ktIIbpa9Obpt#?9mo(y5)eQ=a-xdt82{wkXIFA5cLguP#5onA3(`VnadgY8}Nz zXAl3GbsW*+Ya@79I4U?=5%WdE?7o!+*X^F#S_*~ z_SLtmJ5}gZi6$)()|1sLTdXzga^n1T7!-Ugnksr0o>F{7*-c{5wAn%(8Sd6vjt8ek zlT$Pd_xFlSKUKCHNhUzq4;{qyea{74Yx`^D1S|Ujo zdL_-WZ`>31ZK~#!%`CN7*VNM-?J$G2msPbn zhkw2l?ICApe0@+&m!5bm{K|FrX8!InZO+S^M&VT11Ji>sQTEMYccz|Z!7<=oa@AFy z?Zuj9O(XnRYMsCER!(eeyjj?@YrnkDOQrB`IA^$IH2)TuEH5LZ>vU;dXcOu!uOVAX zt;ti~D(f00Jl9CAU>aSL+~s^*Cq3rHEhZD>dFs){XW6%1^P@X zwDKXtp|DDoU+y@APgGdWpc%5U>A{irJ3+arHfi-TV(v!P_$ z!|P*dd$#3tpOY`zv%k`qBz>&?t2=M7sx*0nm%g}6cenzn)zjuVREn*nI@mH;)_D@` zZ%y8AlFN(jNbO+5n6!JK%hgMZwt{7b-(Jy5jH+la>JK=wBUzd{H*~!blWW%YO)jE3 zvjxYl6&D?AKYce(FRG2SH`5=^)UtSMrz>*QaJi7S(mktnIj!VgTB?ZfBKdxCIMTIi zLHZ05W_A{r1tRu#Ar$2QZ7L_f=q(JNwIA#?^V{n9S_NzFJNzLOoI9F4Y+OQYc`>}ozY7xvmsI) zXekAeF$wkMK1W59n#}GGIOfvTw~p0iJVwO(OQ^-yK3No3(9Dlz#fIBjmTE7yE8D1< zHkVCi+@n1^KhjT}u5B-M{LM-Js79|)TACww%^IfO1h!dBU4A~Zj$hV}Q?}2XJdkuC zk>sR$T7KYILufl?2CLMSI(MBAv#>*t`S~*+LiU{a%`W5cQT3Bl-uC21-9*?{Oyl&M ziFajcZO>d(+5mg%0$Ry+4{vsFUlKQJoV_wIxS^CbMU}Y3G2@z8s@o=GrlMl(>wd03 z2(Y8a$eUm$JqUb%faSj>%2?`WkFzVZPgcWr*bZna9L1<7^Y%Cp#C6#Y$8KHIR9XKB z%**jmnqSSI8;>QUr50_rj0qhiN{h8kv88g0Y?h`t77Tl-l$E5=>KAkGYsb*rPn)YE zNB7Z~+~N7rl7xzCb>MBp)}==er3@SU^||D;$te+DP3ZDEEjtY!K^@w+fFKJ_VtE9`xo}h40tjx83?MXi&wmn~=$Gzt8P($X9<1~#NIWdR9 z2ep<)if3E{dN;2pggb1AkqJL6m_oVE2%hybk5D>by1=Cwe(G+^a)w7;AoW?}yy?a7 zs66&`KD@w;C{Hw|H@|Qt)EEhEXz9&9D zQ0fmKRD8pdwWZWjX1ZEO#7-|za>fELZvQH2BYz%l z7T7UP>4w!7aZ~J%RagEPhi|6`wv)A|EjRl~6>Ey@AAcP)(WkVp>!~KR_r&A;4mSJjOcrv8LHFLqG8nopAr2#BfL1=MJ3aULE}oE>ZjOk ziwVbfscu=#Vi~1F@waiw9ZO9WW-`T?4`Uh?j%j0ef71bGGjUTZbJ6&mz5N|y&E)CH z3eF+&PS)4!FAd~5Nra1;i+J*#Z--y(sPHwOviRQyK`cR`v3*bEoK&h}lAncfTs>Jf zp^=9d)2RBU=Hj~P?O0GF5??o4ZI+pBcU95o4uC=w^hC5Sc9uyRcrbe!i5#x z(RA`3D0|*PyCh5=@U3i4GRvLq_h!b4t&0y zA0FCD9hvdMQ~QQ~Hs#G0s*s|Gp7OEJ4_LVzV&%cV%6g?h-;komQhfTurWWA&`1na?xHLr{I4!xw_;1$;(Q4WhiRxvIaeH&Y@^H zUb!Dhch9GyY0|Kt*(sKsS^F{g3DX`(J1w)g#KI`fQ*gn~4jrbeoCRsba+y7Y0)GHO|kTSgqK2-bxjmwPa)MPT(Uj-FS`PV zC`(PE`|`Gc!{ttzV@I`Dwk3z5%stI$)jcgceaEWE=b#_d!+hJFeZuEV3??h-XBtDA zJD%iQIEKJ|UbmrvkNspeK#i7;8%2^)rBV5o6XL=jKTUPyn zed$dIb6DiDWMO5ajH1m<*P%cekMrLGVudy5H>WxhRX@o?_-bS8<#MZ)LQj9aS^DHr zcq*Yvp*^)^XF#G|Be7rXRm0bef=;Za^qJCn#N!tO z{~=o@#^uH_ksZ}0P5-`9r@jP1ms#4G;K|vIwS=W6YC1cpYMv3|XJvF9ne84pWM_;? zMD^7#mWz9YjD_{r%(&W#HS4VKS$@3UEt`g->wDWNKo&y|nTBcg6iQhVWqYMelmu6S z?#p#=Pw&ld&{*Z6DSI3_ty`&|f9QL!A8(2LX>?rO1Zm0WE8RDmXSW|E>1j4+@J0pP zku;|Hxju$J9#Sr{8u#5(qkw@d&GeGR_)ZM#^Rh=Pb9ky4{ExPTkgTE{OvDng(c;sw zrw5WsUc|V`PnI*7YY(P6yHJOYoj5jPIPH-iU|BknAd4H?61MEZ+>t~Lq*3stu|CpH zX^PRM`riRaJ>SxBlF7gQ)fN%IIrKCJJa`(@+oa z?P0JceC=KMlKfW#Xg-exu;q&~dTVz^|5qsa{xWW8DkuDX(wU(~)W*e<=%qX(;bBrN z+F+W8ykkEelV3F(V+$ON<& zrJ^I`!eh%jld)XXrBV}ZWC|uw3F~*NNWD=go8Wh0eu%4eA!@0#r0JFpPmBi1h2?_T zLMUcOeZBi7>iXqo(qWe~-`o#<{fLQG+;GOMXk@4ql^-W zcFP)4?>HtXvPeok>2eSbWK2`fM%5nQkzujUwsFHJu7LD^5E#-HPOqt*)n8UzK!&J+pAK z2Pdpu4t~D86_u49nz&`{%CDpCII*B8N9fmEomPrb%TNgAmZhuX)MLH)O?aY>)2@li zeIQZYnxjO!XMtW-jEO9>jGyme(wA)gtW{jx%US~3|4iPFyG@<^Lt{1S!rxo0wF9oR zd;_AcHXAHKHP>_t*cM3d3V$$X{g@GL6qNC_JHM2ps%SDNwmLX=zH)xqG(DDAuV@N*GfK>z-WJ)PJhnm;Lbp?%0bp=T<7}V?X$1UBQ?BE!VAU9?`wMs zlzm<`Bqk=qQ6A`SCl8m64IeyDApf?>2J6lf)2f@Ob}u&<()$z3jzAHa6jotV< zx#+I@`L_PDJTB<&SxrUGKn|R!9;!Kmm8IBjD6x-i;p-RN!74WP&uudj@m^REq@1@Z z9y<`P=ACy{^)woXT{5$FQ7MRz;P{f4R<@ulI4nm9(@wIwAYMGC{jRvNX0)y{?eKUj zOmKcUAOsZ$gR`Nm+F?0?iKh%vRWqbxFG~eScRr@OxT6|hA~f4!vE}1m77CVJh%jLl z-Y7bemVFvMCyr?j75-}Oi!EUq+lknjINyX%tmJelRw)&I8#o&r6nh%?s6vW0xp`K(!2#fh+y^Z+=V^^KJu@snk53U}HaaEyYNo2O6Djjpz)t``1O694Lo zRZh!~&L1q)Nb}C2v>@|%;M5l{k!%)rur@#H_Luaz2Gq56KAbB}jS_?Gp_7gJdag>%{E{UCaW(Ta6$57*Kd`a{Xbx!e4rlk97(V^h zeY%n?&7D)=N`c;H_{Z+{dfU-z&==i=!cJW$?fuOsSE83FPF7N%+(G~3=bl-g$gQDj53_Q~h zGZqQmGs`TjQbnQ%+!+Y&?e-4_G~VQwg*D+bWWP;6$CK`qbY!T0lGG@@vp}Y)IxV=A zYR2=+(&LSpQuDg1bR-Rjd9tdhNAvbauM+V|Qw)m*#f&REAuT^6e=u?F*@iM^6iApl zlC2w`#rIG6d)U^z06k5m@xN8yt}n<^RG+Ze7<@JRnmR}{n(krCT$FErvkqHqQt}TeaW!b2IdoHVY zq%AjxQdXzX1;bG?;?finTIX$S-0POsv4r^)d)4AqDtqOXW3I_4Pfz( z!VXHMe(m+w#mzsag0wBQ-rsfWPU`L3lY`Q4AEd<-$ba1|klHNKBvC9c9$#VGu#6Zr zF7?B(z0&P*dtl0dNxhSILziMs8SH+vggey*VQyA7d0h75Srg{h7do*U?{?H;oR+23 zce+-7w0;@FE1Ip!OIjCCXJbU%zX(U2v0u=1_K}WS;aGWhFftX?8hsADT#YpCm-1!} zu^IZ=4U$eGO`}!YUpUrA#dp5-e85_7G-*yq2R+I{m8?hVMSYs<$-utZmEo@+gWlWm@u97N!yoqDU~Ei&`Kph|KL7WO zHOm||ZGU4(!D#QYec^H$<9BS+)T$}E<4{PT?kz&znR4|V{li+pVee0Vs=npa9FPzh znlEPAsqWrqS6(2b{Jo*LosE3M?DGXn)8)LF#90stPAfKVw|8)$8&QLs=>e%?N?EBw zJTpt|pDtd=2%>)!9?Ms1HUvF9f$?G$Rk*Pf>{T%ghD zl;LvePb_9<**QCB5hRc8S#+<}tgbQPt@xyt-{oYycU;`&eAfMS+IWp)a+zNTt&lBG z{jdm9=)RAvmqNhA)qLn82=+m{n#WX|L|)PHPC^I!;h*nMyZ&nH&erdoEU3z-dRr89 zNE)<}Evvsr%N`w9UzxAX?NAV|>5@4kHvT<}Avt;wmuJ=eJ8xZGSjBB9L6+LMVp^=L zK}#KDHoocnW%~7C=v1f8Y*!Hn<_?a$qgJLjf4zwE-_xHIoOZkJCS@ZsL<$4c)oIP=osPKci2R`oiK{f8sX&u(w*4vWPgHe zaAf|oeME*w?q$`qCZa$Nb;nafCG`9>2)^Fzv%h%TcZsBc9r%#m!jB-5`}?GOxd5k} z^x#CeJ88)CQ9S0Xf@W*);&Er|@}VDd{I_(u?AxGujP-^IW?Yu@IO?g~vNBJ%l|tSAPw(PV_|YPmcQvRe^?4l{iH$ zBPHiJh&DAqv}tM+_*`O(IE7~^%2s-+95!=j^eyFob#Y(8N`4JM4eF3B|IK1=i>ENF zndYq2JM@*j>A6#>^F5VmTjx4e!_+@8f(jsiAFGrfO`<65rktmXN;tZ1PWr_3#+)zVkQMn|bQtQ*c~CgZejyRVzx^lJlIYDf4xv*SA_6u^xPQ} zKSF!~M(X*fP}55MhSqzd9L{H)q*!WmIdgbnhW!eD4~)6SKo84H8>hp!GN4UNk>a}# zlS;QBafM<|9pdW36gRdA6d7rgKY1+oy1Fb=^zo$E1^0DDksg<>aw2X{l z%bfJ(qJ|1n8oW{`$gy&;`M&#zK!}zgizw5;L~Zv^sMs?0f%?OY1PJh5wL~l+ez68F z{j@Z&(4u;gLFv8Q`vCU*)2(Ng6lK)ob!1$xX;rs`OmwZJTw3RO45QSAF=!Doef8D! zUd>=^@44snSLGOpzVJV1eUr)JDWMGS$vZqC4=?w6-%{!y4J6ZjPmM6yZ}hMaulLy} zG08^Wh`R}f!^V5s4!rDdP)of4JM6mf0qF~i7XI>zquRA7-=1!D4u6cnm?o%y2nxy= zLI(%6x1Q#-__2LV{TX0OCD9s(d_5hBTG?llLieBRPuz#8sWmmcNAlo~r;zfe@i-om zlg#kj6w-8v*yrCTGJ+}Dd#LhtViDsxU`c0zbSF6v_i*^zSF$_$^@)Wh+V9V6rGYRp zQyl{@fI<$^)qMAtvIw)-aX(EybY7i273qKf>tTIbP|2DjM`Y=%x{Pdsyx+f-F zz2T{cCl1UkYxLBl#Ia(ohWGmAr};eD>^J)K4W!(w2F++hTMFmLOpZuOE5IYEqbQ0% z-<1RI@sLIp9L0;M^&QbQ(<5Gf;PPqJw;IX+z7cFZqUABGyS@ASG+(gGqwO4+3*M+{ z*JdJEs&g2UFBS)dr^e}jh37yK9xki=Qb2>WK>gG!Jmmt!WiExMtnShvY%hK6p7Vu$0prutWR_3tYxKl} zIa8FXeBy$u4lFX9;>sWxX-RO`fal@QNA|G)RB}Au86FkHKq2v&63+QL_kBC6{lrgQ zDxQPUXi>ze7G9NGq}-1~DrO`qF)4Uz23LMUR9XL;6mYX}Dz>BgaflV0R?E{O@(6iJ z%Yllo5Olw?WrzyM^+xGwn)^<{8MM*DSuc&gILqw$`R%?XKSemB0w#$J;JLW%snhgu^1~^GO$)O zVyzy5W9NuS{7LU+!N>hPJ;{h#*=UVkiZSEQLtN`GV{S1(GG{tAKBaY2~TdV690 zg(n^e9^7b99}5L5TtSf?u%hJ)IE$dmtpg z&|HwRqD;wyC{mx-&`D`6b8zLk;ok_ZF)Q;A_%_mwb*DEjB(%-@uh z;svHccb8kz0=c_XYd7^`AJH*V_`MH5;?qc4wIJUv9N+g%229*6jD<={fYSOQWS_aA zCVS!&z&2d?oQ-rC{{G-@_4R)i_kVWo|Jd9gulWD9Lzu93^5@?kdPyravzk~PGAY$w z%FNx(#9+Faw;7Zz6}Lbn?s8+uwc$lN;nKX)phuB~iAb4cYIRTat-gY~&Z6|46Be~> z6%HW$&IM$p6(hPH2panowWUZa=~td`)#f&vYfBA9w0OHrOkYJ)LiGyC!ej{M`Mn+(+Shuw#A%= z8yQK}Vm#Qeg}^>tBY6UM*|qjVL^iQMu1AV|kn={_c&AGu-;=$5`4`@w`z-M$R7h*W zIRB&jV~JB##Of~U--wF@WV8zt;us(`PLJhW*_+awI2-R|%V+u75A68oScppvt@grq z2MjW?9$_61o{?vQPPh=?d=KAnMd;#+yM5QW&3CP7xuvGhD@SvFceM@|R)!JpOsZ4% zN=IBMkKL+45#uX=uF`@en+Ea~VWD=6V(zx5%W#VYHx05p)!pTJrIOq;PUWUrJmB>U z!Ygw9ac?5*e<#8Ig tgMfu+%oc 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 Ty+B$8|D8D{_fOmj&D;MA(weS# diff --git a/stm32-uart-echo/Makefile b/stm32-uart-echo/Makefile deleted file mode 100755 index bf727669..00000000 --- a/stm32-uart-echo/Makefile +++ /dev/null @@ -1,57 +0,0 @@ -##===----------------------------------------------------------------------===## -## -## This source file is part of the Swift open source project -## -## Copyright (c) 2023 Apple Inc. and the Swift project authors. -## Licensed under Apache License v2.0 with Runtime Library Exception -## -## See https://swift.org/LICENSE.txt for license information -## -##===----------------------------------------------------------------------===## - -# Paths -REPOROOT := $(shell git rev-parse --show-toplevel) -TOOLSROOT := $(REPOROOT)/Tools -TOOLSET := $(TOOLSROOT)/Toolsets/stm32f74x.json -MACHO2BIN := $(TOOLSROOT)/macho2bin.py -SWIFT_BUILD := swift build - -# Flags -ARCH := armv7em -TARGET := $(ARCH)-apple-none-macho -SWIFT_BUILD_ARGS := \ - --configuration release \ - --triple $(TARGET) \ - --toolset $(TOOLSET) -BUILDROOT := $(shell $(SWIFT_BUILD) $(SWIFT_BUILD_ARGS) --show-bin-path) - -.PHONY: build -build: - @echo "building..." - $(SWIFT_BUILD) \ - $(SWIFT_BUILD_ARGS) \ - -Xlinker -map -Xlinker $(BUILDROOT)/Application.mangled.map \ - --verbose - - @echo "demangling linker map..." - cat $(BUILDROOT)/Application.mangled.map \ - | c++filt | swift demangle > $(BUILDROOT)/Application.map - - @echo "disassembling..." - otool \ - -arch $(ARCH) -v -V -d -t \ - $(BUILDROOT)/Application \ - | c++filt | swift demangle > $(BUILDROOT)/Application.disassembly - - @echo "extracting binary..." - $(MACHO2BIN) \ - $(BUILDROOT)/Application \ - $(BUILDROOT)/Application.bin \ - --base-address 0x20010000 \ - --segments '__TEXT,__DATA,__VECTORS' - -.PHONY: clean -clean: - @echo "cleaning..." - @swift package clean - @rm -rf .build diff --git a/stm32-uart-echo/Package.resolved b/stm32-uart-echo/Package.resolved deleted file mode 100644 index bfba35e0..00000000 --- a/stm32-uart-echo/Package.resolved +++ /dev/null @@ -1,33 +0,0 @@ -{ - "originHash" : "b5206e756e7be7138148bd69eca921f1525d2b038657b90a2712a76adba376d0", - "pins" : [ - { - "identity" : "swift-argument-parser", - "kind" : "remoteSourceControl", - "location" : "https://github.com/apple/swift-argument-parser.git", - "state" : { - "revision" : "41982a3656a71c768319979febd796c6fd111d5c", - "version" : "1.5.0" - } - }, - { - "identity" : "swift-mmio", - "kind" : "remoteSourceControl", - "location" : "https://github.com/apple/swift-mmio", - "state" : { - "branch" : "main", - "revision" : "5232c5129a8c70beafc3d6acfbae2716c1b6822a" - } - }, - { - "identity" : "swift-syntax", - "kind" : "remoteSourceControl", - "location" : "https://github.com/swiftlang/swift-syntax.git", - "state" : { - "revision" : "0687f71944021d616d34d922343dcef086855920", - "version" : "600.0.1" - } - } - ], - "version" : 3 -} diff --git a/stm32-uart-echo/Package.swift b/stm32-uart-echo/Package.swift deleted file mode 100644 index e5c40c11..00000000 --- a/stm32-uart-echo/Package.swift +++ /dev/null @@ -1,34 +0,0 @@ -// swift-tools-version: 6.0 - -import PackageDescription - -let package = Package( - name: "stm32-uart-echo", - products: [ - .executable(name: "Application", targets: ["Application"]) - ], - dependencies: [ - .package(url: "https://github.com/apple/swift-mmio", branch: "main") - ], - targets: [ - .executableTarget( - name: "Application", - dependencies: ["STM32F7X6", "Support"]), - // SVD2Swift \ - // --input Sources/STM32F7X6/stm32f7x6.patched.svd \ - // --output Sources/STM32F7X6 \ - // --access-level public \ - // --indentation-width 2 \ - // --peripherals GPIOA GPIOB RCC USART1 - .target( - name: "STM32F7X6", - dependencies: [ - .product(name: "MMIO", package: "swift-mmio") - ], - plugins: [ - // Plugin disabled because SwiftPM is slow. - // .plugin(name: "SVD2SwiftPlugin", package: "swift-mmio") - ]), - .target(name: "Support"), - ], - swiftLanguageModes: [.v5]) diff --git a/stm32-uart-echo/README.md b/stm32-uart-echo/README.md deleted file mode 100644 index 811cb681..00000000 --- a/stm32-uart-echo/README.md +++ /dev/null @@ -1,20 +0,0 @@ -# stm32-uart-echo - -This demo is designed to run on an STM32 microcontroller, concretely the STM32F746G Discovery Kit, and implements a simple "echo" service over UART. - -## How to build and run this example: - -- Connect the STM32F746G-DISCO board via the ST-LINK USB port to your Mac. -- Open a separate terminal window and run a serial UART monitor program. For example, the macOS built-in `screen` program is able to do that (but there are other popular alternatives, like `minicom`). The ST-LINK device shows up as a "usbmodem" device under `/dev`. -```console -$ screen /dev/cu.usbmodem<...> 115200 -``` -- Make sure you have a recent nightly Swift toolchain that has Embedded Swift support. -- Install the `stlink` (https://github.com/stlink-org/stlink) command line tools, e.g. via `brew install stlink`. -- Build and upload the program to flash memory of the STM: -```console -$ cd stm32-uart-echo -$ make -$ st-flash --reset write .build/release/Application.bin 0x08000000 -``` -- The other terminal that runs the UART monitoring program should now be showing a "Hello Swift" message and if you type into the terminal, you will see the letter show up (as they are replied back over the UART). diff --git a/stm32-uart-echo/Sources/Application/Application.swift b/stm32-uart-echo/Sources/Application/Application.swift deleted file mode 100644 index 118c7475..00000000 --- a/stm32-uart-echo/Sources/Application/Application.swift +++ /dev/null @@ -1,117 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2024 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -import STM32F7X6 -import Support - -@main -public struct Application { - public static func main() { - // MARK: Clock configuration - rcc.ahb1enr.modify { rw in - // Enable AHB clock to port A - rw.raw.gpioaen = 1 - // Enable AHB clock to port B - rw.raw.gpioben = 1 - } - // Enable APB clock to usart 1 - rcc.apb2enr.modify { $0.raw.usart1en = 1 } - - // MARK: Peripheral Configuration - // Configure A9 as UART1 TX - // Put Pin A9 into alternate function mode - gpioa.moder.modify { $0.raw.moder9 = 0b10 } - // Put Pin A9 into push pull - gpioa.otyper.modify { $0.raw.ot9 = 0b0 } - // Put Pin A9 into low speed - gpioa.ospeedr.modify { $0.raw.ospeedr9 = 0b00 } - // Disable pull up/down on Pin A9 - gpioa.pupdr.modify { $0.raw.pupdr9 = 0b00 } - // Set alternate function usart1 on Pin A9 - gpioa.afrh.modify { $0.raw.afrh9 = 0b0111 } - - // Configure B7 as UART1 RX - // Put Pin B7 into alternate function mode - gpiob.moder.modify { $0.raw.moder7 = 0b10 } - // Put Pin B7 into push pull - gpiob.otyper.modify { $0.raw.ot7 = 0b0 } - // Put Pin B7 into low speed - gpiob.ospeedr.modify { $0.raw.ospeedr7 = 0b00 } - // Disable pull up/down on Pin B7 - gpiob.pupdr.modify { $0.raw.pupdr7 = 0b00 } - // Set alternate function usart1 on Pin B7 - gpiob.afrl.modify { $0.raw.afrl7 = 0b0111 } - - // Configure UART1 - // Set the baud rate to 115200 (by computing the divisor based on the 16Mhz - // default post-reset CPU clock frequency) - usart1.brr.modify { $0.raw.storage = 16_000_000 / 115200 } - - usart1.cr1.modify { rw in - // Enable USART 1 - rw.raw.ue = 1 - // Enable RX - rw.raw.re = 1 - // Enable TX - rw.raw.te = 1 - } - - // MARK: Main Loop - print("Hello Swift!") - - while true { - waitRxBufferFull() - let byte = rx() - tx(value: byte) - waitTxBufferEmpty() - // My serial console does not cook newlines so pressing "enter" sends a - // carriage return ('\r') to the device. If we naively echo this byte back - // to the user, we will move the cursor back to the start of the line and - // overwrite previous characters. Instead, if we receive a carriage - // return, send it back followed by a newline ('\n'). - if byte == UInt8(ascii: "\r") { - tx(value: UInt8(ascii: "\n")) - waitTxBufferEmpty() - } - } - } -} - -func waitTxBufferEmpty() { - // Spin while tx buffer not empty - while usart1.isr.read().raw.txe == 0 {} -} - -func tx(value: UInt8) { - usart1.tdr.write { $0.raw.tdr_field = UInt32(value) } -} - -func waitRxBufferFull() { - // Spin while rx buffer empty - while usart1.isr.read().raw.rxne == 0 {} -} - -func rx() -> UInt8 { - UInt8(usart1.rdr.read().raw.rdr_field) -} - -@_cdecl("Default_Handler") -public func defaultHandler() { - while true {} -} - -@_cdecl("putchar") -public func putchar(_ value: CInt) -> CInt { - waitTxBufferEmpty() - tx(value: UInt8(value)) - waitTxBufferEmpty() - return 0 -} diff --git a/stm32-uart-echo/Sources/Application/GPIO.swift b/stm32-uart-echo/Sources/Application/GPIO.swift deleted file mode 100644 index 8e24b427..00000000 --- a/stm32-uart-echo/Sources/Application/GPIO.swift +++ /dev/null @@ -1,111 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2024 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -import STM32F7X6 - -extension GPIOA { - enum Mode: UInt32 { - case input = 0x0 - case output = 0x1 - case alternateFunction = 0x2 - case analog = 0x3 - } - - enum OutputType: UInt32 { - case pushPull = 0x0 - case openDrain = 0x1 - } - - enum OutputSpeed: UInt32 { - case low = 0x0 - case medium = 0x1 - case high = 0x2 - case max = 0x3 - } - - enum Pull: UInt32 { - case `none` = 0x0 - case up = 0x1 - case down = 0x2 - } - - struct Configuration { - var mode: Mode - var outputType: OutputType - var outputSpeed: OutputSpeed - var pull: Pull - var alternateFunction: UInt32 - } - - func configure(pin: Int, as configuration: Configuration) { - self.moder.modify { rw in - rw.raw.storage.set( - value: configuration.mode.rawValue, - mask: 0b11, - offset: pin * 2) - } - - // Comprised of 16 x 1 bit fields. - self.otyper.modify { rw in - rw.raw.storage.set( - value: configuration.outputType.rawValue, - mask: 0b1, - offset: pin) - } - - // Comprised of 16 x 2 bit fields. - self.ospeedr.modify { rw in - rw.raw.storage.set( - value: configuration.outputSpeed.rawValue, - mask: 0b11, - offset: pin * 2) - } - - // Comprised of 16 x 2 bit fields. - self.pupdr.modify { rw in - rw.raw.storage.set( - value: configuration.pull.rawValue, - mask: 0b11, - offset: pin * 2) - } - - // Comprised of 16 x 4 bit fields, split across 2 registers. - if pin < 8 { - self.afrl.modify { rw in - rw.raw.storage.set( - value: configuration.alternateFunction, - mask: 0b1111, - offset: pin * 4) - } - } else { - self.afrh.modify { rw in - rw.raw.storage.set( - value: configuration.alternateFunction, - mask: 0b1111, - offset: (pin - 8) * 4) - } - } - } -} - -extension UInt32 { - fileprivate func get(mask: Self, offset: UInt8) -> Self { - let mask = mask &<< offset - return (self & mask) &>> offset - } - - fileprivate mutating func set(value: Self, mask: Self, offset: Int) { - let mask = mask &<< offset - let oldValue: UInt32 = self & ~mask - let newValue: UInt32 = (value &<< offset) & mask - self = oldValue | newValue - } -} diff --git a/stm32-uart-echo/Sources/STM32F7X6/Device.swift b/stm32-uart-echo/Sources/STM32F7X6/Device.swift deleted file mode 100644 index db4a3f50..00000000 --- a/stm32-uart-echo/Sources/STM32F7X6/Device.swift +++ /dev/null @@ -1,15 +0,0 @@ -// Generated by svd2swift. - -import MMIO - -/// General-purpose I/Os -public let gpioa = GPIOA(unsafeAddress: 0x40020000) - -/// General-purpose I/Os -public let gpiob = GPIOB(unsafeAddress: 0x40020400) - -/// Reset and clock control -public let rcc = RCC(unsafeAddress: 0x40023800) - -/// Universal synchronous asynchronous receiver transmitter -public let usart1 = USART1(unsafeAddress: 0x40011000) diff --git a/stm32-uart-echo/Sources/STM32F7X6/Empty.swift b/stm32-uart-echo/Sources/STM32F7X6/Empty.swift deleted file mode 100644 index 934a795a..00000000 --- a/stm32-uart-echo/Sources/STM32F7X6/Empty.swift +++ /dev/null @@ -1,13 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2024 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -// This file is intentionally left empty for SwiftPM to recognize the target as -// a Swift source module. diff --git a/stm32-uart-echo/Sources/STM32F7X6/GPIOA.swift b/stm32-uart-echo/Sources/STM32F7X6/GPIOA.swift deleted file mode 100644 index a70e68c7..00000000 --- a/stm32-uart-echo/Sources/STM32F7X6/GPIOA.swift +++ /dev/null @@ -1,1075 +0,0 @@ -// Generated by svd2swift. - -import MMIO - -/// General-purpose I/Os -@RegisterBlock -public struct GPIOA { - /// GPIO port mode register - @RegisterBlock(offset: 0x0) - public var moder: Register - - /// GPIO port output type register - @RegisterBlock(offset: 0x4) - public var otyper: Register - - /// GPIO port output speed register - @RegisterBlock(offset: 0x8) - public var ospeedr: Register - - /// GPIO port pull-up/pull-down register - @RegisterBlock(offset: 0xc) - public var pupdr: Register - - /// GPIO port input data register - @RegisterBlock(offset: 0x10) - public var idr: Register - - /// GPIO port output data register - @RegisterBlock(offset: 0x14) - public var odr: Register - - /// GPIO port bit set/reset register - @RegisterBlock(offset: 0x18) - public var bsrr: Register - - /// GPIO port configuration lock register - @RegisterBlock(offset: 0x1c) - public var lckr: Register - - /// GPIO alternate function low register - @RegisterBlock(offset: 0x20) - public var afrl: Register - - /// GPIO alternate function high register - @RegisterBlock(offset: 0x24) - public var afrh: Register - - /// GPIO port bit reset register - @RegisterBlock(offset: 0x28) - public var brr: Register -} - -extension GPIOA { - /// GPIO port mode register - @Register(bitWidth: 32) - public struct MODER { - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 30..<32) - public var moder15: MODER15 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 28..<30) - public var moder14: MODER14 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 26..<28) - public var moder13: MODER13 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 24..<26) - public var moder12: MODER12 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 22..<24) - public var moder11: MODER11 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 20..<22) - public var moder10: MODER10 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 18..<20) - public var moder9: MODER9 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 16..<18) - public var moder8: MODER8 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 14..<16) - public var moder7: MODER7 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 12..<14) - public var moder6: MODER6 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 10..<12) - public var moder5: MODER5 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 8..<10) - public var moder4: MODER4 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 6..<8) - public var moder3: MODER3 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 4..<6) - public var moder2: MODER2 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 2..<4) - public var moder1: MODER1 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 0..<2, as: MODER0Values.self) - public var moder0: MODER0 - } - - /// GPIO port output type register - @Register(bitWidth: 32) - public struct OTYPER { - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 15..<16) - public var ot15: OT15 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 14..<15) - public var ot14: OT14 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 13..<14) - public var ot13: OT13 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 12..<13) - public var ot12: OT12 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 11..<12) - public var ot11: OT11 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 10..<11) - public var ot10: OT10 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 9..<10) - public var ot9: OT9 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 8..<9) - public var ot8: OT8 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 7..<8) - public var ot7: OT7 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 6..<7) - public var ot6: OT6 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 5..<6) - public var ot5: OT5 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 4..<5) - public var ot4: OT4 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 3..<4) - public var ot3: OT3 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 2..<3) - public var ot2: OT2 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 1..<2) - public var ot1: OT1 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 0..<1, as: OT0Values.self) - public var ot0: OT0 - } - - /// GPIO port output speed register - @Register(bitWidth: 32) - public struct OSPEEDR { - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 30..<32) - public var ospeedr15: OSPEEDR15 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 28..<30) - public var ospeedr14: OSPEEDR14 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 26..<28) - public var ospeedr13: OSPEEDR13 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 24..<26) - public var ospeedr12: OSPEEDR12 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 22..<24) - public var ospeedr11: OSPEEDR11 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 20..<22) - public var ospeedr10: OSPEEDR10 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 18..<20) - public var ospeedr9: OSPEEDR9 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 16..<18) - public var ospeedr8: OSPEEDR8 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 14..<16) - public var ospeedr7: OSPEEDR7 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 12..<14) - public var ospeedr6: OSPEEDR6 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 10..<12) - public var ospeedr5: OSPEEDR5 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 8..<10) - public var ospeedr4: OSPEEDR4 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 6..<8) - public var ospeedr3: OSPEEDR3 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 4..<6) - public var ospeedr2: OSPEEDR2 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 2..<4) - public var ospeedr1: OSPEEDR1 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 0..<2, as: OSPEEDR0Values.self) - public var ospeedr0: OSPEEDR0 - } - - /// GPIO port pull-up/pull-down register - @Register(bitWidth: 32) - public struct PUPDR { - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 30..<32) - public var pupdr15: PUPDR15 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 28..<30) - public var pupdr14: PUPDR14 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 26..<28) - public var pupdr13: PUPDR13 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 24..<26) - public var pupdr12: PUPDR12 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 22..<24) - public var pupdr11: PUPDR11 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 20..<22) - public var pupdr10: PUPDR10 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 18..<20) - public var pupdr9: PUPDR9 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 16..<18) - public var pupdr8: PUPDR8 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 14..<16) - public var pupdr7: PUPDR7 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 12..<14) - public var pupdr6: PUPDR6 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 10..<12) - public var pupdr5: PUPDR5 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 8..<10) - public var pupdr4: PUPDR4 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 6..<8) - public var pupdr3: PUPDR3 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 4..<6) - public var pupdr2: PUPDR2 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 2..<4) - public var pupdr1: PUPDR1 - - /// Port x configuration bits (y = 0..15) - @ReadWrite(bits: 0..<2, as: PUPDR0Values.self) - public var pupdr0: PUPDR0 - } - - /// GPIO port input data register - @Register(bitWidth: 32) - public struct IDR { - /// Port input data (y = 0..15) - @ReadOnly(bits: 15..<16) - public var idr15: IDR15 - - /// Port input data (y = 0..15) - @ReadOnly(bits: 14..<15) - public var idr14: IDR14 - - /// Port input data (y = 0..15) - @ReadOnly(bits: 13..<14) - public var idr13: IDR13 - - /// Port input data (y = 0..15) - @ReadOnly(bits: 12..<13) - public var idr12: IDR12 - - /// Port input data (y = 0..15) - @ReadOnly(bits: 11..<12) - public var idr11: IDR11 - - /// Port input data (y = 0..15) - @ReadOnly(bits: 10..<11) - public var idr10: IDR10 - - /// Port input data (y = 0..15) - @ReadOnly(bits: 9..<10) - public var idr9: IDR9 - - /// Port input data (y = 0..15) - @ReadOnly(bits: 8..<9) - public var idr8: IDR8 - - /// Port input data (y = 0..15) - @ReadOnly(bits: 7..<8) - public var idr7: IDR7 - - /// Port input data (y = 0..15) - @ReadOnly(bits: 6..<7) - public var idr6: IDR6 - - /// Port input data (y = 0..15) - @ReadOnly(bits: 5..<6) - public var idr5: IDR5 - - /// Port input data (y = 0..15) - @ReadOnly(bits: 4..<5) - public var idr4: IDR4 - - /// Port input data (y = 0..15) - @ReadOnly(bits: 3..<4) - public var idr3: IDR3 - - /// Port input data (y = 0..15) - @ReadOnly(bits: 2..<3) - public var idr2: IDR2 - - /// Port input data (y = 0..15) - @ReadOnly(bits: 1..<2) - public var idr1: IDR1 - - /// Port input data (y = 0..15) - @ReadOnly(bits: 0..<1) - public var idr0: IDR0 - } - - /// GPIO port output data register - @Register(bitWidth: 32) - public struct ODR { - /// Port output data (y = 0..15) - @ReadWrite(bits: 15..<16) - public var odr15: ODR15 - - /// Port output data (y = 0..15) - @ReadWrite(bits: 14..<15) - public var odr14: ODR14 - - /// Port output data (y = 0..15) - @ReadWrite(bits: 13..<14) - public var odr13: ODR13 - - /// Port output data (y = 0..15) - @ReadWrite(bits: 12..<13) - public var odr12: ODR12 - - /// Port output data (y = 0..15) - @ReadWrite(bits: 11..<12) - public var odr11: ODR11 - - /// Port output data (y = 0..15) - @ReadWrite(bits: 10..<11) - public var odr10: ODR10 - - /// Port output data (y = 0..15) - @ReadWrite(bits: 9..<10) - public var odr9: ODR9 - - /// Port output data (y = 0..15) - @ReadWrite(bits: 8..<9) - public var odr8: ODR8 - - /// Port output data (y = 0..15) - @ReadWrite(bits: 7..<8) - public var odr7: ODR7 - - /// Port output data (y = 0..15) - @ReadWrite(bits: 6..<7) - public var odr6: ODR6 - - /// Port output data (y = 0..15) - @ReadWrite(bits: 5..<6) - public var odr5: ODR5 - - /// Port output data (y = 0..15) - @ReadWrite(bits: 4..<5) - public var odr4: ODR4 - - /// Port output data (y = 0..15) - @ReadWrite(bits: 3..<4) - public var odr3: ODR3 - - /// Port output data (y = 0..15) - @ReadWrite(bits: 2..<3) - public var odr2: ODR2 - - /// Port output data (y = 0..15) - @ReadWrite(bits: 1..<2) - public var odr1: ODR1 - - /// Port output data (y = 0..15) - @ReadWrite(bits: 0..<1, as: ODR0Values.self) - public var odr0: ODR0 - } - - /// GPIO port bit set/reset register - @Register(bitWidth: 32) - public struct BSRR { - /// Port x reset bit y (y = 0..15) - @WriteOnly(bits: 31..<32) - public var br15: BR15 - - /// Port x reset bit y (y = 0..15) - @WriteOnly(bits: 30..<31) - public var br14: BR14 - - /// Port x reset bit y (y = 0..15) - @WriteOnly(bits: 29..<30) - public var br13: BR13 - - /// Port x reset bit y (y = 0..15) - @WriteOnly(bits: 28..<29) - public var br12: BR12 - - /// Port x reset bit y (y = 0..15) - @WriteOnly(bits: 27..<28) - public var br11: BR11 - - /// Port x reset bit y (y = 0..15) - @WriteOnly(bits: 26..<27) - public var br10: BR10 - - /// Port x reset bit y (y = 0..15) - @WriteOnly(bits: 25..<26) - public var br9: BR9 - - /// Port x reset bit y (y = 0..15) - @WriteOnly(bits: 24..<25) - public var br8: BR8 - - /// Port x reset bit y (y = 0..15) - @WriteOnly(bits: 23..<24) - public var br7: BR7 - - /// Port x reset bit y (y = 0..15) - @WriteOnly(bits: 22..<23) - public var br6: BR6 - - /// Port x reset bit y (y = 0..15) - @WriteOnly(bits: 21..<22) - public var br5: BR5 - - /// Port x reset bit y (y = 0..15) - @WriteOnly(bits: 20..<21) - public var br4: BR4 - - /// Port x reset bit y (y = 0..15) - @WriteOnly(bits: 19..<20) - public var br3: BR3 - - /// Port x reset bit y (y = 0..15) - @WriteOnly(bits: 18..<19) - public var br2: BR2 - - /// Port x reset bit y (y = 0..15) - @WriteOnly(bits: 17..<18) - public var br1: BR1 - - /// Port x set bit y (y= 0..15) - @WriteOnly(bits: 16..<17) - public var br0: BR0 - - /// Port x set bit y (y= 0..15) - @WriteOnly(bits: 15..<16) - public var bs15: BS15 - - /// Port x set bit y (y= 0..15) - @WriteOnly(bits: 14..<15) - public var bs14: BS14 - - /// Port x set bit y (y= 0..15) - @WriteOnly(bits: 13..<14) - public var bs13: BS13 - - /// Port x set bit y (y= 0..15) - @WriteOnly(bits: 12..<13) - public var bs12: BS12 - - /// Port x set bit y (y= 0..15) - @WriteOnly(bits: 11..<12) - public var bs11: BS11 - - /// Port x set bit y (y= 0..15) - @WriteOnly(bits: 10..<11) - public var bs10: BS10 - - /// Port x set bit y (y= 0..15) - @WriteOnly(bits: 9..<10) - public var bs9: BS9 - - /// Port x set bit y (y= 0..15) - @WriteOnly(bits: 8..<9) - public var bs8: BS8 - - /// Port x set bit y (y= 0..15) - @WriteOnly(bits: 7..<8) - public var bs7: BS7 - - /// Port x set bit y (y= 0..15) - @WriteOnly(bits: 6..<7) - public var bs6: BS6 - - /// Port x set bit y (y= 0..15) - @WriteOnly(bits: 5..<6) - public var bs5: BS5 - - /// Port x set bit y (y= 0..15) - @WriteOnly(bits: 4..<5) - public var bs4: BS4 - - /// Port x set bit y (y= 0..15) - @WriteOnly(bits: 3..<4) - public var bs3: BS3 - - /// Port x set bit y (y= 0..15) - @WriteOnly(bits: 2..<3) - public var bs2: BS2 - - /// Port x set bit y (y= 0..15) - @WriteOnly(bits: 1..<2) - public var bs1: BS1 - - /// Port x set bit y (y= 0..15) - @WriteOnly(bits: 0..<1) - public var bs0: BS0 - } - - /// GPIO port configuration lock register - @Register(bitWidth: 32) - public struct LCKR { - /// Port x lock bit y (y= 0..15) - @ReadWrite(bits: 16..<17, as: LCKKValues.self) - public var lckk: LCKK - - /// Port x lock bit y (y= 0..15) - @ReadWrite(bits: 15..<16) - public var lck15: LCK15 - - /// Port x lock bit y (y= 0..15) - @ReadWrite(bits: 14..<15) - public var lck14: LCK14 - - /// Port x lock bit y (y= 0..15) - @ReadWrite(bits: 13..<14) - public var lck13: LCK13 - - /// Port x lock bit y (y= 0..15) - @ReadWrite(bits: 12..<13) - public var lck12: LCK12 - - /// Port x lock bit y (y= 0..15) - @ReadWrite(bits: 11..<12) - public var lck11: LCK11 - - /// Port x lock bit y (y= 0..15) - @ReadWrite(bits: 10..<11) - public var lck10: LCK10 - - /// Port x lock bit y (y= 0..15) - @ReadWrite(bits: 9..<10) - public var lck9: LCK9 - - /// Port x lock bit y (y= 0..15) - @ReadWrite(bits: 8..<9) - public var lck8: LCK8 - - /// Port x lock bit y (y= 0..15) - @ReadWrite(bits: 7..<8) - public var lck7: LCK7 - - /// Port x lock bit y (y= 0..15) - @ReadWrite(bits: 6..<7) - public var lck6: LCK6 - - /// Port x lock bit y (y= 0..15) - @ReadWrite(bits: 5..<6) - public var lck5: LCK5 - - /// Port x lock bit y (y= 0..15) - @ReadWrite(bits: 4..<5) - public var lck4: LCK4 - - /// Port x lock bit y (y= 0..15) - @ReadWrite(bits: 3..<4) - public var lck3: LCK3 - - /// Port x lock bit y (y= 0..15) - @ReadWrite(bits: 2..<3) - public var lck2: LCK2 - - /// Port x lock bit y (y= 0..15) - @ReadWrite(bits: 1..<2) - public var lck1: LCK1 - - /// Port x lock bit y (y= 0..15) - @ReadWrite(bits: 0..<1, as: LCK0Values.self) - public var lck0: LCK0 - } - - /// GPIO alternate function low register - @Register(bitWidth: 32) - public struct AFRL { - /// Alternate function selection for port x bit y (y = 0..7) - @ReadWrite(bits: 28..<32) - public var afrl7: AFRL7 - - /// Alternate function selection for port x bit y (y = 0..7) - @ReadWrite(bits: 24..<28) - public var afrl6: AFRL6 - - /// Alternate function selection for port x bit y (y = 0..7) - @ReadWrite(bits: 20..<24) - public var afrl5: AFRL5 - - /// Alternate function selection for port x bit y (y = 0..7) - @ReadWrite(bits: 16..<20) - public var afrl4: AFRL4 - - /// Alternate function selection for port x bit y (y = 0..7) - @ReadWrite(bits: 12..<16) - public var afrl3: AFRL3 - - /// Alternate function selection for port x bit y (y = 0..7) - @ReadWrite(bits: 8..<12) - public var afrl2: AFRL2 - - /// Alternate function selection for port x bit y (y = 0..7) - @ReadWrite(bits: 4..<8) - public var afrl1: AFRL1 - - /// Alternate function selection for port x bit y (y = 0..7) - @ReadWrite(bits: 0..<4, as: AFRL0Values.self) - public var afrl0: AFRL0 - } - - /// GPIO alternate function high register - @Register(bitWidth: 32) - public struct AFRH { - /// Alternate function selection for port x bit y (y = 8..15) - @ReadWrite(bits: 28..<32) - public var afrh15: AFRH15 - - /// Alternate function selection for port x bit y (y = 8..15) - @ReadWrite(bits: 24..<28) - public var afrh14: AFRH14 - - /// Alternate function selection for port x bit y (y = 8..15) - @ReadWrite(bits: 20..<24) - public var afrh13: AFRH13 - - /// Alternate function selection for port x bit y (y = 8..15) - @ReadWrite(bits: 16..<20) - public var afrh12: AFRH12 - - /// Alternate function selection for port x bit y (y = 8..15) - @ReadWrite(bits: 12..<16) - public var afrh11: AFRH11 - - /// Alternate function selection for port x bit y (y = 8..15) - @ReadWrite(bits: 8..<12) - public var afrh10: AFRH10 - - /// Alternate function selection for port x bit y (y = 8..15) - @ReadWrite(bits: 4..<8) - public var afrh9: AFRH9 - - /// Alternate function selection for port x bit y (y = 8..15) - @ReadWrite(bits: 0..<4, as: AFRH8Values.self) - public var afrh8: AFRH8 - } - - /// GPIO port bit reset register - @Register(bitWidth: 32) - public struct BRR { - /// Port A Reset bit 0 - @ReadWrite(bits: 0..<1) - public var br0: BR0 - - /// Port A Reset bit 1 - @ReadWrite(bits: 1..<2) - public var br1: BR1 - - /// Port A Reset bit 2 - @ReadWrite(bits: 2..<3) - public var br2: BR2 - - /// Port A Reset bit 3 - @ReadWrite(bits: 3..<4) - public var br3: BR3 - - /// Port A Reset bit 4 - @ReadWrite(bits: 4..<5) - public var br4: BR4 - - /// Port A Reset bit 5 - @ReadWrite(bits: 5..<6) - public var br5: BR5 - - /// Port A Reset bit 6 - @ReadWrite(bits: 6..<7) - public var br6: BR6 - - /// Port A Reset bit 7 - @ReadWrite(bits: 7..<8) - public var br7: BR7 - - /// Port A Reset bit 8 - @ReadWrite(bits: 8..<9) - public var br8: BR8 - - /// Port A Reset bit 9 - @ReadWrite(bits: 9..<10) - public var br9: BR9 - - /// Port A Reset bit 10 - @ReadWrite(bits: 10..<11) - public var br10: BR10 - - /// Port A Reset bit 11 - @ReadWrite(bits: 11..<12) - public var br11: BR11 - - /// Port A Reset bit 12 - @ReadWrite(bits: 12..<13) - public var br12: BR12 - - /// Port A Reset bit 13 - @ReadWrite(bits: 13..<14) - public var br13: BR13 - - /// Port A Reset bit 14 - @ReadWrite(bits: 14..<15) - public var br14: BR14 - - /// Port A Reset bit 15 - @ReadWrite(bits: 15..<16) - public var br15: BR15 - } -} - -extension GPIOA.MODER { - public struct MODER0Values: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// Input mode (reset state) - public static let Input = Self(rawValue: 0x0) - - /// General purpose output mode - public static let Output = Self(rawValue: 0x1) - - /// Alternate function mode - public static let Alternate = Self(rawValue: 0x2) - - /// Analog mode - public static let Analog = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension GPIOA.OTYPER { - public struct OT0Values: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Output push-pull (reset state) - public static let PushPull = Self(rawValue: 0x0) - - /// Output open-drain - public static let OpenDrain = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension GPIOA.OSPEEDR { - public struct OSPEEDR0Values: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// Low speed - public static let LowSpeed = Self(rawValue: 0x0) - - /// Medium speed - public static let MediumSpeed = Self(rawValue: 0x1) - - /// High speed - public static let HighSpeed = Self(rawValue: 0x2) - - /// Very high speed - public static let VeryHighSpeed = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension GPIOA.PUPDR { - public struct PUPDR0Values: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// No pull-up, pull-down - public static let Floating = Self(rawValue: 0x0) - - /// Pull-up - public static let PullUp = Self(rawValue: 0x1) - - /// Pull-down - public static let PullDown = Self(rawValue: 0x2) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension GPIOA.ODR { - public struct ODR0Values: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Set output to logic low - public static let Low = Self(rawValue: 0x0) - - /// Set output to logic high - public static let High = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension GPIOA.LCKR { - public struct LCKKValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Port configuration lock key not active - public static let NotActive = Self(rawValue: 0x0) - - /// Port configuration lock key active - public static let Active = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension GPIOA.LCKR { - public struct LCK0Values: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Port configuration not locked - public static let Unlocked = Self(rawValue: 0x0) - - /// Port configuration locked - public static let Locked = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension GPIOA.AFRL { - public struct AFRL0Values: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 4 - - /// AF0 - public static let AF0 = Self(rawValue: 0x0) - - /// AF1 - public static let AF1 = Self(rawValue: 0x1) - - /// AF2 - public static let AF2 = Self(rawValue: 0x2) - - /// AF3 - public static let AF3 = Self(rawValue: 0x3) - - /// AF4 - public static let AF4 = Self(rawValue: 0x4) - - /// AF5 - public static let AF5 = Self(rawValue: 0x5) - - /// AF6 - public static let AF6 = Self(rawValue: 0x6) - - /// AF7 - public static let AF7 = Self(rawValue: 0x7) - - /// AF8 - public static let AF8 = Self(rawValue: 0x8) - - /// AF9 - public static let AF9 = Self(rawValue: 0x9) - - /// AF10 - public static let AF10 = Self(rawValue: 0xa) - - /// AF11 - public static let AF11 = Self(rawValue: 0xb) - - /// AF12 - public static let AF12 = Self(rawValue: 0xc) - - /// AF13 - public static let AF13 = Self(rawValue: 0xd) - - /// AF14 - public static let AF14 = Self(rawValue: 0xe) - - /// AF15 - public static let AF15 = Self(rawValue: 0xf) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension GPIOA.AFRH { - public struct AFRH8Values: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 4 - - /// AF0 - public static let AF0 = Self(rawValue: 0x0) - - /// AF1 - public static let AF1 = Self(rawValue: 0x1) - - /// AF2 - public static let AF2 = Self(rawValue: 0x2) - - /// AF3 - public static let AF3 = Self(rawValue: 0x3) - - /// AF4 - public static let AF4 = Self(rawValue: 0x4) - - /// AF5 - public static let AF5 = Self(rawValue: 0x5) - - /// AF6 - public static let AF6 = Self(rawValue: 0x6) - - /// AF7 - public static let AF7 = Self(rawValue: 0x7) - - /// AF8 - public static let AF8 = Self(rawValue: 0x8) - - /// AF9 - public static let AF9 = Self(rawValue: 0x9) - - /// AF10 - public static let AF10 = Self(rawValue: 0xa) - - /// AF11 - public static let AF11 = Self(rawValue: 0xb) - - /// AF12 - public static let AF12 = Self(rawValue: 0xc) - - /// AF13 - public static let AF13 = Self(rawValue: 0xd) - - /// AF14 - public static let AF14 = Self(rawValue: 0xe) - - /// AF15 - public static let AF15 = Self(rawValue: 0xf) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} diff --git a/stm32-uart-echo/Sources/STM32F7X6/GPIOB.swift b/stm32-uart-echo/Sources/STM32F7X6/GPIOB.swift deleted file mode 100644 index bd0a35ba..00000000 --- a/stm32-uart-echo/Sources/STM32F7X6/GPIOB.swift +++ /dev/null @@ -1,7 +0,0 @@ -// Generated by svd2swift. - -import MMIO - -/// General-purpose I/Os -public typealias GPIOB = GPIOA - diff --git a/stm32-uart-echo/Sources/STM32F7X6/RCC.swift b/stm32-uart-echo/Sources/STM32F7X6/RCC.swift deleted file mode 100644 index 4a36aea8..00000000 --- a/stm32-uart-echo/Sources/STM32F7X6/RCC.swift +++ /dev/null @@ -1,2833 +0,0 @@ -// Generated by svd2swift. - -import MMIO - -/// Reset and clock control -@RegisterBlock -public struct RCC { - /// clock control register - @RegisterBlock(offset: 0x0) - public var cr: Register - - /// PLL configuration register - @RegisterBlock(offset: 0x4) - public var pllcfgr: Register - - /// clock configuration register - @RegisterBlock(offset: 0x8) - public var cfgr: Register - - /// clock interrupt register - @RegisterBlock(offset: 0xc) - public var cir: Register - - /// AHB1 peripheral reset register - @RegisterBlock(offset: 0x10) - public var ahb1rstr: Register - - /// AHB2 peripheral reset register - @RegisterBlock(offset: 0x14) - public var ahb2rstr: Register - - /// AHB3 peripheral reset register - @RegisterBlock(offset: 0x18) - public var ahb3rstr: Register - - /// APB1 peripheral reset register - @RegisterBlock(offset: 0x20) - public var apb1rstr: Register - - /// APB2 peripheral reset register - @RegisterBlock(offset: 0x24) - public var apb2rstr: Register - - /// AHB1 peripheral clock register - @RegisterBlock(offset: 0x30) - public var ahb1enr: Register - - /// AHB2 peripheral clock enable register - @RegisterBlock(offset: 0x34) - public var ahb2enr: Register - - /// AHB3 peripheral clock enable register - @RegisterBlock(offset: 0x38) - public var ahb3enr: Register - - /// APB1 peripheral clock enable register - @RegisterBlock(offset: 0x40) - public var apb1enr: Register - - /// APB2 peripheral clock enable register - @RegisterBlock(offset: 0x44) - public var apb2enr: Register - - /// AHB1 peripheral clock enable in low power mode register - @RegisterBlock(offset: 0x50) - public var ahb1lpenr: Register - - /// AHB2 peripheral clock enable in low power mode register - @RegisterBlock(offset: 0x54) - public var ahb2lpenr: Register - - /// AHB3 peripheral clock enable in low power mode register - @RegisterBlock(offset: 0x58) - public var ahb3lpenr: Register - - /// APB1 peripheral clock enable in low power mode register - @RegisterBlock(offset: 0x60) - public var apb1lpenr: Register - - /// APB2 peripheral clock enabled in low power mode register - @RegisterBlock(offset: 0x64) - public var apb2lpenr: Register - - /// Backup domain control register - @RegisterBlock(offset: 0x70) - public var bdcr: Register - - /// clock control & status register - @RegisterBlock(offset: 0x74) - public var csr: Register - - /// spread spectrum clock generation register - @RegisterBlock(offset: 0x80) - public var sscgr: Register - - /// PLLI2S configuration register - @RegisterBlock(offset: 0x84) - public var plli2scfgr: Register - - /// PLL configuration register - @RegisterBlock(offset: 0x88) - public var pllsaicfgr: Register - - /// dedicated clocks configuration register - @RegisterBlock(offset: 0x8c) - public var dckcfgr1: Register - - /// dedicated clocks configuration register - @RegisterBlock(offset: 0x90) - public var dckcfgr2: Register -} - -extension RCC { - /// clock control register - @Register(bitWidth: 32) - public struct CR { - /// PLLI2S clock ready flag - @ReadOnly(bits: 27..<28) - public var plli2srdy: PLLI2SRDY - - /// PLLI2S enable - @ReadWrite(bits: 26..<27) - public var plli2son: PLLI2SON - - /// Main PLL (PLL) clock ready flag - @ReadOnly(bits: 25..<26) - public var pllrdy: PLLRDY - - /// Main PLL (PLL) enable - @ReadWrite(bits: 24..<25) - public var pllon: PLLON - - /// Clock security system enable - @ReadWrite(bits: 19..<20, as: CSSONValues.self) - public var csson: CSSON - - /// HSE clock bypass - @ReadWrite(bits: 18..<19, as: HSEBYPValues.self) - public var hsebyp: HSEBYP - - /// HSE clock ready flag - @ReadOnly(bits: 17..<18) - public var hserdy: HSERDY - - /// HSE clock enable - @ReadWrite(bits: 16..<17) - public var hseon: HSEON - - /// Internal high-speed clock calibration - @ReadOnly(bits: 8..<16) - public var hsical: HSICAL - - /// Internal high-speed clock trimming - @ReadWrite(bits: 3..<8) - public var hsitrim: HSITRIM - - /// Internal high-speed clock ready flag - @ReadOnly(bits: 1..<2) - public var hsirdy: HSIRDY - - /// Internal high-speed clock enable - @ReadWrite(bits: 0..<1, as: HSIONValues.self) - public var hsion: HSION - - /// PLLSAI clock ready flag - @ReadOnly(bits: 29..<30) - public var pllsairdy: PLLSAIRDY - - /// PLLSAI enable - @ReadWrite(bits: 28..<29) - public var pllsaion: PLLSAION - } - - /// PLL configuration register - @Register(bitWidth: 32) - public struct PLLCFGR { - /// Main PLL(PLL) and audio PLL (PLLI2S) entry clock source - @ReadWrite(bits: 22..<23, as: PLLSRCValues.self) - public var pllsrc: PLLSRC - - /// Division factor for the main PLL (PLL) and audio PLL (PLLI2S) input clock - @ReadWrite(bits: 0..<6) - public var pllm: PLLM - - /// Main PLL (PLL) multiplication factor for VCO - @ReadWrite(bits: 6..<15) - public var plln: PLLN - - /// Main PLL (PLL) division factor for main system clock - @ReadWrite(bits: 16..<18, as: PLLPValues.self) - public var pllp: PLLP - - /// Main PLL (PLL) division factor for USB OTG FS, SDIO and random number generator clocks - @ReadWrite(bits: 24..<28) - public var pllq: PLLQ - } - - /// clock configuration register - @Register(bitWidth: 32) - public struct CFGR { - /// Microcontroller clock output 2 - @ReadWrite(bits: 30..<32, as: MCO2Values.self) - public var mco2: MCO2 - - /// MCO2 prescaler - @ReadWrite(bits: 27..<30) - public var mco2pre: MCO2PRE - - /// MCO1 prescaler - @ReadWrite(bits: 24..<27, as: MCO1PREValues.self) - public var mco1pre: MCO1PRE - - /// I2S clock selection - @ReadWrite(bits: 23..<24, as: I2SSRCValues.self) - public var i2ssrc: I2SSRC - - /// Microcontroller clock output 1 - @ReadWrite(bits: 21..<23, as: MCO1Values.self) - public var mco1: MCO1 - - /// HSE division factor for RTC clock - @ReadWrite(bits: 16..<21) - public var rtcpre: RTCPRE - - /// APB high-speed prescaler (APB2) - @ReadWrite(bits: 13..<16) - public var ppre2: PPRE2 - - /// APB Low speed prescaler (APB1) - @ReadWrite(bits: 10..<13, as: PPRE1Values.self) - public var ppre1: PPRE1 - - /// AHB prescaler - @ReadWrite(bits: 4..<8, as: HPREValues.self) - public var hpre: HPRE - - /// System clock switch - @Reserved(bits: 0..<2, as: SWValues.self) - public var sw: SW - - /// System clock switch status - @Reserved(bits: 2..<4) - public var sws: SWS - } - - /// clock interrupt register - @Register(bitWidth: 32) - public struct CIR { - /// Clock security system interrupt clear - @WriteOnly(bits: 23..<24) - public var cssc: CSSC - - /// PLLSAI Ready Interrupt Clear - @WriteOnly(bits: 22..<23) - public var pllsairdyc: PLLSAIRDYC - - /// PLLI2S ready interrupt clear - @WriteOnly(bits: 21..<22) - public var plli2srdyc: PLLI2SRDYC - - /// Main PLL(PLL) ready interrupt clear - @WriteOnly(bits: 20..<21) - public var pllrdyc: PLLRDYC - - /// HSE ready interrupt clear - @WriteOnly(bits: 19..<20) - public var hserdyc: HSERDYC - - /// HSI ready interrupt clear - @WriteOnly(bits: 18..<19) - public var hsirdyc: HSIRDYC - - /// LSE ready interrupt clear - @WriteOnly(bits: 17..<18) - public var lserdyc: LSERDYC - - /// LSI ready interrupt clear - @WriteOnly(bits: 16..<17) - public var lsirdyc: LSIRDYC - - /// PLLSAI Ready Interrupt Enable - @ReadWrite(bits: 14..<15) - public var pllsairdyie: PLLSAIRDYIE - - /// PLLI2S ready interrupt enable - @ReadWrite(bits: 13..<14) - public var plli2srdyie: PLLI2SRDYIE - - /// Main PLL (PLL) ready interrupt enable - @ReadWrite(bits: 12..<13) - public var pllrdyie: PLLRDYIE - - /// HSE ready interrupt enable - @ReadWrite(bits: 11..<12) - public var hserdyie: HSERDYIE - - /// HSI ready interrupt enable - @ReadWrite(bits: 10..<11) - public var hsirdyie: HSIRDYIE - - /// LSE ready interrupt enable - @ReadWrite(bits: 9..<10) - public var lserdyie: LSERDYIE - - /// LSI ready interrupt enable - @ReadWrite(bits: 8..<9, as: LSIRDYIEValues.self) - public var lsirdyie: LSIRDYIE - - /// Clock security system interrupt flag - @ReadOnly(bits: 7..<8) - public var cssf: CSSF - - /// PLLSAI ready interrupt flag - @ReadOnly(bits: 6..<7) - public var pllsairdyf: PLLSAIRDYF - - /// PLLI2S ready interrupt flag - @ReadOnly(bits: 5..<6) - public var plli2srdyf: PLLI2SRDYF - - /// Main PLL (PLL) ready interrupt flag - @ReadOnly(bits: 4..<5) - public var pllrdyf: PLLRDYF - - /// HSE ready interrupt flag - @ReadOnly(bits: 3..<4) - public var hserdyf: HSERDYF - - /// HSI ready interrupt flag - @ReadOnly(bits: 2..<3) - public var hsirdyf: HSIRDYF - - /// LSE ready interrupt flag - @ReadOnly(bits: 1..<2) - public var lserdyf: LSERDYF - - /// LSI ready interrupt flag - @ReadOnly(bits: 0..<1) - public var lsirdyf: LSIRDYF - } - - /// AHB1 peripheral reset register - @Register(bitWidth: 32) - public struct AHB1RSTR { - /// USB OTG HS module reset - @ReadWrite(bits: 29..<30) - public var otghsrst: OTGHSRST - - /// Ethernet MAC reset - @ReadWrite(bits: 25..<26) - public var ethmacrst: ETHMACRST - - /// DMA2D reset - @ReadWrite(bits: 23..<24) - public var dma2drst: DMA2DRST - - /// DMA2 reset - @ReadWrite(bits: 22..<23) - public var dma2rst: DMA2RST - - /// DMA2 reset - @ReadWrite(bits: 21..<22) - public var dma1rst: DMA1RST - - /// CRC reset - @ReadWrite(bits: 12..<13) - public var crcrst: CRCRST - - /// IO port K reset - @ReadWrite(bits: 10..<11) - public var gpiokrst: GPIOKRST - - /// IO port J reset - @ReadWrite(bits: 9..<10) - public var gpiojrst: GPIOJRST - - /// IO port I reset - @ReadWrite(bits: 8..<9) - public var gpioirst: GPIOIRST - - /// IO port H reset - @ReadWrite(bits: 7..<8) - public var gpiohrst: GPIOHRST - - /// IO port G reset - @ReadWrite(bits: 6..<7) - public var gpiogrst: GPIOGRST - - /// IO port F reset - @ReadWrite(bits: 5..<6) - public var gpiofrst: GPIOFRST - - /// IO port E reset - @ReadWrite(bits: 4..<5) - public var gpioerst: GPIOERST - - /// IO port D reset - @ReadWrite(bits: 3..<4) - public var gpiodrst: GPIODRST - - /// IO port C reset - @ReadWrite(bits: 2..<3) - public var gpiocrst: GPIOCRST - - /// IO port B reset - @ReadWrite(bits: 1..<2) - public var gpiobrst: GPIOBRST - - /// IO port A reset - @ReadWrite(bits: 0..<1, as: GPIOARSTValues.self) - public var gpioarst: GPIOARST - } - - /// AHB2 peripheral reset register - @Register(bitWidth: 32) - public struct AHB2RSTR { - /// USB OTG FS module reset - @ReadWrite(bits: 7..<8) - public var otgfsrst: OTGFSRST - - /// Random number generator module reset - @ReadWrite(bits: 6..<7) - public var rngrst: RNGRST - - /// Hash module reset - @ReadWrite(bits: 5..<6) - public var hsahrst: HSAHRST - - /// Cryptographic module reset - @ReadWrite(bits: 4..<5) - public var cryprst: CRYPRST - - /// Camera interface reset - @ReadWrite(bits: 0..<1, as: DCMIRSTValues.self) - public var dcmirst: DCMIRST - } - - /// AHB3 peripheral reset register - @Register(bitWidth: 32) - public struct AHB3RSTR { - /// Flexible memory controller module reset - @ReadWrite(bits: 0..<1, as: FMCRSTValues.self) - public var fmcrst: FMCRST - - /// Quad SPI memory controller reset - @ReadWrite(bits: 1..<2) - public var qspirst: QSPIRST - } - - /// APB1 peripheral reset register - @Register(bitWidth: 32) - public struct APB1RSTR { - /// TIM2 reset - @ReadWrite(bits: 0..<1, as: TIM2RSTValues.self) - public var tim2rst: TIM2RST - - /// TIM3 reset - @ReadWrite(bits: 1..<2) - public var tim3rst: TIM3RST - - /// TIM4 reset - @ReadWrite(bits: 2..<3) - public var tim4rst: TIM4RST - - /// TIM5 reset - @ReadWrite(bits: 3..<4) - public var tim5rst: TIM5RST - - /// TIM6 reset - @ReadWrite(bits: 4..<5) - public var tim6rst: TIM6RST - - /// TIM7 reset - @ReadWrite(bits: 5..<6) - public var tim7rst: TIM7RST - - /// TIM12 reset - @ReadWrite(bits: 6..<7) - public var tim12rst: TIM12RST - - /// TIM13 reset - @ReadWrite(bits: 7..<8) - public var tim13rst: TIM13RST - - /// TIM14 reset - @ReadWrite(bits: 8..<9) - public var tim14rst: TIM14RST - - /// Window watchdog reset - @ReadWrite(bits: 11..<12) - public var wwdgrst: WWDGRST - - /// SPI 2 reset - @ReadWrite(bits: 14..<15) - public var spi2rst: SPI2RST - - /// SPI 3 reset - @ReadWrite(bits: 15..<16) - public var spi3rst: SPI3RST - - /// USART 2 reset - @ReadWrite(bits: 17..<18) - public var usart2rst: USART2RST - - /// USART 3 reset - @ReadWrite(bits: 18..<19) - public var usart3rst: USART3RST - - /// USART 4 reset - @ReadWrite(bits: 19..<20) - public var uart4rst: UART4RST - - /// USART 5 reset - @ReadWrite(bits: 20..<21) - public var uart5rst: UART5RST - - /// I2C 1 reset - @ReadWrite(bits: 21..<22) - public var i2c1rst: I2C1RST - - /// I2C 2 reset - @ReadWrite(bits: 22..<23) - public var i2c2rst: I2C2RST - - /// I2C3 reset - @ReadWrite(bits: 23..<24) - public var i2c3rst: I2C3RST - - /// CAN1 reset - @ReadWrite(bits: 25..<26) - public var can1rst: CAN1RST - - /// CAN2 reset - @ReadWrite(bits: 26..<27) - public var can2rst: CAN2RST - - /// Power interface reset - @ReadWrite(bits: 28..<29) - public var pwrrst: PWRRST - - /// DAC reset - @ReadWrite(bits: 29..<30) - public var dacrst: DACRST - - /// UART7 reset - @ReadWrite(bits: 30..<31) - public var uart7rst: UART7RST - - /// UART8 reset - @ReadWrite(bits: 31..<32) - public var uart8rst: UART8RST - - /// SPDIF-RX reset - @ReadWrite(bits: 16..<17) - public var spdifrxrst: SPDIFRXRST - - /// HDMI-CEC reset - @ReadWrite(bits: 27..<28) - public var cecrst: CECRST - - /// Low power timer 1 reset - @ReadWrite(bits: 9..<10) - public var lptim1rst: LPTIM1RST - - /// I2C 4 reset - @ReadWrite(bits: 24..<25) - public var i2c4rst: I2C4RST - } - - /// APB2 peripheral reset register - @Register(bitWidth: 32) - public struct APB2RSTR { - /// TIM1 reset - @ReadWrite(bits: 0..<1, as: TIM1RSTValues.self) - public var tim1rst: TIM1RST - - /// TIM8 reset - @ReadWrite(bits: 1..<2) - public var tim8rst: TIM8RST - - /// USART1 reset - @ReadWrite(bits: 4..<5) - public var usart1rst: USART1RST - - /// USART6 reset - @ReadWrite(bits: 5..<6) - public var usart6rst: USART6RST - - /// ADC interface reset (common to all ADCs) - @ReadWrite(bits: 8..<9) - public var adcrst: ADCRST - - /// SPI 1 reset - @ReadWrite(bits: 12..<13) - public var spi1rst: SPI1RST - - /// SPI4 reset - @ReadWrite(bits: 13..<14) - public var spi4rst: SPI4RST - - /// System configuration controller reset - @ReadWrite(bits: 14..<15) - public var syscfgrst: SYSCFGRST - - /// TIM9 reset - @ReadWrite(bits: 16..<17) - public var tim9rst: TIM9RST - - /// TIM10 reset - @ReadWrite(bits: 17..<18) - public var tim10rst: TIM10RST - - /// TIM11 reset - @ReadWrite(bits: 18..<19) - public var tim11rst: TIM11RST - - /// SPI5 reset - @ReadWrite(bits: 20..<21) - public var spi5rst: SPI5RST - - /// SPI6 reset - @ReadWrite(bits: 21..<22) - public var spi6rst: SPI6RST - - /// SAI1 reset - @ReadWrite(bits: 22..<23) - public var sai1rst: SAI1RST - - /// LTDC reset - @ReadWrite(bits: 26..<27) - public var ltdcrst: LTDCRST - - /// SAI2 reset - @ReadWrite(bits: 23..<24) - public var sai2rst: SAI2RST - - /// SDMMC1 reset - @ReadWrite(bits: 11..<12) - public var sdmmc1rst: SDMMC1RST - } - - /// AHB1 peripheral clock register - @Register(bitWidth: 32) - public struct AHB1ENR { - /// USB OTG HSULPI clock enable - @ReadWrite(bits: 30..<31) - public var otghsulpien: OTGHSULPIEN - - /// USB OTG HS clock enable - @ReadWrite(bits: 29..<30) - public var otghsen: OTGHSEN - - /// Ethernet PTP clock enable - @ReadWrite(bits: 28..<29) - public var ethmacptpen: ETHMACPTPEN - - /// Ethernet Reception clock enable - @ReadWrite(bits: 27..<28) - public var ethmacrxen: ETHMACRXEN - - /// Ethernet Transmission clock enable - @ReadWrite(bits: 26..<27) - public var ethmactxen: ETHMACTXEN - - /// Ethernet MAC clock enable - @ReadWrite(bits: 25..<26) - public var ethmacen: ETHMACEN - - /// DMA2D clock enable - @ReadWrite(bits: 23..<24) - public var dma2den: DMA2DEN - - /// DMA2 clock enable - @ReadWrite(bits: 22..<23) - public var dma2en: DMA2EN - - /// DMA1 clock enable - @ReadWrite(bits: 21..<22) - public var dma1en: DMA1EN - - /// CCM data RAM clock enable - @ReadWrite(bits: 20..<21) - public var dtcmramen: DTCMRAMEN - - /// Backup SRAM interface clock enable - @ReadWrite(bits: 18..<19) - public var bkpsramen: BKPSRAMEN - - /// CRC clock enable - @ReadWrite(bits: 12..<13) - public var crcen: CRCEN - - /// IO port K clock enable - @ReadWrite(bits: 10..<11) - public var gpioken: GPIOKEN - - /// IO port J clock enable - @ReadWrite(bits: 9..<10) - public var gpiojen: GPIOJEN - - /// IO port I clock enable - @ReadWrite(bits: 8..<9) - public var gpioien: GPIOIEN - - /// IO port H clock enable - @ReadWrite(bits: 7..<8) - public var gpiohen: GPIOHEN - - /// IO port G clock enable - @ReadWrite(bits: 6..<7) - public var gpiogen: GPIOGEN - - /// IO port F clock enable - @ReadWrite(bits: 5..<6) - public var gpiofen: GPIOFEN - - /// IO port E clock enable - @ReadWrite(bits: 4..<5) - public var gpioeen: GPIOEEN - - /// IO port D clock enable - @ReadWrite(bits: 3..<4) - public var gpioden: GPIODEN - - /// IO port C clock enable - @ReadWrite(bits: 2..<3) - public var gpiocen: GPIOCEN - - /// IO port B clock enable - @ReadWrite(bits: 1..<2) - public var gpioben: GPIOBEN - - /// IO port A clock enable - @ReadWrite(bits: 0..<1, as: GPIOAENValues.self) - public var gpioaen: GPIOAEN - } - - /// AHB2 peripheral clock enable register - @Register(bitWidth: 32) - public struct AHB2ENR { - /// USB OTG FS clock enable - @ReadWrite(bits: 7..<8) - public var otgfsen: OTGFSEN - - /// Random number generator clock enable - @ReadWrite(bits: 6..<7) - public var rngen: RNGEN - - /// Hash modules clock enable - @ReadWrite(bits: 5..<6) - public var hashen: HASHEN - - /// Cryptographic modules clock enable - @ReadWrite(bits: 4..<5) - public var crypen: CRYPEN - - /// Camera interface enable - @ReadWrite(bits: 0..<1, as: DCMIENValues.self) - public var dcmien: DCMIEN - } - - /// AHB3 peripheral clock enable register - @Register(bitWidth: 32) - public struct AHB3ENR { - /// Flexible memory controller module clock enable - @ReadWrite(bits: 0..<1, as: FMCENValues.self) - public var fmcen: FMCEN - - /// Quad SPI memory controller clock enable - @ReadWrite(bits: 1..<2) - public var qspien: QSPIEN - } - - /// APB1 peripheral clock enable register - @Register(bitWidth: 32) - public struct APB1ENR { - /// TIM2 clock enable - @ReadWrite(bits: 0..<1, as: TIM2ENValues.self) - public var tim2en: TIM2EN - - /// TIM3 clock enable - @ReadWrite(bits: 1..<2) - public var tim3en: TIM3EN - - /// TIM4 clock enable - @ReadWrite(bits: 2..<3) - public var tim4en: TIM4EN - - /// TIM5 clock enable - @ReadWrite(bits: 3..<4) - public var tim5en: TIM5EN - - /// TIM6 clock enable - @ReadWrite(bits: 4..<5) - public var tim6en: TIM6EN - - /// TIM7 clock enable - @ReadWrite(bits: 5..<6) - public var tim7en: TIM7EN - - /// TIM12 clock enable - @ReadWrite(bits: 6..<7) - public var tim12en: TIM12EN - - /// TIM13 clock enable - @ReadWrite(bits: 7..<8) - public var tim13en: TIM13EN - - /// TIM14 clock enable - @ReadWrite(bits: 8..<9) - public var tim14en: TIM14EN - - /// Window watchdog clock enable - @ReadWrite(bits: 11..<12) - public var wwdgen: WWDGEN - - /// SPI2 clock enable - @ReadWrite(bits: 14..<15) - public var spi2en: SPI2EN - - /// SPI3 clock enable - @ReadWrite(bits: 15..<16) - public var spi3en: SPI3EN - - /// USART 2 clock enable - @ReadWrite(bits: 17..<18) - public var usart2en: USART2EN - - /// USART3 clock enable - @ReadWrite(bits: 18..<19) - public var usart3en: USART3EN - - /// UART4 clock enable - @ReadWrite(bits: 19..<20) - public var uart4en: UART4EN - - /// UART5 clock enable - @ReadWrite(bits: 20..<21) - public var uart5en: UART5EN - - /// I2C1 clock enable - @ReadWrite(bits: 21..<22) - public var i2c1en: I2C1EN - - /// I2C2 clock enable - @ReadWrite(bits: 22..<23) - public var i2c2en: I2C2EN - - /// I2C3 clock enable - @ReadWrite(bits: 23..<24) - public var i2c3en: I2C3EN - - /// CAN 1 clock enable - @ReadWrite(bits: 25..<26) - public var can1en: CAN1EN - - /// CAN 2 clock enable - @ReadWrite(bits: 26..<27) - public var can2en: CAN2EN - - /// Power interface clock enable - @ReadWrite(bits: 28..<29) - public var pwren: PWREN - - /// DAC interface clock enable - @ReadWrite(bits: 29..<30) - public var dacen: DACEN - - /// UART7 clock enable - @ReadWrite(bits: 30..<31) - public var uart7en: UART7EN - - /// UART8 clock enable - @ReadWrite(bits: 31..<32) - public var uart8en: UART8EN - - /// SPDIF-RX clock enable - @ReadWrite(bits: 16..<17) - public var spdifrxen: SPDIFRXEN - - /// HDMI-CEN clock enable - @ReadWrite(bits: 27..<28) - public var cecen: CECEN - - /// Low power timer 1 clock enable - @ReadWrite(bits: 9..<10) - public var lptim1en: LPTIM1EN - - /// I2C4 clock enable - @ReadWrite(bits: 24..<25) - public var i2c4en: I2C4EN - } - - /// APB2 peripheral clock enable register - @Register(bitWidth: 32) - public struct APB2ENR { - /// TIM1 clock enable - @ReadWrite(bits: 0..<1, as: TIM1ENValues.self) - public var tim1en: TIM1EN - - /// TIM8 clock enable - @ReadWrite(bits: 1..<2) - public var tim8en: TIM8EN - - /// USART1 clock enable - @ReadWrite(bits: 4..<5) - public var usart1en: USART1EN - - /// USART6 clock enable - @ReadWrite(bits: 5..<6) - public var usart6en: USART6EN - - /// ADC1 clock enable - @ReadWrite(bits: 8..<9) - public var adc1en: ADC1EN - - /// ADC2 clock enable - @ReadWrite(bits: 9..<10) - public var adc2en: ADC2EN - - /// ADC3 clock enable - @ReadWrite(bits: 10..<11) - public var adc3en: ADC3EN - - /// SPI1 clock enable - @ReadWrite(bits: 12..<13) - public var spi1en: SPI1EN - - /// SPI4 clock enable - @ReadWrite(bits: 13..<14) - public var spi4en: SPI4EN - - /// System configuration controller clock enable - @ReadWrite(bits: 14..<15) - public var syscfgen: SYSCFGEN - - /// TIM9 clock enable - @ReadWrite(bits: 16..<17) - public var tim9en: TIM9EN - - /// TIM10 clock enable - @ReadWrite(bits: 17..<18) - public var tim10en: TIM10EN - - /// TIM11 clock enable - @ReadWrite(bits: 18..<19) - public var tim11en: TIM11EN - - /// SPI5 clock enable - @ReadWrite(bits: 20..<21) - public var spi5en: SPI5EN - - /// SPI6 clock enable - @ReadWrite(bits: 21..<22) - public var spi6en: SPI6EN - - /// SAI1 clock enable - @ReadWrite(bits: 22..<23) - public var sai1en: SAI1EN - - /// LTDC clock enable - @ReadWrite(bits: 26..<27) - public var ltdcen: LTDCEN - - /// SAI2 clock enable - @ReadWrite(bits: 23..<24) - public var sai2en: SAI2EN - - /// SDMMC1 clock enable - @ReadWrite(bits: 11..<12) - public var sdmmc1en: SDMMC1EN - } - - /// AHB1 peripheral clock enable in low power mode register - @Register(bitWidth: 32) - public struct AHB1LPENR { - /// IO port A clock enable during sleep mode - @ReadWrite(bits: 0..<1, as: GPIOALPENValues.self) - public var gpioalpen: GPIOALPEN - - /// IO port B clock enable during Sleep mode - @ReadWrite(bits: 1..<2) - public var gpioblpen: GPIOBLPEN - - /// IO port C clock enable during Sleep mode - @ReadWrite(bits: 2..<3) - public var gpioclpen: GPIOCLPEN - - /// IO port D clock enable during Sleep mode - @ReadWrite(bits: 3..<4) - public var gpiodlpen: GPIODLPEN - - /// IO port E clock enable during Sleep mode - @ReadWrite(bits: 4..<5) - public var gpioelpen: GPIOELPEN - - /// IO port F clock enable during Sleep mode - @ReadWrite(bits: 5..<6) - public var gpioflpen: GPIOFLPEN - - /// IO port G clock enable during Sleep mode - @ReadWrite(bits: 6..<7) - public var gpioglpen: GPIOGLPEN - - /// IO port H clock enable during Sleep mode - @ReadWrite(bits: 7..<8) - public var gpiohlpen: GPIOHLPEN - - /// IO port I clock enable during Sleep mode - @ReadWrite(bits: 8..<9) - public var gpioilpen: GPIOILPEN - - /// IO port J clock enable during Sleep mode - @ReadWrite(bits: 9..<10) - public var gpiojlpen: GPIOJLPEN - - /// IO port K clock enable during Sleep mode - @ReadWrite(bits: 10..<11) - public var gpioklpen: GPIOKLPEN - - /// CRC clock enable during Sleep mode - @ReadWrite(bits: 12..<13) - public var crclpen: CRCLPEN - - /// Flash interface clock enable during Sleep mode - @ReadWrite(bits: 15..<16) - public var flitflpen: FLITFLPEN - - /// SRAM 1interface clock enable during Sleep mode - @ReadWrite(bits: 16..<17) - public var sram1lpen: SRAM1LPEN - - /// SRAM 2 interface clock enable during Sleep mode - @ReadWrite(bits: 17..<18) - public var sram2lpen: SRAM2LPEN - - /// Backup SRAM interface clock enable during Sleep mode - @ReadWrite(bits: 18..<19) - public var bkpsramlpen: BKPSRAMLPEN - - /// SRAM 3 interface clock enable during Sleep mode - @ReadWrite(bits: 19..<20) - public var sram3lpen: SRAM3LPEN - - /// DMA1 clock enable during Sleep mode - @ReadWrite(bits: 21..<22) - public var dma1lpen: DMA1LPEN - - /// DMA2 clock enable during Sleep mode - @ReadWrite(bits: 22..<23) - public var dma2lpen: DMA2LPEN - - /// DMA2D clock enable during Sleep mode - @ReadWrite(bits: 23..<24) - public var dma2dlpen: DMA2DLPEN - - /// Ethernet MAC clock enable during Sleep mode - @ReadWrite(bits: 25..<26) - public var ethmaclpen: ETHMACLPEN - - /// Ethernet transmission clock enable during Sleep mode - @ReadWrite(bits: 26..<27) - public var ethmactxlpen: ETHMACTXLPEN - - /// Ethernet reception clock enable during Sleep mode - @ReadWrite(bits: 27..<28) - public var ethmacrxlpen: ETHMACRXLPEN - - /// Ethernet PTP clock enable during Sleep mode - @ReadWrite(bits: 28..<29) - public var ethmacptplpen: ETHMACPTPLPEN - - /// USB OTG HS clock enable during Sleep mode - @ReadWrite(bits: 29..<30) - public var otghslpen: OTGHSLPEN - - /// USB OTG HS ULPI clock enable during Sleep mode - @ReadWrite(bits: 30..<31) - public var otghsulpilpen: OTGHSULPILPEN - - /// AXI to AHB bridge clock enable during Sleep mode - @ReadWrite(bits: 13..<14) - public var axilpen: AXILPEN - - /// DTCM RAM interface clock enable during Sleep mode - @ReadWrite(bits: 20..<21) - public var dtcmlpen: DTCMLPEN - } - - /// AHB2 peripheral clock enable in low power mode register - @Register(bitWidth: 32) - public struct AHB2LPENR { - /// USB OTG FS clock enable during Sleep mode - @ReadWrite(bits: 7..<8) - public var otgfslpen: OTGFSLPEN - - /// Random number generator clock enable during Sleep mode - @ReadWrite(bits: 6..<7) - public var rnglpen: RNGLPEN - - /// Hash modules clock enable during Sleep mode - @ReadWrite(bits: 5..<6) - public var hashlpen: HASHLPEN - - /// Cryptography modules clock enable during Sleep mode - @ReadWrite(bits: 4..<5) - public var cryplpen: CRYPLPEN - - /// Camera interface enable during Sleep mode - @ReadWrite(bits: 0..<1, as: DCMILPENValues.self) - public var dcmilpen: DCMILPEN - } - - /// AHB3 peripheral clock enable in low power mode register - @Register(bitWidth: 32) - public struct AHB3LPENR { - /// Flexible memory controller module clock enable during Sleep mode - @ReadWrite(bits: 0..<1, as: FMCLPENValues.self) - public var fmclpen: FMCLPEN - - /// Quand SPI memory controller clock enable during Sleep mode - @ReadWrite(bits: 1..<2) - public var qspilpen: QSPILPEN - } - - /// APB1 peripheral clock enable in low power mode register - @Register(bitWidth: 32) - public struct APB1LPENR { - /// TIM2 clock enable during Sleep mode - @ReadWrite(bits: 0..<1, as: TIM2LPENValues.self) - public var tim2lpen: TIM2LPEN - - /// TIM3 clock enable during Sleep mode - @ReadWrite(bits: 1..<2) - public var tim3lpen: TIM3LPEN - - /// TIM4 clock enable during Sleep mode - @ReadWrite(bits: 2..<3) - public var tim4lpen: TIM4LPEN - - /// TIM5 clock enable during Sleep mode - @ReadWrite(bits: 3..<4) - public var tim5lpen: TIM5LPEN - - /// TIM6 clock enable during Sleep mode - @ReadWrite(bits: 4..<5) - public var tim6lpen: TIM6LPEN - - /// TIM7 clock enable during Sleep mode - @ReadWrite(bits: 5..<6) - public var tim7lpen: TIM7LPEN - - /// TIM12 clock enable during Sleep mode - @ReadWrite(bits: 6..<7) - public var tim12lpen: TIM12LPEN - - /// TIM13 clock enable during Sleep mode - @ReadWrite(bits: 7..<8) - public var tim13lpen: TIM13LPEN - - /// TIM14 clock enable during Sleep mode - @ReadWrite(bits: 8..<9) - public var tim14lpen: TIM14LPEN - - /// Window watchdog clock enable during Sleep mode - @ReadWrite(bits: 11..<12) - public var wwdglpen: WWDGLPEN - - /// SPI2 clock enable during Sleep mode - @ReadWrite(bits: 14..<15) - public var spi2lpen: SPI2LPEN - - /// SPI3 clock enable during Sleep mode - @ReadWrite(bits: 15..<16) - public var spi3lpen: SPI3LPEN - - /// USART2 clock enable during Sleep mode - @ReadWrite(bits: 17..<18) - public var usart2lpen: USART2LPEN - - /// USART3 clock enable during Sleep mode - @ReadWrite(bits: 18..<19) - public var usart3lpen: USART3LPEN - - /// UART4 clock enable during Sleep mode - @ReadWrite(bits: 19..<20) - public var uart4lpen: UART4LPEN - - /// UART5 clock enable during Sleep mode - @ReadWrite(bits: 20..<21) - public var uart5lpen: UART5LPEN - - /// I2C1 clock enable during Sleep mode - @ReadWrite(bits: 21..<22) - public var i2c1lpen: I2C1LPEN - - /// I2C2 clock enable during Sleep mode - @ReadWrite(bits: 22..<23) - public var i2c2lpen: I2C2LPEN - - /// I2C3 clock enable during Sleep mode - @ReadWrite(bits: 23..<24) - public var i2c3lpen: I2C3LPEN - - /// CAN 1 clock enable during Sleep mode - @ReadWrite(bits: 25..<26) - public var can1lpen: CAN1LPEN - - /// CAN 2 clock enable during Sleep mode - @ReadWrite(bits: 26..<27) - public var can2lpen: CAN2LPEN - - /// Power interface clock enable during Sleep mode - @ReadWrite(bits: 28..<29) - public var pwrlpen: PWRLPEN - - /// DAC interface clock enable during Sleep mode - @ReadWrite(bits: 29..<30) - public var daclpen: DACLPEN - - /// UART7 clock enable during Sleep mode - @ReadWrite(bits: 30..<31) - public var uart7lpen: UART7LPEN - - /// UART8 clock enable during Sleep mode - @ReadWrite(bits: 31..<32) - public var uart8lpen: UART8LPEN - - /// SPDIF-RX clock enable during sleep mode - @ReadWrite(bits: 16..<17) - public var spdifrxlpen: SPDIFRXLPEN - - /// HDMI-CEN clock enable during Sleep mode - @ReadWrite(bits: 27..<28) - public var ceclpen: CECLPEN - - /// low power timer 1 clock enable during Sleep mode - @ReadWrite(bits: 9..<10) - public var lptim1lpen: LPTIM1LPEN - - /// I2C4 clock enable during Sleep mode - @ReadWrite(bits: 24..<25) - public var i2c4lpen: I2C4LPEN - } - - /// APB2 peripheral clock enabled in low power mode register - @Register(bitWidth: 32) - public struct APB2LPENR { - /// TIM1 clock enable during Sleep mode - @ReadWrite(bits: 0..<1, as: TIM1LPENValues.self) - public var tim1lpen: TIM1LPEN - - /// TIM8 clock enable during Sleep mode - @ReadWrite(bits: 1..<2) - public var tim8lpen: TIM8LPEN - - /// USART1 clock enable during Sleep mode - @ReadWrite(bits: 4..<5) - public var usart1lpen: USART1LPEN - - /// USART6 clock enable during Sleep mode - @ReadWrite(bits: 5..<6) - public var usart6lpen: USART6LPEN - - /// ADC1 clock enable during Sleep mode - @ReadWrite(bits: 8..<9) - public var adc1lpen: ADC1LPEN - - /// ADC2 clock enable during Sleep mode - @ReadWrite(bits: 9..<10) - public var adc2lpen: ADC2LPEN - - /// ADC 3 clock enable during Sleep mode - @ReadWrite(bits: 10..<11) - public var adc3lpen: ADC3LPEN - - /// SPI 1 clock enable during Sleep mode - @ReadWrite(bits: 12..<13) - public var spi1lpen: SPI1LPEN - - /// SPI 4 clock enable during Sleep mode - @ReadWrite(bits: 13..<14) - public var spi4lpen: SPI4LPEN - - /// System configuration controller clock enable during Sleep mode - @ReadWrite(bits: 14..<15) - public var syscfglpen: SYSCFGLPEN - - /// TIM9 clock enable during sleep mode - @ReadWrite(bits: 16..<17) - public var tim9lpen: TIM9LPEN - - /// TIM10 clock enable during Sleep mode - @ReadWrite(bits: 17..<18) - public var tim10lpen: TIM10LPEN - - /// TIM11 clock enable during Sleep mode - @ReadWrite(bits: 18..<19) - public var tim11lpen: TIM11LPEN - - /// SPI 5 clock enable during Sleep mode - @ReadWrite(bits: 20..<21) - public var spi5lpen: SPI5LPEN - - /// SPI 6 clock enable during Sleep mode - @ReadWrite(bits: 21..<22) - public var spi6lpen: SPI6LPEN - - /// SAI1 clock enable during sleep mode - @ReadWrite(bits: 22..<23) - public var sai1lpen: SAI1LPEN - - /// LTDC clock enable during sleep mode - @ReadWrite(bits: 26..<27) - public var ltdclpen: LTDCLPEN - - /// SAI2 clock enable during sleep mode - @ReadWrite(bits: 23..<24) - public var sai2lpen: SAI2LPEN - - /// SDMMC1 clock enable during Sleep mode - @ReadWrite(bits: 11..<12) - public var sdmmc1lpen: SDMMC1LPEN - } - - /// Backup domain control register - @Register(bitWidth: 32) - public struct BDCR { - /// Backup domain software reset - @ReadWrite(bits: 16..<17, as: BDRSTValues.self) - public var bdrst: BDRST - - /// RTC clock enable - @ReadWrite(bits: 15..<16, as: RTCENValues.self) - public var rtcen: RTCEN - - /// External low-speed oscillator bypass - @ReadWrite(bits: 2..<3, as: LSEBYPValues.self) - public var lsebyp: LSEBYP - - /// External low-speed oscillator ready - @ReadOnly(bits: 1..<2) - public var lserdy: LSERDY - - /// External low-speed oscillator enable - @ReadWrite(bits: 0..<1, as: LSEONValues.self) - public var lseon: LSEON - - /// LSE oscillator drive capability - @ReadWrite(bits: 3..<5, as: LSEDRVValues.self) - public var lsedrv: LSEDRV - - /// RTC clock source selection - @Reserved(bits: 8..<10, as: RTCSELValues.self) - public var rtcsel: RTCSEL - } - - /// clock control & status register - @Register(bitWidth: 32) - public struct CSR { - /// Low-power reset flag - @ReadWrite(bits: 31..<32) - public var lpwrrstf: LPWRRSTF - - /// Window watchdog reset flag - @ReadWrite(bits: 30..<31) - public var wwdgrstf: WWDGRSTF - - /// Independent watchdog reset flag - @ReadWrite(bits: 29..<30) - public var wdgrstf: WDGRSTF - - /// Software reset flag - @ReadWrite(bits: 28..<29) - public var sftrstf: SFTRSTF - - /// POR/PDR reset flag - @ReadWrite(bits: 27..<28) - public var porrstf: PORRSTF - - /// PIN reset flag - @ReadWrite(bits: 26..<27) - public var padrstf: PADRSTF - - /// BOR reset flag - @ReadWrite(bits: 25..<26) - public var borrstf: BORRSTF - - /// Remove reset flag - @ReadWrite(bits: 24..<25) - public var rmvf: RMVF - - /// Internal low-speed oscillator ready - @ReadOnly(bits: 1..<2) - public var lsirdy: LSIRDY - - /// Internal low-speed oscillator enable - @ReadWrite(bits: 0..<1, as: LSIONValues.self) - public var lsion: LSION - } - - /// spread spectrum clock generation register - @Register(bitWidth: 32) - public struct SSCGR { - /// Spread spectrum modulation enable - @ReadWrite(bits: 31..<32, as: SSCGENValues.self) - public var sscgen: SSCGEN - - /// Spread Select - @ReadWrite(bits: 30..<31, as: SPREADSELValues.self) - public var spreadsel: SPREADSEL - - /// Incrementation step - @ReadWrite(bits: 13..<28) - public var incstep: INCSTEP - - /// Modulation period - @ReadWrite(bits: 0..<13) - public var modper: MODPER - } - - /// PLLI2S configuration register - @Register(bitWidth: 32) - public struct PLLI2SCFGR { - /// PLLI2S division factor for I2S clocks - @ReadWrite(bits: 28..<31) - public var plli2sr: PLLI2SR - - /// PLLI2S division factor for SAI1 clock - @ReadWrite(bits: 24..<28) - public var plli2sq: PLLI2SQ - - /// PLLI2S multiplication factor for VCO - @ReadWrite(bits: 6..<15) - public var plli2sn: PLLI2SN - - /// PLLI2S division factor for SPDIFRX clock - @ReadWrite(bits: 16..<18, as: PLLI2SPValues.self) - public var plli2sp: PLLI2SP - } - - /// PLL configuration register - @Register(bitWidth: 32) - public struct PLLSAICFGR { - /// PLLSAI division factor for VCO - @ReadWrite(bits: 6..<15) - public var pllsain: PLLSAIN - - /// PLLSAI division factor for 48MHz clock - @ReadWrite(bits: 16..<18, as: PLLSAIPValues.self) - public var pllsaip: PLLSAIP - - /// PLLSAI division factor for SAI clock - @ReadWrite(bits: 24..<28) - public var pllsaiq: PLLSAIQ - - /// PLLSAI division factor for LCD clock - @ReadWrite(bits: 28..<31) - public var pllsair: PLLSAIR - } - - /// dedicated clocks configuration register - @Register(bitWidth: 32) - public struct DCKCFGR1 { - /// PLLI2S division factor for SAI1 clock - @ReadWrite(bits: 0..<5, as: PLLI2SDIVQValues.self) - public var plli2sdivq: PLLI2SDIVQ - - /// PLLSAI division factor for SAI1 clock - @ReadWrite(bits: 8..<13, as: PLLSAIDIVQValues.self) - public var pllsaidivq: PLLSAIDIVQ - - /// division factor for LCD_CLK - @ReadWrite(bits: 16..<18, as: PLLSAIDIVRValues.self) - public var pllsaidivr: PLLSAIDIVR - - /// SAI1 clock source selection - @ReadWrite(bits: 20..<22, as: SAI1SELValues.self) - public var sai1sel: SAI1SEL - - /// SAI2 clock source selection - @ReadWrite(bits: 22..<24, as: SAI2SELValues.self) - public var sai2sel: SAI2SEL - - /// Timers clocks prescalers selection - @ReadWrite(bits: 24..<25, as: TIMPREValues.self) - public var timpre: TIMPRE - } - - /// dedicated clocks configuration register - @Register(bitWidth: 32) - public struct DCKCFGR2 { - /// USART 1 clock source selection - @ReadWrite(bits: 0..<2, as: USART1SELValues.self) - public var usart1sel: USART1SEL - - /// USART 2 clock source selection - @ReadWrite(bits: 2..<4, as: USART2SELValues.self) - public var usart2sel: USART2SEL - - /// USART 3 clock source selection - @ReadWrite(bits: 4..<6) - public var usart3sel: USART3SEL - - /// UART 4 clock source selection - @ReadWrite(bits: 6..<8) - public var uart4sel: UART4SEL - - /// UART 5 clock source selection - @ReadWrite(bits: 8..<10) - public var uart5sel: UART5SEL - - /// USART 6 clock source selection - @ReadWrite(bits: 10..<12) - public var usart6sel: USART6SEL - - /// UART 7 clock source selection - @ReadWrite(bits: 12..<14) - public var uart7sel: UART7SEL - - /// UART 8 clock source selection - @ReadWrite(bits: 14..<16) - public var uart8sel: UART8SEL - - /// I2C1 clock source selection - @ReadWrite(bits: 16..<18, as: I2C1SELValues.self) - public var i2c1sel: I2C1SEL - - /// I2C2 clock source selection - @ReadWrite(bits: 18..<20) - public var i2c2sel: I2C2SEL - - /// I2C3 clock source selection - @ReadWrite(bits: 20..<22) - public var i2c3sel: I2C3SEL - - /// I2C4 clock source selection - @ReadWrite(bits: 22..<24) - public var i2c4sel: I2C4SEL - - /// Low power timer 1 clock source selection - @ReadWrite(bits: 24..<26, as: LPTIM1SELValues.self) - public var lptim1sel: LPTIM1SEL - - /// HDMI-CEC clock source selection - @ReadWrite(bits: 26..<27, as: CECSELValues.self) - public var cecsel: CECSEL - - /// 48MHz clock source selection - @ReadWrite(bits: 27..<28, as: CK48MSELValues.self) - public var ck48msel: CK48MSEL - - /// SDMMC clock source selection - @ReadWrite(bits: 28..<29, as: SDMMC1SELValues.self) - public var sdmmc1sel: SDMMC1SEL - } -} - -extension RCC.CR { - public struct CSSONValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Clock security system disabled (clock detector OFF) - public static let Off = Self(rawValue: 0x0) - - /// Clock security system enable (clock detector ON if the HSE is ready, OFF if not) - public static let On = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.CR { - public struct HSEBYPValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// HSE crystal oscillator not bypassed - public static let NotBypassed = Self(rawValue: 0x0) - - /// HSE crystal oscillator bypassed with external clock - public static let Bypassed = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.CR { - public struct HSIONValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Clock Off - public static let Off = Self(rawValue: 0x0) - - /// Clock On - public static let On = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.PLLCFGR { - public struct PLLSRCValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// HSI clock selected as PLL and PLLI2S clock entry - public static let HSI = Self(rawValue: 0x0) - - /// HSE oscillator clock selected as PLL and PLLI2S clock entry - public static let HSE = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.PLLCFGR { - public struct PLLPValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// PLLP=2 - public static let Div2 = Self(rawValue: 0x0) - - /// PLLP=4 - public static let Div4 = Self(rawValue: 0x1) - - /// PLLP=6 - public static let Div6 = Self(rawValue: 0x2) - - /// PLLP=8 - public static let Div8 = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.CFGR { - public struct MCO2Values: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// System clock (SYSCLK) selected - public static let SYSCLK = Self(rawValue: 0x0) - - /// PLLI2S clock selected - public static let PLLI2S = Self(rawValue: 0x1) - - /// HSE oscillator clock selected - public static let HSE = Self(rawValue: 0x2) - - /// PLL clock selected - public static let PLL = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.CFGR { - public struct MCO1PREValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 3 - - /// No division - public static let Div1 = Self(rawValue: 0x0) - - /// Division by 2 - public static let Div2 = Self(rawValue: 0x4) - - /// Division by 3 - public static let Div3 = Self(rawValue: 0x5) - - /// Division by 4 - public static let Div4 = Self(rawValue: 0x6) - - /// Division by 5 - public static let Div5 = Self(rawValue: 0x7) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.CFGR { - public struct I2SSRCValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// PLLI2S clock used as I2S clock source - public static let PLLI2S = Self(rawValue: 0x0) - - /// External clock mapped on the I2S_CKIN pin used as I2S clock source - public static let CKIN = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.CFGR { - public struct MCO1Values: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// HSI clock selected - public static let HSI = Self(rawValue: 0x0) - - /// LSE oscillator selected - public static let LSE = Self(rawValue: 0x1) - - /// HSE oscillator clock selected - public static let HSE = Self(rawValue: 0x2) - - /// PLL clock selected - public static let PLL = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.CFGR { - public struct PPRE1Values: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 3 - - /// HCLK not divided - public static let Div1 = Self(rawValue: 0x0) - - /// HCLK divided by 2 - public static let Div2 = Self(rawValue: 0x4) - - /// HCLK divided by 4 - public static let Div4 = Self(rawValue: 0x5) - - /// HCLK divided by 8 - public static let Div8 = Self(rawValue: 0x6) - - /// HCLK divided by 16 - public static let Div16 = Self(rawValue: 0x7) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.CFGR { - public struct HPREValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 4 - - /// SYSCLK not divided - public static let Div1 = Self(rawValue: 0x0) - - /// SYSCLK divided by 2 - public static let Div2 = Self(rawValue: 0x8) - - /// SYSCLK divided by 4 - public static let Div4 = Self(rawValue: 0x9) - - /// SYSCLK divided by 8 - public static let Div8 = Self(rawValue: 0xa) - - /// SYSCLK divided by 16 - public static let Div16 = Self(rawValue: 0xb) - - /// SYSCLK divided by 64 - public static let Div64 = Self(rawValue: 0xc) - - /// SYSCLK divided by 128 - public static let Div128 = Self(rawValue: 0xd) - - /// SYSCLK divided by 256 - public static let Div256 = Self(rawValue: 0xe) - - /// SYSCLK divided by 512 - public static let Div512 = Self(rawValue: 0xf) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.CFGR { - public struct SWValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// HSI selected as system clock - public static let HSI = Self(rawValue: 0x0) - - /// HSE selected as system clock - public static let HSE = Self(rawValue: 0x1) - - /// PLL selected as system clock - public static let PLL = Self(rawValue: 0x2) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.CIR { - public struct LSIRDYIEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Interrupt disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Interrupt enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.AHB1RSTR { - public struct GPIOARSTValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Reset the selected module - public static let Reset = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.AHB2RSTR { - public struct DCMIRSTValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Reset the selected module - public static let Reset = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.AHB3RSTR { - public struct FMCRSTValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Reset the selected module - public static let Reset = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.APB1RSTR { - public struct TIM2RSTValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Reset the selected module - public static let Reset = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.APB2RSTR { - public struct TIM1RSTValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Reset the selected module - public static let Reset = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.AHB1ENR { - public struct GPIOAENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// The selected clock is disabled - public static let Disabled = Self(rawValue: 0x0) - - /// The selected clock is enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.AHB2ENR { - public struct DCMIENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// The selected clock is disabled - public static let Disabled = Self(rawValue: 0x0) - - /// The selected clock is enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.AHB3ENR { - public struct FMCENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// The selected clock is disabled - public static let Disabled = Self(rawValue: 0x0) - - /// The selected clock is enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.APB1ENR { - public struct TIM2ENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// The selected clock is disabled - public static let Disabled = Self(rawValue: 0x0) - - /// The selected clock is enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.APB2ENR { - public struct TIM1ENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// The selected clock is disabled - public static let Disabled = Self(rawValue: 0x0) - - /// The selected clock is enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.AHB1LPENR { - public struct GPIOALPENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Selected module is disabled during Sleep mode - public static let DisabledInSleep = Self(rawValue: 0x0) - - /// Selected module is enabled during Sleep mode - public static let EnabledInSleep = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.AHB2LPENR { - public struct DCMILPENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Selected module is disabled during Sleep mode - public static let DisabledInSleep = Self(rawValue: 0x0) - - /// Selected module is enabled during Sleep mode - public static let EnabledInSleep = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.AHB3LPENR { - public struct FMCLPENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Selected module is disabled during Sleep mode - public static let DisabledInSleep = Self(rawValue: 0x0) - - /// Selected module is enabled during Sleep mode - public static let EnabledInSleep = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.APB1LPENR { - public struct TIM2LPENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Selected module is disabled during Sleep mode - public static let DisabledInSleep = Self(rawValue: 0x0) - - /// Selected module is enabled during Sleep mode - public static let EnabledInSleep = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.APB2LPENR { - public struct TIM1LPENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Selected module is disabled during Sleep mode - public static let DisabledInSleep = Self(rawValue: 0x0) - - /// Selected module is enabled during Sleep mode - public static let EnabledInSleep = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.BDCR { - public struct BDRSTValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Reset not activated - public static let Disabled = Self(rawValue: 0x0) - - /// Reset the entire RTC domain - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.BDCR { - public struct RTCENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// RTC clock disabled - public static let Disabled = Self(rawValue: 0x0) - - /// RTC clock enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.BDCR { - public struct LSEBYPValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// LSE crystal oscillator not bypassed - public static let NotBypassed = Self(rawValue: 0x0) - - /// LSE crystal oscillator bypassed with external clock - public static let Bypassed = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.BDCR { - public struct LSEONValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// LSE oscillator Off - public static let Off = Self(rawValue: 0x0) - - /// LSE oscillator On - public static let On = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.BDCR { - public struct LSEDRVValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// Low drive capacity - public static let Low = Self(rawValue: 0x0) - - /// Medium-high drive capacity - public static let MediumHigh = Self(rawValue: 0x1) - - /// Medium-low drive capacity - public static let MediumLow = Self(rawValue: 0x2) - - /// High drive capacity - public static let High = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.BDCR { - public struct RTCSELValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// No clock - public static let NoClock = Self(rawValue: 0x0) - - /// LSE oscillator clock used as RTC clock - public static let LSE = Self(rawValue: 0x1) - - /// LSI oscillator clock used as RTC clock - public static let LSI = Self(rawValue: 0x2) - - /// HSE oscillator clock divided by a prescaler used as RTC clock - public static let HSE = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.CSR { - public struct LSIONValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// LSI oscillator Off - public static let Off = Self(rawValue: 0x0) - - /// LSI oscillator On - public static let On = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.SSCGR { - public struct SSCGENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Spread spectrum modulation disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Spread spectrum modulation enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.SSCGR { - public struct SPREADSELValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Center spread - public static let Center = Self(rawValue: 0x0) - - /// Down spread - public static let Down = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.PLLI2SCFGR { - public struct PLLI2SPValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// PLL*P=2 - public static let Div2 = Self(rawValue: 0x0) - - /// PLL*P=4 - public static let Div4 = Self(rawValue: 0x1) - - /// PLL*P=6 - public static let Div6 = Self(rawValue: 0x2) - - /// PLL*P=8 - public static let Div8 = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.PLLSAICFGR { - public struct PLLSAIPValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// PLL*P=2 - public static let Div2 = Self(rawValue: 0x0) - - /// PLL*P=4 - public static let Div4 = Self(rawValue: 0x1) - - /// PLL*P=6 - public static let Div6 = Self(rawValue: 0x2) - - /// PLL*P=8 - public static let Div8 = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.DCKCFGR1 { - public struct PLLI2SDIVQValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 5 - - /// PLLI2SDIVQ = /1 - public static let Div1 = Self(rawValue: 0x0) - - /// PLLI2SDIVQ = /2 - public static let Div2 = Self(rawValue: 0x1) - - /// PLLI2SDIVQ = /3 - public static let Div3 = Self(rawValue: 0x2) - - /// PLLI2SDIVQ = /4 - public static let Div4 = Self(rawValue: 0x3) - - /// PLLI2SDIVQ = /5 - public static let Div5 = Self(rawValue: 0x4) - - /// PLLI2SDIVQ = /6 - public static let Div6 = Self(rawValue: 0x5) - - /// PLLI2SDIVQ = /7 - public static let Div7 = Self(rawValue: 0x6) - - /// PLLI2SDIVQ = /8 - public static let Div8 = Self(rawValue: 0x7) - - /// PLLI2SDIVQ = /9 - public static let Div9 = Self(rawValue: 0x8) - - /// PLLI2SDIVQ = /10 - public static let Div10 = Self(rawValue: 0x9) - - /// PLLI2SDIVQ = /11 - public static let Div11 = Self(rawValue: 0xa) - - /// PLLI2SDIVQ = /12 - public static let Div12 = Self(rawValue: 0xb) - - /// PLLI2SDIVQ = /13 - public static let Div13 = Self(rawValue: 0xc) - - /// PLLI2SDIVQ = /14 - public static let Div14 = Self(rawValue: 0xd) - - /// PLLI2SDIVQ = /15 - public static let Div15 = Self(rawValue: 0xe) - - /// PLLI2SDIVQ = /16 - public static let Div16 = Self(rawValue: 0xf) - - /// PLLI2SDIVQ = /17 - public static let Div17 = Self(rawValue: 0x10) - - /// PLLI2SDIVQ = /18 - public static let Div18 = Self(rawValue: 0x11) - - /// PLLI2SDIVQ = /19 - public static let Div19 = Self(rawValue: 0x12) - - /// PLLI2SDIVQ = /20 - public static let Div20 = Self(rawValue: 0x13) - - /// PLLI2SDIVQ = /21 - public static let Div21 = Self(rawValue: 0x14) - - /// PLLI2SDIVQ = /22 - public static let Div22 = Self(rawValue: 0x15) - - /// PLLI2SDIVQ = /23 - public static let Div23 = Self(rawValue: 0x16) - - /// PLLI2SDIVQ = /24 - public static let Div24 = Self(rawValue: 0x17) - - /// PLLI2SDIVQ = /25 - public static let Div25 = Self(rawValue: 0x18) - - /// PLLI2SDIVQ = /26 - public static let Div26 = Self(rawValue: 0x19) - - /// PLLI2SDIVQ = /27 - public static let Div27 = Self(rawValue: 0x1a) - - /// PLLI2SDIVQ = /28 - public static let Div28 = Self(rawValue: 0x1b) - - /// PLLI2SDIVQ = /29 - public static let Div29 = Self(rawValue: 0x1c) - - /// PLLI2SDIVQ = /30 - public static let Div30 = Self(rawValue: 0x1d) - - /// PLLI2SDIVQ = /31 - public static let Div31 = Self(rawValue: 0x1e) - - /// PLLI2SDIVQ = /32 - public static let Div32 = Self(rawValue: 0x1f) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.DCKCFGR1 { - public struct PLLSAIDIVQValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 5 - - /// PLLSAIDIVQ = /1 - public static let Div1 = Self(rawValue: 0x0) - - /// PLLSAIDIVQ = /2 - public static let Div2 = Self(rawValue: 0x1) - - /// PLLSAIDIVQ = /3 - public static let Div3 = Self(rawValue: 0x2) - - /// PLLSAIDIVQ = /4 - public static let Div4 = Self(rawValue: 0x3) - - /// PLLSAIDIVQ = /5 - public static let Div5 = Self(rawValue: 0x4) - - /// PLLSAIDIVQ = /6 - public static let Div6 = Self(rawValue: 0x5) - - /// PLLSAIDIVQ = /7 - public static let Div7 = Self(rawValue: 0x6) - - /// PLLSAIDIVQ = /8 - public static let Div8 = Self(rawValue: 0x7) - - /// PLLSAIDIVQ = /9 - public static let Div9 = Self(rawValue: 0x8) - - /// PLLSAIDIVQ = /10 - public static let Div10 = Self(rawValue: 0x9) - - /// PLLSAIDIVQ = /11 - public static let Div11 = Self(rawValue: 0xa) - - /// PLLSAIDIVQ = /12 - public static let Div12 = Self(rawValue: 0xb) - - /// PLLSAIDIVQ = /13 - public static let Div13 = Self(rawValue: 0xc) - - /// PLLSAIDIVQ = /14 - public static let Div14 = Self(rawValue: 0xd) - - /// PLLSAIDIVQ = /15 - public static let Div15 = Self(rawValue: 0xe) - - /// PLLSAIDIVQ = /16 - public static let Div16 = Self(rawValue: 0xf) - - /// PLLSAIDIVQ = /17 - public static let Div17 = Self(rawValue: 0x10) - - /// PLLSAIDIVQ = /18 - public static let Div18 = Self(rawValue: 0x11) - - /// PLLSAIDIVQ = /19 - public static let Div19 = Self(rawValue: 0x12) - - /// PLLSAIDIVQ = /20 - public static let Div20 = Self(rawValue: 0x13) - - /// PLLSAIDIVQ = /21 - public static let Div21 = Self(rawValue: 0x14) - - /// PLLSAIDIVQ = /22 - public static let Div22 = Self(rawValue: 0x15) - - /// PLLSAIDIVQ = /23 - public static let Div23 = Self(rawValue: 0x16) - - /// PLLSAIDIVQ = /24 - public static let Div24 = Self(rawValue: 0x17) - - /// PLLSAIDIVQ = /25 - public static let Div25 = Self(rawValue: 0x18) - - /// PLLSAIDIVQ = /26 - public static let Div26 = Self(rawValue: 0x19) - - /// PLLSAIDIVQ = /27 - public static let Div27 = Self(rawValue: 0x1a) - - /// PLLSAIDIVQ = /28 - public static let Div28 = Self(rawValue: 0x1b) - - /// PLLSAIDIVQ = /29 - public static let Div29 = Self(rawValue: 0x1c) - - /// PLLSAIDIVQ = /30 - public static let Div30 = Self(rawValue: 0x1d) - - /// PLLSAIDIVQ = /31 - public static let Div31 = Self(rawValue: 0x1e) - - /// PLLSAIDIVQ = /32 - public static let Div32 = Self(rawValue: 0x1f) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.DCKCFGR1 { - public struct PLLSAIDIVRValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// PLLSAIDIVR = /2 - public static let Div2 = Self(rawValue: 0x0) - - /// PLLSAIDIVR = /4 - public static let Div4 = Self(rawValue: 0x1) - - /// PLLSAIDIVR = /8 - public static let Div8 = Self(rawValue: 0x2) - - /// PLLSAIDIVR = /16 - public static let Div16 = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.DCKCFGR1 { - public struct SAI1SELValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// SAI1 clock frequency = f(PLLSAI_Q) / PLLSAIDIVQ - public static let PLLSAI = Self(rawValue: 0x0) - - /// SAI1 clock frequency = f(PLLI2S_Q) / PLLI2SDIVQ - public static let PLLI2S = Self(rawValue: 0x1) - - /// SAI1 clock frequency = Alternate function input frequency - public static let AFIF = Self(rawValue: 0x2) - - /// SAI1 clock frequency = HSI or HSE - public static let HSI_HSE = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.DCKCFGR1 { - public struct SAI2SELValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// SAI2 clock frequency = f(PLLSAI_Q) / PLLSAIDIVQ - public static let PLLSAI = Self(rawValue: 0x0) - - /// SAI2 clock frequency = f(PLLI2S_Q) / PLLI2SDIVQ - public static let PLLI2S = Self(rawValue: 0x1) - - /// SAI2 clock frequency = Alternate function input frequency - public static let AFIF = Self(rawValue: 0x2) - - /// SAI2 clock frequency = HSI or HSE - public static let HSI_HSE = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.DCKCFGR1 { - public struct TIMPREValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// If the APB prescaler is configured 1, TIMxCLK = PCLKx. Otherwise, TIMxCLK = 2xPCLKx - public static let Mul1Or2 = Self(rawValue: 0x0) - - /// If the APB prescaler is configured 1, 2 or 4, TIMxCLK = HCLK. Otherwise, TIMxCLK = 4xPCLKx - public static let Mul1Or4 = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.DCKCFGR2 { - public struct USART1SELValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// APB2 clock (PCLK2) is selected as USART clock - public static let APB2 = Self(rawValue: 0x0) - - /// System clock is selected as USART clock - public static let SYSCLK = Self(rawValue: 0x1) - - /// HSI clock is selected as USART clock - public static let HSI = Self(rawValue: 0x2) - - /// LSE clock is selected as USART clock - public static let LSE = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.DCKCFGR2 { - public struct USART2SELValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// APB1 clock (PCLK1) is selected as USART clock - public static let APB1 = Self(rawValue: 0x0) - - /// System clock is selected as USART clock - public static let SYSCLK = Self(rawValue: 0x1) - - /// HSI clock is selected as USART clock - public static let HSI = Self(rawValue: 0x2) - - /// LSE clock is selected as USART clock - public static let LSE = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.DCKCFGR2 { - public struct I2C1SELValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// APB clock selected as I2C clock - public static let APB = Self(rawValue: 0x0) - - /// System clock selected as I2C clock - public static let SYSCLK = Self(rawValue: 0x1) - - /// HSI clock selected as I2C clock - public static let HSI = Self(rawValue: 0x2) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.DCKCFGR2 { - public struct LPTIM1SELValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// APB1 clock (PCLK1) selected as LPTILM1 clock - public static let APB1 = Self(rawValue: 0x0) - - /// LSI clock is selected as LPTILM1 clock - public static let LSI = Self(rawValue: 0x1) - - /// HSI clock is selected as LPTILM1 clock - public static let HSI = Self(rawValue: 0x2) - - /// LSE clock is selected as LPTILM1 clock - public static let LSE = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.DCKCFGR2 { - public struct CECSELValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// LSE clock is selected as HDMI-CEC clock - public static let LSE = Self(rawValue: 0x0) - - /// HSI divided by 488 clock is selected as HDMI-CEC clock - public static let HSI_Div488 = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.DCKCFGR2 { - public struct CK48MSELValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// 48MHz clock from PLL is selected - public static let PLL = Self(rawValue: 0x0) - - /// 48MHz clock from PLLSAI is selected - public static let PLLSAI = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension RCC.DCKCFGR2 { - public struct SDMMC1SELValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// 48 MHz clock is selected as SD clock - public static let CK48M = Self(rawValue: 0x0) - - /// System clock is selected as SD clock - public static let SYSCLK = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} diff --git a/stm32-uart-echo/Sources/STM32F7X6/USART1.swift b/stm32-uart-echo/Sources/STM32F7X6/USART1.swift deleted file mode 100644 index 508d05a1..00000000 --- a/stm32-uart-echo/Sources/STM32F7X6/USART1.swift +++ /dev/null @@ -1,1554 +0,0 @@ -// Generated by svd2swift. - -import MMIO - -/// Universal synchronous asynchronous receiver transmitter -@RegisterBlock -public struct USART1 { - /// Control register 1 - @RegisterBlock(offset: 0x0) - public var cr1: Register - - /// Control register 2 - @RegisterBlock(offset: 0x4) - public var cr2: Register - - /// Control register 3 - @RegisterBlock(offset: 0x8) - public var cr3: Register - - /// Baud rate register - @RegisterBlock(offset: 0xc) - public var brr: Register - - /// Guard time and prescaler register - @RegisterBlock(offset: 0x10) - public var gtpr: Register - - /// Receiver timeout register - @RegisterBlock(offset: 0x14) - public var rtor: Register - - /// Request register - @RegisterBlock(offset: 0x18) - public var rqr: Register - - /// Interrupt & status register - @RegisterBlock(offset: 0x1c) - public var isr: Register - - /// Interrupt flag clear register - @RegisterBlock(offset: 0x20) - public var icr: Register - - /// Receive data register - @RegisterBlock(offset: 0x24) - public var rdr: Register - - /// Transmit data register - @RegisterBlock(offset: 0x28) - public var tdr: Register -} - -extension USART1 { - /// Control register 1 - @Register(bitWidth: 32) - public struct CR1 { - /// Word length - @ReadWrite(bits: 28..<29, as: M1Values.self) - public var m1: M1 - - /// End of Block interrupt enable - @ReadWrite(bits: 27..<28, as: EOBIEValues.self) - public var eobie: EOBIE - - /// Receiver timeout interrupt enable - @ReadWrite(bits: 26..<27, as: RTOIEValues.self) - public var rtoie: RTOIE - - /// Oversampling mode - @ReadWrite(bits: 15..<16, as: OVER8Values.self) - public var over8: OVER8 - - /// Character match interrupt enable - @ReadWrite(bits: 14..<15, as: CMIEValues.self) - public var cmie: CMIE - - /// Mute mode enable - @ReadWrite(bits: 13..<14, as: MMEValues.self) - public var mme: MME - - /// Word length - @ReadWrite(bits: 12..<13, as: M0Values.self) - public var m0: M0 - - /// Receiver wakeup method - @ReadWrite(bits: 11..<12, as: WAKEValues.self) - public var wake: WAKE - - /// Parity control enable - @ReadWrite(bits: 10..<11, as: PCEValues.self) - public var pce: PCE - - /// Parity selection - @ReadWrite(bits: 9..<10, as: PSValues.self) - public var ps: PS - - /// PE interrupt enable - @ReadWrite(bits: 8..<9, as: PEIEValues.self) - public var peie: PEIE - - /// interrupt enable - @ReadWrite(bits: 7..<8, as: TXEIEValues.self) - public var txeie: TXEIE - - /// Transmission complete interrupt enable - @ReadWrite(bits: 6..<7, as: TCIEValues.self) - public var tcie: TCIE - - /// RXNE interrupt enable - @ReadWrite(bits: 5..<6, as: RXNEIEValues.self) - public var rxneie: RXNEIE - - /// IDLE interrupt enable - @ReadWrite(bits: 4..<5, as: IDLEIEValues.self) - public var idleie: IDLEIE - - /// Transmitter enable - @ReadWrite(bits: 3..<4, as: TEValues.self) - public var te: TE - - /// Receiver enable - @ReadWrite(bits: 2..<3, as: REValues.self) - public var re: RE - - /// USART enable in Stop mode - @ReadWrite(bits: 1..<2, as: UESMValues.self) - public var uesm: UESM - - /// USART enable - @ReadWrite(bits: 0..<1, as: UEValues.self) - public var ue: UE - - /// Driver Enable assertion time - @ReadWrite(bits: 21..<26) - public var deat: DEAT - - /// Driver Enable de-assertion time - @ReadWrite(bits: 16..<21) - public var dedt: DEDT - } - - /// Control register 2 - @Register(bitWidth: 32) - public struct CR2 { - /// Receiver timeout enable - @ReadWrite(bits: 23..<24, as: RTOENValues.self) - public var rtoen: RTOEN - - /// Auto baud rate enable - @ReadWrite(bits: 20..<21, as: ABRENValues.self) - public var abren: ABREN - - /// Most significant bit first - @ReadWrite(bits: 19..<20, as: MSBFIRSTValues.self) - public var msbfirst: MSBFIRST - - /// Binary data inversion - @ReadWrite(bits: 18..<19, as: DATAINVValues.self) - public var datainv: DATAINV - - /// TX pin active level inversion - @ReadWrite(bits: 17..<18, as: TXINVValues.self) - public var txinv: TXINV - - /// RX pin active level inversion - @ReadWrite(bits: 16..<17, as: RXINVValues.self) - public var rxinv: RXINV - - /// Swap TX/RX pins - @ReadWrite(bits: 15..<16, as: SWAPValues.self) - public var swap: SWAP - - /// LIN mode enable - @ReadWrite(bits: 14..<15, as: LINENValues.self) - public var linen: LINEN - - /// STOP bits - @ReadWrite(bits: 12..<14, as: STOPValues.self) - public var stop: STOP - - /// Clock enable - @ReadWrite(bits: 11..<12, as: CLKENValues.self) - public var clken: CLKEN - - /// Clock polarity - @ReadWrite(bits: 10..<11, as: CPOLValues.self) - public var cpol: CPOL - - /// Clock phase - @ReadWrite(bits: 9..<10, as: CPHAValues.self) - public var cpha: CPHA - - /// Last bit clock pulse - @ReadWrite(bits: 8..<9, as: LBCLValues.self) - public var lbcl: LBCL - - /// LIN break detection interrupt enable - @ReadWrite(bits: 6..<7, as: LBDIEValues.self) - public var lbdie: LBDIE - - /// LIN break detection length - @ReadWrite(bits: 5..<6, as: LBDLValues.self) - public var lbdl: LBDL - - /// 7-bit Address Detection/4-bit Address Detection - @ReadWrite(bits: 4..<5, as: ADDM7Values.self) - public var addm7: ADDM7 - - /// Auto baud rate mode - @ReadWrite(bits: 21..<23, as: ABRMODValues.self) - public var abrmod: ABRMOD - - /// Address of the USART node - @ReadWrite(bits: 24..<32) - public var add: ADD - } - - /// Control register 3 - @Register(bitWidth: 32) - public struct CR3 { - /// Wakeup from Stop mode interrupt enable - @ReadWrite(bits: 22..<23, as: WUFIEValues.self) - public var wufie: WUFIE - - /// Wakeup from Stop mode interrupt flag selection - @ReadWrite(bits: 20..<22, as: WUSValues.self) - public var wus: WUS - - /// Smartcard auto-retry count - @ReadWrite(bits: 17..<20) - public var scarcnt: SCARCNT - - /// Driver enable polarity selection - @ReadWrite(bits: 15..<16, as: DEPValues.self) - public var dep: DEP - - /// Driver enable mode - @ReadWrite(bits: 14..<15, as: DEMValues.self) - public var dem: DEM - - /// DMA Disable on Reception Error - @ReadWrite(bits: 13..<14, as: DDREValues.self) - public var ddre: DDRE - - /// Overrun Disable - @ReadWrite(bits: 12..<13, as: OVRDISValues.self) - public var ovrdis: OVRDIS - - /// One sample bit method enable - @ReadWrite(bits: 11..<12, as: ONEBITValues.self) - public var onebit: ONEBIT - - /// CTS interrupt enable - @ReadWrite(bits: 10..<11, as: CTSIEValues.self) - public var ctsie: CTSIE - - /// CTS enable - @ReadWrite(bits: 9..<10, as: CTSEValues.self) - public var ctse: CTSE - - /// RTS enable - @ReadWrite(bits: 8..<9, as: RTSEValues.self) - public var rtse: RTSE - - /// DMA enable transmitter - @ReadWrite(bits: 7..<8, as: DMATValues.self) - public var dmat: DMAT - - /// DMA enable receiver - @ReadWrite(bits: 6..<7, as: DMARValues.self) - public var dmar: DMAR - - /// Smartcard mode enable - @ReadWrite(bits: 5..<6, as: SCENValues.self) - public var scen: SCEN - - /// Smartcard NACK enable - @ReadWrite(bits: 4..<5, as: NACKValues.self) - public var nack: NACK - - /// Half-duplex selection - @ReadWrite(bits: 3..<4, as: HDSELValues.self) - public var hdsel: HDSEL - - /// Ir low-power - @ReadWrite(bits: 2..<3, as: IRLPValues.self) - public var irlp: IRLP - - /// Ir mode enable - @ReadWrite(bits: 1..<2, as: IRENValues.self) - public var iren: IREN - - /// Error interrupt enable - @ReadWrite(bits: 0..<1, as: EIEValues.self) - public var eie: EIE - } - - /// Baud rate register - @Register(bitWidth: 32) - public struct BRR { - /// DIV_Mantissa - @ReadWrite(bits: 0..<16) - public var brr_field: BRR_FIELD - } - - /// Guard time and prescaler register - @Register(bitWidth: 32) - public struct GTPR { - /// Guard time value - @ReadWrite(bits: 8..<16) - public var gt: GT - - /// Prescaler value - @ReadWrite(bits: 0..<8) - public var psc: PSC - } - - /// Receiver timeout register - @Register(bitWidth: 32) - public struct RTOR { - /// Block Length - @ReadWrite(bits: 24..<32) - public var blen: BLEN - - /// Receiver timeout value - @ReadWrite(bits: 0..<24) - public var rto: RTO - } - - /// Request register - @Register(bitWidth: 32) - public struct RQR { - /// Transmit data flush request - @WriteOnly(bits: 4..<5) - public var txfrq: TXFRQ - - /// Receive data flush request - @WriteOnly(bits: 3..<4) - public var rxfrq: RXFRQ - - /// Mute mode request - @WriteOnly(bits: 2..<3) - public var mmrq: MMRQ - - /// Send break request - @WriteOnly(bits: 1..<2) - public var sbkrq: SBKRQ - - /// Auto baud rate request - @WriteOnly(bits: 0..<1) - public var abrrq: ABRRQ - } - - /// Interrupt & status register - @Register(bitWidth: 32) - public struct ISR { - /// REACK - @ReadOnly(bits: 22..<23) - public var reack: REACK - - /// TEACK - @ReadOnly(bits: 21..<22) - public var teack: TEACK - - /// WUF - @ReadOnly(bits: 20..<21) - public var wuf: WUF - - /// RWU - @ReadOnly(bits: 19..<20) - public var rwu: RWU - - /// SBKF - @ReadOnly(bits: 18..<19) - public var sbkf: SBKF - - /// CMF - @ReadOnly(bits: 17..<18) - public var cmf: CMF - - /// BUSY - @ReadOnly(bits: 16..<17) - public var busy: BUSY - - /// ABRF - @ReadOnly(bits: 15..<16) - public var abrf: ABRF - - /// ABRE - @ReadOnly(bits: 14..<15) - public var abre: ABRE - - /// EOBF - @ReadOnly(bits: 12..<13) - public var eobf: EOBF - - /// RTOF - @ReadOnly(bits: 11..<12) - public var rtof: RTOF - - /// CTS - @ReadOnly(bits: 10..<11) - public var cts: CTS - - /// CTSIF - @ReadOnly(bits: 9..<10) - public var ctsif: CTSIF - - /// LBDF - @ReadOnly(bits: 8..<9) - public var lbdf: LBDF - - /// TXE - @ReadOnly(bits: 7..<8) - public var txe: TXE - - /// TC - @ReadOnly(bits: 6..<7) - public var tc: TC - - /// RXNE - @ReadOnly(bits: 5..<6) - public var rxne: RXNE - - /// IDLE - @ReadOnly(bits: 4..<5) - public var idle: IDLE - - /// ORE - @ReadOnly(bits: 3..<4) - public var ore: ORE - - /// NF - @ReadOnly(bits: 2..<3) - public var nf: NF - - /// FE - @ReadOnly(bits: 1..<2) - public var fe: FE - - /// PE - @ReadOnly(bits: 0..<1) - public var pe: PE - } - - /// Interrupt flag clear register - @Register(bitWidth: 32) - public struct ICR { - /// Wakeup from Stop mode clear flag - @WriteOnly(bits: 20..<21) - public var wucf: WUCF - - /// Character match clear flag - @WriteOnly(bits: 17..<18) - public var cmcf: CMCF - - /// End of block clear flag - @WriteOnly(bits: 12..<13) - public var eobcf: EOBCF - - /// Receiver timeout clear flag - @WriteOnly(bits: 11..<12) - public var rtocf: RTOCF - - /// CTS clear flag - @WriteOnly(bits: 9..<10) - public var ctscf: CTSCF - - /// LIN break detection clear flag - @WriteOnly(bits: 8..<9) - public var lbdcf: LBDCF - - /// Transmission complete clear flag - @WriteOnly(bits: 6..<7) - public var tccf: TCCF - - /// Idle line detected clear flag - @WriteOnly(bits: 4..<5) - public var idlecf: IDLECF - - /// Overrun error clear flag - @WriteOnly(bits: 3..<4) - public var orecf: ORECF - - /// Noise detected clear flag - @WriteOnly(bits: 2..<3) - public var ncf: NCF - - /// Framing error clear flag - @WriteOnly(bits: 1..<2) - public var fecf: FECF - - /// Parity error clear flag - @WriteOnly(bits: 0..<1) - public var pecf: PECF - } - - /// Receive data register - @Register(bitWidth: 32) - public struct RDR { - /// Receive data value - @ReadOnly(bits: 0..<9) - public var rdr_field: RDR_FIELD - } - - /// Transmit data register - @Register(bitWidth: 32) - public struct TDR { - /// Transmit data value - @ReadWrite(bits: 0..<9) - public var tdr_field: TDR_FIELD - } -} - -extension USART1.CR1 { - public struct M1Values: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Use M0 to set the data bits - public static let M0 = Self(rawValue: 0x0) - - /// 1 start bit, 7 data bits, n stop bits - public static let Bit7 = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR1 { - public struct EOBIEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Interrupt is inhibited - public static let Disabled = Self(rawValue: 0x0) - - /// A USART interrupt is generated when the EOBF flag is set in the ISR register - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR1 { - public struct RTOIEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Interrupt is inhibited - public static let Disabled = Self(rawValue: 0x0) - - /// An USART interrupt is generated when the RTOF bit is set in the ISR register - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR1 { - public struct OVER8Values: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Oversampling by 16 - public static let Oversampling16 = Self(rawValue: 0x0) - - /// Oversampling by 8 - public static let Oversampling8 = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR1 { - public struct CMIEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Interrupt is disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Interrupt is generated when the CMF bit is set in the ISR register - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR1 { - public struct MMEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Receiver in active mode permanently - public static let Disabled = Self(rawValue: 0x0) - - /// Receiver can switch between mute mode and active mode - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR1 { - public struct M0Values: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// 1 start bit, 8 data bits, n stop bits - public static let Bit8 = Self(rawValue: 0x0) - - /// 1 start bit, 9 data bits, n stop bits - public static let Bit9 = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR1 { - public struct WAKEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Idle line - public static let Idle = Self(rawValue: 0x0) - - /// Address mask - public static let Address = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR1 { - public struct PCEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Parity control disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Parity control enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR1 { - public struct PSValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Even parity - public static let Even = Self(rawValue: 0x0) - - /// Odd parity - public static let Odd = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR1 { - public struct PEIEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Interrupt is disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Interrupt is generated whenever PE=1 in the ISR register - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR1 { - public struct TXEIEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Interrupt is disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Interrupt is generated whenever TXE=1 in the ISR register - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR1 { - public struct TCIEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Interrupt is disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Interrupt is generated whenever TC=1 in the ISR register - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR1 { - public struct RXNEIEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Interrupt is disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Interrupt is generated whenever ORE=1 or RXNE=1 in the ISR register - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR1 { - public struct IDLEIEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Interrupt is disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Interrupt is generated whenever IDLE=1 in the ISR register - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR1 { - public struct TEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Transmitter is disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Transmitter is enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR1 { - public struct REValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Receiver is disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Receiver is enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR1 { - public struct UESMValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// USART not able to wake up the MCU from Stop mode - public static let Disabled = Self(rawValue: 0x0) - - /// USART able to wake up the MCU from Stop mode - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR1 { - public struct UEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// UART is disabled - public static let Disabled = Self(rawValue: 0x0) - - /// UART is enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR2 { - public struct RTOENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Receiver timeout feature disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Receiver timeout feature enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR2 { - public struct ABRENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Auto baud rate detection is disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Auto baud rate detection is enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR2 { - public struct MSBFIRSTValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// data is transmitted/received with data bit 0 first, following the start bit - public static let LSB = Self(rawValue: 0x0) - - /// data is transmitted/received with MSB (bit 7/8/9) first, following the start bit - public static let MSB = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR2 { - public struct DATAINVValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Logical data from the data register are send/received in positive/direct logic - public static let Positive = Self(rawValue: 0x0) - - /// Logical data from the data register are send/received in negative/inverse logic - public static let Negative = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR2 { - public struct TXINVValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// TX pin signal works using the standard logic levels - public static let Standard = Self(rawValue: 0x0) - - /// TX pin signal values are inverted - public static let Inverted = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR2 { - public struct RXINVValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// RX pin signal works using the standard logic levels - public static let Standard = Self(rawValue: 0x0) - - /// RX pin signal values are inverted - public static let Inverted = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR2 { - public struct SWAPValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// TX/RX pins are used as defined in standard pinout - public static let Standard = Self(rawValue: 0x0) - - /// The TX and RX pins functions are swapped - public static let Swapped = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR2 { - public struct LINENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// LIN mode disabled - public static let Disabled = Self(rawValue: 0x0) - - /// LIN mode enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR2 { - public struct STOPValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// 1 stop bit - public static let Stop1 = Self(rawValue: 0x0) - - /// 0.5 stop bit - public static let Stop0p5 = Self(rawValue: 0x1) - - /// 2 stop bit - public static let Stop2 = Self(rawValue: 0x2) - - /// 1.5 stop bit - public static let Stop1p5 = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR2 { - public struct CLKENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// CK pin disabled - public static let Disabled = Self(rawValue: 0x0) - - /// CK pin enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR2 { - public struct CPOLValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Steady low value on CK pin outside transmission window - public static let Low = Self(rawValue: 0x0) - - /// Steady high value on CK pin outside transmission window - public static let High = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR2 { - public struct CPHAValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// The first clock transition is the first data capture edge - public static let First = Self(rawValue: 0x0) - - /// The second clock transition is the first data capture edge - public static let Second = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR2 { - public struct LBCLValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// The clock pulse of the last data bit is not output to the CK pin - public static let NotOutput = Self(rawValue: 0x0) - - /// The clock pulse of the last data bit is output to the CK pin - public static let Output = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR2 { - public struct LBDIEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Interrupt is inhibited - public static let Disabled = Self(rawValue: 0x0) - - /// An interrupt is generated whenever LBDF=1 in the ISR register - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR2 { - public struct LBDLValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// 10-bit break detection - public static let Bit10 = Self(rawValue: 0x0) - - /// 11-bit break detection - public static let Bit11 = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR2 { - public struct ADDM7Values: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// 4-bit address detection - public static let Bit4 = Self(rawValue: 0x0) - - /// 7-bit address detection - public static let Bit7 = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR2 { - public struct ABRMODValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// Measurement of the start bit is used to detect the baud rate - public static let Start = Self(rawValue: 0x0) - - /// Falling edge to falling edge measurement - public static let Edge = Self(rawValue: 0x1) - - /// 0x7F frame detection - public static let Frame7F = Self(rawValue: 0x2) - - /// 0x55 frame detection - public static let Frame55 = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR3 { - public struct WUFIEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Interrupt is inhibited - public static let Disabled = Self(rawValue: 0x0) - - /// An USART interrupt is generated whenever WUF=1 in the ISR register - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR3 { - public struct WUSValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 2 - - /// WUF active on address match - public static let Address = Self(rawValue: 0x0) - - /// WuF active on Start bit detection - public static let Start = Self(rawValue: 0x2) - - /// WUF active on RXNE - public static let RXNE = Self(rawValue: 0x3) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR3 { - public struct DEPValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// DE signal is active high - public static let High = Self(rawValue: 0x0) - - /// DE signal is active low - public static let Low = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR3 { - public struct DEMValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// DE function is disabled - public static let Disabled = Self(rawValue: 0x0) - - /// The DE signal is output on the RTS pin - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR3 { - public struct DDREValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// DMA is not disabled in case of reception error - public static let NotDisabled = Self(rawValue: 0x0) - - /// DMA is disabled following a reception error - public static let Disabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR3 { - public struct OVRDISValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Overrun Error Flag, ORE, is set when received data is not read before receiving new data - public static let Enabled = Self(rawValue: 0x0) - - /// Overrun functionality is disabled. If new data is received while the RXNE flag is still set the ORE flag is not set and the new received data overwrites the previous content of the RDR register - public static let Disabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR3 { - public struct ONEBITValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Three sample bit method - public static let Sample3 = Self(rawValue: 0x0) - - /// One sample bit method - public static let Sample1 = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR3 { - public struct CTSIEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Interrupt is inhibited - public static let Disabled = Self(rawValue: 0x0) - - /// An interrupt is generated whenever CTSIF=1 in the ISR register - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR3 { - public struct CTSEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// CTS hardware flow control disabled - public static let Disabled = Self(rawValue: 0x0) - - /// CTS mode enabled, data is only transmitted when the CTS input is asserted - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR3 { - public struct RTSEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// RTS hardware flow control disabled - public static let Disabled = Self(rawValue: 0x0) - - /// RTS output enabled, data is only requested when there is space in the receive buffer - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR3 { - public struct DMATValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// DMA mode is disabled for transmission - public static let Disabled = Self(rawValue: 0x0) - - /// DMA mode is enabled for transmission - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR3 { - public struct DMARValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// DMA mode is disabled for reception - public static let Disabled = Self(rawValue: 0x0) - - /// DMA mode is enabled for reception - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR3 { - public struct SCENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Smartcard Mode disabled - public static let Disabled = Self(rawValue: 0x0) - - /// Smartcard Mode enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR3 { - public struct NACKValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// NACK transmission in case of parity error is disabled - public static let Disabled = Self(rawValue: 0x0) - - /// NACK transmission during parity error is enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR3 { - public struct HDSELValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Half duplex mode is not selected - public static let NotSelected = Self(rawValue: 0x0) - - /// Half duplex mode is selected - public static let Selected = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR3 { - public struct IRLPValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Normal mode - public static let Normal = Self(rawValue: 0x0) - - /// Low-power mode - public static let LowPower = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR3 { - public struct IRENValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// IrDA disabled - public static let Disabled = Self(rawValue: 0x0) - - /// IrDA enabled - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} - -extension USART1.CR3 { - public struct EIEValues: BitFieldProjectable, RawRepresentable { - public static let bitWidth = 1 - - /// Interrupt is inhibited - public static let Disabled = Self(rawValue: 0x0) - - /// An interrupt is generated when FE=1 or ORE=1 or NF=1 in the ISR register - public static let Enabled = Self(rawValue: 0x1) - - public var rawValue: UInt8 - - @inlinable @inline(__always) - public init(rawValue: Self.RawValue) { - self.rawValue = rawValue - } - } -} diff --git a/stm32-uart-echo/Sources/STM32F7X6/stm32f7x6.patched.svd b/stm32-uart-echo/Sources/STM32F7X6/stm32f7x6.patched.svd deleted file mode 120000 index a6442b50..00000000 --- a/stm32-uart-echo/Sources/STM32F7X6/stm32f7x6.patched.svd +++ /dev/null @@ -1 +0,0 @@ -../../../Tools/SVDs/stm32f7x6.patched.svd \ No newline at end of file diff --git a/stm32-uart-echo/Sources/STM32F7X6/svd2swift.json b/stm32-uart-echo/Sources/STM32F7X6/svd2swift.json deleted file mode 100644 index a7fe0570..00000000 --- a/stm32-uart-echo/Sources/STM32F7X6/svd2swift.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "peripherals": [ - "GPIOA", - "GPIOB", - "RCC", - "USART1" - ], - "access-level": "public" -} diff --git a/stm32-uart-echo/Sources/Support/Support.c b/stm32-uart-echo/Sources/Support/Support.c deleted file mode 100644 index fc3c1a13..00000000 --- a/stm32-uart-echo/Sources/Support/Support.c +++ /dev/null @@ -1,51 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2024 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -#if defined(__arm__) - -#include -#include - -void *memset(void *b, int c, size_t len) { - for (int i = 0; i < len; i++) { - ((char *)b)[i] = c; - } - return b; -} - -void *memcpy(void *restrict dst, const void *restrict src, size_t n) { - for (int i = 0; i < n; i++) { - ((char *)dst)[i] = ((char *)src)[i]; - } - return dst; -} - -extern void reset(void); - -void interrupt(void) { - while (1) {} -} - -__attribute((used)) __attribute((section("__VECTORS,__text"))) -void *vector_table[114] = { - (void *)0x2000fffc, // initial SP - (void *)((uintptr_t)reset - (0x20010000 - 0x08000000)), // Reset - - (void *)((uintptr_t)interrupt - (0x20010000 - 0x08000000)), // NMI - (void *)((uintptr_t)interrupt - (0x20010000 - 0x08000000)), // HardFault - (void *)((uintptr_t)interrupt - (0x20010000 - 0x08000000)), // MemManage - (void *)((uintptr_t)interrupt - (0x20010000 - 0x08000000)), // BusFault - (void *)((uintptr_t)interrupt - (0x20010000 - 0x08000000)), // UsageFault - - 0 // NULL for all the other handlers -}; - -#endif diff --git a/stm32-uart-echo/Sources/Support/include/Support.h b/stm32-uart-echo/Sources/Support/include/Support.h deleted file mode 100644 index 158cce06..00000000 --- a/stm32-uart-echo/Sources/Support/include/Support.h +++ /dev/null @@ -1,12 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2024 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - -#pragma once diff --git a/stm32-uart-echo/Sources/Support/startup.S b/stm32-uart-echo/Sources/Support/startup.S deleted file mode 100644 index 6e8c7c27..00000000 --- a/stm32-uart-echo/Sources/Support/startup.S +++ /dev/null @@ -1,45 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift open source project -// -// Copyright (c) 2023 Apple Inc. and the Swift project authors. -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// -//===----------------------------------------------------------------------===// - - .extern _memcpy - .extern _main - - .text - .thumb - .section __TEXT,__text,regular,pure_instructions - .syntax unified - -// reset handler, main entry point - .balign 4 - .global _reset - .thumb_func -_reset: - ldr r0, =0x20010000 // dst - ldr r1, =0x08000000 // src - ldr r2, =segment$start$__VECTORS - ldr r3, =segment$end$__DATA - subs r2, r3, r2 // size = segment$end$__DATA - segment$start$__TEXT - - // memcpy (r0: dst = 0x20010000, r1: src = 0x08000000, r2: size = ...) - // Relocate ourselves: copy the entire image (VECTORS, TEXT, DATA segments) - // from flash memory (non-writable) to RAM (writable), so that globals can be - // written to. - bl _memcpy - - // Cannot jump to main normally, because that would call main using a relative - // offset, which would result in a call to the pre-relocation address. - // Loading address of main into a register will give us the post-relocation - // address. - ldr r0, =_main - blx r0 - - // Loop forever if main returns. - b .